Add cancel publish/subscribe
authorCheoleun Moon <chleun.moon@samsung.com>
Tue, 28 Jan 2020 19:00:22 +0000 (04:00 +0900)
committerCheoleun Moon <chleun.moon@samsung.com>
Tue, 28 Jan 2020 19:00:22 +0000 (04:00 +0900)
include/wifi-aware.h
src/include/wifi-aware-gdbus.h
src/include/wifi-aware-private.h
src/wifi-aware-gdbus.c
src/wifi-aware-private.c
src/wifi-aware-publish.c
src/wifi-aware-subscribe.c
test/wifi-aware-test.c

index 63e48ea..aa0ee20 100644 (file)
@@ -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
index 785e537..21e424b 100644 (file)
@@ -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
index 0c070d6..b832e65 100644 (file)
@@ -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);
index d0dc72d..fdc19f2 100644 (file)
@@ -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;
index 9747ce8..eb4a00a 100644 (file)
@@ -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);
        }
 }
index 157adc1..4dcc258 100644 (file)
@@ -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,
index b3b023a..0c6c312 100644 (file)
@@ -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)
 {
index 5f3deac..ee6c87b 100644 (file)
@@ -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,
 };