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