From 303b30190ee1b33c2fb2dac3a95e5b4c3b1769a2 Mon Sep 17 00:00:00 2001 From: Samuel Ortiz Date: Tue, 3 May 2011 19:08:28 +0200 Subject: [PATCH] adapter: Change connect/disconnect prototype --- src/adapter.c | 63 ++++++++++++++++++++++++++++++++++++++++++----------------- src/target.c | 2 +- 2 files changed, 46 insertions(+), 19 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index 0047ff8..643e508 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -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) diff --git a/src/target.c b/src/target.c index 49f7a69..c01e9c0 100644 --- a/src/target.c +++ b/src/target.c @@ -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); -- 2.7.4