diff options
author | Szymon Janc <szymon.janc@tieto.com> | 2012-10-03 15:18:28 +0200 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2012-10-03 22:44:15 +0300 |
commit | 94667c8290663eb79f4c6026fa5a278a89b6730d (patch) | |
tree | f7aa6d0c980da4e2b6202543afcfe5e5b53432a8 /plugins | |
parent | 2640939604ce3c7d5c29c185962aceb3913c5737 (diff) |
oob: Refactor oob callback handling and move it to adapter code
This allows oob plugin to register for callback after executing
certain action on adapter. Currently reading local OOB data and
pairing is supported. It should be easy to support more callbacks
in future if needed e.g. powering on.
Thanks to this plugin is not required to duplicate code that would
validate adapter/device when callback is received as callback condition
is check in adapter.
It also allows to pass user data which will be provided back when cb
is called further reducing plugin code.
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/dbusoob.c | 62 |
1 files changed, 13 insertions, 49 deletions
diff --git a/plugins/dbusoob.c b/plugins/dbusoob.c index d3bca9e3..ea403559 100644 --- a/plugins/dbusoob.c +++ b/plugins/dbusoob.c @@ -44,16 +44,10 @@ #include "dbus-common.h" #include "event.h" #include "error.h" -#include "oob.h" #include "storage.h" #define OOB_INTERFACE "org.bluez.OutOfBand" -struct oob_request { - struct btd_adapter *adapter; - DBusMessage *msg; -}; - struct oob_data { char *addr; uint8_t *hash; @@ -62,47 +56,22 @@ struct oob_data { const char *name; }; -static GSList *oob_requests = NULL; - -static gint oob_request_cmp(gconstpointer a, gconstpointer b) -{ - const struct oob_request *data = a; - const struct btd_adapter *adapter = b; - - return data->adapter != adapter; -} - -static struct oob_request *find_oob_request(struct btd_adapter *adapter) -{ - GSList *match; - - match = g_slist_find_custom(oob_requests, adapter, oob_request_cmp); - - if (match) - return match->data; - - return NULL; -} - static void read_local_data_complete(struct btd_adapter *adapter, uint8_t *hash, - uint8_t *randomizer) + uint8_t *randomizer, void *user_data) { struct DBusMessage *reply; - struct oob_request *oob_request; DBusMessageIter iter; DBusMessageIter dict; + DBusMessage *msg = user_data; - oob_request = find_oob_request(adapter); - if (!oob_request) - return; + DBG(""); if (!hash || !randomizer) { - reply = btd_error_failed(oob_request->msg, - "Failed to read local OOB data."); + reply = btd_error_failed(msg, "Failed to read local OOB data"); goto done; } - reply = dbus_message_new_method_return(oob_request->msg); + reply = dbus_message_new_method_return(msg); if (!reply) goto done; @@ -119,9 +88,7 @@ static void read_local_data_complete(struct btd_adapter *adapter, uint8_t *hash, dbus_message_iter_close_container(&iter, &dict); done: - oob_requests = g_slist_remove(oob_requests, oob_request); - dbus_message_unref(oob_request->msg); - g_free(oob_request); + dbus_message_unref(msg); if (!reply) { error("Couldn't allocate D-Bus message"); @@ -136,21 +103,22 @@ static DBusMessage *read_local_data(DBusConnection *conn, DBusMessage *msg, void *data) { struct btd_adapter *adapter = data; - struct oob_request *oob_request; + struct oob_handler *handler; if (!btd_adapter_ssp_enabled(adapter)) return btd_error_not_supported(msg); - if (find_oob_request(adapter)) + if (btd_adapter_check_oob_handler(adapter)) return btd_error_in_progress(msg); if (btd_adapter_read_local_oob_data(adapter)) return btd_error_failed(msg, "Request failed."); - oob_request = g_new(struct oob_request, 1); - oob_request->adapter = adapter; - oob_requests = g_slist_append(oob_requests, oob_request); - oob_request->msg = dbus_message_ref(msg); + handler = g_new0(struct oob_handler, 1); + handler->read_local_cb = read_local_data_complete; + handler->user_data = dbus_message_ref(msg); + + btd_adapter_set_oob_handler(adapter, handler); return NULL; } @@ -336,8 +304,6 @@ static int oob_probe(struct btd_adapter *adapter) static void oob_remove(struct btd_adapter *adapter) { - read_local_data_complete(adapter, NULL, NULL); - g_dbus_unregister_interface(btd_get_dbus_connection(), adapter_get_path(adapter), OOB_INTERFACE); } @@ -352,8 +318,6 @@ static int dbusoob_init(void) { DBG("Setup dbusoob plugin"); - oob_register_cb(read_local_data_complete); - return btd_register_adapter_driver(&oob_driver); } |