[wifi-direct-manager] Added patch to handle on demand call for wfd-manager 66/84966/14 accepted/tizen/common/20160831.161655 accepted/tizen/ivi/20160831.080223 accepted/tizen/ivi/20160901.065435 accepted/tizen/mobile/20160831.080100 accepted/tizen/mobile/20160901.065426 accepted/tizen/tv/20160831.080126 accepted/tizen/tv/20160901.065428 accepted/tizen/wearable/20160831.080153 accepted/tizen/wearable/20160901.065432 submit/tizen/20160831.022854 submit/tizen/20160901.012832
authorMilind Ramesh Murhekar <m.murhekar@samsung.com>
Tue, 23 Aug 2016 04:57:18 +0000 (10:27 +0530)
committerMilind Ramesh Murhekar <m.murhekar@samsung.com>
Tue, 30 Aug 2016 13:13:41 +0000 (18:43 +0530)
Description: This patch handles demand on call for Dbus services
from wfd-manager for the application, and will terminate
if no application is using the services and state is deactivated

wfd-manager records the sender id on wifi_direct_initialise() call

Change-Id: Ia74c1e457e452fbfe05ce858e7d875fa4527a142
Signed-off-by: Milind Ramesh Murhekar <m.murhekar@samsung.com>
CMakeLists.txt
include/wifi-direct-dbus.h
include/wifi-direct-manager.h
packaging/wifi-direct-manager.spec
src/wifi-direct-dbus.c
src/wifi-direct-event.c
src/wifi-direct-iface.c
src/wifi-direct-manager.c

index bf97c0c..5cc0a3d 100644 (file)
@@ -84,6 +84,10 @@ IF(TIZEN_ENABLE_PRD)
        ADD_DEFINITIONS(-DTIZEN_ENABLE_PRD)
 ENDIF(TIZEN_ENABLE_PRD)
 
+IF(TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND)
+       ADD_DEFINITIONS(-DTIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND)
+ENDIF(TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND)
+
 SET(SRCS
        ${CMAKE_SOURCE_DIR}/src/wifi-direct-manager.c
        ${CMAKE_SOURCE_DIR}/src/wifi-direct-state.c
index 4fdcd23..48e0593 100644 (file)
@@ -41,6 +41,11 @@ extern "C" {
 #define WFD_MANAGER_CONFIG_INTERFACE            WFD_MANAGER_SERVICE ".config"
 #define WFD_MANAGER_SERVICE_INTERFACE           WFD_MANAGER_SERVICE ".service"
 #define WFD_MANAGER_DISPLAY_INTERFACE           WFD_MANAGER_SERVICE ".display"
+#ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
+#define DBUS_SERVICE                            "org.freedesktop.DBus"
+#define DBUS_INTERFACE                          "org.freedesktop.DBus"
+#define DBUS_PATH                               "/org/freedesktop/DBus"
+#endif /* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
 #if defined(TIZEN_FEATURE_ASP)
 #define WFD_MANAGER_ASP_INTERFACE               WFD_MANAGER_SERVICE ".asp"
 #endif
@@ -74,7 +79,9 @@ gboolean wfd_manager_dbus_emit_signal(const gchar *interface_name,
                                      GVariant *parameters);
 
 GVariant* wfd_manager_dbus_pack_ay(const unsigned char *src, int size);
-
+#ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
+void wfd_manager_dbus_unregister_nameowner_signal(void);
+#endif /* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
 #ifdef __cplusplus
 }
 #endif
index acb4057..c528182 100644 (file)
@@ -184,6 +184,11 @@ typedef struct {
 
        wifi_direct_state_e state;
 
+#ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
+       unsigned int exit_timer;
+       int client_count;
+       GSList *client_list;
+#endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
        wfd_device_s *local;
        int go_intent;
        int req_wps_mode;
@@ -257,5 +262,12 @@ wfd_device_s *wfd_manager_get_connected_peer_by_addr(wfd_manager_s *manager, uns
 int wfd_manager_asp_connect_session(wfd_manager_s *manager, void *params);
 int wfd_manager_asp_confirm_session(wfd_manager_s *manager, void *params, int confirmed);
 #endif /* TIZEN_FEATURE_ASP */
+#ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
+void wfd_manager_free_active_client_list(void);
+void wfd_manager_add_active_client(const char *client_id);
+void wfd_manager_remove_active_client(const char *name,
+                                                const gchar *old_owner,
+                                                const char *new_owner);
+#endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
 
 #endif /* __WIFI_DIRECT_MANAGER_H__ */
index 5c87766..34e9308 100644 (file)
@@ -85,6 +85,7 @@ cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DARCHITECTURE=$ARCH \
        -DTIZEN_TETHERING_ENABLE=0 \
 %endif
 %if "%{profile}" == "common"
+        -DTIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND=1 \
         -DTIZEN_FEATURE_SERVICE_DISCOVERY=1 \
         -DTIZEN_WLAN_CONCURRENT_ENABLE=1 \
         -DTIZEN_FEATURE_WIFI_DISPLAY=1 \
@@ -101,6 +102,7 @@ cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DARCHITECTURE=$ARCH \
 %if "%{?tizen_target_name}" == "TM1"
        -DTIZEN_WLAN_BOARD_SPRD=1 \
 %endif
+        -DTIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND=1 \
         -DTIZEN_FEATURE_SERVICE_DISCOVERY=1 \
         -DTIZEN_WLAN_CONCURRENT_ENABLE=1 \
         -DTIZEN_FEATURE_WIFI_DISPLAY=1 \
@@ -112,6 +114,7 @@ cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DARCHITECTURE=$ARCH \
         -DTIZEN_FEATURE_ASP=1 \
 %else
 %if "%{profile}" == "tv"
+       -DTIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND=1 \
        -DTIZEN_FEATURE_SERVICE_DISCOVERY=1 \
        -DTIZEN_WLAN_CONCURRENT_ENABLE=0 \
        -DTIZEN_FEATURE_WIFI_DISPLAY=1 \
index ec78cea..d8b951a 100644 (file)
 #include "wifi-direct-iface.h"
 #include "wifi-direct-dbus.h"
 #include "wifi-direct-log.h"
+#ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
+#include <wifi-direct.h>
+#include "wifi-direct-ipc.h"
+#include "wifi-direct-manager.h"
+#endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
 
 static GDBusConnection *g_connection = NULL;
 static guint g_owner_id = 0;  /* Name Owner ID */
 
+#ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
+static int nameowner_changed_sub_id = 0;
+static void wfd_manager_dbus_register_nameowner_signal(void);
+#endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
+
 static GDBusConnection *__dbus_get_gdbus_conn(void)
 {
        return g_connection;
@@ -43,6 +53,9 @@ static void __on_bus_acquired(GDBusConnection *connection,
                              gpointer user_data)
 {
        WDS_LOGD("on_bus_acquired: %s", name);
+#ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
+       wfd_manager_dbus_register_nameowner_signal();
+#endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
        wfd_manager_dbus_register();
 }
 
@@ -60,6 +73,66 @@ static void __on_name_lost(GDBusConnection *connection,
        WDS_LOGD("on_name_lost: %s", name);
 }
 
+#ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
+static void nameowner_signal_handler(GDBusConnection *connection,
+                                     const gchar *sender_name,
+                                     const gchar *object_path,
+                                     const gchar *interface_name,
+                                     const gchar *signal_name,
+                                     GVariant *parameters,
+                                     gpointer user_data)
+{
+       gchar *name = NULL;
+       gchar *old = NULL;
+       gchar *new = NULL;
+
+       g_variant_get(parameters, "(&s&s&s)", &name, &old, &new);
+       wfd_manager_remove_active_client(name, old, new);
+}
+
+static void wfd_manager_dbus_register_nameowner_signal(void)
+{
+       GDBusConnection *connection = __dbus_get_gdbus_conn();
+
+       if (connection == NULL) {
+               WDS_LOGE("Failed to get GDbus Connection");
+               return;
+       }
+
+       nameowner_changed_sub_id = g_dbus_connection_signal_subscribe(
+                             connection,
+                             DBUS_SERVICE,
+                             DBUS_INTERFACE,
+                             "NameOwnerChanged",
+                             DBUS_PATH,
+                             NULL,
+                             G_DBUS_SIGNAL_FLAGS_NONE,
+                             nameowner_signal_handler,
+                             NULL,
+                             NULL);
+
+       WDS_LOGD("Subscribed successfully for NameOwnerChanged signals");
+}
+
+void wfd_manager_dbus_unregister_nameowner_signal(void)
+{
+       GDBusConnection *connection = NULL;
+
+       wfd_manager_free_active_client_list();
+
+       connection = __dbus_get_gdbus_conn();
+       if (!connection) {
+               WDS_LOGE("Already unregistered. Nothing to be done");
+               return;
+       }
+
+       g_dbus_connection_signal_unsubscribe(connection,
+                               nameowner_changed_sub_id);
+
+       WDS_LOGD("Unsubscribed successfully for NameOwnerChanged signals");
+}
+#endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
+
 guint wfd_manager_dbus_iface_register(const gchar* iface_name,
                                      const gchar* iface_path,
                                      GDBusNodeInfo *node_info,
index d965630..6131497 100644 (file)
@@ -52,7 +52,6 @@
 #include "wifi-direct-asp.h"
 #endif /* TIZEN_FEATURE_ASP */
 
-
 static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *data)
 {
        __WDS_LOG_FUNC_ENTER__;
index 6827904..7a616fe 100644 (file)
@@ -74,6 +74,11 @@ const gchar wfd_manager_introspection_xml[] = {
                        "<method name='Activate'>"
                                "<arg type='i' name='error_code' direction='out'/>"
                        "</method>"
+#ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
+                       "<method name='AddClient'>"
+                               "<arg type='i' name='result' direction='out'/>"
+                       "</method>"
+#endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
                        "<method name='Deactivate'>"
                                "<arg type='i' name='error_code' direction='out'/>"
                        "</method>"
@@ -471,7 +476,11 @@ static void __wfd_manager_manage_iface_handler(const gchar *method_name,
                                             "Activation",
                                             g_variant_new("(i)", ret));
                return;
-
+#ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
+       } else if (!g_strcmp0(method_name, "AddClient")) {
+               return_parameters = g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE);
+               goto done;
+#endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
        } else if (!g_strcmp0(method_name, "Deactivate")) {
 
                if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
@@ -2524,6 +2533,11 @@ static void wfd_manager_method_call_handler (GDBusConnection       *connection,
 {
        int count = 0;
 
+#ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
+       if(!g_strcmp0(method_name, "AddClient"))
+               wfd_manager_add_active_client(sender);
+#endif /* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
+
        /* Method Call */
        WDS_LOGD("interface : [%s], method : [%s]", interface_name, method_name);
        DBUS_DEBUG_VARIANT(parameters);
index 61f1a8f..6a4116e 100644 (file)
@@ -62,6 +62,108 @@ wfd_manager_s *wfd_get_manager()
        return g_manager;
 }
 
+#ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
+/* Stop wfd-manager services, If no client
+   exists and state is deactivated. */
+static gboolean _wfd_exit_timeout_cb(void *user_data)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = (wfd_manager_s*) user_data;
+
+       if (!manager) {
+               WDS_LOGE("Invalid parameter");
+               return TRUE;
+       }
+
+       if (manager->client_count > 0) {
+               WDS_LOGD("Client count [%d]", manager->client_count);
+               return TRUE;
+       }
+
+       if (manager->state == WIFI_DIRECT_STATE_DEACTIVATED) {
+               WDS_LOGD("Terminate Wi-Fi Direct Manager");
+               g_main_quit(manager->main_loop);
+               manager->exit_timer = 0;
+               WDS_LOGD( "Stop exit timer. State [%d]", manager->state);
+               __WDS_LOG_FUNC_EXIT__;
+               return FALSE;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;
+       return TRUE;
+}
+
+void wfd_manager_free_active_client_list(void)
+{
+       GSList *list;
+       wfd_manager_s *manager = wfd_get_manager();
+
+       if (!manager || !manager->client_list)
+               return;
+
+       for (list = manager->client_list; list; list = list->next)
+               g_free(list->data);
+
+       g_slist_free(manager->client_list);
+}
+
+void wfd_manager_add_active_client(const char *client_id)
+{
+       GSList *list = NULL;
+       gboolean if_exists = FALSE;
+       gchar *str = NULL;
+       wfd_manager_s *manager = wfd_get_manager();
+       if (!manager || !client_id)
+               return;
+
+       for (list = manager->client_list; list; list = list->next) {
+               str = list->data;
+               if (str && !g_strcmp0(client_id, str)) {
+                       if_exists = TRUE;
+                       break;
+               }
+       }
+
+       // If not exists in list, add the sender
+       if (if_exists == FALSE) {
+               manager->client_list = g_slist_prepend(manager->client_list,
+                                        g_strdup(client_id));
+               manager->client_count++;
+               WDS_LOGD("Added DBus sender id[%s] count[%d]", client_id,
+                                        manager->client_count);
+       }
+}
+
+void wfd_manager_remove_active_client(const gchar *name,
+                                     const char *old_owner,
+                                     const char *new_owner)
+{
+       GSList *list = NULL;
+       gchar *str = NULL;
+       wfd_manager_s *manager = wfd_get_manager();
+
+       if (!manager)
+               return;
+
+       if (!g_strcmp0(new_owner, "")) {
+               if (manager->client_count > 0) {
+                       for (list = manager->client_list; list; list = list->next) {
+                               str = list->data;
+                               if (str && !g_strcmp0(old_owner, str)) {
+                                       manager->client_list =
+                                                g_slist_remove(manager->client_list, str);
+                                       g_free(str);
+                                       manager->client_count--;
+                                       WDS_LOGD("Removed name[%s] old[%s] new[%s] count[%d]",
+                                                name, old_owner, new_owner, manager->client_count);
+                                       break;
+                               }
+                       }
+               }
+       }
+}
+#endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
+
 static int _wfd_local_init_device(wfd_manager_s *manager)
 {
        __WDS_LOG_FUNC_ENTER__;
@@ -1607,6 +1709,14 @@ static wfd_manager_s *wfd_manager_init()
        }
        WDS_LOGD("Succeeded to initialize local device");
 
+#ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
+       manager->client_count = 0;
+       manager->client_list = NULL;
+       manager->exit_timer = g_timeout_add(120000,
+                                               (GSourceFunc) _wfd_exit_timeout_cb, manager);
+       WDS_LOGD("Exit timer started");
+#endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
+
        __WDS_LOG_FUNC_EXIT__;
        return manager;
 }
@@ -1621,6 +1731,12 @@ int wfd_manager_deinit(wfd_manager_s *manager)
                return -1;
        }
 
+#ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
+       if (manager->exit_timer > 0)
+               g_source_remove(manager->exit_timer);
+       manager->exit_timer = 0;
+#endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
+
        _wfd_local_deinit_device(manager);
 
        g_free(manager);
@@ -1853,6 +1969,10 @@ int main(int argc, char *argv[])
        g_manager->main_loop = main_loop;
        g_main_loop_run(main_loop);
 
+#ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
+       wfd_manager_dbus_unregister_nameowner_signal();
+#endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
+
        wfd_manager_dbus_unregister();
        wfd_manager_dbus_deinit();