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