dundee: Add device un/register
authorDaniel Wagner <daniel.wagner@bmw-carit.de>
Tue, 20 Dec 2011 14:12:51 +0000 (15:12 +0100)
committerDaniel Wagner <daniel.wagner@bmw-carit.de>
Tue, 22 May 2012 16:44:46 +0000 (18:44 +0200)
dundee/device.c
dundee/dundee.h

index d9fc928..9ed1687 100644 (file)
 
 #include "dundee.h"
 
+static int next_device_id = 0;
 static GHashTable *device_hash;
 
 struct dundee_device {
+       char *path;
+       struct dundee_device_driver *driver;
+       gboolean registered;
+
 };
 
 const char *__dundee_device_get_path(struct dundee_device *device)
 {
-       return "/";
+       return device->path;
 }
 
 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)
 {
        struct dundee_device *device = user;
 
+       g_free(device->path);
+
        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)
 {
+       struct dundee_device *device = value;
+
+       unregister_device(device);
 }
 
 void __dundee_device_shutdown(void)
index 366938e..ae14e01 100644 (file)
@@ -105,6 +105,27 @@ int __dundee_device_init(void);
 void __dundee_device_cleanup(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,
                                                void *data);
 void __dundee_device_foreach(dundee_device_foreach_func cb, void *userdata);