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