Fix several issues for session connection over P2P
[platform/core/connectivity/asp-manager.git] / src / asp-manager-gdbus.c
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /*****************************************************************************
18  * Standard headers
19  *****************************************************************************/
20
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <stdbool.h>
25 #include <time.h>
26
27 /*****************************************************************************
28  * System headers
29  *****************************************************************************/
30
31 #include<glib.h>
32 #include <gio/gio.h>
33
34 #include<dlog.h>
35
36 /*****************************************************************************
37  * Application Service Platform manager headers
38  *****************************************************************************/
39 #include "asp-manager.h"
40 #include "asp-manager-util.h"
41 #include "asp-manager-gdbus.h"
42 #include "asp-service.h"
43 #include "asp-session.h"
44 #include "asp-tech.h"
45
46 #include "generated-code.h"
47
48 /*****************************************************************************
49  * Macros and Typedefs
50  *****************************************************************************/
51
52 #define ASP_DBUS_SERVICE        "net.asp"
53 #define ASP_DBUS_SERVICE_ASP_PATH               "/net/asp"
54 #define ASP_DBUS_SERVICE_ASP_SERVICE_PATH               "/net/asp/service"
55 #define ASP_DBUS_SERVICE_ASP_SESSION_PATH               "/net/asp/session"
56
57 static const gchar *asp_err_strs[] = {
58                 "NO_ERR",
59                 "MEM_ERR",
60                 "INVALID_PARAM",
61                 "OPER_FAILED",
62                 "NO_SERVICE",
63                 "NO_SESSION",
64 };
65
66 #define ASP_RETURN_SERVICE_ERR(invocation, err_num) g_dbus_method_invocation_return_dbus_error \
67         ((invocation), \
68                         SERVICE_DBUS_ERROR_NAME, \
69                         asp_err_strs[-(err_num)])
70
71 #define ASP_RETURN_SESSION_ERR(invocation, err_num) g_dbus_method_invocation_return_dbus_error \
72                 ((invocation), \
73                                 SESSION_DBUS_ERROR_NAME, \
74                                 asp_err_strs[-(err_num)])
75
76 /*****************************************************************************
77  * Global Variables
78  *****************************************************************************/
79
80 /*****************************************************************************
81  * Local Functions Definition
82  *****************************************************************************/
83
84 static void __g_variant_to_g_hash_table(GVariant *variant, GHashTable* hash, bool key_only)
85 {
86         GVariantIter *iter = NULL;
87         GVariant* var = NULL;
88         gchar *key = NULL;
89         gchar *key_str = NULL;
90         gchar *value_str = NULL;
91         __ASP_LOG_FUNC_ENTER__;
92
93         if (key_only) {
94                 g_variant_get(variant, "as", &iter);
95                 while (g_variant_iter_loop(iter, "s", &key)) {
96                         key_str = g_strdup(key);
97                         g_hash_table_insert(hash, key_str, NULL);
98                 }
99         } else {
100                 g_variant_get(variant, "a{sv}", &iter);
101                 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
102
103                         key_str = g_strdup(key);
104                         value_str = g_variant_dup_string(var, NULL);
105                         g_hash_table_insert(hash, key_str, value_str);
106                 }
107         }
108         __ASP_LOG_FUNC_EXIT__;
109         return;
110 }
111
112 static gboolean __asp_manager_gdbus_advertise_service(AspService *object,
113                 GDBusMethodInvocation *invocation,
114                 GVariant *parameters,
115                 const gboolean *user_data)
116 {
117         __ASP_LOG_FUNC_ENTER__;
118         GVariantIter *iter = NULL;
119         gchar *key = NULL;
120         GVariant *var = NULL;
121         asp_service_advertise_s service;
122         asp_s *asp = NULL;
123         gint32 result = 0;
124
125         asp = (asp_s *)user_data;
126         if (!asp) {
127                 ASP_LOGE("Failed to get memory for asp structure");
128                 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
129                 goto out;
130         }
131         DEBUG_PARAMS(parameters);
132
133         memset(&service, 0, sizeof(asp_service_advertise_s));
134         service.service_info_map = NULL;
135
136         g_variant_get(parameters, "a{sv}", &iter);
137         while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
138
139                 if (!g_strcmp0(key, "adv_id"))
140                         g_variant_get(var, "u", &(service.adv_id));
141                 else if (!g_strcmp0(key, "discovery_tech"))
142                         g_variant_get(var, "i", &(service.discovery_tech));
143                 else if (!g_strcmp0(key, "preferred_connection"))
144                         g_variant_get(var, "y", &(service.preferred_connection));
145                 else if (!g_strcmp0(key, "auto_accept"))
146                         g_variant_get(var, "i", &(service.auto_accept));
147                 else if (!g_strcmp0(key, "status"))
148                         g_variant_get(var, "y", &(service.status));
149                 else if (!g_strcmp0(key, "role"))
150                         g_variant_get(var, "y", &(service.role));
151                 else if (!g_strcmp0(key, "config_method"))
152                         g_variant_get(var, "u", &(service.config_method));
153                 else if (!g_strcmp0(key, "instance_name"))
154                         g_variant_get(var, "&s", &(service.instance_name));
155                 else if (!g_strcmp0(key, "service_type"))
156                         g_variant_get(var, "&s", &(service.service_type));
157                 else if (!g_strcmp0(key, "service_info")) {
158                         service.service_info_map = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
159                         __g_variant_to_g_hash_table(var, service.service_info_map, false);
160                 } else if (!g_strcmp0(key, "rsp_info"))
161                         g_variant_get(var, "&s", &(service.rsp_info));
162                 else
163                         ;/* Do Nothing */
164         }
165
166         result = asp_service_advertise(&service, 0);
167         g_hash_table_remove_all(service.service_info_map);
168         if (result < 0) {
169                 ASP_LOGE("Failed to advertise service");
170                 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
171                 goto out;
172         }
173
174         asp_service_complete_advertise_service(object, invocation, result);
175
176 out:
177         g_variant_iter_free(iter);
178         __ASP_LOG_FUNC_EXIT__;
179         return TRUE;
180 }
181
182 static gboolean __asp_manager_gdbus_service_status_change(AspService *object,
183                 GDBusMethodInvocation *invocation,
184                 GVariant *parameters,
185                 const gboolean *user_data)
186 {
187         __ASP_LOG_FUNC_ENTER__;
188         GVariantIter *iter = NULL;
189         gchar *key = NULL;
190         GVariant *var = NULL;
191         asp_service_advertise_s service;
192         asp_s *asp = NULL;
193         gint32 result = 0;
194
195         asp = (asp_s *)user_data;
196         if (!asp) {
197                 ASP_LOGE("Failed to get memory for asp structure");
198                 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
199                 goto out;
200         }
201         DEBUG_PARAMS(parameters);
202
203         memset(&service, 0, sizeof(asp_service_advertise_s));
204         g_variant_get(parameters, "a{sv}", &iter);
205         while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
206
207                 if (!g_strcmp0(key, "adv_id"))
208                         g_variant_get(var, "u", &(service.adv_id));
209                 else if (!g_strcmp0(key, "discovery_tech"))
210                         g_variant_get(var, "i", &(service.discovery_tech));
211                 else if (!g_strcmp0(key, "preferred_connection"))
212                         g_variant_get(var, "y", &(service.preferred_connection));
213                 else if (!g_strcmp0(key, "auto_accept"))
214                         g_variant_get(var, "i", &(service.auto_accept));
215                 else if (!g_strcmp0(key, "status"))
216                         g_variant_get(var, "y", &(service.status));
217                 else if (!g_strcmp0(key, "role"))
218                         g_variant_get(var, "y", &(service.role));
219                 else if (!g_strcmp0(key, "config_method"))
220                         g_variant_get(var, "u", &(service.config_method));
221                 else if (!g_strcmp0(key, "instance_name"))
222                                 g_variant_get(var, "&s", &(service.instance_name));
223                 else if (!g_strcmp0(key, "service_type"))
224                                 g_variant_get(var, "&s", &(service.service_type));
225                 else if (!g_strcmp0(key, "service_info"))
226                         __g_variant_to_g_hash_table(var, service.service_info_map, false);
227                 else if (!g_strcmp0(key, "rsp_info"))
228                         g_variant_get(var, "&s", &(service.rsp_info));
229                 else
230                         ;/* Do Nothing */
231         }
232
233         result = asp_service_advertise(&service, 1);
234         g_hash_table_remove_all(service.service_info_map);
235         if (result < 0) {
236                 ASP_LOGE("Failed to change service status");
237                 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
238                 goto out;
239         }
240
241         asp_service_complete_advertise_service(object, invocation, result);
242
243 out:
244         g_variant_iter_free(iter);
245         __ASP_LOG_FUNC_EXIT__;
246         return TRUE;
247 }
248
249 static gboolean __asp_manager_gdbus_cancel_advertise_service(AspService *object,
250                 GDBusMethodInvocation *invocation,
251                 const guint adv_id,
252                 const guint tech,
253                 const gboolean *user_data)
254 {
255         __ASP_LOG_FUNC_ENTER__;
256         asp_service_advertise_s service;
257         asp_s *asp = NULL;
258         gint32 result = 0;
259
260         asp = (asp_s *)user_data;
261         if (!asp) {
262                 ASP_LOGE("Failed to get memory for asp structure");
263                 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
264                 goto out;
265         }
266
267         if (adv_id == 0) {
268                 ASP_LOGE("Invalid parameter");
269                 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
270                 goto out;
271         }
272         ASP_LOGD("advertisement ID [%u]", adv_id);
273
274         memset(&service, 0x0, sizeof(asp_service_advertise_s));
275         service.adv_id = adv_id;
276         service.discovery_tech = tech;
277         result = asp_service_cancel_advertise(&service);
278         if (result < 0) {
279                 ASP_LOGE("Failed to cancel advertise service");
280                 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
281                 goto out;
282         }
283
284         asp_service_complete_cancel_advertise_service(object, invocation, result);
285
286 out:
287         __ASP_LOG_FUNC_EXIT__;
288         return TRUE;
289 }
290
291 static gboolean __asp_manager_gdbus_seek_service(AspService *object,
292                 GDBusMethodInvocation *invocation,
293                 GVariant *parameters,
294                 const gboolean *user_data)
295 {
296         __ASP_LOG_FUNC_ENTER__;
297         GVariantIter *iter = NULL;
298         gchar *key = NULL;
299         GVariant *var = NULL;
300         asp_service_seek_s service;
301         asp_s *asp = NULL;
302         gint32 result = 0;
303         guint64 search_id = -1;
304
305         asp = (asp_s *)user_data;
306         if (!asp) {
307                 ASP_LOGE("Failed to get memory for asp structure");
308                 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
309                 goto out;
310         }
311         DEBUG_PARAMS(parameters);
312
313         memset(&service, 0, sizeof(asp_service_seek_s));
314         service.service_info_map = NULL;
315
316         g_variant_get(parameters, "a{sv}", &iter);
317         while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
318
319                 if (!g_strcmp0(key, "discovery_tech"))
320                         g_variant_get(var, "i", &(service.discovery_tech));
321                 else if (!g_strcmp0(key, "preferred_connection"))
322                         g_variant_get(var, "y", &(service.preferred_connection));
323                 else if (!g_strcmp0(key, "service_type"))
324                                 g_variant_get(var, "&s", &(service.service_type));
325                 else if (!g_strcmp0(key, "service_info")) {
326                         service.service_info_map = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
327                         __g_variant_to_g_hash_table(var, service.service_info_map, true);
328                 } else
329                         ;/* Do Nothing */
330         }
331
332         result = asp_service_seek(&service, &search_id);
333         g_hash_table_remove_all(service.service_info_map);
334         if (result < 0) {
335                 ASP_LOGE("Failed to seek service");
336                 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
337                 goto out;
338         }
339
340         asp_service_complete_seek_service(object, invocation, result, search_id);
341
342 out:
343         g_variant_iter_free(iter);
344         __ASP_LOG_FUNC_EXIT__;
345         return TRUE;
346 }
347
348 static gboolean __asp_manager_gdbus_cancel_seek_service(AspService *object,
349                 GDBusMethodInvocation *invocation,
350                 const guint64 search_id,
351                 const gboolean *user_data)
352 {
353         __ASP_LOG_FUNC_ENTER__;
354         asp_service_seek_s service;
355         asp_s *asp = NULL;
356         gint32 result = 0;
357
358         asp = (asp_s *)user_data;
359         if (!asp) {
360                 ASP_LOGE("Failed to get memory for asp structure");
361                 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
362                 goto out;
363         }
364
365         memset(&service, 0x0, sizeof(asp_service_seek_s));
366         service.search_id = search_id;
367         result = asp_service_cancel_seek(&service);
368         if (result < 0) {
369                 ASP_LOGE("Failed to cancel seek service");
370                 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
371                 goto out;
372         }
373
374         asp_service_complete_cancel_seek_service(object, invocation, result);
375
376 out:
377         __ASP_LOG_FUNC_EXIT__;
378         return TRUE;
379 }
380
381 static gboolean __asp_manager_gdbus_service_init(asp_s *asp)
382 {
383         __ASP_LOG_FUNC_ENTER__;
384         gboolean ret = TRUE;
385         gchar *s = NULL;
386
387         AspObjectSkeleton *object = NULL;
388         AspService *service = NULL;
389         s = g_strdup_printf(ASP_DBUS_SERVICE_ASP_SERVICE_PATH);
390
391         /* Add interface to default object path */
392         object = asp_object_skeleton_new(s);
393         g_free(s);
394
395         /* Make the newly created object export the interface
396          * net.asp.service (note
397          * that @object takes its own reference to @service).
398          */
399
400         service = asp_service_skeleton_new();
401         asp_object_skeleton_set_service(object, service);
402         g_object_unref(service);
403
404         /* Register for method callbacks as signal callbacks */
405
406         g_signal_connect(
407                         service,
408                         "handle-advertise-service",
409                         G_CALLBACK(__asp_manager_gdbus_advertise_service),
410                         asp);
411
412         g_signal_connect(
413                         service,
414                         "handle-service-change-status",
415                         G_CALLBACK(__asp_manager_gdbus_service_status_change),
416                         asp);
417
418         g_signal_connect(
419                         service,
420                         "handle-cancel-advertise-service",
421                         G_CALLBACK(__asp_manager_gdbus_cancel_advertise_service),
422                         asp);
423
424         g_signal_connect(
425                         service,
426                         "handle-seek-service",
427                         G_CALLBACK(__asp_manager_gdbus_seek_service),
428                         asp);
429
430         g_signal_connect(
431                         service,
432                         "handle-cancel-seek-service",
433                         G_CALLBACK(__asp_manager_gdbus_cancel_seek_service),
434                         asp);
435
436         /* Export the object (@manager takes its own reference to @object) */
437         g_dbus_object_manager_server_export(asp->obj_mgr, G_DBUS_OBJECT_SKELETON(object));
438         g_object_unref(object);
439
440         asp->service_obj = (gpointer)service;
441
442         __ASP_LOG_FUNC_EXIT__;
443         return ret;
444 }
445
446 static gboolean __asp_manager_gdbus_connect_session(AspSession *object,
447                 GDBusMethodInvocation *invocation,
448                 GVariant *parameters,
449                 const gboolean *user_data)
450 {
451         __ASP_LOG_FUNC_ENTER__;
452         GVariantIter *iter = NULL;
453         GVariant *var = NULL;
454         gchar *key = NULL;
455         gchar *str = NULL;
456         asp_s *asp = NULL;
457         guint8 service_mac[MAC_LEN] = {0,};
458         guint32 adv_id = 0;
459         guint8 * session_info = NULL;
460         size_t info_length = 0;
461         guint8 network_role = 0;
462         guint32 network_config = 0;
463         guint32 session_id = 0;
464         const gchar *service_mac_str = NULL;
465         gchar peer_ip_str[IPSTR_MAXLEN] = {0,};
466         gboolean res;
467
468         asp = (asp_s *)user_data;
469         if (!asp) {
470                 ASP_LOGE("Failed to get memory for asp structure");
471                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
472                 goto out;
473         }
474         DEBUG_PARAMS(parameters);
475
476         g_variant_get(parameters, "a{sv}", &iter);
477         while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
478
479                 if (!g_strcmp0(key, "service_mac")) {
480                         g_variant_get(var, "&s", &service_mac_str);
481                 } else if (!g_strcmp0(key, "adv_id")) {
482                         g_variant_get(var, "u", &adv_id);
483                 } else if (!g_strcmp0(key, "session_id")) {
484                         g_variant_get(var, "i", &session_id);
485                 } else if (!g_strcmp0(key, "role")) {
486                         g_variant_get(var, "y", &network_role);
487                 } else if (!g_strcmp0(key, "config_method")) {
488                         g_variant_get(var, "u", &network_config);
489                 } else if (!g_strcmp0(key, "peer_id")) {
490                         g_variant_get(var, "&s", &str);
491                         g_strlcpy(peer_ip_str, str, IPSTR_MAXLEN);
492                 }  else if (!g_strcmp0(key, "session_info")) {
493                         g_variant_get(var, "&s", &str);
494                         info_length = strlen(str);
495                         session_info = g_try_malloc0(info_length + 1);
496                         if (session_info == NULL) {
497                                 ASP_LOGE("Memory Failure");
498                                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_MEMORY);
499                                 goto out;
500                         }
501                         memcpy(session_info, str, info_length);
502                 } else {
503                         ;/* Do Nothing */
504                 }
505         }
506
507         if (service_mac_str == NULL) {
508                 ASP_LOGE("Invalid parameter");
509                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
510                 goto out;
511         }
512
513         if (strlen(service_mac_str) != 17) {
514                 ASP_LOGE("Invalid parameter");
515                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
516                 goto out;
517         }
518
519         /* TODO: need proper usage of CCEX
520          * If user wants to connect via infra structured,
521          */
522
523         /*
524         res = asp_session_connect_session_over_infa(peer_ip_str, adv_id,
525                         session_info, info_length, session_mac,  &session_id);
526         */
527
528         macaddr_atoe(service_mac_str, service_mac);
529         ASP_LOGD("service mac" MACSTR, MAC2STR(service_mac));
530         res = asp_session_connect_session_over_p2p(service_mac, adv_id,
531                         session_info, info_length, network_role, network_config,
532                         asp->p2p_local_address, &session_id);
533         if (!res) {
534                 ASP_LOGE("Operation Failed");
535                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
536                 goto out;
537         }
538
539         asp_session_complete_connect_session(object, invocation, ASP_ERROR_NONE,
540                         session_id, asp->p2p_local_address_str);
541
542 out:
543
544         g_variant_iter_free(iter);
545         __ASP_LOG_FUNC_EXIT__;
546         return TRUE;
547 }
548
549 static gboolean __asp_manager_gdbus_confirm_session(AspSession *object,
550                 GDBusMethodInvocation *invocation,
551                 GVariant *parameters,
552                 const gboolean *user_data)
553 {
554         __ASP_LOG_FUNC_ENTER__;
555         GVariantIter *iter = NULL;
556         gchar *key = NULL;
557         GVariant *var = NULL;
558         asp_s *asp = NULL;
559
560         const gchar *session_mac = NULL;
561         gint32 confirmed = 0;
562         const gchar *pin_str = NULL;
563         guint32 session_id = 0;
564         guint32 pin = 0;
565         guint8 mac_addr[MAC_LEN] = {0,};
566         gboolean res;
567
568         asp = (asp_s *)user_data;
569         if (!asp) {
570                 ASP_LOGE("Failed to get memory for asp structure");
571                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
572                 goto out;
573         }
574         DEBUG_PARAMS(parameters);
575
576         g_variant_get(parameters, "a{sv}", &iter);
577         while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
578                 if (!g_strcmp0(key, "session_mac"))
579                         g_variant_get(var, "&s", &session_mac);
580                 else if (!g_strcmp0(key, "session_id"))
581                         g_variant_get(var, "u", &session_id);
582                 else if (!g_strcmp0(key, "confirmed"))
583                         g_variant_get(var, "i", &confirmed);
584                 else if (!g_strcmp0(key, "pin"))
585                         g_variant_get(var, "&s", &pin_str);
586                 else
587                         ;/* Do Nothing */
588         }
589         if (session_mac == NULL) {
590                 ASP_LOGE("Invalid parameter");
591                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
592                 goto out;
593         }
594
595         if (strlen(session_mac) != 17) {
596                 ASP_LOGE("Invalid parameter");
597                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
598                 goto out;
599         }
600         ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
601
602         macaddr_atoe(session_mac, mac_addr);
603         if (pin_str != NULL)
604                 pin = (guint32)atoi(pin_str);
605         res = asp_session_confirm_session(mac_addr, session_id, confirmed, pin);
606         if (!res) {
607                 ASP_LOGE("Operation Failed");
608                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
609                 goto out;
610         }
611
612         asp_session_complete_confirm_session(object, invocation, ASP_ERROR_NONE);
613
614 out:
615         g_variant_iter_free(iter);
616         __ASP_LOG_FUNC_EXIT__;
617         return TRUE;
618 }
619
620 static gboolean __asp_manager_gdbus_get_session(AspSession *object,
621                 GDBusMethodInvocation *invocation,
622                 const gchar *session_mac,
623                 const guint session_id,
624                 const gboolean *user_data)
625 {
626         __ASP_LOG_FUNC_ENTER__;
627         GVariantBuilder *builder = NULL;
628         GVariant *session = NULL;
629         asp_s *asp = NULL;
630         guint8 mac_addr[MAC_LEN] = {0,};
631         guint32 adv_id = 0;
632         gint32 result = 0;
633
634         asp = (asp_s *)user_data;
635         if (!asp) {
636                 ASP_LOGE("Failed to get memory for asp structure");
637                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
638                 goto out;
639         }
640
641         if (session_mac == NULL) {
642                 ASP_LOGE("Invalid parameter");
643                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
644                 goto out;
645         }
646
647         if (strlen(session_mac) != 17) {
648                 ASP_LOGE("Invalid parameter");
649                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
650                 goto out;
651         }
652         ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
653
654         macaddr_atoe(session_mac, mac_addr);
655         if (!asp_session_get_advertisement_id(mac_addr, session_id, &adv_id)) {
656                 ASP_LOGE("Failed to get session");
657                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_SESSION_NOT_FOUND);
658                 goto out;
659         }
660
661         ASP_LOGD("adv id [%u]", adv_id);
662         builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
663         g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", adv_id));
664
665         session = g_variant_new("a{sv}", builder);
666         g_variant_builder_unref(builder);
667
668         asp_session_complete_get_session(object, invocation, result, session);
669 out:
670         __ASP_LOG_FUNC_EXIT__;
671         return TRUE;
672 }
673
674 static gboolean __asp_manager_gdbus_set_session_ready(AspSession *object,
675                 GDBusMethodInvocation *invocation,
676                 const gchar *session_mac,
677                 const guint session_id,
678                 const gboolean *user_data)
679 {
680         __ASP_LOG_FUNC_ENTER__;
681         asp_s *asp = NULL;
682         guint8 mac_addr[MAC_LEN] = {0,};
683         gboolean res;
684
685         asp = (asp_s *)user_data;
686         if (!asp) {
687                 ASP_LOGE("Failed to get memory for asp structure");
688                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
689                 goto out;
690         }
691
692         if (session_mac == NULL) {
693                 ASP_LOGE("Invalid parameter");
694                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
695                 goto out;
696         }
697
698         if (strlen(session_mac) != 17) {
699                 ASP_LOGE("Invalid parameter");
700                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
701                 goto out;
702         }
703         ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
704
705         macaddr_atoe(session_mac, mac_addr);
706         res = asp_session_set_session_ready(mac_addr, session_id);
707         if (!res) {
708                 ASP_LOGE("Operation Failed");
709                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
710                 goto out;
711         }
712
713         asp_session_complete_set_session_ready(object, invocation, ASP_ERROR_NONE);
714
715 out:
716         __ASP_LOG_FUNC_EXIT__;
717         return TRUE;
718 }
719
720 static gboolean __asp_manager_gdbus_close_session(AspSession *object,
721                 GDBusMethodInvocation *invocation,
722                 const gchar *session_mac,
723                 const guint session_id,
724                 const gboolean *user_data)
725 {
726         __ASP_LOG_FUNC_ENTER__;
727         asp_s *asp = NULL;
728         guint8 mac_addr[MAC_LEN] = {0,};
729         gboolean res;
730
731         asp = (asp_s *)user_data;
732         if (!asp) {
733                 ASP_LOGE("Failed to get memory for asp structure");
734                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
735                 goto out;
736         }
737
738         if (session_mac == NULL) {
739                 ASP_LOGE("Invalid parameter");
740                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
741                 goto out;
742         }
743
744         if (strlen(session_mac) != 17) {
745                 ASP_LOGE("Invalid parameter");
746                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
747                 goto out;
748         }
749         ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
750
751         macaddr_atoe(session_mac, mac_addr);
752         res = asp_session_close_session(mac_addr, session_id, 0);
753         if (!res) {
754                 ASP_LOGE("Operation Failed");
755                 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
756                 goto out;
757         }
758
759         asp_session_complete_close_session(object, invocation, ASP_ERROR_NONE);
760
761 out:
762         __ASP_LOG_FUNC_EXIT__;
763         return TRUE;
764 }
765
766 static gboolean __asp_manager_gdbus_session_init(asp_s *asp)
767 {
768         __ASP_LOG_FUNC_ENTER__;
769         gboolean ret = TRUE;
770         gchar *s = NULL;
771
772         AspObjectSkeleton *object = NULL;
773         AspSession *session = NULL;
774         s = g_strdup_printf(ASP_DBUS_SERVICE_ASP_SESSION_PATH);
775
776         /* Add interface to default object path */
777         object = asp_object_skeleton_new(s);
778         g_free(s);
779
780         /* Make the newly created object export the interface
781          * net.asp.session (note
782          * that @object takes its own reference to @session).
783          */
784
785         session = asp_session_skeleton_new();
786         asp_object_skeleton_set_session(object, session);
787         g_object_unref(session);
788
789         /* Register for method callbacks as signal callbacks */
790         g_signal_connect(
791                         session,
792                         "handle-connect-session",
793                         G_CALLBACK(__asp_manager_gdbus_connect_session),
794                         asp);
795
796         g_signal_connect(
797                         session,
798                         "handle-confirm-session",
799                         G_CALLBACK(__asp_manager_gdbus_confirm_session),
800                         asp);
801
802         g_signal_connect(
803                         session,
804                         "handle-get-session",
805                         G_CALLBACK(__asp_manager_gdbus_get_session),
806                         asp);
807
808         g_signal_connect(
809                         session,
810                         "handle-set-session-ready",
811                         G_CALLBACK(__asp_manager_gdbus_set_session_ready),
812                         asp);
813
814         g_signal_connect(
815                         session,
816                         "handle-close-session",
817                         G_CALLBACK(__asp_manager_gdbus_close_session),
818                         asp);
819
820         /* Export the object (@manager takes its own reference to @object) */
821         g_dbus_object_manager_server_export(asp->obj_mgr, G_DBUS_OBJECT_SKELETON(object));
822         g_object_unref(object);
823
824         asp->session_obj = (gpointer)session;
825
826         __ASP_LOG_FUNC_EXIT__;
827         return ret;
828 }
829
830 static void __asp_manager_gdbus_on_bus_acquired(GDBusConnection *connection,
831                 const gchar *name,
832                 gpointer user_data)
833 {
834         __ASP_LOG_FUNC_ENTER__;
835         asp_s* asp = (asp_s*)user_data;
836
837         asp->obj_mgr = g_dbus_object_manager_server_new("/net/asp");
838
839         ASP_LOGE("path : %s", name);
840
841         asp->connection = connection;
842
843         if (__asp_manager_gdbus_service_init(asp) == FALSE) {
844                 ASP_LOGE("Can not signal connect to service");
845                 /* Deinitialize and quit manager */
846         }
847         if (__asp_manager_gdbus_session_init(asp) == FALSE) {
848                 ASP_LOGE("Can not signal connect to session");
849                 /* Deinitialize and quit manager */
850         }
851
852         g_dbus_object_manager_server_set_connection(asp->obj_mgr, asp->connection);
853         __ASP_LOG_FUNC_EXIT__;
854 }
855
856 static void __asp_manager_gdbus_on_name_acquired(GDBusConnection *connection,
857                 const gchar *name,
858                 gpointer user_data)
859 {
860         ASP_LOGE("name : %s", name);
861 }
862
863 static void __asp_manager_gdbus_on_name_lost(GDBusConnection *connection,
864                 const gchar *name,
865                 gpointer user_data)
866 {
867         ASP_LOGE("name : %s", name);
868 }
869
870 static GVariant *__g_hash_table_to_g_variant(GHashTable *hash)
871 {
872         __ASP_LOG_FUNC_ENTER__;
873         GVariantBuilder builder;
874
875         g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}"));
876
877         GHashTableIter iter;
878         gpointer key, value;
879
880         g_hash_table_iter_init(&iter, hash);
881         while (g_hash_table_iter_next(&iter, &key, &value))
882                 g_variant_builder_add(&builder, "{sv}", key, g_variant_new_string(value));
883
884         __ASP_LOG_FUNC_EXIT__;
885         return g_variant_builder_end(&builder);
886 }
887
888 void asp_manager_gdbus_init(gpointer asp_manager)
889 {
890         __ASP_LOG_FUNC_ENTER__;
891         asp_s *asp = (asp_s *)asp_manager;
892         asp->gdbus_owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
893                         ASP_DBUS_SERVICE,
894                         G_BUS_NAME_OWNER_FLAGS_NONE,
895                         __asp_manager_gdbus_on_bus_acquired,
896                         __asp_manager_gdbus_on_name_acquired,
897                         __asp_manager_gdbus_on_name_lost,
898                         asp,
899                         NULL);
900         __ASP_LOG_FUNC_EXIT__;
901 }
902
903 void asp_manager_gdbus_deinit(gpointer asp_manager)
904 {
905         __ASP_LOG_FUNC_ENTER__;
906         asp_s *asp = (asp_s *)asp_manager;
907         g_bus_unown_name(asp->gdbus_owner_id);
908         asp->session_obj = NULL;
909         asp->service_obj = NULL;
910         __ASP_LOG_FUNC_EXIT__;
911 }
912
913 void asp_manager_gdbus_notify_advertise_status(guint32 adv_id, guint8 status, gint32 reason)
914 {
915         __ASP_LOG_FUNC_ENTER__;
916
917         AspService *service = asp_get_manager()->service_obj;
918         asp_service_emit_advertise_status_changed(service, adv_id, status, reason);
919
920         __ASP_LOG_FUNC_EXIT__;
921 }
922
923 void asp_manager_gdbus_notify_search_result(guint32 search_id,
924                                                                                 const gchar *service_mac,
925                                                                                 const gchar *service_device_name,
926                                                                                 guint32 adv_id,
927                                                                                 const gchar *instance_name,
928                                                                                 GHashTable *service_info_map,
929                                                                                 guint8 service_status)
930 {
931         __ASP_LOG_FUNC_ENTER__;
932
933         AspService *service = asp_get_manager()->service_obj;
934         GVariantBuilder *builder = NULL;
935         GVariant *params = NULL;
936
937         ASP_LOGD("Search ID: %u", search_id);
938         ASP_LOGD("Service MAC: %s", service_mac);
939         ASP_LOGD("Service Dev Name: %s", service_device_name);
940         ASP_LOGD("Advertisement ID: %u", adv_id);
941         ASP_LOGD("Instance Name: %s", instance_name);
942         ASP_LOGD("Service Status: %c", service_status);
943         builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
944         g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("u", search_id));
945         g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", service_mac));
946         if (service_device_name != NULL)
947                 g_variant_builder_add(builder, "{sv}", "service_device_name", g_variant_new("s", service_device_name));
948         g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", adv_id));
949
950         if (instance_name)
951                 g_variant_builder_add(builder, "{sv}", "instance_name", g_variant_new("s", instance_name));
952         if (service_info_map != NULL) {
953                 g_variant_builder_add(builder, "{sv}", "service_info", __g_hash_table_to_g_variant(service_info_map));
954                 g_hash_table_unref(service_info_map);
955         }
956         g_variant_builder_add(builder, "{sv}", "service_status", g_variant_new("y", service_status));
957
958         params = g_variant_new("a{sv}", builder);
959         g_variant_builder_unref(builder);
960
961         ASP_LOGD("Created parameter for search result signal");
962         asp_service_emit_search_result(service, params);
963
964         __ASP_LOG_FUNC_EXIT__;
965 }
966
967 void asp_manager_gdbus_notify_session_request(gint32 error_code,
968                 gchar * session_mac, guint32 session_id, guint32 adv_id,
969                 gchar * device_name, gchar * session_info,
970                 gboolean get_pin, gchar *pin)
971 {
972         __ASP_LOG_FUNC_ENTER__;
973
974         AspSession *session = asp_get_manager()->session_obj;
975         GVariantBuilder *builder = NULL;
976         GVariant *params = NULL;
977
978         builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
979         g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", adv_id));
980         g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", session_id));
981         g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", session_mac));
982         g_variant_builder_add(builder, "{sv}", "device_name", g_variant_new("s", device_name));
983         g_variant_builder_add(builder, "{sv}", "session_info", g_variant_new("s", session_info));
984         g_variant_builder_add(builder, "{sv}", "get_pin", g_variant_new("b", get_pin));
985         if (pin[0] != 0)
986                 g_variant_builder_add(builder, "{sv}", "pin", g_variant_new("s", pin));
987
988         params = g_variant_new("a{sv}", builder);
989         g_variant_builder_unref(builder);
990
991         ASP_LOGD("Created parameter for session requested signal");
992         asp_session_emit_session_request(session, params);
993
994         __ASP_LOG_FUNC_EXIT__;
995 }
996
997 void asp_manager_gdbus_notify_session_config_request(guint32 sessoin_id,
998                 gboolean get_pin, gchar *pin)
999 {
1000         __ASP_LOG_FUNC_ENTER__;
1001
1002         AspSession *session = asp_get_manager()->session_obj;
1003         GVariantBuilder *builder = NULL;
1004         GVariant *params = NULL;
1005
1006         builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1007         g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", sessoin_id));
1008         g_variant_builder_add(builder, "{sv}", "get_pin", g_variant_new("b", get_pin));
1009         if (pin[0] != 0)
1010                 g_variant_builder_add(builder, "{sv}", "pin", g_variant_new("s", pin));
1011
1012         params = g_variant_new("a{sv}", builder);
1013         g_variant_builder_unref(builder);
1014
1015         ASP_LOGD("Created parameter for session config requested signal");
1016         asp_session_emit_session_config_request(session, params);
1017
1018         __ASP_LOG_FUNC_EXIT__;
1019 }
1020
1021 void asp_manager_gdbus_notify_connect_status(gchar *session_mac,
1022                 guint32 session_id, gint32 status, gchar *deferred)
1023 {
1024         __ASP_LOG_FUNC_ENTER__;
1025
1026         AspSession *session = asp_get_manager()->session_obj;
1027         GVariantBuilder *builder = NULL;
1028         GVariant *params = NULL;
1029
1030         builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1031         g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", session_mac));
1032         g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", session_id));
1033         g_variant_builder_add(builder, "{sv}", "status", g_variant_new("i", status));
1034         g_variant_builder_add(builder, "{sv}", "deferred_resp", g_variant_new("s", deferred));
1035
1036         params = g_variant_new("a{sv}", builder);
1037         g_variant_builder_unref(builder);
1038
1039         ASP_LOGD("Created parameter for connect status signal");
1040         asp_session_emit_connect_status(session, params);
1041
1042         __ASP_LOG_FUNC_EXIT__;
1043 }
1044
1045 void asp_manager_gdbus_notify_session_status(gchar *session_mac,
1046                 guint32 session_id, gint32 state, gint32 status, const gchar *info)
1047 {
1048         __ASP_LOG_FUNC_ENTER__;
1049
1050         AspSession *session = asp_get_manager()->session_obj;
1051         GVariantBuilder *builder = NULL;
1052         GVariant *params = NULL;
1053
1054         builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1055         g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", session_mac));
1056         g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", session_id));
1057         g_variant_builder_add(builder, "{sv}", "state", g_variant_new("i", state));
1058         g_variant_builder_add(builder, "{sv}", "status", g_variant_new("i", status));
1059         if (info)
1060                 g_variant_builder_add(builder, "{sv}", "requested_info", g_variant_new("s", info));
1061
1062         params = g_variant_new("a{sv}", builder);
1063         g_variant_builder_unref(builder);
1064
1065         ASP_LOGD("Created parameter for session status signal");
1066         asp_session_emit_session_status(session, params);
1067
1068         __ASP_LOG_FUNC_EXIT__;
1069 }
1070
1071 void asp_manager_gdbus_notify_port_status(gchar * session_mac,
1072                 guint32 session_id, const gchar *ip, gint32 port, gint32 protocol,
1073                 gint32 status)
1074 {
1075         __ASP_LOG_FUNC_ENTER__;
1076
1077         AspSession *session = asp_get_manager()->session_obj;
1078         GVariantBuilder *builder = NULL;
1079         GVariant *params = NULL;
1080
1081         builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1082         g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", session_mac));
1083         g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", session_id));
1084         g_variant_builder_add(builder, "{sv}", "ip", g_variant_new("s", ip));
1085         g_variant_builder_add(builder, "{sv}", "port", g_variant_new("i", port));
1086         g_variant_builder_add(builder, "{sv}", "protocol", g_variant_new("i", protocol));
1087         g_variant_builder_add(builder, "{sv}", "status", g_variant_new("i", status));
1088
1089         params = g_variant_new("a{sv}", builder);
1090         g_variant_builder_unref(builder);
1091
1092         ASP_LOGD("Created parameter for port status signal");
1093         asp_session_emit_port_status(session, params);
1094
1095         __ASP_LOG_FUNC_EXIT__;
1096 }
1097