From: Luiz Augusto von Dentz <luiz.von.de...@intel.com> In case the UUIDs are not updated, or are still being resolved, when Paired property changes a modem will never be registered.
In order to fix this problem allow modems to be registered directly during NewConnection. --- plugins/hfp_hf_bluez5.c | 193 +++++++++++++++++++++++++----------------------- 1 file changed, 102 insertions(+), 91 deletions(-) diff --git a/plugins/hfp_hf_bluez5.c b/plugins/hfp_hf_bluez5.c index 6ae98b3..fb7cc3f 100644 --- a/plugins/hfp_hf_bluez5.c +++ b/plugins/hfp_hf_bluez5.c @@ -499,6 +499,96 @@ static int get_version(DBusMessageIter *iter, uint16_t *version) return -ENOENT; } +static gboolean has_hfp_ag_uuid(DBusMessageIter *array) +{ + DBusMessageIter value; + + if (dbus_message_iter_get_arg_type(array) != DBUS_TYPE_ARRAY) + return FALSE; + + dbus_message_iter_recurse(array, &value); + + while (dbus_message_iter_get_arg_type(&value) == DBUS_TYPE_STRING) { + const char *uuid; + + dbus_message_iter_get_basic(&value, &uuid); + + if (g_str_equal(uuid, HFP_AG_UUID) == TRUE) + return TRUE; + + dbus_message_iter_next(&value); + } + + return FALSE; +} + +static void modem_removed(GDBusProxy *proxy, void *user_data) +{ + struct ofono_modem *modem = user_data; + + ofono_modem_remove(modem); +} + +static void alias_changed(GDBusProxy *proxy, const char *name, + DBusMessageIter *iter, void *user_data) +{ + const char *alias; + struct ofono_modem *modem = user_data; + + if (g_str_equal("Alias", name) == FALSE) + return; + + dbus_message_iter_get_basic(iter, &alias); + ofono_modem_set_name(modem, alias); +} + +static struct ofono_modem *modem_register_from_proxy(GDBusProxy *proxy, + const char *path) +{ + const char *alias, *remote; + DBusMessageIter iter; + dbus_bool_t paired; + struct ofono_modem *modem; + + if (g_dbus_proxy_get_property(proxy, "Paired", &iter) == FALSE) + return NULL; + + dbus_message_iter_get_basic(&iter, &paired); + + if (paired == FALSE) { + modem = ofono_modem_find(device_path_compare, (void *) path); + + if (modem != NULL) { + ofono_modem_remove(modem); + g_dbus_proxy_set_removed_watch(proxy, NULL, NULL); + g_dbus_proxy_set_property_watch(proxy, NULL, NULL); + } + return NULL; + } + + if (g_dbus_proxy_get_property(proxy, "UUIDs", &iter) == FALSE) + return NULL; + + if (has_hfp_ag_uuid(&iter) == FALSE) + return NULL; + + if (g_dbus_proxy_get_property(proxy, "Alias", &iter) == FALSE) + return NULL; + + dbus_message_iter_get_basic(&iter, &alias); + + if (g_dbus_proxy_get_property(proxy, "Address", &iter) == FALSE) + return NULL; + + dbus_message_iter_get_basic(&iter, &remote); + + modem = modem_register(path, remote, alias); + g_dbus_proxy_set_property_watch(proxy, alias_changed, modem); + g_dbus_proxy_set_removed_watch(proxy, modem_removed, modem); + + return modem; +} + static DBusMessage *profile_new_connection(DBusConnection *conn, DBusMessage *msg, void *user_data) { @@ -541,10 +631,18 @@ static DBusMessage *profile_new_connection(DBusConnection *conn, modem = ofono_modem_find(device_path_compare, (void *) device); if (modem == NULL) { - close(fd); - return g_dbus_create_error(msg, BLUEZ_ERROR_INTERFACE - ".Rejected", - "Unknown Bluetooth device"); + GDBusProxy *proxy; + + proxy = g_dbus_proxy_new(bluez, device, BLUEZ_DEVICE_INTERFACE); + modem = modem_register_from_proxy(proxy, device); + g_dbus_proxy_unref(proxy); + + if (!modem) { + close(fd); + return g_dbus_create_error(msg, BLUEZ_ERROR_INTERFACE + ".Rejected", + "Unknown Bluetooth device"); + } } err = service_level_connection(modem, fd, version); @@ -686,93 +784,6 @@ static void connect_handler(DBusConnection *conn, void *user_data) HFP_EXT_PROFILE_PATH, NULL, features); } -static gboolean has_hfp_ag_uuid(DBusMessageIter *array) -{ - DBusMessageIter value; - - if (dbus_message_iter_get_arg_type(array) != DBUS_TYPE_ARRAY) - return FALSE; - - dbus_message_iter_recurse(array, &value); - - while (dbus_message_iter_get_arg_type(&value) == DBUS_TYPE_STRING) { - const char *uuid; - - dbus_message_iter_get_basic(&value, &uuid); - - if (g_str_equal(uuid, HFP_AG_UUID) == TRUE) - return TRUE; - - dbus_message_iter_next(&value); - } - - return FALSE; -} - -static void modem_removed(GDBusProxy *proxy, void *user_data) -{ - struct ofono_modem *modem = user_data; - - ofono_modem_remove(modem); -} - -static void alias_changed(GDBusProxy *proxy, const char *name, - DBusMessageIter *iter, void *user_data) -{ - const char *alias; - struct ofono_modem *modem = user_data; - - if (g_str_equal("Alias", name) == FALSE) - return; - - dbus_message_iter_get_basic(iter, &alias); - ofono_modem_set_name(modem, alias); -} - -static void modem_register_from_proxy(GDBusProxy *proxy, const char *path) -{ - const char *alias, *remote; - DBusMessageIter iter; - dbus_bool_t paired; - struct ofono_modem *modem; - - if (g_dbus_proxy_get_property(proxy, "Paired", &iter) == FALSE) - return; - - dbus_message_iter_get_basic(&iter, &paired); - - if (paired == FALSE) { - modem = ofono_modem_find(device_path_compare, (void *) path); - - if (modem != NULL) { - ofono_modem_remove(modem); - g_dbus_proxy_set_removed_watch(proxy, NULL, NULL); - g_dbus_proxy_set_property_watch(proxy, NULL, NULL); - } - return; - } - - if (g_dbus_proxy_get_property(proxy, "UUIDs", &iter) == FALSE) - return; - - if (has_hfp_ag_uuid(&iter) == FALSE) - return; - - if (g_dbus_proxy_get_property(proxy, "Alias", &iter) == FALSE) - return; - - dbus_message_iter_get_basic(&iter, &alias); - - if (g_dbus_proxy_get_property(proxy, "Address", &iter) == FALSE) - return; - - dbus_message_iter_get_basic(&iter, &remote); - - modem = modem_register(path, remote, alias); - g_dbus_proxy_set_property_watch(proxy, alias_changed, modem); - g_dbus_proxy_set_removed_watch(proxy, modem_removed, modem); -} - static void proxy_added(GDBusProxy *proxy, void *user_data) { const char *interface, *path; -- 2.9.3 _______________________________________________ ofono mailing list ofono@ofono.org https://lists.ofono.org/mailman/listinfo/ofono