2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 /*****************************************************************************
19 *****************************************************************************/
27 /*****************************************************************************
29 *****************************************************************************/
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"
46 #include "generated-code.h"
48 /*****************************************************************************
50 *****************************************************************************/
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"
57 static const gchar *asp_err_strs[] = {
66 #define ASP_RETURN_SERVICE_ERR(invocation, err_num) g_dbus_method_invocation_return_dbus_error \
68 SERVICE_DBUS_ERROR_NAME, \
69 asp_err_strs[-(err_num)])
71 #define ASP_RETURN_SESSION_ERR(invocation, err_num) g_dbus_method_invocation_return_dbus_error \
73 SESSION_DBUS_ERROR_NAME, \
74 asp_err_strs[-(err_num)])
76 /*****************************************************************************
78 *****************************************************************************/
80 /*****************************************************************************
81 * Local Functions Definition
82 *****************************************************************************/
84 static void __g_variant_to_g_hash_table(GVariant *variant, GHashTable* hash, bool key_only)
86 GVariantIter *iter = NULL;
89 gchar *key_str = NULL;
90 gchar *value_str = NULL;
91 __ASP_LOG_FUNC_ENTER__;
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);
100 g_variant_get(variant, "a{sv}", &iter);
101 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
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);
108 __ASP_LOG_FUNC_EXIT__;
112 static gboolean __asp_manager_gdbus_advertise_service(AspService *object,
113 GDBusMethodInvocation *invocation,
114 GVariant *parameters,
115 const gboolean *user_data)
117 __ASP_LOG_FUNC_ENTER__;
118 GVariantIter *iter = NULL;
120 GVariant *var = NULL;
121 asp_service_advertise_s service;
125 asp = (asp_s *)user_data;
127 ASP_LOGE("Failed to get memory for asp structure");
128 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
131 DEBUG_PARAMS(parameters);
133 memset(&service, 0, sizeof(asp_service_advertise_s));
134 service.service_info_map = NULL;
136 g_variant_get(parameters, "a{sv}", &iter);
137 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
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));
166 result = asp_service_advertise(&service, 0);
167 g_hash_table_remove_all(service.service_info_map);
169 ASP_LOGE("Failed to advertise service");
170 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
174 asp_service_complete_advertise_service(object, invocation, result);
177 g_variant_iter_free(iter);
178 __ASP_LOG_FUNC_EXIT__;
182 static gboolean __asp_manager_gdbus_service_status_change(AspService *object,
183 GDBusMethodInvocation *invocation,
184 GVariant *parameters,
185 const gboolean *user_data)
187 __ASP_LOG_FUNC_ENTER__;
188 GVariantIter *iter = NULL;
190 GVariant *var = NULL;
191 asp_service_advertise_s service;
195 asp = (asp_s *)user_data;
197 ASP_LOGE("Failed to get memory for asp structure");
198 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
201 DEBUG_PARAMS(parameters);
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)) {
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));
233 result = asp_service_advertise(&service, 1);
234 g_hash_table_remove_all(service.service_info_map);
236 ASP_LOGE("Failed to change service status");
237 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
241 asp_service_complete_advertise_service(object, invocation, result);
244 g_variant_iter_free(iter);
245 __ASP_LOG_FUNC_EXIT__;
249 static gboolean __asp_manager_gdbus_cancel_advertise_service(AspService *object,
250 GDBusMethodInvocation *invocation,
253 const gboolean *user_data)
255 __ASP_LOG_FUNC_ENTER__;
256 asp_service_advertise_s service;
260 asp = (asp_s *)user_data;
262 ASP_LOGE("Failed to get memory for asp structure");
263 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
268 ASP_LOGE("Invalid parameter");
269 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
272 ASP_LOGD("advertisement ID [%u]", adv_id);
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);
279 ASP_LOGE("Failed to cancel advertise service");
280 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
284 asp_service_complete_cancel_advertise_service(object, invocation, result);
287 __ASP_LOG_FUNC_EXIT__;
291 static gboolean __asp_manager_gdbus_seek_service(AspService *object,
292 GDBusMethodInvocation *invocation,
293 GVariant *parameters,
294 const gboolean *user_data)
296 __ASP_LOG_FUNC_ENTER__;
297 GVariantIter *iter = NULL;
299 GVariant *var = NULL;
300 asp_service_seek_s service;
303 guint64 search_id = -1;
305 asp = (asp_s *)user_data;
307 ASP_LOGE("Failed to get memory for asp structure");
308 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
311 DEBUG_PARAMS(parameters);
313 memset(&service, 0, sizeof(asp_service_seek_s));
314 service.service_info_map = NULL;
316 g_variant_get(parameters, "a{sv}", &iter);
317 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
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);
332 result = asp_service_seek(&service, &search_id);
333 g_hash_table_remove_all(service.service_info_map);
335 ASP_LOGE("Failed to seek service");
336 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
340 asp_service_complete_seek_service(object, invocation, result, search_id);
343 g_variant_iter_free(iter);
344 __ASP_LOG_FUNC_EXIT__;
348 static gboolean __asp_manager_gdbus_cancel_seek_service(AspService *object,
349 GDBusMethodInvocation *invocation,
350 const guint64 search_id,
351 const gboolean *user_data)
353 __ASP_LOG_FUNC_ENTER__;
354 asp_service_seek_s service;
358 asp = (asp_s *)user_data;
360 ASP_LOGE("Failed to get memory for asp structure");
361 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
365 memset(&service, 0x0, sizeof(asp_service_seek_s));
366 service.search_id = search_id;
367 result = asp_service_cancel_seek(&service);
369 ASP_LOGE("Failed to cancel seek service");
370 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
374 asp_service_complete_cancel_seek_service(object, invocation, result);
377 __ASP_LOG_FUNC_EXIT__;
381 static gboolean __asp_manager_gdbus_service_init(asp_s *asp)
383 __ASP_LOG_FUNC_ENTER__;
387 AspObjectSkeleton *object = NULL;
388 AspService *service = NULL;
389 s = g_strdup_printf(ASP_DBUS_SERVICE_ASP_SERVICE_PATH);
391 /* Add interface to default object path */
392 object = asp_object_skeleton_new(s);
395 /* Make the newly created object export the interface
396 * net.asp.service (note
397 * that @object takes its own reference to @service).
400 service = asp_service_skeleton_new();
401 asp_object_skeleton_set_service(object, service);
402 g_object_unref(service);
404 /* Register for method callbacks as signal callbacks */
408 "handle-advertise-service",
409 G_CALLBACK(__asp_manager_gdbus_advertise_service),
414 "handle-service-change-status",
415 G_CALLBACK(__asp_manager_gdbus_service_status_change),
420 "handle-cancel-advertise-service",
421 G_CALLBACK(__asp_manager_gdbus_cancel_advertise_service),
426 "handle-seek-service",
427 G_CALLBACK(__asp_manager_gdbus_seek_service),
432 "handle-cancel-seek-service",
433 G_CALLBACK(__asp_manager_gdbus_cancel_seek_service),
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);
440 asp->service_obj = (gpointer)service;
442 __ASP_LOG_FUNC_EXIT__;
446 static gboolean __asp_manager_gdbus_connect_session(AspSession *object,
447 GDBusMethodInvocation *invocation,
448 GVariant *parameters,
449 const gboolean *user_data)
451 __ASP_LOG_FUNC_ENTER__;
452 GVariantIter *iter = NULL;
453 GVariant *var = NULL;
457 guint8 service_mac[MAC_LEN] = {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,};
468 asp = (asp_s *)user_data;
470 ASP_LOGE("Failed to get memory for asp structure");
471 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
474 DEBUG_PARAMS(parameters);
476 g_variant_get(parameters, "a{sv}", &iter);
477 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
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);
501 memcpy(session_info, str, info_length);
507 if (service_mac_str == NULL) {
508 ASP_LOGE("Invalid parameter");
509 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
513 if (strlen(service_mac_str) != 17) {
514 ASP_LOGE("Invalid parameter");
515 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
519 /* TODO: need proper usage of CCEX
520 * If user wants to connect via infra structured,
524 res = asp_session_connect_session_over_infa(peer_ip_str, adv_id,
525 session_info, info_length, session_mac, &session_id);
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);
534 ASP_LOGE("Operation Failed");
535 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
539 asp_session_complete_connect_session(object, invocation, ASP_ERROR_NONE,
540 session_id, asp->p2p_local_address_str);
544 g_variant_iter_free(iter);
545 __ASP_LOG_FUNC_EXIT__;
549 static gboolean __asp_manager_gdbus_confirm_session(AspSession *object,
550 GDBusMethodInvocation *invocation,
551 GVariant *parameters,
552 const gboolean *user_data)
554 __ASP_LOG_FUNC_ENTER__;
555 GVariantIter *iter = NULL;
557 GVariant *var = NULL;
560 const gchar *session_mac = NULL;
561 gint32 confirmed = 0;
562 const gchar *pin_str = NULL;
563 guint32 session_id = 0;
565 guint8 mac_addr[MAC_LEN] = {0,};
568 asp = (asp_s *)user_data;
570 ASP_LOGE("Failed to get memory for asp structure");
571 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
574 DEBUG_PARAMS(parameters);
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);
589 if (session_mac == NULL) {
590 ASP_LOGE("Invalid parameter");
591 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
595 if (strlen(session_mac) != 17) {
596 ASP_LOGE("Invalid parameter");
597 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
600 ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
602 macaddr_atoe(session_mac, mac_addr);
604 pin = (guint32)atoi(pin_str);
605 res = asp_session_confirm_session(mac_addr, session_id, confirmed, pin);
607 ASP_LOGE("Operation Failed");
608 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
612 asp_session_complete_confirm_session(object, invocation, ASP_ERROR_NONE);
615 g_variant_iter_free(iter);
616 __ASP_LOG_FUNC_EXIT__;
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)
626 __ASP_LOG_FUNC_ENTER__;
627 GVariantBuilder *builder = NULL;
628 GVariant *session = NULL;
630 guint8 mac_addr[MAC_LEN] = {0,};
634 asp = (asp_s *)user_data;
636 ASP_LOGE("Failed to get memory for asp structure");
637 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
641 if (session_mac == NULL) {
642 ASP_LOGE("Invalid parameter");
643 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
647 if (strlen(session_mac) != 17) {
648 ASP_LOGE("Invalid parameter");
649 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
652 ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
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);
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));
665 session = g_variant_new("a{sv}", builder);
666 g_variant_builder_unref(builder);
668 asp_session_complete_get_session(object, invocation, result, session);
670 __ASP_LOG_FUNC_EXIT__;
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)
680 __ASP_LOG_FUNC_ENTER__;
682 guint8 mac_addr[MAC_LEN] = {0,};
685 asp = (asp_s *)user_data;
687 ASP_LOGE("Failed to get memory for asp structure");
688 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
692 if (session_id == 0 || session_mac == NULL) {
693 ASP_LOGE("Invalid parameter");
694 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
698 if (strlen(session_mac) != 17) {
699 ASP_LOGE("Invalid parameter");
700 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
703 ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
705 macaddr_atoe(session_mac, mac_addr);
706 res = asp_session_set_session_ready(mac_addr, session_id);
708 ASP_LOGE("Operation Failed");
709 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
713 asp_session_complete_set_session_ready(object, invocation, ASP_ERROR_NONE);
716 __ASP_LOG_FUNC_EXIT__;
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)
726 __ASP_LOG_FUNC_ENTER__;
728 guint8 mac_addr[MAC_LEN] = {0,};
731 asp = (asp_s *)user_data;
733 ASP_LOGE("Failed to get memory for asp structure");
734 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
738 if (session_id == 0 || session_mac == NULL) {
739 ASP_LOGE("Invalid parameter");
740 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
744 if (strlen(session_mac) != 17) {
745 ASP_LOGE("Invalid parameter");
746 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
749 ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
751 macaddr_atoe(session_mac, mac_addr);
752 res = asp_session_close_session(mac_addr, session_id, 0);
754 ASP_LOGE("Operation Failed");
755 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
759 asp_session_complete_close_session(object, invocation, ASP_ERROR_NONE);
762 __ASP_LOG_FUNC_EXIT__;
766 static gboolean __asp_manager_gdbus_session_init(asp_s *asp)
768 __ASP_LOG_FUNC_ENTER__;
772 AspObjectSkeleton *object = NULL;
773 AspSession *session = NULL;
774 s = g_strdup_printf(ASP_DBUS_SERVICE_ASP_SESSION_PATH);
776 /* Add interface to default object path */
777 object = asp_object_skeleton_new(s);
780 /* Make the newly created object export the interface
781 * net.asp.session (note
782 * that @object takes its own reference to @session).
785 session = asp_session_skeleton_new();
786 asp_object_skeleton_set_session(object, session);
787 g_object_unref(session);
789 /* Register for method callbacks as signal callbacks */
792 "handle-connect-session",
793 G_CALLBACK(__asp_manager_gdbus_connect_session),
798 "handle-confirm-session",
799 G_CALLBACK(__asp_manager_gdbus_confirm_session),
804 "handle-get-session",
805 G_CALLBACK(__asp_manager_gdbus_get_session),
810 "handle-set-session-ready",
811 G_CALLBACK(__asp_manager_gdbus_set_session_ready),
816 "handle-close-session",
817 G_CALLBACK(__asp_manager_gdbus_close_session),
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);
824 asp->session_obj = (gpointer)session;
826 __ASP_LOG_FUNC_EXIT__;
830 static void __asp_manager_gdbus_on_bus_acquired(GDBusConnection *connection,
834 __ASP_LOG_FUNC_ENTER__;
835 asp_s* asp = (asp_s*)user_data;
837 asp->obj_mgr = g_dbus_object_manager_server_new("/net/asp");
839 ASP_LOGE("path : %s", name);
841 asp->connection = connection;
843 if (__asp_manager_gdbus_service_init(asp) == FALSE) {
844 ASP_LOGE("Can not signal connect to service");
845 /* Deinitialize and quit manager */
847 if (__asp_manager_gdbus_session_init(asp) == FALSE) {
848 ASP_LOGE("Can not signal connect to session");
849 /* Deinitialize and quit manager */
852 g_dbus_object_manager_server_set_connection(asp->obj_mgr, asp->connection);
853 __ASP_LOG_FUNC_EXIT__;
856 static void __asp_manager_gdbus_on_name_acquired(GDBusConnection *connection,
860 ASP_LOGE("name : %s", name);
863 static void __asp_manager_gdbus_on_name_lost(GDBusConnection *connection,
867 ASP_LOGE("name : %s", name);
870 static GVariant *__g_hash_table_to_g_variant(GHashTable *hash)
872 __ASP_LOG_FUNC_ENTER__;
873 GVariantBuilder builder;
875 g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}"));
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));
884 __ASP_LOG_FUNC_EXIT__;
885 return g_variant_builder_end(&builder);
888 void asp_manager_gdbus_init(gpointer asp_manager)
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,
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,
900 __ASP_LOG_FUNC_EXIT__;
903 void asp_manager_gdbus_deinit(gpointer asp_manager)
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__;
913 void asp_manager_gdbus_notify_advertise_status(guint32 adv_id, guint8 status, gint32 reason)
915 __ASP_LOG_FUNC_ENTER__;
917 AspService *service = asp_get_manager()->service_obj;
918 asp_service_emit_advertise_status_changed(service, adv_id, status, reason);
920 __ASP_LOG_FUNC_EXIT__;
923 void asp_manager_gdbus_notify_search_result(guint32 search_id,
924 const gchar *service_mac,
925 const gchar *service_device_name,
927 const gchar *instance_name,
928 GHashTable *service_info_map,
929 guint8 service_status)
931 __ASP_LOG_FUNC_ENTER__;
933 AspService *service = asp_get_manager()->service_obj;
934 GVariantBuilder *builder = NULL;
935 GVariant *params = NULL;
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));
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);
956 g_variant_builder_add(builder, "{sv}", "service_status", g_variant_new("y", service_status));
958 params = g_variant_new("a{sv}", builder);
959 g_variant_builder_unref(builder);
961 ASP_LOGD("Created parameter for search result signal");
962 asp_service_emit_search_result(service, params);
964 __ASP_LOG_FUNC_EXIT__;
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)
972 __ASP_LOG_FUNC_ENTER__;
974 AspSession *session = asp_get_manager()->session_obj;
975 GVariantBuilder *builder = NULL;
976 GVariant *params = NULL;
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));
986 g_variant_builder_add(builder, "{sv}", "pin", g_variant_new("s", pin));
988 params = g_variant_new("a{sv}", builder);
989 g_variant_builder_unref(builder);
991 ASP_LOGD("Created parameter for session requested signal");
992 asp_session_emit_session_request(session, params);
994 __ASP_LOG_FUNC_EXIT__;
997 void asp_manager_gdbus_notify_session_config_request(guint32 sessoin_id,
998 gboolean get_pin, gchar *pin)
1000 __ASP_LOG_FUNC_ENTER__;
1002 AspSession *session = asp_get_manager()->session_obj;
1003 GVariantBuilder *builder = NULL;
1004 GVariant *params = NULL;
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));
1010 g_variant_builder_add(builder, "{sv}", "pin", g_variant_new("s", pin));
1012 params = g_variant_new("a{sv}", builder);
1013 g_variant_builder_unref(builder);
1015 ASP_LOGD("Created parameter for session config requested signal");
1016 asp_session_emit_session_config_request(session, params);
1018 __ASP_LOG_FUNC_EXIT__;
1021 void asp_manager_gdbus_notify_connect_status(gchar *session_mac,
1022 guint32 session_id, gint32 status, gchar *deferred)
1024 __ASP_LOG_FUNC_ENTER__;
1026 AspSession *session = asp_get_manager()->session_obj;
1027 GVariantBuilder *builder = NULL;
1028 GVariant *params = NULL;
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));
1036 params = g_variant_new("a{sv}", builder);
1037 g_variant_builder_unref(builder);
1039 ASP_LOGD("Created parameter for connect status signal");
1040 asp_session_emit_connect_status(session, params);
1042 __ASP_LOG_FUNC_EXIT__;
1045 void asp_manager_gdbus_notify_session_status(gchar *session_mac,
1046 guint32 session_id, gint32 state, gint32 status, const gchar *info)
1048 __ASP_LOG_FUNC_ENTER__;
1050 AspSession *session = asp_get_manager()->session_obj;
1051 GVariantBuilder *builder = NULL;
1052 GVariant *params = NULL;
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));
1060 g_variant_builder_add(builder, "{sv}", "requested_info", g_variant_new("s", info));
1062 params = g_variant_new("a{sv}", builder);
1063 g_variant_builder_unref(builder);
1065 ASP_LOGD("Created parameter for session status signal");
1066 asp_session_emit_session_status(session, params);
1068 __ASP_LOG_FUNC_EXIT__;
1071 void asp_manager_gdbus_notify_port_status(gchar * session_mac,
1072 guint32 session_id, const gchar *ip, gint32 port, gint32 protocol,
1075 __ASP_LOG_FUNC_ENTER__;
1077 AspSession *session = asp_get_manager()->session_obj;
1078 GVariantBuilder *builder = NULL;
1079 GVariant *params = NULL;
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));
1089 params = g_variant_new("a{sv}", builder);
1090 g_variant_builder_unref(builder);
1092 ASP_LOGD("Created parameter for port status signal");
1093 asp_session_emit_port_status(session, params);
1095 __ASP_LOG_FUNC_EXIT__;