Fix : Some properties of adapter couldn't be handled 35/153435/1
authorSeungyoun Ju <sy39.ju@samsung.com>
Wed, 20 Sep 2017 05:01:52 +0000 (14:01 +0900)
committerSeungyoun Ju <sy39.ju@samsung.com>
Thu, 28 Sep 2017 10:23:33 +0000 (19:23 +0900)
[Problem] Some property changed events for adapter object couldn't be handled
[Cause & Measure] It returns in the iterate loop

Change-Id: I17395d7cea094cac324fec110add10ae8c13cc8b
Signed-off-by: Seungyoun Ju <sy39.ju@samsung.com>
bt-service/bt-service-event-receiver.c

index bb453f0..c38dbab 100644 (file)
@@ -599,18 +599,21 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
        GError *err = NULL;
        char *property = NULL;
        GVariant *param = NULL;
+
        g_variant_iter_init(&value_iter, msg);
        while ((g_variant_iter_loop(&value_iter, "{sv}", &property, &val))) {
                BT_INFO("Property %s", property);
 
                if (strcasecmp(property, "Discovering") == 0) {
                        gboolean discovering = FALSE;
+
+                       if (_bt_adapter_get_status() != BT_ACTIVATED)
+                               continue;
+
                        g_variant_get(val, "b", &discovering);
-                       /* Send event to application */
                        BT_DBG("Discovering %d", discovering);
-                       if (_bt_adapter_get_status() != BT_ACTIVATED)
-                               return;
 
+                       /* Send event to application */
                        if (discovering == TRUE) {
                                _bt_set_discovery_status(TRUE);
                                param = g_variant_new("(i)", result);
@@ -618,10 +621,12 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
                                        BLUETOOTH_EVENT_DISCOVERY_STARTED,
                                        param);
                        } else {
-                               ret_if(event_id > 0);
+                               if (event_id > 0)
+                                       continue;
 
                                adapter_proxy = _bt_get_adapter_proxy();
-                               ret_if(adapter_proxy == NULL);
+                               if (adapter_proxy == NULL)
+                                       continue;
 
                                /* Need to stop searching */
                                ret = g_dbus_proxy_call_sync(adapter_proxy, "StopDiscovery",
@@ -642,31 +647,34 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
                } else if (strcasecmp(property, "LEDiscovering") == 0) {
                        gboolean le_discovering = FALSE;
 
+                       if (_bt_adapter_get_status() != BT_ACTIVATED ||
+                           _bt_adapter_get_le_status() != BT_LE_ACTIVATED)
+                               continue;
+
                        g_variant_get(val, "b", &le_discovering);
                        BT_DBG("LEDiscovering %d", le_discovering);
-                       if (_bt_adapter_get_status() != BT_ACTIVATED ||
-                               _bt_adapter_get_le_status() != BT_LE_ACTIVATED)
-                               return;
 
                        /* Send event to application */
                        if (le_discovering == TRUE) {
                                _bt_set_le_scan_status(TRUE);
                                param = g_variant_new("(i)", result);
                                _bt_send_event(BT_LE_ADAPTER_EVENT,
-                               BLUETOOTH_EVENT_LE_DISCOVERY_STARTED,
-                               param);
+                                       BLUETOOTH_EVENT_LE_DISCOVERY_STARTED,
+                                       param);
                        } else {
-                               ret_if(le_scan_event_id > 0);
+                               if (le_scan_event_id > 0)
+                                       continue;
 
                                adapter_proxy = _bt_get_adapter_proxy();
-                               ret_if(adapter_proxy == NULL);
+                               if (adapter_proxy == NULL)
+                                       continue;
 
                                /* Need to stop searching */
                                ret = g_dbus_proxy_call_sync(adapter_proxy, "StopLEDiscovery",
-                                       NULL,
-                                       G_DBUS_CALL_FLAGS_NONE,
-                                       DBUS_TIMEOUT, NULL,
-                                       &err);
+                                               NULL,
+                                               G_DBUS_CALL_FLAGS_NONE,
+                                               DBUS_TIMEOUT, NULL,
+                                               &err);
                                if (err) {
                                        BT_ERR("Dbus Error %s", err->message);
                                        g_clear_error(&err);
@@ -676,25 +684,23 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
 
                                le_scan_event_id = g_timeout_add(BT_DISCOVERY_FINISHED_DELAY,
                                                (GSourceFunc)__bt_le_discovery_finished_cb, NULL);
-                               }
+                       }
                } else if (strcasecmp(property, "Name") == 0) {
                        char *name = NULL;
-                       g_variant_get(val, "s", &name);
+                       g_variant_get(val, "&s", &name);
                        param = g_variant_new("(is)", result, name);
                        /* Send event to application */
                        _bt_send_event(BT_ADAPTER_EVENT,
                                BLUETOOTH_EVENT_LOCAL_NAME_CHANGED,
                                param);
-                       g_free(name);
                } else if (strcasecmp(property, "Alias") == 0) {
                        char *alias = NULL;
-                       g_variant_get(val, "s", &alias);
+                       g_variant_get(val, "&s", &alias);
                        param = g_variant_new("(is)", result, alias);
                        /* Send event to application */
                        _bt_send_event(BT_ADAPTER_EVENT,
                                BLUETOOTH_EVENT_LOCAL_NAME_CHANGED,
                                param);
-                       g_free(alias);
                } else if (strcasecmp(property, "Discoverable") == 0) {
                        gboolean discoverable = FALSE;
 
@@ -705,7 +711,8 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
                                if (_bt_get_discoverable_timeout_property() > 0) {
                                        int time = 0;
                                        adapter_proxy = _bt_get_adapter_properties_proxy();
-                                       ret_if(adapter_proxy == NULL);
+                                       if (adapter_proxy == NULL)
+                                               continue;
                                        ret = g_dbus_proxy_call_sync(adapter_proxy, "Set",
                                                g_variant_new("(ssv)", BT_ADAPTER_INTERFACE,
                                                "DiscoverableTimeout",
@@ -734,11 +741,8 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
                                _bt_get_discoverable_mode(&mode);
 
                                /* Event will be sent by "DiscoverableTimeout" signal */
-                               if (mode != BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE) {
-                                       g_free(property);
-                                       g_variant_unref(val);
-                                       return;
-                               }
+                               if (mode != BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE)
+                                       continue;
 
                                /* Send event to application */
                                BT_INFO("[General Discoverable]");
@@ -752,11 +756,8 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
 
                        /* Event was already sent by "Discoverable" signal */
                        if (mode == BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE ||
-                               mode == BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE) {
-                               g_free(property);
-                               g_variant_unref(val);
-                               return;
-                       }
+                           mode == BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE)
+                               continue;
 
                        /* Send event to application */
                        BT_INFO("[Limited Discoverable (Timeout %u secs)]",
@@ -812,18 +813,17 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
                        char *name = NULL;
                        char *value = NULL;
                        GVariantIter *iter = NULL;
-                       g_variant_get(val, "as", &iter);
 
-                       ret_if(iter == NULL);
+                       g_variant_get(val, "as", &iter);
+                       if (iter == NULL)
+                               continue;
 
-                       while (g_variant_iter_loop(iter, "s", &name)) {
-                               BT_DBG("name = %s", name);
-                               g_variant_iter_loop(iter, "s", &value);
-                               BT_DBG("Value = %s", value);
-                               if (FALSE == _bt_update_le_feature_support(name, value))
-                                       BT_INFO("Fail to update LE feature info");
+                       while (g_variant_iter_next(iter, "&s", &name) &&
+                              g_variant_iter_next(iter, "&s", &value)) {
+                               BT_DBG("name = %s, Value = %s", name, value);
+                               if (!_bt_update_le_feature_support(name, value))
+                                       BT_ERR("Failed to update LE feature (name = %s, value = %s)", name, value);
                        }
-
                        g_variant_iter_free(iter);
                } else if (strcasecmp(property, "IpspInitStateChanged") == 0) {
                        gboolean ipsp_initialized = FALSE;
@@ -837,7 +837,7 @@ static void __bt_adapter_property_changed_event(GVariant *msg, const char *path)
                                        BLUETOOTH_EVENT_IPSP_INIT_STATE_CHANGED,
                                        param);
                } else {
-                       BT_DBG("property : [%s]", property);
+                       BT_DBG("Unhandled property : [%s]", property);
                }
        }
 }