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
#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
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
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;
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__ */
-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 \
%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 \
-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 \
#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;
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();
}
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,
#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__;
"<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>"
"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) {
{
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);
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__;
}
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;
}
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);
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();