Implement dnssd_cancel_resolve_service() 37/281937/3
authorSeonah Moon <seonah1.moon@samsung.com>
Mon, 26 Sep 2022 07:27:48 +0000 (16:27 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Mon, 26 Sep 2022 07:27:50 +0000 (16:27 +0900)
Change-Id: I7c2efec8cb47415a3cc9c5219ac8defed637cf1c

src/dns-sd/dns-sd.c
tests/dns-sd-internal-test.c

index a393e7a5439c3eedc2661b3ab0645d9f2662236b..71c5eff76a0e7ac499f68327344b551f18e67956 100644 (file)
@@ -1769,9 +1769,20 @@ EXPORT_API int dnssd_resolve_service(dnssd_service_h service,
        return res;
 }
 
-EXPORT_API int dnssd_cancel_resolve_service(dnssd_service_h service)
+static void __dnssd_destroy_found_service(dnssd_handle_s *found_handle, dnssd_found_data_s *found_data)
 {
-       return DNSSD_ERROR_NONE;
+       dnssd_handle_list = g_slist_remove(dnssd_handle_list, found_handle);
+
+       if (found_handle->watch_id > 0)
+               __remove_service_getaddrinfo_socket(found_handle);
+
+       g_free(found_handle->service_type);
+       g_free(found_data->service_name);
+       g_free(found_data->host);
+       g_free(found_data->txt_record);
+       g_free(found_data->ip_v4_addr);
+       g_free(found_data->ip_v6_addr);
+       g_free(found_handle);
 }
 
 static void __dnssd_remove_found_service(gpointer data, gpointer user_data)
@@ -1791,20 +1802,7 @@ static void __dnssd_remove_found_service(gpointer data, gpointer user_data)
        if (found_data->browse_handler != *handler)
                return;
 
-       DNSSD_LOGD("handle [0x%x]", found_handle->service_handler);
-       dnssd_handle_list = g_slist_remove(dnssd_handle_list,
-                       found_handle);
-
-       if (found_handle->watch_id > 0)
-               __remove_service_getaddrinfo_socket(found_handle);
-
-       g_free(found_handle->service_type);
-       g_free(found_data->service_name);
-       g_free(found_data->host);
-       g_free(found_data->txt_record);
-       g_free(found_data->ip_v4_addr);
-       g_free(found_data->ip_v6_addr);
-       g_free(found_handle);
+       __dnssd_destroy_found_service(found_handle, found_data);
 
        __DNSSD_LOG_FUNC_EXIT__;
        return;
@@ -1816,6 +1814,7 @@ static void __destroy_resolve_data(dnssd_handle_s *browsing_handle,
        if (resolve_data->dnssd_handle != browsing_handle)
                return;
 
+       DNSSD_LOGD("Remove [%p] from resolve_handle_list", resolve_data);
        resolve_handle_list = g_slist_remove(resolve_handle_list,
                        resolve_data);
        if (resolve_data->watch_id > 0)
@@ -1825,20 +1824,57 @@ static void __destroy_resolve_data(dnssd_handle_s *browsing_handle,
        g_free(resolve_data);
 }
 
-static void __remove_related_handles(dnssd_handle_s *browsing_handle)
+static void __destroy_related_resolve_data(dnssd_handle_s *dnssd_handle)
 {
-       GSList *list;
+       GSList *list = resolve_handle_list;
+       while (list) {
+               __destroy_resolve_data(dnssd_handle, (resolve_reply_data *)list->data);
+               list = list->next;
+       }
+}
 
+static void __remove_related_handles(dnssd_handle_s *browsing_handle)
+{
        g_slist_foreach(dnssd_handle_list, (GFunc)__dnssd_remove_found_service,
                        &(browsing_handle->service_handler));
+       __destroy_related_resolve_data(browsing_handle);
+       return;
+}
 
-       list = resolve_handle_list;
-       while (list) {
-               __destroy_resolve_data(browsing_handle, (resolve_reply_data *)list->data);
-               list = list->next;
+static void __remove_resolving_related_handles(dnssd_handle_s *remote_handle)
+{
+       __dnssd_destroy_found_service(remote_handle, GET_FOUND_DATA_P(remote_handle));
+       __destroy_related_resolve_data(remote_handle);
+}
+
+EXPORT_API int dnssd_cancel_resolve_service(dnssd_service_h service)
+{
+       __DNSSD_LOG_FUNC_ENTER__;
+       dnssd_handle_s *local_handle = NULL;
+       int res = DNSSD_ERROR_NONE;
+
+       CHECK_FEATURE_SUPPORTED(NETWORK_SERVICE_DISCOVERY_FEATURE);
+       DNSSD_LOCK;
+
+       res = __get_valid_handle(service, &local_handle);
+       if (res != DNSSD_ERROR_NONE) {
+               DNSSD_UNLOCK;
+               return res;
        }
 
-       return;
+       if (local_handle->op_type != DNSSD_TYPE_FOUND_NOT_RESOLVED
+                       && local_handle->op_type != DNSSD_TYPE_FOUND) {
+               DNSSD_LOGE("Invalid op type. %d", local_handle->op_type);
+               DNSSD_UNLOCK;
+               return DNSSD_ERROR_SERVICE_NOT_FOUND;
+       }
+
+       __remove_resolving_related_handles(local_handle);
+
+       DNSSD_UNLOCK;
+       __DNSSD_LOG_FUNC_EXIT__;
+
+       return DNSSD_ERROR_NONE;
 }
 
 EXPORT_API int dnssd_stop_browsing_service(dnssd_browser_h dnssd_service)
index 5517aa208e3978d15fadfea708f1b7b44dc0f4d8..fcbe38c7b152589bfdcbc5322b9292549adaa1dc 100644 (file)
@@ -289,6 +289,26 @@ int test_dnssd_resolve_service()
        return 1;
 }
 
+int test_dnssd_cancel_resolve_service()
+{
+       dnssd_service_h service = 0;
+       int rv;
+
+       printf("Cancel Resolving Remote Service\n");
+       printf("Enter Remote Service Handler:\n");
+       rv = scanf("%u", &service);
+
+       rv = dnssd_cancel_resolve_service(service);
+       if (rv != DNSSD_ERROR_NONE) {
+               printf("Failed to cancel resolving service, error [%s]\n",
+                               dnssd_error_to_string(rv));
+               return 0;
+       }
+       printf("Successfully cancel resolving service\n");
+
+       return 1;
+}
+
 static void MenuScreen()
 {
        printf("_____________________________________\n");
@@ -340,6 +360,9 @@ int test_thread(GIOChannel *source, GIOCondition condition, gpointer data)
        case '5':
                rv = test_dnssd_resolve_service();
                break;
+       case '6':
+               rv = test_dnssd_cancel_resolve_service();
+               break;
        }
 
        if (rv == 1)