mirror of git://git.sysmocom.de/ofono
dundee: Add device un/register
This commit is contained in:
parent
b1030d281d
commit
3e69d58570
|
@ -33,14 +33,19 @@
|
||||||
|
|
||||||
#include "dundee.h"
|
#include "dundee.h"
|
||||||
|
|
||||||
|
static int next_device_id = 0;
|
||||||
static GHashTable *device_hash;
|
static GHashTable *device_hash;
|
||||||
|
|
||||||
struct dundee_device {
|
struct dundee_device {
|
||||||
|
char *path;
|
||||||
|
struct dundee_device_driver *driver;
|
||||||
|
gboolean registered;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *__dundee_device_get_path(struct dundee_device *device)
|
const char *__dundee_device_get_path(struct dundee_device *device)
|
||||||
{
|
{
|
||||||
return "/";
|
return device->path;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __dundee_device_append_properties(struct dundee_device *device,
|
void __dundee_device_append_properties(struct dundee_device *device,
|
||||||
|
@ -64,15 +69,77 @@ void __dundee_device_foreach(dundee_device_foreach_func func, void *userdata)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int register_device(struct dundee_device *device)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int unregister_device(struct dundee_device *device)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void destroy_device(gpointer user)
|
static void destroy_device(gpointer user)
|
||||||
{
|
{
|
||||||
struct dundee_device *device = user;
|
struct dundee_device *device = user;
|
||||||
|
|
||||||
|
g_free(device->path);
|
||||||
|
|
||||||
g_free(device);
|
g_free(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct dundee_device *dundee_device_create(struct dundee_device_driver *d)
|
||||||
|
{
|
||||||
|
struct dundee_device *device;
|
||||||
|
|
||||||
|
device = g_try_new0(struct dundee_device, 1);
|
||||||
|
if (device == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
device->driver = d;
|
||||||
|
|
||||||
|
device->path = g_strdup_printf("/device%d", next_device_id);
|
||||||
|
if (device->path == NULL) {
|
||||||
|
g_free(device);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
next_device_id += 1;
|
||||||
|
|
||||||
|
return device;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dundee_device_register(struct dundee_device *device)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = register_device(device);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
device->registered = TRUE;
|
||||||
|
|
||||||
|
g_hash_table_insert(device_hash, g_strdup(device->path), device);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dundee_device_unregister(struct dundee_device *device)
|
||||||
|
{
|
||||||
|
DBG("%p", device);
|
||||||
|
|
||||||
|
unregister_device(device);
|
||||||
|
|
||||||
|
device->registered = FALSE;
|
||||||
|
|
||||||
|
g_hash_table_remove(device_hash, device->path);
|
||||||
|
}
|
||||||
|
|
||||||
static void device_shutdown(gpointer key, gpointer value, gpointer user_data)
|
static void device_shutdown(gpointer key, gpointer value, gpointer user_data)
|
||||||
{
|
{
|
||||||
|
struct dundee_device *device = value;
|
||||||
|
|
||||||
|
unregister_device(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __dundee_device_shutdown(void)
|
void __dundee_device_shutdown(void)
|
||||||
|
|
|
@ -105,6 +105,27 @@ int __dundee_device_init(void);
|
||||||
void __dundee_device_cleanup(void);
|
void __dundee_device_cleanup(void);
|
||||||
void __dundee_device_shutdown(void);
|
void __dundee_device_shutdown(void);
|
||||||
|
|
||||||
|
typedef void (*dundee_device_connect_cb_t)(const struct dundee_error *error,
|
||||||
|
int fd, void *data);
|
||||||
|
typedef void (*dundee_device_disconnect_cb_t)(const struct dundee_error *error,
|
||||||
|
void *data);
|
||||||
|
|
||||||
|
struct dundee_device_driver {
|
||||||
|
const char *name;
|
||||||
|
|
||||||
|
/* Connect and dial */
|
||||||
|
void (*connect)(struct dundee_device *device,
|
||||||
|
dundee_device_connect_cb_t cb, void *data);
|
||||||
|
|
||||||
|
/* Hangup and disconnect */
|
||||||
|
void (*disconnect)(struct dundee_device *device,
|
||||||
|
dundee_device_disconnect_cb_t cb, void *data);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct dundee_device *dundee_device_create(struct dundee_device_driver *d);
|
||||||
|
int dundee_device_register(struct dundee_device *device);
|
||||||
|
void dundee_device_unregister(struct dundee_device *device);
|
||||||
|
|
||||||
typedef void (*dundee_device_foreach_func)(struct dundee_device *device,
|
typedef void (*dundee_device_foreach_func)(struct dundee_device *device,
|
||||||
void *data);
|
void *data);
|
||||||
void __dundee_device_foreach(dundee_device_foreach_func cb, void *userdata);
|
void __dundee_device_foreach(dundee_device_foreach_func cb, void *userdata);
|
||||||
|
|
Loading…
Reference in New Issue