From fa73398ae61e055f7e4bc53614fe2760ed102b7f Mon Sep 17 00:00:00 2001 From: Alex Deymo Date: Wed, 8 May 2013 17:37:56 -0700 Subject: [PATCH] plugins: Extend the pin code callback with the call number The plugin's pin code callback doesn't know about the pairing process. It just provides a pin code based on the information provided to this function. Although limited state could be added through other new callbacks, this fix achieves this by providing more information to the callback itself. The new argument "attempt" states the pin callback attempt of the particular plugin for the current pairing of the device. This allows a plugin to try different pincodes for the same device in the same pairing process. To signal that the plugin doesn't provide any pin code for the provided device the current implementation returns 0 (an empty pin code). Analogously, with this fix, a plugin should return 0 when it doesn't have any other pin code to provide for the given device. --- plugins/wiimote.c | 7 ++++++- src/adapter.c | 2 +- src/adapter.h | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/plugins/wiimote.c b/plugins/wiimote.c index 90d6d7bb4..12312b608 100644 --- a/plugins/wiimote.c +++ b/plugins/wiimote.c @@ -70,12 +70,17 @@ static const char *wii_names[] = { }; static ssize_t wii_pincb(struct btd_adapter *adapter, struct btd_device *device, - char *pinbuf, gboolean *display) + char *pinbuf, gboolean *display, unsigned int attempt) { uint16_t vendor, product; char addr[18], name[25]; unsigned int i; + /* Only try the pin code once per device. If it's not correct then it's + * an unknown device. */ + if (attempt > 1) + return 0; + ba2str(device_get_address(device), addr); vendor = btd_device_get_vendor(device); diff --git a/src/adapter.c b/src/adapter.c index d6c865c8a..87e2d9016 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -4799,7 +4799,7 @@ static ssize_t btd_adapter_pin_cb_iter_next( while (iter->it != NULL) { cb = iter->it->data; - ret = cb(adapter, device, pin_buf, display); + ret = cb(adapter, device, pin_buf, display, iter->attempt); iter->attempt++; if (ret > 0) return ret; diff --git a/src/adapter.h b/src/adapter.h index 425a11f4b..09d80c249 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -132,7 +132,8 @@ int btd_cancel_authorization(guint id); int btd_adapter_restore_powered(struct btd_adapter *adapter); typedef ssize_t (*btd_adapter_pin_cb_t) (struct btd_adapter *adapter, - struct btd_device *dev, char *out, gboolean *display); + struct btd_device *dev, char *out, gboolean *display, + unsigned int attempt); void btd_adapter_register_pin_cb(struct btd_adapter *adapter, btd_adapter_pin_cb_t cb); void btd_adapter_unregister_pin_cb(struct btd_adapter *adapter, -- 2.47.3