CAPI/Device: Implement bt_device_start_service_search() 07/19307/3
authorWu Jiangbo <jiangbox.wu@intel.com>
Mon, 14 Apr 2014 07:11:39 +0000 (15:11 +0800)
committerWu Jiangbo <jiangbox.wu@intel.com>
Mon, 14 Apr 2014 07:11:39 +0000 (15:11 +0800)
Change-Id: Ic7c7de36578fdd3394fdcf3f6012d3bf2f93c446
Signed-off-by: Wu Jiangbo <jiangbox.wu@intel.com>
capi/bluetooth.c
test/bluez-capi-test.c

index 554454d..95b52bf 100644 (file)
@@ -1675,6 +1675,109 @@ int bt_device_set_authorization(const char *remote_address,
        return BT_SUCCESS;
 }
 
+static bt_device_sdp_info_s *get_device_sdp_info(bluez_device_t *device)
+{
+       bt_device_sdp_info_s *sdp_info;
+       char *address;
+       char **uuids;
+       guint len;
+
+       sdp_info = g_new0(bt_device_sdp_info_s, 1);
+       if (sdp_info == NULL) {
+               ERROR("no memeory");
+               return NULL;
+       }
+
+       address = bluez_device_get_property_address(device);
+       uuids = bluez_device_get_property_uuids(device);
+
+       len = g_strv_length(uuids);
+
+       sdp_info->remote_address = address;
+       sdp_info->service_uuid = uuids;
+       sdp_info->service_count = len;
+
+       return sdp_info;
+}
+
+static void free_device_sdp_info(bt_device_sdp_info_s *sdp_info)
+{
+       gsize i;
+
+       if (sdp_info == NULL)
+               return;
+
+       g_free(sdp_info->remote_address);
+       for (i = 0; i < sdp_info->service_count; ++i)
+               g_free(sdp_info->service_uuid[i]);
+
+       g_free(sdp_info->service_uuid);
+       g_free(sdp_info);
+}
+
+int bt_device_start_service_search(const char *remote_address)
+{
+       bluez_device_t *device = NULL;
+       bt_device_sdp_info_s *sdp_info;
+       int powered, paired;
+       char *address;
+       GList *list, *iter, *next;
+
+       if (initialized == false)
+               return BT_ERROR_NOT_INITIALIZED;
+
+       if (default_adapter == NULL)
+               return BT_ERROR_ADAPTER_NOT_FOUND;
+
+       if (!remote_address)
+               return BT_ERROR_INVALID_PARAMETER;
+
+       bluez_adapter_get_property_powered(default_adapter, &powered);
+       if (powered == FALSE)
+               return BT_ERROR_NOT_ENABLED;
+
+       if (!device_service_search_node)
+               return BT_SUCCESS;
+
+       list = bluez_adapter_get_devices(default_adapter);
+       for (iter = g_list_first(list); iter; iter = next) {
+               bluez_device_t *dev;
+               dev = iter->data;
+
+               next = g_list_next(iter);
+
+               if (dev == NULL)
+                       continue;
+
+               address = bluez_device_get_property_address(dev);
+               if (!g_strcmp0(remote_address, address)) {
+                       device = dev;
+                       g_free(address);
+                       break;
+               }
+
+               g_free(address);
+       }
+
+       g_list_free(list);
+
+       if (device == NULL)
+               return BT_ERROR_SERVICE_SEARCH_FAILED;
+
+       bluez_device_get_property_paired(device, &paired);
+       if (paired == FALSE)
+               return BT_ERROR_REMOTE_DEVICE_NOT_BONDED;
+
+       sdp_info = get_device_sdp_info(device);
+
+       device_service_search_node->cb(BT_SUCCESS, sdp_info,
+                               device_service_search_node->user_data);
+
+       free_device_sdp_info(sdp_info);
+
+       return BT_SUCCESS;
+}
+
 int bt_device_set_bond_created_cb(bt_device_bond_created_cb callback,
                                                        void *user_data)
 {
index b48680d..d3a637f 100644 (file)
@@ -688,6 +688,8 @@ static void print_bonded_device_info(bt_device_info_s *device_info)
        for (len = 0; len < device_info->service_count; len++)
                printf("\n\t\t service %d: %s", len,
                                        device_info->service_uuid[len]);
+
+       printf("\n");
 }
 
 bool bonded_devices(bt_device_info_s *device_info, void *user_data)
@@ -746,6 +748,24 @@ static int device_destroy_bond(const char *p1, const char *p2)
        return 0;
 }
 
+static int device_service_search(const char *p1, const char *p2)
+{
+       int err;
+
+       if (p1 == NULL) {
+               ERROR("Search device service must give the device address");
+               return 0;
+       }
+
+       err = bt_device_start_service_search(p1);
+       if (err != BT_SUCCESS) {
+               ERROR("bt_device_start_service_search error: %d", err);
+               return 0;
+       }
+
+       return 0;
+}
+
 static void device_bond_created_cb(int result,
                                        bt_device_info_s *device_info,
                                        void *user_data)
@@ -1708,6 +1728,9 @@ struct {
        {"device_destroy_bond", device_destroy_bond,
                "Usage: device_destroy_bond 70:F9:27:64:DF:65\n\tUnPair the specfic device"},
 
+       {"device_service_search", device_service_search,
+               "Usage: device_service_search 70:F9:27:64:DF:65\n\tSearch device service"},
+
        {"device_set_bond_created_cb", device_set_bond_created_cb,
                "Usage: device_set_bond_created_cb\n\tSet Device bond state changed callback"},