0112d7c9d086cc61f10a0d31934f66c0562654b6
[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                                 "<arg type='t' name='search_id' direction='out'/>"
422                         "</method>"
423                         "<method name='CancelSeekService'>"
424                                 "<arg type='t' name='search_id' direction='in'/>"
425                                 "<arg type='i' name='result' direction='out'/>"
426                         "</method>"
427                 "<method name='ConnectSession'>"
428                         "<arg type='a{sv}' name='parameters' direction='in'/>"
429                         "<arg type='i' name='result' direction='out'/>"
430                 "</method>"
431                 "<method name='ConfirmSession'>"
432                         "<arg type='a{sv}' name='parameters' direction='in'/>"
433                         "<arg type='i' name='result' direction='out'/>"
434                 "</method>"
435                         "<signal name='SearchResult'>"
436                                 "<arg type='a{sv}' name='parameters'/>"
437                         "</signal>"
438                 "<signal name='SessionRequest'>"
439                         "<arg type='a{sv}' name='parameters'/>"
440                 "</signal>"
441                 "<signal name='SessionConfigRequest'>"
442                         "<arg type='a{sv}' name='parameters'/>"
443                 "</signal>"
444                 "<signal name='ConnectStatus'>"
445                         "<arg type='a{sv}' name='parameters'/>"
446                 "</signal>"
447                 "<signal name='SessionStatus'>"
448                         "<arg type='a{sv}' name='parameters'/>"
449                 "</signal>"
450                 "<signal name='SessionPeerIPAssigned'>"
451                 "<arg type='a{sv}' name='parameters'/>"
452                 "</signal>"
453                 "</interface>"
454 #endif
455         "</node>"
456 };
457
458
459 static void __wfd_manager_manage_iface_handler(const gchar *method_name,
460                                               GVariant    *parameters,
461                                               GDBusMethodInvocation *invocation)
462 {
463         int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
464         wfd_manager_s *manager = wfd_get_manager();
465         GVariant *return_parameters = NULL;
466         GError *err = NULL;
467         gchar* dbus_error_name = NULL;
468         WDS_LOGD("%s", method_name);
469
470         if (!g_strcmp0(method_name, "Activate")) {
471
472                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
473
474                 ret = wfd_manager_activate(manager);
475                 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
476                                              "Activation",
477                                              g_variant_new("(i)", ret));
478                 return;
479 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
480         } else if (!g_strcmp0(method_name, "AddClient")) {
481                 return_parameters = g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE);
482                 goto done;
483 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
484         } else if (!g_strcmp0(method_name, "Deactivate")) {
485
486                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
487                         WDS_LOGE("Already deactivated");
488                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
489                         goto failed;
490                 }
491
492                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
493
494                 ret = wfd_manager_deactivate(manager);
495                 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
496                                              "Deactivation",
497                                              g_variant_new("(i)", ret));
498                 return;
499
500         } else if (!g_strcmp0(method_name, "StartDiscovery")) {
501                 gboolean mode = FALSE;
502                 gint32 timeout = 0;
503                 guint32 channel = 0;
504                 const gchar *type = NULL;
505                 GVariantIter *iter = NULL;
506                 gchar *key = NULL;
507                 GVariant *var = NULL;
508
509                 g_variant_get(parameters, "(a{sv})", &iter);
510                 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
511                         if (!g_strcmp0(key, "Mode"))
512                                 g_variant_get(var, "b", &mode);
513                         else if (!g_strcmp0(key, "Timeout"))
514                                 g_variant_get(var, "i", &timeout);
515                         else if (!g_strcmp0(key, "Type"))
516                                 g_variant_get(var, "&s", &type);
517                         else if (!g_strcmp0(key, "Channel"))
518                                 g_variant_get(var, "i", &channel);
519                         else
520                                 ;/* Do Nothing */
521                 }
522                 g_variant_iter_free(iter);
523
524                 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
525                                 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
526                                 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
527                         WDS_LOGE("Wi-Fi Direct is not available status for scanning.");
528                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
529                         goto failed;
530                 }
531
532                 if (mode && (manager->local->dev_role == WFD_DEV_ROLE_GO)) {
533                         WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
534                         ret = WIFI_DIRECT_ERROR_NONE;
535                         return_parameters = g_variant_new("(i)", ret);
536                         goto done;
537                 }
538
539                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
540
541                 ret = wfd_manager_start_discovery(manager, mode, timeout, type, channel);
542                 if (ret == WIFI_DIRECT_ERROR_NONE) {
543                         if (mode == WFD_OEM_SCAN_MODE_PASSIVE) {
544                                 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
545                                                              "ListenStarted",
546                                                              NULL);
547                         } else {
548                                 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
549                                                              "DiscoveryStarted",
550                                                              NULL);
551                         }
552                 }
553                 return;
554
555         } else if (!g_strcmp0(method_name, "StopDiscovery")) {
556                 int mode =  manager->scan_mode;
557                 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
558                                 manager->state != WIFI_DIRECT_STATE_DISCOVERING) {
559                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
560                         goto failed;
561                 }
562
563                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
564
565                 ret = wfd_manager_cancel_discovery(manager);
566                 if (ret == WIFI_DIRECT_ERROR_NONE && mode == WFD_SCAN_MODE_PASSIVE)
567                         wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
568                                                      "DiscoveryFinished", NULL);
569                 return;
570
571         } else if (!g_strcmp0(method_name, "GetDiscoveredPeers")) {
572                 wfd_discovery_entry_s *peers = NULL;
573                 GVariantBuilder *builder_peers = NULL;
574                 int peer_cnt = 0;
575                 int i = 0;
576
577                 builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
578
579                 peer_cnt = wfd_manager_get_peers(manager, &peers);
580                 WDS_LOGD("Peer count [%d], Peer list [%p]", peer_cnt, peers);
581                 if (peer_cnt < 0) {
582                         WDS_LOGE("Failed to get scan result");
583                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
584                         goto failed;
585                 }
586
587                 if (peer_cnt > 255)
588                         peer_cnt = 255;
589
590                 for (i = 0; i < peer_cnt; i++) {
591                         GVariantBuilder builder_peer;
592                         g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
593
594                         g_variant_builder_add(&builder_peer, "{sv}",
595                                         "DeviceName",
596                                         g_variant_new_string(peers[i].device_name));
597                         g_variant_builder_add(&builder_peer, "{sv}",
598                                         "DeviceAddress",
599                                         wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
600                         g_variant_builder_add(&builder_peer, "{sv}",
601                                         "InterfaceAddress",
602                                         wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
603                         g_variant_builder_add(&builder_peer, "{sv}",
604                                         "Channel",
605                                         g_variant_new_uint16(peers[i].channel));
606 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
607                         g_variant_builder_add(&builder_peer, "{sv}",
608                                         "Services",
609                                         g_variant_new_uint16(peers[i].services));
610 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
611                         g_variant_builder_add(&builder_peer, "{sv}",
612                                         "IsGroupOwner",
613                                         g_variant_new_boolean(peers[i].is_group_owner));
614                         g_variant_builder_add(&builder_peer, "{sv}",
615                                         "IsPersistentGO",
616                                         g_variant_new_boolean(peers[i].is_persistent_go));
617                         g_variant_builder_add(&builder_peer, "{sv}",
618                                         "IsConnected",
619                                         g_variant_new_boolean(peers[i].is_connected));
620                         g_variant_builder_add(&builder_peer, "{sv}",
621                                         "WpsDevicePwdID",
622                                         g_variant_new_uint16(peers[i].wps_device_pwd_id));
623                         g_variant_builder_add(&builder_peer, "{sv}",
624                                         "WpsCfgMethods",
625                                         g_variant_new_uint16(peers[i].wps_cfg_methods));
626                         g_variant_builder_add(&builder_peer, "{sv}",
627                                         "Category",
628                                         g_variant_new_uint16(peers[i].category));
629                         g_variant_builder_add(&builder_peer, "{sv}",
630                                         "SubCategory",
631                                         g_variant_new_uint16(peers[i].subcategory));
632 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
633                         g_variant_builder_add(&builder_peer, "{sv}",
634                                         "IsWfdDevice",
635                                         g_variant_new_boolean(peers[i].is_wfd_device));
636 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
637
638                         WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
639                         g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
640                 }
641
642                 ret = WIFI_DIRECT_ERROR_NONE;
643                 return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
644                 g_variant_builder_unref(builder_peers);
645                 goto done;
646
647         } else if (!g_strcmp0(method_name, "Connect")) {
648                 const char *peer_mac_address = NULL;
649                 unsigned char mac_addr[MACADDR_LEN] = {0, };
650
651                 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
652                                 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
653                                 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
654                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
655                         goto failed;
656                 }
657
658                 wfd_group_s *group = (wfd_group_s*) manager->group;
659                 if (group && group->member_count >= manager->max_station) {
660                         ret = WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
661                         goto failed;
662                 }
663
664                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
665
666                 g_variant_get(parameters, "(&s)", &peer_mac_address);
667                 macaddr_atoe(peer_mac_address, mac_addr);
668
669                 ret = wfd_manager_connect(manager, mac_addr);
670                 if (ret == WIFI_DIRECT_ERROR_NONE)
671                         wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
672                                                      "Connection",
673                                                      g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
674                                                                             WFD_EVENT_CONNECTION_IN_PROGRESS,
675                                                                             peer_mac_address));
676                 return;
677
678         } else if (!g_strcmp0(method_name, "Disconnect")) {
679                 const char *peer_mac_address = NULL;
680                 unsigned char mac_addr[MACADDR_LEN] = {0, };
681
682                 if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
683                         if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
684                                 ret = wfd_oem_stop_scan(manager->oem_ops);
685                                 if (ret < 0) {
686                                         WDS_LOGE("Failed to stop scan");
687                                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
688                                         goto failed;
689                                 }
690                                 WDS_LOGI("Succeeded to stop scan");
691                                 if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
692                                         wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
693                                         wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
694                                 } else {
695                                         wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
696                                         wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
697                                 }
698                         } else {
699                                 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
700                                 goto failed;
701                         }
702                 }
703
704                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
705
706                 g_variant_get(parameters, "(&s)", &peer_mac_address);
707                 macaddr_atoe(peer_mac_address, mac_addr);
708
709                 ret = wfd_manager_disconnect(manager, mac_addr);
710                 if (ret == WIFI_DIRECT_ERROR_NONE)
711                         wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
712                                                      "Disconnection",
713                                                      g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
714                                                                             WFD_EVENT_DISCONNECTION_RSP,
715                                                                             peer_mac_address));
716                 return;
717
718         } else if (!g_strcmp0(method_name, "CancelConnection")) {
719                 const char *peer_mac_address = NULL;
720                 unsigned char mac_addr[MACADDR_LEN] = {0, };
721
722                 if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
723                         WDS_LOGE("It's not CONNECTING state");
724                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
725                         goto failed;
726                 }
727
728                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
729
730                 g_variant_get(parameters, "(&s)", &peer_mac_address);
731                 macaddr_atoe(peer_mac_address, mac_addr);
732
733                 ret = wfd_manager_cancel_connection(manager, mac_addr);
734                 if (ret == WIFI_DIRECT_ERROR_NONE)
735                         wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
736                                                      "Connection",
737                                                      g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
738                                                                             WFD_EVENT_CONNECTION_RSP,
739                                                                             peer_mac_address));
740                 return;
741
742         } else if (!g_strcmp0(method_name, "AcceptConnection")) {
743                 const char *peer_mac_address = NULL;
744                 unsigned char mac_addr[MACADDR_LEN] = {0, };
745
746                 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
747                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
748                         goto failed;
749                 }
750
751                 wfd_group_s *group = (wfd_group_s*) manager->group;
752                 if (group && group->member_count >= manager->max_station) {
753                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
754                         goto failed;
755                 }
756
757                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
758
759                 g_variant_get(parameters, "(&s)", &peer_mac_address);
760                 macaddr_atoe(peer_mac_address, mac_addr);
761
762                 ret = wfd_manager_accept_connection(manager, mac_addr);
763                 if (ret == WIFI_DIRECT_ERROR_NONE) {
764                         wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
765                                                      "Connection",
766                                                      g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
767                                                                             WFD_EVENT_CONNECTION_IN_PROGRESS,
768                                                                             peer_mac_address));
769                 } else {
770                         wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
771                                                      "Connection",
772                                                      g_variant_new("(iis)", WIFI_DIRECT_ERROR_OPERATION_FAILED,
773                                                                             WFD_EVENT_CONNECTION_RSP,
774                                                                             peer_mac_address));
775                 }
776                 return;
777
778         } else if (!g_strcmp0(method_name, "RejectConnection")) {
779                 wfd_session_s *session = manager->session;
780                 const char *peer_mac_address = NULL;
781                 unsigned char mac_addr[MACADDR_LEN] = {0, };
782
783                 if (!session || manager->state != WIFI_DIRECT_STATE_CONNECTING) {
784                         WDS_LOGE("It's not permitted with this state [%d]", manager->state);
785                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
786                         goto failed;
787                 }
788
789                 if (session->direction != SESSION_DIRECTION_INCOMING) {
790                         WDS_LOGE("Only incomming session can be rejected");
791                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
792                         goto failed;
793                 }
794
795                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
796
797                 g_variant_get(parameters, "(&s)", &peer_mac_address);
798                 macaddr_atoe(peer_mac_address, mac_addr);
799
800                 ret = wfd_manager_reject_connection(manager, mac_addr);
801                 if (ret == WIFI_DIRECT_ERROR_NONE)
802                         wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
803                                                      "Connection",
804                                                      g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
805                                                                             WFD_EVENT_CONNECTION_RSP,
806                                                                             peer_mac_address));
807                 return;
808
809         } else if (!g_strcmp0(method_name, "DisconnectAll")) {
810
811                 if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
812                         if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
813                                 ret = wfd_oem_stop_scan(manager->oem_ops);
814                                 if (ret < 0) {
815                                         WDS_LOGE("Failed to stop scan");
816                                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
817                                         goto failed;
818                                 }
819                                 WDS_LOGI("Succeeded to stop scan");
820                                 if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
821                                         wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
822                                         wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
823                                 } else {
824                                         wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
825                                         wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
826                                 }
827                         } else {
828                                 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
829                                 goto failed;
830                         }
831                 }
832
833                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
834
835                 ret = wfd_manager_disconnect_all(manager);
836                 if (ret == WIFI_DIRECT_ERROR_NONE)
837                         wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
838                                                      "Disconnection",
839                                                      g_variant_new("(iis)", ret,
840                                                                             WFD_EVENT_DISCONNECTION_RSP,
841                                                                             ""));
842                 return;
843
844         } else if (!g_strcmp0(method_name, "GetConnectedPeers")) {
845                 wfd_connected_peer_info_s *peers = NULL;
846                 GVariantBuilder *builder_peers = NULL;
847                 int peer_cnt = 0;
848                 int i = 0;
849
850                 builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
851
852                 /* even though status is not CONNECTED,
853                  * this command can be excuted only when group exist */
854                 if (!manager->group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
855                         WDS_LOGD("It's not connected state [%d]", manager->state);
856                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
857                         goto failed;
858                 }
859
860                 peer_cnt = wfd_manager_get_connected_peers(manager, &peers);
861                 WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
862                 if (peer_cnt < 0) {
863                         WDS_LOGE("Failed to get scan result");
864                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
865                         goto failed;
866                 }
867
868                 for (i = 0; i < peer_cnt; i++) {
869                         GVariantBuilder builder_peer;
870                         g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
871
872                         g_variant_builder_add(&builder_peer, "{sv}",
873                                         "DeviceName",
874                                         g_variant_new_string(peers[i].device_name));
875                         g_variant_builder_add(&builder_peer, "{sv}",
876                                         "DeviceAddress",
877                                         wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
878                         g_variant_builder_add(&builder_peer, "{sv}",
879                                         "InterfaceAddress",
880                                         wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
881                         g_variant_builder_add(&builder_peer, "{sv}",
882                                         "IPAddress",
883                                         wfd_manager_dbus_pack_ay(peers[i].ip_address, IPADDR_LEN));
884                         g_variant_builder_add(&builder_peer, "{sv}",
885                                         "Channel",
886                                         g_variant_new_uint16(peers[i].channel));
887 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
888                         g_variant_builder_add(&builder_peer, "{sv}",
889                                         "Services",
890                                         g_variant_new_uint16(peers[i].services));
891 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
892                         g_variant_builder_add(&builder_peer, "{sv}",
893                                         "Category",
894                                         g_variant_new_uint16(peers[i].category));
895                         g_variant_builder_add(&builder_peer, "{sv}",
896                                         "SubCategory",
897                                         g_variant_new_uint16(peers[i].subcategory));
898                         g_variant_builder_add(&builder_peer, "{sv}",
899                                         "IsP2P",
900                                         g_variant_new_boolean(peers[i].is_p2p));
901 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
902                         g_variant_builder_add(&builder_peer, "{sv}",
903                                         "IsWfdDevice",
904                                         g_variant_new_boolean(peers[i].is_wfd_device));
905 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
906
907                         WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
908                         g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
909                 }
910
911                 ret = WIFI_DIRECT_ERROR_NONE;
912                 return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
913                 g_variant_builder_unref(builder_peers);
914                 goto done;
915
916         } else if (!g_strcmp0(method_name, "IsDiscoverable")) {
917                 ret = WIFI_DIRECT_ERROR_NONE;
918                 return_parameters = g_variant_new("(b)",
919                                                    (manager->state == WIFI_DIRECT_STATE_DISCOVERING ||
920                                                     wfd_group_is_autonomous(manager->group) == TRUE));
921                 goto done;
922
923         } else if (!g_strcmp0(method_name, "IsListeningOnly")) {
924                 ret = WIFI_DIRECT_ERROR_NONE;
925                 return_parameters = g_variant_new("(b)", (manager->scan_mode == WFD_SCAN_MODE_PASSIVE));
926                 goto done;
927
928         } else if (!g_strcmp0(method_name, "GetPeerInfo")) {
929                 wfd_discovery_entry_s *peer = NULL;
930                 GVariantBuilder *builder_peer = NULL;
931                 const char *peer_mac_address = NULL;
932                 unsigned char mac_addr[MACADDR_LEN] = {0, };
933
934                 g_variant_get(parameters, "(&s)", &peer_mac_address);
935                 macaddr_atoe(peer_mac_address, mac_addr);
936
937                 builder_peer = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
938
939                 ret = wfd_manager_get_peer_info(manager, mac_addr, &peer);
940                 if (ret < 0 || !peer) {
941                         WDS_LOGE("Failed to get peer info");
942                         g_free(peer);
943                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
944                         goto failed;
945                 }
946
947                 g_variant_builder_add(builder_peer, "{sv}",
948                                 "DeviceName",
949                                 g_variant_new_string(peer->device_name));
950                 g_variant_builder_add(builder_peer, "{sv}",
951                                 "DeviceAddress",
952                                 wfd_manager_dbus_pack_ay(peer->mac_address, MACADDR_LEN));
953                 g_variant_builder_add(builder_peer, "{sv}",
954                                 "InterfaceAddress",
955                                 wfd_manager_dbus_pack_ay(peer->intf_address, MACADDR_LEN));
956                 g_variant_builder_add(builder_peer, "{sv}",
957                                 "Channel",
958                                 g_variant_new_uint16(peer->channel));
959 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
960                 g_variant_builder_add(builder_peer, "{sv}",
961                                 "Services",
962                                 g_variant_new_uint16(peer->services));
963 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
964                 g_variant_builder_add(builder_peer, "{sv}",
965                                 "IsGroupOwner",
966                                 g_variant_new_boolean(peer->is_group_owner));
967                 g_variant_builder_add(builder_peer, "{sv}",
968                                 "IsPersistentGO",
969                                 g_variant_new_boolean(peer->is_persistent_go));
970                 g_variant_builder_add(builder_peer, "{sv}",
971                                 "IsConnected",
972                                 g_variant_new_boolean(peer->is_connected));
973                 g_variant_builder_add(builder_peer, "{sv}",
974                                 "WpsDevicePwdID",
975                                 g_variant_new_uint16(peer->wps_device_pwd_id));
976                 g_variant_builder_add(builder_peer, "{sv}",
977                                 "WpsCfgMethods",
978                                 g_variant_new_uint16(peer->wps_cfg_methods));
979                 g_variant_builder_add(builder_peer, "{sv}",
980                                 "Category",
981                                 g_variant_new_uint16(peer->category));
982                 g_variant_builder_add(builder_peer, "{sv}",
983                                 "SubCategory",
984                                 g_variant_new_uint16(peer->subcategory));
985 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
986                 g_variant_builder_add(builder_peer, "{sv}",
987                                 "IsWfdDevice",
988                                 g_variant_new_boolean(peer->is_wfd_device));
989 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
990 #ifdef TIZEN_FEATURE_ASP
991                 wfd_device_s *connected_peer = NULL;
992                 connected_peer = wfd_group_find_member_by_addr(manager->group, mac_addr);
993                 if (connected_peer) {
994                         g_variant_builder_add(builder_peer, "{sv}",
995                                         "IsInGroup",
996                                         g_variant_new_boolean(true));
997                         g_variant_builder_add(builder_peer, "{sv}",
998                                         "IPAddress",
999                                         wfd_manager_dbus_pack_ay(connected_peer->ip_addr, IPADDR_LEN));
1000                 }
1001 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
1002
1003                 ret = WIFI_DIRECT_ERROR_NONE;
1004                 return_parameters = g_variant_new("(ia{sv})", ret, builder_peer);
1005                 g_variant_builder_unref(builder_peer);
1006                 g_free(peer);
1007                 goto done;
1008
1009         } else if (!g_strcmp0(method_name, "GetState")) {
1010                 ret = WIFI_DIRECT_ERROR_NONE;
1011                 return_parameters = g_variant_new("(ii)", ret, manager->state);
1012                 goto done;
1013
1014         } else {
1015                 WDS_LOGD("method not handled");
1016                 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1017                 goto failed;
1018         }
1019
1020 done:
1021         WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1022         return;
1023
1024 failed:
1025
1026 /*g_dbus_method_invocation_return_dbus_error
1027  * (invocation, WFD_MANAGER_SERVICE ".Error", ".OperationFailed"); */
1028
1029         wfd_error_set_gerror(ret, &err);
1030         dbus_error_name = g_dbus_error_encode_gerror(err);
1031         WDS_LOGD("g_dbus_method_invocation_return_gerror with [%s]", dbus_error_name);
1032         g_free(dbus_error_name);
1033         g_dbus_method_invocation_return_gerror(invocation, err);
1034         g_clear_error(&err);
1035         return;
1036 }
1037
1038 static void __wfd_manager_group_iface_handler(const gchar *method_name,
1039                                              GVariant    *parameters,
1040                                              GDBusMethodInvocation *invocation)
1041 {
1042         int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1043         wfd_manager_s *manager = wfd_get_manager();
1044         GVariant *return_parameters = NULL;
1045         GError *err = NULL;
1046         WDS_LOGD("%s", method_name);
1047
1048         if (!g_strcmp0(method_name, "CreateGroup")) {
1049                 wfd_group_s *group = manager->group;
1050                 wfd_oem_group_param_s param;
1051
1052                 if (group || manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1053                         WDS_LOGE("Group already exist or not a proper state");
1054                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1055                         goto failed;
1056                 }
1057
1058 #ifdef TIZEN_WLAN_BOARD_SPRD
1059                 group = wfd_create_pending_group(manager, manager->local->dev_addr);
1060 #else
1061                 group = wfd_create_pending_group(manager, manager->local->intf_addr);
1062 #endif
1063                 if (!group) {
1064                         WDS_LOGE("Failed to create pending group");
1065                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1066                         goto failed;
1067                 }
1068                 group->flags |= WFD_GROUP_FLAG_AUTONOMOUS;
1069                 manager->group = group;
1070
1071                 memset(&param, 0x0, sizeof(param));
1072
1073                 param.persistent = (manager->local->group_flags &
1074                                         WFD_GROUP_FLAG_PERSISTENT);
1075                 memcpy(&(param.passphrase), manager->local->passphrase,
1076                                         sizeof(param.passphrase));
1077
1078 #ifndef TIZEN_WLAN_BOARD_SPRD
1079                 param.freq = WFD_FREQ_2G;
1080 #endif
1081
1082                 ret = wfd_oem_create_group(manager->oem_ops, &param);
1083                 if (ret < 0) {
1084                         WDS_LOGE("Failed to create group");
1085                         wfd_destroy_group(manager);
1086                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1087                         goto failed;
1088                 }
1089
1090                 WDS_LOGD("Succeeded to create pending group");
1091                 memset(manager->local->passphrase, 0x0, PASSPHRASE_LEN_MAX + 1);
1092                 ret = WIFI_DIRECT_ERROR_NONE;
1093                 return_parameters = g_variant_new("(i)", ret);
1094                 goto done;
1095
1096         } else if (!g_strcmp0(method_name, "DestroyGroup")) {
1097                 wfd_group_s *group = manager->group;
1098                 if (!group) {
1099                         WDS_LOGE("Group not exist");
1100                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1101                         goto failed;
1102                 }
1103
1104                 if (group->pending == FALSE) {
1105                         ret = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1106                         if (ret < 0) {
1107                                 WDS_LOGE("Failed to destroy group");
1108                                 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1109                                 goto failed;
1110                         }
1111                 }
1112
1113                 ret = wfd_destroy_group(manager);
1114                 if (ret < 0)
1115                         WDS_LOGE("Failed to destroy group");
1116
1117                 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1118                 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1119
1120                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
1121
1122                 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
1123                                 "Destroyed", NULL);
1124                 return;
1125
1126         } else if (!g_strcmp0(method_name, "IsGroupOwner")) {
1127                 gboolean result;
1128                 wfd_device_s *local = manager->local;
1129                 result = local->dev_role == WFD_DEV_ROLE_GO;
1130                 WDS_LOGI("Is group owner : [%s]", result ? "Yes" : "No");
1131                 return_parameters = g_variant_new("(b)", result);
1132                 goto done;
1133
1134         } else if (!g_strcmp0(method_name, "IsAutoGroup")) {
1135                 int result;
1136                 if ((result = wfd_group_is_autonomous(manager->group)) < 0)
1137                         result = 0;
1138
1139                 WDS_LOGI("Is autonomous group : [%s]", result ? "Yes" : "No");
1140                 return_parameters = g_variant_new("(b)", result);
1141                 goto done;
1142
1143         } else if (!g_strcmp0(method_name, "ActivatePushButton")) {
1144                 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
1145                         WDS_LOGE("Wi-Fi Direct is not Group Owner.");
1146                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1147                         goto failed;
1148                 }
1149
1150                 ret = wfd_oem_wps_start(manager->oem_ops, NULL,
1151                                 WFD_WPS_MODE_PBC, NULL);
1152                 if (ret < 0) {
1153                         WDS_LOGE("Failed to start wps");
1154                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1155                         goto failed;
1156                 }
1157                 return_parameters = g_variant_new("(i)", ret);
1158                 goto done;
1159
1160         } else if (!g_strcmp0(method_name, "GetPersistentGroups")) {
1161                 int persistent_group_count = 0;
1162                 wfd_persistent_group_info_s *plist;
1163                 GVariantBuilder *builder_groups = NULL;
1164                 int i = 0;
1165
1166                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1167                         WDS_LOGE("Wi-Fi Direct is not activated.");
1168                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1169                         goto failed;
1170                 }
1171
1172
1173                 ret = wfd_oem_get_persistent_groups(manager->oem_ops,
1174                                 (wfd_oem_persistent_group_s**) &plist, &persistent_group_count);
1175                 if (ret < 0) {
1176                         WDS_LOGE("Error!! wfd_oem_get_persistent_group_info() failed..");
1177                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1178                         goto failed;
1179                 }
1180
1181                 builder_groups = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
1182
1183                 for (i = 0; i < persistent_group_count; i++) {
1184                         GVariantBuilder builder_group;
1185                         g_variant_builder_init(&builder_group, G_VARIANT_TYPE("a{sv}"));
1186
1187                         g_variant_builder_add(&builder_group, "{sv}",
1188                                         "NetworkID",
1189                                         g_variant_new_uint32(plist[i].network_id));
1190                         g_variant_builder_add(&builder_group, "{sv}",
1191                                         "SSID",
1192                                         g_variant_new_string(plist[i].ssid));
1193                         g_variant_builder_add(&builder_group, "{sv}",
1194                                         "GOMacAddress",
1195                                         wfd_manager_dbus_pack_ay(plist[i].go_mac_address, MACADDR_LEN));
1196
1197                         WDS_LOGD("%dth peer [%s]", i, plist[i].ssid);
1198                         g_variant_builder_add_value(builder_groups, g_variant_builder_end(&builder_group));
1199                 }
1200
1201                 ret = WIFI_DIRECT_ERROR_NONE;
1202                 return_parameters = g_variant_new("(iaa{sv})", ret, builder_groups);
1203                 g_variant_builder_unref(builder_groups);
1204                 goto done;
1205
1206         } else if (!g_strcmp0(method_name, "RemovePersistentGroup")) {
1207                 gchar *ssid;
1208                 gchar *mac_address;
1209                 unsigned char go_mac_address[6];
1210                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1211                         WDS_LOGE("Wi-Fi Direct is not activated.");
1212                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1213                         goto failed;
1214                 }
1215
1216                 g_variant_get(parameters, "(&s&s)", &mac_address, &ssid);
1217                 macaddr_atoe(mac_address, go_mac_address);
1218                 WDS_LOGD("Remove persistent group [%s][" MACSTR "]", ssid, MAC2STR(go_mac_address));
1219
1220                 ret = wfd_oem_remove_persistent_group(manager->oem_ops, ssid,
1221                                 go_mac_address);
1222                 if (ret < 0) {
1223                         WDS_LOGE("Failed to remove persistent group");
1224                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1225                         goto failed;
1226                 }
1227                 return_parameters = g_variant_new("(i)", ret);
1228                 goto done;
1229
1230         } else if (!g_strcmp0(method_name, "SetPassphrase")) {
1231                 gchar *passphrase;
1232                 int passphrase_len = 0;
1233                 wfd_group_s *group = manager->group;
1234
1235                 if (group) {
1236                         WDS_LOGE("Group already exists");
1237                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1238                         goto failed;
1239                 }
1240
1241                 g_variant_get(parameters, "(&s)", &passphrase);
1242                 passphrase_len = strlen(passphrase);
1243
1244                 if (passphrase_len < PASSPHRASE_LEN_MIN ||
1245                                 passphrase_len > PASSPHRASE_LEN_MAX) {
1246                         WDS_LOGE("Passphrase length incorrect [%s]:[%d]",
1247                                         passphrase, passphrase_len);
1248                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1249                         goto failed;
1250                 }
1251
1252                 g_strlcpy(manager->local->passphrase, passphrase, PASSPHRASE_LEN_MAX + 1);
1253                 WDS_LOGI("Passphrase string [%s]", manager->local->passphrase);
1254
1255                 ret = WIFI_DIRECT_ERROR_NONE;
1256                 return_parameters = g_variant_new("(i)", ret);
1257                 goto done;
1258
1259         } else if (!g_strcmp0(method_name, "GetPassphrase")) {
1260                 wfd_group_s *group = manager->group;
1261                 if (!group) {
1262                         WDS_LOGE("Group not exist");
1263                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1264                         goto failed;
1265                 }
1266
1267                 if (group->role == WFD_DEV_ROLE_GC) {
1268                         WDS_LOGE("Device is not GO");
1269                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1270                         goto failed;
1271                 }
1272
1273                 ret = WIFI_DIRECT_ERROR_NONE;
1274                 return_parameters = g_variant_new("(is)", ret, group->passphrase);
1275                 WDS_LOGI("group->pass : [%s]", group->passphrase);
1276                 goto done;
1277
1278
1279         } else if (!g_strcmp0(method_name, "SetPersistentGroupEnabled")) {
1280                 gboolean enabled;
1281
1282                 g_variant_get(parameters, "(b)", &enabled);
1283                 WDS_LOGI("Activate Persistent Group : [%s]",
1284                                 enabled ? "True" : "False");
1285                 if (enabled)
1286                         manager->local->group_flags |= WFD_GROUP_FLAG_PERSISTENT;
1287                 else
1288                         manager->local->group_flags &= ~(WFD_GROUP_FLAG_PERSISTENT);
1289                 ret = WIFI_DIRECT_ERROR_NONE;
1290                 return_parameters = g_variant_new("(i)", ret);
1291                 goto done;
1292
1293         } else if (!g_strcmp0(method_name, "IsPersistentGroupEnabled")) {
1294                 gboolean result;
1295                 result = ((manager->local->group_flags &
1296                                         WFD_GROUP_FLAG_PERSISTENT)
1297                                 == WFD_GROUP_FLAG_PERSISTENT);
1298                 WDS_LOGI("Is persistent group : [%s]", result ? "Yes" : "No");
1299                 return_parameters = g_variant_new("(b)", result);
1300                 goto done;
1301
1302         } else {
1303                 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1304                 goto failed;
1305         }
1306
1307 done:
1308         WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1309         return;
1310
1311 failed:
1312         wfd_error_set_gerror(ret, &err);
1313         g_dbus_method_invocation_return_gerror(invocation, err);
1314         g_clear_error(&err);
1315         return;
1316 }
1317
1318 static void __wfd_manager_config_iface_handler(const gchar *method_name,
1319                                               GVariant    *parameters,
1320                                               GDBusMethodInvocation *invocation)
1321 {
1322         int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1323         wfd_manager_s *manager = wfd_get_manager();
1324         GVariant *return_parameters = NULL;
1325         GError *err = NULL;
1326         WDS_LOGD("%s", method_name);
1327
1328         if (!g_strcmp0(method_name, "GetDeviceName")) {
1329                 char device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN+1] = {0, };
1330
1331                 ret = wfd_local_get_dev_name(device_name);
1332                 if (ret < 0) {
1333                         WDS_LOGE("Failed to get device name");
1334                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1335                         goto failed;
1336                 } else {
1337
1338                         ret = WIFI_DIRECT_ERROR_NONE;
1339                         return_parameters = g_variant_new("(is)", ret, device_name);
1340                 }
1341                 goto done;
1342
1343         } else if (!g_strcmp0(method_name, "SetDeviceName")) {
1344                 const char *device_name = NULL;
1345                 g_variant_get(parameters, "(&s)", &device_name);
1346
1347                 ret = wfd_local_set_dev_name((char *)device_name);
1348                 if (ret < 0) {
1349                         WDS_LOGE("Failed to set device name");
1350                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1351                         goto failed;
1352                 }
1353
1354                 ret = WIFI_DIRECT_ERROR_NONE;
1355                 return_parameters = g_variant_new("(i)", ret);
1356                 goto done;
1357
1358         } else if (!g_strcmp0(method_name, "GetWpsPin")) {
1359                 wfd_session_s *session = (wfd_session_s*) manager->session;
1360                 if (!session || manager->auto_pin[0] != 0) {
1361                         WDS_LOGE("Session not exist");
1362                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1363                         goto failed;
1364                 }
1365
1366                 if (session->wps_pin[0] == '\0') {
1367                         WDS_LOGE("WPS PIN is not set");
1368                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1369                         goto failed;
1370                 }
1371
1372                 ret = WIFI_DIRECT_ERROR_NONE;
1373                 return_parameters = g_variant_new("(is)", ret, session->wps_pin);
1374                 goto done;
1375
1376         } else if (!g_strcmp0(method_name, "SetWpsPin")) {
1377                 const char *pin = NULL;
1378                 wfd_session_s *session = (wfd_session_s*) manager->session;
1379
1380                 g_variant_get(parameters, "(&s)", &pin);
1381
1382                 if (!session) {
1383                         WDS_LOGE("Session not exist");
1384                         g_strlcpy(manager->auto_pin, pin, strlen(pin) + 1);
1385                 } else {
1386                         g_strlcpy(session->wps_pin, pin, strlen(pin) + 1);
1387                 }
1388
1389                 ret = WIFI_DIRECT_ERROR_NONE;
1390                 return_parameters = g_variant_new("(i)", ret);
1391                 goto done;
1392
1393         } else if (!g_strcmp0(method_name, "GetSupportedWpsMode")) {
1394                 int config_methods = 0;
1395
1396                 ret = wfd_local_get_supported_wps_mode(&config_methods);
1397                 if (ret < 0) {
1398                         WDS_LOGE("Failed to get supported wps mode");
1399                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1400                         goto failed;
1401                 }
1402
1403                 ret = WIFI_DIRECT_ERROR_NONE;
1404                 return_parameters = g_variant_new("(ii)", ret, config_methods);
1405                 goto done;
1406
1407         } else if (!g_strcmp0(method_name, "GetReqWpsMode")) {
1408                 int wps_mode = 0;
1409
1410                 ret = wfd_manager_get_req_wps_mode(&wps_mode);
1411                 if (ret < 0) {
1412                         WDS_LOGE("Failed to get request wps mode");
1413                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1414                         goto failed;
1415                 }
1416
1417                 ret = WIFI_DIRECT_ERROR_NONE;
1418                 return_parameters = g_variant_new("(ii)", ret, wps_mode);
1419                 goto done;
1420
1421         } else if (!g_strcmp0(method_name, "SetReqWpsMode")) {
1422                 int type = 0;
1423
1424                 g_variant_get(parameters, "(i)", &type);
1425                 ret = wfd_manager_set_req_wps_mode(type);
1426                 if (ret < 0) {
1427                         WDS_LOGE("Failed to set request wps mode");
1428                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1429                         goto failed;
1430                 }
1431
1432                 ret = WIFI_DIRECT_ERROR_NONE;
1433                 return_parameters = g_variant_new("(i)", ret);
1434                 goto done;
1435
1436         } else if (!g_strcmp0(method_name, "GetLocalWpsMode")) {
1437                 int wps_mode = 0;
1438
1439                 ret = wfd_local_get_wps_mode(&wps_mode);
1440                 if (ret < 0) {
1441                         WDS_LOGE("Failed to get request wps mode");
1442                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1443                         goto failed;
1444                 }
1445
1446                 ret = WIFI_DIRECT_ERROR_NONE;
1447                 return_parameters = g_variant_new("(ii)", ret, wps_mode);
1448                 goto done;
1449
1450         } else if (!g_strcmp0(method_name, "GetIPAddress")) {
1451                 char ip_addr_str[IPSTR_LEN+1] = {0, };
1452
1453                 if (manager->state < WIFI_DIRECT_STATE_CONNECTED) {
1454                         WDS_LOGE("Device is not connected yet");
1455                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1456                         goto failed;
1457                 }
1458
1459                 ret = wfd_local_get_ip_addr((char *)ip_addr_str);
1460                 if (ret < 0) {
1461                         WDS_LOGE("Failed to get local IP address");
1462                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1463                         goto failed;
1464                 }
1465
1466                 return_parameters = g_variant_new("(is)", ret, ip_addr_str);
1467                 WDS_LOGI("IP addr : [%s]", ip_addr_str);
1468                 goto done;
1469
1470         } else if (!g_strcmp0(method_name, "GetMacAddress")) {
1471                 char device_mac[MACSTR_LEN+1] = {0, };
1472
1473                 ret = wfd_local_get_dev_mac(device_mac);
1474                 if (ret < 0) {
1475                         WDS_LOGE("Failed to get device mac");
1476                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1477                         goto failed;
1478                 }
1479
1480                 ret = WIFI_DIRECT_ERROR_NONE;
1481                 return_parameters = g_variant_new("(is)", ret, device_mac);
1482                 goto done;
1483
1484         } else if (!g_strcmp0(method_name, "GetGoIntent")) {
1485                 int go_intent = 0;
1486
1487                 ret = wfd_manager_get_go_intent(&go_intent);
1488                 if (ret < 0) {
1489                         WDS_LOGE("Failed to get GO intent");
1490                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1491                         goto failed;
1492                 }
1493
1494                 ret = WIFI_DIRECT_ERROR_NONE;
1495                 return_parameters = g_variant_new("(ii)", ret, go_intent);
1496                 goto done;
1497
1498         } else if (!g_strcmp0(method_name, "SetGoIntent")) {
1499                 int go_intent = 0;
1500
1501                 g_variant_get(parameters, "(i)", &go_intent);
1502                 ret = wfd_manager_set_go_intent(go_intent);
1503                 if (ret < 0) {
1504                         WDS_LOGE("Failed to set GO intent");
1505                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1506                         goto failed;
1507                 }
1508
1509                 ret = WIFI_DIRECT_ERROR_NONE;
1510                 return_parameters = g_variant_new("(i)", ret);
1511                 goto done;
1512
1513         } else if (!g_strcmp0(method_name, "GetMaxClient")) {
1514                 int max_client = 0;
1515
1516                 ret = wfd_manager_get_max_station(&max_client);
1517                 if (ret < 0) {
1518                         WDS_LOGE("Failed to get max station");
1519                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1520                         goto failed;
1521                 }
1522
1523                 ret = WIFI_DIRECT_ERROR_NONE;
1524                 return_parameters = g_variant_new("(ii)", ret, max_client);
1525                 goto done;
1526
1527         } else if (!g_strcmp0(method_name, "SetMaxClient")) {
1528                 int max_client = 0;
1529                 g_variant_get(parameters, "(i)", &max_client);
1530
1531                 ret = wfd_manager_set_max_station(max_client);
1532                 if (ret < 0) {
1533                         WDS_LOGE("Failed to set max station");
1534                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1535                         goto failed;
1536                 }
1537
1538                 ret = WIFI_DIRECT_ERROR_NONE;
1539                 return_parameters = g_variant_new("(i)", ret);
1540                 goto done;
1541
1542         } else if (!g_strcmp0(method_name, "SetAutoConnectionMode")) {
1543                 gboolean mode = FALSE;
1544
1545                 g_variant_get(parameters, "(b)", &mode);
1546                 ret = wfd_manager_set_autoconnection(mode);
1547                 if (ret < 0) {
1548                         WDS_LOGE("Failed to set autoconnection");
1549                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1550                         goto failed;
1551                 }
1552
1553                 ret = WIFI_DIRECT_ERROR_NONE;
1554                 return_parameters = g_variant_new("(i)", ret);
1555                 goto done;
1556
1557         } else if (!g_strcmp0(method_name, "IsAutoConnectionMode")) {
1558                 int mode = 0;
1559
1560                 ret = wfd_manager_get_autoconnection(&mode);
1561                 if (ret < 0) {
1562                         WDS_LOGE("Failed to get autoconnection");
1563                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1564                         goto failed;
1565                 }
1566
1567                 ret = WIFI_DIRECT_ERROR_NONE;
1568                 return_parameters = g_variant_new("(ib)", ret, mode);
1569                 goto done;
1570
1571         } else if (!g_strcmp0(method_name, "GetOperatingChannel")) {
1572                 int channel = 0;
1573
1574                 wfd_group_s *group = manager->group;
1575                 if (!group) {
1576                         WDS_LOGE("Group not exist");
1577                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1578                         goto failed;
1579                 }
1580
1581                 channel = wfd_util_freq_to_channel(group->freq);
1582                 if (channel < 0) {
1583                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1584                         goto failed;
1585                 }
1586
1587                 ret = WIFI_DIRECT_ERROR_NONE;
1588                 return_parameters = g_variant_new("(ii)", ret, channel);
1589                 goto done;
1590
1591         } else if (!g_strcmp0(method_name, "SetAutoConnectionPeer")) {
1592                 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1593                 goto failed;
1594
1595         } else if (!g_strcmp0(method_name, "GetInterfaceName")) {
1596                 wfd_group_s *group = (wfd_group_s *)manager->group;
1597                 if (!group) {
1598                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1599                         goto failed;
1600                 }
1601                 ret = WIFI_DIRECT_ERROR_NONE;
1602                 return_parameters = g_variant_new("(is)", ret, group->ifname);
1603                 goto done;
1604
1605         } else if (!g_strcmp0(method_name, "GetSubnetMask")) {
1606                         char *get_str = NULL;
1607                         char subnet_mask[IPSTR_LEN+1] = {0, };
1608
1609                         get_str = vconf_get_str(VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK);
1610                         if (!get_str) {
1611                                 WDS_LOGE("Get Subnet Mask failed");
1612                                 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1613                                 goto failed;
1614                         }
1615                         WDS_LOGD("VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK(%s) : %s", VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK,
1616                                 get_str);
1617                         ret = WIFI_DIRECT_ERROR_NONE;
1618                         g_strlcpy(subnet_mask, get_str, IPSTR_LEN + 1);
1619                         return_parameters = g_variant_new("(is)", ret, subnet_mask);
1620                         free(get_str);
1621                         goto done;
1622
1623         } else if (!g_strcmp0(method_name, "GetGateway")) {
1624                         char *get_str = NULL;
1625                         char gateway_addr[IPSTR_LEN+1] = {0, };
1626                         get_str = vconf_get_str(VCONFKEY_WIFI_DIRECT_P2P_GATEWAY);
1627                         if (!get_str) {
1628                                 WDS_LOGE("Get Gateway failed");
1629                                 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1630                                 goto failed;
1631                         }
1632                         WDS_LOGD("VCONFKEY_WIFI_DIRECT_P2P_GATEWAY_ADDR(%s) : %s", VCONFKEY_WIFI_DIRECT_P2P_GATEWAY,
1633                                 get_str);
1634                         ret = WIFI_DIRECT_ERROR_NONE;
1635                         g_strlcpy(gateway_addr, get_str, IPSTR_LEN + 1);
1636                         return_parameters = g_variant_new("(is)", ret, gateway_addr);
1637                         free(get_str);
1638                         goto done;
1639
1640         } else if (!g_strcmp0(method_name, "GetSessionTimer")) {
1641
1642                 int session_timer = 0;
1643                 ret = WIFI_DIRECT_ERROR_NONE;
1644                 session_timer = manager->session_timer;
1645                 WDS_LOGD("Get Session Timer value is %d", session_timer);
1646                 return_parameters = g_variant_new("(ii)", ret, session_timer);
1647                 goto done;
1648
1649         } else if (!g_strcmp0(method_name, "SetSessionTimer")) {
1650
1651                 int session_timer = 0;
1652                 g_variant_get(parameters, "(i)", &session_timer);
1653                 WDS_LOGD("Set Session Timer value is %d", session_timer);
1654                 manager->session_timer = session_timer;
1655                 ret = WIFI_DIRECT_ERROR_NONE;
1656                 return_parameters = g_variant_new("(i)", ret);
1657                 goto done;
1658
1659         } else if (!g_strcmp0(method_name, "SetAutoGroupRemoval")) {
1660                 gboolean enable;
1661
1662                 g_variant_get(parameters, "(b)", &enable);
1663                 WDS_LOGE("Activate Auto Group Removal Mode : [%s]",
1664                                 enable ? "True" : "False");
1665
1666                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1667                         WDS_LOGE("Wi-Fi Direct is not activated.");
1668                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1669                         goto failed;
1670                 }
1671
1672                 if (enable) {
1673                         manager->auto_group_remove_enable = TRUE;
1674
1675                         /* Enable Group destroy only if state is connecting */
1676                         if (manager->state == WIFI_DIRECT_STATE_CONNECTING) {
1677                                 WDS_LOGE("Wi-Fi Direct state is CONNECTING");
1678                                 ret = WIFI_DIRECT_ERROR_NONE;
1679                                 return_parameters = g_variant_new("(i)", ret);
1680                                 goto done;
1681                         }
1682                         /* Remove group immediately if no connected peer found */
1683                         if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1684                                 wfd_group_s *group = (wfd_group_s*) manager->group;
1685                                 if (group && !group->member_count
1686                                                   && wfd_util_is_remove_group_allowed())
1687                                         wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1688                           }
1689
1690                 } else
1691                         manager->auto_group_remove_enable = FALSE;
1692
1693
1694                 ret = WIFI_DIRECT_ERROR_NONE;
1695                 return_parameters = g_variant_new("(i)", ret);
1696                 goto done;
1697
1698         } else if (!g_strcmp0(method_name, "GetPrimaryDevType")) {
1699
1700                 int pri_dev_type = 0;
1701                 ret = WIFI_DIRECT_ERROR_NONE;
1702                 pri_dev_type = DEFAULT_PRIMARY_DEVICE_TYPE;
1703                 WDS_LOGD("Get primary dev type value is %d", pri_dev_type);
1704                 return_parameters = g_variant_new("(ii)", ret, pri_dev_type);
1705                 goto done;
1706
1707         } else if (!g_strcmp0(method_name, "GetSecondaryDevType")) {
1708
1709                 int sec_dev_type = 0;
1710                 ret = WIFI_DIRECT_ERROR_NONE;
1711                 sec_dev_type = DEFAULT_SECONDARY_DEVICE_TYPE;
1712                 WDS_LOGD("Get secondary dev type value is %d", sec_dev_type);
1713                 return_parameters = g_variant_new("(ii)", ret, sec_dev_type);
1714                 goto done;
1715
1716         }  else {
1717                 WDS_LOGE("method not handled");
1718                 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1719                 goto failed;
1720         }
1721
1722 done:
1723         WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1724         return;
1725
1726 failed:
1727         wfd_error_set_gerror(ret, &err);
1728         g_dbus_method_invocation_return_gerror(invocation, err);
1729         g_clear_error(&err);
1730         return;
1731 }
1732
1733 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1734 static void __wfd_manager_service_iface_handler(const gchar *method_name,
1735                                                GVariant    *parameters,
1736                                                GDBusMethodInvocation *invocation)
1737 {
1738         int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1739         wfd_manager_s *manager = wfd_get_manager();
1740         GVariant *return_parameters = NULL;
1741         GError *err = NULL;
1742         WDS_LOGD("%s", method_name);
1743
1744         if (!g_strcmp0(method_name, "StartDiscovery")) {
1745                 const char *mac_address = NULL;
1746                 int service_type;
1747                 unsigned char mac_addr[MACADDR_LEN] = {0, };
1748
1749                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1750                         WDS_LOGE("Wi-Fi Direct is not activated.");
1751                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1752                         goto failed;
1753                 }
1754
1755                 g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
1756                 WDS_LOGD("Service type [%d]", service_type);
1757                 macaddr_atoe(mac_address, mac_addr);
1758
1759                 ret = wfd_oem_start_service_discovery(manager->oem_ops,
1760                                 mac_addr, service_type);
1761                 if (ret < 0) {
1762                         WDS_LOGE("Failed to start service discovery");
1763                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1764                         goto failed;
1765                 }
1766
1767                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
1768
1769                 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1770                                 "DiscoveryStarted", NULL);
1771                 return;
1772
1773         } else if (!g_strcmp0(method_name, "StopDiscovery")) {
1774                 const char *mac_address = NULL;
1775                 int service_type;
1776                 unsigned char mac_addr[MACADDR_LEN] = {0, };
1777
1778                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1779                         WDS_LOGE("Wi-Fi Direct is not activated.");
1780                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1781                         goto failed;
1782                 }
1783
1784                 g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
1785                 WDS_LOGD("Service type [%d]", service_type);
1786                 macaddr_atoe(mac_address, mac_addr);
1787
1788                 ret = wfd_oem_cancel_service_discovery(manager->oem_ops,
1789                                 mac_addr, service_type);
1790                 if (ret < 0) {
1791                         WDS_LOGE("Failed to cancel service discovery");
1792                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1793                         goto failed;
1794                 }
1795                 ret = WIFI_DIRECT_ERROR_NONE;
1796                 return_parameters = g_variant_new("(i)", ret);
1797                 goto done;
1798
1799         } else if (!g_strcmp0(method_name, "Register")) {
1800                 int service_type;
1801                 int service_id = 0;
1802                 const char *info_str = NULL;
1803
1804                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1805                         WDS_LOGE("Wi-Fi Direct is not activated.");
1806                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1807                         goto failed;
1808                 }
1809
1810                 g_variant_get(parameters, "(i&s)", &service_type, &info_str);
1811                 WDS_LOGD("Register service [%d: %s]", service_type, info_str);
1812
1813                 ret = wfd_service_add(service_type, (char *)info_str, &service_id);
1814                 if (ret < 0) {
1815                         WDS_LOGE("Failed to add service");
1816                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1817                         goto failed;
1818                 }
1819
1820                 ret = WIFI_DIRECT_ERROR_NONE;
1821                 return_parameters = g_variant_new("(ii)", ret, service_id);
1822                 goto done;
1823
1824         } else if (!g_strcmp0(method_name, "Deregister")) {
1825                 int service_id = 0;
1826
1827                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1828                         WDS_LOGE("Wi-Fi Direct is not activated.");
1829                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1830                         goto failed;
1831                 }
1832
1833                 g_variant_get(parameters, "(i)", &service_id);
1834                 WDS_LOGD("Service id [%d]", service_id);
1835
1836                 ret = wfd_service_del(service_id);
1837                 if (ret < 0) {
1838                         WDS_LOGE("Failed to delete service");
1839                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1840                         goto failed;
1841                 }
1842
1843                 ret = WIFI_DIRECT_ERROR_NONE;
1844                 return_parameters = g_variant_new("(i)", ret);
1845                 goto done;
1846
1847         } else {
1848                 WDS_LOGD("method not handled");
1849                 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1850                 goto failed;
1851         }
1852
1853 done:
1854         WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1855         return;
1856
1857 failed:
1858         wfd_error_set_gerror(ret, &err);
1859         g_dbus_method_invocation_return_gerror(invocation, err);
1860         g_clear_error(&err);
1861         return;
1862 }
1863 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1864
1865 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1866 static void __wfd_manager_display_iface_handler(const gchar *method_name,
1867                                                GVariant    *parameters,
1868                                                GDBusMethodInvocation *invocation)
1869 {
1870         int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1871         wfd_manager_s *manager = wfd_get_manager();
1872         GVariant *return_parameters = NULL;
1873         GError *err = NULL;
1874         WDS_LOGD("%s", method_name);
1875
1876         if (!g_strcmp0(method_name, "Init")) {
1877                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1878                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1879                         goto failed;
1880                 }
1881
1882                 wfd_device_s * device = manager->local;
1883
1884                 ret = wfd_oem_miracast_init(manager->oem_ops, TRUE);
1885                 if (ret < 0) {
1886                         WDS_LOGE("Failed to initialize display");
1887                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1888                         goto failed;
1889                 }
1890
1891                 device->display.type = WIFI_DISPLAY_DEFAULT_TYPE;
1892                 device->display.port = WIFI_DISPLAY_DEFAULT_PORT;
1893                 device->display.availability = WIFI_DISPLAY_DEFAULT_AVAIL;
1894                 device->display.hdcp_support = WIFI_DISPLAY_DEFAULT_HDCP;
1895
1896                 ret = WIFI_DIRECT_ERROR_NONE;
1897                 return_parameters = g_variant_new("(i)", ret);
1898                 goto done;
1899
1900         } else if (!g_strcmp0(method_name, "Deinit")) {
1901                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1902                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1903                         goto failed;
1904                 }
1905
1906                 wfd_device_s * device = manager->local;
1907
1908                 ret = wfd_oem_miracast_init(manager->oem_ops, FALSE);
1909                 if (ret < 0) {
1910                         WDS_LOGE("Failed to deinitialize display");
1911                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1912                         goto failed;
1913                 }
1914
1915                 memset(&(device->display), 0x0, sizeof(wfd_display_type_e));
1916
1917                 ret = WIFI_DIRECT_ERROR_NONE;
1918                 return_parameters = g_variant_new("(i)", ret);
1919                 goto done;
1920
1921         } else if (!g_strcmp0(method_name, "SetConfig")) {
1922                 int type, port, hdcp;
1923                 g_variant_get(parameters, "(iii)", &type, &port, &hdcp);
1924
1925                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1926                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1927                         goto failed;
1928                 }
1929
1930                 WDS_LOGD("type %d port %d hdcp %d", type, port, hdcp);
1931
1932                 ret = wfd_manager_set_display_device(type, port, hdcp);
1933                 if (ret < 0) {
1934                         WDS_LOGE("Failed to set display device settings");
1935                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1936                         goto failed;
1937                 }
1938
1939                 ret = WIFI_DIRECT_ERROR_NONE;
1940                 return_parameters = g_variant_new("(i)", ret);
1941                 goto done;
1942
1943         } else if (!g_strcmp0(method_name, "SetAvailiability")) {
1944                 int availability;
1945                 g_variant_get(parameters, "(i)", &availability);
1946
1947                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1948                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1949                         goto failed;
1950                 }
1951
1952                 ret = wfd_manager_set_session_availability(availability);
1953                 if (ret < 0) {
1954                         WDS_LOGE("Failed to set session availability");
1955                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1956                         goto failed;
1957                 }
1958
1959                 ret = WIFI_DIRECT_ERROR_NONE;
1960                 return_parameters = g_variant_new("(i)", ret);
1961                 goto done;
1962
1963         } else if (!g_strcmp0(method_name, "GetPeerType")) {
1964                 wfd_device_s *peer = NULL;
1965                 const char *mac_address = NULL;
1966                 unsigned char mac_addr[MACADDR_LEN] = {0, };
1967
1968                 g_variant_get(parameters, "(&s)", &mac_address);
1969                 macaddr_atoe(mac_address, mac_addr);
1970
1971                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1972                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1973                         goto failed;
1974                 }
1975
1976                 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
1977                 if (!peer) {
1978                         WDS_LOGE("Failed to get peer");
1979                         ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1980                         goto failed;
1981                 }
1982
1983                 ret = WIFI_DIRECT_ERROR_NONE;
1984                 return_parameters = g_variant_new("(ii)", ret, peer->display.type);
1985                 goto done;
1986
1987         } else if (!g_strcmp0(method_name, "GetPeerAvailability")) {
1988                 wfd_device_s *peer = NULL;
1989                 const char *mac_address = NULL;
1990                 unsigned char mac_addr[MACADDR_LEN] = {0, };
1991
1992                 g_variant_get(parameters, "(&s)", &mac_address);
1993                 macaddr_atoe(mac_address, mac_addr);
1994
1995                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1996                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1997                         goto failed;
1998                 }
1999
2000                 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2001                 if (!peer) {
2002                         WDS_LOGE("Failed to get peer");
2003                         ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2004                         goto failed;
2005                 }
2006
2007                 ret = WIFI_DIRECT_ERROR_NONE;
2008                 return_parameters = g_variant_new("(ii)", ret, peer->display.availability);
2009                 goto done;
2010
2011         } else if (!g_strcmp0(method_name, "GetPeerHdcp")) {
2012                 wfd_device_s *peer = NULL;
2013                 const char *mac_address = NULL;
2014                 unsigned char mac_addr[MACADDR_LEN] = {0, };
2015
2016                 g_variant_get(parameters, "(&s)", &mac_address);
2017                 macaddr_atoe(mac_address, mac_addr);
2018
2019                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2020                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2021                         goto failed;
2022                 }
2023
2024                 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2025                 if (!peer) {
2026                         WDS_LOGE("Failed to get peer");
2027                         ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2028                         goto failed;
2029                 }
2030
2031                 ret = WIFI_DIRECT_ERROR_NONE;
2032                 return_parameters = g_variant_new("(ii)", ret, peer->display.hdcp_support);
2033                 goto done;
2034
2035         } else if (!g_strcmp0(method_name, "GetPeerPort")) {
2036                 wfd_device_s *peer = NULL;
2037                 const char *mac_address = NULL;
2038                 unsigned char mac_addr[MACADDR_LEN] = {0, };
2039
2040                 g_variant_get(parameters, "(&s)", &mac_address);
2041                 macaddr_atoe(mac_address, mac_addr);
2042
2043                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2044                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2045                         goto failed;
2046                 }
2047
2048                 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2049                 if (!peer) {
2050                         WDS_LOGE("Failed to get peer");
2051                         ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2052                         goto failed;
2053                 }
2054
2055                 ret = WIFI_DIRECT_ERROR_NONE;
2056                 return_parameters = g_variant_new("(ii)", ret, peer->display.port);
2057                 goto done;
2058
2059         } else if (!g_strcmp0(method_name, "GetPeerThroughput")) {
2060                 wfd_device_s *peer = NULL;
2061                 const char *mac_address = NULL;
2062                 unsigned char mac_addr[MACADDR_LEN] = {0, };
2063
2064                 g_variant_get(parameters, "(&s)", &mac_address);
2065                 macaddr_atoe(mac_address, mac_addr);
2066
2067                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2068                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2069                         goto failed;
2070                 }
2071
2072                 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2073                 if (!peer) {
2074                         WDS_LOGE("Failed to get peer");
2075                         ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2076                         goto failed;
2077                 }
2078
2079                 ret = WIFI_DIRECT_ERROR_NONE;
2080                 return_parameters = g_variant_new("(ii)", ret, peer->display.max_tput);
2081                 goto done;
2082
2083         } else {
2084                 WDS_LOGD("method not handled");
2085                 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2086                 goto failed;
2087         }
2088
2089 done:
2090         WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
2091         return;
2092
2093 failed:
2094         wfd_error_set_gerror(ret, &err);
2095         g_dbus_method_invocation_return_gerror(invocation, err);
2096         g_clear_error(&err);
2097         return;
2098 }
2099 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
2100 #if defined(TIZEN_FEATURE_ASP)
2101
2102 static void __g_variant_to_txt_record(GVariant *variant, char **txt_record)
2103 {
2104         GVariantIter *iter = NULL;
2105         gchar *key = NULL;
2106         GVariant *value = NULL;
2107         char *buff = NULL;
2108         const char *str = NULL;
2109         char *pos = NULL;
2110         int txt_length = 0;
2111         int key_length = 0;
2112         gsize value_length = 0;
2113         __WDS_LOG_FUNC_ENTER__;
2114
2115         DBUS_DEBUG_VARIANT(variant);
2116         g_variant_get(variant, "a{sv}", &iter);
2117         while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2118                 WDS_LOGD("%s %s", key, g_variant_get_string(value, &value_length));
2119                 txt_length += strlen(key);
2120                 str = g_variant_get_string(value, &value_length);
2121                 txt_length += (int)value_length;
2122                 txt_length += 2;
2123         }
2124
2125         g_variant_iter_free(iter);
2126         if(txt_length == 0) {
2127                 __WDS_LOG_FUNC_EXIT__;
2128                 return;
2129         }
2130
2131         buff = g_try_malloc0(txt_length);
2132         if(buff == NULL) {
2133                 WDS_LOGE("g_try_malloc0 failed");
2134                 __WDS_LOG_FUNC_EXIT__;
2135                 return;
2136         }
2137         pos = buff;
2138         g_variant_get(variant, "a{sv}", &iter);
2139         while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2140                 key_length = strlen(key);
2141                 str = g_variant_get_string(value, &value_length);
2142
2143                 g_strlcpy(pos, key, key_length + 1);
2144                 pos+= key_length;
2145                 pos[0] = '=';
2146                 pos++;
2147
2148                 g_strlcpy(pos, str, value_length + 1);
2149                 pos+= (int)value_length;
2150                 pos[0] = ',';
2151                 pos++;
2152         }
2153         buff[txt_length -1] = '\0';
2154
2155         g_variant_iter_free(iter);
2156         *txt_record = buff;
2157
2158         __WDS_LOG_FUNC_EXIT__;
2159         return;
2160 }
2161
2162 static void __g_variant_to_seek_info(GVariant *variant, char **seek_info)
2163 {
2164         GVariantIter *iter = NULL;
2165         gchar *key = NULL;
2166         char *buff = NULL;
2167         char *pos = NULL;
2168         int seek_length = 0;
2169         int key_length = 0;
2170
2171         DBUS_DEBUG_VARIANT(variant);
2172         g_variant_get(variant, "as", &iter);
2173         while (g_variant_iter_loop(iter, "s", &key)) {
2174                 seek_length += strlen(key);
2175                 seek_length += 1;
2176         }
2177
2178         g_variant_iter_free(iter);
2179         if(seek_length == 0)
2180                 return;
2181
2182         buff = g_try_malloc0(seek_length);
2183         if(buff == NULL) {
2184                 WDS_LOGE("g_try_malloc0 failed");
2185                 return;
2186         }
2187         pos = buff;
2188         g_variant_get(variant, "as", &iter);
2189         while (g_variant_iter_loop(iter, "s", &key)) {
2190                 key_length = strlen(key);
2191
2192                 g_strlcpy(pos, key, key_length + 1);
2193                 pos+= key_length;
2194                 pos[0] = ',';
2195                 pos++;
2196         }
2197         buff[seek_length -1] = '\0';
2198
2199         g_variant_iter_free(iter);
2200         *seek_info = buff;
2201
2202         return;
2203 }
2204
2205 static void __wfd_manager_asp_iface_handler(const gchar *method_name,
2206                                                GVariant    *parameters,
2207                                                GDBusMethodInvocation *invocation)
2208 {
2209         int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2210         wfd_manager_s *manager = wfd_get_manager();
2211         GVariant *return_parameters = NULL;
2212         GError *err = NULL;
2213         WDS_LOGD("%s", method_name);
2214
2215         if (!g_strcmp0(method_name, "AdvertiseService")) {
2216
2217                 wfd_oem_asp_service_s service;
2218                 GVariantIter *iter = NULL;
2219                 gchar *key = NULL;
2220                 GVariant *var = NULL;
2221                 int replace = 0;
2222
2223                 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2224                                 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2225                                 manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
2226                         WDS_LOGE("Wi-Fi Direct is not available status for Advertising.");
2227                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2228                         goto failed;
2229                 }
2230
2231                 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2232                 g_variant_get(parameters, "(a{sv})", &iter);
2233                 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2234                         if (!g_strcmp0(key, "adv_id"))
2235                                 g_variant_get(var, "u", &(service.adv_id));
2236                         else if (!g_strcmp0(key, "discovery_tech"))
2237                                 g_variant_get(var, "i", &(service.discovery_tech));
2238                         else if (!g_strcmp0(key, "preferred_connection"))
2239                                 g_variant_get(var, "y", &(service.preferred_connection));
2240                         else if (!g_strcmp0(key, "auto_accept"))
2241                                 g_variant_get(var, "i", &(service.auto_accept));
2242                         else if (!g_strcmp0(key, "status"))
2243                                 g_variant_get(var, "y", &(service.status));
2244                         else if (!g_strcmp0(key, "role"))
2245                                 g_variant_get(var, "y", &(service.role));
2246                         else if (!g_strcmp0(key, "replace"))
2247                                 g_variant_get(var, "i", &(replace));
2248                         else if (!g_strcmp0(key, "config_method"))
2249                                 g_variant_get(var, "u", &(service.config_method));
2250                         else if (!g_strcmp0(key, "instance_name"))
2251                                         g_variant_get(var, "&s", &(service.instance_name));
2252                         else if (!g_strcmp0(key, "service_type"))
2253                                         g_variant_get(var, "&s", &(service.service_type));
2254                         else if (!g_strcmp0(key, "service_info"))
2255                                 __g_variant_to_txt_record(var, &(service.service_info));
2256                         else if (!g_strcmp0(key, "rsp_info"))
2257                                 g_variant_get(var, "&s", &(service.rsp_info));
2258                         else
2259                                 ;/* Do Nothing */
2260                 }
2261
2262                 ret = wfd_oem_advertise_service(manager->oem_ops, &service, replace);
2263                 if (ret < 0) {
2264                         WDS_LOGE("Failed to add service");
2265                         g_free(service.service_info);
2266                         g_variant_iter_free(iter);
2267                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2268                         goto failed;
2269                 }
2270                 g_free(service.service_info);
2271                 g_variant_iter_free(iter);
2272
2273                 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
2274                         WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
2275                         goto done;
2276                 }
2277
2278                 ret = wfd_manager_start_discovery(manager, WFD_OEM_SCAN_MODE_PASSIVE, 0, 0, 0);
2279                 if (ret == WIFI_DIRECT_ERROR_NONE) {
2280                         wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2281                                                          "ListenStarted",
2282                                                          NULL);
2283                 } else {
2284                         wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
2285                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2286                         goto failed;
2287                 }
2288
2289                 ret = WIFI_DIRECT_ERROR_NONE;
2290                 return_parameters = g_variant_new("(i)", ret);
2291                 goto done;
2292
2293         } else if (!g_strcmp0(method_name, "CancelAdvertiseService")) {
2294
2295                 wfd_oem_asp_service_s service;
2296                 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2297
2298                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2299                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2300                         goto failed;
2301                 }
2302
2303                 g_variant_get(parameters, "(u)", &(service.adv_id));
2304                 ret = wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
2305                 if (ret < 0) {
2306                         WDS_LOGE("Failed to del service");
2307                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2308                         goto failed;
2309                 }
2310
2311                 ret = WIFI_DIRECT_ERROR_NONE;
2312                 return_parameters = g_variant_new("(i)", ret);
2313                 goto done;
2314
2315         } else if (!g_strcmp0(method_name, "SeekService")) {
2316
2317                 wfd_oem_asp_service_s service;
2318                 GVariantIter *iter = NULL;
2319                 gchar *key = NULL;
2320                 GVariant *var = NULL;
2321
2322                 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2323                                 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2324                                 manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
2325                         WDS_LOGE("Wi-Fi Direct is not available status to Seek.");
2326                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2327                         goto failed;
2328                 }
2329
2330                 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2331                 g_variant_get(parameters, "(a{sv})", &iter);
2332                 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2333                         if (!g_strcmp0(key, "discovery_tech"))
2334                                 g_variant_get(var, "i", &(service.discovery_tech));
2335                         else if (!g_strcmp0(key, "preferred_connection"))
2336                                 g_variant_get(var, "y", &(service.preferred_connection));
2337                         else if (!g_strcmp0(key, "service_type"))
2338                                         g_variant_get(var, "&s", &(service.service_type));
2339                         else if (!g_strcmp0(key, "service_info"))
2340                                 __g_variant_to_seek_info(var, &(service.service_info));
2341                         else
2342                                 ;/* Do Nothing */
2343                 }
2344
2345                 ret = wfd_oem_seek_service(manager->oem_ops, &service);
2346                 if (ret < 0) {
2347                         WDS_LOGE("Failed to seek service");
2348                         g_free(service.service_info);
2349                         g_variant_iter_free(iter);
2350                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2351                         goto failed;
2352                 }
2353                 g_free(service.service_info);
2354                 g_variant_iter_free(iter);
2355
2356                 WDS_LOGD("search_id [%x]", service.search_id);
2357
2358                 ret = wfd_manager_start_discovery(manager, WFD_OEM_SCAN_MODE_ACTIVE, 0, 0, 0);
2359                 if (ret == WIFI_DIRECT_ERROR_NONE) {
2360                         wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2361                                                          "DiscoveryStarted",
2362                                                          NULL);
2363                 } else {
2364                         wfd_oem_cancel_seek_service(manager->oem_ops, &service);
2365                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2366                         goto failed;
2367                 }
2368
2369                 ret = WIFI_DIRECT_ERROR_NONE;
2370                 return_parameters = g_variant_new("(it)", ret, service.search_id);
2371                 goto done;
2372
2373         } else if (!g_strcmp0(method_name, "CancelSeekService")) {
2374
2375                 wfd_oem_asp_service_s service;
2376                 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2377
2378                 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2379                         WDS_LOGE("Wi-Fi Direct is not activated.");
2380                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2381                         goto failed;
2382                 }
2383
2384                 g_variant_get(parameters, "(t)", &(service.search_id));
2385                 ret = wfd_oem_cancel_seek_service(manager->oem_ops, &service);
2386                 if (ret < 0) {
2387                         WDS_LOGE("Failed to cancel seek service");
2388                         ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2389                         goto failed;
2390                 }
2391
2392                 ret = WIFI_DIRECT_ERROR_NONE;
2393                 return_parameters = g_variant_new("(i)", ret);
2394                 goto done;
2395         } else if (!g_strcmp0(method_name, "ConnectSession")) {
2396
2397                 GVariantIter *iter = NULL;
2398                 gchar *key = NULL;
2399                 GVariant *var = NULL;
2400                 wfd_oem_asp_prov_s prov_params;
2401                 const char *mac_str = NULL;
2402                 unsigned char role = 0;
2403                 unsigned int config = 0;
2404                 int status = 0;
2405
2406                 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2407                                 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2408                                 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
2409                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2410                         goto failed;
2411                 }
2412
2413                 memset(&prov_params, 0, sizeof(wfd_oem_asp_prov_s));
2414
2415                 g_variant_get(parameters, "(a{sv})", &iter);
2416                 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2417
2418                         if (!g_strcmp0(key, "service_mac")) {
2419                                 g_variant_get(var, "&s", &mac_str);
2420                                 if (mac_str == NULL) {
2421                                         ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2422                                         g_variant_iter_free(iter);
2423                                         goto failed;
2424                                 }
2425                                 macaddr_atoe(mac_str, prov_params.service_mac);
2426                         } else if (!g_strcmp0(key, "adv_id")) {
2427                                 g_variant_get(var, "u", &(prov_params.adv_id));
2428                         } else if (!g_strcmp0(key, "session_mac")) {
2429                                 g_variant_get(var, "&s", &mac_str);
2430                                 if (mac_str == NULL) {
2431                                         ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2432                                         g_variant_iter_free(iter);
2433                                         goto failed;
2434                                 }
2435                                 macaddr_atoe(mac_str, prov_params.session_mac);
2436                         } else if (!g_strcmp0(key, "session_id")) {
2437                                 g_variant_get(var, "u", &(prov_params.session_id));
2438                         } else if (!g_strcmp0(key, "role")) {
2439                                 g_variant_get(var, "y", &(role));
2440                                 prov_params.network_role = (int)role;
2441                         } else if (!g_strcmp0(key, "config_method")) {
2442                                 g_variant_get(var, "u", &(config));
2443                                 prov_params.network_config = (int)config;
2444                         } else if (!g_strcmp0(key, "session_info")) {
2445                                 g_variant_get(var, "&s", &(prov_params.session_information));
2446                         } else {
2447                                 ;/* Do Nothing */
2448                         }
2449                 }
2450
2451                 if (ISZEROMACADDR(prov_params.service_mac) ||
2452                                 ISZEROMACADDR(prov_params.session_mac)) {
2453                         ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2454                         g_variant_iter_free(iter);
2455                         goto failed;
2456                 }
2457
2458                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2459
2460                 wfd_asp_connect_status(prov_params.session_mac,
2461                                 prov_params.session_id,
2462                                 ASP_CONNECT_STATUS_REQUEST_SENT,
2463                                 NULL);
2464
2465                 wfd_group_s *group = (wfd_group_s*) manager->group;
2466                 if (group && group->member_count >= manager->max_station) {
2467
2468                         status = ASP_CONNECT_STATUS_NOMORE_CONNECT;
2469                         wfd_asp_connect_status(prov_params.session_mac,
2470                                         prov_params.session_id,
2471                                         status,
2472                                         NULL);
2473                         g_variant_iter_free(iter);
2474                         __WDS_LOG_FUNC_EXIT__;
2475                         return;
2476                 }
2477
2478                 ret = wfd_manager_asp_connect_session(manager, &prov_params);
2479                 if (ret == WIFI_DIRECT_ERROR_NONE) {
2480                         char peer_mac_address[MACSTR_LEN] = {0,};
2481                         g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(prov_params.service_mac));
2482                         wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2483                                                      "Connection",
2484                                                      g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
2485                                                                             WFD_EVENT_CONNECTION_IN_PROGRESS,
2486                                                                             peer_mac_address));
2487                 } else {
2488                         wfd_asp_connect_status(prov_params.session_mac,
2489                                         prov_params.session_id,
2490                                         ASP_CONNECT_STATUS_REQUEST_FAILED,
2491                                         NULL);
2492                 }
2493                 g_variant_iter_free(iter);
2494                 __WDS_LOG_FUNC_EXIT__;
2495                 return;
2496
2497         } else if (!g_strcmp0(method_name, "ConfirmSession")) {
2498
2499                 GVariantIter *iter = NULL;
2500                 gchar *key = NULL;
2501                 GVariant *var = NULL;
2502                 wfd_oem_asp_prov_s prov_params;
2503                 const char *mac_str = NULL;
2504                 const char *pin = NULL;
2505                 int confirmed = 0;
2506
2507                 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
2508                         ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2509                         goto failed;
2510                 }
2511
2512                 memset(&prov_params, 0, sizeof(wfd_oem_asp_prov_s));
2513
2514                 g_variant_get(parameters, "(a{sv})", &iter);
2515                 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2516
2517                         if (!g_strcmp0(key, "session_mac")) {
2518                                 g_variant_get(var, "&s", &mac_str);
2519                                 if (mac_str == NULL) {
2520                                         ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2521                                         g_variant_iter_free(iter);
2522                                         goto failed;
2523                                 }
2524                                 macaddr_atoe(mac_str, prov_params.session_mac);
2525                         } else if (!g_strcmp0(key, "session_id")) {
2526                                 g_variant_get(var, "u", &(prov_params.session_id));
2527                         } else if (!g_strcmp0(key, "confirmed")) {
2528                                 g_variant_get(var, "y", &(confirmed));
2529                         } else if (!g_strcmp0(key, "pin")) {
2530                                 g_variant_get(var, "&s", &(pin));
2531                                 g_strlcpy(prov_params.wps_pin, pin, PINSTR_LEN);
2532                         } else {
2533                                 ;/* Do Nothing */
2534                         }
2535                 }
2536
2537                 if (ISZEROMACADDR(prov_params.session_mac))     {
2538                         ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2539                         g_variant_iter_free(iter);
2540                         goto failed;
2541                 }
2542
2543                 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2544
2545                 ret = wfd_manager_asp_confirm_session(manager, &prov_params, confirmed);
2546                 if (ret == WIFI_DIRECT_ERROR_NONE && confirmed > 0) {
2547                         char peer_mac_address[MACSTR_LEN] = {0,};
2548                         g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(prov_params.service_mac));
2549                         wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2550                                                      "Connection",
2551                                                      g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
2552                                                                             WFD_EVENT_CONNECTION_IN_PROGRESS,
2553                                                                             peer_mac_address));
2554                         wfd_asp_connect_status(prov_params.session_mac,
2555                                         prov_params.session_id,
2556                                         ASP_CONNECT_STATUS_REQUEST_ACCEPTED,
2557                                         NULL);
2558                 } else {
2559                         wfd_asp_connect_status(prov_params.session_mac,
2560                                         prov_params.session_id,
2561                                         ASP_CONNECT_STATUS_REQUEST_FAILED,
2562                                         NULL);
2563                 }
2564                 g_variant_iter_free(iter);
2565                 __WDS_LOG_FUNC_EXIT__;
2566                 return;
2567         }
2568
2569 done:
2570         WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
2571         __WDS_LOG_FUNC_EXIT__;
2572         return;
2573
2574 failed:
2575         wfd_error_set_gerror(ret, &err);
2576         g_dbus_method_invocation_return_gerror(invocation, err);
2577         g_clear_error(&err);
2578         __WDS_LOG_FUNC_EXIT__;
2579         return;
2580 }
2581 #endif
2582
2583 static struct {
2584         guint reg_id;
2585         const gchar *iface_name;
2586         void (*function) (const gchar *method_name,
2587                         GVariant    *parameters,
2588                         GDBusMethodInvocation *invocation);
2589 } wfd_manager_iface_map[] = {
2590         {
2591                 0,
2592                 WFD_MANAGER_MANAGE_INTERFACE,
2593                 __wfd_manager_manage_iface_handler
2594         },
2595         {
2596                 0,
2597                 WFD_MANAGER_GROUP_INTERFACE,
2598                 __wfd_manager_group_iface_handler
2599         },
2600         {
2601                 0,
2602                 WFD_MANAGER_CONFIG_INTERFACE,
2603                 __wfd_manager_config_iface_handler
2604         },
2605 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
2606         {
2607                 0,
2608                 WFD_MANAGER_SERVICE_INTERFACE,
2609                 __wfd_manager_service_iface_handler
2610         },
2611 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
2612 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
2613         {
2614                 0,
2615                 WFD_MANAGER_DISPLAY_INTERFACE,
2616                 __wfd_manager_display_iface_handler
2617         },
2618 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
2619 #if defined(TIZEN_FEATURE_ASP)
2620         {
2621                 0,
2622                 WFD_MANAGER_ASP_INTERFACE,
2623                 __wfd_manager_asp_iface_handler
2624         },
2625 #endif
2626         {
2627                 0,
2628                 NULL,
2629                 NULL
2630         }
2631 };
2632
2633 /* GDBus method handler */
2634 static void wfd_manager_method_call_handler (GDBusConnection       *connection,
2635                                              const gchar           *sender,
2636                                              const gchar           *object_path,
2637                                              const gchar           *interface_name,
2638                                              const gchar           *method_name,
2639                                              GVariant              *parameters,
2640                                              GDBusMethodInvocation *invocation,
2641                                              gpointer               user_data)
2642 {
2643         int count = 0;
2644
2645 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
2646         if(!g_strcmp0(method_name, "AddClient"))
2647                 wfd_manager_add_active_client(sender);
2648 #endif /* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
2649
2650         /* Method Call */
2651         WDS_LOGD("interface : [%s], method : [%s]", interface_name, method_name);
2652         DBUS_DEBUG_VARIANT(parameters);
2653
2654         while (wfd_manager_iface_map[count].iface_name != NULL) {
2655                 if (!g_strcmp0(interface_name, wfd_manager_iface_map[count].iface_name)) {
2656
2657                         wfd_manager_iface_map[count].function(method_name,
2658                                                               parameters,
2659                                                               invocation);
2660                         break;
2661                 }
2662                 count++;
2663         }
2664 }
2665
2666 static const GDBusInterfaceVTable wfd_manager_interface_vtable = {
2667                 wfd_manager_method_call_handler, NULL, NULL};
2668
2669 void wfd_manager_dbus_unregister(void)
2670 {
2671         int count = 0;
2672
2673         wfd_error_deregister();
2674
2675         while (wfd_manager_iface_map[count].iface_name != NULL) {
2676                 wfd_manager_dbus_iface_unregister(wfd_manager_iface_map[count].reg_id);
2677                 count++;
2678         }
2679 }
2680
2681 gboolean wfd_manager_dbus_register(void)
2682 {
2683         GDBusNodeInfo *node_info = NULL;
2684         GError *Error = NULL;
2685         int count = 0;
2686
2687         wfd_error_register();
2688
2689         node_info = g_dbus_node_info_new_for_xml(wfd_manager_introspection_xml, &Error);
2690         if (node_info == NULL) {
2691                 WDS_LOGE("Failed to get node info, Error: %s", Error->message);
2692                 g_clear_error(&Error);
2693                 return FALSE;
2694         }
2695
2696         while (wfd_manager_iface_map[count].iface_name != NULL) {
2697                 wfd_manager_iface_map[count].reg_id =
2698                         wfd_manager_dbus_iface_register(wfd_manager_iface_map[count].iface_name,
2699                                                         WFD_MANAGER_PATH,
2700                                                         node_info,
2701                                                         &wfd_manager_interface_vtable);
2702
2703                 WDS_LOGD("Registered Interface [%d, %s]",
2704                                         wfd_manager_iface_map[count].reg_id,
2705                                         wfd_manager_iface_map[count].iface_name);
2706
2707                 count++;
2708         }
2709
2710         g_dbus_node_info_unref(node_info);
2711         return TRUE;
2712 }