2 * Network Configuration Module
4 * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 * This file implements wifi direct manager interface functions.
23 * @file wifi-direct-iface.c
24 * @author Nishant Chaprana (n.chaprana@samsung.com)
30 #include <wifi-direct.h>
32 #include "wifi-direct-dbus.h"
33 #include "wifi-direct-iface.h"
34 #include "wifi-direct-ipc.h"
35 #include "wifi-direct-error.h"
36 #include "wifi-direct-log.h"
37 #include "wifi-direct-manager.h"
38 #include "wifi-direct-oem.h"
39 #include "wifi-direct-session.h"
40 #include "wifi-direct-util.h"
41 #include "wifi-direct-group.h"
42 #include "wifi-direct-state.h"
44 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
45 #include "wifi-direct-service.h"
46 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
47 #ifdef TIZEN_FEATURE_ASP
48 #include "wifi-direct-asp.h"
49 #endif /* TIZEN_FEATURE_ASP */
51 #define WFD_DBUS_REPLY_ERROR_NONE(invocation) \
52 g_dbus_method_invocation_return_value((invocation), g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE))
54 #define WFD_DBUS_REPLY_PARAMS(invocation, params) \
55 g_dbus_method_invocation_return_value((invocation), (params))
57 static int macaddr_atoe(const char *p, unsigned char mac[])
62 mac[i++] = (char) strtoul(p, (char **) &p, 16);
70 /* introspection xml to register interfaces */
71 const gchar wfd_manager_introspection_xml[] = {
72 "<node name='/net/wifidirect'>"
73 "<interface name='net.wifidirect'>"
74 "<method name='Activate'>"
75 "<arg type='i' name='error_code' direction='out'/>"
77 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
78 "<method name='AddClient'>"
79 "<arg type='i' name='result' direction='out'/>"
81 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
82 "<method name='Deactivate'>"
83 "<arg type='i' name='error_code' direction='out'/>"
85 "<method name='StartDiscovery'>"
86 "<arg type='a{sv}' name='parameters' direction='in'/>"
87 "<arg type='i' name='error_code' direction='out'/>"
89 "<method name='StopDiscovery'>"
90 "<arg type='i' name='error_code' direction='out'/>"
92 "<method name='GetDiscoveredPeers'>"
93 "<arg type='i' name='error_code' direction='out'/>"
94 "<arg type='aa{sv}' name='peer_details_list' direction='out'/>"
96 "<method name='Connect'>"
97 "<arg type='s' name='mac_address' direction='in'/>"
98 "<arg type='i' name='error_code' direction='out'/>"
100 "<method name='Disconnect'>"
101 "<arg type='s' name='mac_address' direction='in'/>"
102 "<arg type='i' name='error_code' direction='out'/>"
104 "<method name='CancelConnection'>"
105 "<arg type='s' name='mac_address' direction='in'/>"
106 "<arg type='i' name='error_code' direction='out'/>"
108 "<method name='AcceptConnection'>"
109 "<arg type='s' name='mac_address' direction='in'/>"
110 "<arg type='i' name='error_code' direction='out'/>"
112 "<method name='RejectConnection'>"
113 "<arg type='s' name='mac_address' direction='in'/>"
114 "<arg type='i' name='error_code' direction='out'/>"
116 "<method name='DisconnectAll'>"
117 "<arg type='i' name='error_code' direction='out'/>"
119 "<method name='GetConnectedPeers'>"
120 "<arg type='i' name='error_code' direction='out'/>"
121 "<arg type='aa{sv}' name='peer_details_list' direction='out'/>"
123 "<method name='IsDiscoverable'>"
124 "<arg type='b' name='result' direction='out'/>"
126 "<method name='IsListeningOnly'>"
127 "<arg type='b' name='result' direction='out'/>"
129 "<method name='GetPeerInfo'>"
130 "<arg type='s' name='mac_address' direction='in'/>"
131 "<arg type='i' name='error_code' direction='out'/>"
132 "<arg type='a{sv}' name='peer_details' direction='out'/>"
134 "<method name='GetState'>"
135 "<arg type='i' name='error_code' direction='out'/>"
136 "<arg type='i' name='state' direction='out'/>"
138 "<signal name='Activation'>"
139 "<arg type='i' name='error_code'/>"
141 "<signal name='Deactivation'>"
142 "<arg type='i' name='error_code'/>"
144 "<signal name='Connection'>"
145 "<arg type='i' name='error_code'/>"
146 "<arg type='i' name='connection_state'/>"
147 "<arg type='s' name='peer_mac_address'/>"
149 "<signal name='Disconnection'>"
150 "<arg type='i' name='error_code'/>"
151 "<arg type='i' name='connection_state'/>"
152 "<arg type='s' name='peer_mac_address'/>"
154 "<signal name='ListenStarted'>"
156 "<signal name='DiscoveryStarted'>"
158 "<signal name='DiscoveryFinished'>"
160 "<signal name='PeerFound'>"
161 "<arg type='s' name='peer_mac_address'/>"
163 "<signal name='PeerLost'>"
164 "<arg type='s' name='peer_mac_address'/>"
166 "<signal name='PeerIPAssigned'>"
167 "<arg type='s' name='peer_mac_address'/>"
168 "<arg type='s' name='assigned_ip_address'/>"
171 "<interface name='net.wifidirect.group'>"
172 "<method name='CreateGroup'>"
173 "<arg type='i' name='error_code' direction='out'/>"
175 "<method name='DestroyGroup'>"
176 "<arg type='i' name='error_code' direction='out'/>"
178 "<method name='IsGroupOwner'>"
179 "<arg type='b' name='result' direction='out'/>"
181 "<method name='IsAutoGroup'>"
182 "<arg type='b' name='result' direction='out'/>"
184 "<method name='ActivatePushButton'>"
185 "<arg type='i' name='error_code' direction='out'/>"
187 "<method name='GetPersistentGroups'>"
188 "<arg type='i' name='error_code' direction='out'/>"
189 "<arg type='aa{sv}' name='result' direction='out'/>"
191 "<method name='RemovePersistentGroup'>"
192 "<arg type='s' name='mac_address' direction='in'/>"
193 "<arg type='s' name='ssid' direction='in'/>"
194 "<arg type='i' name='error_code' direction='out'/>"
196 "<method name='SetPassphrase'>"
197 "<arg type='s' name='passphrase' direction='in'/>"
198 "<arg type='i' name='error_code' direction='out'/>"
200 "<method name='GetPassphrase'>"
201 "<arg type='i' name='error_code' direction='out'/>"
202 "<arg type='s' name='passphrase' direction='out'/>"
204 "<method name='SetPersistentGroupEnabled'>"
205 "<arg type='b' name='enable' direction='in'/>"
206 "<arg type='i' name='error_code' direction='out'/>"
208 "<method name='IsPersistentGroupEnabled'>"
209 "<arg type='b' name='result' direction='out'/>"
211 "<signal name='Created'>"
213 "<signal name='Destroyed'>"
216 "<interface name='net.wifidirect.config'>"
217 "<method name='GetDeviceName'>"
218 "<arg type='i' name='error_code' direction='out'/>"
219 "<arg type='s' name='device_name' direction='out'/>"
221 "<method name='SetDeviceName'>"
222 "<arg type='s' name='device_name' direction='in'/>"
223 "<arg type='i' name='error_code' direction='out'/>"
225 "<method name='SetWpsPin'>"
226 "<arg type='s' name='wps_pin' direction='in'/>"
227 "<arg type='i' name='error_code' direction='out'/>"
229 "<method name='GetWpsPin'>"
230 "<arg type='i' name='error_code' direction='out'/>"
231 "<arg type='s' name='wps_pin' direction='out'/>"
233 "<method name='GenerateWpsPin'>"
234 "<arg type='i' name='error_code' direction='out'/>"
235 "<arg type='s' name='wps_pin' direction='out'/>"
237 "<method name='GetSupportedWpsMode'>"
238 "<arg type='i' name='error_code' direction='out'/>"
239 "<arg type='i' name='config_methods' direction='out'/>"
241 "<method name='GetReqWpsMode'>"
242 "<arg type='i' name='error_code' direction='out'/>"
243 "<arg type='i' name='req_wps_mode' direction='out'/>"
245 "<method name='SetReqWpsMode'>"
246 "<arg type='i' name='req_wps_mode' direction='in'/>"
247 "<arg type='i' name='error_code' direction='out'/>"
249 "<method name='GetLocalWpsMode'>"
250 "<arg type='i' name='error_code' direction='out'/>"
251 "<arg type='i' name='local_wps_mode' direction='out'/>"
253 "<method name='GetIPAddress'>"
254 "<arg type='i' name='error_code' direction='out'/>"
255 "<arg type='s' name='local_ip_address' direction='out'/>"
257 "<method name='GetMacAddress'>"
258 "<arg type='i' name='error_code' direction='out'/>"
259 "<arg type='s' name='local_mac_address' direction='out'/>"
261 "<method name='GetGoIntent'>"
262 "<arg type='i' name='error_code' direction='out'/>"
263 "<arg type='i' name='go_intent' direction='out'/>"
265 "<method name='SetGoIntent'>"
266 "<arg type='i' name='go_intent' direction='in'/>"
267 "<arg type='i' name='error_code' direction='out'/>"
269 "<method name='GetMaxClient'>"
270 "<arg type='i' name='error_code' direction='out'/>"
271 "<arg type='i' name='max_client' direction='out'/>"
273 "<method name='SetMaxClient'>"
274 "<arg type='i' name='max_client' direction='in'/>"
275 "<arg type='i' name='error_code' direction='out'/>"
277 "<method name='SetAutoConnectionMode'>"
278 "<arg type='b' name='auto_connection_mode' direction='in'/>"
279 "<arg type='i' name='error_code' direction='out'/>"
281 "<method name='IsAutoConnectionMode'>"
282 "<arg type='i' name='error_code' direction='out'/>"
283 "<arg type='b' name='result' direction='out'/>"
285 "<method name='GetOperatingChannel'>"
286 "<arg type='i' name='error_code' direction='out'/>"
287 "<arg type='i' name='operating_channel' direction='out'/>"
289 "<method name='SetAutoConnectionPeer'>"
290 "<arg type='s' name='peer_mac_address' direction='in'/>"
291 "<arg type='i' name='error_code' direction='out'/>"
293 "<method name='GetConnectingPeer'>"
294 "<arg type='i' name='error_code' direction='out'/>"
295 "<arg type='s' name='local_mac_address' direction='out'/>"
297 "<method name='GetInterfaceName'>"
298 "<arg type='i' name='error_code' direction='out'/>"
299 "<arg type='s' name='ifname' direction='out'/>"
301 "<method name='GetSubnetMask'>"
302 "<arg type='i' name='error_code' direction='out'/>"
303 "<arg type='s' name='subnet_mask' direction='out'/>"
305 "<method name='GetGateway'>"
306 "<arg type='i' name='error_code' direction='out'/>"
307 "<arg type='s' name='gateway_address' direction='out'/>"
309 "<method name='GetSessionTimer'>"
310 "<arg type='i' name='error_code' direction='out'/>"
311 "<arg type='i' name='session_timer' direction='out'/>"
313 "<method name='SetSessionTimer'>"
314 "<arg type='i' name='session_timer' direction='in'/>"
315 "<arg type='i' name='error_code' direction='out'/>"
317 "<method name='SetAutoGroupRemoval'>"
318 "<arg type='b' name='enable' direction='in'/>"
319 "<arg type='i' name='error_code' direction='out'/>"
321 "<method name='GetPrimaryDevType'>"
322 "<arg type='i' name='pri_dev_type' direction='out'/>"
323 "<arg type='i' name='error_code' direction='out'/>"
325 "<method name='GetSecondaryDevType'>"
326 "<arg type='i' name='sec_dev_type' direction='out'/>"
327 "<arg type='i' name='error_code' direction='out'/>"
329 "<method name='GetPeerRssi'>"
330 "<arg type='s' name='peer_mac_addr' direction='in'/>"
331 "<arg type='i' name='error_code' direction='out'/>"
332 "<arg type='i' name='rssi' direction='out'/>"
335 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
336 "<interface name='net.wifidirect.service'>"
337 "<method name='StartDiscovery'>"
338 "<arg type='i' name='service_type' direction='in'/>"
339 "<arg type='s' name='mac_addr' direction='in'/>"
340 "<arg type='i' name='error_code' direction='out'/>"
342 "<method name='StopDiscovery'>"
343 "<arg type='i' name='service_type' direction='in'/>"
344 "<arg type='s' name='mac_addr' direction='in'/>"
345 "<arg type='i' name='error_code' direction='out'/>"
347 "<method name='Register'>"
348 "<arg type='i' name='service_type' direction='in'/>"
349 "<arg type='s' name='info_string' direction='in'/>"
350 "<arg type='i' name='error_code' direction='out'/>"
351 "<arg type='i' name='service_id' direction='out'/>"
353 "<method name='Deregister'>"
354 "<arg type='i' name='service_id' direction='in'/>"
355 "<arg type='i' name='error_code' direction='out'/>"
357 "<signal name='DiscoveryStarted'>"
359 "<signal name='DiscoveryFound'>"
360 "<arg type='i' name='service_type'/>"
361 "<arg type='s' name='response_data'/>"
362 "<arg type='s' name='peer_mac_address'/>"
364 "<signal name='DiscoveryFinished'>"
367 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
368 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
369 "<interface name='net.wifidirect.display'>"
370 "<method name='Init'>"
371 "<arg type='i' name='error_code' direction='out'/>"
373 "<method name='Deinit'>"
374 "<arg type='i' name='error_code' direction='out'/>"
376 "<method name='SetConfig'>"
377 "<arg type='i' name='type' direction='in'/>"
378 "<arg type='i' name='port' direction='in'/>"
379 "<arg type='i' name='hdcp' direction='in'/>"
380 "<arg type='i' name='error_code' direction='out'/>"
382 "<method name='SetAvailiability'>"
383 "<arg type='i' name='availability' direction='in'/>"
384 "<arg type='i' name='error_code' direction='out'/>"
386 "<method name='GetPeerType'>"
387 "<arg type='s' name='peer_mac_addr' direction='in'/>"
388 "<arg type='i' name='error_code' direction='out'/>"
389 "<arg type='i' name='result' direction='out'/>"
391 "<method name='GetPeerAvailability'>"
392 "<arg type='s' name='peer_mac_addr' direction='in'/>"
393 "<arg type='i' name='error_code' direction='out'/>"
394 "<arg type='i' name='result' direction='out'/>"
396 "<method name='GetPeerHdcp'>"
397 "<arg type='s' name='peer_mac_addr' direction='in'/>"
398 "<arg type='i' name='error_code' direction='out'/>"
399 "<arg type='i' name='result' direction='out'/>"
401 "<method name='GetPeerPort'>"
402 "<arg type='s' name='peer_mac_addr' direction='in'/>"
403 "<arg type='i' name='error_code' direction='out'/>"
404 "<arg type='i' name='result' direction='out'/>"
406 "<method name='GetPeerThroughput'>"
407 "<arg type='s' name='peer_mac_addr' direction='in'/>"
408 "<arg type='i' name='error_code' direction='out'/>"
409 "<arg type='i' name='result' direction='out'/>"
412 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
413 #if defined(TIZEN_FEATURE_ASP)
414 "<interface name='net.wifidirect.asp'>"
415 "<method name='AdvertiseService'>"
416 "<arg type='a{sv}' name='parameters' direction='in'/>"
417 "<arg type='i' name='result' direction='out'/>"
419 "<method name='CancelAdvertiseService'>"
420 "<arg type='u' name='adv_id' direction='in'/>"
421 "<arg type='i' name='result' direction='out'/>"
423 "<method name='SeekService'>"
424 "<arg type='a{sv}' name='parameters' direction='in'/>"
425 "<arg type='i' name='result' direction='out'/>"
427 "<method name='CancelSeekService'>"
428 "<arg type='t' name='search_id' direction='in'/>"
429 "<arg type='i' name='result' direction='out'/>"
431 "<method name='ConnectSession'>"
432 "<arg type='a{sv}' name='parameters' direction='in'/>"
433 "<arg type='i' name='result' direction='out'/>"
435 "<method name='ConfirmSession'>"
436 "<arg type='a{sv}' name='parameters' direction='in'/>"
437 "<arg type='i' name='result' direction='out'/>"
439 "<signal name='SearchResult'>"
440 "<arg type='a{sv}' name='parameters'/>"
442 "<signal name='SessionRequest'>"
443 "<arg type='a{sv}' name='parameters'/>"
445 "<signal name='SessionConfigRequest'>"
446 "<arg type='a{sv}' name='parameters'/>"
448 "<signal name='ConnectStatus'>"
449 "<arg type='a{sv}' name='parameters'/>"
451 "<signal name='SessionStatus'>"
452 "<arg type='a{sv}' name='parameters'/>"
454 "<signal name='SessionPeerIPAssigned'>"
455 "<arg type='a{sv}' name='parameters'/>"
463 static void __wfd_manager_manage_iface_handler(const gchar *method_name,
464 GVariant *parameters,
465 GDBusMethodInvocation *invocation)
467 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
468 wfd_manager_s *manager = wfd_get_manager();
469 GVariant *return_parameters = NULL;
471 gchar* dbus_error_name = NULL;
472 WDS_LOGD("%s", method_name);
474 if (!g_strcmp0(method_name, "Activate")) {
476 WFD_DBUS_REPLY_ERROR_NONE(invocation);
478 ret = wfd_manager_activate(manager);
479 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
481 g_variant_new("(i)", ret));
483 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
484 } else if (!g_strcmp0(method_name, "AddClient")) {
485 return_parameters = g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE);
487 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
488 } else if (!g_strcmp0(method_name, "Deactivate")) {
490 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
491 WDS_LOGE("Already deactivated");
492 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
496 WFD_DBUS_REPLY_ERROR_NONE(invocation);
498 ret = wfd_manager_deactivate(manager);
499 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
501 g_variant_new("(i)", ret));
504 } else if (!g_strcmp0(method_name, "StartDiscovery")) {
505 gboolean mode = FALSE;
508 const gchar *type = NULL;
509 GVariantIter *iter = NULL;
511 GVariant *var = NULL;
513 g_variant_get(parameters, "(a{sv})", &iter);
514 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
515 if (!g_strcmp0(key, "Mode"))
516 g_variant_get(var, "b", &mode);
517 else if (!g_strcmp0(key, "Timeout"))
518 g_variant_get(var, "i", &timeout);
519 else if (!g_strcmp0(key, "Type"))
520 g_variant_get(var, "&s", &type);
521 else if (!g_strcmp0(key, "Channel"))
522 g_variant_get(var, "i", &channel);
526 g_variant_iter_free(iter);
528 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
529 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
530 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
531 WDS_LOGE("Wi-Fi Direct is not available status for scanning.");
532 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
536 if (mode && (manager->local->dev_role == WFD_DEV_ROLE_GO)) {
537 WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
538 ret = WIFI_DIRECT_ERROR_NONE;
539 return_parameters = g_variant_new("(i)", ret);
543 WFD_DBUS_REPLY_ERROR_NONE(invocation);
545 ret = wfd_manager_start_discovery(manager, mode, timeout, type, channel);
546 if (ret == WIFI_DIRECT_ERROR_NONE) {
547 if (mode == WFD_OEM_SCAN_MODE_PASSIVE) {
548 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
552 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
559 } else if (!g_strcmp0(method_name, "StopDiscovery")) {
560 int mode = manager->scan_mode;
561 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
562 manager->state != WIFI_DIRECT_STATE_DISCOVERING) {
563 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
567 WFD_DBUS_REPLY_ERROR_NONE(invocation);
569 ret = wfd_manager_cancel_discovery(manager);
570 if (ret == WIFI_DIRECT_ERROR_NONE && mode == WFD_SCAN_MODE_PASSIVE)
571 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
572 "DiscoveryFinished", NULL);
575 } else if (!g_strcmp0(method_name, "GetDiscoveredPeers")) {
576 wfd_discovery_entry_s *peers = NULL;
577 GVariantBuilder *builder_peers = NULL;
581 builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
583 peer_cnt = wfd_manager_get_peers(manager, &peers);
584 WDS_LOGD("Peer count [%d], Peer list [%p]", peer_cnt, peers);
586 WDS_LOGE("Failed to get scan result");
587 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
594 for (i = 0; i < peer_cnt; i++) {
595 GVariantBuilder builder_peer;
596 g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
598 g_variant_builder_add(&builder_peer, "{sv}",
600 g_variant_new_string(peers[i].device_name));
601 g_variant_builder_add(&builder_peer, "{sv}",
603 wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
604 g_variant_builder_add(&builder_peer, "{sv}",
606 wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
607 g_variant_builder_add(&builder_peer, "{sv}",
609 g_variant_new_uint16(peers[i].channel));
610 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
611 g_variant_builder_add(&builder_peer, "{sv}",
613 g_variant_new_uint16(peers[i].services));
614 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
615 g_variant_builder_add(&builder_peer, "{sv}",
617 g_variant_new_boolean(peers[i].is_group_owner));
618 g_variant_builder_add(&builder_peer, "{sv}",
620 g_variant_new_boolean(peers[i].is_persistent_go));
621 g_variant_builder_add(&builder_peer, "{sv}",
623 g_variant_new_boolean(peers[i].is_connected));
624 g_variant_builder_add(&builder_peer, "{sv}",
626 g_variant_new_uint16(peers[i].wps_device_pwd_id));
627 g_variant_builder_add(&builder_peer, "{sv}",
629 g_variant_new_uint16(peers[i].wps_cfg_methods));
630 g_variant_builder_add(&builder_peer, "{sv}",
632 g_variant_new_uint16(peers[i].category));
633 g_variant_builder_add(&builder_peer, "{sv}",
635 g_variant_new_uint16(peers[i].subcategory));
636 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
637 g_variant_builder_add(&builder_peer, "{sv}",
639 g_variant_new_boolean(peers[i].is_wfd_device));
640 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
642 WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
643 g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
646 ret = WIFI_DIRECT_ERROR_NONE;
647 return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
648 g_variant_builder_unref(builder_peers);
651 } else if (!g_strcmp0(method_name, "Connect")) {
652 const char *peer_mac_address = NULL;
653 unsigned char mac_addr[MACADDR_LEN] = {0, };
655 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
656 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
657 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
658 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
662 wfd_group_s *group = (wfd_group_s*) manager->group;
663 if (group && group->member_count >= manager->max_station) {
664 ret = WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
668 WFD_DBUS_REPLY_ERROR_NONE(invocation);
670 g_variant_get(parameters, "(&s)", &peer_mac_address);
671 macaddr_atoe(peer_mac_address, mac_addr);
673 ret = wfd_manager_connect(manager, mac_addr);
674 if (ret == WIFI_DIRECT_ERROR_NONE)
675 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
677 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
678 WFD_EVENT_CONNECTION_IN_PROGRESS,
682 } else if (!g_strcmp0(method_name, "Disconnect")) {
683 const char *peer_mac_address = NULL;
684 unsigned char mac_addr[MACADDR_LEN] = {0, };
686 if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
687 if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
688 ret = wfd_oem_stop_scan(manager->oem_ops);
690 WDS_LOGE("Failed to stop scan");
691 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
694 WDS_LOGI("Succeeded to stop scan");
695 if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
696 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
697 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
699 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
700 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
703 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
708 WFD_DBUS_REPLY_ERROR_NONE(invocation);
710 g_variant_get(parameters, "(&s)", &peer_mac_address);
711 macaddr_atoe(peer_mac_address, mac_addr);
713 ret = wfd_manager_disconnect(manager, mac_addr);
714 if (ret == WIFI_DIRECT_ERROR_NONE)
715 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
717 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
718 WFD_EVENT_DISCONNECTION_RSP,
722 } else if (!g_strcmp0(method_name, "CancelConnection")) {
723 const char *peer_mac_address = NULL;
724 unsigned char mac_addr[MACADDR_LEN] = {0, };
726 if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
727 WDS_LOGE("It's not CONNECTING state");
728 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
732 WFD_DBUS_REPLY_ERROR_NONE(invocation);
734 g_variant_get(parameters, "(&s)", &peer_mac_address);
735 macaddr_atoe(peer_mac_address, mac_addr);
737 ret = wfd_manager_cancel_connection(manager, mac_addr);
738 if (ret == WIFI_DIRECT_ERROR_NONE)
739 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
741 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
742 WFD_EVENT_CONNECTION_RSP,
746 } else if (!g_strcmp0(method_name, "AcceptConnection")) {
747 const char *peer_mac_address = NULL;
748 unsigned char mac_addr[MACADDR_LEN] = {0, };
750 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
751 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
755 wfd_group_s *group = (wfd_group_s*) manager->group;
756 if (group && group->member_count >= manager->max_station) {
757 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
761 WFD_DBUS_REPLY_ERROR_NONE(invocation);
763 g_variant_get(parameters, "(&s)", &peer_mac_address);
764 macaddr_atoe(peer_mac_address, mac_addr);
766 ret = wfd_manager_accept_connection(manager, mac_addr);
767 if (ret == WIFI_DIRECT_ERROR_NONE) {
768 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
770 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
771 WFD_EVENT_CONNECTION_IN_PROGRESS,
774 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
776 g_variant_new("(iis)", WIFI_DIRECT_ERROR_OPERATION_FAILED,
777 WFD_EVENT_CONNECTION_RSP,
782 } else if (!g_strcmp0(method_name, "RejectConnection")) {
783 wfd_session_s *session = manager->session;
784 const char *peer_mac_address = NULL;
785 unsigned char mac_addr[MACADDR_LEN] = {0, };
787 if (!session || manager->state != WIFI_DIRECT_STATE_CONNECTING) {
788 WDS_LOGE("It's not permitted with this state [%d]", manager->state);
789 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
793 if (session->direction != SESSION_DIRECTION_INCOMING) {
794 WDS_LOGE("Only incomming session can be rejected");
795 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
799 WFD_DBUS_REPLY_ERROR_NONE(invocation);
801 g_variant_get(parameters, "(&s)", &peer_mac_address);
802 macaddr_atoe(peer_mac_address, mac_addr);
804 ret = wfd_manager_reject_connection(manager, mac_addr);
805 if (ret == WIFI_DIRECT_ERROR_NONE)
806 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
808 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
809 WFD_EVENT_CONNECTION_RSP,
813 } else if (!g_strcmp0(method_name, "DisconnectAll")) {
815 if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
816 if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
817 ret = wfd_oem_stop_scan(manager->oem_ops);
819 WDS_LOGE("Failed to stop scan");
820 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
823 WDS_LOGI("Succeeded to stop scan");
824 if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
825 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
826 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
828 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
829 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
832 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
837 WFD_DBUS_REPLY_ERROR_NONE(invocation);
839 ret = wfd_manager_disconnect_all(manager);
840 if (ret == WIFI_DIRECT_ERROR_NONE)
841 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
843 g_variant_new("(iis)", ret,
844 WFD_EVENT_DISCONNECTION_RSP,
848 } else if (!g_strcmp0(method_name, "GetConnectedPeers")) {
849 wfd_connected_peer_info_s *peers = NULL;
850 GVariantBuilder *builder_peers = NULL;
854 builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
856 /* even though status is not CONNECTED,
857 * this command can be excuted only when group exist */
858 if (!manager->group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
859 WDS_LOGD("It's not connected state [%d]", manager->state);
860 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
864 peer_cnt = wfd_manager_get_connected_peers(manager, &peers);
865 WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
867 WDS_LOGE("Failed to get scan result");
868 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
872 for (i = 0; i < peer_cnt; i++) {
873 GVariantBuilder builder_peer;
874 g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
876 g_variant_builder_add(&builder_peer, "{sv}",
878 g_variant_new_string(peers[i].device_name));
879 g_variant_builder_add(&builder_peer, "{sv}",
881 wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
882 g_variant_builder_add(&builder_peer, "{sv}",
884 wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
885 g_variant_builder_add(&builder_peer, "{sv}",
887 wfd_manager_dbus_pack_ay(peers[i].ip_address, IPADDR_LEN));
888 g_variant_builder_add(&builder_peer, "{sv}",
890 g_variant_new_uint16(peers[i].channel));
891 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
892 g_variant_builder_add(&builder_peer, "{sv}",
894 g_variant_new_uint16(peers[i].services));
895 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
896 g_variant_builder_add(&builder_peer, "{sv}",
898 g_variant_new_uint16(peers[i].category));
899 g_variant_builder_add(&builder_peer, "{sv}",
901 g_variant_new_uint16(peers[i].subcategory));
902 g_variant_builder_add(&builder_peer, "{sv}",
904 g_variant_new_boolean(peers[i].is_p2p));
905 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
906 g_variant_builder_add(&builder_peer, "{sv}",
908 g_variant_new_boolean(peers[i].is_wfd_device));
909 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
911 WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
912 g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
915 ret = WIFI_DIRECT_ERROR_NONE;
916 return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
917 g_variant_builder_unref(builder_peers);
920 } else if (!g_strcmp0(method_name, "IsDiscoverable")) {
921 ret = WIFI_DIRECT_ERROR_NONE;
922 return_parameters = g_variant_new("(b)",
923 (manager->state == WIFI_DIRECT_STATE_DISCOVERING ||
924 wfd_group_is_autonomous(manager->group) == TRUE));
927 } else if (!g_strcmp0(method_name, "IsListeningOnly")) {
928 ret = WIFI_DIRECT_ERROR_NONE;
929 return_parameters = g_variant_new("(b)", (manager->scan_mode == WFD_SCAN_MODE_PASSIVE));
932 } else if (!g_strcmp0(method_name, "GetPeerInfo")) {
933 wfd_discovery_entry_s *peer = NULL;
934 GVariantBuilder *builder_peer = NULL;
935 const char *peer_mac_address = NULL;
936 unsigned char mac_addr[MACADDR_LEN] = {0, };
938 g_variant_get(parameters, "(&s)", &peer_mac_address);
939 macaddr_atoe(peer_mac_address, mac_addr);
941 builder_peer = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
943 ret = wfd_manager_get_peer_info(manager, mac_addr, &peer);
944 if (ret < 0 || !peer) {
945 WDS_LOGE("Failed to get peer info");
947 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
951 g_variant_builder_add(builder_peer, "{sv}",
953 g_variant_new_string(peer->device_name));
954 g_variant_builder_add(builder_peer, "{sv}",
956 wfd_manager_dbus_pack_ay(peer->mac_address, MACADDR_LEN));
957 g_variant_builder_add(builder_peer, "{sv}",
959 wfd_manager_dbus_pack_ay(peer->intf_address, MACADDR_LEN));
960 g_variant_builder_add(builder_peer, "{sv}",
962 g_variant_new_uint16(peer->channel));
963 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
964 g_variant_builder_add(builder_peer, "{sv}",
966 g_variant_new_uint16(peer->services));
967 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
968 g_variant_builder_add(builder_peer, "{sv}",
970 g_variant_new_boolean(peer->is_group_owner));
971 g_variant_builder_add(builder_peer, "{sv}",
973 g_variant_new_boolean(peer->is_persistent_go));
974 g_variant_builder_add(builder_peer, "{sv}",
976 g_variant_new_boolean(peer->is_connected));
977 g_variant_builder_add(builder_peer, "{sv}",
979 g_variant_new_uint16(peer->wps_device_pwd_id));
980 g_variant_builder_add(builder_peer, "{sv}",
982 g_variant_new_uint16(peer->wps_cfg_methods));
983 g_variant_builder_add(builder_peer, "{sv}",
985 g_variant_new_uint16(peer->category));
986 g_variant_builder_add(builder_peer, "{sv}",
988 g_variant_new_uint16(peer->subcategory));
989 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
990 g_variant_builder_add(builder_peer, "{sv}",
992 g_variant_new_boolean(peer->is_wfd_device));
993 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
994 #ifdef TIZEN_FEATURE_ASP
995 wfd_device_s *connected_peer = NULL;
996 connected_peer = wfd_group_find_member_by_addr(manager->group, mac_addr);
997 if (connected_peer) {
998 g_variant_builder_add(builder_peer, "{sv}",
1000 g_variant_new_boolean(true));
1001 g_variant_builder_add(builder_peer, "{sv}",
1003 wfd_manager_dbus_pack_ay(connected_peer->ip_addr, IPADDR_LEN));
1005 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
1007 ret = WIFI_DIRECT_ERROR_NONE;
1008 return_parameters = g_variant_new("(ia{sv})", ret, builder_peer);
1009 g_variant_builder_unref(builder_peer);
1013 } else if (!g_strcmp0(method_name, "GetState")) {
1014 ret = WIFI_DIRECT_ERROR_NONE;
1015 return_parameters = g_variant_new("(ii)", ret, manager->state);
1019 WDS_LOGD("method not handled");
1020 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1025 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1030 /*g_dbus_method_invocation_return_dbus_error
1031 * (invocation, WFD_MANAGER_SERVICE ".Error", ".OperationFailed"); */
1033 wfd_error_set_gerror(ret, &err);
1034 dbus_error_name = g_dbus_error_encode_gerror(err);
1035 WDS_LOGD("g_dbus_method_invocation_return_gerror with [%s]", dbus_error_name);
1036 g_free(dbus_error_name);
1037 g_dbus_method_invocation_return_gerror(invocation, err);
1038 g_clear_error(&err);
1042 static void __wfd_manager_group_iface_handler(const gchar *method_name,
1043 GVariant *parameters,
1044 GDBusMethodInvocation *invocation)
1046 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1047 wfd_manager_s *manager = wfd_get_manager();
1048 GVariant *return_parameters = NULL;
1050 WDS_LOGD("%s", method_name);
1052 if (!g_strcmp0(method_name, "CreateGroup")) {
1053 wfd_group_s *group = manager->group;
1054 wfd_oem_group_param_s param;
1056 if (group || manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1057 WDS_LOGE("Group already exist or not a proper state");
1058 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1062 #ifdef TIZEN_WLAN_BOARD_SPRD
1063 group = wfd_create_pending_group(manager, manager->local->dev_addr);
1065 group = wfd_create_pending_group(manager, manager->local->intf_addr);
1068 WDS_LOGE("Failed to create pending group");
1069 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1072 group->flags |= WFD_GROUP_FLAG_AUTONOMOUS;
1073 manager->group = group;
1075 memset(¶m, 0x0, sizeof(param));
1077 param.persistent = (manager->local->group_flags &
1078 WFD_GROUP_FLAG_PERSISTENT);
1079 memcpy(&(param.passphrase), manager->local->passphrase,
1080 sizeof(param.passphrase));
1082 #ifndef TIZEN_WLAN_BOARD_SPRD
1083 param.freq = WFD_FREQ_2G;
1086 ret = wfd_oem_create_group(manager->oem_ops, ¶m);
1088 WDS_LOGE("Failed to create group");
1089 wfd_destroy_group(manager);
1090 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1094 WDS_LOGD("Succeeded to create pending group");
1095 memset(manager->local->passphrase, 0x0, PASSPHRASE_LEN_MAX + 1);
1096 ret = WIFI_DIRECT_ERROR_NONE;
1097 return_parameters = g_variant_new("(i)", ret);
1100 } else if (!g_strcmp0(method_name, "DestroyGroup")) {
1101 wfd_group_s *group = manager->group;
1103 WDS_LOGE("Group not exist");
1104 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1108 if (group->pending == FALSE) {
1109 ret = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1111 WDS_LOGE("Failed to destroy group");
1112 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1117 ret = wfd_destroy_group(manager);
1119 WDS_LOGE("Failed to destroy group");
1121 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1122 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1124 WFD_DBUS_REPLY_ERROR_NONE(invocation);
1126 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
1130 } else if (!g_strcmp0(method_name, "IsGroupOwner")) {
1132 wfd_device_s *local = manager->local;
1133 result = local->dev_role == WFD_DEV_ROLE_GO;
1134 WDS_LOGI("Is group owner : [%s]", result ? "Yes" : "No");
1135 return_parameters = g_variant_new("(b)", result);
1138 } else if (!g_strcmp0(method_name, "IsAutoGroup")) {
1140 if ((result = wfd_group_is_autonomous(manager->group)) < 0)
1143 WDS_LOGI("Is autonomous group : [%s]", result ? "Yes" : "No");
1144 return_parameters = g_variant_new("(b)", result);
1147 } else if (!g_strcmp0(method_name, "ActivatePushButton")) {
1148 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
1149 WDS_LOGE("Wi-Fi Direct is not Group Owner.");
1150 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1154 ret = wfd_oem_wps_start(manager->oem_ops, NULL,
1155 WFD_WPS_MODE_PBC, NULL);
1157 WDS_LOGE("Failed to start wps");
1158 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1161 return_parameters = g_variant_new("(i)", ret);
1164 } else if (!g_strcmp0(method_name, "GetPersistentGroups")) {
1165 int persistent_group_count = 0;
1166 wfd_persistent_group_info_s *plist;
1167 GVariantBuilder *builder_groups = NULL;
1170 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1171 WDS_LOGE("Wi-Fi Direct is not activated.");
1172 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1177 ret = wfd_oem_get_persistent_groups(manager->oem_ops,
1178 (wfd_oem_persistent_group_s**) &plist, &persistent_group_count);
1180 WDS_LOGE("Error!! wfd_oem_get_persistent_group_info() failed..");
1181 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1185 builder_groups = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
1187 for (i = 0; i < persistent_group_count; i++) {
1188 GVariantBuilder builder_group;
1189 g_variant_builder_init(&builder_group, G_VARIANT_TYPE("a{sv}"));
1191 g_variant_builder_add(&builder_group, "{sv}",
1193 g_variant_new_uint32(plist[i].network_id));
1194 g_variant_builder_add(&builder_group, "{sv}",
1196 g_variant_new_string(plist[i].ssid));
1197 g_variant_builder_add(&builder_group, "{sv}",
1199 wfd_manager_dbus_pack_ay(plist[i].go_mac_address, MACADDR_LEN));
1201 WDS_LOGD("%dth peer [%s]", i, plist[i].ssid);
1202 g_variant_builder_add_value(builder_groups, g_variant_builder_end(&builder_group));
1205 ret = WIFI_DIRECT_ERROR_NONE;
1206 return_parameters = g_variant_new("(iaa{sv})", ret, builder_groups);
1207 g_variant_builder_unref(builder_groups);
1210 } else if (!g_strcmp0(method_name, "RemovePersistentGroup")) {
1213 unsigned char go_mac_address[6];
1214 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1215 WDS_LOGE("Wi-Fi Direct is not activated.");
1216 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1220 g_variant_get(parameters, "(&s&s)", &mac_address, &ssid);
1221 macaddr_atoe(mac_address, go_mac_address);
1222 WDS_LOGD("Remove persistent group [%s][" MACSTR "]", ssid, MAC2STR(go_mac_address));
1224 ret = wfd_oem_remove_persistent_group(manager->oem_ops, ssid,
1227 WDS_LOGE("Failed to remove persistent group");
1228 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1231 return_parameters = g_variant_new("(i)", ret);
1234 } else if (!g_strcmp0(method_name, "SetPassphrase")) {
1236 int passphrase_len = 0;
1237 wfd_group_s *group = manager->group;
1240 WDS_LOGE("Group already exists");
1241 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1245 g_variant_get(parameters, "(&s)", &passphrase);
1246 passphrase_len = strlen(passphrase);
1248 if (passphrase_len < PASSPHRASE_LEN_MIN ||
1249 passphrase_len > PASSPHRASE_LEN_MAX) {
1250 WDS_LOGE("Passphrase length incorrect [%s]:[%d]",
1251 passphrase, passphrase_len);
1252 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1256 g_strlcpy(manager->local->passphrase, passphrase, PASSPHRASE_LEN_MAX + 1);
1257 WDS_LOGI("Passphrase string [%s]", manager->local->passphrase);
1259 ret = WIFI_DIRECT_ERROR_NONE;
1260 return_parameters = g_variant_new("(i)", ret);
1263 } else if (!g_strcmp0(method_name, "GetPassphrase")) {
1264 wfd_group_s *group = manager->group;
1266 WDS_LOGE("Group not exist");
1267 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1271 if (group->role == WFD_DEV_ROLE_GC) {
1272 WDS_LOGE("Device is not GO");
1273 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1277 ret = WIFI_DIRECT_ERROR_NONE;
1278 return_parameters = g_variant_new("(is)", ret, group->passphrase);
1279 WDS_LOGI("group->pass : [%s]", group->passphrase);
1283 } else if (!g_strcmp0(method_name, "SetPersistentGroupEnabled")) {
1286 g_variant_get(parameters, "(b)", &enabled);
1287 WDS_LOGI("Activate Persistent Group : [%s]",
1288 enabled ? "True" : "False");
1290 manager->local->group_flags |= WFD_GROUP_FLAG_PERSISTENT;
1292 manager->local->group_flags &= ~(WFD_GROUP_FLAG_PERSISTENT);
1293 ret = WIFI_DIRECT_ERROR_NONE;
1294 return_parameters = g_variant_new("(i)", ret);
1297 } else if (!g_strcmp0(method_name, "IsPersistentGroupEnabled")) {
1299 result = ((manager->local->group_flags &
1300 WFD_GROUP_FLAG_PERSISTENT)
1301 == WFD_GROUP_FLAG_PERSISTENT);
1302 WDS_LOGI("Is persistent group : [%s]", result ? "Yes" : "No");
1303 return_parameters = g_variant_new("(b)", result);
1307 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1312 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1316 wfd_error_set_gerror(ret, &err);
1317 g_dbus_method_invocation_return_gerror(invocation, err);
1318 g_clear_error(&err);
1322 static void __wfd_manager_config_iface_handler(const gchar *method_name,
1323 GVariant *parameters,
1324 GDBusMethodInvocation *invocation)
1326 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1327 wfd_manager_s *manager = wfd_get_manager();
1328 GVariant *return_parameters = NULL;
1330 WDS_LOGD("%s", method_name);
1332 if (!g_strcmp0(method_name, "GetDeviceName")) {
1333 char device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN+1] = {0, };
1335 ret = wfd_local_get_dev_name(device_name);
1337 WDS_LOGE("Failed to get device name");
1338 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1342 ret = WIFI_DIRECT_ERROR_NONE;
1343 return_parameters = g_variant_new("(is)", ret, device_name);
1347 } else if (!g_strcmp0(method_name, "SetDeviceName")) {
1348 const char *device_name = NULL;
1349 g_variant_get(parameters, "(&s)", &device_name);
1351 ret = wfd_local_set_dev_name((char *)device_name);
1353 WDS_LOGE("Failed to set device name");
1354 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1358 ret = WIFI_DIRECT_ERROR_NONE;
1359 return_parameters = g_variant_new("(i)", ret);
1362 } else if (!g_strcmp0(method_name, "GetWpsPin")) {
1363 wfd_session_s *session = (wfd_session_s*) manager->session;
1364 if (!session || manager->auto_pin[0] != 0) {
1365 WDS_LOGE("Session not exist");
1366 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1370 if (session->wps_pin[0] == '\0') {
1371 WDS_LOGE("WPS PIN is not set");
1372 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1376 ret = WIFI_DIRECT_ERROR_NONE;
1377 return_parameters = g_variant_new("(is)", ret, session->wps_pin);
1380 } else if (!g_strcmp0(method_name, "SetWpsPin")) {
1381 const char *pin = NULL;
1382 wfd_session_s *session = (wfd_session_s*) manager->session;
1384 g_variant_get(parameters, "(&s)", &pin);
1387 WDS_LOGE("Session not exist");
1388 g_strlcpy(manager->auto_pin, pin, strlen(pin) + 1);
1390 g_strlcpy(session->wps_pin, pin, strlen(pin) + 1);
1393 ret = WIFI_DIRECT_ERROR_NONE;
1394 return_parameters = g_variant_new("(i)", ret);
1397 } else if (!g_strcmp0(method_name, "GetSupportedWpsMode")) {
1398 int config_methods = 0;
1400 ret = wfd_local_get_supported_wps_mode(&config_methods);
1402 WDS_LOGE("Failed to get supported wps mode");
1403 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1407 ret = WIFI_DIRECT_ERROR_NONE;
1408 return_parameters = g_variant_new("(ii)", ret, config_methods);
1411 } else if (!g_strcmp0(method_name, "GetReqWpsMode")) {
1414 ret = wfd_manager_get_req_wps_mode(&wps_mode);
1416 WDS_LOGE("Failed to get request wps mode");
1417 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1421 ret = WIFI_DIRECT_ERROR_NONE;
1422 return_parameters = g_variant_new("(ii)", ret, wps_mode);
1425 } else if (!g_strcmp0(method_name, "SetReqWpsMode")) {
1428 g_variant_get(parameters, "(i)", &type);
1429 ret = wfd_manager_set_req_wps_mode(type);
1431 WDS_LOGE("Failed to set request wps mode");
1432 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1436 ret = WIFI_DIRECT_ERROR_NONE;
1437 return_parameters = g_variant_new("(i)", ret);
1440 } else if (!g_strcmp0(method_name, "GetLocalWpsMode")) {
1443 ret = wfd_local_get_wps_mode(&wps_mode);
1445 WDS_LOGE("Failed to get request wps mode");
1446 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1450 ret = WIFI_DIRECT_ERROR_NONE;
1451 return_parameters = g_variant_new("(ii)", ret, wps_mode);
1454 } else if (!g_strcmp0(method_name, "GetIPAddress")) {
1455 char ip_addr_str[IPSTR_LEN+1] = {0, };
1457 if (manager->state < WIFI_DIRECT_STATE_CONNECTED) {
1458 WDS_LOGE("Device is not connected yet");
1459 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1463 ret = wfd_local_get_ip_addr((char *)ip_addr_str);
1465 WDS_LOGE("Failed to get local IP address");
1466 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1470 return_parameters = g_variant_new("(is)", ret, ip_addr_str);
1471 WDS_LOGI("IP addr : [%s]", ip_addr_str);
1474 } else if (!g_strcmp0(method_name, "GetMacAddress")) {
1475 char device_mac[MACSTR_LEN+1] = {0, };
1477 ret = wfd_local_get_dev_mac(device_mac);
1479 WDS_LOGE("Failed to get device mac");
1480 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1484 ret = WIFI_DIRECT_ERROR_NONE;
1485 return_parameters = g_variant_new("(is)", ret, device_mac);
1488 } else if (!g_strcmp0(method_name, "GetGoIntent")) {
1491 ret = wfd_manager_get_go_intent(&go_intent);
1493 WDS_LOGE("Failed to get GO intent");
1494 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1498 ret = WIFI_DIRECT_ERROR_NONE;
1499 return_parameters = g_variant_new("(ii)", ret, go_intent);
1502 } else if (!g_strcmp0(method_name, "SetGoIntent")) {
1505 g_variant_get(parameters, "(i)", &go_intent);
1506 ret = wfd_manager_set_go_intent(go_intent);
1508 WDS_LOGE("Failed to set GO intent");
1509 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1513 ret = WIFI_DIRECT_ERROR_NONE;
1514 return_parameters = g_variant_new("(i)", ret);
1517 } else if (!g_strcmp0(method_name, "GetMaxClient")) {
1520 ret = wfd_manager_get_max_station(&max_client);
1522 WDS_LOGE("Failed to get max station");
1523 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1527 ret = WIFI_DIRECT_ERROR_NONE;
1528 return_parameters = g_variant_new("(ii)", ret, max_client);
1531 } else if (!g_strcmp0(method_name, "SetMaxClient")) {
1533 g_variant_get(parameters, "(i)", &max_client);
1535 ret = wfd_manager_set_max_station(max_client);
1537 WDS_LOGE("Failed to set max station");
1538 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1542 ret = WIFI_DIRECT_ERROR_NONE;
1543 return_parameters = g_variant_new("(i)", ret);
1546 } else if (!g_strcmp0(method_name, "SetAutoConnectionMode")) {
1547 gboolean mode = FALSE;
1549 g_variant_get(parameters, "(b)", &mode);
1550 ret = wfd_manager_set_autoconnection(mode);
1552 WDS_LOGE("Failed to set autoconnection");
1553 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1557 ret = WIFI_DIRECT_ERROR_NONE;
1558 return_parameters = g_variant_new("(i)", ret);
1561 } else if (!g_strcmp0(method_name, "IsAutoConnectionMode")) {
1564 ret = wfd_manager_get_autoconnection(&mode);
1566 WDS_LOGE("Failed to get autoconnection");
1567 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1571 ret = WIFI_DIRECT_ERROR_NONE;
1572 return_parameters = g_variant_new("(ib)", ret, mode);
1575 } else if (!g_strcmp0(method_name, "GetOperatingChannel")) {
1578 wfd_group_s *group = manager->group;
1580 WDS_LOGE("Group not exist");
1581 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1585 channel = wfd_util_freq_to_channel(group->freq);
1587 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1591 ret = WIFI_DIRECT_ERROR_NONE;
1592 return_parameters = g_variant_new("(ii)", ret, channel);
1595 } else if (!g_strcmp0(method_name, "SetAutoConnectionPeer")) {
1596 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1599 } else if (!g_strcmp0(method_name, "GetInterfaceName")) {
1600 wfd_group_s *group = (wfd_group_s *)manager->group;
1602 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1605 ret = WIFI_DIRECT_ERROR_NONE;
1606 return_parameters = g_variant_new("(is)", ret, group->ifname);
1609 } else if (!g_strcmp0(method_name, "GetSubnetMask")) {
1610 char *get_str = NULL;
1611 char subnet_mask[IPSTR_LEN+1] = {0, };
1613 get_str = vconf_get_str(VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK);
1615 WDS_LOGE("Get Subnet Mask failed");
1616 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1619 WDS_LOGD("VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK(%s) : %s", VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK,
1621 ret = WIFI_DIRECT_ERROR_NONE;
1622 g_strlcpy(subnet_mask, get_str, IPSTR_LEN + 1);
1623 return_parameters = g_variant_new("(is)", ret, subnet_mask);
1627 } else if (!g_strcmp0(method_name, "GetGateway")) {
1628 char *get_str = NULL;
1629 char gateway_addr[IPSTR_LEN+1] = {0, };
1630 get_str = vconf_get_str(VCONFKEY_WIFI_DIRECT_P2P_GATEWAY);
1632 WDS_LOGE("Get Gateway failed");
1633 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1636 WDS_LOGD("VCONFKEY_WIFI_DIRECT_P2P_GATEWAY_ADDR(%s) : %s", VCONFKEY_WIFI_DIRECT_P2P_GATEWAY,
1638 ret = WIFI_DIRECT_ERROR_NONE;
1639 g_strlcpy(gateway_addr, get_str, IPSTR_LEN + 1);
1640 return_parameters = g_variant_new("(is)", ret, gateway_addr);
1644 } else if (!g_strcmp0(method_name, "GetSessionTimer")) {
1646 int session_timer = 0;
1647 ret = WIFI_DIRECT_ERROR_NONE;
1648 session_timer = manager->session_timer;
1649 WDS_LOGD("Get Session Timer value is %d", session_timer);
1650 return_parameters = g_variant_new("(ii)", ret, session_timer);
1653 } else if (!g_strcmp0(method_name, "SetSessionTimer")) {
1655 int session_timer = 0;
1656 g_variant_get(parameters, "(i)", &session_timer);
1657 WDS_LOGD("Set Session Timer value is %d", session_timer);
1658 manager->session_timer = session_timer;
1659 ret = WIFI_DIRECT_ERROR_NONE;
1660 return_parameters = g_variant_new("(i)", ret);
1663 } else if (!g_strcmp0(method_name, "SetAutoGroupRemoval")) {
1666 g_variant_get(parameters, "(b)", &enable);
1667 WDS_LOGE("Activate Auto Group Removal Mode : [%s]",
1668 enable ? "True" : "False");
1670 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1671 WDS_LOGE("Wi-Fi Direct is not activated.");
1672 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1677 manager->auto_group_remove_enable = TRUE;
1679 /* Enable Group destroy only if state is connecting */
1680 if (manager->state == WIFI_DIRECT_STATE_CONNECTING) {
1681 WDS_LOGE("Wi-Fi Direct state is CONNECTING");
1682 ret = WIFI_DIRECT_ERROR_NONE;
1683 return_parameters = g_variant_new("(i)", ret);
1686 /* Remove group immediately if no connected peer found */
1687 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1688 wfd_group_s *group = (wfd_group_s*) manager->group;
1689 if (group && !group->member_count
1690 && wfd_util_is_remove_group_allowed())
1691 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1695 manager->auto_group_remove_enable = FALSE;
1698 ret = WIFI_DIRECT_ERROR_NONE;
1699 return_parameters = g_variant_new("(i)", ret);
1702 } else if (!g_strcmp0(method_name, "GetPrimaryDevType")) {
1704 int pri_dev_type = 0;
1705 ret = WIFI_DIRECT_ERROR_NONE;
1706 pri_dev_type = DEFAULT_PRIMARY_DEVICE_TYPE;
1707 WDS_LOGD("Get primary dev type value is %d", pri_dev_type);
1708 return_parameters = g_variant_new("(ii)", ret, pri_dev_type);
1711 } else if (!g_strcmp0(method_name, "GetSecondaryDevType")) {
1713 int sec_dev_type = 0;
1714 ret = WIFI_DIRECT_ERROR_NONE;
1715 sec_dev_type = DEFAULT_SECONDARY_DEVICE_TYPE;
1716 WDS_LOGD("Get secondary dev type value is %d", sec_dev_type);
1717 return_parameters = g_variant_new("(ii)", ret, sec_dev_type);
1720 } else if (!g_strcmp0(method_name, "GetPeerRssi")) {
1721 wfd_device_s *peer = NULL;
1722 const char *mac_address = NULL;
1723 unsigned char mac_addr[MACADDR_LEN] = {0, };
1725 g_variant_get(parameters, "(&s)", &mac_address);
1726 macaddr_atoe(mac_address, mac_addr);
1728 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1729 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1733 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
1735 WDS_LOGE("Failed to get peer");
1736 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1740 ret = WIFI_DIRECT_ERROR_NONE;
1741 return_parameters = g_variant_new("(ii)", ret, peer->rssi);
1745 WDS_LOGE("method not handled");
1746 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1751 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1755 wfd_error_set_gerror(ret, &err);
1756 g_dbus_method_invocation_return_gerror(invocation, err);
1757 g_clear_error(&err);
1761 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1762 static void __wfd_manager_service_iface_handler(const gchar *method_name,
1763 GVariant *parameters,
1764 GDBusMethodInvocation *invocation)
1766 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1767 wfd_manager_s *manager = wfd_get_manager();
1768 GVariant *return_parameters = NULL;
1770 WDS_LOGD("%s", method_name);
1772 if (!g_strcmp0(method_name, "StartDiscovery")) {
1773 const char *mac_address = NULL;
1775 unsigned char mac_addr[MACADDR_LEN] = {0, };
1777 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1778 WDS_LOGE("Wi-Fi Direct is not activated.");
1779 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1783 g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
1784 WDS_LOGD("Service type [%d]", service_type);
1785 macaddr_atoe(mac_address, mac_addr);
1787 ret = wfd_oem_start_service_discovery(manager->oem_ops,
1788 mac_addr, service_type);
1790 WDS_LOGE("Failed to start service discovery");
1791 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1795 WFD_DBUS_REPLY_ERROR_NONE(invocation);
1797 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1798 "DiscoveryStarted", NULL);
1801 } else if (!g_strcmp0(method_name, "StopDiscovery")) {
1802 const char *mac_address = NULL;
1804 unsigned char mac_addr[MACADDR_LEN] = {0, };
1806 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1807 WDS_LOGE("Wi-Fi Direct is not activated.");
1808 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1812 g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
1813 WDS_LOGD("Service type [%d]", service_type);
1814 macaddr_atoe(mac_address, mac_addr);
1816 ret = wfd_oem_cancel_service_discovery(manager->oem_ops,
1817 mac_addr, service_type);
1819 WDS_LOGE("Failed to cancel service discovery");
1820 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1823 ret = WIFI_DIRECT_ERROR_NONE;
1824 return_parameters = g_variant_new("(i)", ret);
1827 } else if (!g_strcmp0(method_name, "Register")) {
1830 const char *info_str = NULL;
1832 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1833 WDS_LOGE("Wi-Fi Direct is not activated.");
1834 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1838 g_variant_get(parameters, "(i&s)", &service_type, &info_str);
1839 WDS_LOGD("Register service [%d: %s]", service_type, info_str);
1841 ret = wfd_service_add(service_type, (char *)info_str, &service_id);
1843 WDS_LOGE("Failed to add service");
1844 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1848 ret = WIFI_DIRECT_ERROR_NONE;
1849 return_parameters = g_variant_new("(ii)", ret, service_id);
1852 } else if (!g_strcmp0(method_name, "Deregister")) {
1855 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1856 WDS_LOGE("Wi-Fi Direct is not activated.");
1857 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1861 g_variant_get(parameters, "(i)", &service_id);
1862 WDS_LOGD("Service id [%d]", service_id);
1864 ret = wfd_service_del(service_id);
1866 WDS_LOGE("Failed to delete service");
1867 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1871 ret = WIFI_DIRECT_ERROR_NONE;
1872 return_parameters = g_variant_new("(i)", ret);
1876 WDS_LOGD("method not handled");
1877 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1882 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1886 wfd_error_set_gerror(ret, &err);
1887 g_dbus_method_invocation_return_gerror(invocation, err);
1888 g_clear_error(&err);
1891 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1893 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1894 static void __wfd_manager_display_iface_handler(const gchar *method_name,
1895 GVariant *parameters,
1896 GDBusMethodInvocation *invocation)
1898 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1899 wfd_manager_s *manager = wfd_get_manager();
1900 GVariant *return_parameters = NULL;
1902 WDS_LOGD("%s", method_name);
1904 if (!g_strcmp0(method_name, "Init")) {
1905 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1906 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1910 wfd_device_s * device = manager->local;
1912 ret = wfd_oem_miracast_init(manager->oem_ops, TRUE);
1914 WDS_LOGE("Failed to initialize display");
1915 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1919 device->display.type = WIFI_DISPLAY_DEFAULT_TYPE;
1920 device->display.port = WIFI_DISPLAY_DEFAULT_PORT;
1921 device->display.availability = WIFI_DISPLAY_DEFAULT_AVAIL;
1922 device->display.hdcp_support = WIFI_DISPLAY_DEFAULT_HDCP;
1924 ret = WIFI_DIRECT_ERROR_NONE;
1925 return_parameters = g_variant_new("(i)", ret);
1928 } else if (!g_strcmp0(method_name, "Deinit")) {
1929 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1930 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1934 wfd_device_s * device = manager->local;
1936 ret = wfd_oem_miracast_init(manager->oem_ops, FALSE);
1938 WDS_LOGE("Failed to deinitialize display");
1939 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1943 memset(&(device->display), 0x0, sizeof(wfd_display_type_e));
1945 ret = WIFI_DIRECT_ERROR_NONE;
1946 return_parameters = g_variant_new("(i)", ret);
1949 } else if (!g_strcmp0(method_name, "SetConfig")) {
1950 int type, port, hdcp;
1951 g_variant_get(parameters, "(iii)", &type, &port, &hdcp);
1953 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1954 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1958 WDS_LOGD("type %d port %d hdcp %d", type, port, hdcp);
1960 ret = wfd_manager_set_display_device(type, port, hdcp);
1962 WDS_LOGE("Failed to set display device settings");
1963 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1967 ret = WIFI_DIRECT_ERROR_NONE;
1968 return_parameters = g_variant_new("(i)", ret);
1971 } else if (!g_strcmp0(method_name, "SetAvailiability")) {
1973 g_variant_get(parameters, "(i)", &availability);
1975 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1976 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1980 ret = wfd_manager_set_session_availability(availability);
1982 WDS_LOGE("Failed to set session availability");
1983 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1987 ret = WIFI_DIRECT_ERROR_NONE;
1988 return_parameters = g_variant_new("(i)", ret);
1991 } else if (!g_strcmp0(method_name, "GetPeerType")) {
1992 wfd_device_s *peer = NULL;
1993 const char *mac_address = NULL;
1994 unsigned char mac_addr[MACADDR_LEN] = {0, };
1996 g_variant_get(parameters, "(&s)", &mac_address);
1997 macaddr_atoe(mac_address, mac_addr);
1999 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2000 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2004 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2006 WDS_LOGE("Failed to get peer");
2007 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2011 ret = WIFI_DIRECT_ERROR_NONE;
2012 return_parameters = g_variant_new("(ii)", ret, peer->display.type);
2015 } else if (!g_strcmp0(method_name, "GetPeerAvailability")) {
2016 wfd_device_s *peer = NULL;
2017 const char *mac_address = NULL;
2018 unsigned char mac_addr[MACADDR_LEN] = {0, };
2020 g_variant_get(parameters, "(&s)", &mac_address);
2021 macaddr_atoe(mac_address, mac_addr);
2023 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2024 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2028 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2030 WDS_LOGE("Failed to get peer");
2031 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2035 ret = WIFI_DIRECT_ERROR_NONE;
2036 return_parameters = g_variant_new("(ii)", ret, peer->display.availability);
2039 } else if (!g_strcmp0(method_name, "GetPeerHdcp")) {
2040 wfd_device_s *peer = NULL;
2041 const char *mac_address = NULL;
2042 unsigned char mac_addr[MACADDR_LEN] = {0, };
2044 g_variant_get(parameters, "(&s)", &mac_address);
2045 macaddr_atoe(mac_address, mac_addr);
2047 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2048 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2052 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2054 WDS_LOGE("Failed to get peer");
2055 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2059 ret = WIFI_DIRECT_ERROR_NONE;
2060 return_parameters = g_variant_new("(ii)", ret, peer->display.hdcp_support);
2063 } else if (!g_strcmp0(method_name, "GetPeerPort")) {
2064 wfd_device_s *peer = NULL;
2065 const char *mac_address = NULL;
2066 unsigned char mac_addr[MACADDR_LEN] = {0, };
2068 g_variant_get(parameters, "(&s)", &mac_address);
2069 macaddr_atoe(mac_address, mac_addr);
2071 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2072 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2076 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2078 WDS_LOGE("Failed to get peer");
2079 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2083 ret = WIFI_DIRECT_ERROR_NONE;
2084 return_parameters = g_variant_new("(ii)", ret, peer->display.port);
2087 } else if (!g_strcmp0(method_name, "GetPeerThroughput")) {
2088 wfd_device_s *peer = NULL;
2089 const char *mac_address = NULL;
2090 unsigned char mac_addr[MACADDR_LEN] = {0, };
2092 g_variant_get(parameters, "(&s)", &mac_address);
2093 macaddr_atoe(mac_address, mac_addr);
2095 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2096 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2100 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2102 WDS_LOGE("Failed to get peer");
2103 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2107 ret = WIFI_DIRECT_ERROR_NONE;
2108 return_parameters = g_variant_new("(ii)", ret, peer->display.max_tput);
2112 WDS_LOGD("method not handled");
2113 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2118 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
2122 wfd_error_set_gerror(ret, &err);
2123 g_dbus_method_invocation_return_gerror(invocation, err);
2124 g_clear_error(&err);
2127 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
2128 #if defined(TIZEN_FEATURE_ASP)
2130 static void __g_variant_to_txt_record(GVariant *variant, char **txt_record)
2132 GVariantIter *iter = NULL;
2134 GVariant *value = NULL;
2136 const char *str = NULL;
2140 gsize value_length = 0;
2141 __WDS_LOG_FUNC_ENTER__;
2143 DBUS_DEBUG_VARIANT(variant);
2144 g_variant_get(variant, "a{sv}", &iter);
2145 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2146 WDS_LOGD("%s %s", key, g_variant_get_string(value, &value_length));
2147 txt_length += strlen(key);
2148 str = g_variant_get_string(value, &value_length);
2149 txt_length += (int)value_length;
2153 g_variant_iter_free(iter);
2154 if (txt_length == 0) {
2155 __WDS_LOG_FUNC_EXIT__;
2159 buff = g_try_malloc0(txt_length);
2161 WDS_LOGE("g_try_malloc0 failed");
2162 __WDS_LOG_FUNC_EXIT__;
2166 g_variant_get(variant, "a{sv}", &iter);
2167 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2168 key_length = strlen(key);
2169 str = g_variant_get_string(value, &value_length);
2171 g_strlcpy(pos, key, key_length + 1);
2176 g_strlcpy(pos, str, value_length + 1);
2177 pos += (int)value_length;
2181 buff[txt_length -1] = '\0';
2183 g_variant_iter_free(iter);
2186 __WDS_LOG_FUNC_EXIT__;
2190 static void __g_variant_to_seek_info(GVariant *variant, char **seek_info)
2192 GVariantIter *iter = NULL;
2196 int seek_length = 0;
2199 DBUS_DEBUG_VARIANT(variant);
2200 g_variant_get(variant, "as", &iter);
2201 while (g_variant_iter_loop(iter, "s", &key)) {
2202 seek_length += strlen(key);
2206 g_variant_iter_free(iter);
2207 if (seek_length == 0)
2210 buff = g_try_malloc0(seek_length);
2212 WDS_LOGE("g_try_malloc0 failed");
2216 g_variant_get(variant, "as", &iter);
2217 while (g_variant_iter_loop(iter, "s", &key)) {
2218 key_length = strlen(key);
2220 g_strlcpy(pos, key, key_length + 1);
2225 buff[seek_length -1] = '\0';
2227 g_variant_iter_free(iter);
2233 static void __wfd_manager_asp_iface_handler(const gchar *method_name,
2234 GVariant *parameters,
2235 GDBusMethodInvocation *invocation)
2237 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2238 wfd_manager_s *manager = wfd_get_manager();
2239 GVariant *return_parameters = NULL;
2241 WDS_LOGD("%s", method_name);
2243 if (!g_strcmp0(method_name, "AdvertiseService")) {
2245 wfd_oem_asp_service_s service;
2246 GVariantIter *iter = NULL;
2248 GVariant *var = NULL;
2251 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2252 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2253 manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
2254 WDS_LOGE("Wi-Fi Direct is not available status for Advertising.");
2255 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2259 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2260 g_variant_get(parameters, "(a{sv})", &iter);
2261 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2262 if (!g_strcmp0(key, "adv_id"))
2263 g_variant_get(var, "u", &(service.adv_id));
2264 else if (!g_strcmp0(key, "discovery_tech"))
2265 g_variant_get(var, "i", &(service.discovery_tech));
2266 else if (!g_strcmp0(key, "preferred_connection"))
2267 g_variant_get(var, "y", &(service.preferred_connection));
2268 else if (!g_strcmp0(key, "auto_accept"))
2269 g_variant_get(var, "i", &(service.auto_accept));
2270 else if (!g_strcmp0(key, "status"))
2271 g_variant_get(var, "y", &(service.status));
2272 else if (!g_strcmp0(key, "role"))
2273 g_variant_get(var, "y", &(service.role));
2274 else if (!g_strcmp0(key, "replace"))
2275 g_variant_get(var, "i", &(replace));
2276 else if (!g_strcmp0(key, "config_method"))
2277 g_variant_get(var, "u", &(service.config_method));
2278 else if (!g_strcmp0(key, "instance_name"))
2279 g_variant_get(var, "&s", &(service.instance_name));
2280 else if (!g_strcmp0(key, "service_type"))
2281 g_variant_get(var, "&s", &(service.service_type));
2282 else if (!g_strcmp0(key, "service_info"))
2283 __g_variant_to_txt_record(var, &(service.service_info));
2284 else if (!g_strcmp0(key, "rsp_info"))
2285 g_variant_get(var, "&s", &(service.rsp_info));
2290 ret = wfd_oem_advertise_service(manager->oem_ops, &service, replace);
2292 WDS_LOGE("Failed to add service");
2293 g_free(service.service_info);
2294 g_variant_iter_free(iter);
2295 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2298 g_free(service.service_info);
2299 g_variant_iter_free(iter);
2301 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
2302 WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
2306 ret = wfd_manager_start_discovery(manager, WFD_OEM_SCAN_MODE_PASSIVE, 0, 0, 0);
2307 if (ret == WIFI_DIRECT_ERROR_NONE) {
2308 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2312 wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
2313 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2317 ret = WIFI_DIRECT_ERROR_NONE;
2318 return_parameters = g_variant_new("(i)", ret);
2321 } else if (!g_strcmp0(method_name, "CancelAdvertiseService")) {
2323 wfd_oem_asp_service_s service;
2324 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2326 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2327 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2331 g_variant_get(parameters, "(u)", &(service.adv_id));
2332 ret = wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
2334 WDS_LOGE("Failed to del service");
2335 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2339 ret = WIFI_DIRECT_ERROR_NONE;
2340 return_parameters = g_variant_new("(i)", ret);
2343 } else if (!g_strcmp0(method_name, "SeekService")) {
2345 wfd_oem_asp_service_s service;
2346 GVariantIter *iter = NULL;
2348 GVariant *var = NULL;
2350 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2351 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2352 manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
2353 WDS_LOGE("Wi-Fi Direct is not available status to Seek.");
2354 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2358 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2359 g_variant_get(parameters, "(a{sv})", &iter);
2360 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2361 if (!g_strcmp0(key, "discovery_tech"))
2362 g_variant_get(var, "i", &(service.discovery_tech));
2363 else if (!g_strcmp0(key, "search_id"))
2364 g_variant_get(var, "t", &(service.asp_search_id));
2365 else if (!g_strcmp0(key, "preferred_connection"))
2366 g_variant_get(var, "y", &(service.preferred_connection));
2367 else if (!g_strcmp0(key, "service_type"))
2368 g_variant_get(var, "&s", &(service.service_type));
2369 else if (!g_strcmp0(key, "service_info"))
2370 __g_variant_to_seek_info(var, &(service.service_info));
2375 ret = wfd_oem_seek_service(manager->oem_ops, &service);
2377 WDS_LOGE("Failed to seek service");
2378 g_free(service.service_info);
2379 g_variant_iter_free(iter);
2380 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2383 g_free(service.service_info);
2384 g_variant_iter_free(iter);
2386 WDS_LOGD("search_id [%x]", service.search_id);
2388 ret = wfd_manager_start_discovery(manager, WFD_OEM_SCAN_MODE_ACTIVE, 0, 0, 0);
2389 if (ret == WIFI_DIRECT_ERROR_NONE) {
2390 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2394 wfd_oem_cancel_seek_service(manager->oem_ops, &service);
2395 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2399 ret = WIFI_DIRECT_ERROR_NONE;
2400 return_parameters = g_variant_new("(i)", ret);
2403 } else if (!g_strcmp0(method_name, "CancelSeekService")) {
2405 wfd_oem_asp_service_s service;
2406 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2408 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2409 WDS_LOGE("Wi-Fi Direct is not activated.");
2410 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2414 g_variant_get(parameters, "(t)", &(service.asp_search_id));
2415 ret = wfd_oem_cancel_seek_service(manager->oem_ops, &service);
2417 WDS_LOGE("Failed to cancel seek service");
2418 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2422 ret = WIFI_DIRECT_ERROR_NONE;
2423 return_parameters = g_variant_new("(i)", ret);
2425 } else if (!g_strcmp0(method_name, "ConnectSession")) {
2427 GVariantIter *iter = NULL;
2429 GVariant *var = NULL;
2430 wfd_oem_asp_prov_s prov_params;
2431 const char *mac_str = NULL;
2432 unsigned char role = 0;
2433 unsigned int config = 0;
2436 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2437 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2438 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
2439 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2443 memset(&prov_params, 0, sizeof(wfd_oem_asp_prov_s));
2445 g_variant_get(parameters, "(a{sv})", &iter);
2446 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2448 if (!g_strcmp0(key, "service_mac")) {
2449 g_variant_get(var, "&s", &mac_str);
2450 if (mac_str == NULL) {
2451 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2452 g_variant_iter_free(iter);
2455 macaddr_atoe(mac_str, prov_params.service_mac);
2456 } else if (!g_strcmp0(key, "adv_id")) {
2457 g_variant_get(var, "u", &(prov_params.adv_id));
2458 } else if (!g_strcmp0(key, "session_mac")) {
2459 g_variant_get(var, "&s", &mac_str);
2460 if (mac_str == NULL) {
2461 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2462 g_variant_iter_free(iter);
2465 macaddr_atoe(mac_str, prov_params.session_mac);
2466 } else if (!g_strcmp0(key, "session_id")) {
2467 g_variant_get(var, "u", &(prov_params.session_id));
2468 } else if (!g_strcmp0(key, "role")) {
2469 g_variant_get(var, "y", &(role));
2470 prov_params.network_role = (int)role;
2471 } else if (!g_strcmp0(key, "config_method")) {
2472 g_variant_get(var, "u", &(config));
2473 prov_params.network_config = (int)config;
2474 } else if (!g_strcmp0(key, "session_info")) {
2475 g_variant_get(var, "&s", &(prov_params.session_information));
2481 if (ISZEROMACADDR(prov_params.service_mac) ||
2482 ISZEROMACADDR(prov_params.session_mac)) {
2483 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2484 g_variant_iter_free(iter);
2488 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2490 wfd_asp_connect_status(prov_params.session_mac,
2491 prov_params.session_id,
2492 ASP_CONNECT_STATUS_REQUEST_SENT,
2495 wfd_group_s *group = (wfd_group_s*) manager->group;
2496 if (group && group->member_count >= manager->max_station) {
2498 status = ASP_CONNECT_STATUS_NOMORE_CONNECT;
2499 wfd_asp_connect_status(prov_params.session_mac,
2500 prov_params.session_id,
2503 g_variant_iter_free(iter);
2504 __WDS_LOG_FUNC_EXIT__;
2508 ret = wfd_manager_asp_connect_session(manager, &prov_params);
2509 if (ret == WIFI_DIRECT_ERROR_NONE) {
2510 char peer_mac_address[MACSTR_LEN] = {0,};
2511 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(prov_params.service_mac));
2512 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2514 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
2515 WFD_EVENT_CONNECTION_IN_PROGRESS,
2518 wfd_asp_connect_status(prov_params.session_mac,
2519 prov_params.session_id,
2520 ASP_CONNECT_STATUS_REQUEST_FAILED,
2523 g_variant_iter_free(iter);
2524 __WDS_LOG_FUNC_EXIT__;
2527 } else if (!g_strcmp0(method_name, "ConfirmSession")) {
2529 GVariantIter *iter = NULL;
2531 GVariant *var = NULL;
2532 wfd_oem_asp_prov_s prov_params;
2533 const char *mac_str = NULL;
2534 const char *pin = NULL;
2537 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
2538 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2542 memset(&prov_params, 0, sizeof(wfd_oem_asp_prov_s));
2544 g_variant_get(parameters, "(a{sv})", &iter);
2545 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2547 if (!g_strcmp0(key, "service_mac")) {
2548 g_variant_get(var, "&s", &mac_str);
2549 if (mac_str == NULL) {
2550 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2551 g_variant_iter_free(iter);
2554 macaddr_atoe(mac_str, prov_params.service_mac);
2555 } else if (!g_strcmp0(key, "adv_id")) {
2556 g_variant_get(var, "u", &(prov_params.adv_id));
2557 } else if (!g_strcmp0(key, "session_mac")) {
2558 g_variant_get(var, "&s", &mac_str);
2559 if (mac_str == NULL) {
2560 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2561 g_variant_iter_free(iter);
2564 macaddr_atoe(mac_str, prov_params.session_mac);
2565 } else if (!g_strcmp0(key, "session_id")) {
2566 g_variant_get(var, "u", &(prov_params.session_id));
2567 } else if (!g_strcmp0(key, "confirm")) {
2568 g_variant_get(var, "i", &(confirmed));
2569 } else if (!g_strcmp0(key, "pin")) {
2570 g_variant_get(var, "&s", &(pin));
2571 g_strlcpy(prov_params.wps_pin, pin, PINSTR_LEN);
2577 if (ISZEROMACADDR(prov_params.session_mac)) {
2578 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2579 g_variant_iter_free(iter);
2583 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2585 ret = wfd_manager_asp_confirm_session(manager, &prov_params, confirmed);
2586 if (ret == WIFI_DIRECT_ERROR_NONE && confirmed > 0) {
2587 char peer_mac_address[MACSTR_LEN] = {0,};
2588 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(prov_params.service_mac));
2589 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2591 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
2592 WFD_EVENT_CONNECTION_IN_PROGRESS,
2594 wfd_asp_connect_status(prov_params.session_mac,
2595 prov_params.session_id,
2596 ASP_CONNECT_STATUS_REQUEST_ACCEPTED,
2599 wfd_asp_connect_status(prov_params.session_mac,
2600 prov_params.session_id,
2601 ASP_CONNECT_STATUS_REQUEST_FAILED,
2604 g_variant_iter_free(iter);
2605 __WDS_LOG_FUNC_EXIT__;
2610 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
2611 __WDS_LOG_FUNC_EXIT__;
2615 wfd_error_set_gerror(ret, &err);
2616 g_dbus_method_invocation_return_gerror(invocation, err);
2617 g_clear_error(&err);
2618 __WDS_LOG_FUNC_EXIT__;
2625 const gchar *iface_name;
2626 void (*function) (const gchar *method_name,
2627 GVariant *parameters,
2628 GDBusMethodInvocation *invocation);
2629 } wfd_manager_iface_map[] = {
2632 WFD_MANAGER_MANAGE_INTERFACE,
2633 __wfd_manager_manage_iface_handler
2637 WFD_MANAGER_GROUP_INTERFACE,
2638 __wfd_manager_group_iface_handler
2642 WFD_MANAGER_CONFIG_INTERFACE,
2643 __wfd_manager_config_iface_handler
2645 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
2648 WFD_MANAGER_SERVICE_INTERFACE,
2649 __wfd_manager_service_iface_handler
2651 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
2652 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
2655 WFD_MANAGER_DISPLAY_INTERFACE,
2656 __wfd_manager_display_iface_handler
2658 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
2659 #if defined(TIZEN_FEATURE_ASP)
2662 WFD_MANAGER_ASP_INTERFACE,
2663 __wfd_manager_asp_iface_handler
2673 /* GDBus method handler */
2674 static void wfd_manager_method_call_handler (GDBusConnection *connection,
2675 const gchar *sender,
2676 const gchar *object_path,
2677 const gchar *interface_name,
2678 const gchar *method_name,
2679 GVariant *parameters,
2680 GDBusMethodInvocation *invocation,
2685 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
2686 if (!g_strcmp0(method_name, "AddClient"))
2687 wfd_manager_add_active_client(sender);
2688 #endif /* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
2691 WDS_LOGD("interface : [%s], method : [%s]", interface_name, method_name);
2692 DBUS_DEBUG_VARIANT(parameters);
2694 while (wfd_manager_iface_map[count].iface_name != NULL) {
2695 if (!g_strcmp0(interface_name, wfd_manager_iface_map[count].iface_name)) {
2697 wfd_manager_iface_map[count].function(method_name,
2706 static const GDBusInterfaceVTable wfd_manager_interface_vtable = {
2707 wfd_manager_method_call_handler, NULL, NULL};
2709 void wfd_manager_dbus_unregister(void)
2713 wfd_error_deregister();
2715 while (wfd_manager_iface_map[count].iface_name != NULL) {
2716 wfd_manager_dbus_iface_unregister(wfd_manager_iface_map[count].reg_id);
2721 gboolean wfd_manager_dbus_register(void)
2723 GDBusNodeInfo *node_info = NULL;
2724 GError *Error = NULL;
2727 wfd_error_register();
2729 node_info = g_dbus_node_info_new_for_xml(wfd_manager_introspection_xml, &Error);
2730 if (node_info == NULL) {
2731 WDS_LOGE("Failed to get node info, Error: %s", Error->message);
2732 g_clear_error(&Error);
2736 while (wfd_manager_iface_map[count].iface_name != NULL) {
2737 wfd_manager_iface_map[count].reg_id =
2738 wfd_manager_dbus_iface_register(wfd_manager_iface_map[count].iface_name,
2741 &wfd_manager_interface_vtable);
2743 WDS_LOGD("Registered Interface [%d, %s]",
2744 wfd_manager_iface_map[count].reg_id,
2745 wfd_manager_iface_map[count].iface_name);
2750 g_dbus_node_info_unref(node_info);