From: Cheoleun Moon Date: Tue, 28 Jan 2020 19:00:22 +0000 (+0900) Subject: Add cancel publish/subscribe X-Git-Tag: submit/tizen/20200403.050222~2^2~74^2~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d135ceaa581abbfa11905b3758fc2e23de48650c;p=platform%2Fcore%2Fapi%2Fwifi-aware.git Add cancel publish/subscribe --- diff --git a/include/wifi-aware.h b/include/wifi-aware.h index 63e48ea..aa0ee20 100644 --- a/include/wifi-aware.h +++ b/include/wifi-aware.h @@ -410,6 +410,17 @@ int wifi_aware_publish(wifi_aware_h wifi_aware, wifi_aware_published_cb callback, void *user_data); /** + * @brief Cancel a published Wi-Fi Aware service so that it cannot be found. + * @since_tizen 6.0 + * @param[in] wifi_aware + * @param[in] publish_id + * @return 0 on success, otherwise a negative error value + * @retval #WIFI_AWARE_ERROR_NONE + */ +int wifi_aware_cancel_publish(wifi_aware_h wifi_aware, + unsigned int publish_id); + +/** * @brief Update the configuration for a Wi-Fi Aware service that has already been published. * @since_tizen 6.0 * @param[in] wifi_aware @@ -440,7 +451,7 @@ typedef void(*wifi_aware_subscribed_cb)(wifi_aware_error_e error, unsigned int subscribe_id, void *user_data); /** - * @brief + * @brief Start to find Wi-Fi Aware services with configuration. * @since_tizen 6.0 * @param[in] wifi_aware * @param[in] config @@ -452,6 +463,16 @@ typedef void(*wifi_aware_subscribed_cb)(wifi_aware_error_e error, int wifi_aware_subscribe(wifi_aware_h wifi_aware, wifi_aware_subscribe_config_h config, wifi_aware_subscribed_cb callback, void *user_data); +/** + * @brief Stop finding Wi-Fi Aware services. + * @since_tizen 6.0 + * @param[in] wifi_aware + * @param[in] subscribe_id + * @return 0 on success, otherwise a negative error value + * @retval #WIFI_AWARE_ERROR_NONE + */ +int wifi_aware_cancel_subscribe(wifi_aware_h wifi_aware, + unsigned int subscribe_id); /** * @brief diff --git a/src/include/wifi-aware-gdbus.h b/src/include/wifi-aware-gdbus.h index 785e537..21e424b 100644 --- a/src/include/wifi-aware-gdbus.h +++ b/src/include/wifi-aware-gdbus.h @@ -53,8 +53,12 @@ int wifi_aware_gdbus_enable(wifi_aware_h wifi_aware, wifi_aware_enable_request_s *req, GAsyncReadyCallback cb); int wifi_aware_gdbus_publish(wifi_aware_h wifi_aware, int client_id, wifi_aware_publish_request_s *req, GAsyncReadyCallback cb); +int wifi_aware_gdbus_cancel_publish(wifi_aware_h wifi_aware, int client_id, + unsigned int pub_id); int wifi_aware_gdbus_subscribe(wifi_aware_h wifi_aware, int client_id, wifi_aware_subscribe_request_s *req, GAsyncReadyCallback cb); +int wifi_aware_gdbus_cancel_subscribe(wifi_aware_h wifi_aware, int client_id, + unsigned int sub_id); #ifdef __cplusplus } #endif diff --git a/src/include/wifi-aware-private.h b/src/include/wifi-aware-private.h index 0c070d6..b832e65 100644 --- a/src/include/wifi-aware-private.h +++ b/src/include/wifi-aware-private.h @@ -44,8 +44,10 @@ void _add_subscribed_callback(wifi_aware_h wifi_aware, int _wifi_aware_enable_request(wifi_aware_h wifi_aware); int _wifi_aware_publish_request(wifi_aware_h wifi_aware, wifi_aware_publish_config_h config); +int _wifi_aware_cancel_publish_request(wifi_aware_h wifi_aware, unsigned int pub_id); int _wifi_aware_subscribe_request(wifi_aware_h wifi_aware, wifi_aware_subscribe_config_h config); +int _wifi_aware_cancel_subscribe_request(wifi_aware_h wifi_aware, unsigned int sub_id); void _set_discovery_result_cb(wifi_aware_h wifi_aware, wifi_aware_discovery_result_cb callback, void *user_data); diff --git a/src/wifi-aware-gdbus.c b/src/wifi-aware-gdbus.c index d0dc72d..fdc19f2 100644 --- a/src/wifi-aware-gdbus.c +++ b/src/wifi-aware-gdbus.c @@ -63,28 +63,6 @@ static struct { } }; -static int __wifi_aware_error_string_to_enum(const char *error) -{ - /* - if (NULL != strstr(error, "NoReply")) - return WIFI_AWARE_ERROR_COMMUNICATION_FAILED; - else if (NULL != strstr(error, "PermissionDenied")) - return WIFI_AWARE_ERROR_PERMISSION_DENIED; - else if (NULL != strstr(error, "MEM_ERR")) - return WIFI_AWARE_ERROR_OUT_OF_MEMORY; - else if (NULL != strstr(error, "INVALID_PARAM")) - return WIFI_AWARE_ERROR_INVALID_PARAMETER; - else if (NULL != strstr(error, "OPER_FAILED")) - return WIFI_AWARE_ERROR_OPERATION_FAILED; - else if (NULL != strstr(error, "NO_SERVICE")) - return WIFI_AWARE_ERROR_SERVICE_NOT_FOUND; - else if (NULL != strstr(error, "NO_SESSION")) - return WIFI_AWARE_ERROR_SESSION_NOT_FOUND; - else - */ - return WIFI_AWARE_ERROR_OPERATION_FAILED; -} - static void __gdbus_signal_cb(GDBusConnection *connection, const gchar *sender, const gchar *object_path, const gchar *interface, const gchar *signal, @@ -194,6 +172,41 @@ static int __wifi_aware_dbus_method_call_async(const char *interface_name, } +static int __wifi_aware_dbus_method_call_sync(const char *interface_name, + const char *object_path, + const char *method, GVariant *params, GVariant **reply) +{ + GError *error = NULL; + + if (gdbus_data.connection == NULL) { + WIFI_AWARE_LOGE("GDBusconnection is NULL"); + return WIFI_AWARE_ERROR_OPERATION_FAILED; + } + + *reply = g_dbus_connection_call_sync(gdbus_data.connection, + WIFI_AWARE_INTERFACE, + object_path, + interface_name, + method, + params, + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + + if (*reply == NULL) { + if (error == NULL) + WIFI_AWARE_LOGE("g_dbus_connection_call_sync failed: unknown error"); + else + WIFI_AWARE_LOGE("g_dbus_connection_call_sync failed: [%d:%s]", + error->code, error->message); + + return WIFI_AWARE_ERROR_OPERATION_FAILED; + } + return WIFI_AWARE_ERROR_NONE; +} + static void __print_enable_request(wifi_aware_enable_request_s *req) { WIFI_AWARE_LOGI("master_pref: %x\n", req->master_pref); @@ -249,6 +262,11 @@ static GVariant *__create_publish_request_param(int client_id, wifi_aware_publis return params; } +static GVariant *__create_cancel_publish_request_param(int client_id, unsigned int pub_id) +{ + return g_variant_new("(iu)", client_id, pub_id); +} + static GVariant *__create_subscribe_request_param(int client_id, wifi_aware_subscribe_request_s *req) { GVariantBuilder *builder = NULL; @@ -270,6 +288,11 @@ static GVariant *__create_subscribe_request_param(int client_id, wifi_aware_subs return params; } +static GVariant *__create_cancel_subscribe_request_param(int client_id, unsigned int sub_id) +{ + return g_variant_new("(iu)", client_id, sub_id); +} + int wifi_aware_gdbus_enable(wifi_aware_h wifi_aware, wifi_aware_enable_request_s *req, GAsyncReadyCallback cb) { @@ -312,11 +335,43 @@ int wifi_aware_gdbus_publish(wifi_aware_h wifi_aware, int client_id, WIFI_AWARE_DISCOVERY_INTERFACE, WIFI_AWARE_DISCOVERY_PATH, "Publish", params, cb, wifi_aware); - if (ret != WIFI_AWARE_ERROR_NONE) { - WIFI_AWARE_LOGE("wifi_aware_dbus_method_call_async() failed"); - __WIFI_AWARE_FUNC_EXIT__; - return ret; - } + + RET_VAL_IF(ret != WIFI_AWARE_ERROR_NONE, ret, "Publish failed"); + + __WIFI_AWARE_FUNC_EXIT__; + return ret; +} + +static int __handle_cancel_publish_reply(GVariant *reply) +{ + __WIFI_AWARE_FUNC_ENTER__; + int error; + g_variant_get(reply, "(i)", &error); + WIFI_AWARE_LOGI("Reply for CancelPublish %d", error); + return error; +} + +int wifi_aware_gdbus_cancel_publish(wifi_aware_h wifi_aware, int client_id, + unsigned int pub_id) +{ + __WIFI_AWARE_FUNC_ENTER__; + GVariant *params = NULL; + GVariant *reply = NULL; + int ret = WIFI_AWARE_ERROR_NONE; + + params = __create_cancel_publish_request_param(client_id, pub_id); + DBUS_DEBUG_VARIANT(params); + + ret = __wifi_aware_dbus_method_call_sync( + WIFI_AWARE_DISCOVERY_INTERFACE, + WIFI_AWARE_DISCOVERY_PATH, + "CancelPublish", + params, &reply); + + RET_VAL_IF(ret != WIFI_AWARE_ERROR_NONE, ret, "CancelPublish failed"); + + ret = __handle_cancel_publish_reply(reply); + g_variant_unref(reply); __WIFI_AWARE_FUNC_EXIT__; return ret; @@ -336,11 +391,43 @@ int wifi_aware_gdbus_subscribe(wifi_aware_h wifi_aware, int client_id, WIFI_AWARE_DISCOVERY_INTERFACE, WIFI_AWARE_DISCOVERY_PATH, "Subscribe", params, cb, wifi_aware); - if (ret != WIFI_AWARE_ERROR_NONE) { - WIFI_AWARE_LOGE("wifi_aware_dbus_method_call_async() failed"); - __WIFI_AWARE_FUNC_EXIT__; - return ret; - } + + RET_VAL_IF(ret != WIFI_AWARE_ERROR_NONE, ret, "Subscribe failed"); + + __WIFI_AWARE_FUNC_EXIT__; + return ret; +} + +static int __handle_cancel_subscribe_reply(GVariant *reply) +{ + __WIFI_AWARE_FUNC_ENTER__; + int error; + g_variant_get(reply, "(i)", &error); + WIFI_AWARE_LOGI("Reply for CancelSubscribe %d", error); + return error; +} + +int wifi_aware_gdbus_cancel_subscribe(wifi_aware_h wifi_aware, int client_id, + unsigned int sub_id) +{ + __WIFI_AWARE_FUNC_ENTER__; + GVariant *params = NULL; + GVariant *reply = NULL; + int ret = WIFI_AWARE_ERROR_NONE; + + params = __create_cancel_subscribe_request_param(client_id, sub_id); + DBUS_DEBUG_VARIANT(params); + + ret = __wifi_aware_dbus_method_call_sync( + WIFI_AWARE_DISCOVERY_INTERFACE, + WIFI_AWARE_DISCOVERY_PATH, + "CancelSubscribe", + params, &reply); + + RET_VAL_IF(ret != WIFI_AWARE_ERROR_NONE, ret, "CancelSubscribe failed"); + + ret = __handle_cancel_subscribe_reply(reply); + g_variant_unref(reply); __WIFI_AWARE_FUNC_EXIT__; return ret; diff --git a/src/wifi-aware-private.c b/src/wifi-aware-private.c index 9747ce8..eb4a00a 100644 --- a/src/wifi-aware-private.c +++ b/src/wifi-aware-private.c @@ -328,6 +328,13 @@ int _wifi_aware_publish_request(wifi_aware_h wifi_aware, req, __publish_request_reply); } +int _wifi_aware_cancel_publish_request(wifi_aware_h wifi_aware, + unsigned int pub_id) +{ + wifi_aware_s *aware = (wifi_aware_s *)wifi_aware; + return wifi_aware_gdbus_cancel_publish(wifi_aware, aware->client_id, pub_id); +} + int _wifi_aware_subscribe_request(wifi_aware_h wifi_aware, wifi_aware_subscribe_config_h config) { @@ -337,10 +344,18 @@ int _wifi_aware_subscribe_request(wifi_aware_h wifi_aware, req, __subscribe_request_reply); } +int _wifi_aware_cancel_subscribe_request(wifi_aware_h wifi_aware, + unsigned int sub_id) +{ + wifi_aware_s *aware = (wifi_aware_s *)wifi_aware; + return wifi_aware_gdbus_cancel_subscribe(wifi_aware, aware->client_id, sub_id); +} + void _set_discovery_result_cb(wifi_aware_h wifi_aware, wifi_aware_discovery_result_cb callback, void *user_data) { __WIFI_AWARE_FUNC_ENTER__; + wifi_aware_s *aware = (wifi_aware_s *)wifi_aware; aware->discovered_cb = callback; @@ -409,9 +424,7 @@ void _service_discovered(GDBusConnection *connection, for (list = __wifi_aware_handle_list; list; list = list->next) { wifi_aware_s *aware = (wifi_aware_s *)list; if (aware->discovered_cb) - aware->discovered_cb(sub_id, peer, - specific_info, specific_info_len, - match_filters, match_filters_len, - aware->discovered_cb_data); + aware->discovered_cb(sub_id, peer, specific_info, specific_info_len, + match_filters, match_filters_len, aware->discovered_cb_data); } } diff --git a/src/wifi-aware-publish.c b/src/wifi-aware-publish.c index 157adc1..4dcc258 100644 --- a/src/wifi-aware-publish.c +++ b/src/wifi-aware-publish.c @@ -201,6 +201,22 @@ API int wifi_aware_publish(wifi_aware_h wifi_aware, return WIFI_AWARE_ERROR_NONE; } +API int wifi_aware_cancel_publish(wifi_aware_h wifi_aware, + unsigned int publish_id) +{ + __WIFI_AWARE_FUNC_ENTER__; + int ret = WIFI_AWARE_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_WIFI_AWARE); + RET_ERR_IF_HANDLE_IS_NOT_VALID_OR_NOT_INITIALIZED(wifi_aware); + + ret = _wifi_aware_cancel_publish_request(wifi_aware, publish_id); + RET_VAL_IF(ret != WIFI_AWARE_ERROR_NONE, ret, "_wifi_aware_cancel_publish_request"); + + __WIFI_AWARE_FUNC_EXIT__; + return WIFI_AWARE_ERROR_NONE; +} + API int wifi_aware_update_publish(wifi_aware_h wifi_aware, unsigned int publish_id, wifi_aware_publish_config_h config, diff --git a/src/wifi-aware-subscribe.c b/src/wifi-aware-subscribe.c index b3b023a..0c6c312 100644 --- a/src/wifi-aware-subscribe.c +++ b/src/wifi-aware-subscribe.c @@ -190,6 +190,22 @@ API int wifi_aware_subscribe(wifi_aware_h wifi_aware, return WIFI_AWARE_ERROR_NONE; } +API int wifi_aware_cancel_subscribe(wifi_aware_h wifi_aware, + unsigned int subscribe_id) +{ + __WIFI_AWARE_FUNC_ENTER__; + int ret = WIFI_AWARE_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_WIFI_AWARE); + RET_ERR_IF_HANDLE_IS_NOT_VALID_OR_NOT_INITIALIZED(wifi_aware); + + ret = _wifi_aware_cancel_subscribe_request(wifi_aware, subscribe_id); + RET_VAL_IF(ret != WIFI_AWARE_ERROR_NONE, ret, "_wifi_aware_cancel_subscribe_request"); + + __WIFI_AWARE_FUNC_EXIT__; + return WIFI_AWARE_ERROR_NONE; +} + API int wifi_aware_set_discovery_result_cb(wifi_aware_h wifi_aware, wifi_aware_discovery_result_cb callback, void *user_data) { diff --git a/test/wifi-aware-test.c b/test/wifi-aware-test.c index 5f3deac..ee6c87b 100644 --- a/test/wifi-aware-test.c +++ b/test/wifi-aware-test.c @@ -101,7 +101,9 @@ enum { CMD_ENABLE, CMD_PUBLISH, + CMD_CANCEL_PUBLISH, CMD_SUBSCRIBE, + CMD_CANCEL_SUBSCRIBE, CMD_INVALID, }; @@ -124,14 +126,20 @@ static char *g_menu_str[] = { = "ENABLE", [CMD_PUBLISH] = "PUBLISH", + [CMD_CANCEL_PUBLISH] + = "CANCEL PUBLISH", [CMD_SUBSCRIBE] = "SUBSCRIBE", + [CMD_CANCEL_SUBSCRIBE] + = "CANCEL SUBSCRIBE", [CMD_INVALID] = NULL, }; static GMainLoop *g_main_loop_p; static wifi_aware_h g_wifi_aware_handle; +static unsigned int g_pub_id; +static unsigned int g_sub_id; /***************************************************************************** * Local Functions Definition @@ -323,6 +331,7 @@ void test_enable() static void __published_cb(wifi_aware_error_e error, unsigned int publish_id, void *user_data) { + g_pub_id = publish_id; if (error == WIFI_AWARE_ERROR_NONE) printf("Publish Request is success. Publish ID: %u\n", publish_id); else @@ -383,8 +392,26 @@ void test_publish() __print_result(ret, "wifi_aware_publish_config_destroy"); } +void test_cancel_publish() +{ + int ret = 0; + + RET_IF_LOOP_IS_NULL(); + RET_IF_HANDLE_IS_NULL(); + + if (g_pub_id < 1) { + printf("publish should be done\n"); + return; + } + + ret = wifi_aware_cancel_publish(g_wifi_aware_handle, g_pub_id); + __print_result(ret, "wifi_aware_cancel_publish"); +} + static void __subscribed_cb(wifi_aware_error_e error, unsigned int subscribe_id, void *user_data) { + g_sub_id = subscribe_id; + if (error == WIFI_AWARE_ERROR_NONE) printf("Subscribe Request is success. Subscirbe ID: %u\n", subscribe_id); else @@ -460,6 +487,22 @@ void test_subscribe() __print_result(ret, "wifi_aware_subscribe_config_destroy"); } +void test_cancel_subscribe() +{ + int ret = 0; + + RET_IF_LOOP_IS_NULL(); + RET_IF_HANDLE_IS_NULL(); + + if (g_sub_id < 1) { + printf("subscribe should be done\n"); + return; + } + + ret = wifi_aware_cancel_subscribe(g_wifi_aware_handle, g_sub_id); + __print_result(ret, "wifi_aware_cancel_subscribe"); +} + typedef void (*test_func)(void); test_func g_menu_func[] = { [CMD_QUIT] = test_quit, @@ -468,7 +511,9 @@ test_func g_menu_func[] = { [CMD_DEINITIALIZE] = test_deinit, [CMD_ENABLE] = test_enable, [CMD_PUBLISH] = test_publish, + [CMD_CANCEL_PUBLISH] = test_cancel_publish, [CMD_SUBSCRIBE] = test_subscribe, + [CMD_CANCEL_SUBSCRIBE] = test_cancel_subscribe, [CMD_INVALID] = NULL, };