ADD_DEFINITIONS(-DTIZEN_COMMON)
ENDIF(TIZEN_COMMON)
+IF(TIZEN_FEATURE_ASP)
+ ADD_DEFINITIONS(-DTIZEN_FEATURE_ASP)
+ENDIF(TIZEN_FEATURE_ASP)
+
IF(TIZEN_MOBILE)
ADD_DEFINITIONS(-DTIZEN_MOBILE)
ENDIF(TIZEN_MOBILE)
#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"
+#if defined(TIZEN_FEATURE_ASP)
+#define WFD_MANAGER_ASP_INTERFACE WFD_MANAGER_SERVICE ".asp"
+#endif
#define WFD_MANAGER_DBUS_REPLY_TIMEOUT 10 * 1000
#define WFD_MANAGER_DBUS_REPLY_TIMEOUT_SYNC 10 * 1000
WFD_WPS_MODE_PBC = 0x1,
WFD_WPS_MODE_DISPLAY = 0x2,
WFD_WPS_MODE_KEYPAD = 0x4,
+#if defined(TIZEN_FEATURE_ASP)
+ WFD_WPS_MODE_P2PS = 0x8,
+#endif /* TIZEN_FEATURE_ASP */
} wfd_wps_mode_e;
typedef enum {
#define IP2STR(a) (a)[0], (a)[1], (a)[2], (a)[3]
#define IPSTR "%d.%d.%d.%d"
#define ZEROIP "0.0.0.0"
+#define ISZEROIP(a) !(a[0] | a[1] | a[2] | a[3])
#define MAC2SECSTR(a) (a)[0], (a)[4], (a)[5]
#define MACSECSTR "%02x:%02x:%02x"
#define IP2SECSTR(a) (a)[0], (a)[3]
return ops->refresh();
}
+#if defined(TIZEN_FEATURE_ASP)
+int wfd_oem_advertise_service(wfd_oem_ops_s *ops, wfd_oem_asp_service_s *service, int replace)
+{
+ if (!ops || !ops->advertise_service) {
+ return -1;
+ }
+
+ return ops->advertise_service(service, replace);
+}
+
+int wfd_oem_cancel_advertise_service(wfd_oem_ops_s *ops, wfd_oem_asp_service_s *service)
+{
+ if (!ops || !ops->cancel_advertise_service) {
+ return -1;
+ }
+
+ return ops->cancel_advertise_service(service);
+}
+
+int wfd_oem_seek_service(wfd_oem_ops_s *ops, wfd_oem_asp_service_s *service)
+{
+ if (!ops || !ops->seek_service) {
+ return -1;
+ }
+
+ return ops->seek_service(service);
+}
+
+int wfd_oem_cancel_seek_service(wfd_oem_ops_s *ops, wfd_oem_asp_service_s *service)
+{
+ if (!ops || !ops->cancel_seek_service) {
+ return -1;
+ }
+
+ return ops->cancel_seek_service(service);
+}
+#endif /* TIZEN_FEATURE_ASP */
#define OEM_QUERY_ID_LEN 15
#define OEM_SERVICE_MAX_LEN 1024
+#if defined(TIZEN_FEATURE_ASP)
+/* Referring to Wi-Fi Peer-to-Peer Services Technical Specification v1.1
+ * The default P2Ps PIN is 12345670. Any device decided to be GO will use
+ * that as device password
+ */
+#define OEM_DEFAULT_P2PS_PIN "12345670"
+#endif /* TIZEN_FEATURE_ASP */
+
#define OEM_MAX_PEER_NUM 8
typedef enum {
WFD_OEM_SC_FAIL_BOTH_GO_INTENT_15 = 9,
WFD_OEM_SC_FAIL_INCOMPATIBLE_PROV_METHOD = 10,
WFD_OEM_SC_FAIL_REJECTED_BY_USER = 11,
+#if defined(TIZEN_FEATURE_ASP)
+ WFD_OEM_SC_SUCCESS_ACCEPTED_BY_USER = 12,
+#endif /* TIZEN_FEATURE_ASP */
} wfd_oem_status_code_e;
typedef enum {
WFD_OEM_WPA_STATE_MAX,
} ws_wpa_state_type_e;
+#if defined(TIZEN_FEATURE_ASP)
+typedef enum {
+ WFD_OEM_ASP_SESSION_ROLE_NONE = 0x00, /**< Session network role none */
+ WFD_OEM_ASP_SESSION_ROLE_NEW = 0x01, /**< Session network role new */
+ WFD_OEM_ASP_SESSION_ROLE_CLIENT = 0x02, /**< Session network role client */
+ WFD_OEM_ASP_SESSION_ROLE_GO = 0x04, /**< Session network role GO */
+} wfd_oem_asp_network_role_e;
+#endif /* TIZEN_FEATURE_ASP */
+
typedef enum {
WFD_OEM_EVENT_NONE,
WFD_OEM_EVENT_DEACTIVATED,
WFD_OEM_EVENT_GROUP_FORMATION_FAILURE,
WFD_OEM_EVENT_INVITATION_ACCEPTED,
+#if defined(TIZEN_FEATURE_ASP)
+ WFD_OEM_EVENT_ASP_SERV_RESP,
+#endif /* TIZEN_FEATURE_ASP */
WFD_OEM_EVENT_MAX,
} wfd_oem_event_e;
} wfd_oem_display_s;
#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+#if defined(TIZEN_FEATURE_ASP)
+typedef struct {
+ unsigned int adv_id;
+ unsigned int config_method;
+ int service_type_length;
+ char *service_type;
+} wfd_oem_advertise_service_s;
+#endif /* TIZEN_FEATURE_ASP */
+
typedef struct {
int age;
char dev_name[OEM_DEV_NAME_LEN+1];
#ifdef TIZEN_FEATURE_WIFI_DISPLAY
wfd_oem_display_s display;
#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+#if defined(TIZEN_FEATURE_ASP)
+ wfd_oem_advertise_service_s asp_service;
+#endif /* TIZEN_FEATURE_ASP */
} wfd_oem_device_s;
typedef struct {
wfd_oem_display_s display;
#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
unsigned char p2p_go_addr[OEM_MACADDR_LEN];
+#if defined(TIZEN_FEATURE_ASP)
+ wfd_oem_advertise_service_s asp_service;
+#endif /* TIZEN_FEATURE_ASP */
} wfd_oem_dev_data_s;
typedef struct {
WFD_OEM_EDATA_TYPE_GROUP,
WFD_OEM_EDATA_TYPE_SERVICE,
WFD_OEM_EDATA_TYPE_NEW_SERVICE,
+#if defined(TIZEN_FEATURE_ASP)
+ WFD_OEM_EDATA_TYPE_ASP_SERVICE,
+#endif /* TIZEN_FEATURE_ASP */
} ws_event_type_e;
typedef enum {
WFD_OEM_WPS_MODE_PBC = 0x1,
WFD_OEM_WPS_MODE_DISPLAY = 0x2,
WFD_OEM_WPS_MODE_KEYPAD = 0x4,
+#if defined(TIZEN_FEATURE_ASP)
+ WFD_OEM_WPS_MODE_P2PS = 0x8,
+#endif /* TIZEN_FEATURE_ASP */
} wfd_oem_wps_mode_e;
#define WFD_OEM_GROUP_FLAG_GROUP_OWNER 0x1
int scan_type;
int freq;
int refresh;
+#if defined(TIZEN_FEATURE_ASP)
+ char *seek;
+#endif /* TIZEN_FEATURE_ASP */
} wfd_oem_scan_param_s;
typedef struct {
WFD_OEM_PERSISTENT_MODE_GO = 0x3,
} wfd_oem_persistent_mode_e;
+#if defined(TIZEN_FEATURE_ASP)
+typedef enum
+{
+ WFD_OEM_TYPE_ADVERTISE,
+ WFD_OEM_TYPE_SEEK,
+ WFD_OEM_TYPE_MAX,
+} wfd_oem_asp_service_type_e;
+
+typedef struct {
+ wfd_oem_asp_service_type_e type;
+ unsigned int adv_id;
+ long long unsigned search_id;
+ int auto_accept;
+ int discovery_tech;
+ unsigned char preferred_connection;
+
+ unsigned char status;
+ unsigned char role;
+ unsigned int config_method;
+ unsigned char tran_id;
+
+ char *instance_name;
+ char *service_name;
+ char *service_type;
+ char *service_info;
+ char *rsp_info;
+} wfd_oem_asp_service_s;
+#endif /* TIZEN_FEATURE_ASP */
typedef struct
{
int network_id;
int (*remove_all_network)(void);
int (*get_wpa_status)(int *wpa_status);
-
+#if defined(TIZEN_FEATURE_ASP)
+ int (*advertise_service)(wfd_oem_asp_service_s *service, int replace);
+ int (*cancel_advertise_service)(wfd_oem_asp_service_s *service);
+ int (*seek_service)(wfd_oem_asp_service_s *service);
+ int (*cancel_seek_service)(wfd_oem_asp_service_s *service);
+#endif /* TIZEN_FEATURE_ASP */
} wfd_oem_ops_s;
int wfd_oem_init(wfd_oem_ops_s *ops, wfd_oem_event_cb event_callback, void *user_data);
#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
int wfd_oem_refresh(wfd_oem_ops_s *ops);
+#if defined(TIZEN_FEATURE_ASP)
+int wfd_oem_advertise_service(wfd_oem_ops_s *ops, wfd_oem_asp_service_s *service, int replace);
+int wfd_oem_cancel_advertise_service(wfd_oem_ops_s *ops, wfd_oem_asp_service_s *service);
+int wfd_oem_seek_service(wfd_oem_ops_s *ops, wfd_oem_asp_service_s *service);
+int wfd_oem_cancel_seek_service(wfd_oem_ops_s *ops, wfd_oem_asp_service_s *service);
+#endif /* TIZEN_FEATURE_ASP */
#endif /* __WIFI_DIRECT_OEM_H__ */
<check send_destination="net.wifidirect" send_interface="net.wifidirect.config" privilege="http://tizen.org/privilege/wifidirect" />
<check send_destination="net.wifidirect" send_interface="net.wifidirect.service" privilege="http://tizen.org/privilege/wifidirect" />
<check send_destination="net.wifidirect" send_interface="net.wifidirect.display" privilege="http://tizen.org/privilege/wifidirect" />
+ <check send_destination="net.wifidirect" send_interface="net.wifidirect.asp" privilege="http://tizen.org/privilege/wifidirect" />
</policy>
</busconfig>
Name: wifi-direct-manager
Summary: Wi-Fi Direct manger
-Version: 1.2.156
+Version: 1.2.157
Release: 1
Group: Network & Connectivity/Wireless
License: Apache-2.0
-DCTRL_IFACE_DBUS=1 \
-DTIZEN_DEBUG_DBUS_VALUE=1 \
-DTIZEN_MOBILE=1 \
+ -DTIZEN_FEATURE_ASP=1 \
%else
%if "%{profile}" == "tv"
-DTIZEN_FEATURE_SERVICE_DISCOVERY=1 \
# define DEFAULT_LISTEN_CHANNEL 1
# define DEFAULT_OPER_REG_CLASS 81
# define DEFAULT_OPER_CHANNEL 1
+#if !defined(TIZEN_FEATURE_ASP)
# define DEFAULT_CONFIG_METHOD "display push_button keypad"
+#else
+# define DEFAULT_CONFIG_METHOD "display push_button keypad p2ps"
+#endif
# define DEFAULT_NO_GROUP_IFACE 0
#endif /* TIZEN_MOBILE */
#define WS_CONFIG_METHOD_DISPLAY 0x0008
#define WS_CONFIG_METHOD_PUSHBUTTON 0x0080
#define WS_CONFIG_METHOD_KEYPAD 0x0100
+#if defined(TIZEN_FEATURE_ASP)
+#define WS_CONFIG_METHOD_P2PS 0x1000
+#endif /* TIZEN_FEATURE_ASP */
#define WS_DBUS_STR_PBC "pbc"
#define WS_DBUS_STR_DISPLAY "display"
#define WS_DBUS_STR_KEYPAD "keypad"
+#if defined(TIZEN_FEATURE_ASP)
+#define WS_DBUS_STR_P2PS "p2ps"
+#endif /* TIZEN_FEATURE_ASP */
#define WS_DBUS_STR_JOIN "join"
#define WS_DBUS_STR_AUTH "auth"
#define WS_DBUS_STR_PERSISTENT "persistent"
* method). This value may be further augmented with the optional
* "Identity" attribute in M1. */
WS_DEV_PASSWD_ID_REGISTRAR_SPECIFIED = 0x0005, // ENTER-PIN
+
+#if defined(TIZEN_FEATURE_ASP)
+ WS_DEV_PASSWD_ID_P2PS = 0x0008,
+#endif /* TIZEN_FEATURE_ASP */
} ws_dev_passwd_id_e;
typedef enum {
int ws_remove_all_network(void);
int ws_get_wpa_status(int *wpa_status);
-
+#if defined(TIZEN_FEATURE_ASP)
+int ws_advertise_service(wfd_oem_asp_service_s *service, int replace);
+int ws_cancel_advertise_service(wfd_oem_asp_service_s *service);
+int ws_seek_service(wfd_oem_asp_service_s *service);
+int ws_cancel_seek_service(wfd_oem_asp_service_s *service);
+#endif /* TIZEN_FEATURE_ASP */
#endif /* __WFD_PLUGIN_WPASUPPLICANT_H__ */
#include "wfd-plugin-wpasupplicant.h"
#include "dbus/wfd-plugin-supplicant-dbus.h"
+#if defined(TIZEN_FEATURE_ASP)
+#define GLIST_ITER_START(arg_list, elem)\
+ GList *temp = NULL;\
+ temp = g_list_first(arg_list);\
+ while (temp) {\
+ elem = temp->data;\
+ temp = g_list_next(temp);\
+
+#define GLIST_ITER_END() }
+#endif
+
#define NETCONFIG_SERVICE "net.netconfig"
#define NETCONFIG_WIFI_INTERFACE "net.netconfig.wifi"
#define NETCONFIG_WIFI_PATH "/net/netconfig/wifi"
.remove_all_network = ws_remove_all_network,
.get_wpa_status = ws_get_wpa_status,
+#if defined(TIZEN_FEATURE_ASP)
+ .advertise_service = ws_advertise_service,
+ .cancel_advertise_service = ws_cancel_advertise_service,
+ .seek_service = ws_seek_service,
+ .cancel_seek_service = ws_cancel_seek_service,
+#endif /* TIZEN_FEATURE_ASP */
};
static ws_dbus_plugin_data_s *g_pd;
static GList *service_list;
#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+static GList *seek_list;
+
static void _supplicant_signal_cb(GDBusConnection *connection,
const gchar *sender, const gchar *object_path, const gchar *interface,
const gchar *signal, GVariant *parameters, gpointer user_data);
case WFD_OEM_WPS_MODE_KEYPAD:
return WS_DBUS_STR_KEYPAD;
break;
+#if defined(TIZEN_FEATURE_ASP)
+ case WFD_OEM_WPS_MODE_NONE:
+ case WFD_OEM_WPS_MODE_P2PS:
+ return WS_DBUS_STR_P2PS;
+#endif /* TIZEN_FEATURE_ASP */
default:
return "";
break;
if(!ISZEROMACADDR(peer->go_dev_addr))
peer->dev_role = WFD_OEM_DEV_ROLE_GC;
-
+#if defined(TIZEN_FEATURE_ASP)
+ } else if (g_strcmp0(key, "AdvertiseService") == 0) {
+ //TODO : parsing AdvertiseService
+#endif /* TIZEN_FEATURE_ASP */
} else {
WDP_LOGD("Unknown value");
}
if(!ISZEROMACADDR(go_dev_addr))
peer->dev_role = WFD_OEM_DEV_ROLE_GC;
-
+#if defined(TIZEN_FEATURE_ASP)
+ } else if (g_strcmp0(key, "AdvertiseService") == 0) {
+ //TODO : parsing AdvertiseService
+#endif /* TIZEN_FEATURE_ASP */
} else {
WDP_LOGD("Unknown value");
}
}
#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+#if defined(TIZEN_FEATURE_ASP)
+static void __ws_extract_serviceaspresponse_details(const char *key, GVariant *value, void *user_data)
+{
+ __WDP_LOG_FUNC_ENTER__;
+ wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
+ if(!event || !event->edata)
+ return;
+
+ wfd_oem_asp_service_s *service = (wfd_oem_asp_service_s *)event->edata;
+
+ if (g_strcmp0(key, "peer_object") == 0) {
+ static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
+ const char *path = NULL;
+ char *loc = NULL;
+
+ g_variant_get(value, "o", &path);
+ if(path == NULL)
+ return;
+
+ WDP_LOGD("Retrive Added path [%s]", path);
+ loc = strrchr(path,'/');
+ if(loc != NULL)
+ __ws_mac_compact_to_normal(loc + 1, peer_dev);
+ __ws_txt_to_mac(peer_dev, event->dev_addr);
+
+ } else if (g_strcmp0(key, "srv_trans_id") == 0) {
+ unsigned int srv_trans_id = 0;
+ g_variant_get(value, "u", &srv_trans_id);
+ service->tran_id = srv_trans_id;
+ WDP_LOGD("Retrive srv_trans_id [%x]", service->tran_id);
+
+ } else if (g_strcmp0(key, "adv_id") == 0) {
+ unsigned int adv_id = 0;
+ g_variant_get(value, "u", &adv_id);
+ service->adv_id = adv_id;
+ WDP_LOGD("Retrive adv_id [%x]", service->adv_id);
+
+ } else if (g_strcmp0(key, "svc_status") == 0) {
+ unsigned char svc_status = 0;
+ g_variant_get(value, "u", &svc_status);
+ service->status = svc_status;
+ WDP_LOGD("Retrive svc_status [%x]", service->status);
+
+ } else if (g_strcmp0(key, "config_methods") == 0) {
+ unsigned int config_methods = 0;
+ g_variant_get(value, "q", &config_methods);
+ service->config_method = config_methods;
+ WDP_LOGD("Retrive config_methods [%x]", service->config_method);
+
+ } else if (g_strcmp0(key, "svc_str") == 0) {
+ const char *svc_str = NULL;
+ g_variant_get(value, "s", &svc_str);
+ if(svc_str != NULL)
+ service->service_name = g_strdup(svc_str);
+ WDP_LOGD("Retrive srv_name [%s]", service->service_name);
+
+ } else if (g_strcmp0(key, "info") == 0) {
+ const char *info = NULL;
+ g_variant_get(value, "s", &info);
+ if(info != NULL)
+ service->service_info = g_strdup(info);
+ WDP_LOGD("Retrive srv_info [%s]", service->service_info);
+ }
+ __WDP_LOG_FUNC_EXIT__;
+}
+#endif /* TIZEN_FEATURE_ASP */
+
static int _ws_flush()
{
__WDP_LOG_FUNC_ENTER__;
}
#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+#if defined(TIZEN_FEATURE_ASP)
+static void _ws_process_service_asp_response(GDBusConnection *connection,
+ const gchar *object_path, GVariant *parameters)
+{
+ __WDP_LOG_FUNC_ENTER__;
+ GVariantIter *iter = NULL;
+ wfd_oem_event_s event;
+ wfd_oem_asp_service_s *service, *tmp;
+
+ service = (wfd_oem_asp_service_s *) g_try_malloc0(sizeof(wfd_oem_asp_service_s));
+ if (!service) {
+ WDP_LOGF("Failed to allocate memory for event. [%s]",
+ strerror(errno));
+ __WDP_LOG_FUNC_EXIT__;
+ return;
+ }
+ memset(&event, 0x0, sizeof(wfd_oem_event_s));
+
+ event.edata = (void*) service;
+ event.edata_type = WFD_OEM_EDATA_TYPE_ASP_SERVICE;
+ event.event_id = WFD_OEM_EVENT_ASP_SERV_RESP;
+
+ if(parameters != NULL) {
+ g_variant_get(parameters, "(a{sv})", &iter);
+ if(iter != NULL) {
+ dbus_property_foreach(iter, __ws_extract_serviceaspresponse_details, &event);
+ g_variant_iter_free(iter);
+ }
+ } else {
+ WDP_LOGE("No Properties");
+ }
+GLIST_ITER_START(seek_list, tmp)
+ if(tmp->tran_id == service->tran_id) {
+ WDP_LOGD("srv_trans_id matched [%d] search_id [%llu]"
+ ,tmp->tran_id, tmp->search_id);
+ service->search_id = tmp->search_id;
+ break;
+ } else {
+ tmp = NULL;
+ }
+GLIST_ITER_END()
+ g_pd->callback(g_pd->user_data, &event);
+
+ g_free(service->service_name);
+ g_free(service->service_info);
+ g_free(service);
+
+ __WDP_LOG_FUNC_EXIT__;
+}
+#endif /* TIZEN_FEATURE_ASP */
+
static void _ws_process_persistent_group_added(GDBusConnection *connection,
const gchar *object_path, GVariant *parameters)
{
_ws_process_service_discovery_response
},
#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+#if defined(TIZEN_FEATURE_ASP)
+ {
+ SUPPLICANT_P2PDEVICE,
+ "ServiceASPResponse",
+ _ws_process_service_asp_response
+ },
+#endif /* TIZEN_FEATURE_ASP */
{
SUPPLICANT_P2PDEVICE,
"PersistentGroupAdded",
g_pd->activated = TRUE;
__ws_init_p2pdevice();
__ws_set_config_methods();
+ seek_list = NULL;
__WDP_LOG_FUNC_EXIT__;
return 0;
int ws_deactivate(int concurrent)
{
__WDP_LOG_FUNC_ENTER__;
+#if defined(TIZEN_FEATURE_ASP)
+ wfd_oem_asp_service_s *data = NULL;
+#endif /* TIZEN_FEATURE_ASP */
int res = 0;
if (!g_pd) {
}
g_pd->activated = FALSE;
+#if defined(TIZEN_FEATURE_ASP)
+ GLIST_ITER_START(seek_list, data)
+
+ if (data) {
+ temp = g_list_next(seek_list);
+ seek_list = g_list_remove(seek_list, data);
+ g_free(data->service_name);
+ g_free(data);
+ }
+
+ GLIST_ITER_END()
+#endif /* TIZEN_FEATURE_ASP */
__WDP_LOG_FUNC_EXIT__;
return 0;
}
}
#endif
+#if defined(TIZEN_FEATURE_ASP)
+static void __ws_add_seek_params(GVariantBuilder *builder)
+{
+ GVariantBuilder *outter = NULL;
+ GVariantBuilder *inner = NULL;
+ wfd_oem_asp_service_s *data = NULL;
+ int len = 0;
+ int i = 0;
+
+ if(seek_list == NULL || g_list_length(seek_list) == 0) {
+ WDP_LOGD("seek list is NULL");
+ return;
+ }
+ WDP_LOGD("seek list length [%d]", g_list_length(seek_list));
+
+ outter = g_variant_builder_new(G_VARIANT_TYPE("aay"));
+
+GLIST_ITER_START(seek_list, data)
+ if (data && data->service_type) {
+ len = strlen(data->service_type) + 1;
+ WDP_LOGD("data [%s] len [%d]", data->service_type, len);
+ inner = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+ for(i = 0; i < len; i++)
+ g_variant_builder_add(inner, "y", data->service_type[i]);
+ g_variant_builder_add(outter, "ay", inner);
+ g_variant_builder_unref(inner);
+ }
+GLIST_ITER_END()
+ g_variant_builder_add (builder, "{sv}", "Seek", g_variant_new ("aay", outter));
+ g_variant_builder_unref(outter);
+
+ return;
+}
+#endif /* TIZEN_FEATURE_ASP */
+
+
int ws_start_scan(wfd_oem_scan_param_s *param)
{
__WDP_LOG_FUNC_ENTER__;
if (param->scan_type == WFD_OEM_SCAN_TYPE_SOCIAL)
g_variant_builder_add (builder, "{sv}", "DiscoveryType",
g_variant_new_string("social"));
+#if defined(TIZEN_FEATURE_ASP)
+ if(seek_list != NULL)
+ __ws_add_seek_params(builder);
+#endif /* TIZEN_FEATURE_ASP */
value = g_variant_new ("(a{sv})", builder);
g_variant_builder_unref (builder);
__WDP_LOG_FUNC_EXIT__;
return 0;
}
+
+#if defined(TIZEN_FEATURE_ASP)
+int ws_advertise_service(wfd_oem_asp_service_s *service, int replace)
+{
+ __WDP_LOG_FUNC_ENTER__;
+ GDBusConnection *g_dbus = NULL;
+ GVariantBuilder *builder = NULL;
+ GVariant *value = NULL;
+ dbus_method_param_s params;
+ unsigned int config_method = 0x1108;
+ int auto_accept = 0;
+ gboolean rep;
+ int res = 0;
+
+ g_dbus = g_pd->g_dbus;
+ if (!g_dbus) {
+ WDP_LOGE("DBus connection is NULL");
+ return -1;
+ }
+
+ if (service->config_method == 2) {
+ config_method = WS_CONFIG_METHOD_KEYPAD |
+ WS_CONFIG_METHOD_DISPLAY;
+ } else if (service->config_method == 3) {
+ config_method = WS_CONFIG_METHOD_DISPLAY;
+ } else if (service->config_method == 4) {
+ config_method = WS_CONFIG_METHOD_KEYPAD;
+ }
+
+ if(service->auto_accept) {
+ if(service->role == 0)
+ auto_accept = 1;
+ else
+ auto_accept = 2;
+ } else {
+ auto_accept = 0;
+ }
+
+ rep = (replace == 1);
+
+ memset(¶ms, 0x0, sizeof(dbus_method_param_s));
+
+ dbus_set_method_param(¶ms, "AddService", g_pd->iface_path, g_dbus);
+
+ builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}") );
+
+ g_variant_builder_add (builder, "{sv}", "service_type", g_variant_new_string("asp"));
+ g_variant_builder_add (builder, "{sv}", "auto_accept", g_variant_new_int32(auto_accept));
+ g_variant_builder_add (builder, "{sv}", "adv_id", g_variant_new_uint32(service->adv_id));
+ g_variant_builder_add (builder, "{sv}", "svc_state", g_variant_new_uint32(service->status));
+ g_variant_builder_add (builder, "{sv}", "config_method", g_variant_new_uint32(config_method));
+ g_variant_builder_add (builder, "{sv}", "replace", g_variant_new_boolean(rep));
+ if(service->service_type != NULL)
+ g_variant_builder_add (builder, "{sv}", "adv_str", g_variant_new_string(service->service_type));
+ if(service->service_info != NULL)
+ g_variant_builder_add (builder, "{sv}", "svc_info", g_variant_new_string(service->service_info));
+
+ value = g_variant_new ("(a{sv})", builder);
+ g_variant_builder_unref (builder);
+#if defined (TIZEN_DEBUG_DBUS_VALUE)
+ WDP_LOGE("params [%s]", g_variant_print(value, TRUE));
+#endif /* TIZEN_DEBUG_DBUS_VALUE */
+
+ params.params = value;
+
+ res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
+ if (res < 0)
+ WDP_LOGE("Failed to send command to wpa_supplicant");
+ else
+ WDP_LOGD("Succeeded to add service");
+
+ __WDP_LOG_FUNC_EXIT__;
+ return 0;
+}
+
+int ws_cancel_advertise_service(wfd_oem_asp_service_s *service)
+{
+ __WDP_LOG_FUNC_ENTER__;
+ GDBusConnection *g_dbus = NULL;
+ GVariantBuilder *builder = NULL;
+ GVariant *value = NULL;
+ dbus_method_param_s params;
+ int res = 0;
+
+ g_dbus = g_pd->g_dbus;
+ if (!g_dbus) {
+ WDP_LOGE("DBus connection is NULL");
+ return -1;
+ }
+ memset(¶ms, 0x0, sizeof(dbus_method_param_s));
+
+ dbus_set_method_param(¶ms, "DeleteService", g_pd->iface_path, g_dbus);
+
+ builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
+
+ g_variant_builder_add (builder, "{sv}", "service_type", g_variant_new_string("asp"));
+ g_variant_builder_add (builder, "{sv}", "adv_id", g_variant_new_uint32(service->adv_id));
+
+ value = g_variant_new ("(a{sv})", builder);
+ g_variant_builder_unref (builder);
+#if defined (TIZEN_DEBUG_DBUS_VALUE)
+ WDP_LOGD("params [%s]", g_variant_print(value, TRUE));
+#endif /* TIZEN_DEBUG_DBUS_VALUE */
+ params.params = value;
+
+ res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
+ if (res < 0)
+ WDP_LOGE("Failed to send command to wpa_supplicant");
+ else
+ WDP_LOGD("Succeeded to del service");
+
+ __WDP_LOG_FUNC_EXIT__;
+ return 0;
+}
+
+static void __remove_seek_service(long long unsigned search_id)
+{
+ wfd_oem_asp_service_s *data = NULL;
+ int count = 1;
+
+ GLIST_ITER_START(seek_list, data)
+
+ if (data) {
+ if(data->search_id == search_id) {
+ WDP_LOGD("List remove");
+ seek_list = g_list_remove(seek_list, data);
+ g_free(data->service_type);
+ g_free(data);
+ } else {
+ data->tran_id = count;
+ count++;
+ }
+ }
+
+ GLIST_ITER_END()
+ return;
+}
+
+static void __get_asp_search_id(GVariant *value, void *args)
+{
+ __WDP_LOG_FUNC_ENTER__;
+ wfd_oem_asp_service_s *service = NULL;
+ wfd_oem_asp_service_s *tmp = NULL;
+ long long unsigned search_id = 0;
+
+ g_variant_get(value, "(t)", &search_id);
+
+ service = (wfd_oem_asp_service_s *)args;
+ if (!service) {
+ WDP_LOGE("invalid parameters");
+ return;
+ }
+
+ tmp = g_try_malloc0(sizeof(wfd_oem_asp_service_s));
+ if (!tmp) {
+ WDP_LOGE("Failed to allocate memory for service");
+ return;
+ }
+
+ service->search_id = search_id;
+ memcpy(tmp, service, sizeof(wfd_oem_asp_service_s));
+ if(service->service_type)
+ tmp->service_type = strdup(service->service_type);
+ seek_list = g_list_prepend(seek_list, tmp);
+
+ __WDP_LOG_FUNC_EXIT__;
+ return;
+
+}
+
+int ws_seek_service(wfd_oem_asp_service_s *service)
+{
+ __WDP_LOG_FUNC_ENTER__;
+ GDBusConnection *g_dbus = NULL;
+ GVariantBuilder *builder = NULL;
+ GVariant *value = NULL;
+ dbus_method_param_s params;
+ int res = 0;
+
+ g_dbus = g_pd->g_dbus;
+ if (!g_dbus) {
+ WDP_LOGE("DBus connection is NULL");
+ return -1;
+ }
+ memset(¶ms, 0x0, sizeof(dbus_method_param_s));
+ service->tran_id = g_list_length(seek_list) + 1;
+
+ dbus_set_method_param(¶ms, "ServiceDiscoveryRequest", g_pd->iface_path, g_dbus);
+
+ builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}") );
+
+ g_variant_builder_add (builder, "{sv}", "service_type", g_variant_new_string("asp"));
+ g_variant_builder_add (builder, "{sv}", "transaction_id", g_variant_new_byte(service->tran_id));
+ if(service->service_type != NULL)
+ g_variant_builder_add (builder, "{sv}", "svc_str", g_variant_new_string(service->service_type));
+
+ if(service->service_info != NULL)
+ g_variant_builder_add (builder, "{sv}", "svc_info", g_variant_new_string(service->service_info));
+
+ value = g_variant_new ("(a{sv})", builder);
+ g_variant_builder_unref (builder);
+
+#if defined (TIZEN_DEBUG_DBUS_VALUE)
+ WDP_LOGD("params [%s]", g_variant_print(value, TRUE));
+#endif /* TIZEN_DEBUG_DBUS_VALUE */
+
+ params.params = value;
+
+ res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, __get_asp_search_id, service);
+ if (res < 0)
+ WDP_LOGE("Failed to send command to wpa_supplicant");
+ else
+ WDP_LOGD("Succeeded to seek service");
+
+ __WDP_LOG_FUNC_EXIT__;
+ return res;
+}
+
+int ws_cancel_seek_service(wfd_oem_asp_service_s *service)
+{
+ __WDP_LOG_FUNC_ENTER__;
+ GDBusConnection *g_dbus = NULL;
+ dbus_method_param_s params;
+
+ int res = 0;
+
+ g_dbus = g_pd->g_dbus;
+ if (!g_dbus) {
+ WDP_LOGE("DBus connection is NULL");
+ return -1;
+ }
+
+ memset(¶ms, 0x0, sizeof(dbus_method_param_s));
+
+ dbus_set_method_param(¶ms, "ServiceDiscoveryCancelRequest", g_pd->iface_path, g_dbus);
+
+ params.params = g_variant_new ("(t)", service->search_id);
+
+#if defined (TIZEN_DEBUG_DBUS_VALUE)
+ WDP_LOGD("params [%s]", g_variant_print(params.params, TRUE));
+#endif /* TIZEN_DEBUG_DBUS_VALUE */
+
+ res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
+ if (res < 0) {
+ WDP_LOGE("Failed to send command to wpa_supplicant");
+ } else {
+ WDP_LOGD("Succeeded to cancel seek service");
+ __remove_seek_service(service->search_id);
+ }
+
+ __WDP_LOG_FUNC_EXIT__;
+ return res;
+}
+#endif /* TIZEN_FEATURE_ASP */
int ws_remove_all_network(void);
int ws_get_wpa_status(int *wpa_status);
-
+#if defined(TIZEN_FEATURE_ASP)
+int ws_advertise_service(wfd_oem_asp_service_s *service, int replace);
+int ws_cancel_advertise_service(wfd_oem_asp_service_s *service);
+int ws_seek_service(wfd_oem_asp_service_s *service);
+int ws_cancel_seek_service(wfd_oem_asp_service_s *service);
+#endif /* TIZEN_FEATURE_ASP */
#endif /* __WFD_PLUGIN_WPASUPPLICANT_H__ */
.remove_all_network = ws_remove_all_network,
.get_wpa_status = ws_get_wpa_status,
+#if defined(TIZEN_FEATURE_ASP)
+ .advertise_service = ws_advertise_service,
+ .cancel_advertise_service = ws_cancel_advertise_service,
+ .seek_service = ws_seek_service,
+ .cancel_seek_service = ws_cancel_seek_service,
+#endif /* TIZEN_FEATURE_ASP */
};
static ws_plugin_data_s *g_pd;
__WDP_LOG_FUNC_EXIT__;
return 0;
}
+
+#if defined(TIZEN_FEATURE_ASP)
+int ws_advertise_service(wfd_oem_asp_service_s *service, int replace)
+{
+ __WDP_LOG_FUNC_ENTER__;
+
+ __WDP_LOG_FUNC_EXIT__;
+ return -1;
+}
+
+int ws_cancel_advertise_service(wfd_oem_asp_service_s *service)
+{
+ __WDP_LOG_FUNC_ENTER__;
+
+ __WDP_LOG_FUNC_EXIT__;
+ return -1;
+}
+
+int ws_seek_service(wfd_oem_asp_service_s *service)
+{
+ __WDP_LOG_FUNC_ENTER__;
+
+ __WDP_LOG_FUNC_EXIT__;
+ return -1;
+}
+
+int ws_cancel_seek_service(wfd_oem_asp_service_s *service)
+{
+ __WDP_LOG_FUNC_ENTER__;
+
+ __WDP_LOG_FUNC_EXIT__;
+ return -1;
+}
+#endif /* TIZEN_FEATURE_ASP */
int ws_remove_all_network(void);
int ws_get_wpa_status(int *wpa_status);
-
-
+#if defined(TIZEN_FEATURE_ASP)
+int ws_advertise_service(wfd_oem_asp_service_s *service, int replace);
+int ws_cancel_advertise_service(wfd_oem_asp_service_s *service);
+int ws_seek_service(wfd_oem_asp_service_s *service);
+int ws_cancel_seek_service(wfd_oem_asp_service_s *service);
+#endif /* TIZEN_FEATURE_ASP */
#endif /* __WFD_PLUGIN_WPASUPPLICANT_H__ */
.remove_all_network = ws_remove_all_network,
.get_wpa_status = ws_get_wpa_status,
+#if defined(TIZEN_FEATURE_ASP)
+ .advertise_service = ws_advertise_service,
+ .cancel_advertise_service = ws_cancel_advertise_service,
+ .seek_service = ws_seek_service,
+ .cancel_seek_service = ws_cancel_seek_service,
+#endif /* TIZEN_FEATURE_ASP */
};
int wfd_plugin_load(wfd_oem_ops_s **ops)
__WDP_LOG_FUNC_EXIT__;
return -1;
}
+
+#if defined(TIZEN_FEATURE_ASP)
+int ws_advertise_service(wfd_oem_asp_service_s *service, int replace)
+{
+ __WDP_LOG_FUNC_ENTER__;
+
+ __WDP_LOG_FUNC_EXIT__;
+ return -1;
+}
+
+int ws_cancel_advertise_service(wfd_oem_asp_service_s *service)
+{
+ __WDP_LOG_FUNC_ENTER__;
+
+ __WDP_LOG_FUNC_EXIT__;
+ return -1;
+}
+
+int ws_seek_service(wfd_oem_asp_service_s *service)
+{
+ __WDP_LOG_FUNC_ENTER__;
+
+ __WDP_LOG_FUNC_EXIT__;
+ return -1;
+}
+
+int ws_cancel_seek_service(wfd_oem_asp_service_s *service)
+{
+ __WDP_LOG_FUNC_ENTER__;
+
+ __WDP_LOG_FUNC_EXIT__;
+ return -1;
+}
+#endif /* TIZEN_FEATURE_ASP */
}
#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+
+#if defined(TIZEN_FEATURE_ASP)
+static void __wfd_process_asp_serv_resp(wfd_manager_s *manager, wfd_oem_event_s *event)
+ {
+ __WDS_LOG_FUNC_ENTER__;
+
+ wfd_oem_asp_service_s *service = NULL;
+ GVariantBuilder *builder = NULL;
+ GVariant *params = NULL;
+
+ service = (wfd_oem_asp_service_s *)event->edata;
+ if(service == NULL) {
+ WDS_LOGE("P2P service found event has NULL information");
+ __WDS_LOG_FUNC_EXIT__;
+ return;
+ }
+
+ builder = g_variant_builder_new(G_VARIANT_TYPE ("a{sv}"));
+ g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("u", service->search_id));
+ g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", event->dev_addr));
+ g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
+ g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
+ if(service->service_type)
+ g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_name));
+ if(service->service_info)
+ g_variant_builder_add(builder, "{sv}", "service_info", g_variant_new("s", service->service_info));
+ g_variant_builder_add(builder, "{sv}", "status", g_variant_new("y", service->status));
+ params = g_variant_new("(a{sv})", builder);
+ g_variant_builder_unref(builder);
+
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
+ "SearchResult",
+ params);
+
+ __WDS_LOG_FUNC_EXIT__;
+ return;
+ }
+#endif /* TIZEN_FEATURE_ASP */
+
static struct {
const int event_id;
void (*function) (wfd_manager_s *manager, wfd_oem_event_s *event);
WFD_OEM_EVENT_INVITATION_ACCEPTED,
__wfd_process_invitation_accepted
},
+#if defined(TIZEN_FEATURE_ASP)
+ {
+ WFD_OEM_EVENT_ASP_SERV_RESP,
+ __wfd_process_asp_serv_resp,
+ },
+#endif /* TIZEN_FEATURE_ASP */
{
WFD_OEM_EVENT_MAX,
NULL
"</method>"
"</interface>"
#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+#if defined(TIZEN_FEATURE_ASP)
+ "<interface name='net.wifidirect.asp'>"
+ "<method name='AdvertiseService'>"
+ "<arg type='a{sv}' name='parameters' direction='in'/>"
+ "<arg type='i' name='result' direction='out'/>"
+ "</method>"
+ "<method name='CancelAdvertiseService'>"
+ "<arg type='u' name='adv_id' direction='in'/>"
+ "<arg type='i' name='result' direction='out'/>"
+ "</method>"
+ "<method name='SeekService'>"
+ "<arg type='a{sv}' name='parameters' direction='in'/>"
+ "<arg type='i' name='result' direction='out'/>"
+ "<arg type='t' name='search_id' direction='out'/>"
+ "</method>"
+ "<method name='CancelSeekService'>"
+ "<arg type='t' name='search_id' direction='in'/>"
+ "<arg type='i' name='result' direction='out'/>"
+ "</method>"
+ "<signal name='SearchResult'>"
+ "<arg type='a{sv}' name='parameters'/>"
+ "</signal>"
+ "</interface>"
+#endif
"</node>"
};
return;
}
#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+#if defined(TIZEN_FEATURE_ASP)
+static void __wfd_manager_asp_iface_handler(const gchar *method_name,
+ GVariant *parameters,
+ GDBusMethodInvocation *invocation)
+{
+ int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ wfd_manager_s *manager = wfd_get_manager();
+ GVariant *return_parameters = NULL;
+ GError *err = NULL;
+ WDS_LOGD("%s", method_name);
+
+ if (!g_strcmp0(method_name, "AdvertiseService")) {
+
+ wfd_oem_asp_service_s service;
+ GVariantIter *iter = NULL;
+ gchar *key = NULL;
+ GVariant *var = NULL;
+ int replace = 0;
+
+ if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
+ manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
+ manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
+ WDS_LOGE("Wi-Fi Direct is not available status for Advertising.");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ goto failed;
+ }
+
+ memset(&service, 0, sizeof(wfd_oem_asp_service_s));
+ g_variant_get(parameters, "(a{sv})", &iter);
+ while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
+ if (!g_strcmp0(key, "adv_id"))
+ g_variant_get(var, "u", &(service.adv_id));
+ else if (!g_strcmp0(key, "discovery_tech"))
+ g_variant_get(var, "i", &(service.discovery_tech));
+ else if (!g_strcmp0(key, "preferred_connection"))
+ g_variant_get(var, "y", &(service.preferred_connection));
+ else if (!g_strcmp0(key, "auto_accept"))
+ g_variant_get(var, "i", &(service.auto_accept));
+ else if (!g_strcmp0(key, "status"))
+ g_variant_get(var, "y", &(service.status));
+ else if (!g_strcmp0(key, "role"))
+ g_variant_get(var, "y", &(service.role));
+ else if (!g_strcmp0(key, "replace"))
+ g_variant_get(var, "i", &(replace));
+ else if (!g_strcmp0(key, "config_method"))
+ g_variant_get(var, "u", &(service.config_method));
+ else if (!g_strcmp0(key, "instance_name"))
+ g_variant_get(var, "&s", &(service.instance_name));
+ else if (!g_strcmp0(key, "service_type"))
+ g_variant_get(var, "&s", &(service.service_type));
+ else if (!g_strcmp0(key, "service_info"))
+ g_variant_get(var, "&s", &(service.service_info));
+ else if (!g_strcmp0(key, "rsp_info"))
+ g_variant_get(var, "&s", &(service.rsp_info));
+ else
+ ;/* Do Nothing */
+ }
+
+ ret = wfd_oem_advertise_service(manager->oem_ops, &service, replace);
+ if (ret < 0) {
+ WDS_LOGE("Failed to add service");
+ g_variant_iter_free(iter);
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ goto failed;
+ }
+ g_variant_iter_free(iter);
+
+ if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+ WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
+ goto done;
+ }
+
+ ret = wfd_manager_start_discovery(manager, WFD_OEM_SCAN_MODE_PASSIVE, 0, 0, 0);
+ if (ret == WIFI_DIRECT_ERROR_NONE) {
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "ListenStarted",
+ NULL);
+ } else {
+ wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ goto failed;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ return_parameters = g_variant_new("(i)", ret);
+ goto done;
+
+ } else if (!g_strcmp0(method_name, "CancelAdvertiseService")) {
+
+ wfd_oem_asp_service_s service;
+ memset(&service, 0, sizeof(wfd_oem_asp_service_s));
+
+ if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ goto failed;
+ }
+
+ g_variant_get(parameters, "(u)", &(service.adv_id));
+ ret = wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
+ if (ret < 0) {
+ WDS_LOGE("Failed to del service");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ goto failed;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ return_parameters = g_variant_new("(i)", ret);
+ goto done;
+
+ } else if (!g_strcmp0(method_name, "SeekService")) {
+
+ wfd_oem_asp_service_s service;
+ GVariantIter *iter = NULL;
+ gchar *key = NULL;
+ GVariant *var = NULL;
+
+ if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
+ manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
+ manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
+ WDS_LOGE("Wi-Fi Direct is not available status to Seek.");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ goto failed;
+ }
+
+ memset(&service, 0, sizeof(wfd_oem_asp_service_s));
+ g_variant_get(parameters, "(a{sv})", &iter);
+ while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
+ if (!g_strcmp0(key, "discovery_tech"))
+ g_variant_get(var, "i", &(service.discovery_tech));
+ else if (!g_strcmp0(key, "preferred_connection"))
+ g_variant_get(var, "y", &(service.preferred_connection));
+ else if (!g_strcmp0(key, "service_type"))
+ g_variant_get(var, "&s", &(service.service_type));
+ else if (!g_strcmp0(key, "service_info"))
+ g_variant_get(var, "&s", &(service.service_info));
+ else
+ ;/* Do Nothing */
+ }
+
+ ret = wfd_oem_seek_service(manager->oem_ops, &service);
+ if (ret < 0) {
+ WDS_LOGE("Failed to seek service");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ goto failed;
+ }
+ g_variant_iter_free(iter);
+
+ WDS_LOGD("search_id [%x]", service.search_id);
+
+ ret = wfd_manager_start_discovery(manager, WFD_OEM_SCAN_MODE_ACTIVE, 0, 0, 0);
+ if (ret == WIFI_DIRECT_ERROR_NONE) {
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "DiscoveryStarted",
+ NULL);
+ } else {
+ wfd_oem_cancel_seek_service(manager->oem_ops, &service);
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ goto failed;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ return_parameters = g_variant_new("(it)", ret, service.search_id);
+ goto done;
+
+ } else if (!g_strcmp0(method_name, "CancelSeekService")) {
+
+ wfd_oem_asp_service_s service;
+ memset(&service, 0, sizeof(wfd_oem_asp_service_s));
+
+ if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+ WDS_LOGE("Wi-Fi Direct is not activated.");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ goto failed;
+ }
+
+ g_variant_get(parameters, "(t)", &(service.search_id));
+ ret = wfd_oem_cancel_seek_service(manager->oem_ops, &service);
+ if (ret < 0) {
+ WDS_LOGE("Failed to cancel seek service");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ goto failed;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+done:
+ WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
+ return;
+
+failed:
+ wfd_error_set_gerror(ret, &err);
+ g_dbus_method_invocation_return_gerror(invocation, err);
+ g_clear_error(&err);
+ return;
+}
+#endif
static struct {
guint reg_id;
__wfd_manager_display_iface_handler
},
#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+#if defined(TIZEN_FEATURE_ASP)
+ {
+ 0,
+ WFD_MANAGER_ASP_INTERFACE,
+ __wfd_manager_asp_iface_handler
+ },
+#endif
{
0,
NULL,