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