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 */
48 #define WFD_DBUS_REPLY_ERROR_NONE(invocation) \
49 g_dbus_method_invocation_return_value((invocation), g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE))
51 #define WFD_DBUS_REPLY_PARAMS(invocation, params) \
52 g_dbus_method_invocation_return_value((invocation), (params))
54 static int macaddr_atoe(const char *p, unsigned char mac[])
59 mac[i++] = (char) strtoul(p, (char **) &p, 16);
67 // introspection xml to register interfaces
68 const gchar wfd_manager_introspection_xml[] = {
69 "<node name='/net/wifidirect'>"
70 "<interface name='net.wifidirect'>"
71 "<method name='Activate'>"
72 "<arg type='i' name='error_code' direction='out'/>"
74 "<method name='Deactivate'>"
75 "<arg type='i' name='error_code' direction='out'/>"
77 "<method name='StartDiscovery'>"
78 "<arg type='a{sv}' name='parameters' direction='in'/>"
79 "<arg type='i' name='error_code' direction='out'/>"
81 "<method name='StopDiscovery'>"
82 "<arg type='i' name='error_code' direction='out'/>"
84 "<method name='GetDiscoveredPeers'>"
85 "<arg type='i' name='error_code' direction='out'/>"
86 "<arg type='aa{sv}' name='peer_details_list' direction='out'/>"
88 "<method name='Connect'>"
89 "<arg type='s' name='mac_address' direction='in'/>"
90 "<arg type='i' name='error_code' direction='out'/>"
92 "<method name='Disconnect'>"
93 "<arg type='s' name='mac_address' direction='in'/>"
94 "<arg type='i' name='error_code' direction='out'/>"
96 "<method name='CancelConnection'>"
97 "<arg type='s' name='mac_address' direction='in'/>"
98 "<arg type='i' name='error_code' direction='out'/>"
100 "<method name='AcceptConnection'>"
101 "<arg type='s' name='mac_address' direction='in'/>"
102 "<arg type='i' name='error_code' direction='out'/>"
104 "<method name='RejectConnection'>"
105 "<arg type='s' name='mac_address' direction='in'/>"
106 "<arg type='i' name='error_code' direction='out'/>"
108 "<method name='DisconnectAll'>"
109 "<arg type='i' name='error_code' direction='out'/>"
111 "<method name='GetConnectedPeers'>"
112 "<arg type='i' name='error_code' direction='out'/>"
113 "<arg type='aa{sv}' name='peer_details_list' direction='out'/>"
115 "<method name='IsDiscoverable'>"
116 "<arg type='b' name='result' direction='out'/>"
118 "<method name='IsListeningOnly'>"
119 "<arg type='b' name='result' direction='out'/>"
121 "<method name='GetPeerInfo'>"
122 "<arg type='s' name='mac_address' direction='in'/>"
123 "<arg type='i' name='error_code' direction='out'/>"
124 "<arg type='a{sv}' name='peer_details' direction='out'/>"
126 "<method name='GetState'>"
127 "<arg type='i' name='error_code' direction='out'/>"
128 "<arg type='i' name='state' direction='out'/>"
130 "<signal name='Activation'>"
131 "<arg type='i' name='error_code'/>"
133 "<signal name='Deactivation'>"
134 "<arg type='i' name='error_code'/>"
136 "<signal name='Connection'>"
137 "<arg type='i' name='error_code'/>"
138 "<arg type='i' name='connection_state'/>"
139 "<arg type='s' name='peer_mac_address'/>"
141 "<signal name='Disconnection'>"
142 "<arg type='i' name='error_code'/>"
143 "<arg type='i' name='connection_state'/>"
144 "<arg type='s' name='peer_mac_address'/>"
146 "<signal name='ListenStarted'>"
148 "<signal name='DiscoveryStarted'>"
150 "<signal name='DiscoveryFinished'>"
152 "<signal name='PeerFound'>"
153 "<arg type='s' name='peer_mac_address'/>"
155 "<signal name='PeerLost'>"
156 "<arg type='s' name='peer_mac_address'/>"
158 "<signal name='PeerIPAssigned'>"
159 "<arg type='s' name='peer_mac_address'/>"
160 "<arg type='s' name='assigned_ip_address'/>"
163 "<interface name='net.wifidirect.group'>"
164 "<method name='CreateGroup'>"
165 "<arg type='i' name='error_code' direction='out'/>"
167 "<method name='DestroyGroup'>"
168 "<arg type='i' name='error_code' direction='out'/>"
170 "<method name='IsGroupOwner'>"
171 "<arg type='b' name='result' direction='out'/>"
173 "<method name='IsAutoGroup'>"
174 "<arg type='b' name='result' direction='out'/>"
176 "<method name='ActivatePushButton'>"
177 "<arg type='i' name='error_code' direction='out'/>"
179 "<method name='GetPersistentGroups'>"
180 "<arg type='i' name='error_code' direction='out'/>"
181 "<arg type='aa{sv}' name='result' direction='out'/>"
183 "<method name='RemovePersistentGroup'>"
184 "<arg type='s' name='mac_address' direction='in'/>"
185 "<arg type='s' name='ssid' direction='in'/>"
186 "<arg type='i' name='error_code' direction='out'/>"
188 "<method name='SetPassphrase'>"
189 "<arg type='s' name='passphrase' direction='in'/>"
190 "<arg type='i' name='error_code' direction='out'/>"
192 "<method name='GetPassphrase'>"
193 "<arg type='i' name='error_code' direction='out'/>"
194 "<arg type='s' name='passphrase' direction='out'/>"
196 "<method name='SetPersistentGroupEnabled'>"
197 "<arg type='b' name='enable' direction='in'/>"
198 "<arg type='i' name='error_code' direction='out'/>"
200 "<method name='IsPersistentGroupEnabled'>"
201 "<arg type='b' name='result' direction='out'/>"
203 "<signal name='Created'>"
205 "<signal name='Destroyed'>"
208 "<interface name='net.wifidirect.config'>"
209 "<method name='GetDeviceName'>"
210 "<arg type='i' name='error_code' direction='out'/>"
211 "<arg type='s' name='device_name' direction='out'/>"
213 "<method name='SetDeviceName'>"
214 "<arg type='s' name='device_name' direction='in'/>"
215 "<arg type='i' name='error_code' direction='out'/>"
217 "<method name='SetWpsPin'>"
218 "<arg type='s' name='wps_pin' direction='in'/>"
219 "<arg type='i' name='error_code' direction='out'/>"
221 "<method name='GetWpsPin'>"
222 "<arg type='i' name='error_code' direction='out'/>"
223 "<arg type='s' name='wps_pin' direction='out'/>"
225 "<method name='GenerateWpsPin'>"
226 "<arg type='i' name='error_code' direction='out'/>"
227 "<arg type='s' name='wps_pin' direction='out'/>"
229 "<method name='GetSupportedWpsMode'>"
230 "<arg type='i' name='error_code' direction='out'/>"
231 "<arg type='i' name='config_methods' direction='out'/>"
233 "<method name='GetReqWpsMode'>"
234 "<arg type='i' name='error_code' direction='out'/>"
235 "<arg type='i' name='req_wps_mode' direction='out'/>"
237 "<method name='SetReqWpsMode'>"
238 "<arg type='i' name='req_wps_mode' direction='in'/>"
239 "<arg type='i' name='error_code' direction='out'/>"
241 "<method name='GetLocalWpsMode'>"
242 "<arg type='i' name='error_code' direction='out'/>"
243 "<arg type='i' name='local_wps_mode' direction='out'/>"
245 "<method name='GetIPAddress'>"
246 "<arg type='i' name='error_code' direction='out'/>"
247 "<arg type='s' name='local_ip_address' direction='out'/>"
249 "<method name='GetMacAddress'>"
250 "<arg type='i' name='error_code' direction='out'/>"
251 "<arg type='s' name='local_mac_address' direction='out'/>"
253 "<method name='GetGoIntent'>"
254 "<arg type='i' name='error_code' direction='out'/>"
255 "<arg type='i' name='go_intent' direction='out'/>"
257 "<method name='SetGoIntent'>"
258 "<arg type='i' name='go_intent' direction='in'/>"
259 "<arg type='i' name='error_code' direction='out'/>"
261 "<method name='GetMaxClient'>"
262 "<arg type='i' name='error_code' direction='out'/>"
263 "<arg type='i' name='max_client' direction='out'/>"
265 "<method name='SetMaxClient'>"
266 "<arg type='i' name='max_client' direction='in'/>"
267 "<arg type='i' name='error_code' direction='out'/>"
269 "<method name='SetAutoConnectionMode'>"
270 "<arg type='b' name='auto_connection_mode' direction='in'/>"
271 "<arg type='i' name='error_code' direction='out'/>"
273 "<method name='IsAutoConnectionMode'>"
274 "<arg type='i' name='error_code' direction='out'/>"
275 "<arg type='b' name='result' direction='out'/>"
277 "<method name='GetOperatingChannel'>"
278 "<arg type='i' name='error_code' direction='out'/>"
279 "<arg type='i' name='operating_channel' direction='out'/>"
281 "<method name='SetAutoConnectionPeer'>"
282 "<arg type='s' name='peer_mac_address' direction='in'/>"
283 "<arg type='i' name='error_code' direction='out'/>"
285 "<method name='GetConnectingPeer'>"
286 "<arg type='i' name='error_code' direction='out'/>"
287 "<arg type='s' name='local_mac_address' direction='out'/>"
289 "<method name='GetInterfaceName'>"
290 "<arg type='i' name='error_code' direction='out'/>"
291 "<arg type='s' name='ifname' direction='out'/>"
293 "<method name='GetSubnetMask'>"
294 "<arg type='i' name='error_code' direction='out'/>"
295 "<arg type='s' name='subnet_mask' direction='out'/>"
297 "<method name='GetGateway'>"
298 "<arg type='i' name='error_code' direction='out'/>"
299 "<arg type='s' name='gateway_address' direction='out'/>"
301 "<method name='GetSessionTimer'>"
302 "<arg type='i' name='error_code' direction='out'/>"
303 "<arg type='i' name='session_timer' direction='out'/>"
305 "<method name='SetSessionTimer'>"
306 "<arg type='i' name='session_timer' direction='in'/>"
307 "<arg type='i' name='error_code' direction='out'/>"
309 "<method name='SetAutoGroupRemoval'>"
310 "<arg type='b' name='enable' direction='in'/>"
311 "<arg type='i' name='error_code' direction='out'/>"
314 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
315 "<interface name='net.wifidirect.service'>"
316 "<method name='StartDiscovery'>"
317 "<arg type='i' name='service_type' direction='in'/>"
318 "<arg type='s' name='mac_addr' direction='in'/>"
319 "<arg type='i' name='error_code' direction='out'/>"
321 "<method name='StopDiscovery'>"
322 "<arg type='i' name='service_type' direction='in'/>"
323 "<arg type='s' name='mac_addr' direction='in'/>"
324 "<arg type='i' name='error_code' direction='out'/>"
326 "<method name='Register'>"
327 "<arg type='i' name='service_type' direction='in'/>"
328 "<arg type='s' name='info_string' direction='in'/>"
329 "<arg type='i' name='error_code' direction='out'/>"
330 "<arg type='i' name='service_id' direction='out'/>"
332 "<method name='Deregister'>"
333 "<arg type='i' name='service_id' direction='in'/>"
334 "<arg type='i' name='error_code' direction='out'/>"
336 "<signal name='DiscoveryStarted'>"
338 "<signal name='DiscoveryFound'>"
339 "<arg type='i' name='service_type'/>"
340 "<arg type='s' name='response_data'/>"
341 "<arg type='s' name='peer_mac_address'/>"
343 "<signal name='DiscoveryFinished'>"
346 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
347 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
348 "<interface name='net.wifidirect.display'>"
349 "<method name='Init'>"
350 "<arg type='i' name='error_code' direction='out'/>"
352 "<method name='Deinit'>"
353 "<arg type='i' name='error_code' direction='out'/>"
355 "<method name='SetConfig'>"
356 "<arg type='i' name='type' direction='in'/>"
357 "<arg type='i' name='port' direction='in'/>"
358 "<arg type='i' name='hdcp' direction='in'/>"
359 "<arg type='i' name='error_code' direction='out'/>"
361 "<method name='SetAvailiability'>"
362 "<arg type='i' name='availability' direction='in'/>"
363 "<arg type='i' name='error_code' direction='out'/>"
365 "<method name='GetPeerType'>"
366 "<arg type='s' name='peer_mac_addr' direction='in'/>"
367 "<arg type='i' name='error_code' direction='out'/>"
368 "<arg type='i' name='result' direction='out'/>"
370 "<method name='GetPeerAvailability'>"
371 "<arg type='s' name='peer_mac_addr' direction='in'/>"
372 "<arg type='i' name='error_code' direction='out'/>"
373 "<arg type='i' name='result' direction='out'/>"
375 "<method name='GetPeerHdcp'>"
376 "<arg type='s' name='peer_mac_addr' direction='in'/>"
377 "<arg type='i' name='error_code' direction='out'/>"
378 "<arg type='i' name='result' direction='out'/>"
380 "<method name='GetPeerPort'>"
381 "<arg type='s' name='peer_mac_addr' direction='in'/>"
382 "<arg type='i' name='error_code' direction='out'/>"
383 "<arg type='i' name='result' direction='out'/>"
385 "<method name='GetPeerThroughput'>"
386 "<arg type='s' name='peer_mac_addr' direction='in'/>"
387 "<arg type='i' name='error_code' direction='out'/>"
388 "<arg type='i' name='result' direction='out'/>"
391 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
396 static void __wfd_manager_manage_iface_handler(const gchar *method_name,
397 GVariant *parameters,
398 GDBusMethodInvocation *invocation)
400 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
401 wfd_manager_s *manager = wfd_get_manager();
402 GVariant *return_parameters = NULL;
404 gchar* dbus_error_name = NULL;
405 WDS_LOGD("%s", method_name);
407 if (!g_strcmp0(method_name, "Activate")) {
409 WFD_DBUS_REPLY_ERROR_NONE(invocation);
411 ret = wfd_manager_activate(manager);
412 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
414 g_variant_new("(i)", ret));
417 } else if (!g_strcmp0(method_name, "Deactivate")) {
419 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
420 WDS_LOGE("Already deactivated");
421 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
425 WFD_DBUS_REPLY_ERROR_NONE(invocation);
427 ret = wfd_manager_deactivate(manager);
428 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
430 g_variant_new("(i)", ret));
433 } else if (!g_strcmp0(method_name, "StartDiscovery")) {
434 gboolean mode = FALSE;
437 const gchar *type = NULL;
438 GVariantIter *iter = NULL;
440 GVariant *var = NULL;
442 g_variant_get(parameters, "(a{sv})", &iter);
443 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
444 if (!g_strcmp0(key, "Mode"))
445 g_variant_get(var, "b", &mode);
446 else if (!g_strcmp0(key, "Timeout"))
447 g_variant_get(var, "i", &timeout);
448 else if (!g_strcmp0(key, "Type"))
449 g_variant_get(var, "&s", &type);
450 else if (!g_strcmp0(key, "Channel"))
451 g_variant_get(var, "i", &channel);
455 g_variant_iter_free(iter);
457 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
458 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
459 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
460 WDS_LOGE("Wi-Fi Direct is not available status for scanning.");
461 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
465 if (mode && (manager->local->dev_role == WFD_DEV_ROLE_GO)) {
466 WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
467 ret = WIFI_DIRECT_ERROR_NONE;
468 return_parameters = g_variant_new("(i)", ret);
472 WFD_DBUS_REPLY_ERROR_NONE(invocation);
474 ret = wfd_manager_start_discovery(manager, mode, timeout, type, channel);
475 if (ret == WIFI_DIRECT_ERROR_NONE) {
476 if (mode == WFD_OEM_SCAN_MODE_PASSIVE) {
477 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
481 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
488 } else if (!g_strcmp0(method_name, "StopDiscovery")) {
489 int mode = manager->scan_mode;
490 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
491 manager->state != WIFI_DIRECT_STATE_DISCOVERING) {
492 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
496 WFD_DBUS_REPLY_ERROR_NONE(invocation);
498 ret = wfd_manager_cancel_discovery(manager);
499 if (ret == WIFI_DIRECT_ERROR_NONE && mode == WFD_SCAN_MODE_PASSIVE)
500 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
501 "DiscoveryFinished", NULL);
504 } else if (!g_strcmp0(method_name, "GetDiscoveredPeers")) {
505 wfd_discovery_entry_s *peers = NULL;
506 GVariantBuilder *builder_peers = NULL;
510 builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
512 peer_cnt = wfd_manager_get_peers(manager, &peers);
513 WDS_LOGD("Peer count [%d], Peer list [%p]", peer_cnt, peers);
515 WDS_LOGE("Failed to get scan result");
516 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
523 for (i = 0; i < peer_cnt; i++) {
524 GVariantBuilder builder_peer;
525 g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
527 g_variant_builder_add(&builder_peer, "{sv}",
529 g_variant_new_string(peers[i].device_name));
530 g_variant_builder_add(&builder_peer, "{sv}",
532 wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
533 g_variant_builder_add(&builder_peer, "{sv}",
535 wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
536 g_variant_builder_add(&builder_peer, "{sv}",
538 g_variant_new_uint16(peers[i].channel));
539 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
540 g_variant_builder_add(&builder_peer, "{sv}",
542 g_variant_new_uint16(peers[i].services));
543 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
544 g_variant_builder_add(&builder_peer, "{sv}",
546 g_variant_new_boolean(peers[i].is_group_owner));
547 g_variant_builder_add(&builder_peer, "{sv}",
549 g_variant_new_boolean(peers[i].is_persistent_go));
550 g_variant_builder_add(&builder_peer, "{sv}",
552 g_variant_new_boolean(peers[i].is_connected));
553 g_variant_builder_add(&builder_peer, "{sv}",
555 g_variant_new_uint16(peers[i].wps_device_pwd_id));
556 g_variant_builder_add(&builder_peer, "{sv}",
558 g_variant_new_uint16(peers[i].wps_cfg_methods));
559 g_variant_builder_add(&builder_peer, "{sv}",
561 g_variant_new_uint16(peers[i].category));
562 g_variant_builder_add(&builder_peer, "{sv}",
564 g_variant_new_uint16(peers[i].subcategory));
565 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
566 g_variant_builder_add(&builder_peer, "{sv}",
568 g_variant_new_boolean(peers[i].is_wfd_device));
569 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
571 WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
572 g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
575 ret = WIFI_DIRECT_ERROR_NONE;
576 return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
577 g_variant_builder_unref(builder_peers);
580 } else if (!g_strcmp0(method_name, "Connect")) {
581 const char *peer_mac_address = NULL;
582 unsigned char mac_addr[MACADDR_LEN] = {0, };
584 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
585 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
586 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
587 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
591 wfd_group_s *group = (wfd_group_s*) manager->group;
592 if (group && group->member_count >= manager->max_station) {
593 ret = WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
597 WFD_DBUS_REPLY_ERROR_NONE(invocation);
599 g_variant_get(parameters, "(&s)", &peer_mac_address);
600 macaddr_atoe(peer_mac_address, mac_addr);
602 ret = wfd_manager_connect(manager, mac_addr);
603 if (ret == WIFI_DIRECT_ERROR_NONE)
604 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
606 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
607 WFD_EVENT_CONNECTION_IN_PROGRESS,
611 } else if (!g_strcmp0(method_name, "Disconnect")) {
612 const char *peer_mac_address = NULL;
613 unsigned char mac_addr[MACADDR_LEN] = {0, };
615 if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
616 if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
617 ret = wfd_oem_stop_scan(manager->oem_ops);
619 WDS_LOGE("Failed to stop scan");
620 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
623 WDS_LOGI("Succeeded to stop scan");
624 if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
625 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
626 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
628 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
629 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
632 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
637 WFD_DBUS_REPLY_ERROR_NONE(invocation);
639 g_variant_get(parameters, "(&s)", &peer_mac_address);
640 macaddr_atoe(peer_mac_address, mac_addr);
642 ret = wfd_manager_disconnect(manager, mac_addr);
643 if (ret == WIFI_DIRECT_ERROR_NONE)
644 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
646 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
647 WFD_EVENT_DISCONNECTION_RSP,
651 } else if (!g_strcmp0(method_name, "CancelConnection")) {
652 const char *peer_mac_address = NULL;
653 unsigned char mac_addr[MACADDR_LEN] = {0, };
655 if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
656 WDS_LOGE("It's not CONNECTING state");
657 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
661 WFD_DBUS_REPLY_ERROR_NONE(invocation);
663 g_variant_get(parameters, "(&s)", &peer_mac_address);
664 macaddr_atoe(peer_mac_address, mac_addr);
666 ret = wfd_manager_cancel_connection(manager, mac_addr);
667 if (ret == WIFI_DIRECT_ERROR_NONE)
668 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
670 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
671 WFD_EVENT_CONNECTION_RSP,
675 } else if (!g_strcmp0(method_name, "AcceptConnection")) {
676 const char *peer_mac_address = NULL;
677 unsigned char mac_addr[MACADDR_LEN] = {0, };
679 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
680 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
684 wfd_group_s *group = (wfd_group_s*) manager->group;
685 if (group && group->member_count >= manager->max_station) {
686 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
690 WFD_DBUS_REPLY_ERROR_NONE(invocation);
692 g_variant_get(parameters, "(&s)", &peer_mac_address);
693 macaddr_atoe(peer_mac_address, mac_addr);
695 ret = wfd_manager_accept_connection(manager, mac_addr);
696 if (ret == WIFI_DIRECT_ERROR_NONE) {
697 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
699 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
700 WFD_EVENT_CONNECTION_IN_PROGRESS,
703 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
705 g_variant_new("(iis)", WIFI_DIRECT_ERROR_OPERATION_FAILED,
706 WFD_EVENT_CONNECTION_RSP,
711 } else if (!g_strcmp0(method_name, "RejectConnection")) {
712 wfd_session_s *session = manager->session;
713 const char *peer_mac_address = NULL;
714 unsigned char mac_addr[MACADDR_LEN] = {0, };
716 if (!session || manager->state != WIFI_DIRECT_STATE_CONNECTING) {
717 WDS_LOGE("It's not permitted with this state [%d]", manager->state);
718 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
722 if (session->direction != SESSION_DIRECTION_INCOMING) {
723 WDS_LOGE("Only incomming session can be rejected");
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_reject_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, "DisconnectAll")) {
744 if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
745 if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
746 ret = wfd_oem_stop_scan(manager->oem_ops);
748 WDS_LOGE("Failed to stop scan");
749 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
752 WDS_LOGI("Succeeded to stop scan");
753 if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
754 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
755 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
757 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
758 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
761 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
766 WFD_DBUS_REPLY_ERROR_NONE(invocation);
768 ret = wfd_manager_disconnect_all(manager);
769 if (ret == WIFI_DIRECT_ERROR_NONE)
770 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
772 g_variant_new("(iis)", ret,
773 WFD_EVENT_DISCONNECTION_RSP,
777 } else if (!g_strcmp0(method_name, "GetConnectedPeers")) {
778 wfd_connected_peer_info_s *peers = NULL;
779 GVariantBuilder *builder_peers = NULL;
783 builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
785 // even though status is not CONNECTED, this command can be excuted only when group exist
786 if (!manager->group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
787 WDS_LOGD("It's not connected state [%d]", manager->state);
788 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
792 peer_cnt = wfd_manager_get_connected_peers(manager, &peers);
793 WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
795 WDS_LOGE("Failed to get scan result");
796 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
800 for (i = 0; i < peer_cnt; i++) {
801 GVariantBuilder builder_peer;
802 g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
804 g_variant_builder_add(&builder_peer, "{sv}",
806 g_variant_new_string(peers[i].device_name));
807 g_variant_builder_add(&builder_peer, "{sv}",
809 wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
810 g_variant_builder_add(&builder_peer, "{sv}",
812 wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
813 g_variant_builder_add(&builder_peer, "{sv}",
815 wfd_manager_dbus_pack_ay(peers[i].ip_address, IPADDR_LEN));
816 g_variant_builder_add(&builder_peer, "{sv}",
818 g_variant_new_uint16(peers[i].channel));
819 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
820 g_variant_builder_add(&builder_peer, "{sv}",
822 g_variant_new_uint16(peers[i].services));
823 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
824 g_variant_builder_add(&builder_peer, "{sv}",
826 g_variant_new_uint16(peers[i].category));
827 g_variant_builder_add(&builder_peer, "{sv}",
829 g_variant_new_uint16(peers[i].subcategory));
830 g_variant_builder_add(&builder_peer, "{sv}",
832 g_variant_new_boolean(peers[i].is_p2p));
833 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
834 g_variant_builder_add(&builder_peer, "{sv}",
836 g_variant_new_boolean(peers[i].is_wfd_device));
837 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
839 WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
840 g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
843 ret = WIFI_DIRECT_ERROR_NONE;
844 return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
845 g_variant_builder_unref(builder_peers);
848 } else if (!g_strcmp0(method_name, "IsDiscoverable")) {
849 ret = WIFI_DIRECT_ERROR_NONE;
850 return_parameters = g_variant_new("(b)",
851 (manager->state == WIFI_DIRECT_STATE_DISCOVERING ||
852 wfd_group_is_autonomous(manager->group) == TRUE));
855 } else if (!g_strcmp0(method_name, "IsListeningOnly")) {
856 ret = WIFI_DIRECT_ERROR_NONE;
857 return_parameters = g_variant_new("(b)", (manager->scan_mode == WFD_SCAN_MODE_PASSIVE));
860 } else if (!g_strcmp0(method_name, "GetPeerInfo")) {
861 wfd_discovery_entry_s *peer = NULL;
862 GVariantBuilder *builder_peer = NULL;
863 const char *peer_mac_address = NULL;
864 unsigned char mac_addr[MACADDR_LEN] = {0, };
866 g_variant_get(parameters, "(&s)", &peer_mac_address);
867 macaddr_atoe(peer_mac_address, mac_addr);
869 builder_peer = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
871 ret = wfd_manager_get_peer_info(manager, mac_addr, &peer);
872 if (ret < 0 || !peer) {
873 WDS_LOGE("Failed to get peer info");
875 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
879 g_variant_builder_add(builder_peer, "{sv}",
881 g_variant_new_string(peer->device_name));
882 g_variant_builder_add(builder_peer, "{sv}",
884 wfd_manager_dbus_pack_ay(peer->mac_address, MACADDR_LEN));
885 g_variant_builder_add(builder_peer, "{sv}",
887 wfd_manager_dbus_pack_ay(peer->intf_address, MACADDR_LEN));
888 g_variant_builder_add(builder_peer, "{sv}",
890 g_variant_new_uint16(peer->channel));
891 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
892 g_variant_builder_add(builder_peer, "{sv}",
894 g_variant_new_uint16(peer->services));
895 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
896 g_variant_builder_add(builder_peer, "{sv}",
898 g_variant_new_boolean(peer->is_group_owner));
899 g_variant_builder_add(builder_peer, "{sv}",
901 g_variant_new_boolean(peer->is_persistent_go));
902 g_variant_builder_add(builder_peer, "{sv}",
904 g_variant_new_boolean(peer->is_connected));
905 g_variant_builder_add(builder_peer, "{sv}",
907 g_variant_new_uint16(peer->wps_device_pwd_id));
908 g_variant_builder_add(builder_peer, "{sv}",
910 g_variant_new_uint16(peer->wps_cfg_methods));
911 g_variant_builder_add(builder_peer, "{sv}",
913 g_variant_new_uint16(peer->category));
914 g_variant_builder_add(builder_peer, "{sv}",
916 g_variant_new_uint16(peer->subcategory));
917 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
918 g_variant_builder_add(builder_peer, "{sv}",
920 g_variant_new_boolean(peer->is_wfd_device));
921 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
923 ret = WIFI_DIRECT_ERROR_NONE;
924 return_parameters = g_variant_new("(ia{sv})", ret, builder_peer);
925 g_variant_builder_unref(builder_peer);
929 } else if (!g_strcmp0(method_name, "GetState")) {
930 ret = WIFI_DIRECT_ERROR_NONE;
931 return_parameters = g_variant_new("(ii)", ret, manager->state);
935 WDS_LOGD("method not handled");
936 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
941 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
946 //g_dbus_method_invocation_return_dbus_error(invocation, WFD_MANAGER_SERVICE ".Error", ".OperationFailed");
948 wfd_error_set_gerror(ret, &err);
949 dbus_error_name = g_dbus_error_encode_gerror(err);
950 WDS_LOGD("g_dbus_method_invocation_return_gerror with [%s]", dbus_error_name);
951 g_free(dbus_error_name);
952 g_dbus_method_invocation_return_gerror(invocation, err);
957 static void __wfd_manager_group_iface_handler(const gchar *method_name,
958 GVariant *parameters,
959 GDBusMethodInvocation *invocation)
961 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
962 wfd_manager_s *manager = wfd_get_manager();
963 GVariant *return_parameters = NULL;
965 WDS_LOGD("%s", method_name);
967 if (!g_strcmp0(method_name, "CreateGroup")) {
968 wfd_group_s *group = manager->group;
969 wfd_oem_group_param_s param;
971 if (group || manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
972 WDS_LOGE("Group already exist or not a proper state");
973 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
977 #ifdef TIZEN_WLAN_BOARD_SPRD
978 group = wfd_create_pending_group(manager, manager->local->dev_addr);
980 group = wfd_create_pending_group(manager, manager->local->intf_addr);
983 WDS_LOGE("Failed to create pending group");
984 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
987 group->flags |= WFD_GROUP_FLAG_AUTONOMOUS;
988 manager->group = group;
990 memset(¶m, 0x0, sizeof(param));
992 param.persistent = (manager->local->group_flags &
993 WFD_GROUP_FLAG_PERSISTENT);
994 memcpy(&(param.passphrase), manager->local->passphrase,
995 sizeof(param.passphrase));
997 #ifndef TIZEN_WLAN_BOARD_SPRD
998 param.freq = WFD_FREQ_2G;
1001 ret = wfd_oem_create_group(manager->oem_ops, ¶m);
1003 WDS_LOGE("Failed to create group");
1004 wfd_destroy_group(manager, GROUP_IFNAME);
1005 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1009 WDS_LOGD("Succeeded to create pending group");
1010 memset(manager->local->passphrase, 0x0, PASSPHRASE_LEN_MAX + 1);
1011 ret = WIFI_DIRECT_ERROR_NONE;
1012 return_parameters = g_variant_new("(i)", ret);
1015 } else if (!g_strcmp0(method_name, "DestroyGroup")) {
1016 wfd_group_s *group = manager->group;
1017 if (!group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
1018 WDS_LOGE("Group not exist");
1019 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1023 ret = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1025 WDS_LOGE("Failed to destroy group");
1026 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1030 ret = wfd_destroy_group(manager, group->ifname);
1032 WDS_LOGE("Failed to destroy group");
1034 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1035 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1037 WFD_DBUS_REPLY_ERROR_NONE(invocation);
1039 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
1043 } else if (!g_strcmp0(method_name, "IsGroupOwner")) {
1045 wfd_device_s *local = manager->local;
1046 result = local->dev_role == WFD_DEV_ROLE_GO;
1047 WDS_LOGI("Is group owner : [%s]", result ? "Yes" : "No");
1048 return_parameters = g_variant_new("(b)", result);
1051 } else if (!g_strcmp0(method_name, "IsAutoGroup")) {
1053 if ((result = wfd_group_is_autonomous(manager->group)) < 0)
1056 WDS_LOGI("Is autonomous group : [%s]", result ? "Yes" : "No");
1057 return_parameters = g_variant_new("(b)", result);
1060 } else if (!g_strcmp0(method_name, "ActivatePushButton")) {
1061 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
1062 WDS_LOGE("Wi-Fi Direct is not Group Owner.");
1063 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1067 ret = wfd_oem_wps_start(manager->oem_ops, NULL,
1068 WFD_WPS_MODE_PBC, NULL);
1070 WDS_LOGE("Failed to start wps");
1071 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1074 return_parameters = g_variant_new("(i)", ret);
1077 } else if (!g_strcmp0(method_name, "GetPersistentGroups")) {
1078 int persistent_group_count = 0;
1079 wfd_persistent_group_info_s *plist;
1080 GVariantBuilder *builder_groups = NULL;
1083 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1084 WDS_LOGE("Wi-Fi Direct is not activated.");
1085 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1090 ret = wfd_oem_get_persistent_groups(manager->oem_ops,
1091 (wfd_oem_persistent_group_s**) &plist, &persistent_group_count);
1093 WDS_LOGE("Error!! wfd_oem_get_persistent_group_info() failed..");
1094 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1098 builder_groups = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
1100 for (i = 0; i < persistent_group_count; i++) {
1101 GVariantBuilder builder_group;
1102 g_variant_builder_init(&builder_group, G_VARIANT_TYPE("a{sv}"));
1104 g_variant_builder_add(&builder_group, "{sv}",
1106 g_variant_new_uint32(plist[i].network_id));
1107 g_variant_builder_add(&builder_group, "{sv}",
1109 g_variant_new_string(plist[i].ssid));
1110 g_variant_builder_add(&builder_group, "{sv}",
1112 wfd_manager_dbus_pack_ay(plist[i].go_mac_address, MACADDR_LEN));
1114 WDS_LOGD("%dth peer [%s]", i, plist[i].ssid);
1115 g_variant_builder_add_value(builder_groups, g_variant_builder_end(&builder_group));
1118 ret = WIFI_DIRECT_ERROR_NONE;
1119 return_parameters = g_variant_new("(iaa{sv})", ret, builder_groups);
1120 g_variant_builder_unref(builder_groups);
1123 } else if (!g_strcmp0(method_name, "RemovePersistentGroup")) {
1126 unsigned char go_mac_address[6];
1127 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1128 WDS_LOGE("Wi-Fi Direct is not activated.");
1129 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1133 g_variant_get(parameters, "(&s&s)", &mac_address, &ssid);
1134 macaddr_atoe(mac_address, go_mac_address);
1135 WDS_LOGD("Remove persistent group [%s][" MACSTR "]", ssid, MAC2STR(go_mac_address));
1137 ret = wfd_oem_remove_persistent_group(manager->oem_ops, ssid,
1140 WDS_LOGE("Failed to remove persistent group");
1141 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1144 return_parameters = g_variant_new("(i)", ret);
1147 } else if (!g_strcmp0(method_name, "SetPassphrase")) {
1149 int passphrase_len = 0;
1150 wfd_group_s *group = manager->group;
1153 WDS_LOGE("Group already exists");
1154 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1158 g_variant_get(parameters, "(&s)", &passphrase);
1159 passphrase_len = strlen(passphrase);
1161 if (passphrase_len < PASSPHRASE_LEN_MIN ||
1162 passphrase_len > PASSPHRASE_LEN_MAX) {
1163 WDS_LOGE("Passphrase length incorrect [%s]:[%d]",
1164 passphrase, passphrase_len);
1165 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1169 g_strlcpy(manager->local->passphrase, passphrase, PASSPHRASE_LEN_MAX + 1);
1170 WDS_LOGI("Passphrase string [%s]", manager->local->passphrase);
1172 ret = WIFI_DIRECT_ERROR_NONE;
1173 return_parameters = g_variant_new("(i)", ret);
1176 } else if (!g_strcmp0(method_name, "GetPassphrase")) {
1177 wfd_group_s *group = manager->group;
1179 WDS_LOGE("Group not exist");
1180 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1184 if (group->role == WFD_DEV_ROLE_GC) {
1185 WDS_LOGE("Device is not GO");
1186 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1190 ret = WIFI_DIRECT_ERROR_NONE;
1191 return_parameters = g_variant_new("(is)", ret, group->passphrase);
1192 WDS_LOGI("group->pass : [%s]", group->passphrase);
1196 } else if (!g_strcmp0(method_name, "SetPersistentGroupEnabled")) {
1199 g_variant_get(parameters, "(b)", &enabled);
1200 WDS_LOGI("Activate Persistent Group : [%s]",
1201 enabled ? "True" : "False");
1203 manager->local->group_flags |= WFD_GROUP_FLAG_PERSISTENT;
1205 manager->local->group_flags &= ~(WFD_GROUP_FLAG_PERSISTENT);
1206 ret = WIFI_DIRECT_ERROR_NONE;
1207 return_parameters = g_variant_new("(i)", ret);
1210 } else if (!g_strcmp0(method_name, "IsPersistentGroupEnabled")) {
1212 result = ((manager->local->group_flags &
1213 WFD_GROUP_FLAG_PERSISTENT)
1214 == WFD_GROUP_FLAG_PERSISTENT);
1215 WDS_LOGI("Is persistent group : [%s]", result ? "Yes" : "No");
1216 return_parameters = g_variant_new("(b)", result);
1220 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1225 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1229 wfd_error_set_gerror(ret, &err);
1230 g_dbus_method_invocation_return_gerror(invocation, err);
1231 g_clear_error(&err);
1235 static void __wfd_manager_config_iface_handler(const gchar *method_name,
1236 GVariant *parameters,
1237 GDBusMethodInvocation *invocation)
1239 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1240 wfd_manager_s *manager = wfd_get_manager();
1241 GVariant *return_parameters = NULL;
1243 WDS_LOGD("%s", method_name);
1245 if (!g_strcmp0(method_name, "GetDeviceName")) {
1246 char device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN+1] = {0, };
1248 ret = wfd_local_get_dev_name(device_name);
1250 WDS_LOGE("Failed to get device name");
1251 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1255 ret = WIFI_DIRECT_ERROR_NONE;
1256 return_parameters = g_variant_new("(is)", ret, device_name);
1260 } else if (!g_strcmp0(method_name, "SetDeviceName")) {
1261 const char *device_name = NULL;
1262 g_variant_get(parameters, "(&s)", &device_name);
1264 ret = wfd_local_set_dev_name((char *)device_name);
1266 WDS_LOGE("Failed to set device name");
1267 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1271 ret = WIFI_DIRECT_ERROR_NONE;
1272 return_parameters = g_variant_new("(i)", ret);
1275 } else if (!g_strcmp0(method_name, "GetWpsPin")) {
1276 wfd_session_s *session = (wfd_session_s*) manager->session;
1277 if (!session || manager->auto_pin[0] != 0) {
1278 WDS_LOGE("Session not exist");
1279 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1283 if (session->wps_pin[0] == '\0') {
1284 WDS_LOGE("WPS PIN is not set");
1285 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1289 ret = WIFI_DIRECT_ERROR_NONE;
1290 return_parameters = g_variant_new("(is)", ret, session->wps_pin);
1293 } else if (!g_strcmp0(method_name, "SetWpsPin")) {
1294 const char *pin = NULL;
1295 wfd_session_s *session = (wfd_session_s*) manager->session;
1297 g_variant_get(parameters, "(&s)", &pin);
1300 WDS_LOGE("Session not exist");
1301 g_strlcpy(manager->auto_pin, pin, strlen(pin) + 1);
1303 g_strlcpy(session->wps_pin, pin, strlen(pin) + 1);
1306 ret = WIFI_DIRECT_ERROR_NONE;
1307 return_parameters = g_variant_new("(i)", ret);
1310 } else if (!g_strcmp0(method_name, "GetSupportedWpsMode")) {
1311 int config_methods = 0;
1313 ret = wfd_local_get_supported_wps_mode(&config_methods);
1315 WDS_LOGE("Failed to get supported wps mode");
1316 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1320 ret = WIFI_DIRECT_ERROR_NONE;
1321 return_parameters = g_variant_new("(ii)", ret, config_methods);
1324 } else if (!g_strcmp0(method_name, "GetReqWpsMode")) {
1327 ret = wfd_manager_get_req_wps_mode(&wps_mode);
1329 WDS_LOGE("Failed to get request wps mode");
1330 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1334 ret = WIFI_DIRECT_ERROR_NONE;
1335 return_parameters = g_variant_new("(ii)", ret, wps_mode);
1338 } else if (!g_strcmp0(method_name, "SetReqWpsMode")) {
1341 g_variant_get(parameters, "(i)", &type);
1342 ret = wfd_manager_set_req_wps_mode(type);
1344 WDS_LOGE("Failed to set request wps mode");
1345 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1349 ret = WIFI_DIRECT_ERROR_NONE;
1350 return_parameters = g_variant_new("(i)", ret);
1353 } else if (!g_strcmp0(method_name, "GetLocalWpsMode")) {
1356 ret = wfd_local_get_wps_mode(&wps_mode);
1358 WDS_LOGE("Failed to get request wps mode");
1359 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1363 ret = WIFI_DIRECT_ERROR_NONE;
1364 return_parameters = g_variant_new("(ii)", ret, wps_mode);
1367 } else if (!g_strcmp0(method_name, "GetIPAddress")) {
1368 char ip_addr_str[IPSTR_LEN+1] = {0, };
1370 if (manager->state < WIFI_DIRECT_STATE_CONNECTED) {
1371 WDS_LOGE("Device is not connected yet");
1372 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1376 ret = wfd_local_get_ip_addr((char *)ip_addr_str);
1378 WDS_LOGE("Failed to get local IP address");
1379 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1383 return_parameters = g_variant_new("(is)", ret, ip_addr_str);
1384 WDS_LOGI("IP addr : [%s]", ip_addr_str);
1387 } else if (!g_strcmp0(method_name, "GetMacAddress")) {
1388 char device_mac[MACSTR_LEN+1] = {0, };
1390 ret = wfd_local_get_dev_mac(device_mac);
1392 WDS_LOGE("Failed to get device mac");
1393 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1397 ret = WIFI_DIRECT_ERROR_NONE;
1398 return_parameters = g_variant_new("(is)", ret, device_mac);
1401 } else if (!g_strcmp0(method_name, "GetGoIntent")) {
1404 ret = wfd_manager_get_go_intent(&go_intent);
1406 WDS_LOGE("Failed to get GO intent");
1407 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1411 ret = WIFI_DIRECT_ERROR_NONE;
1412 return_parameters = g_variant_new("(ii)", ret, go_intent);
1415 } else if (!g_strcmp0(method_name, "SetGoIntent")) {
1418 g_variant_get(parameters, "(i)", &go_intent);
1419 ret = wfd_manager_set_go_intent(go_intent);
1421 WDS_LOGE("Failed to set GO intent");
1422 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1426 ret = WIFI_DIRECT_ERROR_NONE;
1427 return_parameters = g_variant_new("(i)", ret);
1430 } else if (!g_strcmp0(method_name, "GetMaxClient")) {
1433 ret = wfd_manager_get_max_station(&max_client);
1435 WDS_LOGE("Failed to get max station");
1436 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1440 ret = WIFI_DIRECT_ERROR_NONE;
1441 return_parameters = g_variant_new("(ii)", ret, max_client);
1444 } else if (!g_strcmp0(method_name, "SetMaxClient")) {
1446 g_variant_get(parameters, "(i)", &max_client);
1448 ret = wfd_manager_set_max_station(max_client);
1450 WDS_LOGE("Failed to set max station");
1451 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1455 ret = WIFI_DIRECT_ERROR_NONE;
1456 return_parameters = g_variant_new("(i)", ret);
1459 } else if (!g_strcmp0(method_name, "SetAutoConnectionMode")) {
1460 gboolean mode = FALSE;
1462 g_variant_get(parameters, "(b)", &mode);
1463 ret = wfd_manager_set_autoconnection(mode);
1465 WDS_LOGE("Failed to set autoconnection");
1466 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1470 ret = WIFI_DIRECT_ERROR_NONE;
1471 return_parameters = g_variant_new("(i)", ret);
1474 } else if (!g_strcmp0(method_name, "IsAutoConnectionMode")) {
1477 ret = wfd_manager_get_autoconnection(&mode);
1479 WDS_LOGE("Failed to get autoconnection");
1480 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1484 ret = WIFI_DIRECT_ERROR_NONE;
1485 return_parameters = g_variant_new("(ib)", ret, mode);
1488 } else if (!g_strcmp0(method_name, "GetOperatingChannel")) {
1491 wfd_group_s *group = manager->group;
1493 WDS_LOGE("Group not exist");
1494 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1498 channel = wfd_util_freq_to_channel(group->freq);
1500 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1504 ret = WIFI_DIRECT_ERROR_NONE;
1505 return_parameters = g_variant_new("(ii)", ret, channel);
1508 } else if (!g_strcmp0(method_name, "SetAutoConnectionPeer")) {
1509 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1512 } else if (!g_strcmp0(method_name, "GetInterfaceName")) {
1513 wfd_group_s *group = (wfd_group_s *)manager->group;
1515 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1518 ret = WIFI_DIRECT_ERROR_NONE;
1519 return_parameters = g_variant_new("(is)", ret, group->ifname);
1522 } else if (!g_strcmp0(method_name, "GetSubnetMask")) {
1523 char *get_str = NULL;
1524 char subnet_mask[IPSTR_LEN+1] = {0, };
1526 get_str = vconf_get_str(VCONFKEY_SUBNET_MASK);
1528 WDS_LOGE("Get Subnet Mask failed");
1529 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1532 WDS_LOGD("VCONFKEY_SUBNET_MASK(%s) : %s", VCONFKEY_SUBNET_MASK,
1534 ret = WIFI_DIRECT_ERROR_NONE;
1535 g_strlcpy(subnet_mask, get_str, IPSTR_LEN + 1);
1536 return_parameters = g_variant_new("(is)", ret, subnet_mask);
1540 } else if (!g_strcmp0(method_name, "GetGateway")) {
1541 char *get_str = NULL;
1542 char gateway_addr[IPSTR_LEN+1] = {0, };
1543 get_str = vconf_get_str(VCONFKEY_GATEWAY);
1545 WDS_LOGE("Get Gateway failed");
1546 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1549 WDS_LOGD("VCONFKEY_GATEWAY_ADDR(%s) : %s", VCONFKEY_GATEWAY,
1551 ret = WIFI_DIRECT_ERROR_NONE;
1552 g_strlcpy(gateway_addr, get_str, IPSTR_LEN + 1);
1553 return_parameters = g_variant_new("(is)", ret, gateway_addr);
1557 } else if (!g_strcmp0(method_name, "GetSessionTimer")) {
1559 int session_timer = 0;
1560 ret = WIFI_DIRECT_ERROR_NONE;
1561 session_timer = manager->session_timer;
1562 WDS_LOGD("Get Session Timer value is %d", session_timer);
1563 return_parameters = g_variant_new("(ii)", ret, session_timer);
1566 } else if (!g_strcmp0(method_name, "SetSessionTimer")) {
1568 int session_timer = 0;
1569 g_variant_get(parameters, "(i)", &session_timer);
1570 WDS_LOGD("Set Session Timer value is %d", session_timer);
1571 manager->session_timer = session_timer;
1572 ret = WIFI_DIRECT_ERROR_NONE;
1573 return_parameters = g_variant_new("(i)", ret);
1576 } else if (!g_strcmp0(method_name, "SetAutoGroupRemoval")) {
1580 g_variant_get(parameters, "(b)", &enable);
1581 WDS_LOGE("Activate Auto Group Removal Mode : [%s]",
1582 enable ? "True" : "False");
1584 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1585 WDS_LOGE("Wi-Fi Direct is not activated.");
1586 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1591 manager->auto_group_remove_enable = TRUE;
1593 /* Enable Group destroy only if state is connecting */
1594 if (manager->state == WIFI_DIRECT_STATE_CONNECTING) {
1595 WDS_LOGE("Wi-Fi Direct state is CONNECTING");
1596 ret = WIFI_DIRECT_ERROR_NONE;
1597 return_parameters = g_variant_new("(i)", ret);
1600 /* Remove group immediately if no connected peer found */
1601 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1602 wfd_group_s *group = (wfd_group_s*) manager->group;
1603 if (group && !group->member_count
1604 && wfd_util_is_remove_group_allowed())
1605 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1609 manager->auto_group_remove_enable = FALSE;
1612 ret = WIFI_DIRECT_ERROR_NONE;
1613 return_parameters = g_variant_new("(i)", ret);
1617 WDS_LOGE("method not handled");
1618 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1623 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1627 wfd_error_set_gerror(ret, &err);
1628 g_dbus_method_invocation_return_gerror(invocation, err);
1629 g_clear_error(&err);
1633 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1634 static void __wfd_manager_service_iface_handler(const gchar *method_name,
1635 GVariant *parameters,
1636 GDBusMethodInvocation *invocation)
1638 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1639 wfd_manager_s *manager = wfd_get_manager();
1640 GVariant *return_parameters = NULL;
1642 WDS_LOGD("%s", method_name);
1644 if (!g_strcmp0(method_name, "StartDiscovery")) {
1645 const char *mac_address = NULL;
1647 unsigned char mac_addr[MACADDR_LEN] = {0, };
1649 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1650 WDS_LOGE("Wi-Fi Direct is not activated.");
1651 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1655 g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
1656 WDS_LOGD("Service type [%d]", service_type);
1657 macaddr_atoe(mac_address, mac_addr);
1659 ret = wfd_oem_start_service_discovery(manager->oem_ops,
1660 mac_addr, service_type);
1662 WDS_LOGE("Failed to start service discovery");
1663 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1667 WFD_DBUS_REPLY_ERROR_NONE(invocation);
1669 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1670 "DiscoveryStarted", NULL);
1673 } else if (!g_strcmp0(method_name, "StopDiscovery")) {
1674 const char *mac_address = NULL;
1676 unsigned char mac_addr[MACADDR_LEN] = {0, };
1678 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1679 WDS_LOGE("Wi-Fi Direct is not activated.");
1680 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1684 g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
1685 WDS_LOGD("Service type [%d]", service_type);
1686 macaddr_atoe(mac_address, mac_addr);
1688 ret = wfd_oem_cancel_service_discovery(manager->oem_ops,
1689 mac_addr, service_type);
1691 WDS_LOGE("Failed to cancel service discovery");
1692 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1695 ret = WIFI_DIRECT_ERROR_NONE;
1696 return_parameters = g_variant_new("(i)", ret);
1699 } else if (!g_strcmp0(method_name, "Register")) {
1702 const char *info_str = NULL;
1704 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1705 WDS_LOGE("Wi-Fi Direct is not activated.");
1706 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1710 g_variant_get(parameters, "(i&s)", &service_type, &info_str);
1711 WDS_LOGD("Register service [%d: %s]", service_type, info_str);
1713 ret = wfd_service_add(service_type, (char *)info_str, &service_id);
1715 WDS_LOGE("Failed to add service");
1716 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1720 ret = WIFI_DIRECT_ERROR_NONE;
1721 return_parameters = g_variant_new("(ii)", ret, service_id);
1724 } else if (!g_strcmp0(method_name, "Deregister")) {
1727 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1728 WDS_LOGE("Wi-Fi Direct is not activated.");
1729 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1733 g_variant_get(parameters, "(i)", &service_id);
1734 WDS_LOGD("Service id [%d]", service_id);
1736 ret = wfd_service_del(service_id);
1738 WDS_LOGE("Failed to delete service");
1739 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1743 ret = WIFI_DIRECT_ERROR_NONE;
1744 return_parameters = g_variant_new("(i)", ret);
1748 WDS_LOGD("method not handled");
1749 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1754 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1758 wfd_error_set_gerror(ret, &err);
1759 g_dbus_method_invocation_return_gerror(invocation, err);
1760 g_clear_error(&err);
1763 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1765 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1766 static void __wfd_manager_display_iface_handler(const gchar *method_name,
1767 GVariant *parameters,
1768 GDBusMethodInvocation *invocation)
1770 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1771 wfd_manager_s *manager = wfd_get_manager();
1772 GVariant *return_parameters = NULL;
1774 WDS_LOGD("%s", method_name);
1776 if (!g_strcmp0(method_name, "Init")) {
1777 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1778 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1782 wfd_device_s * device = manager->local;
1784 ret = wfd_oem_miracast_init(manager->oem_ops, TRUE);
1786 WDS_LOGE("Failed to initialize display");
1787 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1791 device->display.type = WIFI_DISPLAY_DEFAULT_TYPE;
1792 device->display.port = WIFI_DISPLAY_DEFAULT_PORT;
1793 device->display.availability = WIFI_DISPLAY_DEFAULT_AVAIL;
1794 device->display.hdcp_support = WIFI_DISPLAY_DEFAULT_HDCP;
1796 ret = WIFI_DIRECT_ERROR_NONE;
1797 return_parameters = g_variant_new("(i)", ret);
1800 } else if (!g_strcmp0(method_name, "Deinit")) {
1801 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1802 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1806 wfd_device_s * device = manager->local;
1808 ret = wfd_oem_miracast_init(manager->oem_ops, FALSE);
1810 WDS_LOGE("Failed to deinitialize display");
1811 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1815 memset(&(device->display), 0x0, sizeof(wfd_display_type_e));
1817 ret = WIFI_DIRECT_ERROR_NONE;
1818 return_parameters = g_variant_new("(i)", ret);
1821 } else if (!g_strcmp0(method_name, "SetConfig")) {
1822 int type, port, hdcp;
1823 g_variant_get(parameters, "(iii)", &type, &port, &hdcp);
1825 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1826 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1830 WDS_LOGD("type %d port %d hdcp %d", type, port, hdcp);
1832 ret = wfd_manager_set_display_device(type, port, hdcp);
1834 WDS_LOGE("Failed to set display device settings");
1835 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1839 ret = WIFI_DIRECT_ERROR_NONE;
1840 return_parameters = g_variant_new("(i)", ret);
1843 } else if (!g_strcmp0(method_name, "SetAvailiability")) {
1845 g_variant_get(parameters, "(i)", &availability);
1847 if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1848 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1852 ret = wfd_manager_set_session_availability(availability);
1854 WDS_LOGE("Failed to set session availability");
1855 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1859 ret = WIFI_DIRECT_ERROR_NONE;
1860 return_parameters = g_variant_new("(i)", ret);
1863 } else if (!g_strcmp0(method_name, "GetPeerType")) {
1864 wfd_device_s *peer = NULL;
1865 const char *mac_address = NULL;
1866 unsigned char mac_addr[MACADDR_LEN] = {0, };
1868 g_variant_get(parameters, "(&s)", &mac_address);
1869 macaddr_atoe(mac_address, mac_addr);
1871 if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1872 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1876 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
1878 WDS_LOGE("Failed to get peer");
1879 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1883 ret = WIFI_DIRECT_ERROR_NONE;
1884 return_parameters = g_variant_new("(ii)", ret, peer->display.type);
1887 } else if (!g_strcmp0(method_name, "GetPeerAvailability")) {
1888 wfd_device_s *peer = NULL;
1889 const char *mac_address = NULL;
1890 unsigned char mac_addr[MACADDR_LEN] = {0, };
1892 g_variant_get(parameters, "(&s)", &mac_address);
1893 macaddr_atoe(mac_address, mac_addr);
1895 if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1896 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1900 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
1902 WDS_LOGE("Failed to get peer");
1903 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1907 ret = WIFI_DIRECT_ERROR_NONE;
1908 return_parameters = g_variant_new("(ii)", ret, peer->display.availability);
1911 } else if (!g_strcmp0(method_name, "GetPeerHdcp")) {
1912 wfd_device_s *peer = NULL;
1913 const char *mac_address = NULL;
1914 unsigned char mac_addr[MACADDR_LEN] = {0, };
1916 g_variant_get(parameters, "(&s)", &mac_address);
1917 macaddr_atoe(mac_address, mac_addr);
1919 if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1920 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1924 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
1926 WDS_LOGE("Failed to get peer");
1927 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1931 ret = WIFI_DIRECT_ERROR_NONE;
1932 return_parameters = g_variant_new("(ii)", ret, peer->display.hdcp_support);
1935 } else if (!g_strcmp0(method_name, "GetPeerPort")) {
1936 wfd_device_s *peer = NULL;
1937 const char *mac_address = NULL;
1938 unsigned char mac_addr[MACADDR_LEN] = {0, };
1940 g_variant_get(parameters, "(&s)", &mac_address);
1941 macaddr_atoe(mac_address, mac_addr);
1943 if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1944 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1948 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
1950 WDS_LOGE("Failed to get peer");
1951 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1955 ret = WIFI_DIRECT_ERROR_NONE;
1956 return_parameters = g_variant_new("(ii)", ret, peer->display.port);
1959 } else if (!g_strcmp0(method_name, "GetPeerThroughput")) {
1960 wfd_device_s *peer = NULL;
1961 const char *mac_address = NULL;
1962 unsigned char mac_addr[MACADDR_LEN] = {0, };
1964 g_variant_get(parameters, "(&s)", &mac_address);
1965 macaddr_atoe(mac_address, mac_addr);
1967 if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1968 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1972 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
1974 WDS_LOGE("Failed to get peer");
1975 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1979 ret = WIFI_DIRECT_ERROR_NONE;
1980 return_parameters = g_variant_new("(ii)", ret, peer->display.max_tput);
1984 WDS_LOGD("method not handled");
1985 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1990 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1994 wfd_error_set_gerror(ret, &err);
1995 g_dbus_method_invocation_return_gerror(invocation, err);
1996 g_clear_error(&err);
1999 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
2003 const gchar *iface_name;
2004 void (*function) (const gchar *method_name,
2005 GVariant *parameters,
2006 GDBusMethodInvocation *invocation);
2007 } wfd_manager_iface_map[] = {
2010 WFD_MANAGER_MANAGE_INTERFACE,
2011 __wfd_manager_manage_iface_handler
2015 WFD_MANAGER_GROUP_INTERFACE,
2016 __wfd_manager_group_iface_handler
2020 WFD_MANAGER_CONFIG_INTERFACE,
2021 __wfd_manager_config_iface_handler
2023 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
2026 WFD_MANAGER_SERVICE_INTERFACE,
2027 __wfd_manager_service_iface_handler
2029 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
2030 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
2033 WFD_MANAGER_DISPLAY_INTERFACE,
2034 __wfd_manager_display_iface_handler
2036 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
2044 // GDBus method handler
2045 static void wfd_manager_method_call_handler (GDBusConnection *connection,
2046 const gchar *sender,
2047 const gchar *object_path,
2048 const gchar *interface_name,
2049 const gchar *method_name,
2050 GVariant *parameters,
2051 GDBusMethodInvocation *invocation,
2057 WDS_LOGD("interface : [%s], method : [%s]", interface_name, method_name);
2058 DBUS_DEBUG_VARIANT(parameters);
2060 while (wfd_manager_iface_map[count].iface_name != NULL) {
2061 if (!g_strcmp0(interface_name, wfd_manager_iface_map[count].iface_name)) {
2063 wfd_manager_iface_map[count].function(method_name,
2072 static const GDBusInterfaceVTable wfd_manager_interface_vtable =
2073 {wfd_manager_method_call_handler, NULL, NULL};
2075 void wfd_manager_dbus_unregister(void)
2079 wfd_error_deregister();
2081 while (wfd_manager_iface_map[count].iface_name != NULL) {
2082 wfd_manager_dbus_iface_unregister(wfd_manager_iface_map[count].reg_id);
2087 gboolean wfd_manager_dbus_register(void)
2089 GDBusNodeInfo *node_info = NULL;
2090 GError *Error = NULL;
2093 wfd_error_register();
2095 node_info = g_dbus_node_info_new_for_xml(wfd_manager_introspection_xml, &Error);
2096 if (node_info == NULL) {
2097 WDS_LOGE("Failed to get node info, Error: %s", Error->message);
2098 g_clear_error(&Error);
2102 while (wfd_manager_iface_map[count].iface_name != NULL) {
2103 wfd_manager_iface_map[count].reg_id =
2104 wfd_manager_dbus_iface_register(wfd_manager_iface_map[count].iface_name,
2107 &wfd_manager_interface_vtable);
2109 WDS_LOGD("Registered Interface [%d, %s]",
2110 wfd_manager_iface_map[count].reg_id,
2111 wfd_manager_iface_map[count].iface_name);
2116 g_dbus_node_info_unref(node_info);