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);
129 __ASP_LOG_FUNC_EXIT__;
132 DEBUG_PARAMS(parameters);
134 memset(&service, 0, sizeof(asp_service_advertise_s));
135 service.service_info_map = NULL;
137 g_variant_get(parameters, "a{sv}", &iter);
139 ASP_LOGE("Failed to get iter");
140 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
141 __ASP_LOG_FUNC_EXIT__;
145 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
147 if (!g_strcmp0(key, "adv_id"))
148 g_variant_get(var, "u", &(service.adv_id));
149 else if (!g_strcmp0(key, "discovery_tech"))
150 g_variant_get(var, "i", &(service.discovery_tech));
151 else if (!g_strcmp0(key, "preferred_connection"))
152 g_variant_get(var, "y", &(service.preferred_connection));
153 else if (!g_strcmp0(key, "auto_accept"))
154 g_variant_get(var, "i", &(service.auto_accept));
155 else if (!g_strcmp0(key, "status"))
156 g_variant_get(var, "y", &(service.status));
157 else if (!g_strcmp0(key, "role"))
158 g_variant_get(var, "y", &(service.role));
159 else if (!g_strcmp0(key, "config_method"))
160 g_variant_get(var, "u", &(service.config_method));
161 else if (!g_strcmp0(key, "instance_name"))
162 g_variant_get(var, "&s", &(service.instance_name));
163 else if (!g_strcmp0(key, "service_type"))
164 g_variant_get(var, "&s", &(service.service_type));
165 else if (!g_strcmp0(key, "service_info")) {
166 service.service_info_map = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
167 __g_variant_to_g_hash_table(var, service.service_info_map, false);
168 } else if (!g_strcmp0(key, "rsp_info"))
169 g_variant_get(var, "&s", &(service.rsp_info));
174 result = asp_service_advertise(&service, 0);
175 g_hash_table_remove_all(service.service_info_map);
177 ASP_LOGE("Failed to advertise service");
178 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
182 asp_service_complete_advertise_service(object, invocation, result);
185 g_variant_iter_free(iter);
186 __ASP_LOG_FUNC_EXIT__;
190 static gboolean __asp_manager_gdbus_service_status_change(AspService *object,
191 GDBusMethodInvocation *invocation,
192 GVariant *parameters,
193 const gboolean *user_data)
195 __ASP_LOG_FUNC_ENTER__;
196 GVariantIter *iter = NULL;
198 GVariant *var = NULL;
199 asp_service_advertise_s service;
203 asp = (asp_s *)user_data;
205 ASP_LOGE("Failed to get memory for asp structure");
206 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
207 __ASP_LOG_FUNC_EXIT__;
210 DEBUG_PARAMS(parameters);
212 memset(&service, 0, sizeof(asp_service_advertise_s));
213 g_variant_get(parameters, "a{sv}", &iter);
215 ASP_LOGE("Failed to get iter");
216 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
217 __ASP_LOG_FUNC_EXIT__;
221 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
223 if (!g_strcmp0(key, "adv_id"))
224 g_variant_get(var, "u", &(service.adv_id));
225 else if (!g_strcmp0(key, "discovery_tech"))
226 g_variant_get(var, "i", &(service.discovery_tech));
227 else if (!g_strcmp0(key, "preferred_connection"))
228 g_variant_get(var, "y", &(service.preferred_connection));
229 else if (!g_strcmp0(key, "auto_accept"))
230 g_variant_get(var, "i", &(service.auto_accept));
231 else if (!g_strcmp0(key, "status"))
232 g_variant_get(var, "y", &(service.status));
233 else if (!g_strcmp0(key, "role"))
234 g_variant_get(var, "y", &(service.role));
235 else if (!g_strcmp0(key, "config_method"))
236 g_variant_get(var, "u", &(service.config_method));
237 else if (!g_strcmp0(key, "instance_name"))
238 g_variant_get(var, "&s", &(service.instance_name));
239 else if (!g_strcmp0(key, "service_type"))
240 g_variant_get(var, "&s", &(service.service_type));
241 else if (!g_strcmp0(key, "service_info"))
242 __g_variant_to_g_hash_table(var, service.service_info_map, false);
243 else if (!g_strcmp0(key, "rsp_info"))
244 g_variant_get(var, "&s", &(service.rsp_info));
249 result = asp_service_advertise(&service, 1);
250 g_hash_table_remove_all(service.service_info_map);
252 ASP_LOGE("Failed to change service status");
253 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
257 asp_service_complete_advertise_service(object, invocation, result);
260 g_variant_iter_free(iter);
261 __ASP_LOG_FUNC_EXIT__;
265 static gboolean __asp_manager_gdbus_cancel_advertise_service(AspService *object,
266 GDBusMethodInvocation *invocation,
269 const gboolean *user_data)
271 __ASP_LOG_FUNC_ENTER__;
272 asp_service_advertise_s service;
276 asp = (asp_s *)user_data;
278 ASP_LOGE("Failed to get memory for asp structure");
279 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
284 ASP_LOGE("Invalid parameter");
285 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
288 ASP_LOGD("advertisement ID [%u]", adv_id);
290 memset(&service, 0x0, sizeof(asp_service_advertise_s));
291 service.adv_id = adv_id;
292 service.discovery_tech = tech;
293 result = asp_service_cancel_advertise(&service);
295 ASP_LOGE("Failed to cancel advertise service");
296 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
300 asp_service_complete_cancel_advertise_service(object, invocation, result);
303 __ASP_LOG_FUNC_EXIT__;
307 static gboolean __asp_manager_gdbus_seek_service(AspService *object,
308 GDBusMethodInvocation *invocation,
309 GVariant *parameters,
310 const gboolean *user_data)
312 __ASP_LOG_FUNC_ENTER__;
313 GVariantIter *iter = NULL;
315 GVariant *var = NULL;
316 asp_service_seek_s service;
319 guint64 search_id = -1;
321 asp = (asp_s *)user_data;
323 ASP_LOGE("Failed to get memory for asp structure");
324 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
325 __ASP_LOG_FUNC_EXIT__;
328 DEBUG_PARAMS(parameters);
330 memset(&service, 0, sizeof(asp_service_seek_s));
331 service.service_info_map = NULL;
333 g_variant_get(parameters, "a{sv}", &iter);
335 ASP_LOGE("Failed to get iter");
336 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
337 __ASP_LOG_FUNC_EXIT__;
341 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
343 if (!g_strcmp0(key, "discovery_tech"))
344 g_variant_get(var, "i", &(service.discovery_tech));
345 else if (!g_strcmp0(key, "preferred_connection"))
346 g_variant_get(var, "y", &(service.preferred_connection));
347 else if (!g_strcmp0(key, "service_type"))
348 g_variant_get(var, "&s", &(service.service_type));
349 else if (!g_strcmp0(key, "service_info")) {
350 service.service_info_map = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
351 __g_variant_to_g_hash_table(var, service.service_info_map, true);
356 result = asp_service_seek(&service, &search_id);
357 g_hash_table_remove_all(service.service_info_map);
359 ASP_LOGE("Failed to seek service");
360 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
364 asp_service_complete_seek_service(object, invocation, result, search_id);
367 g_variant_iter_free(iter);
368 __ASP_LOG_FUNC_EXIT__;
372 static gboolean __asp_manager_gdbus_cancel_seek_service(AspService *object,
373 GDBusMethodInvocation *invocation,
374 const guint64 search_id,
376 const gboolean *user_data)
378 __ASP_LOG_FUNC_ENTER__;
379 asp_service_seek_s service;
383 asp = (asp_s *)user_data;
385 ASP_LOGE("Failed to get memory for asp structure");
386 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
390 memset(&service, 0x0, sizeof(asp_service_seek_s));
391 service.search_id = search_id;
392 service.discovery_tech = tech;
393 result = asp_service_cancel_seek(&service);
395 ASP_LOGE("Failed to cancel seek service");
396 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
400 asp_service_complete_cancel_seek_service(object, invocation, result);
403 __ASP_LOG_FUNC_EXIT__;
407 static gboolean __asp_manager_gdbus_service_init(asp_s *asp)
409 __ASP_LOG_FUNC_ENTER__;
413 AspObjectSkeleton *object = NULL;
414 AspService *service = NULL;
415 s = g_strdup_printf(ASP_DBUS_SERVICE_ASP_SERVICE_PATH);
417 /* Add interface to default object path */
418 object = asp_object_skeleton_new(s);
421 /* Make the newly created object export the interface
422 * net.asp.service (note
423 * that @object takes its own reference to @service).
426 service = asp_service_skeleton_new();
427 asp_object_skeleton_set_service(object, service);
428 g_object_unref(service);
430 /* Register for method callbacks as signal callbacks */
434 "handle-advertise-service",
435 G_CALLBACK(__asp_manager_gdbus_advertise_service),
440 "handle-service-change-status",
441 G_CALLBACK(__asp_manager_gdbus_service_status_change),
446 "handle-cancel-advertise-service",
447 G_CALLBACK(__asp_manager_gdbus_cancel_advertise_service),
452 "handle-seek-service",
453 G_CALLBACK(__asp_manager_gdbus_seek_service),
458 "handle-cancel-seek-service",
459 G_CALLBACK(__asp_manager_gdbus_cancel_seek_service),
462 /* Export the object (@manager takes its own reference to @object) */
463 g_dbus_object_manager_server_export(asp->obj_mgr, G_DBUS_OBJECT_SKELETON(object));
464 g_object_unref(object);
466 asp->service_obj = (gpointer)service;
468 __ASP_LOG_FUNC_EXIT__;
472 static gboolean __asp_manager_gdbus_connect_session(AspSession *object,
473 GDBusMethodInvocation *invocation,
474 GVariant *parameters,
475 const gboolean *user_data)
477 __ASP_LOG_FUNC_ENTER__;
478 GVariantIter *iter = NULL;
479 GVariant *var = NULL;
483 guint8 service_mac[MAC_LEN] = {0,};
485 guint8 * session_info = NULL;
486 size_t info_length = 0;
487 guint8 network_role = 0;
488 guint32 network_config = 0;
489 guint32 session_id = 0;
490 const gchar *service_mac_str = NULL;
491 gchar peer_ip_str[IPSTR_MAXLEN] = {0,};
494 asp = (asp_s *)user_data;
496 ASP_LOGE("Failed to get memory for asp structure");
497 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
498 __ASP_LOG_FUNC_EXIT__;
501 DEBUG_PARAMS(parameters);
503 g_variant_get(parameters, "a{sv}", &iter);
505 ASP_LOGE("Failed to get iter");
506 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
507 __ASP_LOG_FUNC_EXIT__;
511 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
513 if (!g_strcmp0(key, "service_mac")) {
514 g_variant_get(var, "&s", &service_mac_str);
515 } else if (!g_strcmp0(key, "adv_id")) {
516 g_variant_get(var, "u", &adv_id);
517 } else if (!g_strcmp0(key, "session_id")) {
518 g_variant_get(var, "i", &session_id);
519 } else if (!g_strcmp0(key, "role")) {
520 g_variant_get(var, "y", &network_role);
521 } else if (!g_strcmp0(key, "config_method")) {
522 g_variant_get(var, "u", &network_config);
523 } else if (!g_strcmp0(key, "peer_id")) {
524 g_variant_get(var, "&s", &str);
525 g_strlcpy(peer_ip_str, str, IPSTR_MAXLEN);
526 } else if (!g_strcmp0(key, "session_info")) {
528 g_variant_get(var, "&s", &str);
532 info_length = strlen(str);
533 g_free(session_info);
534 session_info = g_try_malloc0(info_length + 1);
535 if (session_info == NULL) {
536 ASP_LOGE("Memory Failure");
537 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_MEMORY);
540 memcpy(session_info, str, info_length);
546 if (service_mac_str == NULL) {
547 ASP_LOGE("Invalid parameter");
548 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
552 if (strlen(service_mac_str) != 17) {
553 ASP_LOGE("Invalid parameter");
554 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
558 /* TODO: need proper usage of CCEX
559 * If user wants to connect via infra structured,
563 res = asp_session_connect_session_over_infa(peer_ip_str, adv_id,
564 session_info, info_length, session_mac, &session_id);
567 macaddr_atoe(service_mac_str, service_mac);
568 ASP_LOGD("service mac" MACSTR, MAC2STR(service_mac));
569 res = asp_session_connect_session_over_p2p(service_mac, adv_id,
570 session_info, info_length, network_role, network_config,
571 asp->p2p_local_address, &session_id);
573 ASP_LOGE("Operation Failed");
574 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
578 asp_session_complete_connect_session(object, invocation, ASP_ERROR_NONE,
579 session_id, asp->p2p_local_address_str);
583 g_variant_iter_free(iter);
584 g_free(session_info);
585 __ASP_LOG_FUNC_EXIT__;
589 static gboolean __asp_manager_gdbus_confirm_session(AspSession *object,
590 GDBusMethodInvocation *invocation,
591 GVariant *parameters,
592 const gboolean *user_data)
594 __ASP_LOG_FUNC_ENTER__;
595 GVariantIter *iter = NULL;
597 GVariant *var = NULL;
600 const gchar *session_mac = NULL;
601 gint32 confirmed = 0;
602 const gchar *pin_str = NULL;
603 guint32 session_id = 0;
605 guint8 mac_addr[MAC_LEN] = {0,};
608 asp = (asp_s *)user_data;
610 ASP_LOGE("Failed to get memory for asp structure");
611 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
612 __ASP_LOG_FUNC_EXIT__;
615 DEBUG_PARAMS(parameters);
617 g_variant_get(parameters, "a{sv}", &iter);
619 ASP_LOGE("Failed to get iter");
620 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
621 __ASP_LOG_FUNC_EXIT__;
625 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
626 if (!g_strcmp0(key, "session_mac"))
627 g_variant_get(var, "&s", &session_mac);
628 else if (!g_strcmp0(key, "session_id"))
629 g_variant_get(var, "u", &session_id);
630 else if (!g_strcmp0(key, "confirmed"))
631 g_variant_get(var, "i", &confirmed);
632 else if (!g_strcmp0(key, "pin"))
633 g_variant_get(var, "&s", &pin_str);
637 if (session_mac == NULL) {
638 ASP_LOGE("Invalid parameter");
639 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
643 if (strlen(session_mac) != 17) {
644 ASP_LOGE("Invalid parameter");
645 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
648 ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
650 macaddr_atoe(session_mac, mac_addr);
652 pin = (guint32)atoi(pin_str);
653 res = asp_session_confirm_session(mac_addr, session_id, confirmed, pin);
655 ASP_LOGE("Operation Failed");
656 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
660 asp_session_complete_confirm_session(object, invocation, ASP_ERROR_NONE);
663 g_variant_iter_free(iter);
664 __ASP_LOG_FUNC_EXIT__;
668 static gboolean __asp_manager_gdbus_get_session(AspSession *object,
669 GDBusMethodInvocation *invocation,
670 const gchar *session_mac,
671 const guint session_id,
672 const gboolean *user_data)
674 __ASP_LOG_FUNC_ENTER__;
675 GVariantBuilder *builder = NULL;
676 GVariant *session = NULL;
678 guint8 mac_addr[MAC_LEN] = {0,};
682 asp = (asp_s *)user_data;
684 ASP_LOGE("Failed to get memory for asp structure");
685 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
689 if (session_mac == NULL) {
690 ASP_LOGE("Invalid parameter");
691 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
695 if (strlen(session_mac) != 17) {
696 ASP_LOGE("Invalid parameter");
697 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
700 ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
702 macaddr_atoe(session_mac, mac_addr);
703 if (!asp_session_get_advertisement_id(mac_addr, session_id, &adv_id)) {
704 ASP_LOGE("Failed to get session");
705 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_SESSION_NOT_FOUND);
709 ASP_LOGD("adv id [%u]", adv_id);
710 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
711 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", adv_id));
713 session = g_variant_new("a{sv}", builder);
714 g_variant_builder_unref(builder);
716 asp_session_complete_get_session(object, invocation, result, session);
718 __ASP_LOG_FUNC_EXIT__;
722 static gboolean __asp_manager_gdbus_set_session_ready(AspSession *object,
723 GDBusMethodInvocation *invocation,
724 const gchar *session_mac,
725 const guint session_id,
726 const gboolean *user_data)
728 __ASP_LOG_FUNC_ENTER__;
730 guint8 mac_addr[MAC_LEN] = {0,};
733 asp = (asp_s *)user_data;
735 ASP_LOGE("Failed to get memory for asp structure");
736 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
740 if (session_mac == NULL) {
741 ASP_LOGE("Invalid parameter");
742 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
746 if (strlen(session_mac) != 17) {
747 ASP_LOGE("Invalid parameter");
748 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
751 ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
753 macaddr_atoe(session_mac, mac_addr);
754 res = asp_session_set_session_ready(mac_addr, session_id);
756 ASP_LOGE("Operation Failed");
757 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
761 asp_session_complete_set_session_ready(object, invocation, ASP_ERROR_NONE);
764 __ASP_LOG_FUNC_EXIT__;
768 static gboolean __asp_manager_gdbus_close_session(AspSession *object,
769 GDBusMethodInvocation *invocation,
770 const gchar *session_mac,
771 const guint session_id,
772 const gboolean *user_data)
774 __ASP_LOG_FUNC_ENTER__;
776 guint8 mac_addr[MAC_LEN] = {0,};
779 asp = (asp_s *)user_data;
781 ASP_LOGE("Failed to get memory for asp structure");
782 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
786 if (session_mac == NULL) {
787 ASP_LOGE("Invalid parameter");
788 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
792 if (strlen(session_mac) != 17) {
793 ASP_LOGE("Invalid parameter");
794 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
797 ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
799 macaddr_atoe(session_mac, mac_addr);
800 res = asp_session_close_session(mac_addr, session_id, 0);
802 ASP_LOGE("Operation Failed");
803 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
807 asp_session_complete_close_session(object, invocation, ASP_ERROR_NONE);
810 __ASP_LOG_FUNC_EXIT__;
814 static gboolean __asp_manager_gdbus_bound_port(AspSession *object,
815 GDBusMethodInvocation *invocation,
816 GVariant *parameters,
817 const gboolean *user_data)
819 __ASP_LOG_FUNC_ENTER__;
820 GVariantIter *iter = NULL;
822 GVariant *var = NULL;
825 const gchar *session_mac = NULL;
826 guint32 session_id = 0;
827 const gchar *ip_address = NULL;
830 guint8 mac_addr[MAC_LEN] = {0,};
833 asp = (asp_s *)user_data;
835 ASP_LOGE("Failed to get memory for asp structure");
836 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
837 __ASP_LOG_FUNC_EXIT__;
840 DEBUG_PARAMS(parameters);
842 g_variant_get(parameters, "a{sv}", &iter);
844 ASP_LOGE("Failed to get iter");
845 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
846 __ASP_LOG_FUNC_EXIT__;
850 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
851 if (!g_strcmp0(key, "session_mac"))
852 g_variant_get(var, "&s", &session_mac);
853 else if (!g_strcmp0(key, "session_id"))
854 g_variant_get(var, "u", &session_id);
855 else if (!g_strcmp0(key, "ip_address"))
856 g_variant_get(var, "&s", &ip_address);
857 else if (!g_strcmp0(key, "port"))
858 g_variant_get(var, "i", &port);
859 else if (!g_strcmp0(key, "proto"))
860 g_variant_get(var, "i", &proto);
865 if (session_mac == NULL) {
866 ASP_LOGE("Invalid parameter");
867 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
871 if (strlen(session_mac) != 17) {
872 ASP_LOGE("Invalid parameter");
873 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
876 ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
878 macaddr_atoe(session_mac, mac_addr);
879 res = asp_session_bound_port(mac_addr, session_id, ip_address,
882 ASP_LOGE("Operation Failed");
883 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
887 asp_session_complete_bound_port(object, invocation, ASP_ERROR_NONE);
890 g_variant_iter_free(iter);
891 __ASP_LOG_FUNC_EXIT__;
895 static gboolean __asp_manager_gdbus_release_port(AspSession *object,
896 GDBusMethodInvocation *invocation,
897 GVariant *parameters,
898 const gboolean *user_data)
900 __ASP_LOG_FUNC_ENTER__;
901 GVariantIter *iter = NULL;
903 GVariant *var = NULL;
906 const gchar *session_mac = NULL;
907 guint32 session_id = 0;
908 const gchar *ip_address = NULL;
911 guint8 mac_addr[MAC_LEN] = {0,};
914 asp = (asp_s *)user_data;
916 ASP_LOGE("Failed to get memory for asp structure");
917 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
918 __ASP_LOG_FUNC_EXIT__;
921 DEBUG_PARAMS(parameters);
923 g_variant_get(parameters, "a{sv}", &iter);
925 ASP_LOGE("Failed to get iter");
926 ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
927 __ASP_LOG_FUNC_EXIT__;
931 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
932 if (!g_strcmp0(key, "session_mac"))
933 g_variant_get(var, "&s", &session_mac);
934 else if (!g_strcmp0(key, "session_id"))
935 g_variant_get(var, "u", &session_id);
936 else if (!g_strcmp0(key, "ip_address"))
937 g_variant_get(var, "&s", &ip_address);
938 else if (!g_strcmp0(key, "port"))
939 g_variant_get(var, "i", &port);
940 else if (!g_strcmp0(key, "proto"))
941 g_variant_get(var, "i", &proto);
946 if (session_mac == NULL) {
947 ASP_LOGE("Invalid parameter");
948 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
952 if (strlen(session_mac) != 17) {
953 ASP_LOGE("Invalid parameter");
954 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
957 ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
959 res = macaddr_atoe(session_mac, mac_addr);
961 ASP_LOGE("Operation Failed");
962 ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
966 asp_session_complete_release_port(object, invocation, ASP_ERROR_NONE);
969 g_variant_iter_free(iter);
970 __ASP_LOG_FUNC_EXIT__;
974 static gboolean __asp_manager_gdbus_session_init(asp_s *asp)
976 __ASP_LOG_FUNC_ENTER__;
980 AspObjectSkeleton *object = NULL;
981 AspSession *session = NULL;
982 s = g_strdup_printf(ASP_DBUS_SERVICE_ASP_SESSION_PATH);
984 /* Add interface to default object path */
985 object = asp_object_skeleton_new(s);
988 /* Make the newly created object export the interface
989 * net.asp.session (note
990 * that @object takes its own reference to @session).
993 session = asp_session_skeleton_new();
994 asp_object_skeleton_set_session(object, session);
995 g_object_unref(session);
997 /* Register for method callbacks as signal callbacks */
1000 "handle-connect-session",
1001 G_CALLBACK(__asp_manager_gdbus_connect_session),
1006 "handle-confirm-session",
1007 G_CALLBACK(__asp_manager_gdbus_confirm_session),
1012 "handle-get-session",
1013 G_CALLBACK(__asp_manager_gdbus_get_session),
1018 "handle-set-session-ready",
1019 G_CALLBACK(__asp_manager_gdbus_set_session_ready),
1024 "handle-close-session",
1025 G_CALLBACK(__asp_manager_gdbus_close_session),
1030 "handle-bound-port",
1031 G_CALLBACK(__asp_manager_gdbus_bound_port),
1036 "handle-release-port",
1037 G_CALLBACK(__asp_manager_gdbus_release_port),
1040 /* Export the object (@manager takes its own reference to @object) */
1041 g_dbus_object_manager_server_export(asp->obj_mgr, G_DBUS_OBJECT_SKELETON(object));
1042 g_object_unref(object);
1044 asp->session_obj = (gpointer)session;
1046 __ASP_LOG_FUNC_EXIT__;
1050 static void __asp_manager_gdbus_on_bus_acquired(GDBusConnection *connection,
1054 __ASP_LOG_FUNC_ENTER__;
1055 asp_s* asp = (asp_s*)user_data;
1057 asp->obj_mgr = g_dbus_object_manager_server_new("/net/asp");
1059 ASP_LOGE("path : %s", name);
1061 asp->connection = connection;
1063 if (__asp_manager_gdbus_service_init(asp) == FALSE) {
1064 ASP_LOGE("Can not signal connect to service");
1065 /* Deinitialize and quit manager */
1067 if (__asp_manager_gdbus_session_init(asp) == FALSE) {
1068 ASP_LOGE("Can not signal connect to session");
1069 /* Deinitialize and quit manager */
1072 g_dbus_object_manager_server_set_connection(asp->obj_mgr, asp->connection);
1073 __ASP_LOG_FUNC_EXIT__;
1076 static void __asp_manager_gdbus_on_name_acquired(GDBusConnection *connection,
1080 ASP_LOGE("name : %s", name);
1083 static void __asp_manager_gdbus_on_name_lost(GDBusConnection *connection,
1087 ASP_LOGE("name : %s", name);
1090 static GVariant *__g_hash_table_to_g_variant(GHashTable *hash)
1092 __ASP_LOG_FUNC_ENTER__;
1093 GVariantBuilder builder;
1095 g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}"));
1097 GHashTableIter iter;
1098 gpointer key, value;
1100 g_hash_table_iter_init(&iter, hash);
1101 while (g_hash_table_iter_next(&iter, &key, &value))
1102 g_variant_builder_add(&builder, "{sv}", key, g_variant_new_string(value));
1104 __ASP_LOG_FUNC_EXIT__;
1105 return g_variant_builder_end(&builder);
1108 void asp_manager_gdbus_init(gpointer asp_manager)
1110 __ASP_LOG_FUNC_ENTER__;
1111 asp_s *asp = (asp_s *)asp_manager;
1112 asp->gdbus_owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
1114 G_BUS_NAME_OWNER_FLAGS_NONE,
1115 __asp_manager_gdbus_on_bus_acquired,
1116 __asp_manager_gdbus_on_name_acquired,
1117 __asp_manager_gdbus_on_name_lost,
1120 __ASP_LOG_FUNC_EXIT__;
1123 void asp_manager_gdbus_deinit(gpointer asp_manager)
1125 __ASP_LOG_FUNC_ENTER__;
1126 asp_s *asp = (asp_s *)asp_manager;
1127 g_bus_unown_name(asp->gdbus_owner_id);
1128 asp->session_obj = NULL;
1129 asp->service_obj = NULL;
1130 __ASP_LOG_FUNC_EXIT__;
1133 void asp_manager_gdbus_notify_advertise_status(guint32 adv_id, guint8 status, gint32 reason)
1135 __ASP_LOG_FUNC_ENTER__;
1137 AspService *service = asp_get_manager()->service_obj;
1138 asp_service_emit_advertise_status_changed(service, adv_id, status, reason);
1140 __ASP_LOG_FUNC_EXIT__;
1143 void asp_manager_gdbus_notify_search_result(guint32 search_id,
1144 const gchar *service_mac,
1145 const gchar *service_device_name,
1147 const gchar *instance_name,
1148 GHashTable *service_info_map,
1149 guint8 service_status)
1151 __ASP_LOG_FUNC_ENTER__;
1153 AspService *service = asp_get_manager()->service_obj;
1154 GVariantBuilder *builder = NULL;
1155 GVariant *params = NULL;
1157 ASP_LOGD("Search ID: %u", search_id);
1158 ASP_LOGD("Service MAC: %s", service_mac);
1159 ASP_LOGD("Service Dev Name: %s", service_device_name);
1160 ASP_LOGD("Advertisement ID: %u", adv_id);
1161 ASP_LOGD("Instance Name: %s", instance_name);
1162 ASP_LOGD("Service Status: %c", service_status);
1163 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1164 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("u", search_id));
1165 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", service_mac));
1166 if (service_device_name != NULL)
1167 g_variant_builder_add(builder, "{sv}", "service_device_name", g_variant_new("s", service_device_name));
1168 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", adv_id));
1171 g_variant_builder_add(builder, "{sv}", "instance_name", g_variant_new("s", instance_name));
1172 if (service_info_map != NULL) {
1173 g_variant_builder_add(builder, "{sv}", "service_info", __g_hash_table_to_g_variant(service_info_map));
1174 g_hash_table_unref(service_info_map);
1176 g_variant_builder_add(builder, "{sv}", "service_status", g_variant_new("y", service_status));
1178 params = g_variant_new("a{sv}", builder);
1179 g_variant_builder_unref(builder);
1181 ASP_LOGD("Created parameter for search result signal");
1182 asp_service_emit_search_result(service, params);
1184 __ASP_LOG_FUNC_EXIT__;
1187 void asp_manager_gdbus_notify_session_request(gint32 error_code,
1188 gchar * session_mac, guint32 session_id, guint32 adv_id,
1189 gchar * device_name, gchar * session_info,
1190 gboolean get_pin, gchar *pin)
1192 __ASP_LOG_FUNC_ENTER__;
1194 AspSession *session = asp_get_manager()->session_obj;
1195 GVariantBuilder *builder = NULL;
1196 GVariant *params = NULL;
1198 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1199 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", adv_id));
1200 g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", session_id));
1201 g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", session_mac));
1202 g_variant_builder_add(builder, "{sv}", "device_name", g_variant_new("s", device_name));
1203 g_variant_builder_add(builder, "{sv}", "session_info", g_variant_new("s", session_info));
1204 g_variant_builder_add(builder, "{sv}", "get_pin", g_variant_new("b", get_pin));
1206 g_variant_builder_add(builder, "{sv}", "pin", g_variant_new("s", pin));
1208 params = g_variant_new("a{sv}", builder);
1209 g_variant_builder_unref(builder);
1211 ASP_LOGD("Created parameter for session requested signal");
1212 asp_session_emit_session_request(session, params);
1214 __ASP_LOG_FUNC_EXIT__;
1217 void asp_manager_gdbus_notify_session_config_request(gchar * session_mac,
1218 guint32 sessoin_id, gboolean get_pin, gchar *pin)
1220 __ASP_LOG_FUNC_ENTER__;
1222 AspSession *session = asp_get_manager()->session_obj;
1223 GVariantBuilder *builder = NULL;
1224 GVariant *params = NULL;
1226 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1227 g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", session_mac));
1228 g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", sessoin_id));
1229 g_variant_builder_add(builder, "{sv}", "get_pin", g_variant_new("b", get_pin));
1231 g_variant_builder_add(builder, "{sv}", "pin", g_variant_new("s", pin));
1233 params = g_variant_new("a{sv}", builder);
1234 g_variant_builder_unref(builder);
1236 ASP_LOGD("Created parameter for session config requested signal");
1237 asp_session_emit_session_config_request(session, params);
1239 __ASP_LOG_FUNC_EXIT__;
1242 void asp_manager_gdbus_notify_connect_status(gchar *session_mac,
1243 guint32 session_id, gint32 status, gchar *deferred)
1245 __ASP_LOG_FUNC_ENTER__;
1247 AspSession *session = asp_get_manager()->session_obj;
1248 GVariantBuilder *builder = NULL;
1249 GVariant *params = NULL;
1251 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1252 g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", session_mac));
1253 g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", session_id));
1254 g_variant_builder_add(builder, "{sv}", "status", g_variant_new("i", status));
1255 g_variant_builder_add(builder, "{sv}", "deferred_resp", g_variant_new("s", deferred));
1257 params = g_variant_new("a{sv}", builder);
1258 g_variant_builder_unref(builder);
1260 ASP_LOGD("Created parameter for connect status signal");
1261 asp_session_emit_connect_status(session, params);
1263 __ASP_LOG_FUNC_EXIT__;
1266 void asp_manager_gdbus_notify_session_status(gchar *session_mac,
1267 guint32 session_id, gint32 state, gint32 status, const gchar *info)
1269 __ASP_LOG_FUNC_ENTER__;
1271 AspSession *session = asp_get_manager()->session_obj;
1272 GVariantBuilder *builder = NULL;
1273 GVariant *params = NULL;
1275 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1276 g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", session_mac));
1277 g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", session_id));
1278 g_variant_builder_add(builder, "{sv}", "state", g_variant_new("i", state));
1279 g_variant_builder_add(builder, "{sv}", "status", g_variant_new("i", status));
1281 g_variant_builder_add(builder, "{sv}", "requested_info", g_variant_new("s", info));
1283 params = g_variant_new("a{sv}", builder);
1284 g_variant_builder_unref(builder);
1286 ASP_LOGD("Created parameter for session status signal");
1287 asp_session_emit_session_status(session, params);
1289 __ASP_LOG_FUNC_EXIT__;
1292 void asp_manager_gdbus_notify_port_status(gchar * session_mac,
1293 guint32 session_id, const gchar *ip, gint32 port, gint32 protocol,
1296 __ASP_LOG_FUNC_ENTER__;
1298 AspSession *session = asp_get_manager()->session_obj;
1299 GVariantBuilder *builder = NULL;
1300 GVariant *params = NULL;
1302 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1303 g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", session_mac));
1304 g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", session_id));
1305 g_variant_builder_add(builder, "{sv}", "ip", g_variant_new("s", ip));
1306 g_variant_builder_add(builder, "{sv}", "port", g_variant_new("i", port));
1307 g_variant_builder_add(builder, "{sv}", "protocol", g_variant_new("i", protocol));
1308 g_variant_builder_add(builder, "{sv}", "status", g_variant_new("i", status));
1310 params = g_variant_new("a{sv}", builder);
1311 g_variant_builder_unref(builder);
1313 ASP_LOGD("Created parameter for port status signal");
1314 asp_session_emit_port_status(session, params);
1316 __ASP_LOG_FUNC_EXIT__;