OSDN Git Service

deviceinfo: Use btd_service userdata pointer
authorMikel Astiz <mikel.astiz@bmw-carit.de>
Mon, 27 May 2013 12:04:07 +0000 (14:04 +0200)
committerJohan Hedberg <johan.hedberg@intel.com>
Mon, 24 Jun 2013 08:16:49 +0000 (11:16 +0300)
Avoid maintaining an internal list of probed deviceinfo instances by
making use of btd_service's userdata pointer.

profiles/deviceinfo/deviceinfo.c

index e8cb5f7..8343bb5 100644 (file)
@@ -51,16 +51,14 @@ struct deviceinfo {
        GSList                  *chars;         /* Characteristics */
 };
 
-static GSList *servers = NULL;
-
 struct characteristic {
        struct gatt_char        attr;   /* Characteristic */
        struct deviceinfo       *d;     /* deviceinfo where the char belongs */
 };
 
-static void deviceinfo_free(gpointer user_data)
+static void deviceinfo_driver_remove(struct btd_service *service)
 {
-       struct deviceinfo *d = user_data;
+       struct deviceinfo *d = btd_service_get_user_data(service);
 
        if (d->attioid > 0)
                btd_device_remove_attio_callback(d->dev, d->attioid);
@@ -75,17 +73,6 @@ static void deviceinfo_free(gpointer user_data)
        g_free(d);
 }
 
-static int cmp_device(gconstpointer a, gconstpointer b)
-{
-       const struct deviceinfo *d = a;
-       const struct btd_device *dev = b;
-
-       if (dev == d->dev)
-               return 0;
-
-       return -1;
-}
-
 static void read_pnpid_cb(guint8 status, const guint8 *pdu, guint16 len,
                                                        gpointer user_data)
 {
@@ -166,9 +153,10 @@ static void attio_disconnected_cb(gpointer user_data)
        d->attrib = NULL;
 }
 
-static int deviceinfo_register(struct btd_device *device,
+static int deviceinfo_register(struct btd_service *service,
                                                struct gatt_primary *prim)
 {
+       struct btd_device *device = btd_service_get_device(service);
        struct deviceinfo *d;
 
        d = g_new0(struct deviceinfo, 1);
@@ -177,28 +165,13 @@ static int deviceinfo_register(struct btd_device *device,
        d->svc_range->start = prim->range.start;
        d->svc_range->end = prim->range.end;
 
-       servers = g_slist_prepend(servers, d);
+       btd_service_set_user_data(service, d);
 
        d->attioid = btd_device_add_attio_callback(device, attio_connected_cb,
                                                attio_disconnected_cb, d);
        return 0;
 }
 
-static void deviceinfo_unregister(struct btd_device *device)
-{
-       struct deviceinfo *d;
-       GSList *l;
-
-       l = g_slist_find_custom(servers, device, cmp_device);
-       if (l == NULL)
-               return;
-
-       d = l->data;
-       servers = g_slist_remove(servers, d);
-
-       deviceinfo_free(d);
-}
-
 static int deviceinfo_driver_probe(struct btd_service *service)
 {
        struct btd_device *device = btd_service_get_device(service);
@@ -208,14 +181,7 @@ static int deviceinfo_driver_probe(struct btd_service *service)
        if (prim == NULL)
                return -EINVAL;
 
-       return deviceinfo_register(device, prim);
-}
-
-static void deviceinfo_driver_remove(struct btd_service *service)
-{
-       struct btd_device *device = btd_service_get_device(service);
-
-       deviceinfo_unregister(device);
+       return deviceinfo_register(service, prim);
 }
 
 static struct btd_profile deviceinfo_profile = {