adapter: Change connect/disconnect prototype
authorSamuel Ortiz <sameo@linux.intel.com>
Tue, 3 May 2011 17:08:28 +0000 (19:08 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 21 Oct 2011 06:54:03 +0000 (23:54 -0700)
src/adapter.c
src/target.c

index 0047ff8..643e508 100644 (file)
@@ -50,6 +50,7 @@ struct near_adapter {
        near_bool_t polling;
 
        GList *target_list;
+       struct near_target *active_target;
 };
 
 static void free_adapter(gpointer data)
@@ -364,17 +365,40 @@ int __near_adapter_remove_target(uint32_t idx, struct near_target *target)
        if (adapter == NULL)
                return -ENODEV;
 
+       if (adapter->active_target == target) {
+               __near_netlink_deactivate_target(idx, target_idx);
+               adapter->active_target = NULL;
+       }
+
        adapter->target_list = g_list_remove(adapter->target_list, target);
 
        return 0;
 }
 
-int near_adapter_connect(uint32_t idx)
+static struct near_target *find_target(struct near_adapter *adapter,
+                                               uint32_t target_idx)
+{
+       GList *list;
+
+       for (list = adapter->target_list; list; list = list->next) {
+               struct near_target *target = list->data;
+               uint32_t idx;
+
+               idx = __near_target_get_idx(target);
+               if (idx == target_idx)
+                       return target;
+
+       }
+
+       return NULL;
+}
+
+int near_adapter_connect(uint32_t idx, uint32_t target_idx)
 {
        struct near_adapter *adapter;
        struct near_target *target;
-       GList *list;
-       uint32_t target_idx, protocols;
+       uint32_t protocols;
+       int err;
 
        DBG("idx %d", idx);
 
@@ -382,24 +406,27 @@ int near_adapter_connect(uint32_t idx)
        if (adapter == NULL)
                return -ENODEV;
 
-       list = g_list_first(adapter->target_list);
-       if (list == NULL)
-               return -ENOLINK;
+       if (adapter->active_target != NULL)
+               return -EALREADY;
 
-       target = list->data;
+       target = find_target(adapter, target_idx);
+       if (target == NULL)
+               return -ENOLINK;
 
-       target_idx = __near_target_get_idx(target);
        protocols = __near_target_get_protocols(target);
 
-       return __near_netlink_activate_target(idx, target_idx, protocols);
+       err = __near_netlink_activate_target(idx, target_idx, protocols);
+       if (err == 0)
+               adapter->active_target = target;
+
+       return err;
 }
 
-int near_adapter_disconnect(uint32_t idx)
+int near_adapter_disconnect(uint32_t idx, uint32_t target_idx)
 {
        struct near_adapter *adapter;
        struct near_target *target;
-       GList *list;
-       uint32_t target_idx;
+       int err;
 
        DBG("idx %d", idx);
 
@@ -407,15 +434,15 @@ int near_adapter_disconnect(uint32_t idx)
        if (adapter == NULL)
                return -ENODEV;
 
-       list = g_list_first(adapter->target_list);
-       if (list == NULL)
+       target = find_target(adapter, target_idx);
+       if (target == NULL || adapter->active_target == NULL)
                return -ENOLINK;
 
-       target = list->data;
-
-       target_idx = __near_target_get_idx(target);
+       err = __near_netlink_deactivate_target(idx, target_idx);
+       if (err == 0)
+               adapter->active_target = NULL;
 
-       return __near_netlink_deactivate_target(idx, target_idx);
+       return err;
 }
 
 int __near_adapter_init(void)
index 49f7a69..c01e9c0 100644 (file)
@@ -337,7 +337,7 @@ void __near_target_remove(uint32_t target_idx)
        if (target == NULL)
                return;
 
-       __near_adapter_add_target(target->adapter_idx, target);
+       __near_adapter_remove_target(target->adapter_idx, target);
 
        g_dbus_unregister_interface(connection, target->path,
                                                NFC_TARGET_INTERFACE);