Add new API to notify that session is terminated
authorSeonah Moon <seonah1.moon@samsung.com>
Fri, 13 Mar 2020 05:35:59 +0000 (14:35 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Fri, 13 Mar 2020 05:35:59 +0000 (14:35 +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.c

index 89d5f5d..e9ca481 100644 (file)
@@ -97,6 +97,10 @@ typedef enum {
 } wifi_aware_error_e;
 
 typedef enum {
+       WIFI_AWARE_TERMINATION_REASON_UNKNOWN = 0,
+} wifi_aware_termination_reason_e;
+
+typedef enum {
        WIFI_AWARE_SESSION_PUBLISH = 0,
        WIFI_AWARE_SESSION_SUBSCRIBE,
 } wifi_aware_session_type_e;
@@ -403,6 +407,37 @@ int wifi_aware_session_create(wifi_aware_session_type_e session_type, wifi_aware
 int wifi_aware_session_destroy(wifi_aware_session_h session);
 
 /**
+ * @brief Callback to notify that the Wi-Fi Aware Session has been lost.
+ * @since_tizen 6.0
+ * @param[in] session
+ * @param[in] reason
+ * @param[in] user_data
+ */
+typedef(*wifi_aware_session_terminated_cb)(wifi_aware_session_h session,
+               wifi_aware_termination_reason_e reason, void *user_data);
+
+/**
+ * @brief
+ * @since_tizen 6.0
+ * @param[in] session
+ * @param[in] callback
+ * @param[in] user_data
+ * @return     0 on success, otherwise a negative error value
+ * @retval     #WIFI_AWARE_ERROR_NONE
+ */
+int wifi_aware_session_set_terminated_cb(wifi_aware_session_h session,
+               wifi_aware_session_terminated_cb callback, void *user_data);
+
+/**
+ * @brief
+ * @since_tizen 6.0
+ * @param[in] session
+ * @return     0 on success, otherwise a negative error value
+ * @retval     #WIFI_AWARE_ERROR_NONE
+ */
+int wifi_aware_session_unset_terminated_cb(wifi_aware_session_h session);
+
+/**
  * @brief This callback delivers the result of a Publish request.
  * @since_tizen 6.0
  * @param[in] session
@@ -600,10 +635,6 @@ typedef enum {
        WIFI_AWARE_SECURITY_TYPE_PMK,
 } wifi_aware_security_type_e;
 
-typedef enum {
-       WIFI_AWARE_TERMINATION_REASON_UNKNOWN = 0,
-} wifi_aware_termination_reason_e;
-
 /**
  * @brief Create a handle to be used for Wi-Fi Aware Data Path
  * @since_tizen 6.0
index 9676277..75e6974 100644 (file)
@@ -50,6 +50,7 @@ typedef enum {
        SERVICE_DISCOVERED_SIGNAL = 0,
        MESSAGE_RECEIVED_SIGNAL,
        DATA_PATH_OPEN_RESULT,
+       SESSION_TERMINATED_SIGNAL,
 } wifi_aware_signal_e;
 
 int wifi_aware_gdbus_init();
index bdbfd30..b4d4e6c 100644 (file)
@@ -47,6 +47,10 @@ bool _wifi_aware_session_is_publish_type(wifi_aware_session_h session_handle);
 bool _wifi_aware_session_is_subscribe_type(wifi_aware_session_h session_handle);
 int _wifi_aware_get_client_id();
 
+void _wifi_aware_session_set_terminated_cb(wifi_aware_session_h session,
+               wifi_aware_session_terminated_cb callback, void *user_data);
+void _wifi_aware_session_unset_terminated_cb(wifi_aware_session_h session);
+
 int _wifi_aware_publish_handle_create(wifi_aware_publish_h *publish);
 void _wifi_aware_publish_set_default_values(wifi_aware_publish_h publish);
 void _wifi_aware_publish_set_ttl(wifi_aware_publish_h publish, unsigned short ttl);
index 886b18e..2678ddc 100644 (file)
@@ -60,6 +60,11 @@ static struct {
                WIFI_AWARE_DISCOVERY_INTERFACE,
                "DataPathOpenResult",
        },
+       [SESSION_TERMINATED_SIGNAL] = {
+               WIFI_AWARE_DISCOVERY_INTERFACE,
+               "SessionTerminated",
+       },
+
 };
 
 guint wifi_aware_gdbus_register_signal(wifi_aware_signal_e signal,
index 11f2160..0f0c478 100644 (file)
@@ -84,6 +84,10 @@ typedef struct {
        wifi_aware_message_received_cb received_cb;
        void *received_cb_data;
        guint received_signal_id;
+
+       wifi_aware_session_terminated_cb terminated_cb;
+       void *terminated_cb_data;
+       guint terminated_signal_id;
 } wifi_aware_session_s;
 
 typedef struct {
@@ -280,6 +284,15 @@ static void __wifi_aware_received_cb(wifi_aware_session_h session, wifi_aware_pe
                                handle->received_cb_data);
 }
 
+static void __wifi_aware_session_terminated_cb(wifi_aware_session_h session, int reason)
+{
+       RET_IF(session == NULL, "Session is NULL");
+       wifi_aware_session_s *handle = (wifi_aware_session_s *)session;
+
+       if (handle->terminated_cb)
+               handle->terminated_cb(session, reason, handle->terminated_cb_data);
+}
+
 static wifi_aware_error_e __get_dbus_result(GObject *src, GAsyncResult *res, uint16_t *id)
 {
        GDBusConnection *conn = G_DBUS_CONNECTION(src);
@@ -528,6 +541,60 @@ void _wifi_aware_session_handle_destroy(wifi_aware_session_h session_handle)
        g_free(session_handle);
 }
 
+static void __parsing_session_terminated_event(GVariant *parameters, uint16_t *pub_sub_id, int reason)
+{
+       g_variant_get(parameters, "(qi)", pub_sub_id, reason);
+}
+
+static void __session_terminated_cb(GDBusConnection *connection,
+                   const gchar *sender, const gchar *object_path,
+                    const gchar *interface, const gchar *signal,
+                    GVariant *parameters, gpointer user_data)
+{
+       WIFI_AWARE_LOGD("session is terminated.");
+
+       uint16_t pub_sub_id;
+       int reason;
+       wifi_aware_session_h session = (wifi_aware_session_h)user_data;
+
+       __parsing_session_terminated_event(parameters, &pub_sub_id, &reason);
+
+       uint16_t session_pub_sub_id = _wifi_aware_session_get_pub_sub_id(session);
+       if (pub_sub_id != session_pub_sub_id) {
+               WIFI_AWARE_LOGE("Invalid PubSub Id (%u:%u)", session_pub_sub_id, pub_sub_id);
+               return;
+       }
+       __session_set_pub_sub_id(session, 0);
+       __wifi_aware_session_terminated_cb(session, (wifi_aware_termination_reason_e)reason);
+}
+
+void _wifi_aware_session_set_terminated_cb(wifi_aware_session_h session,
+               wifi_aware_session_terminated_cb callback, void *user_data)
+{
+       __WIFI_AWARE_FUNC_ENTER__;
+       RET_IF(session == NULL, "wifi_aware_session_h is NULL");
+
+       wifi_aware_session_s *handle = (wifi_aware_session_s *)session;
+       handle->terminated_cb = callback;
+       handle->terminated_cb_data = user_data;
+       handle->terminated_signal_id =
+               wifi_aware_gdbus_register_signal(SESSION_TERMINATED_SIGNAL,
+                               __session_terminated_cb, session);
+}
+
+void _wifi_aware_session_unset_terminated_cb(wifi_aware_session_h session)
+{
+       __WIFI_AWARE_FUNC_ENTER__;
+       RET_IF(session == NULL, "wifi_aware_session_h is NULL");
+
+       wifi_aware_session_s *handle = (wifi_aware_session_s *)session;
+       handle->terminated_cb = NULL;
+       handle->terminated_cb_data = NULL;
+       if (handle->terminated_signal_id > 0)
+               wifi_aware_gdbus_deregister_signal(handle->terminated_signal_id);
+       handle->terminated_signal_id = 0;
+}
+
 int _wifi_aware_publish_handle_create(wifi_aware_publish_h *publish)
 {
        wifi_aware_publish_request_s *req =
index 66f4e4b..3123919 100644 (file)
@@ -130,6 +130,31 @@ API int wifi_aware_session_destroy(wifi_aware_session_h session)
        return WIFI_AWARE_ERROR_NONE;
 }
 
+API int wifi_aware_session_set_terminated_cb(wifi_aware_session_h session,
+               wifi_aware_session_terminated_cb callback, void *user_data)
+{
+       __WIFI_AWARE_FUNC_ENTER__;
+       CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_WIFI_AWARE);
+       RET_VAL_IF(!_wifi_aware_is_initialized(), WIFI_AWARE_ERROR_NOT_INITIALIZED, "Not initialized");
+       RET_VAL_IF(session == NULL, WIFI_AWARE_ERROR_INVALID_PARAMETER, "wifi_aware_session_h is NULL");
+
+       _wifi_aware_session_set_terminated_cb(session, callback, user_data);
+
+       return WIFI_AWARE_ERROR_NONE;
+}
+
+API int wifi_aware_session_unset_terminated_cb(wifi_aware_session_h session)
+{
+       __WIFI_AWARE_FUNC_ENTER__;
+       CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_WIFI_AWARE);
+       RET_VAL_IF(!_wifi_aware_is_initialized(), WIFI_AWARE_ERROR_NOT_INITIALIZED, "Not initialized");
+       RET_VAL_IF(session == NULL, WIFI_AWARE_ERROR_INVALID_PARAMETER, "wifi_aware_session_h is NULL");
+
+       _wifi_aware_session_unset_terminated_cb(session);
+
+       return WIFI_AWARE_ERROR_NONE;
+}
+
 API int wifi_aware_publish_create(wifi_aware_publish_h *publish)
 {
        int ret = WIFI_AWARE_ERROR_NONE;