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)
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;
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)
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)
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");
case '5':
rv = test_dnssd_resolve_service();
break;
+ case '6':
+ rv = test_dnssd_cancel_resolve_service();
+ break;
}
if (rv == 1)