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'/>"
422 "<method name='CancelSeekService'>"
423 "<arg type='t' name='search_id' direction='in'/>"
424 "<arg type='i' name='result' direction='out'/>"
426 "<method name='ConnectSession'>"
427 "<arg type='a{sv}' name='parameters' direction='in'/>"
428 "<arg type='i' name='result' direction='out'/>"
430 "<method name='ConfirmSession'>"
431 "<arg type='a{sv}' name='parameters' direction='in'/>"
432 "<arg type='i' name='result' direction='out'/>"
434 "<signal name='SearchResult'>"
435 "<arg type='a{sv}' name='parameters'/>"
437 "<signal name='SessionRequest'>"
438 "<arg type='a{sv}' name='parameters'/>"
440 "<signal name='SessionConfigRequest'>"
441 "<arg type='a{sv}' name='parameters'/>"
443 "<signal name='ConnectStatus'>"
444 "<arg type='a{sv}' name='parameters'/>"
446 "<signal name='SessionStatus'>"
447 "<arg type='a{sv}' name='parameters'/>"
449 "<signal name='SessionPeerIPAssigned'>"
450 "<arg type='a{sv}' name='parameters'/>"
458 static void __wfd_manager_manage_iface_handler(const gchar *method_name,
459 GVariant *parameters,
460 GDBusMethodInvocation *invocation)
462 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
463 wfd_manager_s *manager = wfd_get_manager();
464 GVariant *return_parameters = NULL;
466 gchar* dbus_error_name = NULL;
467 WDS_LOGD("%s", method_name);
469 if (!g_strcmp0(method_name, "Activate")) {
471 WFD_DBUS_REPLY_ERROR_NONE(invocation);
473 ret = wfd_manager_activate(manager);
474 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
476 g_variant_new("(i)", ret));
478 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
479 } else if (!g_strcmp0(method_name, "AddClient")) {
480 return_parameters = g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE);
482 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
483 } else if (!g_strcmp0(method_name, "Deactivate")) {
485 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
486 WDS_LOGE("Already deactivated");
487 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
491 WFD_DBUS_REPLY_ERROR_NONE(invocation);
493 ret = wfd_manager_deactivate(manager);
494 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
496 g_variant_new("(i)", ret));
499 } else if (!g_strcmp0(method_name, "StartDiscovery")) {
500 gboolean mode = FALSE;
503 const gchar *type = NULL;
504 GVariantIter *iter = NULL;
506 GVariant *var = NULL;
508 g_variant_get(parameters, "(a{sv})", &iter);
509 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
510 if (!g_strcmp0(key, "Mode"))
511 g_variant_get(var, "b", &mode);
512 else if (!g_strcmp0(key, "Timeout"))
513 g_variant_get(var, "i", &timeout);
514 else if (!g_strcmp0(key, "Type"))
515 g_variant_get(var, "&s", &type);
516 else if (!g_strcmp0(key, "Channel"))
517 g_variant_get(var, "i", &channel);
521 g_variant_iter_free(iter);
523 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
524 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
525 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
526 WDS_LOGE("Wi-Fi Direct is not available status for scanning.");
527 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
531 if (mode && (manager->local->dev_role == WFD_DEV_ROLE_GO)) {
532 WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
533 ret = WIFI_DIRECT_ERROR_NONE;
534 return_parameters = g_variant_new("(i)", ret);
538 WFD_DBUS_REPLY_ERROR_NONE(invocation);
540 ret = wfd_manager_start_discovery(manager, mode, timeout, type, channel);
541 if (ret == WIFI_DIRECT_ERROR_NONE) {
542 if (mode == WFD_OEM_SCAN_MODE_PASSIVE) {
543 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
547 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
554 } else if (!g_strcmp0(method_name, "StopDiscovery")) {
555 int mode = manager->scan_mode;
556 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
557 manager->state != WIFI_DIRECT_STATE_DISCOVERING) {
558 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
562 WFD_DBUS_REPLY_ERROR_NONE(invocation);
564 ret = wfd_manager_cancel_discovery(manager);
565 if (ret == WIFI_DIRECT_ERROR_NONE && mode == WFD_SCAN_MODE_PASSIVE)
566 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
567 "DiscoveryFinished", NULL);
570 } else if (!g_strcmp0(method_name, "GetDiscoveredPeers")) {
571 wfd_discovery_entry_s *peers = NULL;
572 GVariantBuilder *builder_peers = NULL;
576 builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
578 peer_cnt = wfd_manager_get_peers(manager, &peers);
579 WDS_LOGD("Peer count [%d], Peer list [%p]", peer_cnt, peers);
581 WDS_LOGE("Failed to get scan result");
582 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
589 for (i = 0; i < peer_cnt; i++) {
590 GVariantBuilder builder_peer;
591 g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
593 g_variant_builder_add(&builder_peer, "{sv}",
595 g_variant_new_string(peers[i].device_name));
596 g_variant_builder_add(&builder_peer, "{sv}",
598 wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
599 g_variant_builder_add(&builder_peer, "{sv}",
601 wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
602 g_variant_builder_add(&builder_peer, "{sv}",
604 g_variant_new_uint16(peers[i].channel));
605 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
606 g_variant_builder_add(&builder_peer, "{sv}",
608 g_variant_new_uint16(peers[i].services));
609 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
610 g_variant_builder_add(&builder_peer, "{sv}",
612 g_variant_new_boolean(peers[i].is_group_owner));
613 g_variant_builder_add(&builder_peer, "{sv}",
615 g_variant_new_boolean(peers[i].is_persistent_go));
616 g_variant_builder_add(&builder_peer, "{sv}",
618 g_variant_new_boolean(peers[i].is_connected));
619 g_variant_builder_add(&builder_peer, "{sv}",
621 g_variant_new_uint16(peers[i].wps_device_pwd_id));
622 g_variant_builder_add(&builder_peer, "{sv}",
624 g_variant_new_uint16(peers[i].wps_cfg_methods));
625 g_variant_builder_add(&builder_peer, "{sv}",
627 g_variant_new_uint16(peers[i].category));
628 g_variant_builder_add(&builder_peer, "{sv}",
630 g_variant_new_uint16(peers[i].subcategory));
631 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
632 g_variant_builder_add(&builder_peer, "{sv}",
634 g_variant_new_boolean(peers[i].is_wfd_device));
635 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
637 WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
638 g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
641 ret = WIFI_DIRECT_ERROR_NONE;
642 return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
643 g_variant_builder_unref(builder_peers);
646 } else if (!g_strcmp0(method_name, "Connect")) {
647 const char *peer_mac_address = NULL;
648 unsigned char mac_addr[MACADDR_LEN] = {0, };
650 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
651 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
652 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
653 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
657 wfd_group_s *group = (wfd_group_s*) manager->group;
658 if (group && group->member_count >= manager->max_station) {
659 ret = WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
663 WFD_DBUS_REPLY_ERROR_NONE(invocation);
665 g_variant_get(parameters, "(&s)", &peer_mac_address);
666 macaddr_atoe(peer_mac_address, mac_addr);
668 ret = wfd_manager_connect(manager, mac_addr);
669 if (ret == WIFI_DIRECT_ERROR_NONE)
670 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
672 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
673 WFD_EVENT_CONNECTION_IN_PROGRESS,
677 } else if (!g_strcmp0(method_name, "Disconnect")) {
678 const char *peer_mac_address = NULL;
679 unsigned char mac_addr[MACADDR_LEN] = {0, };
681 if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
682 if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
683 ret = wfd_oem_stop_scan(manager->oem_ops);
685 WDS_LOGE("Failed to stop scan");
686 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
689 WDS_LOGI("Succeeded to stop scan");
690 if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
691 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
692 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
694 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
695 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
698 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
703 WFD_DBUS_REPLY_ERROR_NONE(invocation);
705 g_variant_get(parameters, "(&s)", &peer_mac_address);
706 macaddr_atoe(peer_mac_address, mac_addr);
708 ret = wfd_manager_disconnect(manager, mac_addr);
709 if (ret == WIFI_DIRECT_ERROR_NONE)
710 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
712 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
713 WFD_EVENT_DISCONNECTION_RSP,
717 } else if (!g_strcmp0(method_name, "CancelConnection")) {
718 const char *peer_mac_address = NULL;
719 unsigned char mac_addr[MACADDR_LEN] = {0, };
721 if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
722 WDS_LOGE("It's not CONNECTING state");
723 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
727 WFD_DBUS_REPLY_ERROR_NONE(invocation);
729 g_variant_get(parameters, "(&s)", &peer_mac_address);
730 macaddr_atoe(peer_mac_address, mac_addr);
732 ret = wfd_manager_cancel_connection(manager, mac_addr);
733 if (ret == WIFI_DIRECT_ERROR_NONE)
734 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
736 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
737 WFD_EVENT_CONNECTION_RSP,
741 } else if (!g_strcmp0(method_name, "AcceptConnection")) {
742 const char *peer_mac_address = NULL;
743 unsigned char mac_addr[MACADDR_LEN] = {0, };
745 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
746 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
750 wfd_group_s *group = (wfd_group_s*) manager->group;
751 if (group && group->member_count >= manager->max_station) {
752 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
756 WFD_DBUS_REPLY_ERROR_NONE(invocation);
758 g_variant_get(parameters, "(&s)", &peer_mac_address);
759 macaddr_atoe(peer_mac_address, mac_addr);
761 ret = wfd_manager_accept_connection(manager, mac_addr);
762 if (ret == WIFI_DIRECT_ERROR_NONE) {
763 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
765 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
766 WFD_EVENT_CONNECTION_IN_PROGRESS,
769 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
771 g_variant_new("(iis)", WIFI_DIRECT_ERROR_OPERATION_FAILED,
772 WFD_EVENT_CONNECTION_RSP,
777 } else if (!g_strcmp0(method_name, "RejectConnection")) {
778 wfd_session_s *session = manager->session;
779 const char *peer_mac_address = NULL;
780 unsigned char mac_addr[MACADDR_LEN] = {0, };
782 if (!session || manager->state != WIFI_DIRECT_STATE_CONNECTING) {
783 WDS_LOGE("It's not permitted with this state [%d]", manager->state);
784 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
788 if (session->direction != SESSION_DIRECTION_INCOMING) {
789 WDS_LOGE("Only incomming session can be rejected");
790 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
794 WFD_DBUS_REPLY_ERROR_NONE(invocation);
796 g_variant_get(parameters, "(&s)", &peer_mac_address);
797 macaddr_atoe(peer_mac_address, mac_addr);
799 ret = wfd_manager_reject_connection(manager, mac_addr);
800 if (ret == WIFI_DIRECT_ERROR_NONE)
801 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
803 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
804 WFD_EVENT_CONNECTION_RSP,
808 } else if (!g_strcmp0(method_name, "DisconnectAll")) {
810 if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
811 if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
812 ret = wfd_oem_stop_scan(manager->oem_ops);
814 WDS_LOGE("Failed to stop scan");
815 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
818 WDS_LOGI("Succeeded to stop scan");
819 if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
820 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
821 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
823 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
824 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
827 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
832 WFD_DBUS_REPLY_ERROR_NONE(invocation);
834 ret = wfd_manager_disconnect_all(manager);
835 if (ret == WIFI_DIRECT_ERROR_NONE)
836 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
838 g_variant_new("(iis)", ret,
839 WFD_EVENT_DISCONNECTION_RSP,
843 } else if (!g_strcmp0(method_name, "GetConnectedPeers")) {
844 wfd_connected_peer_info_s *peers = NULL;
845 GVariantBuilder *builder_peers = NULL;
849 builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
851 /* even though status is not CONNECTED,
852 * this command can be excuted only when group exist */
853 if (!manager->group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
854 WDS_LOGD("It's not connected state [%d]", manager->state);
855 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
859 peer_cnt = wfd_manager_get_connected_peers(manager, &peers);
860 WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
862 WDS_LOGE("Failed to get scan result");
863 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
867 for (i = 0; i < peer_cnt; i++) {
868 GVariantBuilder builder_peer;
869 g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
871 g_variant_builder_add(&builder_peer, "{sv}",
873 g_variant_new_string(peers[i].device_name));
874 g_variant_builder_add(&builder_peer, "{sv}",
876 wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
877 g_variant_builder_add(&builder_peer, "{sv}",
879 wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
880 g_variant_builder_add(&builder_peer, "{sv}",
882 wfd_manager_dbus_pack_ay(peers[i].ip_address, IPADDR_LEN));
883 g_variant_builder_add(&builder_peer, "{sv}",
885 g_variant_new_uint16(peers[i].channel));
886 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
887 g_variant_builder_add(&builder_peer, "{sv}",
889 g_variant_new_uint16(peers[i].services));
890 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
891 g_variant_builder_add(&builder_peer, "{sv}",
893 g_variant_new_uint16(peers[i].category));
894 g_variant_builder_add(&builder_peer, "{sv}",
896 g_variant_new_uint16(peers[i].subcategory));
897 g_variant_builder_add(&builder_peer, "{sv}",
899 g_variant_new_boolean(peers[i].is_p2p));
900 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
901 g_variant_builder_add(&builder_peer, "{sv}",
903 g_variant_new_boolean(peers[i].is_wfd_device));
904 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
906 WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
907 g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
910 ret = WIFI_DIRECT_ERROR_NONE;
911 return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
912 g_variant_builder_unref(builder_peers);
915 } else if (!g_strcmp0(method_name, "IsDiscoverable")) {
916 ret = WIFI_DIRECT_ERROR_NONE;
917 return_parameters = g_variant_new("(b)",
918 (manager->state == WIFI_DIRECT_STATE_DISCOVERING ||
919 wfd_group_is_autonomous(manager->group) == TRUE));
922 } else if (!g_strcmp0(method_name, "IsListeningOnly")) {
923 ret = WIFI_DIRECT_ERROR_NONE;
924 return_parameters = g_variant_new("(b)", (manager->scan_mode == WFD_SCAN_MODE_PASSIVE));
927 } else if (!g_strcmp0(method_name, "GetPeerInfo")) {
928 wfd_discovery_entry_s *peer = NULL;
929 GVariantBuilder *builder_peer = NULL;
930 const char *peer_mac_address = NULL;
931 unsigned char mac_addr[MACADDR_LEN] = {0, };
933 g_variant_get(parameters, "(&s)", &peer_mac_address);
934 macaddr_atoe(peer_mac_address, mac_addr);
936 builder_peer = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
938 ret = wfd_manager_get_peer_info(manager, mac_addr, &peer);
939 if (ret < 0 || !peer) {
940 WDS_LOGE("Failed to get peer info");
942 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
946 g_variant_builder_add(builder_peer, "{sv}",
948 g_variant_new_string(peer->device_name));
949 g_variant_builder_add(builder_peer, "{sv}",
951 wfd_manager_dbus_pack_ay(peer->mac_address, MACADDR_LEN));
952 g_variant_builder_add(builder_peer, "{sv}",
954 wfd_manager_dbus_pack_ay(peer->intf_address, MACADDR_LEN));
955 g_variant_builder_add(builder_peer, "{sv}",
957 g_variant_new_uint16(peer->channel));
958 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
959 g_variant_builder_add(builder_peer, "{sv}",
961 g_variant_new_uint16(peer->services));
962 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
963 g_variant_builder_add(builder_peer, "{sv}",
965 g_variant_new_boolean(peer->is_group_owner));
966 g_variant_builder_add(builder_peer, "{sv}",
968 g_variant_new_boolean(peer->is_persistent_go));
969 g_variant_builder_add(builder_peer, "{sv}",
971 g_variant_new_boolean(peer->is_connected));
972 g_variant_builder_add(builder_peer, "{sv}",
974 g_variant_new_uint16(peer->wps_device_pwd_id));
975 g_variant_builder_add(builder_peer, "{sv}",
977 g_variant_new_uint16(peer->wps_cfg_methods));
978 g_variant_builder_add(builder_peer, "{sv}",
980 g_variant_new_uint16(peer->category));
981 g_variant_builder_add(builder_peer, "{sv}",
983 g_variant_new_uint16(peer->subcategory));
984 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
985 g_variant_builder_add(builder_peer, "{sv}",
987 g_variant_new_boolean(peer->is_wfd_device));
988 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
989 #ifdef TIZEN_FEATURE_ASP
990 wfd_device_s *connected_peer = NULL;
991 connected_peer = wfd_group_find_member_by_addr(manager->group, mac_addr);
992 if (connected_peer) {
993 g_variant_builder_add(builder_peer, "{sv}",
995 g_variant_new_boolean(true));
996 g_variant_builder_add(builder_peer, "{sv}",
998 wfd_manager_dbus_pack_ay(connected_peer->ip_addr, IPADDR_LEN));
1000 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
1002 ret = WIFI_DIRECT_ERROR_NONE;
1003 return_parameters = g_variant_new("(ia{sv})", ret, builder_peer);
1004 g_variant_builder_unref(builder_peer);
1008 } else if (!g_strcmp0(method_name, "GetState")) {
1009 ret = WIFI_DIRECT_ERROR_NONE;
1010 return_parameters = g_variant_new("(ii)", ret, manager->state);
1014 WDS_LOGD("method not handled");
1015 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1020 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1025 /*g_dbus_method_invocation_return_dbus_error
1026 * (invocation, WFD_MANAGER_SERVICE ".Error", ".OperationFailed"); */
1028 wfd_error_set_gerror(ret, &err);
1029 dbus_error_name = g_dbus_error_encode_gerror(err);
1030 WDS_LOGD("g_dbus_method_invocation_return_gerror with [%s]", dbus_error_name);
1031 g_free(dbus_error_name);
1032 g_dbus_method_invocation_return_gerror(invocation, err);
1033 g_clear_error(&err);
1037 static void __wfd_manager_group_iface_handler(const gchar *method_name,
1038 GVariant *parameters,
1039 GDBusMethodInvocation *invocation)
1041 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1042 wfd_manager_s *manager = wfd_get_manager();
1043 GVariant *return_parameters = NULL;
1045 WDS_LOGD("%s", method_name);
1047 if (!g_strcmp0(method_name, "CreateGroup")) {
1048 wfd_group_s *group = manager->group;
1049 wfd_oem_group_param_s param;
1051 if (group || manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1052 WDS_LOGE("Group already exist or not a proper state");
1053 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1057 #ifdef TIZEN_WLAN_BOARD_SPRD
1058 group = wfd_create_pending_group(manager, manager->local->dev_addr);
1060 group = wfd_create_pending_group(manager, manager->local->intf_addr);
1063 WDS_LOGE("Failed to create pending group");
1064 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1067 group->flags |= WFD_GROUP_FLAG_AUTONOMOUS;
1068 manager->group = group;
1070 memset(¶m, 0x0, sizeof(param));
1072 param.persistent = (manager->local->group_flags &
1073 WFD_GROUP_FLAG_PERSISTENT);
1074 memcpy(&(param.passphrase), manager->local->passphrase,
1075 sizeof(param.passphrase));
1077 #ifndef TIZEN_WLAN_BOARD_SPRD
1078 param.freq = WFD_FREQ_2G;
1081 ret = wfd_oem_create_group(manager->oem_ops, ¶m);
1083 WDS_LOGE("Failed to create group");
1084 wfd_destroy_group(manager);
1085 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1089 WDS_LOGD("Succeeded to create pending group");
1090 memset(manager->local->passphrase, 0x0, PASSPHRASE_LEN_MAX + 1);
1091 ret = WIFI_DIRECT_ERROR_NONE;
1092 return_parameters = g_variant_new("(i)", ret);
1095 } else if (!g_strcmp0(method_name, "DestroyGroup")) {
1096 wfd_group_s *group = manager->group;
1098 WDS_LOGE("Group not exist");
1099 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1103 if (group->pending == FALSE) {
1104 ret = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1106 WDS_LOGE("Failed to destroy group");
1107 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1112 ret = wfd_destroy_group(manager);
1114 WDS_LOGE("Failed to destroy group");
1116 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1117 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1119 WFD_DBUS_REPLY_ERROR_NONE(invocation);
1121 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
1125 } else if (!g_strcmp0(method_name, "IsGroupOwner")) {
1127 wfd_device_s *local = manager->local;
1128 result = local->dev_role == WFD_DEV_ROLE_GO;
1129 WDS_LOGI("Is group owner : [%s]", result ? "Yes" : "No");
1130 return_parameters = g_variant_new("(b)", result);
1133 } else if (!g_strcmp0(method_name, "IsAutoGroup")) {
1135 if ((result = wfd_group_is_autonomous(manager->group)) < 0)
1138 WDS_LOGI("Is autonomous group : [%s]", result ? "Yes" : "No");
1139 return_parameters = g_variant_new("(b)", result);
1142 } else if (!g_strcmp0(method_name, "ActivatePushButton")) {
1143 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
1144 WDS_LOGE("Wi-Fi Direct is not Group Owner.");
1145 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1149 ret = wfd_oem_wps_start(manager->oem_ops, NULL,
1150 WFD_WPS_MODE_PBC, NULL);
1152 WDS_LOGE("Failed to start wps");
1153 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1156 return_parameters = g_variant_new("(i)", ret);
1159 } else if (!g_strcmp0(method_name, "GetPersistentGroups")) {
1160 int persistent_group_count = 0;
1161 wfd_persistent_group_info_s *plist;
1162 GVariantBuilder *builder_groups = NULL;
1165 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1166 WDS_LOGE("Wi-Fi Direct is not activated.");
1167 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1172 ret = wfd_oem_get_persistent_groups(manager->oem_ops,
1173 (wfd_oem_persistent_group_s**) &plist, &persistent_group_count);
1175 WDS_LOGE("Error!! wfd_oem_get_persistent_group_info() failed..");
1176 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1180 builder_groups = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
1182 for (i = 0; i < persistent_group_count; i++) {
1183 GVariantBuilder builder_group;
1184 g_variant_builder_init(&builder_group, G_VARIANT_TYPE("a{sv}"));
1186 g_variant_builder_add(&builder_group, "{sv}",
1188 g_variant_new_uint32(plist[i].network_id));
1189 g_variant_builder_add(&builder_group, "{sv}",
1191 g_variant_new_string(plist[i].ssid));
1192 g_variant_builder_add(&builder_group, "{sv}",
1194 wfd_manager_dbus_pack_ay(plist[i].go_mac_address, MACADDR_LEN));
1196 WDS_LOGD("%dth peer [%s]", i, plist[i].ssid);
1197 g_variant_builder_add_value(builder_groups, g_variant_builder_end(&builder_group));
1200 ret = WIFI_DIRECT_ERROR_NONE;
1201 return_parameters = g_variant_new("(iaa{sv})", ret, builder_groups);
1202 g_variant_builder_unref(builder_groups);
1205 } else if (!g_strcmp0(method_name, "RemovePersistentGroup")) {
1208 unsigned char go_mac_address[6];
1209 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1210 WDS_LOGE("Wi-Fi Direct is not activated.");
1211 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1215 g_variant_get(parameters, "(&s&s)", &mac_address, &ssid);
1216 macaddr_atoe(mac_address, go_mac_address);
1217 WDS_LOGD("Remove persistent group [%s][" MACSTR "]", ssid, MAC2STR(go_mac_address));
1219 ret = wfd_oem_remove_persistent_group(manager->oem_ops, ssid,
1222 WDS_LOGE("Failed to remove persistent group");
1223 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1226 return_parameters = g_variant_new("(i)", ret);
1229 } else if (!g_strcmp0(method_name, "SetPassphrase")) {
1231 int passphrase_len = 0;
1232 wfd_group_s *group = manager->group;
1235 WDS_LOGE("Group already exists");
1236 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1240 g_variant_get(parameters, "(&s)", &passphrase);
1241 passphrase_len = strlen(passphrase);
1243 if (passphrase_len < PASSPHRASE_LEN_MIN ||
1244 passphrase_len > PASSPHRASE_LEN_MAX) {
1245 WDS_LOGE("Passphrase length incorrect [%s]:[%d]",
1246 passphrase, passphrase_len);
1247 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1251 g_strlcpy(manager->local->passphrase, passphrase, PASSPHRASE_LEN_MAX + 1);
1252 WDS_LOGI("Passphrase string [%s]", manager->local->passphrase);
1254 ret = WIFI_DIRECT_ERROR_NONE;
1255 return_parameters = g_variant_new("(i)", ret);
1258 } else if (!g_strcmp0(method_name, "GetPassphrase")) {
1259 wfd_group_s *group = manager->group;
1261 WDS_LOGE("Group not exist");
1262 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1266 if (group->role == WFD_DEV_ROLE_GC) {
1267 WDS_LOGE("Device is not GO");
1268 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1272 ret = WIFI_DIRECT_ERROR_NONE;
1273 return_parameters = g_variant_new("(is)", ret, group->passphrase);
1274 WDS_LOGI("group->pass : [%s]", group->passphrase);
1278 } else if (!g_strcmp0(method_name, "SetPersistentGroupEnabled")) {
1281 g_variant_get(parameters, "(b)", &enabled);
1282 WDS_LOGI("Activate Persistent Group : [%s]",
1283 enabled ? "True" : "False");
1285 manager->local->group_flags |= WFD_GROUP_FLAG_PERSISTENT;
1287 manager->local->group_flags &= ~(WFD_GROUP_FLAG_PERSISTENT);
1288 ret = WIFI_DIRECT_ERROR_NONE;
1289 return_parameters = g_variant_new("(i)", ret);
1292 } else if (!g_strcmp0(method_name, "IsPersistentGroupEnabled")) {
1294 result = ((manager->local->group_flags &
1295 WFD_GROUP_FLAG_PERSISTENT)
1296 == WFD_GROUP_FLAG_PERSISTENT);
1297 WDS_LOGI("Is persistent group : [%s]", result ? "Yes" : "No");
1298 return_parameters = g_variant_new("(b)", result);
1302 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1307 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1311 wfd_error_set_gerror(ret, &err);
1312 g_dbus_method_invocation_return_gerror(invocation, err);
1313 g_clear_error(&err);
1317 static void __wfd_manager_config_iface_handler(const gchar *method_name,
1318 GVariant *parameters,
1319 GDBusMethodInvocation *invocation)
1321 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1322 wfd_manager_s *manager = wfd_get_manager();
1323 GVariant *return_parameters = NULL;
1325 WDS_LOGD("%s", method_name);
1327 if (!g_strcmp0(method_name, "GetDeviceName")) {
1328 char device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN+1] = {0, };
1330 ret = wfd_local_get_dev_name(device_name);
1332 WDS_LOGE("Failed to get device name");
1333 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1337 ret = WIFI_DIRECT_ERROR_NONE;
1338 return_parameters = g_variant_new("(is)", ret, device_name);
1342 } else if (!g_strcmp0(method_name, "SetDeviceName")) {
1343 const char *device_name = NULL;
1344 g_variant_get(parameters, "(&s)", &device_name);
1346 ret = wfd_local_set_dev_name((char *)device_name);
1348 WDS_LOGE("Failed to set device name");
1349 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1353 ret = WIFI_DIRECT_ERROR_NONE;
1354 return_parameters = g_variant_new("(i)", ret);
1357 } else if (!g_strcmp0(method_name, "GetWpsPin")) {
1358 wfd_session_s *session = (wfd_session_s*) manager->session;
1359 if (!session || manager->auto_pin[0] != 0) {
1360 WDS_LOGE("Session not exist");
1361 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1365 if (session->wps_pin[0] == '\0') {
1366 WDS_LOGE("WPS PIN is not set");
1367 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1371 ret = WIFI_DIRECT_ERROR_NONE;
1372 return_parameters = g_variant_new("(is)", ret, session->wps_pin);
1375 } else if (!g_strcmp0(method_name, "SetWpsPin")) {
1376 const char *pin = NULL;
1377 wfd_session_s *session = (wfd_session_s*) manager->session;
1379 g_variant_get(parameters, "(&s)", &pin);
1382 WDS_LOGE("Session not exist");
1383 g_strlcpy(manager->auto_pin, pin, strlen(pin) + 1);
1385 g_strlcpy(session->wps_pin, pin, strlen(pin) + 1);
1388 ret = WIFI_DIRECT_ERROR_NONE;
1389 return_parameters = g_variant_new("(i)", ret);
1392 } else if (!g_strcmp0(method_name, "GetSupportedWpsMode")) {
1393 int config_methods = 0;
1395 ret = wfd_local_get_supported_wps_mode(&config_methods);
1397 WDS_LOGE("Failed to get supported wps mode");
1398 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1402 ret = WIFI_DIRECT_ERROR_NONE;
1403 return_parameters = g_variant_new("(ii)", ret, config_methods);
1406 } else if (!g_strcmp0(method_name, "GetReqWpsMode")) {
1409 ret = wfd_manager_get_req_wps_mode(&wps_mode);
1411 WDS_LOGE("Failed to get request wps mode");
1412 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1416 ret = WIFI_DIRECT_ERROR_NONE;
1417 return_parameters = g_variant_new("(ii)", ret, wps_mode);
1420 } else if (!g_strcmp0(method_name, "SetReqWpsMode")) {
1423 g_variant_get(parameters, "(i)", &type);
1424 ret = wfd_manager_set_req_wps_mode(type);
1426 WDS_LOGE("Failed to set request wps mode");
1427 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1431 ret = WIFI_DIRECT_ERROR_NONE;
1432 return_parameters = g_variant_new("(i)", ret);
1435 } else if (!g_strcmp0(method_name, "GetLocalWpsMode")) {
1438 ret = wfd_local_get_wps_mode(&wps_mode);
1440 WDS_LOGE("Failed to get request wps mode");
1441 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1445 ret = WIFI_DIRECT_ERROR_NONE;
1446 return_parameters = g_variant_new("(ii)", ret, wps_mode);
1449 } else if (!g_strcmp0(method_name, "GetIPAddress")) {
1450 char ip_addr_str[IPSTR_LEN+1] = {0, };
1452 if (manager->state < WIFI_DIRECT_STATE_CONNECTED) {
1453 WDS_LOGE("Device is not connected yet");
1454 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1458 ret = wfd_local_get_ip_addr((char *)ip_addr_str);
1460 WDS_LOGE("Failed to get local IP address");
1461 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1465 return_parameters = g_variant_new("(is)", ret, ip_addr_str);
1466 WDS_LOGI("IP addr : [%s]", ip_addr_str);
1469 } else if (!g_strcmp0(method_name, "GetMacAddress")) {
1470 char device_mac[MACSTR_LEN+1] = {0, };
1472 ret = wfd_local_get_dev_mac(device_mac);
1474 WDS_LOGE("Failed to get device mac");
1475 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1479 ret = WIFI_DIRECT_ERROR_NONE;
1480 return_parameters = g_variant_new("(is)", ret, device_mac);
1483 } else if (!g_strcmp0(method_name, "GetGoIntent")) {
1486 ret = wfd_manager_get_go_intent(&go_intent);
1488 WDS_LOGE("Failed to get GO intent");
1489 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1493 ret = WIFI_DIRECT_ERROR_NONE;
1494 return_parameters = g_variant_new("(ii)", ret, go_intent);
1497 } else if (!g_strcmp0(method_name, "SetGoIntent")) {
1500 g_variant_get(parameters, "(i)", &go_intent);
1501 ret = wfd_manager_set_go_intent(go_intent);
1503 WDS_LOGE("Failed to set GO intent");
1504 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1508 ret = WIFI_DIRECT_ERROR_NONE;
1509 return_parameters = g_variant_new("(i)", ret);
1512 } else if (!g_strcmp0(method_name, "GetMaxClient")) {
1515 ret = wfd_manager_get_max_station(&max_client);
1517 WDS_LOGE("Failed to get max station");
1518 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1522 ret = WIFI_DIRECT_ERROR_NONE;
1523 return_parameters = g_variant_new("(ii)", ret, max_client);
1526 } else if (!g_strcmp0(method_name, "SetMaxClient")) {
1528 g_variant_get(parameters, "(i)", &max_client);
1530 ret = wfd_manager_set_max_station(max_client);
1532 WDS_LOGE("Failed to set max station");
1533 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1537 ret = WIFI_DIRECT_ERROR_NONE;
1538 return_parameters = g_variant_new("(i)", ret);
1541 } else if (!g_strcmp0(method_name, "SetAutoConnectionMode")) {
1542 gboolean mode = FALSE;
1544 g_variant_get(parameters, "(b)", &mode);
1545 ret = wfd_manager_set_autoconnection(mode);
1547 WDS_LOGE("Failed to set autoconnection");
1548 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1552 ret = WIFI_DIRECT_ERROR_NONE;
1553 return_parameters = g_variant_new("(i)", ret);
1556 } else if (!g_strcmp0(method_name, "IsAutoConnectionMode")) {
1559 ret = wfd_manager_get_autoconnection(&mode);
1561 WDS_LOGE("Failed to get autoconnection");
1562 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1566 ret = WIFI_DIRECT_ERROR_NONE;
1567 return_parameters = g_variant_new("(ib)", ret, mode);
1570 } else if (!g_strcmp0(method_name, "GetOperatingChannel")) {
1573 wfd_group_s *group = manager->group;
1575 WDS_LOGE("Group not exist");
1576 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1580 channel = wfd_util_freq_to_channel(group->freq);
1582 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1586 ret = WIFI_DIRECT_ERROR_NONE;
1587 return_parameters = g_variant_new("(ii)", ret, channel);
1590 } else if (!g_strcmp0(method_name, "SetAutoConnectionPeer")) {
1591 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1594 } else if (!g_strcmp0(method_name, "GetInterfaceName")) {
1595 wfd_group_s *group = (wfd_group_s *)manager->group;
1597 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1600 ret = WIFI_DIRECT_ERROR_NONE;
1601 return_parameters = g_variant_new("(is)", ret, group->ifname);
1604 } else if (!g_strcmp0(method_name, "GetSubnetMask")) {
1605 char *get_str = NULL;
1606 char subnet_mask[IPSTR_LEN+1] = {0, };
1608 get_str = vconf_get_str(VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK);
1610 WDS_LOGE("Get Subnet Mask failed");
1611 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1614 WDS_LOGD("VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK(%s) : %s", VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK,
1616 ret = WIFI_DIRECT_ERROR_NONE;
1617 g_strlcpy(subnet_mask, get_str, IPSTR_LEN + 1);
1618 return_parameters = g_variant_new("(is)", ret, subnet_mask);
1622 } else if (!g_strcmp0(method_name, "GetGateway")) {
1623 char *get_str = NULL;
1624 char gateway_addr[IPSTR_LEN+1] = {0, };
1625 get_str = vconf_get_str(VCONFKEY_WIFI_DIRECT_P2P_GATEWAY);
1627 WDS_LOGE("Get Gateway failed");
1628 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1631 WDS_LOGD("VCONFKEY_WIFI_DIRECT_P2P_GATEWAY_ADDR(%s) : %s", VCONFKEY_WIFI_DIRECT_P2P_GATEWAY,
1633 ret = WIFI_DIRECT_ERROR_NONE;
1634 g_strlcpy(gateway_addr, get_str, IPSTR_LEN + 1);
1635 return_parameters = g_variant_new("(is)", ret, gateway_addr);
1639 } else if (!g_strcmp0(method_name, "GetSessionTimer")) {
1641 int session_timer = 0;
1642 ret = WIFI_DIRECT_ERROR_NONE;
1643 session_timer = manager->session_timer;
1644 WDS_LOGD("Get Session Timer value is %d", session_timer);
1645 return_parameters = g_variant_new("(ii)", ret, session_timer);
1648 } else if (!g_strcmp0(method_name, "SetSessionTimer")) {
1650 int session_timer = 0;
1651 g_variant_get(parameters, "(i)", &session_timer);
1652 WDS_LOGD("Set Session Timer value is %d", session_timer);
1653 manager->session_timer = session_timer;
1654 ret = WIFI_DIRECT_ERROR_NONE;
1655 return_parameters = g_variant_new("(i)", ret);
1658 } else if (!g_strcmp0(method_name, "SetAutoGroupRemoval")) {
1661 g_variant_get(parameters, "(b)", &enable);
1662 WDS_LOGE("Activate Auto Group Removal Mode : [%s]",
1663 enable ? "True" : "False");
1665 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1666 WDS_LOGE("Wi-Fi Direct is not activated.");
1667 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1672 manager->auto_group_remove_enable = TRUE;
1674 /* Enable Group destroy only if state is connecting */
1675 if (manager->state == WIFI_DIRECT_STATE_CONNECTING) {
1676 WDS_LOGE("Wi-Fi Direct state is CONNECTING");
1677 ret = WIFI_DIRECT_ERROR_NONE;
1678 return_parameters = g_variant_new("(i)", ret);
1681 /* Remove group immediately if no connected peer found */
1682 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1683 wfd_group_s *group = (wfd_group_s*) manager->group;
1684 if (group && !group->member_count
1685 && wfd_util_is_remove_group_allowed())
1686 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1690 manager->auto_group_remove_enable = FALSE;
1693 ret = WIFI_DIRECT_ERROR_NONE;
1694 return_parameters = g_variant_new("(i)", ret);
1697 } else if (!g_strcmp0(method_name, "GetPrimaryDevType")) {
1699 int pri_dev_type = 0;
1700 ret = WIFI_DIRECT_ERROR_NONE;
1701 pri_dev_type = DEFAULT_PRIMARY_DEVICE_TYPE;
1702 WDS_LOGD("Get primary dev type value is %d", pri_dev_type);
1703 return_parameters = g_variant_new("(ii)", ret, pri_dev_type);
1706 } else if (!g_strcmp0(method_name, "GetSecondaryDevType")) {
1708 int sec_dev_type = 0;
1709 ret = WIFI_DIRECT_ERROR_NONE;
1710 sec_dev_type = DEFAULT_SECONDARY_DEVICE_TYPE;
1711 WDS_LOGD("Get secondary dev type value is %d", sec_dev_type);
1712 return_parameters = g_variant_new("(ii)", ret, sec_dev_type);
1716 WDS_LOGE("method not handled");
1717 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1722 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1726 wfd_error_set_gerror(ret, &err);
1727 g_dbus_method_invocation_return_gerror(invocation, err);
1728 g_clear_error(&err);
1732 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1733 static void __wfd_manager_service_iface_handler(const gchar *method_name,
1734 GVariant *parameters,
1735 GDBusMethodInvocation *invocation)
1737 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1738 wfd_manager_s *manager = wfd_get_manager();
1739 GVariant *return_parameters = NULL;
1741 WDS_LOGD("%s", method_name);
1743 if (!g_strcmp0(method_name, "StartDiscovery")) {
1744 const char *mac_address = NULL;
1746 unsigned char mac_addr[MACADDR_LEN] = {0, };
1748 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1749 WDS_LOGE("Wi-Fi Direct is not activated.");
1750 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1754 g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
1755 WDS_LOGD("Service type [%d]", service_type);
1756 macaddr_atoe(mac_address, mac_addr);
1758 ret = wfd_oem_start_service_discovery(manager->oem_ops,
1759 mac_addr, service_type);
1761 WDS_LOGE("Failed to start service discovery");
1762 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1766 WFD_DBUS_REPLY_ERROR_NONE(invocation);
1768 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1769 "DiscoveryStarted", NULL);
1772 } else if (!g_strcmp0(method_name, "StopDiscovery")) {
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_cancel_service_discovery(manager->oem_ops,
1788 mac_addr, service_type);
1790 WDS_LOGE("Failed to cancel service discovery");
1791 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1794 ret = WIFI_DIRECT_ERROR_NONE;
1795 return_parameters = g_variant_new("(i)", ret);
1798 } else if (!g_strcmp0(method_name, "Register")) {
1801 const char *info_str = NULL;
1803 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1804 WDS_LOGE("Wi-Fi Direct is not activated.");
1805 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1809 g_variant_get(parameters, "(i&s)", &service_type, &info_str);
1810 WDS_LOGD("Register service [%d: %s]", service_type, info_str);
1812 ret = wfd_service_add(service_type, (char *)info_str, &service_id);
1814 WDS_LOGE("Failed to add service");
1815 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1819 ret = WIFI_DIRECT_ERROR_NONE;
1820 return_parameters = g_variant_new("(ii)", ret, service_id);
1823 } else if (!g_strcmp0(method_name, "Deregister")) {
1826 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1827 WDS_LOGE("Wi-Fi Direct is not activated.");
1828 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1832 g_variant_get(parameters, "(i)", &service_id);
1833 WDS_LOGD("Service id [%d]", service_id);
1835 ret = wfd_service_del(service_id);
1837 WDS_LOGE("Failed to delete service");
1838 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1842 ret = WIFI_DIRECT_ERROR_NONE;
1843 return_parameters = g_variant_new("(i)", ret);
1847 WDS_LOGD("method not handled");
1848 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1853 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1857 wfd_error_set_gerror(ret, &err);
1858 g_dbus_method_invocation_return_gerror(invocation, err);
1859 g_clear_error(&err);
1862 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1864 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1865 static void __wfd_manager_display_iface_handler(const gchar *method_name,
1866 GVariant *parameters,
1867 GDBusMethodInvocation *invocation)
1869 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1870 wfd_manager_s *manager = wfd_get_manager();
1871 GVariant *return_parameters = NULL;
1873 WDS_LOGD("%s", method_name);
1875 if (!g_strcmp0(method_name, "Init")) {
1876 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1877 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1881 wfd_device_s * device = manager->local;
1883 ret = wfd_oem_miracast_init(manager->oem_ops, TRUE);
1885 WDS_LOGE("Failed to initialize display");
1886 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1890 device->display.type = WIFI_DISPLAY_DEFAULT_TYPE;
1891 device->display.port = WIFI_DISPLAY_DEFAULT_PORT;
1892 device->display.availability = WIFI_DISPLAY_DEFAULT_AVAIL;
1893 device->display.hdcp_support = WIFI_DISPLAY_DEFAULT_HDCP;
1895 ret = WIFI_DIRECT_ERROR_NONE;
1896 return_parameters = g_variant_new("(i)", ret);
1899 } else if (!g_strcmp0(method_name, "Deinit")) {
1900 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1901 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1905 wfd_device_s * device = manager->local;
1907 ret = wfd_oem_miracast_init(manager->oem_ops, FALSE);
1909 WDS_LOGE("Failed to deinitialize display");
1910 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1914 memset(&(device->display), 0x0, sizeof(wfd_display_type_e));
1916 ret = WIFI_DIRECT_ERROR_NONE;
1917 return_parameters = g_variant_new("(i)", ret);
1920 } else if (!g_strcmp0(method_name, "SetConfig")) {
1921 int type, port, hdcp;
1922 g_variant_get(parameters, "(iii)", &type, &port, &hdcp);
1924 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1925 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1929 WDS_LOGD("type %d port %d hdcp %d", type, port, hdcp);
1931 ret = wfd_manager_set_display_device(type, port, hdcp);
1933 WDS_LOGE("Failed to set display device settings");
1934 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1938 ret = WIFI_DIRECT_ERROR_NONE;
1939 return_parameters = g_variant_new("(i)", ret);
1942 } else if (!g_strcmp0(method_name, "SetAvailiability")) {
1944 g_variant_get(parameters, "(i)", &availability);
1946 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1947 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1951 ret = wfd_manager_set_session_availability(availability);
1953 WDS_LOGE("Failed to set session availability");
1954 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1958 ret = WIFI_DIRECT_ERROR_NONE;
1959 return_parameters = g_variant_new("(i)", ret);
1962 } else if (!g_strcmp0(method_name, "GetPeerType")) {
1963 wfd_device_s *peer = NULL;
1964 const char *mac_address = NULL;
1965 unsigned char mac_addr[MACADDR_LEN] = {0, };
1967 g_variant_get(parameters, "(&s)", &mac_address);
1968 macaddr_atoe(mac_address, mac_addr);
1970 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1971 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1975 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
1977 WDS_LOGE("Failed to get peer");
1978 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1982 ret = WIFI_DIRECT_ERROR_NONE;
1983 return_parameters = g_variant_new("(ii)", ret, peer->display.type);
1986 } else if (!g_strcmp0(method_name, "GetPeerAvailability")) {
1987 wfd_device_s *peer = NULL;
1988 const char *mac_address = NULL;
1989 unsigned char mac_addr[MACADDR_LEN] = {0, };
1991 g_variant_get(parameters, "(&s)", &mac_address);
1992 macaddr_atoe(mac_address, mac_addr);
1994 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1995 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1999 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2001 WDS_LOGE("Failed to get peer");
2002 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2006 ret = WIFI_DIRECT_ERROR_NONE;
2007 return_parameters = g_variant_new("(ii)", ret, peer->display.availability);
2010 } else if (!g_strcmp0(method_name, "GetPeerHdcp")) {
2011 wfd_device_s *peer = NULL;
2012 const char *mac_address = NULL;
2013 unsigned char mac_addr[MACADDR_LEN] = {0, };
2015 g_variant_get(parameters, "(&s)", &mac_address);
2016 macaddr_atoe(mac_address, mac_addr);
2018 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2019 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2023 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2025 WDS_LOGE("Failed to get peer");
2026 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2030 ret = WIFI_DIRECT_ERROR_NONE;
2031 return_parameters = g_variant_new("(ii)", ret, peer->display.hdcp_support);
2034 } else if (!g_strcmp0(method_name, "GetPeerPort")) {
2035 wfd_device_s *peer = NULL;
2036 const char *mac_address = NULL;
2037 unsigned char mac_addr[MACADDR_LEN] = {0, };
2039 g_variant_get(parameters, "(&s)", &mac_address);
2040 macaddr_atoe(mac_address, mac_addr);
2042 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2043 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2047 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2049 WDS_LOGE("Failed to get peer");
2050 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2054 ret = WIFI_DIRECT_ERROR_NONE;
2055 return_parameters = g_variant_new("(ii)", ret, peer->display.port);
2058 } else if (!g_strcmp0(method_name, "GetPeerThroughput")) {
2059 wfd_device_s *peer = NULL;
2060 const char *mac_address = NULL;
2061 unsigned char mac_addr[MACADDR_LEN] = {0, };
2063 g_variant_get(parameters, "(&s)", &mac_address);
2064 macaddr_atoe(mac_address, mac_addr);
2066 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2067 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2071 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2073 WDS_LOGE("Failed to get peer");
2074 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2078 ret = WIFI_DIRECT_ERROR_NONE;
2079 return_parameters = g_variant_new("(ii)", ret, peer->display.max_tput);
2083 WDS_LOGD("method not handled");
2084 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2089 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
2093 wfd_error_set_gerror(ret, &err);
2094 g_dbus_method_invocation_return_gerror(invocation, err);
2095 g_clear_error(&err);
2098 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
2099 #if defined(TIZEN_FEATURE_ASP)
2101 static void __g_variant_to_txt_record(GVariant *variant, char **txt_record)
2103 GVariantIter *iter = NULL;
2105 GVariant *value = NULL;
2107 const char *str = NULL;
2111 gsize value_length = 0;
2112 __WDS_LOG_FUNC_ENTER__;
2114 DBUS_DEBUG_VARIANT(variant);
2115 g_variant_get(variant, "a{sv}", &iter);
2116 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2117 WDS_LOGD("%s %s", key, g_variant_get_string(value, &value_length));
2118 txt_length += strlen(key);
2119 str = g_variant_get_string(value, &value_length);
2120 txt_length += (int)value_length;
2124 g_variant_iter_free(iter);
2125 if (txt_length == 0) {
2126 __WDS_LOG_FUNC_EXIT__;
2130 buff = g_try_malloc0(txt_length);
2132 WDS_LOGE("g_try_malloc0 failed");
2133 __WDS_LOG_FUNC_EXIT__;
2137 g_variant_get(variant, "a{sv}", &iter);
2138 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2139 key_length = strlen(key);
2140 str = g_variant_get_string(value, &value_length);
2142 g_strlcpy(pos, key, key_length + 1);
2147 g_strlcpy(pos, str, value_length + 1);
2148 pos += (int)value_length;
2152 buff[txt_length -1] = '\0';
2154 g_variant_iter_free(iter);
2157 __WDS_LOG_FUNC_EXIT__;
2161 static void __g_variant_to_seek_info(GVariant *variant, char **seek_info)
2163 GVariantIter *iter = NULL;
2167 int seek_length = 0;
2170 DBUS_DEBUG_VARIANT(variant);
2171 g_variant_get(variant, "as", &iter);
2172 while (g_variant_iter_loop(iter, "s", &key)) {
2173 seek_length += strlen(key);
2177 g_variant_iter_free(iter);
2178 if (seek_length == 0)
2181 buff = g_try_malloc0(seek_length);
2183 WDS_LOGE("g_try_malloc0 failed");
2187 g_variant_get(variant, "as", &iter);
2188 while (g_variant_iter_loop(iter, "s", &key)) {
2189 key_length = strlen(key);
2191 g_strlcpy(pos, key, key_length + 1);
2196 buff[seek_length -1] = '\0';
2198 g_variant_iter_free(iter);
2204 static void __wfd_manager_asp_iface_handler(const gchar *method_name,
2205 GVariant *parameters,
2206 GDBusMethodInvocation *invocation)
2208 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2209 wfd_manager_s *manager = wfd_get_manager();
2210 GVariant *return_parameters = NULL;
2212 WDS_LOGD("%s", method_name);
2214 if (!g_strcmp0(method_name, "AdvertiseService")) {
2216 wfd_oem_asp_service_s service;
2217 GVariantIter *iter = NULL;
2219 GVariant *var = NULL;
2222 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2223 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2224 manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
2225 WDS_LOGE("Wi-Fi Direct is not available status for Advertising.");
2226 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2230 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2231 g_variant_get(parameters, "(a{sv})", &iter);
2232 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2233 if (!g_strcmp0(key, "adv_id"))
2234 g_variant_get(var, "u", &(service.adv_id));
2235 else if (!g_strcmp0(key, "discovery_tech"))
2236 g_variant_get(var, "i", &(service.discovery_tech));
2237 else if (!g_strcmp0(key, "preferred_connection"))
2238 g_variant_get(var, "y", &(service.preferred_connection));
2239 else if (!g_strcmp0(key, "auto_accept"))
2240 g_variant_get(var, "i", &(service.auto_accept));
2241 else if (!g_strcmp0(key, "status"))
2242 g_variant_get(var, "y", &(service.status));
2243 else if (!g_strcmp0(key, "role"))
2244 g_variant_get(var, "y", &(service.role));
2245 else if (!g_strcmp0(key, "replace"))
2246 g_variant_get(var, "i", &(replace));
2247 else if (!g_strcmp0(key, "config_method"))
2248 g_variant_get(var, "u", &(service.config_method));
2249 else if (!g_strcmp0(key, "instance_name"))
2250 g_variant_get(var, "&s", &(service.instance_name));
2251 else if (!g_strcmp0(key, "service_type"))
2252 g_variant_get(var, "&s", &(service.service_type));
2253 else if (!g_strcmp0(key, "service_info"))
2254 __g_variant_to_txt_record(var, &(service.service_info));
2255 else if (!g_strcmp0(key, "rsp_info"))
2256 g_variant_get(var, "&s", &(service.rsp_info));
2261 ret = wfd_oem_advertise_service(manager->oem_ops, &service, replace);
2263 WDS_LOGE("Failed to add service");
2264 g_free(service.service_info);
2265 g_variant_iter_free(iter);
2266 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2269 g_free(service.service_info);
2270 g_variant_iter_free(iter);
2272 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
2273 WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
2277 ret = wfd_manager_start_discovery(manager, WFD_OEM_SCAN_MODE_PASSIVE, 0, 0, 0);
2278 if (ret == WIFI_DIRECT_ERROR_NONE) {
2279 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2283 wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
2284 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2288 ret = WIFI_DIRECT_ERROR_NONE;
2289 return_parameters = g_variant_new("(i)", ret);
2292 } else if (!g_strcmp0(method_name, "CancelAdvertiseService")) {
2294 wfd_oem_asp_service_s service;
2295 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2297 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2298 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2302 g_variant_get(parameters, "(u)", &(service.adv_id));
2303 ret = wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
2305 WDS_LOGE("Failed to del service");
2306 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2310 ret = WIFI_DIRECT_ERROR_NONE;
2311 return_parameters = g_variant_new("(i)", ret);
2314 } else if (!g_strcmp0(method_name, "SeekService")) {
2316 wfd_oem_asp_service_s service;
2317 GVariantIter *iter = NULL;
2319 GVariant *var = NULL;
2321 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2322 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2323 manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
2324 WDS_LOGE("Wi-Fi Direct is not available status to Seek.");
2325 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2329 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2330 g_variant_get(parameters, "(a{sv})", &iter);
2331 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2332 if (!g_strcmp0(key, "discovery_tech"))
2333 g_variant_get(var, "i", &(service.discovery_tech));
2334 else if (!g_strcmp0(key, "search_id"))
2335 g_variant_get(var, "t", &(service.asp_search_id));
2336 else if (!g_strcmp0(key, "preferred_connection"))
2337 g_variant_get(var, "y", &(service.preferred_connection));
2338 else if (!g_strcmp0(key, "service_type"))
2339 g_variant_get(var, "&s", &(service.service_type));
2340 else if (!g_strcmp0(key, "service_info"))
2341 __g_variant_to_seek_info(var, &(service.service_info));
2346 ret = wfd_oem_seek_service(manager->oem_ops, &service);
2348 WDS_LOGE("Failed to seek service");
2349 g_free(service.service_info);
2350 g_variant_iter_free(iter);
2351 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2354 g_free(service.service_info);
2355 g_variant_iter_free(iter);
2357 WDS_LOGD("search_id [%x]", service.search_id);
2359 ret = wfd_manager_start_discovery(manager, WFD_OEM_SCAN_MODE_ACTIVE, 0, 0, 0);
2360 if (ret == WIFI_DIRECT_ERROR_NONE) {
2361 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2365 wfd_oem_cancel_seek_service(manager->oem_ops, &service);
2366 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2370 ret = WIFI_DIRECT_ERROR_NONE;
2371 return_parameters = g_variant_new("(i)", ret);
2374 } else if (!g_strcmp0(method_name, "CancelSeekService")) {
2376 wfd_oem_asp_service_s service;
2377 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2379 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2380 WDS_LOGE("Wi-Fi Direct is not activated.");
2381 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2385 g_variant_get(parameters, "(t)", &(service.asp_search_id));
2386 ret = wfd_oem_cancel_seek_service(manager->oem_ops, &service);
2388 WDS_LOGE("Failed to cancel seek service");
2389 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2393 ret = WIFI_DIRECT_ERROR_NONE;
2394 return_parameters = g_variant_new("(i)", ret);
2396 } else if (!g_strcmp0(method_name, "ConnectSession")) {
2398 GVariantIter *iter = NULL;
2400 GVariant *var = NULL;
2401 wfd_oem_asp_prov_s prov_params;
2402 const char *mac_str = NULL;
2403 unsigned char role = 0;
2404 unsigned int config = 0;
2407 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2408 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2409 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
2410 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2414 memset(&prov_params, 0, sizeof(wfd_oem_asp_prov_s));
2416 g_variant_get(parameters, "(a{sv})", &iter);
2417 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2419 if (!g_strcmp0(key, "service_mac")) {
2420 g_variant_get(var, "&s", &mac_str);
2421 if (mac_str == NULL) {
2422 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2423 g_variant_iter_free(iter);
2426 macaddr_atoe(mac_str, prov_params.service_mac);
2427 } else if (!g_strcmp0(key, "adv_id")) {
2428 g_variant_get(var, "u", &(prov_params.adv_id));
2429 } else if (!g_strcmp0(key, "session_mac")) {
2430 g_variant_get(var, "&s", &mac_str);
2431 if (mac_str == NULL) {
2432 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2433 g_variant_iter_free(iter);
2436 macaddr_atoe(mac_str, prov_params.session_mac);
2437 } else if (!g_strcmp0(key, "session_id")) {
2438 g_variant_get(var, "u", &(prov_params.session_id));
2439 } else if (!g_strcmp0(key, "role")) {
2440 g_variant_get(var, "y", &(role));
2441 prov_params.network_role = (int)role;
2442 } else if (!g_strcmp0(key, "config_method")) {
2443 g_variant_get(var, "u", &(config));
2444 prov_params.network_config = (int)config;
2445 } else if (!g_strcmp0(key, "session_info")) {
2446 g_variant_get(var, "&s", &(prov_params.session_information));
2452 if (ISZEROMACADDR(prov_params.service_mac) ||
2453 ISZEROMACADDR(prov_params.session_mac)) {
2454 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2455 g_variant_iter_free(iter);
2459 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2461 wfd_asp_connect_status(prov_params.session_mac,
2462 prov_params.session_id,
2463 ASP_CONNECT_STATUS_REQUEST_SENT,
2466 wfd_group_s *group = (wfd_group_s*) manager->group;
2467 if (group && group->member_count >= manager->max_station) {
2469 status = ASP_CONNECT_STATUS_NOMORE_CONNECT;
2470 wfd_asp_connect_status(prov_params.session_mac,
2471 prov_params.session_id,
2474 g_variant_iter_free(iter);
2475 __WDS_LOG_FUNC_EXIT__;
2479 ret = wfd_manager_asp_connect_session(manager, &prov_params);
2480 if (ret == WIFI_DIRECT_ERROR_NONE) {
2481 char peer_mac_address[MACSTR_LEN] = {0,};
2482 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(prov_params.service_mac));
2483 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2485 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
2486 WFD_EVENT_CONNECTION_IN_PROGRESS,
2489 wfd_asp_connect_status(prov_params.session_mac,
2490 prov_params.session_id,
2491 ASP_CONNECT_STATUS_REQUEST_FAILED,
2494 g_variant_iter_free(iter);
2495 __WDS_LOG_FUNC_EXIT__;
2498 } else if (!g_strcmp0(method_name, "ConfirmSession")) {
2500 GVariantIter *iter = NULL;
2502 GVariant *var = NULL;
2503 wfd_oem_asp_prov_s prov_params;
2504 const char *mac_str = NULL;
2505 const char *pin = NULL;
2508 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
2509 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2513 memset(&prov_params, 0, sizeof(wfd_oem_asp_prov_s));
2515 g_variant_get(parameters, "(a{sv})", &iter);
2516 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2518 if (!g_strcmp0(key, "session_mac")) {
2519 g_variant_get(var, "&s", &mac_str);
2520 if (mac_str == NULL) {
2521 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2522 g_variant_iter_free(iter);
2525 macaddr_atoe(mac_str, prov_params.session_mac);
2526 } else if (!g_strcmp0(key, "session_id")) {
2527 g_variant_get(var, "u", &(prov_params.session_id));
2528 } else if (!g_strcmp0(key, "confirmed")) {
2529 g_variant_get(var, "y", &(confirmed));
2530 } else if (!g_strcmp0(key, "pin")) {
2531 g_variant_get(var, "&s", &(pin));
2532 g_strlcpy(prov_params.wps_pin, pin, PINSTR_LEN);
2538 if (ISZEROMACADDR(prov_params.session_mac)) {
2539 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2540 g_variant_iter_free(iter);
2544 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2546 ret = wfd_manager_asp_confirm_session(manager, &prov_params, confirmed);
2547 if (ret == WIFI_DIRECT_ERROR_NONE && confirmed > 0) {
2548 char peer_mac_address[MACSTR_LEN] = {0,};
2549 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(prov_params.service_mac));
2550 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2552 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
2553 WFD_EVENT_CONNECTION_IN_PROGRESS,
2555 wfd_asp_connect_status(prov_params.session_mac,
2556 prov_params.session_id,
2557 ASP_CONNECT_STATUS_REQUEST_ACCEPTED,
2560 wfd_asp_connect_status(prov_params.session_mac,
2561 prov_params.session_id,
2562 ASP_CONNECT_STATUS_REQUEST_FAILED,
2565 g_variant_iter_free(iter);
2566 __WDS_LOG_FUNC_EXIT__;
2571 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
2572 __WDS_LOG_FUNC_EXIT__;
2576 wfd_error_set_gerror(ret, &err);
2577 g_dbus_method_invocation_return_gerror(invocation, err);
2578 g_clear_error(&err);
2579 __WDS_LOG_FUNC_EXIT__;
2586 const gchar *iface_name;
2587 void (*function) (const gchar *method_name,
2588 GVariant *parameters,
2589 GDBusMethodInvocation *invocation);
2590 } wfd_manager_iface_map[] = {
2593 WFD_MANAGER_MANAGE_INTERFACE,
2594 __wfd_manager_manage_iface_handler
2598 WFD_MANAGER_GROUP_INTERFACE,
2599 __wfd_manager_group_iface_handler
2603 WFD_MANAGER_CONFIG_INTERFACE,
2604 __wfd_manager_config_iface_handler
2606 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
2609 WFD_MANAGER_SERVICE_INTERFACE,
2610 __wfd_manager_service_iface_handler
2612 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
2613 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
2616 WFD_MANAGER_DISPLAY_INTERFACE,
2617 __wfd_manager_display_iface_handler
2619 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
2620 #if defined(TIZEN_FEATURE_ASP)
2623 WFD_MANAGER_ASP_INTERFACE,
2624 __wfd_manager_asp_iface_handler
2634 /* GDBus method handler */
2635 static void wfd_manager_method_call_handler (GDBusConnection *connection,
2636 const gchar *sender,
2637 const gchar *object_path,
2638 const gchar *interface_name,
2639 const gchar *method_name,
2640 GVariant *parameters,
2641 GDBusMethodInvocation *invocation,
2646 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
2647 if (!g_strcmp0(method_name, "AddClient"))
2648 wfd_manager_add_active_client(sender);
2649 #endif /* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
2652 WDS_LOGD("interface : [%s], method : [%s]", interface_name, method_name);
2653 DBUS_DEBUG_VARIANT(parameters);
2655 while (wfd_manager_iface_map[count].iface_name != NULL) {
2656 if (!g_strcmp0(interface_name, wfd_manager_iface_map[count].iface_name)) {
2658 wfd_manager_iface_map[count].function(method_name,
2667 static const GDBusInterfaceVTable wfd_manager_interface_vtable = {
2668 wfd_manager_method_call_handler, NULL, NULL};
2670 void wfd_manager_dbus_unregister(void)
2674 wfd_error_deregister();
2676 while (wfd_manager_iface_map[count].iface_name != NULL) {
2677 wfd_manager_dbus_iface_unregister(wfd_manager_iface_map[count].reg_id);
2682 gboolean wfd_manager_dbus_register(void)
2684 GDBusNodeInfo *node_info = NULL;
2685 GError *Error = NULL;
2688 wfd_error_register();
2690 node_info = g_dbus_node_info_new_for_xml(wfd_manager_introspection_xml, &Error);
2691 if (node_info == NULL) {
2692 WDS_LOGE("Failed to get node info, Error: %s", Error->message);
2693 g_clear_error(&Error);
2697 while (wfd_manager_iface_map[count].iface_name != NULL) {
2698 wfd_manager_iface_map[count].reg_id =
2699 wfd_manager_dbus_iface_register(wfd_manager_iface_map[count].iface_name,
2702 &wfd_manager_interface_vtable);
2704 WDS_LOGD("Registered Interface [%d, %s]",
2705 wfd_manager_iface_map[count].reg_id,
2706 wfd_manager_iface_map[count].iface_name);
2711 g_dbus_node_info_unref(node_info);