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'/>"
330 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
331 "<interface name='net.wifidirect.service'>"
332 "<method name='StartDiscovery'>"
333 "<arg type='i' name='service_type' direction='in'/>"
334 "<arg type='s' name='mac_addr' direction='in'/>"
335 "<arg type='i' name='error_code' direction='out'/>"
337 "<method name='StopDiscovery'>"
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='Register'>"
343 "<arg type='i' name='service_type' direction='in'/>"
344 "<arg type='s' name='info_string' direction='in'/>"
345 "<arg type='i' name='error_code' direction='out'/>"
346 "<arg type='i' name='service_id' direction='out'/>"
348 "<method name='Deregister'>"
349 "<arg type='i' name='service_id' direction='in'/>"
350 "<arg type='i' name='error_code' direction='out'/>"
352 "<signal name='DiscoveryStarted'>"
354 "<signal name='DiscoveryFound'>"
355 "<arg type='i' name='service_type'/>"
356 "<arg type='s' name='response_data'/>"
357 "<arg type='s' name='peer_mac_address'/>"
359 "<signal name='DiscoveryFinished'>"
362 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
363 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
364 "<interface name='net.wifidirect.display'>"
365 "<method name='Init'>"
366 "<arg type='i' name='error_code' direction='out'/>"
368 "<method name='Deinit'>"
369 "<arg type='i' name='error_code' direction='out'/>"
371 "<method name='SetConfig'>"
372 "<arg type='i' name='type' direction='in'/>"
373 "<arg type='i' name='port' direction='in'/>"
374 "<arg type='i' name='hdcp' direction='in'/>"
375 "<arg type='i' name='error_code' direction='out'/>"
377 "<method name='SetAvailiability'>"
378 "<arg type='i' name='availability' direction='in'/>"
379 "<arg type='i' name='error_code' direction='out'/>"
381 "<method name='GetPeerType'>"
382 "<arg type='s' name='peer_mac_addr' direction='in'/>"
383 "<arg type='i' name='error_code' direction='out'/>"
384 "<arg type='i' name='result' direction='out'/>"
386 "<method name='GetPeerAvailability'>"
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='GetPeerHdcp'>"
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='GetPeerPort'>"
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='GetPeerThroughput'>"
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'/>"
407 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
408 #if defined(TIZEN_FEATURE_ASP)
409 "<interface name='net.wifidirect.asp'>"
410 "<method name='AdvertiseService'>"
411 "<arg type='a{sv}' name='parameters' direction='in'/>"
412 "<arg type='i' name='result' direction='out'/>"
414 "<method name='CancelAdvertiseService'>"
415 "<arg type='u' name='adv_id' direction='in'/>"
416 "<arg type='i' name='result' direction='out'/>"
418 "<method name='SeekService'>"
419 "<arg type='a{sv}' name='parameters' direction='in'/>"
420 "<arg type='i' name='result' direction='out'/>"
421 "<arg type='t' name='search_id' direction='out'/>"
423 "<method name='CancelSeekService'>"
424 "<arg type='t' name='search_id' direction='in'/>"
425 "<arg type='i' name='result' direction='out'/>"
427 "<method name='ConnectSession'>"
428 "<arg type='a{sv}' name='parameters' direction='in'/>"
429 "<arg type='i' name='result' direction='out'/>"
431 "<method name='ConfirmSession'>"
432 "<arg type='a{sv}' name='parameters' direction='in'/>"
433 "<arg type='i' name='result' direction='out'/>"
435 "<signal name='SearchResult'>"
436 "<arg type='a{sv}' name='parameters'/>"
438 "<signal name='SessionRequest'>"
439 "<arg type='a{sv}' name='parameters'/>"
441 "<signal name='SessionConfigRequest'>"
442 "<arg type='a{sv}' name='parameters'/>"
444 "<signal name='ConnectStatus'>"
445 "<arg type='a{sv}' name='parameters'/>"
447 "<signal name='SessionStatus'>"
448 "<arg type='a{sv}' name='parameters'/>"
450 "<signal name='SessionPeerIPAssigned'>"
451 "<arg type='a{sv}' name='parameters'/>"
459 static void __wfd_manager_manage_iface_handler(const gchar *method_name,
460 GVariant *parameters,
461 GDBusMethodInvocation *invocation)
463 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
464 wfd_manager_s *manager = wfd_get_manager();
465 GVariant *return_parameters = NULL;
467 gchar* dbus_error_name = NULL;
468 WDS_LOGD("%s", method_name);
470 if (!g_strcmp0(method_name, "Activate")) {
472 WFD_DBUS_REPLY_ERROR_NONE(invocation);
474 ret = wfd_manager_activate(manager);
475 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
477 g_variant_new("(i)", ret));
479 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
480 } else if (!g_strcmp0(method_name, "AddClient")) {
481 return_parameters = g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE);
483 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
484 } else if (!g_strcmp0(method_name, "Deactivate")) {
486 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
487 WDS_LOGE("Already deactivated");
488 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
492 WFD_DBUS_REPLY_ERROR_NONE(invocation);
494 ret = wfd_manager_deactivate(manager);
495 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
497 g_variant_new("(i)", ret));
500 } else if (!g_strcmp0(method_name, "StartDiscovery")) {
501 gboolean mode = FALSE;
504 const gchar *type = NULL;
505 GVariantIter *iter = NULL;
507 GVariant *var = NULL;
509 g_variant_get(parameters, "(a{sv})", &iter);
510 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
511 if (!g_strcmp0(key, "Mode"))
512 g_variant_get(var, "b", &mode);
513 else if (!g_strcmp0(key, "Timeout"))
514 g_variant_get(var, "i", &timeout);
515 else if (!g_strcmp0(key, "Type"))
516 g_variant_get(var, "&s", &type);
517 else if (!g_strcmp0(key, "Channel"))
518 g_variant_get(var, "i", &channel);
522 g_variant_iter_free(iter);
524 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
525 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
526 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
527 WDS_LOGE("Wi-Fi Direct is not available status for scanning.");
528 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
532 if (mode && (manager->local->dev_role == WFD_DEV_ROLE_GO)) {
533 WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
534 ret = WIFI_DIRECT_ERROR_NONE;
535 return_parameters = g_variant_new("(i)", ret);
539 WFD_DBUS_REPLY_ERROR_NONE(invocation);
541 ret = wfd_manager_start_discovery(manager, mode, timeout, type, channel);
542 if (ret == WIFI_DIRECT_ERROR_NONE) {
543 if (mode == WFD_OEM_SCAN_MODE_PASSIVE) {
544 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
548 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
555 } else if (!g_strcmp0(method_name, "StopDiscovery")) {
556 int mode = manager->scan_mode;
557 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
558 manager->state != WIFI_DIRECT_STATE_DISCOVERING) {
559 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
563 WFD_DBUS_REPLY_ERROR_NONE(invocation);
565 ret = wfd_manager_cancel_discovery(manager);
566 if (ret == WIFI_DIRECT_ERROR_NONE && mode == WFD_SCAN_MODE_PASSIVE)
567 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
568 "DiscoveryFinished", NULL);
571 } else if (!g_strcmp0(method_name, "GetDiscoveredPeers")) {
572 wfd_discovery_entry_s *peers = NULL;
573 GVariantBuilder *builder_peers = NULL;
577 builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
579 peer_cnt = wfd_manager_get_peers(manager, &peers);
580 WDS_LOGD("Peer count [%d], Peer list [%p]", peer_cnt, peers);
582 WDS_LOGE("Failed to get scan result");
583 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
590 for (i = 0; i < peer_cnt; i++) {
591 GVariantBuilder builder_peer;
592 g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
594 g_variant_builder_add(&builder_peer, "{sv}",
596 g_variant_new_string(peers[i].device_name));
597 g_variant_builder_add(&builder_peer, "{sv}",
599 wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
600 g_variant_builder_add(&builder_peer, "{sv}",
602 wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
603 g_variant_builder_add(&builder_peer, "{sv}",
605 g_variant_new_uint16(peers[i].channel));
606 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
607 g_variant_builder_add(&builder_peer, "{sv}",
609 g_variant_new_uint16(peers[i].services));
610 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
611 g_variant_builder_add(&builder_peer, "{sv}",
613 g_variant_new_boolean(peers[i].is_group_owner));
614 g_variant_builder_add(&builder_peer, "{sv}",
616 g_variant_new_boolean(peers[i].is_persistent_go));
617 g_variant_builder_add(&builder_peer, "{sv}",
619 g_variant_new_boolean(peers[i].is_connected));
620 g_variant_builder_add(&builder_peer, "{sv}",
622 g_variant_new_uint16(peers[i].wps_device_pwd_id));
623 g_variant_builder_add(&builder_peer, "{sv}",
625 g_variant_new_uint16(peers[i].wps_cfg_methods));
626 g_variant_builder_add(&builder_peer, "{sv}",
628 g_variant_new_uint16(peers[i].category));
629 g_variant_builder_add(&builder_peer, "{sv}",
631 g_variant_new_uint16(peers[i].subcategory));
632 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
633 g_variant_builder_add(&builder_peer, "{sv}",
635 g_variant_new_boolean(peers[i].is_wfd_device));
636 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
638 WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
639 g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
642 ret = WIFI_DIRECT_ERROR_NONE;
643 return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
644 g_variant_builder_unref(builder_peers);
647 } else if (!g_strcmp0(method_name, "Connect")) {
648 const char *peer_mac_address = NULL;
649 unsigned char mac_addr[MACADDR_LEN] = {0, };
651 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
652 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
653 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
654 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
658 wfd_group_s *group = (wfd_group_s*) manager->group;
659 if (group && group->member_count >= manager->max_station) {
660 ret = WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
664 WFD_DBUS_REPLY_ERROR_NONE(invocation);
666 g_variant_get(parameters, "(&s)", &peer_mac_address);
667 macaddr_atoe(peer_mac_address, mac_addr);
669 ret = wfd_manager_connect(manager, mac_addr);
670 if (ret == WIFI_DIRECT_ERROR_NONE)
671 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
673 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
674 WFD_EVENT_CONNECTION_IN_PROGRESS,
678 } else if (!g_strcmp0(method_name, "Disconnect")) {
679 const char *peer_mac_address = NULL;
680 unsigned char mac_addr[MACADDR_LEN] = {0, };
682 if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
683 if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
684 ret = wfd_oem_stop_scan(manager->oem_ops);
686 WDS_LOGE("Failed to stop scan");
687 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
690 WDS_LOGI("Succeeded to stop scan");
691 if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
692 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
693 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
695 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
696 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
699 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
704 WFD_DBUS_REPLY_ERROR_NONE(invocation);
706 g_variant_get(parameters, "(&s)", &peer_mac_address);
707 macaddr_atoe(peer_mac_address, mac_addr);
709 ret = wfd_manager_disconnect(manager, mac_addr);
710 if (ret == WIFI_DIRECT_ERROR_NONE)
711 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
713 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
714 WFD_EVENT_DISCONNECTION_RSP,
718 } else if (!g_strcmp0(method_name, "CancelConnection")) {
719 const char *peer_mac_address = NULL;
720 unsigned char mac_addr[MACADDR_LEN] = {0, };
722 if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
723 WDS_LOGE("It's not CONNECTING state");
724 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
728 WFD_DBUS_REPLY_ERROR_NONE(invocation);
730 g_variant_get(parameters, "(&s)", &peer_mac_address);
731 macaddr_atoe(peer_mac_address, mac_addr);
733 ret = wfd_manager_cancel_connection(manager, mac_addr);
734 if (ret == WIFI_DIRECT_ERROR_NONE)
735 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
737 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
738 WFD_EVENT_CONNECTION_RSP,
742 } else if (!g_strcmp0(method_name, "AcceptConnection")) {
743 const char *peer_mac_address = NULL;
744 unsigned char mac_addr[MACADDR_LEN] = {0, };
746 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
747 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
751 wfd_group_s *group = (wfd_group_s*) manager->group;
752 if (group && group->member_count >= manager->max_station) {
753 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
757 WFD_DBUS_REPLY_ERROR_NONE(invocation);
759 g_variant_get(parameters, "(&s)", &peer_mac_address);
760 macaddr_atoe(peer_mac_address, mac_addr);
762 ret = wfd_manager_accept_connection(manager, mac_addr);
763 if (ret == WIFI_DIRECT_ERROR_NONE) {
764 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
766 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
767 WFD_EVENT_CONNECTION_IN_PROGRESS,
770 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
772 g_variant_new("(iis)", WIFI_DIRECT_ERROR_OPERATION_FAILED,
773 WFD_EVENT_CONNECTION_RSP,
778 } else if (!g_strcmp0(method_name, "RejectConnection")) {
779 wfd_session_s *session = manager->session;
780 const char *peer_mac_address = NULL;
781 unsigned char mac_addr[MACADDR_LEN] = {0, };
783 if (!session || manager->state != WIFI_DIRECT_STATE_CONNECTING) {
784 WDS_LOGE("It's not permitted with this state [%d]", manager->state);
785 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
789 if (session->direction != SESSION_DIRECTION_INCOMING) {
790 WDS_LOGE("Only incomming session can be rejected");
791 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
795 WFD_DBUS_REPLY_ERROR_NONE(invocation);
797 g_variant_get(parameters, "(&s)", &peer_mac_address);
798 macaddr_atoe(peer_mac_address, mac_addr);
800 ret = wfd_manager_reject_connection(manager, mac_addr);
801 if (ret == WIFI_DIRECT_ERROR_NONE)
802 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
804 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
805 WFD_EVENT_CONNECTION_RSP,
809 } else if (!g_strcmp0(method_name, "DisconnectAll")) {
811 if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
812 if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
813 ret = wfd_oem_stop_scan(manager->oem_ops);
815 WDS_LOGE("Failed to stop scan");
816 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
819 WDS_LOGI("Succeeded to stop scan");
820 if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
821 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
822 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
824 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
825 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
828 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
833 WFD_DBUS_REPLY_ERROR_NONE(invocation);
835 ret = wfd_manager_disconnect_all(manager);
836 if (ret == WIFI_DIRECT_ERROR_NONE)
837 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
839 g_variant_new("(iis)", ret,
840 WFD_EVENT_DISCONNECTION_RSP,
844 } else if (!g_strcmp0(method_name, "GetConnectedPeers")) {
845 wfd_connected_peer_info_s *peers = NULL;
846 GVariantBuilder *builder_peers = NULL;
850 builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
852 /* even though status is not CONNECTED,
853 * this command can be excuted only when group exist */
854 if (!manager->group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
855 WDS_LOGD("It's not connected state [%d]", manager->state);
856 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
860 peer_cnt = wfd_manager_get_connected_peers(manager, &peers);
861 WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
863 WDS_LOGE("Failed to get scan result");
864 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
868 for (i = 0; i < peer_cnt; i++) {
869 GVariantBuilder builder_peer;
870 g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
872 g_variant_builder_add(&builder_peer, "{sv}",
874 g_variant_new_string(peers[i].device_name));
875 g_variant_builder_add(&builder_peer, "{sv}",
877 wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
878 g_variant_builder_add(&builder_peer, "{sv}",
880 wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
881 g_variant_builder_add(&builder_peer, "{sv}",
883 wfd_manager_dbus_pack_ay(peers[i].ip_address, IPADDR_LEN));
884 g_variant_builder_add(&builder_peer, "{sv}",
886 g_variant_new_uint16(peers[i].channel));
887 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
888 g_variant_builder_add(&builder_peer, "{sv}",
890 g_variant_new_uint16(peers[i].services));
891 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
892 g_variant_builder_add(&builder_peer, "{sv}",
894 g_variant_new_uint16(peers[i].category));
895 g_variant_builder_add(&builder_peer, "{sv}",
897 g_variant_new_uint16(peers[i].subcategory));
898 g_variant_builder_add(&builder_peer, "{sv}",
900 g_variant_new_boolean(peers[i].is_p2p));
901 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
902 g_variant_builder_add(&builder_peer, "{sv}",
904 g_variant_new_boolean(peers[i].is_wfd_device));
905 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
907 WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
908 g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
911 ret = WIFI_DIRECT_ERROR_NONE;
912 return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
913 g_variant_builder_unref(builder_peers);
916 } else if (!g_strcmp0(method_name, "IsDiscoverable")) {
917 ret = WIFI_DIRECT_ERROR_NONE;
918 return_parameters = g_variant_new("(b)",
919 (manager->state == WIFI_DIRECT_STATE_DISCOVERING ||
920 wfd_group_is_autonomous(manager->group) == TRUE));
923 } else if (!g_strcmp0(method_name, "IsListeningOnly")) {
924 ret = WIFI_DIRECT_ERROR_NONE;
925 return_parameters = g_variant_new("(b)", (manager->scan_mode == WFD_SCAN_MODE_PASSIVE));
928 } else if (!g_strcmp0(method_name, "GetPeerInfo")) {
929 wfd_discovery_entry_s *peer = NULL;
930 GVariantBuilder *builder_peer = NULL;
931 const char *peer_mac_address = NULL;
932 unsigned char mac_addr[MACADDR_LEN] = {0, };
934 g_variant_get(parameters, "(&s)", &peer_mac_address);
935 macaddr_atoe(peer_mac_address, mac_addr);
937 builder_peer = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
939 ret = wfd_manager_get_peer_info(manager, mac_addr, &peer);
940 if (ret < 0 || !peer) {
941 WDS_LOGE("Failed to get peer info");
943 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
947 g_variant_builder_add(builder_peer, "{sv}",
949 g_variant_new_string(peer->device_name));
950 g_variant_builder_add(builder_peer, "{sv}",
952 wfd_manager_dbus_pack_ay(peer->mac_address, MACADDR_LEN));
953 g_variant_builder_add(builder_peer, "{sv}",
955 wfd_manager_dbus_pack_ay(peer->intf_address, MACADDR_LEN));
956 g_variant_builder_add(builder_peer, "{sv}",
958 g_variant_new_uint16(peer->channel));
959 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
960 g_variant_builder_add(builder_peer, "{sv}",
962 g_variant_new_uint16(peer->services));
963 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
964 g_variant_builder_add(builder_peer, "{sv}",
966 g_variant_new_boolean(peer->is_group_owner));
967 g_variant_builder_add(builder_peer, "{sv}",
969 g_variant_new_boolean(peer->is_persistent_go));
970 g_variant_builder_add(builder_peer, "{sv}",
972 g_variant_new_boolean(peer->is_connected));
973 g_variant_builder_add(builder_peer, "{sv}",
975 g_variant_new_uint16(peer->wps_device_pwd_id));
976 g_variant_builder_add(builder_peer, "{sv}",
978 g_variant_new_uint16(peer->wps_cfg_methods));
979 g_variant_builder_add(builder_peer, "{sv}",
981 g_variant_new_uint16(peer->category));
982 g_variant_builder_add(builder_peer, "{sv}",
984 g_variant_new_uint16(peer->subcategory));
985 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
986 g_variant_builder_add(builder_peer, "{sv}",
988 g_variant_new_boolean(peer->is_wfd_device));
989 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
990 #ifdef TIZEN_FEATURE_ASP
991 wfd_device_s *connected_peer = NULL;
992 connected_peer = wfd_group_find_member_by_addr(manager->group, mac_addr);
993 if (connected_peer) {
994 g_variant_builder_add(builder_peer, "{sv}",
996 g_variant_new_boolean(true));
997 g_variant_builder_add(builder_peer, "{sv}",
999 wfd_manager_dbus_pack_ay(connected_peer->ip_addr, IPADDR_LEN));
1001 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
1003 ret = WIFI_DIRECT_ERROR_NONE;
1004 return_parameters = g_variant_new("(ia{sv})", ret, builder_peer);
1005 g_variant_builder_unref(builder_peer);
1009 } else if (!g_strcmp0(method_name, "GetState")) {
1010 ret = WIFI_DIRECT_ERROR_NONE;
1011 return_parameters = g_variant_new("(ii)", ret, manager->state);
1015 WDS_LOGD("method not handled");
1016 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1021 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1026 /*g_dbus_method_invocation_return_dbus_error
1027 * (invocation, WFD_MANAGER_SERVICE ".Error", ".OperationFailed"); */
1029 wfd_error_set_gerror(ret, &err);
1030 dbus_error_name = g_dbus_error_encode_gerror(err);
1031 WDS_LOGD("g_dbus_method_invocation_return_gerror with [%s]", dbus_error_name);
1032 g_free(dbus_error_name);
1033 g_dbus_method_invocation_return_gerror(invocation, err);
1034 g_clear_error(&err);
1038 static void __wfd_manager_group_iface_handler(const gchar *method_name,
1039 GVariant *parameters,
1040 GDBusMethodInvocation *invocation)
1042 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1043 wfd_manager_s *manager = wfd_get_manager();
1044 GVariant *return_parameters = NULL;
1046 WDS_LOGD("%s", method_name);
1048 if (!g_strcmp0(method_name, "CreateGroup")) {
1049 wfd_group_s *group = manager->group;
1050 wfd_oem_group_param_s param;
1052 if (group || manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1053 WDS_LOGE("Group already exist or not a proper state");
1054 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1058 #ifdef TIZEN_WLAN_BOARD_SPRD
1059 group = wfd_create_pending_group(manager, manager->local->dev_addr);
1061 group = wfd_create_pending_group(manager, manager->local->intf_addr);
1064 WDS_LOGE("Failed to create pending group");
1065 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1068 group->flags |= WFD_GROUP_FLAG_AUTONOMOUS;
1069 manager->group = group;
1071 memset(¶m, 0x0, sizeof(param));
1073 param.persistent = (manager->local->group_flags &
1074 WFD_GROUP_FLAG_PERSISTENT);
1075 memcpy(&(param.passphrase), manager->local->passphrase,
1076 sizeof(param.passphrase));
1078 #ifndef TIZEN_WLAN_BOARD_SPRD
1079 param.freq = WFD_FREQ_2G;
1082 ret = wfd_oem_create_group(manager->oem_ops, ¶m);
1084 WDS_LOGE("Failed to create group");
1085 wfd_destroy_group(manager);
1086 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1090 WDS_LOGD("Succeeded to create pending group");
1091 memset(manager->local->passphrase, 0x0, PASSPHRASE_LEN_MAX + 1);
1092 ret = WIFI_DIRECT_ERROR_NONE;
1093 return_parameters = g_variant_new("(i)", ret);
1096 } else if (!g_strcmp0(method_name, "DestroyGroup")) {
1097 wfd_group_s *group = manager->group;
1099 WDS_LOGE("Group not exist");
1100 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1104 if (group->pending == FALSE) {
1105 ret = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1107 WDS_LOGE("Failed to destroy group");
1108 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1113 ret = wfd_destroy_group(manager);
1115 WDS_LOGE("Failed to destroy group");
1117 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1118 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1120 WFD_DBUS_REPLY_ERROR_NONE(invocation);
1122 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
1126 } else if (!g_strcmp0(method_name, "IsGroupOwner")) {
1128 wfd_device_s *local = manager->local;
1129 result = local->dev_role == WFD_DEV_ROLE_GO;
1130 WDS_LOGI("Is group owner : [%s]", result ? "Yes" : "No");
1131 return_parameters = g_variant_new("(b)", result);
1134 } else if (!g_strcmp0(method_name, "IsAutoGroup")) {
1136 if ((result = wfd_group_is_autonomous(manager->group)) < 0)
1139 WDS_LOGI("Is autonomous group : [%s]", result ? "Yes" : "No");
1140 return_parameters = g_variant_new("(b)", result);
1143 } else if (!g_strcmp0(method_name, "ActivatePushButton")) {
1144 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
1145 WDS_LOGE("Wi-Fi Direct is not Group Owner.");
1146 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1150 ret = wfd_oem_wps_start(manager->oem_ops, NULL,
1151 WFD_WPS_MODE_PBC, NULL);
1153 WDS_LOGE("Failed to start wps");
1154 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1157 return_parameters = g_variant_new("(i)", ret);
1160 } else if (!g_strcmp0(method_name, "GetPersistentGroups")) {
1161 int persistent_group_count = 0;
1162 wfd_persistent_group_info_s *plist;
1163 GVariantBuilder *builder_groups = NULL;
1166 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1167 WDS_LOGE("Wi-Fi Direct is not activated.");
1168 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1173 ret = wfd_oem_get_persistent_groups(manager->oem_ops,
1174 (wfd_oem_persistent_group_s**) &plist, &persistent_group_count);
1176 WDS_LOGE("Error!! wfd_oem_get_persistent_group_info() failed..");
1177 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1181 builder_groups = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
1183 for (i = 0; i < persistent_group_count; i++) {
1184 GVariantBuilder builder_group;
1185 g_variant_builder_init(&builder_group, G_VARIANT_TYPE("a{sv}"));
1187 g_variant_builder_add(&builder_group, "{sv}",
1189 g_variant_new_uint32(plist[i].network_id));
1190 g_variant_builder_add(&builder_group, "{sv}",
1192 g_variant_new_string(plist[i].ssid));
1193 g_variant_builder_add(&builder_group, "{sv}",
1195 wfd_manager_dbus_pack_ay(plist[i].go_mac_address, MACADDR_LEN));
1197 WDS_LOGD("%dth peer [%s]", i, plist[i].ssid);
1198 g_variant_builder_add_value(builder_groups, g_variant_builder_end(&builder_group));
1201 ret = WIFI_DIRECT_ERROR_NONE;
1202 return_parameters = g_variant_new("(iaa{sv})", ret, builder_groups);
1203 g_variant_builder_unref(builder_groups);
1206 } else if (!g_strcmp0(method_name, "RemovePersistentGroup")) {
1209 unsigned char go_mac_address[6];
1210 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1211 WDS_LOGE("Wi-Fi Direct is not activated.");
1212 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1216 g_variant_get(parameters, "(&s&s)", &mac_address, &ssid);
1217 macaddr_atoe(mac_address, go_mac_address);
1218 WDS_LOGD("Remove persistent group [%s][" MACSTR "]", ssid, MAC2STR(go_mac_address));
1220 ret = wfd_oem_remove_persistent_group(manager->oem_ops, ssid,
1223 WDS_LOGE("Failed to remove persistent group");
1224 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1227 return_parameters = g_variant_new("(i)", ret);
1230 } else if (!g_strcmp0(method_name, "SetPassphrase")) {
1232 int passphrase_len = 0;
1233 wfd_group_s *group = manager->group;
1236 WDS_LOGE("Group already exists");
1237 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1241 g_variant_get(parameters, "(&s)", &passphrase);
1242 passphrase_len = strlen(passphrase);
1244 if (passphrase_len < PASSPHRASE_LEN_MIN ||
1245 passphrase_len > PASSPHRASE_LEN_MAX) {
1246 WDS_LOGE("Passphrase length incorrect [%s]:[%d]",
1247 passphrase, passphrase_len);
1248 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1252 g_strlcpy(manager->local->passphrase, passphrase, PASSPHRASE_LEN_MAX + 1);
1253 WDS_LOGI("Passphrase string [%s]", manager->local->passphrase);
1255 ret = WIFI_DIRECT_ERROR_NONE;
1256 return_parameters = g_variant_new("(i)", ret);
1259 } else if (!g_strcmp0(method_name, "GetPassphrase")) {
1260 wfd_group_s *group = manager->group;
1262 WDS_LOGE("Group not exist");
1263 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1267 if (group->role == WFD_DEV_ROLE_GC) {
1268 WDS_LOGE("Device is not GO");
1269 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1273 ret = WIFI_DIRECT_ERROR_NONE;
1274 return_parameters = g_variant_new("(is)", ret, group->passphrase);
1275 WDS_LOGI("group->pass : [%s]", group->passphrase);
1279 } else if (!g_strcmp0(method_name, "SetPersistentGroupEnabled")) {
1282 g_variant_get(parameters, "(b)", &enabled);
1283 WDS_LOGI("Activate Persistent Group : [%s]",
1284 enabled ? "True" : "False");
1286 manager->local->group_flags |= WFD_GROUP_FLAG_PERSISTENT;
1288 manager->local->group_flags &= ~(WFD_GROUP_FLAG_PERSISTENT);
1289 ret = WIFI_DIRECT_ERROR_NONE;
1290 return_parameters = g_variant_new("(i)", ret);
1293 } else if (!g_strcmp0(method_name, "IsPersistentGroupEnabled")) {
1295 result = ((manager->local->group_flags &
1296 WFD_GROUP_FLAG_PERSISTENT)
1297 == WFD_GROUP_FLAG_PERSISTENT);
1298 WDS_LOGI("Is persistent group : [%s]", result ? "Yes" : "No");
1299 return_parameters = g_variant_new("(b)", result);
1303 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1308 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1312 wfd_error_set_gerror(ret, &err);
1313 g_dbus_method_invocation_return_gerror(invocation, err);
1314 g_clear_error(&err);
1318 static void __wfd_manager_config_iface_handler(const gchar *method_name,
1319 GVariant *parameters,
1320 GDBusMethodInvocation *invocation)
1322 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1323 wfd_manager_s *manager = wfd_get_manager();
1324 GVariant *return_parameters = NULL;
1326 WDS_LOGD("%s", method_name);
1328 if (!g_strcmp0(method_name, "GetDeviceName")) {
1329 char device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN+1] = {0, };
1331 ret = wfd_local_get_dev_name(device_name);
1333 WDS_LOGE("Failed to get device name");
1334 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1338 ret = WIFI_DIRECT_ERROR_NONE;
1339 return_parameters = g_variant_new("(is)", ret, device_name);
1343 } else if (!g_strcmp0(method_name, "SetDeviceName")) {
1344 const char *device_name = NULL;
1345 g_variant_get(parameters, "(&s)", &device_name);
1347 ret = wfd_local_set_dev_name((char *)device_name);
1349 WDS_LOGE("Failed to set device name");
1350 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1354 ret = WIFI_DIRECT_ERROR_NONE;
1355 return_parameters = g_variant_new("(i)", ret);
1358 } else if (!g_strcmp0(method_name, "GetWpsPin")) {
1359 wfd_session_s *session = (wfd_session_s*) manager->session;
1360 if (!session || manager->auto_pin[0] != 0) {
1361 WDS_LOGE("Session not exist");
1362 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1366 if (session->wps_pin[0] == '\0') {
1367 WDS_LOGE("WPS PIN is not set");
1368 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1372 ret = WIFI_DIRECT_ERROR_NONE;
1373 return_parameters = g_variant_new("(is)", ret, session->wps_pin);
1376 } else if (!g_strcmp0(method_name, "SetWpsPin")) {
1377 const char *pin = NULL;
1378 wfd_session_s *session = (wfd_session_s*) manager->session;
1380 g_variant_get(parameters, "(&s)", &pin);
1383 WDS_LOGE("Session not exist");
1384 g_strlcpy(manager->auto_pin, pin, strlen(pin) + 1);
1386 g_strlcpy(session->wps_pin, pin, strlen(pin) + 1);
1389 ret = WIFI_DIRECT_ERROR_NONE;
1390 return_parameters = g_variant_new("(i)", ret);
1393 } else if (!g_strcmp0(method_name, "GetSupportedWpsMode")) {
1394 int config_methods = 0;
1396 ret = wfd_local_get_supported_wps_mode(&config_methods);
1398 WDS_LOGE("Failed to get supported wps mode");
1399 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1403 ret = WIFI_DIRECT_ERROR_NONE;
1404 return_parameters = g_variant_new("(ii)", ret, config_methods);
1407 } else if (!g_strcmp0(method_name, "GetReqWpsMode")) {
1410 ret = wfd_manager_get_req_wps_mode(&wps_mode);
1412 WDS_LOGE("Failed to get request wps mode");
1413 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1417 ret = WIFI_DIRECT_ERROR_NONE;
1418 return_parameters = g_variant_new("(ii)", ret, wps_mode);
1421 } else if (!g_strcmp0(method_name, "SetReqWpsMode")) {
1424 g_variant_get(parameters, "(i)", &type);
1425 ret = wfd_manager_set_req_wps_mode(type);
1427 WDS_LOGE("Failed to set request wps mode");
1428 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1432 ret = WIFI_DIRECT_ERROR_NONE;
1433 return_parameters = g_variant_new("(i)", ret);
1436 } else if (!g_strcmp0(method_name, "GetLocalWpsMode")) {
1439 ret = wfd_local_get_wps_mode(&wps_mode);
1441 WDS_LOGE("Failed to get request wps mode");
1442 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1446 ret = WIFI_DIRECT_ERROR_NONE;
1447 return_parameters = g_variant_new("(ii)", ret, wps_mode);
1450 } else if (!g_strcmp0(method_name, "GetIPAddress")) {
1451 char ip_addr_str[IPSTR_LEN+1] = {0, };
1453 if (manager->state < WIFI_DIRECT_STATE_CONNECTED) {
1454 WDS_LOGE("Device is not connected yet");
1455 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1459 ret = wfd_local_get_ip_addr((char *)ip_addr_str);
1461 WDS_LOGE("Failed to get local IP address");
1462 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1466 return_parameters = g_variant_new("(is)", ret, ip_addr_str);
1467 WDS_LOGI("IP addr : [%s]", ip_addr_str);
1470 } else if (!g_strcmp0(method_name, "GetMacAddress")) {
1471 char device_mac[MACSTR_LEN+1] = {0, };
1473 ret = wfd_local_get_dev_mac(device_mac);
1475 WDS_LOGE("Failed to get device mac");
1476 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1480 ret = WIFI_DIRECT_ERROR_NONE;
1481 return_parameters = g_variant_new("(is)", ret, device_mac);
1484 } else if (!g_strcmp0(method_name, "GetGoIntent")) {
1487 ret = wfd_manager_get_go_intent(&go_intent);
1489 WDS_LOGE("Failed to get GO intent");
1490 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1494 ret = WIFI_DIRECT_ERROR_NONE;
1495 return_parameters = g_variant_new("(ii)", ret, go_intent);
1498 } else if (!g_strcmp0(method_name, "SetGoIntent")) {
1501 g_variant_get(parameters, "(i)", &go_intent);
1502 ret = wfd_manager_set_go_intent(go_intent);
1504 WDS_LOGE("Failed to set GO intent");
1505 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1509 ret = WIFI_DIRECT_ERROR_NONE;
1510 return_parameters = g_variant_new("(i)", ret);
1513 } else if (!g_strcmp0(method_name, "GetMaxClient")) {
1516 ret = wfd_manager_get_max_station(&max_client);
1518 WDS_LOGE("Failed to get max station");
1519 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1523 ret = WIFI_DIRECT_ERROR_NONE;
1524 return_parameters = g_variant_new("(ii)", ret, max_client);
1527 } else if (!g_strcmp0(method_name, "SetMaxClient")) {
1529 g_variant_get(parameters, "(i)", &max_client);
1531 ret = wfd_manager_set_max_station(max_client);
1533 WDS_LOGE("Failed to set max station");
1534 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1538 ret = WIFI_DIRECT_ERROR_NONE;
1539 return_parameters = g_variant_new("(i)", ret);
1542 } else if (!g_strcmp0(method_name, "SetAutoConnectionMode")) {
1543 gboolean mode = FALSE;
1545 g_variant_get(parameters, "(b)", &mode);
1546 ret = wfd_manager_set_autoconnection(mode);
1548 WDS_LOGE("Failed to set autoconnection");
1549 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1553 ret = WIFI_DIRECT_ERROR_NONE;
1554 return_parameters = g_variant_new("(i)", ret);
1557 } else if (!g_strcmp0(method_name, "IsAutoConnectionMode")) {
1560 ret = wfd_manager_get_autoconnection(&mode);
1562 WDS_LOGE("Failed to get autoconnection");
1563 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1567 ret = WIFI_DIRECT_ERROR_NONE;
1568 return_parameters = g_variant_new("(ib)", ret, mode);
1571 } else if (!g_strcmp0(method_name, "GetOperatingChannel")) {
1574 wfd_group_s *group = manager->group;
1576 WDS_LOGE("Group not exist");
1577 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1581 channel = wfd_util_freq_to_channel(group->freq);
1583 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1587 ret = WIFI_DIRECT_ERROR_NONE;
1588 return_parameters = g_variant_new("(ii)", ret, channel);
1591 } else if (!g_strcmp0(method_name, "SetAutoConnectionPeer")) {
1592 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1595 } else if (!g_strcmp0(method_name, "GetInterfaceName")) {
1596 wfd_group_s *group = (wfd_group_s *)manager->group;
1598 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1601 ret = WIFI_DIRECT_ERROR_NONE;
1602 return_parameters = g_variant_new("(is)", ret, group->ifname);
1605 } else if (!g_strcmp0(method_name, "GetSubnetMask")) {
1606 char *get_str = NULL;
1607 char subnet_mask[IPSTR_LEN+1] = {0, };
1609 get_str = vconf_get_str(VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK);
1611 WDS_LOGE("Get Subnet Mask failed");
1612 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1615 WDS_LOGD("VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK(%s) : %s", VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK,
1617 ret = WIFI_DIRECT_ERROR_NONE;
1618 g_strlcpy(subnet_mask, get_str, IPSTR_LEN + 1);
1619 return_parameters = g_variant_new("(is)", ret, subnet_mask);
1623 } else if (!g_strcmp0(method_name, "GetGateway")) {
1624 char *get_str = NULL;
1625 char gateway_addr[IPSTR_LEN+1] = {0, };
1626 get_str = vconf_get_str(VCONFKEY_WIFI_DIRECT_P2P_GATEWAY);
1628 WDS_LOGE("Get Gateway failed");
1629 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1632 WDS_LOGD("VCONFKEY_WIFI_DIRECT_P2P_GATEWAY_ADDR(%s) : %s", VCONFKEY_WIFI_DIRECT_P2P_GATEWAY,
1634 ret = WIFI_DIRECT_ERROR_NONE;
1635 g_strlcpy(gateway_addr, get_str, IPSTR_LEN + 1);
1636 return_parameters = g_variant_new("(is)", ret, gateway_addr);
1640 } else if (!g_strcmp0(method_name, "GetSessionTimer")) {
1642 int session_timer = 0;
1643 ret = WIFI_DIRECT_ERROR_NONE;
1644 session_timer = manager->session_timer;
1645 WDS_LOGD("Get Session Timer value is %d", session_timer);
1646 return_parameters = g_variant_new("(ii)", ret, session_timer);
1649 } else if (!g_strcmp0(method_name, "SetSessionTimer")) {
1651 int session_timer = 0;
1652 g_variant_get(parameters, "(i)", &session_timer);
1653 WDS_LOGD("Set Session Timer value is %d", session_timer);
1654 manager->session_timer = session_timer;
1655 ret = WIFI_DIRECT_ERROR_NONE;
1656 return_parameters = g_variant_new("(i)", ret);
1659 } else if (!g_strcmp0(method_name, "SetAutoGroupRemoval")) {
1662 g_variant_get(parameters, "(b)", &enable);
1663 WDS_LOGE("Activate Auto Group Removal Mode : [%s]",
1664 enable ? "True" : "False");
1666 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1667 WDS_LOGE("Wi-Fi Direct is not activated.");
1668 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1673 manager->auto_group_remove_enable = TRUE;
1675 /* Enable Group destroy only if state is connecting */
1676 if (manager->state == WIFI_DIRECT_STATE_CONNECTING) {
1677 WDS_LOGE("Wi-Fi Direct state is CONNECTING");
1678 ret = WIFI_DIRECT_ERROR_NONE;
1679 return_parameters = g_variant_new("(i)", ret);
1682 /* Remove group immediately if no connected peer found */
1683 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1684 wfd_group_s *group = (wfd_group_s*) manager->group;
1685 if (group && !group->member_count
1686 && wfd_util_is_remove_group_allowed())
1687 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1691 manager->auto_group_remove_enable = FALSE;
1694 ret = WIFI_DIRECT_ERROR_NONE;
1695 return_parameters = g_variant_new("(i)", ret);
1698 } else if (!g_strcmp0(method_name, "GetPrimaryDevType")) {
1700 int pri_dev_type = 0;
1701 ret = WIFI_DIRECT_ERROR_NONE;
1702 pri_dev_type = DEFAULT_PRIMARY_DEVICE_TYPE;
1703 WDS_LOGD("Get primary dev type value is %d", pri_dev_type);
1704 return_parameters = g_variant_new("(ii)", ret, pri_dev_type);
1707 } else if (!g_strcmp0(method_name, "GetSecondaryDevType")) {
1709 int sec_dev_type = 0;
1710 ret = WIFI_DIRECT_ERROR_NONE;
1711 sec_dev_type = DEFAULT_SECONDARY_DEVICE_TYPE;
1712 WDS_LOGD("Get secondary dev type value is %d", sec_dev_type);
1713 return_parameters = g_variant_new("(ii)", ret, sec_dev_type);
1717 WDS_LOGE("method not handled");
1718 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1723 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1727 wfd_error_set_gerror(ret, &err);
1728 g_dbus_method_invocation_return_gerror(invocation, err);
1729 g_clear_error(&err);
1733 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1734 static void __wfd_manager_service_iface_handler(const gchar *method_name,
1735 GVariant *parameters,
1736 GDBusMethodInvocation *invocation)
1738 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1739 wfd_manager_s *manager = wfd_get_manager();
1740 GVariant *return_parameters = NULL;
1742 WDS_LOGD("%s", method_name);
1744 if (!g_strcmp0(method_name, "StartDiscovery")) {
1745 const char *mac_address = NULL;
1747 unsigned char mac_addr[MACADDR_LEN] = {0, };
1749 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1750 WDS_LOGE("Wi-Fi Direct is not activated.");
1751 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1755 g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
1756 WDS_LOGD("Service type [%d]", service_type);
1757 macaddr_atoe(mac_address, mac_addr);
1759 ret = wfd_oem_start_service_discovery(manager->oem_ops,
1760 mac_addr, service_type);
1762 WDS_LOGE("Failed to start service discovery");
1763 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1767 WFD_DBUS_REPLY_ERROR_NONE(invocation);
1769 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1770 "DiscoveryStarted", NULL);
1773 } else if (!g_strcmp0(method_name, "StopDiscovery")) {
1774 const char *mac_address = NULL;
1776 unsigned char mac_addr[MACADDR_LEN] = {0, };
1778 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1779 WDS_LOGE("Wi-Fi Direct is not activated.");
1780 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1784 g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
1785 WDS_LOGD("Service type [%d]", service_type);
1786 macaddr_atoe(mac_address, mac_addr);
1788 ret = wfd_oem_cancel_service_discovery(manager->oem_ops,
1789 mac_addr, service_type);
1791 WDS_LOGE("Failed to cancel service discovery");
1792 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1795 ret = WIFI_DIRECT_ERROR_NONE;
1796 return_parameters = g_variant_new("(i)", ret);
1799 } else if (!g_strcmp0(method_name, "Register")) {
1802 const char *info_str = NULL;
1804 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1805 WDS_LOGE("Wi-Fi Direct is not activated.");
1806 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1810 g_variant_get(parameters, "(i&s)", &service_type, &info_str);
1811 WDS_LOGD("Register service [%d: %s]", service_type, info_str);
1813 ret = wfd_service_add(service_type, (char *)info_str, &service_id);
1815 WDS_LOGE("Failed to add service");
1816 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1820 ret = WIFI_DIRECT_ERROR_NONE;
1821 return_parameters = g_variant_new("(ii)", ret, service_id);
1824 } else if (!g_strcmp0(method_name, "Deregister")) {
1827 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1828 WDS_LOGE("Wi-Fi Direct is not activated.");
1829 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1833 g_variant_get(parameters, "(i)", &service_id);
1834 WDS_LOGD("Service id [%d]", service_id);
1836 ret = wfd_service_del(service_id);
1838 WDS_LOGE("Failed to delete service");
1839 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1843 ret = WIFI_DIRECT_ERROR_NONE;
1844 return_parameters = g_variant_new("(i)", ret);
1848 WDS_LOGD("method not handled");
1849 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1854 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1858 wfd_error_set_gerror(ret, &err);
1859 g_dbus_method_invocation_return_gerror(invocation, err);
1860 g_clear_error(&err);
1863 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1865 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1866 static void __wfd_manager_display_iface_handler(const gchar *method_name,
1867 GVariant *parameters,
1868 GDBusMethodInvocation *invocation)
1870 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1871 wfd_manager_s *manager = wfd_get_manager();
1872 GVariant *return_parameters = NULL;
1874 WDS_LOGD("%s", method_name);
1876 if (!g_strcmp0(method_name, "Init")) {
1877 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1878 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1882 wfd_device_s * device = manager->local;
1884 ret = wfd_oem_miracast_init(manager->oem_ops, TRUE);
1886 WDS_LOGE("Failed to initialize display");
1887 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1891 device->display.type = WIFI_DISPLAY_DEFAULT_TYPE;
1892 device->display.port = WIFI_DISPLAY_DEFAULT_PORT;
1893 device->display.availability = WIFI_DISPLAY_DEFAULT_AVAIL;
1894 device->display.hdcp_support = WIFI_DISPLAY_DEFAULT_HDCP;
1896 ret = WIFI_DIRECT_ERROR_NONE;
1897 return_parameters = g_variant_new("(i)", ret);
1900 } else if (!g_strcmp0(method_name, "Deinit")) {
1901 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1902 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1906 wfd_device_s * device = manager->local;
1908 ret = wfd_oem_miracast_init(manager->oem_ops, FALSE);
1910 WDS_LOGE("Failed to deinitialize display");
1911 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1915 memset(&(device->display), 0x0, sizeof(wfd_display_type_e));
1917 ret = WIFI_DIRECT_ERROR_NONE;
1918 return_parameters = g_variant_new("(i)", ret);
1921 } else if (!g_strcmp0(method_name, "SetConfig")) {
1922 int type, port, hdcp;
1923 g_variant_get(parameters, "(iii)", &type, &port, &hdcp);
1925 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1926 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1930 WDS_LOGD("type %d port %d hdcp %d", type, port, hdcp);
1932 ret = wfd_manager_set_display_device(type, port, hdcp);
1934 WDS_LOGE("Failed to set display device settings");
1935 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1939 ret = WIFI_DIRECT_ERROR_NONE;
1940 return_parameters = g_variant_new("(i)", ret);
1943 } else if (!g_strcmp0(method_name, "SetAvailiability")) {
1945 g_variant_get(parameters, "(i)", &availability);
1947 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1948 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1952 ret = wfd_manager_set_session_availability(availability);
1954 WDS_LOGE("Failed to set session availability");
1955 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1959 ret = WIFI_DIRECT_ERROR_NONE;
1960 return_parameters = g_variant_new("(i)", ret);
1963 } else if (!g_strcmp0(method_name, "GetPeerType")) {
1964 wfd_device_s *peer = NULL;
1965 const char *mac_address = NULL;
1966 unsigned char mac_addr[MACADDR_LEN] = {0, };
1968 g_variant_get(parameters, "(&s)", &mac_address);
1969 macaddr_atoe(mac_address, mac_addr);
1971 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1972 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1976 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
1978 WDS_LOGE("Failed to get peer");
1979 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1983 ret = WIFI_DIRECT_ERROR_NONE;
1984 return_parameters = g_variant_new("(ii)", ret, peer->display.type);
1987 } else if (!g_strcmp0(method_name, "GetPeerAvailability")) {
1988 wfd_device_s *peer = NULL;
1989 const char *mac_address = NULL;
1990 unsigned char mac_addr[MACADDR_LEN] = {0, };
1992 g_variant_get(parameters, "(&s)", &mac_address);
1993 macaddr_atoe(mac_address, mac_addr);
1995 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1996 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2000 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2002 WDS_LOGE("Failed to get peer");
2003 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2007 ret = WIFI_DIRECT_ERROR_NONE;
2008 return_parameters = g_variant_new("(ii)", ret, peer->display.availability);
2011 } else if (!g_strcmp0(method_name, "GetPeerHdcp")) {
2012 wfd_device_s *peer = NULL;
2013 const char *mac_address = NULL;
2014 unsigned char mac_addr[MACADDR_LEN] = {0, };
2016 g_variant_get(parameters, "(&s)", &mac_address);
2017 macaddr_atoe(mac_address, mac_addr);
2019 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2020 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2024 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2026 WDS_LOGE("Failed to get peer");
2027 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2031 ret = WIFI_DIRECT_ERROR_NONE;
2032 return_parameters = g_variant_new("(ii)", ret, peer->display.hdcp_support);
2035 } else if (!g_strcmp0(method_name, "GetPeerPort")) {
2036 wfd_device_s *peer = NULL;
2037 const char *mac_address = NULL;
2038 unsigned char mac_addr[MACADDR_LEN] = {0, };
2040 g_variant_get(parameters, "(&s)", &mac_address);
2041 macaddr_atoe(mac_address, mac_addr);
2043 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2044 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2048 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2050 WDS_LOGE("Failed to get peer");
2051 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2055 ret = WIFI_DIRECT_ERROR_NONE;
2056 return_parameters = g_variant_new("(ii)", ret, peer->display.port);
2059 } else if (!g_strcmp0(method_name, "GetPeerThroughput")) {
2060 wfd_device_s *peer = NULL;
2061 const char *mac_address = NULL;
2062 unsigned char mac_addr[MACADDR_LEN] = {0, };
2064 g_variant_get(parameters, "(&s)", &mac_address);
2065 macaddr_atoe(mac_address, mac_addr);
2067 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2068 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2072 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2074 WDS_LOGE("Failed to get peer");
2075 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2079 ret = WIFI_DIRECT_ERROR_NONE;
2080 return_parameters = g_variant_new("(ii)", ret, peer->display.max_tput);
2084 WDS_LOGD("method not handled");
2085 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2090 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
2094 wfd_error_set_gerror(ret, &err);
2095 g_dbus_method_invocation_return_gerror(invocation, err);
2096 g_clear_error(&err);
2099 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
2100 #if defined(TIZEN_FEATURE_ASP)
2102 static void __g_variant_to_txt_record(GVariant *variant, char **txt_record)
2104 GVariantIter *iter = NULL;
2106 GVariant *value = NULL;
2108 const char *str = NULL;
2112 gsize value_length = 0;
2113 __WDS_LOG_FUNC_ENTER__;
2115 DBUS_DEBUG_VARIANT(variant);
2116 g_variant_get(variant, "a{sv}", &iter);
2117 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2118 WDS_LOGD("%s %s", key, g_variant_get_string(value, &value_length));
2119 txt_length += strlen(key);
2120 str = g_variant_get_string(value, &value_length);
2121 txt_length += (int)value_length;
2125 g_variant_iter_free(iter);
2126 if(txt_length == 0) {
2127 __WDS_LOG_FUNC_EXIT__;
2131 buff = g_try_malloc0(txt_length);
2133 WDS_LOGE("g_try_malloc0 failed");
2134 __WDS_LOG_FUNC_EXIT__;
2138 g_variant_get(variant, "a{sv}", &iter);
2139 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2140 key_length = strlen(key);
2141 str = g_variant_get_string(value, &value_length);
2143 g_strlcpy(pos, key, key_length + 1);
2148 g_strlcpy(pos, str, value_length + 1);
2149 pos+= (int)value_length;
2153 buff[txt_length -1] = '\0';
2155 g_variant_iter_free(iter);
2158 __WDS_LOG_FUNC_EXIT__;
2162 static void __g_variant_to_seek_info(GVariant *variant, char **seek_info)
2164 GVariantIter *iter = NULL;
2168 int seek_length = 0;
2171 DBUS_DEBUG_VARIANT(variant);
2172 g_variant_get(variant, "as", &iter);
2173 while (g_variant_iter_loop(iter, "s", &key)) {
2174 seek_length += strlen(key);
2178 g_variant_iter_free(iter);
2179 if(seek_length == 0)
2182 buff = g_try_malloc0(seek_length);
2184 WDS_LOGE("g_try_malloc0 failed");
2188 g_variant_get(variant, "as", &iter);
2189 while (g_variant_iter_loop(iter, "s", &key)) {
2190 key_length = strlen(key);
2192 g_strlcpy(pos, key, key_length + 1);
2197 buff[seek_length -1] = '\0';
2199 g_variant_iter_free(iter);
2205 static void __wfd_manager_asp_iface_handler(const gchar *method_name,
2206 GVariant *parameters,
2207 GDBusMethodInvocation *invocation)
2209 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2210 wfd_manager_s *manager = wfd_get_manager();
2211 GVariant *return_parameters = NULL;
2213 WDS_LOGD("%s", method_name);
2215 if (!g_strcmp0(method_name, "AdvertiseService")) {
2217 wfd_oem_asp_service_s service;
2218 GVariantIter *iter = NULL;
2220 GVariant *var = NULL;
2223 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2224 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2225 manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
2226 WDS_LOGE("Wi-Fi Direct is not available status for Advertising.");
2227 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2231 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2232 g_variant_get(parameters, "(a{sv})", &iter);
2233 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2234 if (!g_strcmp0(key, "adv_id"))
2235 g_variant_get(var, "u", &(service.adv_id));
2236 else if (!g_strcmp0(key, "discovery_tech"))
2237 g_variant_get(var, "i", &(service.discovery_tech));
2238 else if (!g_strcmp0(key, "preferred_connection"))
2239 g_variant_get(var, "y", &(service.preferred_connection));
2240 else if (!g_strcmp0(key, "auto_accept"))
2241 g_variant_get(var, "i", &(service.auto_accept));
2242 else if (!g_strcmp0(key, "status"))
2243 g_variant_get(var, "y", &(service.status));
2244 else if (!g_strcmp0(key, "role"))
2245 g_variant_get(var, "y", &(service.role));
2246 else if (!g_strcmp0(key, "replace"))
2247 g_variant_get(var, "i", &(replace));
2248 else if (!g_strcmp0(key, "config_method"))
2249 g_variant_get(var, "u", &(service.config_method));
2250 else if (!g_strcmp0(key, "instance_name"))
2251 g_variant_get(var, "&s", &(service.instance_name));
2252 else if (!g_strcmp0(key, "service_type"))
2253 g_variant_get(var, "&s", &(service.service_type));
2254 else if (!g_strcmp0(key, "service_info"))
2255 __g_variant_to_txt_record(var, &(service.service_info));
2256 else if (!g_strcmp0(key, "rsp_info"))
2257 g_variant_get(var, "&s", &(service.rsp_info));
2262 ret = wfd_oem_advertise_service(manager->oem_ops, &service, replace);
2264 WDS_LOGE("Failed to add service");
2265 g_free(service.service_info);
2266 g_variant_iter_free(iter);
2267 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2270 g_free(service.service_info);
2271 g_variant_iter_free(iter);
2273 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
2274 WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
2278 ret = wfd_manager_start_discovery(manager, WFD_OEM_SCAN_MODE_PASSIVE, 0, 0, 0);
2279 if (ret == WIFI_DIRECT_ERROR_NONE) {
2280 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2284 wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
2285 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2289 ret = WIFI_DIRECT_ERROR_NONE;
2290 return_parameters = g_variant_new("(i)", ret);
2293 } else if (!g_strcmp0(method_name, "CancelAdvertiseService")) {
2295 wfd_oem_asp_service_s service;
2296 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2298 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2299 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2303 g_variant_get(parameters, "(u)", &(service.adv_id));
2304 ret = wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
2306 WDS_LOGE("Failed to del service");
2307 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2311 ret = WIFI_DIRECT_ERROR_NONE;
2312 return_parameters = g_variant_new("(i)", ret);
2315 } else if (!g_strcmp0(method_name, "SeekService")) {
2317 wfd_oem_asp_service_s service;
2318 GVariantIter *iter = NULL;
2320 GVariant *var = NULL;
2322 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2323 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2324 manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
2325 WDS_LOGE("Wi-Fi Direct is not available status to Seek.");
2326 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2330 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2331 g_variant_get(parameters, "(a{sv})", &iter);
2332 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2333 if (!g_strcmp0(key, "discovery_tech"))
2334 g_variant_get(var, "i", &(service.discovery_tech));
2335 else if (!g_strcmp0(key, "preferred_connection"))
2336 g_variant_get(var, "y", &(service.preferred_connection));
2337 else if (!g_strcmp0(key, "service_type"))
2338 g_variant_get(var, "&s", &(service.service_type));
2339 else if (!g_strcmp0(key, "service_info"))
2340 __g_variant_to_seek_info(var, &(service.service_info));
2345 ret = wfd_oem_seek_service(manager->oem_ops, &service);
2347 WDS_LOGE("Failed to seek service");
2348 g_free(service.service_info);
2349 g_variant_iter_free(iter);
2350 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2353 g_free(service.service_info);
2354 g_variant_iter_free(iter);
2356 WDS_LOGD("search_id [%x]", service.search_id);
2358 ret = wfd_manager_start_discovery(manager, WFD_OEM_SCAN_MODE_ACTIVE, 0, 0, 0);
2359 if (ret == WIFI_DIRECT_ERROR_NONE) {
2360 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2364 wfd_oem_cancel_seek_service(manager->oem_ops, &service);
2365 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2369 ret = WIFI_DIRECT_ERROR_NONE;
2370 return_parameters = g_variant_new("(it)", ret, service.search_id);
2373 } else if (!g_strcmp0(method_name, "CancelSeekService")) {
2375 wfd_oem_asp_service_s service;
2376 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2378 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2379 WDS_LOGE("Wi-Fi Direct is not activated.");
2380 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2384 g_variant_get(parameters, "(t)", &(service.search_id));
2385 ret = wfd_oem_cancel_seek_service(manager->oem_ops, &service);
2387 WDS_LOGE("Failed to cancel seek service");
2388 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2392 ret = WIFI_DIRECT_ERROR_NONE;
2393 return_parameters = g_variant_new("(i)", ret);
2395 } else if (!g_strcmp0(method_name, "ConnectSession")) {
2397 GVariantIter *iter = NULL;
2399 GVariant *var = NULL;
2400 wfd_oem_asp_prov_s prov_params;
2401 const char *mac_str = NULL;
2402 unsigned char role = 0;
2403 unsigned int config = 0;
2406 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2407 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2408 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
2409 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2413 memset(&prov_params, 0, sizeof(wfd_oem_asp_prov_s));
2415 g_variant_get(parameters, "(a{sv})", &iter);
2416 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2418 if (!g_strcmp0(key, "service_mac")) {
2419 g_variant_get(var, "&s", &mac_str);
2420 if (mac_str == NULL) {
2421 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2422 g_variant_iter_free(iter);
2425 macaddr_atoe(mac_str, prov_params.service_mac);
2426 } else if (!g_strcmp0(key, "adv_id")) {
2427 g_variant_get(var, "u", &(prov_params.adv_id));
2428 } else if (!g_strcmp0(key, "session_mac")) {
2429 g_variant_get(var, "&s", &mac_str);
2430 if (mac_str == NULL) {
2431 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2432 g_variant_iter_free(iter);
2435 macaddr_atoe(mac_str, prov_params.session_mac);
2436 } else if (!g_strcmp0(key, "session_id")) {
2437 g_variant_get(var, "u", &(prov_params.session_id));
2438 } else if (!g_strcmp0(key, "role")) {
2439 g_variant_get(var, "y", &(role));
2440 prov_params.network_role = (int)role;
2441 } else if (!g_strcmp0(key, "config_method")) {
2442 g_variant_get(var, "u", &(config));
2443 prov_params.network_config = (int)config;
2444 } else if (!g_strcmp0(key, "session_info")) {
2445 g_variant_get(var, "&s", &(prov_params.session_information));
2451 if (ISZEROMACADDR(prov_params.service_mac) ||
2452 ISZEROMACADDR(prov_params.session_mac)) {
2453 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2454 g_variant_iter_free(iter);
2458 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2460 wfd_asp_connect_status(prov_params.session_mac,
2461 prov_params.session_id,
2462 ASP_CONNECT_STATUS_REQUEST_SENT,
2465 wfd_group_s *group = (wfd_group_s*) manager->group;
2466 if (group && group->member_count >= manager->max_station) {
2468 status = ASP_CONNECT_STATUS_NOMORE_CONNECT;
2469 wfd_asp_connect_status(prov_params.session_mac,
2470 prov_params.session_id,
2473 g_variant_iter_free(iter);
2474 __WDS_LOG_FUNC_EXIT__;
2478 ret = wfd_manager_asp_connect_session(manager, &prov_params);
2479 if (ret == WIFI_DIRECT_ERROR_NONE) {
2480 char peer_mac_address[MACSTR_LEN] = {0,};
2481 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(prov_params.service_mac));
2482 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2484 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
2485 WFD_EVENT_CONNECTION_IN_PROGRESS,
2488 wfd_asp_connect_status(prov_params.session_mac,
2489 prov_params.session_id,
2490 ASP_CONNECT_STATUS_REQUEST_FAILED,
2493 g_variant_iter_free(iter);
2494 __WDS_LOG_FUNC_EXIT__;
2497 } else if (!g_strcmp0(method_name, "ConfirmSession")) {
2499 GVariantIter *iter = NULL;
2501 GVariant *var = NULL;
2502 wfd_oem_asp_prov_s prov_params;
2503 const char *mac_str = NULL;
2504 const char *pin = NULL;
2507 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
2508 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2512 memset(&prov_params, 0, sizeof(wfd_oem_asp_prov_s));
2514 g_variant_get(parameters, "(a{sv})", &iter);
2515 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2517 if (!g_strcmp0(key, "session_mac")) {
2518 g_variant_get(var, "&s", &mac_str);
2519 if (mac_str == NULL) {
2520 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2521 g_variant_iter_free(iter);
2524 macaddr_atoe(mac_str, prov_params.session_mac);
2525 } else if (!g_strcmp0(key, "session_id")) {
2526 g_variant_get(var, "u", &(prov_params.session_id));
2527 } else if (!g_strcmp0(key, "confirmed")) {
2528 g_variant_get(var, "y", &(confirmed));
2529 } else if (!g_strcmp0(key, "pin")) {
2530 g_variant_get(var, "&s", &(pin));
2531 g_strlcpy(prov_params.wps_pin, pin, PINSTR_LEN);
2537 if (ISZEROMACADDR(prov_params.session_mac)) {
2538 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2539 g_variant_iter_free(iter);
2543 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2545 ret = wfd_manager_asp_confirm_session(manager, &prov_params, confirmed);
2546 if (ret == WIFI_DIRECT_ERROR_NONE && confirmed > 0) {
2547 char peer_mac_address[MACSTR_LEN] = {0,};
2548 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(prov_params.service_mac));
2549 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2551 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
2552 WFD_EVENT_CONNECTION_IN_PROGRESS,
2554 wfd_asp_connect_status(prov_params.session_mac,
2555 prov_params.session_id,
2556 ASP_CONNECT_STATUS_REQUEST_ACCEPTED,
2559 wfd_asp_connect_status(prov_params.session_mac,
2560 prov_params.session_id,
2561 ASP_CONNECT_STATUS_REQUEST_FAILED,
2564 g_variant_iter_free(iter);
2565 __WDS_LOG_FUNC_EXIT__;
2570 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
2571 __WDS_LOG_FUNC_EXIT__;
2575 wfd_error_set_gerror(ret, &err);
2576 g_dbus_method_invocation_return_gerror(invocation, err);
2577 g_clear_error(&err);
2578 __WDS_LOG_FUNC_EXIT__;
2585 const gchar *iface_name;
2586 void (*function) (const gchar *method_name,
2587 GVariant *parameters,
2588 GDBusMethodInvocation *invocation);
2589 } wfd_manager_iface_map[] = {
2592 WFD_MANAGER_MANAGE_INTERFACE,
2593 __wfd_manager_manage_iface_handler
2597 WFD_MANAGER_GROUP_INTERFACE,
2598 __wfd_manager_group_iface_handler
2602 WFD_MANAGER_CONFIG_INTERFACE,
2603 __wfd_manager_config_iface_handler
2605 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
2608 WFD_MANAGER_SERVICE_INTERFACE,
2609 __wfd_manager_service_iface_handler
2611 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
2612 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
2615 WFD_MANAGER_DISPLAY_INTERFACE,
2616 __wfd_manager_display_iface_handler
2618 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
2619 #if defined(TIZEN_FEATURE_ASP)
2622 WFD_MANAGER_ASP_INTERFACE,
2623 __wfd_manager_asp_iface_handler
2633 /* GDBus method handler */
2634 static void wfd_manager_method_call_handler (GDBusConnection *connection,
2635 const gchar *sender,
2636 const gchar *object_path,
2637 const gchar *interface_name,
2638 const gchar *method_name,
2639 GVariant *parameters,
2640 GDBusMethodInvocation *invocation,
2645 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
2646 if(!g_strcmp0(method_name, "AddClient"))
2647 wfd_manager_add_active_client(sender);
2648 #endif /* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
2651 WDS_LOGD("interface : [%s], method : [%s]", interface_name, method_name);
2652 DBUS_DEBUG_VARIANT(parameters);
2654 while (wfd_manager_iface_map[count].iface_name != NULL) {
2655 if (!g_strcmp0(interface_name, wfd_manager_iface_map[count].iface_name)) {
2657 wfd_manager_iface_map[count].function(method_name,
2666 static const GDBusInterfaceVTable wfd_manager_interface_vtable = {
2667 wfd_manager_method_call_handler, NULL, NULL};
2669 void wfd_manager_dbus_unregister(void)
2673 wfd_error_deregister();
2675 while (wfd_manager_iface_map[count].iface_name != NULL) {
2676 wfd_manager_dbus_iface_unregister(wfd_manager_iface_map[count].reg_id);
2681 gboolean wfd_manager_dbus_register(void)
2683 GDBusNodeInfo *node_info = NULL;
2684 GError *Error = NULL;
2687 wfd_error_register();
2689 node_info = g_dbus_node_info_new_for_xml(wfd_manager_introspection_xml, &Error);
2690 if (node_info == NULL) {
2691 WDS_LOGE("Failed to get node info, Error: %s", Error->message);
2692 g_clear_error(&Error);
2696 while (wfd_manager_iface_map[count].iface_name != NULL) {
2697 wfd_manager_iface_map[count].reg_id =
2698 wfd_manager_dbus_iface_register(wfd_manager_iface_map[count].iface_name,
2701 &wfd_manager_interface_vtable);
2703 WDS_LOGD("Registered Interface [%d, %s]",
2704 wfd_manager_iface_map[count].reg_id,
2705 wfd_manager_iface_map[count].iface_name);
2710 g_dbus_node_info_unref(node_info);