Fixed: Coding rule issues.
[platform/core/connectivity/wifi-direct-manager.git] / src / wifi-direct-iface.c
1 /*
2  * Network Configuration Module
3  *
4  * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
5  *
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
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  */
19
20 /**
21  * This file implements wifi direct manager interface functions.
22  *
23  * @file        wifi-direct-iface.c
24  * @author      Nishant Chaprana (n.chaprana@samsung.com)
25  * @version     0.1
26  */
27
28 #include <stdlib.h>
29
30 #include <wifi-direct.h>
31
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"
43 #include <vconf.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 */
50
51 #define WFD_DBUS_REPLY_ERROR_NONE(invocation) \
52         g_dbus_method_invocation_return_value((invocation), g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE))
53
54 #define WFD_DBUS_REPLY_PARAMS(invocation, params) \
55         g_dbus_method_invocation_return_value((invocation), (params))
56
57 static int macaddr_atoe(const char *p, unsigned char mac[])
58 {
59         int i = 0;
60
61         for (;;) {
62                 mac[i++] = (char) strtoul(p, (char **) &p, 16);
63                 if (!*p++ || i == 6)
64                         break;
65         }
66
67         return (i == 6);
68 }
69
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'/>"
76                         "</method>"
77 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
78                         "<method name='AddClient'>"
79                                 "<arg type='i' name='result' direction='out'/>"
80                         "</method>"
81 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
82                         "<method name='Deactivate'>"
83                                 "<arg type='i' name='error_code' direction='out'/>"
84                         "</method>"
85                         "<method name='StartDiscovery'>"
86                                 "<arg type='a{sv}' name='parameters' direction='in'/>"
87                                 "<arg type='i' name='error_code' direction='out'/>"
88                         "</method>"
89                         "<method name='StopDiscovery'>"
90                                 "<arg type='i' name='error_code' direction='out'/>"
91                         "</method>"
92                         "<method name='GetDiscoveredPeers'>"
93                                 "<arg type='i' name='error_code' direction='out'/>"
94                                 "<arg type='aa{sv}' name='peer_details_list' direction='out'/>"
95                         "</method>"
96                         "<method name='Connect'>"
97                                 "<arg type='s' name='mac_address' direction='in'/>"
98                                 "<arg type='i' name='error_code' direction='out'/>"
99                         "</method>"
100                         "<method name='Disconnect'>"
101                                 "<arg type='s' name='mac_address' direction='in'/>"
102                                 "<arg type='i' name='error_code' direction='out'/>"
103                         "</method>"
104                         "<method name='CancelConnection'>"
105                                 "<arg type='s' name='mac_address' direction='in'/>"
106                                 "<arg type='i' name='error_code' direction='out'/>"
107                         "</method>"
108                         "<method name='AcceptConnection'>"
109                                 "<arg type='s' name='mac_address' direction='in'/>"
110                                 "<arg type='i' name='error_code' direction='out'/>"
111                         "</method>"
112                         "<method name='RejectConnection'>"
113                                 "<arg type='s' name='mac_address' direction='in'/>"
114                                 "<arg type='i' name='error_code' direction='out'/>"
115                         "</method>"
116                         "<method name='DisconnectAll'>"
117                                 "<arg type='i' name='error_code' direction='out'/>"
118                         "</method>"
119                         "<method name='GetConnectedPeers'>"
120                                 "<arg type='i' name='error_code' direction='out'/>"
121                                 "<arg type='aa{sv}' name='peer_details_list' direction='out'/>"
122                         "</method>"
123                         "<method name='IsDiscoverable'>"
124                                 "<arg type='b' name='result' direction='out'/>"
125                         "</method>"
126                         "<method name='IsListeningOnly'>"
127                                 "<arg type='b' name='result' direction='out'/>"
128                         "</method>"
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'/>"
133                         "</method>"
134                         "<method name='GetState'>"
135                                 "<arg type='i' name='error_code' direction='out'/>"
136                                 "<arg type='i' name='state' direction='out'/>"
137                         "</method>"
138                         "<signal name='Activation'>"
139                                 "<arg type='i' name='error_code'/>"
140                         "</signal>"
141                         "<signal name='Deactivation'>"
142                                 "<arg type='i' name='error_code'/>"
143                         "</signal>"
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'/>"
148                         "</signal>"
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'/>"
153                         "</signal>"
154                         "<signal name='ListenStarted'>"
155                         "</signal>"
156                         "<signal name='DiscoveryStarted'>"
157                         "</signal>"
158                         "<signal name='DiscoveryFinished'>"
159                         "</signal>"
160                         "<signal name='PeerFound'>"
161                                 "<arg type='s' name='peer_mac_address'/>"
162                         "</signal>"
163                         "<signal name='PeerLost'>"
164                                 "<arg type='s' name='peer_mac_address'/>"
165                         "</signal>"
166                         "<signal name='PeerIPAssigned'>"
167                                 "<arg type='s' name='peer_mac_address'/>"
168                                 "<arg type='s' name='assigned_ip_address'/>"
169                         "</signal>"
170                 "</interface>"
171                 "<interface name='net.wifidirect.group'>"
172                         "<method name='CreateGroup'>"
173                                 "<arg type='i' name='error_code' direction='out'/>"
174                         "</method>"
175                         "<method name='DestroyGroup'>"
176                                 "<arg type='i' name='error_code' direction='out'/>"
177                         "</method>"
178                         "<method name='IsGroupOwner'>"
179                                 "<arg type='b' name='result' direction='out'/>"
180                         "</method>"
181                         "<method name='IsAutoGroup'>"
182                                 "<arg type='b' name='result' direction='out'/>"
183                         "</method>"
184                         "<method name='ActivatePushButton'>"
185                                 "<arg type='i' name='error_code' direction='out'/>"
186                         "</method>"
187                         "<method name='GetPersistentGroups'>"
188                                 "<arg type='i' name='error_code' direction='out'/>"
189                                 "<arg type='aa{sv}' name='result' direction='out'/>"
190                         "</method>"
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'/>"
195                         "</method>"
196                         "<method name='SetPassphrase'>"
197                                 "<arg type='s' name='passphrase' direction='in'/>"
198                                 "<arg type='i' name='error_code' direction='out'/>"
199                         "</method>"
200                         "<method name='GetPassphrase'>"
201                                 "<arg type='i' name='error_code' direction='out'/>"
202                                 "<arg type='s' name='passphrase' direction='out'/>"
203                         "</method>"
204                         "<method name='SetPersistentGroupEnabled'>"
205                                 "<arg type='b' name='enable' direction='in'/>"
206                                 "<arg type='i' name='error_code' direction='out'/>"
207                         "</method>"
208                         "<method name='IsPersistentGroupEnabled'>"
209                                 "<arg type='b' name='result' direction='out'/>"
210                         "</method>"
211                         "<signal name='Created'>"
212                         "</signal>"
213                         "<signal name='Destroyed'>"
214                         "</signal>"
215                 "</interface>"
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'/>"
220                         "</method>"
221                         "<method name='SetDeviceName'>"
222                                 "<arg type='s' name='device_name' direction='in'/>"
223                                 "<arg type='i' name='error_code' direction='out'/>"
224                         "</method>"
225                         "<method name='SetWpsPin'>"
226                                 "<arg type='s' name='wps_pin' direction='in'/>"
227                                 "<arg type='i' name='error_code' direction='out'/>"
228                         "</method>"
229                         "<method name='GetWpsPin'>"
230                                 "<arg type='i' name='error_code' direction='out'/>"
231                                 "<arg type='s' name='wps_pin' direction='out'/>"
232                         "</method>"
233                         "<method name='GenerateWpsPin'>"
234                                 "<arg type='i' name='error_code' direction='out'/>"
235                                 "<arg type='s' name='wps_pin' direction='out'/>"
236                         "</method>"
237                         "<method name='GetSupportedWpsMode'>"
238                                 "<arg type='i' name='error_code' direction='out'/>"
239                                 "<arg type='i' name='config_methods' direction='out'/>"
240                         "</method>"
241                         "<method name='GetReqWpsMode'>"
242                                 "<arg type='i' name='error_code' direction='out'/>"
243                                 "<arg type='i' name='req_wps_mode' direction='out'/>"
244                         "</method>"
245                         "<method name='SetReqWpsMode'>"
246                                 "<arg type='i' name='req_wps_mode' direction='in'/>"
247                                 "<arg type='i' name='error_code' direction='out'/>"
248                         "</method>"
249                         "<method name='GetLocalWpsMode'>"
250                                 "<arg type='i' name='error_code' direction='out'/>"
251                                 "<arg type='i' name='local_wps_mode' direction='out'/>"
252                         "</method>"
253                         "<method name='GetIPAddress'>"
254                                 "<arg type='i' name='error_code' direction='out'/>"
255                                 "<arg type='s' name='local_ip_address' direction='out'/>"
256                         "</method>"
257                         "<method name='GetMacAddress'>"
258                                 "<arg type='i' name='error_code' direction='out'/>"
259                                 "<arg type='s' name='local_mac_address' direction='out'/>"
260                         "</method>"
261                         "<method name='GetGoIntent'>"
262                                 "<arg type='i' name='error_code' direction='out'/>"
263                                 "<arg type='i' name='go_intent' direction='out'/>"
264                         "</method>"
265                         "<method name='SetGoIntent'>"
266                                 "<arg type='i' name='go_intent' direction='in'/>"
267                                 "<arg type='i' name='error_code' direction='out'/>"
268                         "</method>"
269                         "<method name='GetMaxClient'>"
270                                 "<arg type='i' name='error_code' direction='out'/>"
271                                 "<arg type='i' name='max_client' direction='out'/>"
272                         "</method>"
273                         "<method name='SetMaxClient'>"
274                                 "<arg type='i' name='max_client' direction='in'/>"
275                                 "<arg type='i' name='error_code' direction='out'/>"
276                         "</method>"
277                         "<method name='SetAutoConnectionMode'>"
278                                 "<arg type='b' name='auto_connection_mode' direction='in'/>"
279                                 "<arg type='i' name='error_code' direction='out'/>"
280                         "</method>"
281                         "<method name='IsAutoConnectionMode'>"
282                                 "<arg type='i' name='error_code' direction='out'/>"
283                                 "<arg type='b' name='result' direction='out'/>"
284                         "</method>"
285                         "<method name='GetOperatingChannel'>"
286                                 "<arg type='i' name='error_code' direction='out'/>"
287                                 "<arg type='i' name='operating_channel' direction='out'/>"
288                         "</method>"
289                         "<method name='SetAutoConnectionPeer'>"
290                                 "<arg type='s' name='peer_mac_address' direction='in'/>"
291                                 "<arg type='i' name='error_code' direction='out'/>"
292                         "</method>"
293                         "<method name='GetConnectingPeer'>"
294                                 "<arg type='i' name='error_code' direction='out'/>"
295                                 "<arg type='s' name='local_mac_address' direction='out'/>"
296                         "</method>"
297                         "<method name='GetInterfaceName'>"
298                                 "<arg type='i' name='error_code' direction='out'/>"
299                                 "<arg type='s' name='ifname' direction='out'/>"
300                         "</method>"
301                         "<method name='GetSubnetMask'>"
302                                 "<arg type='i' name='error_code' direction='out'/>"
303                                 "<arg type='s' name='subnet_mask' direction='out'/>"
304                         "</method>"
305                         "<method name='GetGateway'>"
306                                 "<arg type='i' name='error_code' direction='out'/>"
307                                 "<arg type='s' name='gateway_address' direction='out'/>"
308                         "</method>"
309                         "<method name='GetSessionTimer'>"
310                                 "<arg type='i' name='error_code' direction='out'/>"
311                                 "<arg type='i' name='session_timer' direction='out'/>"
312                         "</method>"
313                         "<method name='SetSessionTimer'>"
314                                 "<arg type='i' name='session_timer' direction='in'/>"
315                                 "<arg type='i' name='error_code' direction='out'/>"
316                         "</method>"
317                         "<method name='SetAutoGroupRemoval'>"
318                                 "<arg type='b' name='enable' direction='in'/>"
319                                 "<arg type='i' name='error_code' direction='out'/>"
320                         "</method>"
321                         "<method name='GetPrimaryDevType'>"
322                                 "<arg type='i' name='pri_dev_type' direction='out'/>"
323                                 "<arg type='i' name='error_code' direction='out'/>"
324                         "</method>"
325                         "<method name='GetSecondaryDevType'>"
326                                 "<arg type='i' name='sec_dev_type' direction='out'/>"
327                                 "<arg type='i' name='error_code' direction='out'/>"
328                         "</method>"
329                 "</interface>"
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'/>"
336                         "</method>"
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'/>"
341                         "</method>"
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'/>"
347                         "</method>"
348                         "<method name='Deregister'>"
349                                 "<arg type='i' name='service_id' direction='in'/>"
350                                 "<arg type='i' name='error_code' direction='out'/>"
351                         "</method>"
352                         "<signal name='DiscoveryStarted'>"
353                         "</signal>"
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'/>"
358                         "</signal>"
359                         "<signal name='DiscoveryFinished'>"
360                         "</signal>"
361                 "</interface>"
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'/>"
367                         "</method>"
368                         "<method name='Deinit'>"
369                                 "<arg type='i' name='error_code' direction='out'/>"
370                         "</method>"
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'/>"
376                         "</method>"
377                         "<method name='SetAvailiability'>"
378                                 "<arg type='i' name='availability' direction='in'/>"
379                                 "<arg type='i' name='error_code' direction='out'/>"
380                         "</method>"
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'/>"
385                         "</method>"
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'/>"
390                         "</method>"
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'/>"
395                         "</method>"
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'/>"
400                         "</method>"
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'/>"
405                         "</method>"
406                 "</interface>"
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'/>"
413                         "</method>"
414                         "<method name='CancelAdvertiseService'>"
415                                 "<arg type='u' name='adv_id' direction='in'/>"
416                                 "<arg type='i' name='result' direction='out'/>"
417                         "</method>"
418                         "<method name='SeekService'>"
419                                 "<arg type='a{sv}' name='parameters' direction='in'/>"
420                                 "<arg type='i' name='result' direction='out'/>"
421                         "</method>"
422                         "<method name='CancelSeekService'>"
423                                 "<arg type='t' name='search_id' direction='in'/>"
424                                 "<arg type='i' name='result' direction='out'/>"
425                         "</method>"
426                 "<method name='ConnectSession'>"
427                         "<arg type='a{sv}' name='parameters' direction='in'/>"
428                         "<arg type='i' name='result' direction='out'/>"
429                 "</method>"
430                 "<method name='ConfirmSession'>"
431                         "<arg type='a{sv}' name='parameters' direction='in'/>"
432                         "<arg type='i' name='result' direction='out'/>"
433                 "</method>"
434                         "<signal name='SearchResult'>"
435                                 "<arg type='a{sv}' name='parameters'/>"
436                         "</signal>"
437                 "<signal name='SessionRequest'>"
438                         "<arg type='a{sv}' name='parameters'/>"
439                 "</signal>"
440                 "<signal name='SessionConfigRequest'>"
441                         "<arg type='a{sv}' name='parameters'/>"
442                 "</signal>"
443                 "<signal name='ConnectStatus'>"
444                         "<arg type='a{sv}' name='parameters'/>"
445                 "</signal>"
446                 "<signal name='SessionStatus'>"
447                         "<arg type='a{sv}' name='parameters'/>"
448                 "</signal>"
449                 "<signal name='SessionPeerIPAssigned'>"
450                 "<arg type='a{sv}' name='parameters'/>"
451                 "</signal>"
452                 "</interface>"
453 #endif
454         "</node>"
455 };
456
457
458 static void __wfd_manager_manage_iface_handler(const gchar *method_name,
459                                               GVariant    *parameters,
460                                               GDBusMethodInvocation *invocation)
461 {
462         int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
463         wfd_manager_s *manager = wfd_get_manager();
464         GVariant *return_parameters = NULL;
465         GError *err = NULL;
466         gchar* dbus_error_name = NULL;
467         WDS_LOGD("%s", method_name);
468
469         if (!g_strcmp0(method_name, "Activate")) {
470
471                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
472
473                 ret = wfd_manager_activate(manager);
474                 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
475                                              "Activation",
476                                              g_variant_new("(i)", ret));
477                 return;
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);
481                 goto done;
482 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
483         } else if (!g_strcmp0(method_name, "Deactivate")) {
484
485                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
486                         WDS_LOGE("Already deactivated");
487                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
488                         goto failed;
489                 }
490
491                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
492
493                 ret = wfd_manager_deactivate(manager);
494                 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
495                                              "Deactivation",
496                                              g_variant_new("(i)", ret));
497                 return;
498
499         } else if (!g_strcmp0(method_name, "StartDiscovery")) {
500                 gboolean mode = FALSE;
501                 gint32 timeout = 0;
502                 guint32 channel = 0;
503                 const gchar *type = NULL;
504                 GVariantIter *iter = NULL;
505                 gchar *key = NULL;
506                 GVariant *var = NULL;
507
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);
518                         else
519                                 ;/* Do Nothing */
520                 }
521                 g_variant_iter_free(iter);
522
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;
528                         goto failed;
529                 }
530
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);
535                         goto done;
536                 }
537
538                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
539
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,
544                                                              "ListenStarted",
545                                                              NULL);
546                         } else {
547                                 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
548                                                              "DiscoveryStarted",
549                                                              NULL);
550                         }
551                 }
552                 return;
553
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;
559                         goto failed;
560                 }
561
562                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
563
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);
568                 return;
569
570         } else if (!g_strcmp0(method_name, "GetDiscoveredPeers")) {
571                 wfd_discovery_entry_s *peers = NULL;
572                 GVariantBuilder *builder_peers = NULL;
573                 int peer_cnt = 0;
574                 int i = 0;
575
576                 builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
577
578                 peer_cnt = wfd_manager_get_peers(manager, &peers);
579                 WDS_LOGD("Peer count [%d], Peer list [%p]", peer_cnt, peers);
580                 if (peer_cnt < 0) {
581                         WDS_LOGE("Failed to get scan result");
582                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
583                         goto failed;
584                 }
585
586                 if (peer_cnt > 255)
587                         peer_cnt = 255;
588
589                 for (i = 0; i < peer_cnt; i++) {
590                         GVariantBuilder builder_peer;
591                         g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
592
593                         g_variant_builder_add(&builder_peer, "{sv}",
594                                         "DeviceName",
595                                         g_variant_new_string(peers[i].device_name));
596                         g_variant_builder_add(&builder_peer, "{sv}",
597                                         "DeviceAddress",
598                                         wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
599                         g_variant_builder_add(&builder_peer, "{sv}",
600                                         "InterfaceAddress",
601                                         wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
602                         g_variant_builder_add(&builder_peer, "{sv}",
603                                         "Channel",
604                                         g_variant_new_uint16(peers[i].channel));
605 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
606                         g_variant_builder_add(&builder_peer, "{sv}",
607                                         "Services",
608                                         g_variant_new_uint16(peers[i].services));
609 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
610                         g_variant_builder_add(&builder_peer, "{sv}",
611                                         "IsGroupOwner",
612                                         g_variant_new_boolean(peers[i].is_group_owner));
613                         g_variant_builder_add(&builder_peer, "{sv}",
614                                         "IsPersistentGO",
615                                         g_variant_new_boolean(peers[i].is_persistent_go));
616                         g_variant_builder_add(&builder_peer, "{sv}",
617                                         "IsConnected",
618                                         g_variant_new_boolean(peers[i].is_connected));
619                         g_variant_builder_add(&builder_peer, "{sv}",
620                                         "WpsDevicePwdID",
621                                         g_variant_new_uint16(peers[i].wps_device_pwd_id));
622                         g_variant_builder_add(&builder_peer, "{sv}",
623                                         "WpsCfgMethods",
624                                         g_variant_new_uint16(peers[i].wps_cfg_methods));
625                         g_variant_builder_add(&builder_peer, "{sv}",
626                                         "Category",
627                                         g_variant_new_uint16(peers[i].category));
628                         g_variant_builder_add(&builder_peer, "{sv}",
629                                         "SubCategory",
630                                         g_variant_new_uint16(peers[i].subcategory));
631 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
632                         g_variant_builder_add(&builder_peer, "{sv}",
633                                         "IsWfdDevice",
634                                         g_variant_new_boolean(peers[i].is_wfd_device));
635 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
636
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));
639                 }
640
641                 ret = WIFI_DIRECT_ERROR_NONE;
642                 return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
643                 g_variant_builder_unref(builder_peers);
644                 goto done;
645
646         } else if (!g_strcmp0(method_name, "Connect")) {
647                 const char *peer_mac_address = NULL;
648                 unsigned char mac_addr[MACADDR_LEN] = {0, };
649
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;
654                         goto failed;
655                 }
656
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;
660                         goto failed;
661                 }
662
663                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
664
665                 g_variant_get(parameters, "(&s)", &peer_mac_address);
666                 macaddr_atoe(peer_mac_address, mac_addr);
667
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,
671                                                      "Connection",
672                                                      g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
673                                                                             WFD_EVENT_CONNECTION_IN_PROGRESS,
674                                                                             peer_mac_address));
675                 return;
676
677         } else if (!g_strcmp0(method_name, "Disconnect")) {
678                 const char *peer_mac_address = NULL;
679                 unsigned char mac_addr[MACADDR_LEN] = {0, };
680
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);
684                                 if (ret < 0) {
685                                         WDS_LOGE("Failed to stop scan");
686                                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
687                                         goto failed;
688                                 }
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);
693                                 } else {
694                                         wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
695                                         wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
696                                 }
697                         } else {
698                                 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
699                                 goto failed;
700                         }
701                 }
702
703                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
704
705                 g_variant_get(parameters, "(&s)", &peer_mac_address);
706                 macaddr_atoe(peer_mac_address, mac_addr);
707
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,
711                                                      "Disconnection",
712                                                      g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
713                                                                             WFD_EVENT_DISCONNECTION_RSP,
714                                                                             peer_mac_address));
715                 return;
716
717         } else if (!g_strcmp0(method_name, "CancelConnection")) {
718                 const char *peer_mac_address = NULL;
719                 unsigned char mac_addr[MACADDR_LEN] = {0, };
720
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;
724                         goto failed;
725                 }
726
727                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
728
729                 g_variant_get(parameters, "(&s)", &peer_mac_address);
730                 macaddr_atoe(peer_mac_address, mac_addr);
731
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,
735                                                      "Connection",
736                                                      g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
737                                                                             WFD_EVENT_CONNECTION_RSP,
738                                                                             peer_mac_address));
739                 return;
740
741         } else if (!g_strcmp0(method_name, "AcceptConnection")) {
742                 const char *peer_mac_address = NULL;
743                 unsigned char mac_addr[MACADDR_LEN] = {0, };
744
745                 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
746                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
747                         goto failed;
748                 }
749
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;
753                         goto failed;
754                 }
755
756                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
757
758                 g_variant_get(parameters, "(&s)", &peer_mac_address);
759                 macaddr_atoe(peer_mac_address, mac_addr);
760
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,
764                                                      "Connection",
765                                                      g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
766                                                                             WFD_EVENT_CONNECTION_IN_PROGRESS,
767                                                                             peer_mac_address));
768                 } else {
769                         wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
770                                                      "Connection",
771                                                      g_variant_new("(iis)", WIFI_DIRECT_ERROR_OPERATION_FAILED,
772                                                                             WFD_EVENT_CONNECTION_RSP,
773                                                                             peer_mac_address));
774                 }
775                 return;
776
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, };
781
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;
785                         goto failed;
786                 }
787
788                 if (session->direction != SESSION_DIRECTION_INCOMING) {
789                         WDS_LOGE("Only incomming session can be rejected");
790                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
791                         goto failed;
792                 }
793
794                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
795
796                 g_variant_get(parameters, "(&s)", &peer_mac_address);
797                 macaddr_atoe(peer_mac_address, mac_addr);
798
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,
802                                                      "Connection",
803                                                      g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
804                                                                             WFD_EVENT_CONNECTION_RSP,
805                                                                             peer_mac_address));
806                 return;
807
808         } else if (!g_strcmp0(method_name, "DisconnectAll")) {
809
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);
813                                 if (ret < 0) {
814                                         WDS_LOGE("Failed to stop scan");
815                                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
816                                         goto failed;
817                                 }
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);
822                                 } else {
823                                         wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
824                                         wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
825                                 }
826                         } else {
827                                 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
828                                 goto failed;
829                         }
830                 }
831
832                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
833
834                 ret = wfd_manager_disconnect_all(manager);
835                 if (ret == WIFI_DIRECT_ERROR_NONE)
836                         wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
837                                                      "Disconnection",
838                                                      g_variant_new("(iis)", ret,
839                                                                             WFD_EVENT_DISCONNECTION_RSP,
840                                                                             ""));
841                 return;
842
843         } else if (!g_strcmp0(method_name, "GetConnectedPeers")) {
844                 wfd_connected_peer_info_s *peers = NULL;
845                 GVariantBuilder *builder_peers = NULL;
846                 int peer_cnt = 0;
847                 int i = 0;
848
849                 builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
850
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;
856                         goto failed;
857                 }
858
859                 peer_cnt = wfd_manager_get_connected_peers(manager, &peers);
860                 WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
861                 if (peer_cnt < 0) {
862                         WDS_LOGE("Failed to get scan result");
863                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
864                         goto failed;
865                 }
866
867                 for (i = 0; i < peer_cnt; i++) {
868                         GVariantBuilder builder_peer;
869                         g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
870
871                         g_variant_builder_add(&builder_peer, "{sv}",
872                                         "DeviceName",
873                                         g_variant_new_string(peers[i].device_name));
874                         g_variant_builder_add(&builder_peer, "{sv}",
875                                         "DeviceAddress",
876                                         wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
877                         g_variant_builder_add(&builder_peer, "{sv}",
878                                         "InterfaceAddress",
879                                         wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
880                         g_variant_builder_add(&builder_peer, "{sv}",
881                                         "IPAddress",
882                                         wfd_manager_dbus_pack_ay(peers[i].ip_address, IPADDR_LEN));
883                         g_variant_builder_add(&builder_peer, "{sv}",
884                                         "Channel",
885                                         g_variant_new_uint16(peers[i].channel));
886 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
887                         g_variant_builder_add(&builder_peer, "{sv}",
888                                         "Services",
889                                         g_variant_new_uint16(peers[i].services));
890 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
891                         g_variant_builder_add(&builder_peer, "{sv}",
892                                         "Category",
893                                         g_variant_new_uint16(peers[i].category));
894                         g_variant_builder_add(&builder_peer, "{sv}",
895                                         "SubCategory",
896                                         g_variant_new_uint16(peers[i].subcategory));
897                         g_variant_builder_add(&builder_peer, "{sv}",
898                                         "IsP2P",
899                                         g_variant_new_boolean(peers[i].is_p2p));
900 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
901                         g_variant_builder_add(&builder_peer, "{sv}",
902                                         "IsWfdDevice",
903                                         g_variant_new_boolean(peers[i].is_wfd_device));
904 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
905
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));
908                 }
909
910                 ret = WIFI_DIRECT_ERROR_NONE;
911                 return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
912                 g_variant_builder_unref(builder_peers);
913                 goto done;
914
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));
920                 goto done;
921
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));
925                 goto done;
926
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, };
932
933                 g_variant_get(parameters, "(&s)", &peer_mac_address);
934                 macaddr_atoe(peer_mac_address, mac_addr);
935
936                 builder_peer = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
937
938                 ret = wfd_manager_get_peer_info(manager, mac_addr, &peer);
939                 if (ret < 0 || !peer) {
940                         WDS_LOGE("Failed to get peer info");
941                         g_free(peer);
942                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
943                         goto failed;
944                 }
945
946                 g_variant_builder_add(builder_peer, "{sv}",
947                                 "DeviceName",
948                                 g_variant_new_string(peer->device_name));
949                 g_variant_builder_add(builder_peer, "{sv}",
950                                 "DeviceAddress",
951                                 wfd_manager_dbus_pack_ay(peer->mac_address, MACADDR_LEN));
952                 g_variant_builder_add(builder_peer, "{sv}",
953                                 "InterfaceAddress",
954                                 wfd_manager_dbus_pack_ay(peer->intf_address, MACADDR_LEN));
955                 g_variant_builder_add(builder_peer, "{sv}",
956                                 "Channel",
957                                 g_variant_new_uint16(peer->channel));
958 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
959                 g_variant_builder_add(builder_peer, "{sv}",
960                                 "Services",
961                                 g_variant_new_uint16(peer->services));
962 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
963                 g_variant_builder_add(builder_peer, "{sv}",
964                                 "IsGroupOwner",
965                                 g_variant_new_boolean(peer->is_group_owner));
966                 g_variant_builder_add(builder_peer, "{sv}",
967                                 "IsPersistentGO",
968                                 g_variant_new_boolean(peer->is_persistent_go));
969                 g_variant_builder_add(builder_peer, "{sv}",
970                                 "IsConnected",
971                                 g_variant_new_boolean(peer->is_connected));
972                 g_variant_builder_add(builder_peer, "{sv}",
973                                 "WpsDevicePwdID",
974                                 g_variant_new_uint16(peer->wps_device_pwd_id));
975                 g_variant_builder_add(builder_peer, "{sv}",
976                                 "WpsCfgMethods",
977                                 g_variant_new_uint16(peer->wps_cfg_methods));
978                 g_variant_builder_add(builder_peer, "{sv}",
979                                 "Category",
980                                 g_variant_new_uint16(peer->category));
981                 g_variant_builder_add(builder_peer, "{sv}",
982                                 "SubCategory",
983                                 g_variant_new_uint16(peer->subcategory));
984 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
985                 g_variant_builder_add(builder_peer, "{sv}",
986                                 "IsWfdDevice",
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}",
994                                         "IsInGroup",
995                                         g_variant_new_boolean(true));
996                         g_variant_builder_add(builder_peer, "{sv}",
997                                         "IPAddress",
998                                         wfd_manager_dbus_pack_ay(connected_peer->ip_addr, IPADDR_LEN));
999                 }
1000 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
1001
1002                 ret = WIFI_DIRECT_ERROR_NONE;
1003                 return_parameters = g_variant_new("(ia{sv})", ret, builder_peer);
1004                 g_variant_builder_unref(builder_peer);
1005                 g_free(peer);
1006                 goto done;
1007
1008         } else if (!g_strcmp0(method_name, "GetState")) {
1009                 ret = WIFI_DIRECT_ERROR_NONE;
1010                 return_parameters = g_variant_new("(ii)", ret, manager->state);
1011                 goto done;
1012
1013         } else {
1014                 WDS_LOGD("method not handled");
1015                 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1016                 goto failed;
1017         }
1018
1019 done:
1020         WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1021         return;
1022
1023 failed:
1024
1025 /*g_dbus_method_invocation_return_dbus_error
1026  * (invocation, WFD_MANAGER_SERVICE ".Error", ".OperationFailed"); */
1027
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);
1034         return;
1035 }
1036
1037 static void __wfd_manager_group_iface_handler(const gchar *method_name,
1038                                              GVariant    *parameters,
1039                                              GDBusMethodInvocation *invocation)
1040 {
1041         int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1042         wfd_manager_s *manager = wfd_get_manager();
1043         GVariant *return_parameters = NULL;
1044         GError *err = NULL;
1045         WDS_LOGD("%s", method_name);
1046
1047         if (!g_strcmp0(method_name, "CreateGroup")) {
1048                 wfd_group_s *group = manager->group;
1049                 wfd_oem_group_param_s param;
1050
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;
1054                         goto failed;
1055                 }
1056
1057 #ifdef TIZEN_WLAN_BOARD_SPRD
1058                 group = wfd_create_pending_group(manager, manager->local->dev_addr);
1059 #else
1060                 group = wfd_create_pending_group(manager, manager->local->intf_addr);
1061 #endif
1062                 if (!group) {
1063                         WDS_LOGE("Failed to create pending group");
1064                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1065                         goto failed;
1066                 }
1067                 group->flags |= WFD_GROUP_FLAG_AUTONOMOUS;
1068                 manager->group = group;
1069
1070                 memset(&param, 0x0, sizeof(param));
1071
1072                 param.persistent = (manager->local->group_flags &
1073                                         WFD_GROUP_FLAG_PERSISTENT);
1074                 memcpy(&(param.passphrase), manager->local->passphrase,
1075                                         sizeof(param.passphrase));
1076
1077 #ifndef TIZEN_WLAN_BOARD_SPRD
1078                 param.freq = WFD_FREQ_2G;
1079 #endif
1080
1081                 ret = wfd_oem_create_group(manager->oem_ops, &param);
1082                 if (ret < 0) {
1083                         WDS_LOGE("Failed to create group");
1084                         wfd_destroy_group(manager);
1085                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1086                         goto failed;
1087                 }
1088
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);
1093                 goto done;
1094
1095         } else if (!g_strcmp0(method_name, "DestroyGroup")) {
1096                 wfd_group_s *group = manager->group;
1097                 if (!group) {
1098                         WDS_LOGE("Group not exist");
1099                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1100                         goto failed;
1101                 }
1102
1103                 if (group->pending == FALSE) {
1104                         ret = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1105                         if (ret < 0) {
1106                                 WDS_LOGE("Failed to destroy group");
1107                                 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1108                                 goto failed;
1109                         }
1110                 }
1111
1112                 ret = wfd_destroy_group(manager);
1113                 if (ret < 0)
1114                         WDS_LOGE("Failed to destroy group");
1115
1116                 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1117                 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1118
1119                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
1120
1121                 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
1122                                 "Destroyed", NULL);
1123                 return;
1124
1125         } else if (!g_strcmp0(method_name, "IsGroupOwner")) {
1126                 gboolean result;
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);
1131                 goto done;
1132
1133         } else if (!g_strcmp0(method_name, "IsAutoGroup")) {
1134                 int result;
1135                 if ((result = wfd_group_is_autonomous(manager->group)) < 0)
1136                         result = 0;
1137
1138                 WDS_LOGI("Is autonomous group : [%s]", result ? "Yes" : "No");
1139                 return_parameters = g_variant_new("(b)", result);
1140                 goto done;
1141
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;
1146                         goto failed;
1147                 }
1148
1149                 ret = wfd_oem_wps_start(manager->oem_ops, NULL,
1150                                 WFD_WPS_MODE_PBC, NULL);
1151                 if (ret < 0) {
1152                         WDS_LOGE("Failed to start wps");
1153                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1154                         goto failed;
1155                 }
1156                 return_parameters = g_variant_new("(i)", ret);
1157                 goto done;
1158
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;
1163                 int i = 0;
1164
1165                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1166                         WDS_LOGE("Wi-Fi Direct is not activated.");
1167                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1168                         goto failed;
1169                 }
1170
1171
1172                 ret = wfd_oem_get_persistent_groups(manager->oem_ops,
1173                                 (wfd_oem_persistent_group_s**) &plist, &persistent_group_count);
1174                 if (ret < 0) {
1175                         WDS_LOGE("Error!! wfd_oem_get_persistent_group_info() failed..");
1176                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1177                         goto failed;
1178                 }
1179
1180                 builder_groups = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
1181
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}"));
1185
1186                         g_variant_builder_add(&builder_group, "{sv}",
1187                                         "NetworkID",
1188                                         g_variant_new_uint32(plist[i].network_id));
1189                         g_variant_builder_add(&builder_group, "{sv}",
1190                                         "SSID",
1191                                         g_variant_new_string(plist[i].ssid));
1192                         g_variant_builder_add(&builder_group, "{sv}",
1193                                         "GOMacAddress",
1194                                         wfd_manager_dbus_pack_ay(plist[i].go_mac_address, MACADDR_LEN));
1195
1196                         WDS_LOGD("%dth peer [%s]", i, plist[i].ssid);
1197                         g_variant_builder_add_value(builder_groups, g_variant_builder_end(&builder_group));
1198                 }
1199
1200                 ret = WIFI_DIRECT_ERROR_NONE;
1201                 return_parameters = g_variant_new("(iaa{sv})", ret, builder_groups);
1202                 g_variant_builder_unref(builder_groups);
1203                 goto done;
1204
1205         } else if (!g_strcmp0(method_name, "RemovePersistentGroup")) {
1206                 gchar *ssid;
1207                 gchar *mac_address;
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;
1212                         goto failed;
1213                 }
1214
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));
1218
1219                 ret = wfd_oem_remove_persistent_group(manager->oem_ops, ssid,
1220                                 go_mac_address);
1221                 if (ret < 0) {
1222                         WDS_LOGE("Failed to remove persistent group");
1223                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1224                         goto failed;
1225                 }
1226                 return_parameters = g_variant_new("(i)", ret);
1227                 goto done;
1228
1229         } else if (!g_strcmp0(method_name, "SetPassphrase")) {
1230                 gchar *passphrase;
1231                 int passphrase_len = 0;
1232                 wfd_group_s *group = manager->group;
1233
1234                 if (group) {
1235                         WDS_LOGE("Group already exists");
1236                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1237                         goto failed;
1238                 }
1239
1240                 g_variant_get(parameters, "(&s)", &passphrase);
1241                 passphrase_len = strlen(passphrase);
1242
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;
1248                         goto failed;
1249                 }
1250
1251                 g_strlcpy(manager->local->passphrase, passphrase, PASSPHRASE_LEN_MAX + 1);
1252                 WDS_LOGI("Passphrase string [%s]", manager->local->passphrase);
1253
1254                 ret = WIFI_DIRECT_ERROR_NONE;
1255                 return_parameters = g_variant_new("(i)", ret);
1256                 goto done;
1257
1258         } else if (!g_strcmp0(method_name, "GetPassphrase")) {
1259                 wfd_group_s *group = manager->group;
1260                 if (!group) {
1261                         WDS_LOGE("Group not exist");
1262                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1263                         goto failed;
1264                 }
1265
1266                 if (group->role == WFD_DEV_ROLE_GC) {
1267                         WDS_LOGE("Device is not GO");
1268                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1269                         goto failed;
1270                 }
1271
1272                 ret = WIFI_DIRECT_ERROR_NONE;
1273                 return_parameters = g_variant_new("(is)", ret, group->passphrase);
1274                 WDS_LOGI("group->pass : [%s]", group->passphrase);
1275                 goto done;
1276
1277
1278         } else if (!g_strcmp0(method_name, "SetPersistentGroupEnabled")) {
1279                 gboolean enabled;
1280
1281                 g_variant_get(parameters, "(b)", &enabled);
1282                 WDS_LOGI("Activate Persistent Group : [%s]",
1283                                 enabled ? "True" : "False");
1284                 if (enabled)
1285                         manager->local->group_flags |= WFD_GROUP_FLAG_PERSISTENT;
1286                 else
1287                         manager->local->group_flags &= ~(WFD_GROUP_FLAG_PERSISTENT);
1288                 ret = WIFI_DIRECT_ERROR_NONE;
1289                 return_parameters = g_variant_new("(i)", ret);
1290                 goto done;
1291
1292         } else if (!g_strcmp0(method_name, "IsPersistentGroupEnabled")) {
1293                 gboolean result;
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);
1299                 goto done;
1300
1301         } else {
1302                 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1303                 goto failed;
1304         }
1305
1306 done:
1307         WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1308         return;
1309
1310 failed:
1311         wfd_error_set_gerror(ret, &err);
1312         g_dbus_method_invocation_return_gerror(invocation, err);
1313         g_clear_error(&err);
1314         return;
1315 }
1316
1317 static void __wfd_manager_config_iface_handler(const gchar *method_name,
1318                                               GVariant    *parameters,
1319                                               GDBusMethodInvocation *invocation)
1320 {
1321         int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1322         wfd_manager_s *manager = wfd_get_manager();
1323         GVariant *return_parameters = NULL;
1324         GError *err = NULL;
1325         WDS_LOGD("%s", method_name);
1326
1327         if (!g_strcmp0(method_name, "GetDeviceName")) {
1328                 char device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN+1] = {0, };
1329
1330                 ret = wfd_local_get_dev_name(device_name);
1331                 if (ret < 0) {
1332                         WDS_LOGE("Failed to get device name");
1333                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1334                         goto failed;
1335                 } else {
1336
1337                         ret = WIFI_DIRECT_ERROR_NONE;
1338                         return_parameters = g_variant_new("(is)", ret, device_name);
1339                 }
1340                 goto done;
1341
1342         } else if (!g_strcmp0(method_name, "SetDeviceName")) {
1343                 const char *device_name = NULL;
1344                 g_variant_get(parameters, "(&s)", &device_name);
1345
1346                 ret = wfd_local_set_dev_name((char *)device_name);
1347                 if (ret < 0) {
1348                         WDS_LOGE("Failed to set device name");
1349                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1350                         goto failed;
1351                 }
1352
1353                 ret = WIFI_DIRECT_ERROR_NONE;
1354                 return_parameters = g_variant_new("(i)", ret);
1355                 goto done;
1356
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;
1362                         goto failed;
1363                 }
1364
1365                 if (session->wps_pin[0] == '\0') {
1366                         WDS_LOGE("WPS PIN is not set");
1367                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1368                         goto failed;
1369                 }
1370
1371                 ret = WIFI_DIRECT_ERROR_NONE;
1372                 return_parameters = g_variant_new("(is)", ret, session->wps_pin);
1373                 goto done;
1374
1375         } else if (!g_strcmp0(method_name, "SetWpsPin")) {
1376                 const char *pin = NULL;
1377                 wfd_session_s *session = (wfd_session_s*) manager->session;
1378
1379                 g_variant_get(parameters, "(&s)", &pin);
1380
1381                 if (!session) {
1382                         WDS_LOGE("Session not exist");
1383                         g_strlcpy(manager->auto_pin, pin, strlen(pin) + 1);
1384                 } else {
1385                         g_strlcpy(session->wps_pin, pin, strlen(pin) + 1);
1386                 }
1387
1388                 ret = WIFI_DIRECT_ERROR_NONE;
1389                 return_parameters = g_variant_new("(i)", ret);
1390                 goto done;
1391
1392         } else if (!g_strcmp0(method_name, "GetSupportedWpsMode")) {
1393                 int config_methods = 0;
1394
1395                 ret = wfd_local_get_supported_wps_mode(&config_methods);
1396                 if (ret < 0) {
1397                         WDS_LOGE("Failed to get supported wps mode");
1398                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1399                         goto failed;
1400                 }
1401
1402                 ret = WIFI_DIRECT_ERROR_NONE;
1403                 return_parameters = g_variant_new("(ii)", ret, config_methods);
1404                 goto done;
1405
1406         } else if (!g_strcmp0(method_name, "GetReqWpsMode")) {
1407                 int wps_mode = 0;
1408
1409                 ret = wfd_manager_get_req_wps_mode(&wps_mode);
1410                 if (ret < 0) {
1411                         WDS_LOGE("Failed to get request wps mode");
1412                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1413                         goto failed;
1414                 }
1415
1416                 ret = WIFI_DIRECT_ERROR_NONE;
1417                 return_parameters = g_variant_new("(ii)", ret, wps_mode);
1418                 goto done;
1419
1420         } else if (!g_strcmp0(method_name, "SetReqWpsMode")) {
1421                 int type = 0;
1422
1423                 g_variant_get(parameters, "(i)", &type);
1424                 ret = wfd_manager_set_req_wps_mode(type);
1425                 if (ret < 0) {
1426                         WDS_LOGE("Failed to set request wps mode");
1427                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1428                         goto failed;
1429                 }
1430
1431                 ret = WIFI_DIRECT_ERROR_NONE;
1432                 return_parameters = g_variant_new("(i)", ret);
1433                 goto done;
1434
1435         } else if (!g_strcmp0(method_name, "GetLocalWpsMode")) {
1436                 int wps_mode = 0;
1437
1438                 ret = wfd_local_get_wps_mode(&wps_mode);
1439                 if (ret < 0) {
1440                         WDS_LOGE("Failed to get request wps mode");
1441                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1442                         goto failed;
1443                 }
1444
1445                 ret = WIFI_DIRECT_ERROR_NONE;
1446                 return_parameters = g_variant_new("(ii)", ret, wps_mode);
1447                 goto done;
1448
1449         } else if (!g_strcmp0(method_name, "GetIPAddress")) {
1450                 char ip_addr_str[IPSTR_LEN+1] = {0, };
1451
1452                 if (manager->state < WIFI_DIRECT_STATE_CONNECTED) {
1453                         WDS_LOGE("Device is not connected yet");
1454                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1455                         goto failed;
1456                 }
1457
1458                 ret = wfd_local_get_ip_addr((char *)ip_addr_str);
1459                 if (ret < 0) {
1460                         WDS_LOGE("Failed to get local IP address");
1461                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1462                         goto failed;
1463                 }
1464
1465                 return_parameters = g_variant_new("(is)", ret, ip_addr_str);
1466                 WDS_LOGI("IP addr : [%s]", ip_addr_str);
1467                 goto done;
1468
1469         } else if (!g_strcmp0(method_name, "GetMacAddress")) {
1470                 char device_mac[MACSTR_LEN+1] = {0, };
1471
1472                 ret = wfd_local_get_dev_mac(device_mac);
1473                 if (ret < 0) {
1474                         WDS_LOGE("Failed to get device mac");
1475                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1476                         goto failed;
1477                 }
1478
1479                 ret = WIFI_DIRECT_ERROR_NONE;
1480                 return_parameters = g_variant_new("(is)", ret, device_mac);
1481                 goto done;
1482
1483         } else if (!g_strcmp0(method_name, "GetGoIntent")) {
1484                 int go_intent = 0;
1485
1486                 ret = wfd_manager_get_go_intent(&go_intent);
1487                 if (ret < 0) {
1488                         WDS_LOGE("Failed to get GO intent");
1489                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1490                         goto failed;
1491                 }
1492
1493                 ret = WIFI_DIRECT_ERROR_NONE;
1494                 return_parameters = g_variant_new("(ii)", ret, go_intent);
1495                 goto done;
1496
1497         } else if (!g_strcmp0(method_name, "SetGoIntent")) {
1498                 int go_intent = 0;
1499
1500                 g_variant_get(parameters, "(i)", &go_intent);
1501                 ret = wfd_manager_set_go_intent(go_intent);
1502                 if (ret < 0) {
1503                         WDS_LOGE("Failed to set GO intent");
1504                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1505                         goto failed;
1506                 }
1507
1508                 ret = WIFI_DIRECT_ERROR_NONE;
1509                 return_parameters = g_variant_new("(i)", ret);
1510                 goto done;
1511
1512         } else if (!g_strcmp0(method_name, "GetMaxClient")) {
1513                 int max_client = 0;
1514
1515                 ret = wfd_manager_get_max_station(&max_client);
1516                 if (ret < 0) {
1517                         WDS_LOGE("Failed to get max station");
1518                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1519                         goto failed;
1520                 }
1521
1522                 ret = WIFI_DIRECT_ERROR_NONE;
1523                 return_parameters = g_variant_new("(ii)", ret, max_client);
1524                 goto done;
1525
1526         } else if (!g_strcmp0(method_name, "SetMaxClient")) {
1527                 int max_client = 0;
1528                 g_variant_get(parameters, "(i)", &max_client);
1529
1530                 ret = wfd_manager_set_max_station(max_client);
1531                 if (ret < 0) {
1532                         WDS_LOGE("Failed to set max station");
1533                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1534                         goto failed;
1535                 }
1536
1537                 ret = WIFI_DIRECT_ERROR_NONE;
1538                 return_parameters = g_variant_new("(i)", ret);
1539                 goto done;
1540
1541         } else if (!g_strcmp0(method_name, "SetAutoConnectionMode")) {
1542                 gboolean mode = FALSE;
1543
1544                 g_variant_get(parameters, "(b)", &mode);
1545                 ret = wfd_manager_set_autoconnection(mode);
1546                 if (ret < 0) {
1547                         WDS_LOGE("Failed to set autoconnection");
1548                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1549                         goto failed;
1550                 }
1551
1552                 ret = WIFI_DIRECT_ERROR_NONE;
1553                 return_parameters = g_variant_new("(i)", ret);
1554                 goto done;
1555
1556         } else if (!g_strcmp0(method_name, "IsAutoConnectionMode")) {
1557                 int mode = 0;
1558
1559                 ret = wfd_manager_get_autoconnection(&mode);
1560                 if (ret < 0) {
1561                         WDS_LOGE("Failed to get autoconnection");
1562                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1563                         goto failed;
1564                 }
1565
1566                 ret = WIFI_DIRECT_ERROR_NONE;
1567                 return_parameters = g_variant_new("(ib)", ret, mode);
1568                 goto done;
1569
1570         } else if (!g_strcmp0(method_name, "GetOperatingChannel")) {
1571                 int channel = 0;
1572
1573                 wfd_group_s *group = manager->group;
1574                 if (!group) {
1575                         WDS_LOGE("Group not exist");
1576                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1577                         goto failed;
1578                 }
1579
1580                 channel = wfd_util_freq_to_channel(group->freq);
1581                 if (channel < 0) {
1582                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1583                         goto failed;
1584                 }
1585
1586                 ret = WIFI_DIRECT_ERROR_NONE;
1587                 return_parameters = g_variant_new("(ii)", ret, channel);
1588                 goto done;
1589
1590         } else if (!g_strcmp0(method_name, "SetAutoConnectionPeer")) {
1591                 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1592                 goto failed;
1593
1594         } else if (!g_strcmp0(method_name, "GetInterfaceName")) {
1595                 wfd_group_s *group = (wfd_group_s *)manager->group;
1596                 if (!group) {
1597                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1598                         goto failed;
1599                 }
1600                 ret = WIFI_DIRECT_ERROR_NONE;
1601                 return_parameters = g_variant_new("(is)", ret, group->ifname);
1602                 goto done;
1603
1604         } else if (!g_strcmp0(method_name, "GetSubnetMask")) {
1605                         char *get_str = NULL;
1606                         char subnet_mask[IPSTR_LEN+1] = {0, };
1607
1608                         get_str = vconf_get_str(VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK);
1609                         if (!get_str) {
1610                                 WDS_LOGE("Get Subnet Mask failed");
1611                                 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1612                                 goto failed;
1613                         }
1614                         WDS_LOGD("VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK(%s) : %s", VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK,
1615                                 get_str);
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);
1619                         free(get_str);
1620                         goto done;
1621
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);
1626                         if (!get_str) {
1627                                 WDS_LOGE("Get Gateway failed");
1628                                 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1629                                 goto failed;
1630                         }
1631                         WDS_LOGD("VCONFKEY_WIFI_DIRECT_P2P_GATEWAY_ADDR(%s) : %s", VCONFKEY_WIFI_DIRECT_P2P_GATEWAY,
1632                                 get_str);
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);
1636                         free(get_str);
1637                         goto done;
1638
1639         } else if (!g_strcmp0(method_name, "GetSessionTimer")) {
1640
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);
1646                 goto done;
1647
1648         } else if (!g_strcmp0(method_name, "SetSessionTimer")) {
1649
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);
1656                 goto done;
1657
1658         } else if (!g_strcmp0(method_name, "SetAutoGroupRemoval")) {
1659                 gboolean enable;
1660
1661                 g_variant_get(parameters, "(b)", &enable);
1662                 WDS_LOGE("Activate Auto Group Removal Mode : [%s]",
1663                                 enable ? "True" : "False");
1664
1665                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1666                         WDS_LOGE("Wi-Fi Direct is not activated.");
1667                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1668                         goto failed;
1669                 }
1670
1671                 if (enable) {
1672                         manager->auto_group_remove_enable = TRUE;
1673
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);
1679                                 goto done;
1680                         }
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);
1687                           }
1688
1689                 } else
1690                         manager->auto_group_remove_enable = FALSE;
1691
1692
1693                 ret = WIFI_DIRECT_ERROR_NONE;
1694                 return_parameters = g_variant_new("(i)", ret);
1695                 goto done;
1696
1697         } else if (!g_strcmp0(method_name, "GetPrimaryDevType")) {
1698
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);
1704                 goto done;
1705
1706         } else if (!g_strcmp0(method_name, "GetSecondaryDevType")) {
1707
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);
1713                 goto done;
1714
1715         }  else {
1716                 WDS_LOGE("method not handled");
1717                 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1718                 goto failed;
1719         }
1720
1721 done:
1722         WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1723         return;
1724
1725 failed:
1726         wfd_error_set_gerror(ret, &err);
1727         g_dbus_method_invocation_return_gerror(invocation, err);
1728         g_clear_error(&err);
1729         return;
1730 }
1731
1732 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1733 static void __wfd_manager_service_iface_handler(const gchar *method_name,
1734                                                GVariant    *parameters,
1735                                                GDBusMethodInvocation *invocation)
1736 {
1737         int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1738         wfd_manager_s *manager = wfd_get_manager();
1739         GVariant *return_parameters = NULL;
1740         GError *err = NULL;
1741         WDS_LOGD("%s", method_name);
1742
1743         if (!g_strcmp0(method_name, "StartDiscovery")) {
1744                 const char *mac_address = NULL;
1745                 int service_type;
1746                 unsigned char mac_addr[MACADDR_LEN] = {0, };
1747
1748                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1749                         WDS_LOGE("Wi-Fi Direct is not activated.");
1750                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1751                         goto failed;
1752                 }
1753
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);
1757
1758                 ret = wfd_oem_start_service_discovery(manager->oem_ops,
1759                                 mac_addr, service_type);
1760                 if (ret < 0) {
1761                         WDS_LOGE("Failed to start service discovery");
1762                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1763                         goto failed;
1764                 }
1765
1766                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
1767
1768                 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1769                                 "DiscoveryStarted", NULL);
1770                 return;
1771
1772         } else if (!g_strcmp0(method_name, "StopDiscovery")) {
1773                 const char *mac_address = NULL;
1774                 int service_type;
1775                 unsigned char mac_addr[MACADDR_LEN] = {0, };
1776
1777                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1778                         WDS_LOGE("Wi-Fi Direct is not activated.");
1779                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1780                         goto failed;
1781                 }
1782
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);
1786
1787                 ret = wfd_oem_cancel_service_discovery(manager->oem_ops,
1788                                 mac_addr, service_type);
1789                 if (ret < 0) {
1790                         WDS_LOGE("Failed to cancel service discovery");
1791                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1792                         goto failed;
1793                 }
1794                 ret = WIFI_DIRECT_ERROR_NONE;
1795                 return_parameters = g_variant_new("(i)", ret);
1796                 goto done;
1797
1798         } else if (!g_strcmp0(method_name, "Register")) {
1799                 int service_type;
1800                 int service_id = 0;
1801                 const char *info_str = NULL;
1802
1803                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1804                         WDS_LOGE("Wi-Fi Direct is not activated.");
1805                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1806                         goto failed;
1807                 }
1808
1809                 g_variant_get(parameters, "(i&s)", &service_type, &info_str);
1810                 WDS_LOGD("Register service [%d: %s]", service_type, info_str);
1811
1812                 ret = wfd_service_add(service_type, (char *)info_str, &service_id);
1813                 if (ret < 0) {
1814                         WDS_LOGE("Failed to add service");
1815                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1816                         goto failed;
1817                 }
1818
1819                 ret = WIFI_DIRECT_ERROR_NONE;
1820                 return_parameters = g_variant_new("(ii)", ret, service_id);
1821                 goto done;
1822
1823         } else if (!g_strcmp0(method_name, "Deregister")) {
1824                 int service_id = 0;
1825
1826                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1827                         WDS_LOGE("Wi-Fi Direct is not activated.");
1828                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1829                         goto failed;
1830                 }
1831
1832                 g_variant_get(parameters, "(i)", &service_id);
1833                 WDS_LOGD("Service id [%d]", service_id);
1834
1835                 ret = wfd_service_del(service_id);
1836                 if (ret < 0) {
1837                         WDS_LOGE("Failed to delete service");
1838                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1839                         goto failed;
1840                 }
1841
1842                 ret = WIFI_DIRECT_ERROR_NONE;
1843                 return_parameters = g_variant_new("(i)", ret);
1844                 goto done;
1845
1846         } else {
1847                 WDS_LOGD("method not handled");
1848                 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1849                 goto failed;
1850         }
1851
1852 done:
1853         WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1854         return;
1855
1856 failed:
1857         wfd_error_set_gerror(ret, &err);
1858         g_dbus_method_invocation_return_gerror(invocation, err);
1859         g_clear_error(&err);
1860         return;
1861 }
1862 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1863
1864 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1865 static void __wfd_manager_display_iface_handler(const gchar *method_name,
1866                                                GVariant    *parameters,
1867                                                GDBusMethodInvocation *invocation)
1868 {
1869         int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1870         wfd_manager_s *manager = wfd_get_manager();
1871         GVariant *return_parameters = NULL;
1872         GError *err = NULL;
1873         WDS_LOGD("%s", method_name);
1874
1875         if (!g_strcmp0(method_name, "Init")) {
1876                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1877                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1878                         goto failed;
1879                 }
1880
1881                 wfd_device_s * device = manager->local;
1882
1883                 ret = wfd_oem_miracast_init(manager->oem_ops, TRUE);
1884                 if (ret < 0) {
1885                         WDS_LOGE("Failed to initialize display");
1886                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1887                         goto failed;
1888                 }
1889
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;
1894
1895                 ret = WIFI_DIRECT_ERROR_NONE;
1896                 return_parameters = g_variant_new("(i)", ret);
1897                 goto done;
1898
1899         } else if (!g_strcmp0(method_name, "Deinit")) {
1900                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1901                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1902                         goto failed;
1903                 }
1904
1905                 wfd_device_s * device = manager->local;
1906
1907                 ret = wfd_oem_miracast_init(manager->oem_ops, FALSE);
1908                 if (ret < 0) {
1909                         WDS_LOGE("Failed to deinitialize display");
1910                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1911                         goto failed;
1912                 }
1913
1914                 memset(&(device->display), 0x0, sizeof(wfd_display_type_e));
1915
1916                 ret = WIFI_DIRECT_ERROR_NONE;
1917                 return_parameters = g_variant_new("(i)", ret);
1918                 goto done;
1919
1920         } else if (!g_strcmp0(method_name, "SetConfig")) {
1921                 int type, port, hdcp;
1922                 g_variant_get(parameters, "(iii)", &type, &port, &hdcp);
1923
1924                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1925                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1926                         goto failed;
1927                 }
1928
1929                 WDS_LOGD("type %d port %d hdcp %d", type, port, hdcp);
1930
1931                 ret = wfd_manager_set_display_device(type, port, hdcp);
1932                 if (ret < 0) {
1933                         WDS_LOGE("Failed to set display device settings");
1934                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1935                         goto failed;
1936                 }
1937
1938                 ret = WIFI_DIRECT_ERROR_NONE;
1939                 return_parameters = g_variant_new("(i)", ret);
1940                 goto done;
1941
1942         } else if (!g_strcmp0(method_name, "SetAvailiability")) {
1943                 int availability;
1944                 g_variant_get(parameters, "(i)", &availability);
1945
1946                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1947                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1948                         goto failed;
1949                 }
1950
1951                 ret = wfd_manager_set_session_availability(availability);
1952                 if (ret < 0) {
1953                         WDS_LOGE("Failed to set session availability");
1954                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1955                         goto failed;
1956                 }
1957
1958                 ret = WIFI_DIRECT_ERROR_NONE;
1959                 return_parameters = g_variant_new("(i)", ret);
1960                 goto done;
1961
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, };
1966
1967                 g_variant_get(parameters, "(&s)", &mac_address);
1968                 macaddr_atoe(mac_address, mac_addr);
1969
1970                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1971                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1972                         goto failed;
1973                 }
1974
1975                 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
1976                 if (!peer) {
1977                         WDS_LOGE("Failed to get peer");
1978                         ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1979                         goto failed;
1980                 }
1981
1982                 ret = WIFI_DIRECT_ERROR_NONE;
1983                 return_parameters = g_variant_new("(ii)", ret, peer->display.type);
1984                 goto done;
1985
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, };
1990
1991                 g_variant_get(parameters, "(&s)", &mac_address);
1992                 macaddr_atoe(mac_address, mac_addr);
1993
1994                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1995                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1996                         goto failed;
1997                 }
1998
1999                 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2000                 if (!peer) {
2001                         WDS_LOGE("Failed to get peer");
2002                         ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2003                         goto failed;
2004                 }
2005
2006                 ret = WIFI_DIRECT_ERROR_NONE;
2007                 return_parameters = g_variant_new("(ii)", ret, peer->display.availability);
2008                 goto done;
2009
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, };
2014
2015                 g_variant_get(parameters, "(&s)", &mac_address);
2016                 macaddr_atoe(mac_address, mac_addr);
2017
2018                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2019                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2020                         goto failed;
2021                 }
2022
2023                 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2024                 if (!peer) {
2025                         WDS_LOGE("Failed to get peer");
2026                         ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2027                         goto failed;
2028                 }
2029
2030                 ret = WIFI_DIRECT_ERROR_NONE;
2031                 return_parameters = g_variant_new("(ii)", ret, peer->display.hdcp_support);
2032                 goto done;
2033
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, };
2038
2039                 g_variant_get(parameters, "(&s)", &mac_address);
2040                 macaddr_atoe(mac_address, mac_addr);
2041
2042                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2043                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2044                         goto failed;
2045                 }
2046
2047                 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2048                 if (!peer) {
2049                         WDS_LOGE("Failed to get peer");
2050                         ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2051                         goto failed;
2052                 }
2053
2054                 ret = WIFI_DIRECT_ERROR_NONE;
2055                 return_parameters = g_variant_new("(ii)", ret, peer->display.port);
2056                 goto done;
2057
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, };
2062
2063                 g_variant_get(parameters, "(&s)", &mac_address);
2064                 macaddr_atoe(mac_address, mac_addr);
2065
2066                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2067                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2068                         goto failed;
2069                 }
2070
2071                 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2072                 if (!peer) {
2073                         WDS_LOGE("Failed to get peer");
2074                         ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2075                         goto failed;
2076                 }
2077
2078                 ret = WIFI_DIRECT_ERROR_NONE;
2079                 return_parameters = g_variant_new("(ii)", ret, peer->display.max_tput);
2080                 goto done;
2081
2082         } else {
2083                 WDS_LOGD("method not handled");
2084                 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2085                 goto failed;
2086         }
2087
2088 done:
2089         WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
2090         return;
2091
2092 failed:
2093         wfd_error_set_gerror(ret, &err);
2094         g_dbus_method_invocation_return_gerror(invocation, err);
2095         g_clear_error(&err);
2096         return;
2097 }
2098 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
2099 #if defined(TIZEN_FEATURE_ASP)
2100
2101 static void __g_variant_to_txt_record(GVariant *variant, char **txt_record)
2102 {
2103         GVariantIter *iter = NULL;
2104         gchar *key = NULL;
2105         GVariant *value = NULL;
2106         char *buff = NULL;
2107         const char *str = NULL;
2108         char *pos = NULL;
2109         int txt_length = 0;
2110         int key_length = 0;
2111         gsize value_length = 0;
2112         __WDS_LOG_FUNC_ENTER__;
2113
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;
2121                 txt_length += 2;
2122         }
2123
2124         g_variant_iter_free(iter);
2125         if (txt_length == 0) {
2126                 __WDS_LOG_FUNC_EXIT__;
2127                 return;
2128         }
2129
2130         buff = g_try_malloc0(txt_length);
2131         if (buff == NULL) {
2132                 WDS_LOGE("g_try_malloc0 failed");
2133                 __WDS_LOG_FUNC_EXIT__;
2134                 return;
2135         }
2136         pos = buff;
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);
2141
2142                 g_strlcpy(pos, key, key_length + 1);
2143                 pos += key_length;
2144                 pos[0] = '=';
2145                 pos++;
2146
2147                 g_strlcpy(pos, str, value_length + 1);
2148                 pos += (int)value_length;
2149                 pos[0] = ',';
2150                 pos++;
2151         }
2152         buff[txt_length -1] = '\0';
2153
2154         g_variant_iter_free(iter);
2155         *txt_record = buff;
2156
2157         __WDS_LOG_FUNC_EXIT__;
2158         return;
2159 }
2160
2161 static void __g_variant_to_seek_info(GVariant *variant, char **seek_info)
2162 {
2163         GVariantIter *iter = NULL;
2164         gchar *key = NULL;
2165         char *buff = NULL;
2166         char *pos = NULL;
2167         int seek_length = 0;
2168         int key_length = 0;
2169
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);
2174                 seek_length += 1;
2175         }
2176
2177         g_variant_iter_free(iter);
2178         if (seek_length == 0)
2179                 return;
2180
2181         buff = g_try_malloc0(seek_length);
2182         if (buff == NULL) {
2183                 WDS_LOGE("g_try_malloc0 failed");
2184                 return;
2185         }
2186         pos = buff;
2187         g_variant_get(variant, "as", &iter);
2188         while (g_variant_iter_loop(iter, "s", &key)) {
2189                 key_length = strlen(key);
2190
2191                 g_strlcpy(pos, key, key_length + 1);
2192                 pos += key_length;
2193                 pos[0] = ',';
2194                 pos++;
2195         }
2196         buff[seek_length -1] = '\0';
2197
2198         g_variant_iter_free(iter);
2199         *seek_info = buff;
2200
2201         return;
2202 }
2203
2204 static void __wfd_manager_asp_iface_handler(const gchar *method_name,
2205                                                GVariant    *parameters,
2206                                                GDBusMethodInvocation *invocation)
2207 {
2208         int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2209         wfd_manager_s *manager = wfd_get_manager();
2210         GVariant *return_parameters = NULL;
2211         GError *err = NULL;
2212         WDS_LOGD("%s", method_name);
2213
2214         if (!g_strcmp0(method_name, "AdvertiseService")) {
2215
2216                 wfd_oem_asp_service_s service;
2217                 GVariantIter *iter = NULL;
2218                 gchar *key = NULL;
2219                 GVariant *var = NULL;
2220                 int replace = 0;
2221
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;
2227                         goto failed;
2228                 }
2229
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));
2257                         else
2258                                 ;/* Do Nothing */
2259                 }
2260
2261                 ret = wfd_oem_advertise_service(manager->oem_ops, &service, replace);
2262                 if (ret < 0) {
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;
2267                         goto failed;
2268                 }
2269                 g_free(service.service_info);
2270                 g_variant_iter_free(iter);
2271
2272                 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
2273                         WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
2274                         goto done;
2275                 }
2276
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,
2280                                                          "ListenStarted",
2281                                                          NULL);
2282                 } else {
2283                         wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
2284                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2285                         goto failed;
2286                 }
2287
2288                 ret = WIFI_DIRECT_ERROR_NONE;
2289                 return_parameters = g_variant_new("(i)", ret);
2290                 goto done;
2291
2292         } else if (!g_strcmp0(method_name, "CancelAdvertiseService")) {
2293
2294                 wfd_oem_asp_service_s service;
2295                 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2296
2297                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2298                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2299                         goto failed;
2300                 }
2301
2302                 g_variant_get(parameters, "(u)", &(service.adv_id));
2303                 ret = wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
2304                 if (ret < 0) {
2305                         WDS_LOGE("Failed to del service");
2306                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2307                         goto failed;
2308                 }
2309
2310                 ret = WIFI_DIRECT_ERROR_NONE;
2311                 return_parameters = g_variant_new("(i)", ret);
2312                 goto done;
2313
2314         } else if (!g_strcmp0(method_name, "SeekService")) {
2315
2316                 wfd_oem_asp_service_s service;
2317                 GVariantIter *iter = NULL;
2318                 gchar *key = NULL;
2319                 GVariant *var = NULL;
2320
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;
2326                         goto failed;
2327                 }
2328
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));
2342                         else
2343                                 ;/* Do Nothing */
2344                 }
2345
2346                 ret = wfd_oem_seek_service(manager->oem_ops, &service);
2347                 if (ret < 0) {
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;
2352                         goto failed;
2353                 }
2354                 g_free(service.service_info);
2355                 g_variant_iter_free(iter);
2356
2357                 WDS_LOGD("search_id [%x]", service.search_id);
2358
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,
2362                                                          "DiscoveryStarted",
2363                                                          NULL);
2364                 } else {
2365                         wfd_oem_cancel_seek_service(manager->oem_ops, &service);
2366                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2367                         goto failed;
2368                 }
2369
2370                 ret = WIFI_DIRECT_ERROR_NONE;
2371                 return_parameters = g_variant_new("(i)", ret);
2372                 goto done;
2373
2374         } else if (!g_strcmp0(method_name, "CancelSeekService")) {
2375
2376                 wfd_oem_asp_service_s service;
2377                 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2378
2379                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2380                         WDS_LOGE("Wi-Fi Direct is not activated.");
2381                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2382                         goto failed;
2383                 }
2384
2385                 g_variant_get(parameters, "(t)", &(service.asp_search_id));
2386                 ret = wfd_oem_cancel_seek_service(manager->oem_ops, &service);
2387                 if (ret < 0) {
2388                         WDS_LOGE("Failed to cancel seek service");
2389                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2390                         goto failed;
2391                 }
2392
2393                 ret = WIFI_DIRECT_ERROR_NONE;
2394                 return_parameters = g_variant_new("(i)", ret);
2395                 goto done;
2396         } else if (!g_strcmp0(method_name, "ConnectSession")) {
2397
2398                 GVariantIter *iter = NULL;
2399                 gchar *key = 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;
2405                 int status = 0;
2406
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;
2411                         goto failed;
2412                 }
2413
2414                 memset(&prov_params, 0, sizeof(wfd_oem_asp_prov_s));
2415
2416                 g_variant_get(parameters, "(a{sv})", &iter);
2417                 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2418
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);
2424                                         goto failed;
2425                                 }
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);
2434                                         goto failed;
2435                                 }
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));
2447                         } else {
2448                                 ;/* Do Nothing */
2449                         }
2450                 }
2451
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);
2456                         goto failed;
2457                 }
2458
2459                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2460
2461                 wfd_asp_connect_status(prov_params.session_mac,
2462                                 prov_params.session_id,
2463                                 ASP_CONNECT_STATUS_REQUEST_SENT,
2464                                 NULL);
2465
2466                 wfd_group_s *group = (wfd_group_s*) manager->group;
2467                 if (group && group->member_count >= manager->max_station) {
2468
2469                         status = ASP_CONNECT_STATUS_NOMORE_CONNECT;
2470                         wfd_asp_connect_status(prov_params.session_mac,
2471                                         prov_params.session_id,
2472                                         status,
2473                                         NULL);
2474                         g_variant_iter_free(iter);
2475                         __WDS_LOG_FUNC_EXIT__;
2476                         return;
2477                 }
2478
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,
2484                                                      "Connection",
2485                                                      g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
2486                                                                             WFD_EVENT_CONNECTION_IN_PROGRESS,
2487                                                                             peer_mac_address));
2488                 } else {
2489                         wfd_asp_connect_status(prov_params.session_mac,
2490                                         prov_params.session_id,
2491                                         ASP_CONNECT_STATUS_REQUEST_FAILED,
2492                                         NULL);
2493                 }
2494                 g_variant_iter_free(iter);
2495                 __WDS_LOG_FUNC_EXIT__;
2496                 return;
2497
2498         } else if (!g_strcmp0(method_name, "ConfirmSession")) {
2499
2500                 GVariantIter *iter = NULL;
2501                 gchar *key = NULL;
2502                 GVariant *var = NULL;
2503                 wfd_oem_asp_prov_s prov_params;
2504                 const char *mac_str = NULL;
2505                 const char *pin = NULL;
2506                 int confirmed = 0;
2507
2508                 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
2509                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2510                         goto failed;
2511                 }
2512
2513                 memset(&prov_params, 0, sizeof(wfd_oem_asp_prov_s));
2514
2515                 g_variant_get(parameters, "(a{sv})", &iter);
2516                 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2517
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);
2523                                         goto failed;
2524                                 }
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);
2533                         } else {
2534                                 ;/* Do Nothing */
2535                         }
2536                 }
2537
2538                 if (ISZEROMACADDR(prov_params.session_mac))     {
2539                         ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2540                         g_variant_iter_free(iter);
2541                         goto failed;
2542                 }
2543
2544                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2545
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,
2551                                                      "Connection",
2552                                                      g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
2553                                                                             WFD_EVENT_CONNECTION_IN_PROGRESS,
2554                                                                             peer_mac_address));
2555                         wfd_asp_connect_status(prov_params.session_mac,
2556                                         prov_params.session_id,
2557                                         ASP_CONNECT_STATUS_REQUEST_ACCEPTED,
2558                                         NULL);
2559                 } else {
2560                         wfd_asp_connect_status(prov_params.session_mac,
2561                                         prov_params.session_id,
2562                                         ASP_CONNECT_STATUS_REQUEST_FAILED,
2563                                         NULL);
2564                 }
2565                 g_variant_iter_free(iter);
2566                 __WDS_LOG_FUNC_EXIT__;
2567                 return;
2568         }
2569
2570 done:
2571         WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
2572         __WDS_LOG_FUNC_EXIT__;
2573         return;
2574
2575 failed:
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__;
2580         return;
2581 }
2582 #endif
2583
2584 static struct {
2585         guint reg_id;
2586         const gchar *iface_name;
2587         void (*function) (const gchar *method_name,
2588                         GVariant    *parameters,
2589                         GDBusMethodInvocation *invocation);
2590 } wfd_manager_iface_map[] = {
2591         {
2592                 0,
2593                 WFD_MANAGER_MANAGE_INTERFACE,
2594                 __wfd_manager_manage_iface_handler
2595         },
2596         {
2597                 0,
2598                 WFD_MANAGER_GROUP_INTERFACE,
2599                 __wfd_manager_group_iface_handler
2600         },
2601         {
2602                 0,
2603                 WFD_MANAGER_CONFIG_INTERFACE,
2604                 __wfd_manager_config_iface_handler
2605         },
2606 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
2607         {
2608                 0,
2609                 WFD_MANAGER_SERVICE_INTERFACE,
2610                 __wfd_manager_service_iface_handler
2611         },
2612 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
2613 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
2614         {
2615                 0,
2616                 WFD_MANAGER_DISPLAY_INTERFACE,
2617                 __wfd_manager_display_iface_handler
2618         },
2619 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
2620 #if defined(TIZEN_FEATURE_ASP)
2621         {
2622                 0,
2623                 WFD_MANAGER_ASP_INTERFACE,
2624                 __wfd_manager_asp_iface_handler
2625         },
2626 #endif
2627         {
2628                 0,
2629                 NULL,
2630                 NULL
2631         }
2632 };
2633
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,
2642                                              gpointer               user_data)
2643 {
2644         int count = 0;
2645
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 */
2650
2651         /* Method Call */
2652         WDS_LOGD("interface : [%s], method : [%s]", interface_name, method_name);
2653         DBUS_DEBUG_VARIANT(parameters);
2654
2655         while (wfd_manager_iface_map[count].iface_name != NULL) {
2656                 if (!g_strcmp0(interface_name, wfd_manager_iface_map[count].iface_name)) {
2657
2658                         wfd_manager_iface_map[count].function(method_name,
2659                                                               parameters,
2660                                                               invocation);
2661                         break;
2662                 }
2663                 count++;
2664         }
2665 }
2666
2667 static const GDBusInterfaceVTable wfd_manager_interface_vtable = {
2668                 wfd_manager_method_call_handler, NULL, NULL};
2669
2670 void wfd_manager_dbus_unregister(void)
2671 {
2672         int count = 0;
2673
2674         wfd_error_deregister();
2675
2676         while (wfd_manager_iface_map[count].iface_name != NULL) {
2677                 wfd_manager_dbus_iface_unregister(wfd_manager_iface_map[count].reg_id);
2678                 count++;
2679         }
2680 }
2681
2682 gboolean wfd_manager_dbus_register(void)
2683 {
2684         GDBusNodeInfo *node_info = NULL;
2685         GError *Error = NULL;
2686         int count = 0;
2687
2688         wfd_error_register();
2689
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);
2694                 return FALSE;
2695         }
2696
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,
2700                                                         WFD_MANAGER_PATH,
2701                                                         node_info,
2702                                                         &wfd_manager_interface_vtable);
2703
2704                 WDS_LOGD("Registered Interface [%d, %s]",
2705                                         wfd_manager_iface_map[count].reg_id,
2706                                         wfd_manager_iface_map[count].iface_name);
2707
2708                 count++;
2709         }
2710
2711         g_dbus_node_info_unref(node_info);
2712         return TRUE;
2713 }