Refactoring GATT client service changed logic 58/136658/1
authorSeungyoun Ju <sy39.ju@samsung.com>
Thu, 22 Jun 2017 06:21:01 +0000 (15:21 +0900)
committerSeungyoun Ju <sy39.ju@samsung.com>
Fri, 30 Jun 2017 14:41:54 +0000 (23:41 +0900)
[Problem] N/A
[Cause & Measure]
 . Add helper function to convert address
 . Reduce an indentation
 . Fix memory leak
[Checking Method] Code review

Change-Id: I2be2c3c202c542b20b2f89614aa02b1f3fe7e731

bt-api/bt-common.c
bt-api/bt-event-handler.c
bt-api/bt-gatt-client.c
bt-api/include/bt-common.h

index 1dffec7..4e15b7f 100755 (executable)
@@ -217,8 +217,7 @@ void _bt_divide_device_class(bluetooth_device_class_t *device_class,
        }
 }
 
-void _bt_convert_addr_string_to_type(unsigned char *addr,
-                                       const char *address)
+void _bt_convert_addr_string_to_type(unsigned char *addr, const char *address)
 {
        int i;
        char *ptr = NULL;
@@ -237,8 +236,7 @@ void _bt_convert_addr_string_to_type(unsigned char *addr,
        }
 }
 
-void _bt_convert_addr_string_to_secure_string(char *addr,
-                                       const char *address)
+void _bt_convert_addr_string_to_secure_string(char *addr, const char *address)
 {
        int len;
 
@@ -256,8 +254,7 @@ void _bt_convert_addr_string_to_secure_string(char *addr,
        return;
 }
 
-void _bt_convert_addr_type_to_string(char *address,
-                               unsigned char *addr)
+void _bt_convert_addr_type_to_string(char *address, unsigned char *addr)
 {
        ret_if(address == NULL);
        ret_if(addr == NULL);
@@ -268,6 +265,16 @@ void _bt_convert_addr_type_to_string(char *address,
                        addr[3], addr[4], addr[5]);
 }
 
+void _bt_convert_addr_type_to_secure_string(char *address, unsigned char *addr)
+{
+       ret_if(address == NULL);
+       ret_if(addr == NULL);
+
+       g_snprintf(address, BT_ADDRESS_STRING_SIZE,
+                       "%2.2X:%2.2X:%2.2X:%2.2X:XX:XX",
+                       addr[0], addr[1], addr[2], addr[3]);
+}
+
 const char *_bt_convert_error_to_string(int error)
 {
        switch (error) {
@@ -1707,6 +1714,35 @@ fail:
 
 }
 
+void _bt_convert_device_path_to_addr_type(const char *device_path,
+                                         unsigned char *addr)
+{
+       char *dev_addr;
+       char address[BT_ADDRESS_STRING_SIZE] = { 0 };
+       int i;
+       char *addr_ptr = address;
+       char *ptr = NULL;
+
+       ret_if(device_path == NULL);
+       ret_if(addr == NULL);
+
+       dev_addr = strstr(device_path, "dev_");
+       if (dev_addr != NULL) {
+               dev_addr += 4;
+               g_strlcpy(addr_ptr, dev_addr, BT_ADDRESS_STRING_SIZE);
+
+               for (i = 0; i < BT_ADDRESS_LENGTH_MAX; i++) {
+                       addr[i] = strtol(addr_ptr, &ptr, 16);
+                       if (ptr[0] != '\0') {
+                               if (ptr[0] != '_')
+                                       return;
+
+                               addr_ptr = ptr + 1;
+                       }
+               }
+       }
+}
+
 void _bt_convert_device_path_to_address(const char *device_path,
                                                char *device_address)
 {
index 443c280..6d534d5 100644 (file)
@@ -3372,77 +3372,68 @@ static void __bt_manager_event_filter(GDBusConnection *connection,
        GVariantIter *interface_iter = NULL;
        char *interface_str = NULL;
        bt_gatt_service_change_t change;
-       char address[BT_ADDRESS_STRING_SIZE] = { 0 };
        char secure_address[BT_ADDRESS_STRING_SIZE] = { 0 };
        bt_user_info_t *user_info = NULL;
 
+       user_info = _bt_get_user_data(BT_COMMON);
+       if (user_info == NULL) {
+               BT_ERR("There is no registered common event callback");
+               return;
+       }
+
        if (strcasecmp(signal_name, "GattServiceAdded") == 0) {
                g_variant_get(parameters, "(&s)", &path);
 
-               _bt_convert_device_path_to_address(path, address);
-               _bt_convert_addr_string_to_type(change.device_addr.addr, address);
-               _bt_convert_addr_string_to_secure_string(secure_address, address);
+               _bt_convert_device_path_to_addr_type(path, change.device_addr.addr);
+               _bt_convert_addr_type_to_secure_string(secure_address,
+                                                      change.device_addr.addr);
 
                if (_bluetooth_gatt_check_service_change_watcher_address(&change.device_addr)
                        == FALSE) {
                        BT_INFO("GATT Service [%s] added, but no watcher for %s",
-                                       path, secure_address);
+                                                       path, secure_address);
                        return;
                } else
                        BT_INFO(" ### GATT Service added [%s] [%s]",
-                                       path, secure_address);
+                                                       path, secure_address);
 
                change.svc_path = g_strdup(path);
                change.change_type = BLUETOOTH_GATT_SERVICE_CHANGE_TYPE_ADD;
-
-               user_info = _bt_get_user_data(BT_COMMON);
-               if (user_info != NULL) {
-                       _bt_common_event_cb(
-                               BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED,
-                               BLUETOOTH_ERROR_NONE, &change,
-                               user_info->cb, user_info->user_data);
-               }
-
+               _bt_common_event_cb(BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED,
+                                   BLUETOOTH_ERROR_NONE, &change,
+                                   user_info->cb, user_info->user_data);
                g_free(change.svc_path);
        } else if (strcasecmp(signal_name, "InterfacesRemoved") == 0) {
-               g_variant_get(parameters, "(&oas)",
-                                                       &path, &interface_iter);
-
+               g_variant_get(parameters, "(&oas)", &path, &interface_iter);
                if (!path) {
                        BT_ERR("Invalid adapter path");
+                       g_variant_iter_free(interface_iter);
                        return;
                }
 
-               while (g_variant_iter_loop(interface_iter, "s", &interface_str)) {
-                       if (g_strcmp0(interface_str, GATT_SERV_INTERFACE) == 0) {
-                               _bt_convert_device_path_to_address(path, address);
-                               _bt_convert_addr_string_to_type(change.device_addr.addr, address);
-                               _bt_convert_addr_string_to_secure_string(secure_address, address);
-
-                               if (_bluetooth_gatt_check_service_change_watcher_address(&change.device_addr)
-                                       == FALSE) {
-                                       BT_INFO("GATT Service [%s] removed, but no watcher for %s",
-                                                       path, secure_address);
-                                       return;
-                               }
-
-                               change.svc_path = g_strdup(path);
-                               change.change_type = BLUETOOTH_GATT_SERVICE_CHANGE_TYPE_REMOVE;
+               _bt_convert_device_path_to_addr_type(path, change.device_addr.addr);
+               if (!_bluetooth_gatt_check_service_change_watcher_address(&change.device_addr)) {
+                       g_variant_iter_free(interface_iter);
+                       return;
+               }
 
-                               BT_INFO(" ### GATT Service removed [%s] [%s]",
-                                               path, secure_address);
+               while (g_variant_iter_loop(interface_iter, "&s", &interface_str)) {
+                       if (g_strcmp0(interface_str, GATT_SERV_INTERFACE) != 0)
+                               continue;
 
-                               user_info = _bt_get_user_data(BT_COMMON);
-                               if (user_info != NULL) {
-                                       _bt_common_event_cb(
-                                               BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED,
-                                               BLUETOOTH_ERROR_NONE, &change,
-                                               user_info->cb, user_info->user_data);
-                               }
+                       _bt_convert_addr_type_to_secure_string(secure_address,
+                                                              change.device_addr.addr);
+                       BT_INFO(" ### GATT Service removed [%s] [%s]",
+                                                       path, secure_address);
 
-                               g_free(change.svc_path);
-                               break;
-                       }
+                       change.svc_path = g_strdup(path);
+                       change.change_type = BLUETOOTH_GATT_SERVICE_CHANGE_TYPE_REMOVE;
+                       _bt_common_event_cb(
+                                       BLUETOOTH_EVENT_GATT_CLIENT_SERVICE_CHANGED,
+                                       BLUETOOTH_ERROR_NONE, &change,
+                                       user_info->cb, user_info->user_data);
+                       g_free(change.svc_path);
+                       break;
                }
                g_variant_iter_free(interface_iter);
        }
index cff86ec..af3c69f 100644 (file)
@@ -107,28 +107,12 @@ gboolean _bluetooth_gatt_check_service_change_watcher_address(
                const bluetooth_device_address_t *device_addr)
 {
        GSList *l;
-       char device_address[BT_ADDRESS_STRING_SIZE] = { 0 };
-       char secure_address[BT_ADDRESS_STRING_SIZE] = { 0 };
-
-       _bt_convert_addr_type_to_string(device_address,
-                       (unsigned char *)device_addr->addr);
 
        for (l = service_monitor_list; l != NULL; l = l->next) {
-               char device_address2[BT_ADDRESS_STRING_SIZE] = { 0 };
-               char secure_address2[BT_ADDRESS_STRING_SIZE] = { 0 };
                bluetooth_device_address_t *addr = l->data;
 
-               _bt_convert_addr_type_to_string(device_address2,
-                               (unsigned char *)addr->addr);
-               _bt_convert_addr_string_to_secure_string(secure_address,
-                               device_address);
-               _bt_convert_addr_string_to_secure_string(secure_address2,
-                               device_address2);
-               BT_INFO("service_monitor_list [%s] - Input [%s]",
-                               secure_address2, secure_address);
-
                if (!memcmp(device_addr, addr,
-                               sizeof(bluetooth_device_address_t)))
+                           sizeof(bluetooth_device_address_t)))
                        return TRUE;
        }
 
@@ -140,35 +124,33 @@ BT_EXPORT_API int bluetooth_gatt_set_service_change_watcher(
 {
        GSList *l;
        bluetooth_device_address_t *addr = NULL;
-       char device_address[BT_ADDRESS_STRING_SIZE] = { 0 };
        char secure_address[BT_ADDRESS_STRING_SIZE] = { 0 };
 
-       _bt_convert_addr_type_to_string(device_address,
-                       (unsigned char *)address->addr);
-       _bt_convert_addr_string_to_secure_string(secure_address,
-                       device_address);
+       _bt_convert_addr_type_to_secure_string(secure_address, (unsigned char *)address->addr);
        BT_INFO("Set watcher for %s with %d", secure_address, enable);
 
        if (enable == TRUE) {
-               if (service_monitor_list == NULL)
-                       _bt_register_manager_subscribe_signal(TRUE);
-
                if (_bluetooth_gatt_check_service_change_watcher_address(address)
                                == TRUE) {
                        BT_INFO("The watcher is already set");
                        return BLUETOOTH_ERROR_NONE;
                }
+
+               if (service_monitor_list == NULL) {
+                       _bt_register_manager_subscribe_signal(TRUE);
+               }
+
                addr = g_malloc0(sizeof(bluetooth_device_address_t));
                memcpy(addr, address, sizeof(bluetooth_device_address_t));
 
                service_monitor_list =
                        g_slist_append(service_monitor_list, addr);
        } else {
-
                for (l = service_monitor_list; l != NULL; l = l->next) {
                        addr = l->data;
+
                        if (!memcmp(address, addr,
-                                       sizeof(bluetooth_device_address_t))) {
+                                   sizeof(bluetooth_device_address_t))) {
                                service_monitor_list =
                                        g_slist_remove(service_monitor_list, addr);
                                g_free(addr);
index d591893..c4cc514 100644 (file)
@@ -280,14 +280,13 @@ void _bt_map_client_event_cb(int event, int result, void *param,
 void _bt_divide_device_class(bluetooth_device_class_t *device_class,
                                unsigned int cod);
 
-void _bt_convert_addr_string_to_type(unsigned char *addr,
-                                       const char *address);
+void _bt_convert_addr_string_to_type(unsigned char *addr, const char *address);
 
-void _bt_convert_addr_string_to_secure_string(char *addr,
-                                       const char *address);
+void _bt_convert_addr_string_to_secure_string(char *addr, const char *address);
 
-void _bt_convert_addr_type_to_string(char *address,
-                               unsigned char *addr);
+void _bt_convert_addr_type_to_string(char *address, unsigned char *addr);
+
+void _bt_convert_addr_type_to_secure_string(char *address, unsigned char *addr);
 
 const char *_bt_convert_error_to_string(int error);
 
@@ -366,8 +365,11 @@ void _bt_set_adapter_internal_status(gboolean enabled);
 
 int _bt_get_uuid_specification_name(const char *uuid, char **name);
 
+void _bt_convert_device_path_to_addr_type(const char *device_path,
+                                         unsigned char *addr);
+
 void _bt_convert_device_path_to_address(const char *device_path,
-                               char *device_address);
+                                       char *device_address);
 
 #ifdef TIZEN_FEATURE_BT_RFCOMM_DIRECT
 void _bt_rfcomm_server_free_all(void);