4 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
24 #include <vconf-keys.h>
26 #include "bt-service-common.h"
27 #include "bt-service-agent.h"
28 #include "bt-service-gap-agent.h"
29 #include "bt-service-adapter.h"
31 static DBusGConnection *connection = NULL;
34 GAP_AGENT_EXEC_NO_OPERATION,
35 GAP_AGENT_EXEC_PAIRING,
36 GAP_AGENT_EXEC_AUTHORZATION,
37 GAP_AGENT_EXEC_CONFIRM_MODE,
40 typedef struct _GapAgentPrivate GapAgentPrivate;
42 struct _GapAgentPrivate {
46 DBusGProxy *agent_manager;
47 DBusGProxy *dbus_proxy;
49 GapAgentExecType exec_type;
50 DBusGMethodInvocation *reply_context;
52 char pairing_addr[18];
53 char authorize_addr[18];
61 G_DEFINE_TYPE(GapAgent, gap_agent, G_TYPE_OBJECT);
63 static gboolean gap_agent_request_pin_code(GapAgent *agent,
65 DBusGMethodInvocation *context);
67 static gboolean gap_agent_request_passkey(GapAgent *agent, const char *path,
68 DBusGMethodInvocation *context);
70 static gboolean gap_agent_display_passkey(GapAgent *agent, const char *path,
72 DBusGMethodInvocation *context);
74 static gboolean gap_agent_request_confirmation(GapAgent *agent,
77 DBusGMethodInvocation *context);
79 static gboolean gap_agent_authorize_service(GapAgent *agent, const char *path,
81 DBusGMethodInvocation *context);
83 static gboolean gap_agent_request_authorization(GapAgent *agent,
85 DBusGMethodInvocation *context);
87 static gboolean gap_agent_cancel(GapAgent *agent,
88 DBusGMethodInvocation *context);
90 static gboolean gap_agent_release(GapAgent *agent,
91 DBusGMethodInvocation *context);
93 static gboolean gap_agent_confirm_mode_change(GapAgent *agent,
95 DBusGMethodInvocation *context);
97 static gboolean gap_agent_get_discoverable_timeout(GapAgent *agent,
98 DBusGMethodInvocation *context);
100 #include "bt-gap-agent-method.h"
103 GAP_AGENT_ERROR_REJECT,
104 GAP_AGENT_ERROR_CANCEL,
105 GAP_AGENT_ERROR_TIMEOUT,
108 #define GAP_AGENT_ERROR (gap_agent_error_quark())
110 static GQuark gap_agent_error_quark(void)
112 static GQuark quark = 0;
114 quark = g_quark_from_static_string("agent");
119 #define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
121 static GError *gap_agent_error(GapAgentError error, const char *err_msg)
123 return g_error_new(GAP_AGENT_ERROR, error, err_msg, NULL);
126 static void gap_agent_init(GapAgent *agent)
128 BT_DBG("agent %p\n", agent);
131 static void gap_agent_finalize(GObject *agent)
133 BT_DBG("Free agent %p\n", agent);
135 G_OBJECT_CLASS(gap_agent_parent_class)->finalize(agent);
138 static void gap_agent_class_init(GapAgentClass *klass)
140 GObjectClass *object_class = (GObjectClass *) klass;
141 GError *error = NULL;
143 BT_DBG("class %p\n", klass);
145 g_type_class_add_private(klass, sizeof(GapAgentPrivate));
147 object_class->finalize = gap_agent_finalize;
149 connection = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);
152 g_printerr("Connecting to system bus failed: %s\n",
157 dbus_g_object_type_install_info(GAP_TYPE_AGENT,
158 &dbus_glib_gap_agent_object_info);
161 GapAgent *_gap_agent_new(void)
165 agent = GAP_GET_AGENT(g_object_new(GAP_TYPE_AGENT, NULL));
167 BT_DBG("agent %p\n", agent);
172 static gboolean gap_agent_request_pin_code(GapAgent *agent,
174 DBusGMethodInvocation *context)
176 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
177 char *sender = dbus_g_method_get_sender(context);
179 DBusGConnection *conn;
186 BT_DBG("Request PIN : agent %p sender %s priv->busname %s Device Path :%s\n",
187 agent, sender, priv->busname, path);
189 if (g_strcmp0(sender, priv->busname) != 0) {
194 if (!priv->cb.passkey_func) {
199 conn = _bt_get_system_gconn();
205 device = dbus_g_proxy_new_for_name(conn, BT_BLUEZ_NAME,
206 path, BT_PROPERTIES_INTERFACE);
208 if (device == NULL) {
209 GError *error = gap_agent_error(GAP_AGENT_ERROR_REJECT,
210 "No proxy for device");
211 BT_DBG("Fail to make device proxy\n");
212 dbus_g_method_return_error(context, error);
218 priv->exec_type = GAP_AGENT_EXEC_PAIRING;
219 priv->reply_context = context;
221 addr = strstr(path, "dev_");
225 g_strlcpy(priv->pairing_addr, addr, sizeof(priv->pairing_addr));
227 while ((pos = strchr(priv->pairing_addr, '_')) != NULL) {
232 result = priv->cb.pincode_func(agent, device);
234 g_object_unref(device);
240 static gboolean gap_agent_request_passkey(GapAgent *agent, const char *path,
241 DBusGMethodInvocation *context)
243 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
244 char *sender = dbus_g_method_get_sender(context);
246 DBusGConnection *conn;
253 BT_DBG("Request passkey : agent %p sender %s priv->busname %s Device Path :%s\n", agent,
254 sender, priv->busname, path);
256 if (g_strcmp0(sender, priv->busname) != 0) {
261 if (!priv->cb.passkey_func) {
266 conn = _bt_get_system_gconn();
272 device = dbus_g_proxy_new_for_name(conn, BT_BLUEZ_NAME,
273 path, BT_PROPERTIES_INTERFACE);
275 if (device == NULL) {
276 GError *error = gap_agent_error(GAP_AGENT_ERROR_REJECT,
277 "No proxy for device");
278 BT_DBG("Fail to make device proxy\n");
279 dbus_g_method_return_error(context, error);
285 priv->exec_type = GAP_AGENT_EXEC_PAIRING;
286 priv->reply_context = context;
288 addr = strstr(path, "dev_");
292 g_strlcpy(priv->pairing_addr, addr, sizeof(priv->pairing_addr));
294 while ((pos = strchr(priv->pairing_addr, '_')) != NULL) {
299 result = priv->cb.passkey_func(agent, device);
301 g_object_unref(device);
308 static gboolean gap_agent_display_passkey(GapAgent *agent, const char *path,
310 DBusGMethodInvocation *context)
312 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
313 char *sender = dbus_g_method_get_sender(context);
315 DBusGConnection *conn;
321 BT_DBG("Request passkey display : agent %p sender %s priv->busname %s Device Path :%s\n",
322 agent, sender, priv->busname, path);
324 if (g_strcmp0(sender, priv->busname) != 0) {
329 if (!priv->cb.display_func) {
334 conn = _bt_get_system_gconn();
340 device = dbus_g_proxy_new_for_name(conn, BT_BLUEZ_NAME,
341 path, BT_PROPERTIES_INTERFACE);
343 if (device == NULL) {
344 GError *error = gap_agent_error(GAP_AGENT_ERROR_REJECT,
345 "No proxy for device");
346 BT_DBG("Fail to make device proxy\n");
347 dbus_g_method_return_error(context, error);
353 dbus_g_method_return(context);
355 result = priv->cb.display_func(agent, device, passkey);
357 g_object_unref(device);
363 static gboolean gap_agent_request_confirmation(GapAgent *agent,
366 DBusGMethodInvocation *context)
368 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
369 char *sender = dbus_g_method_get_sender(context);
371 DBusGConnection *conn;
378 BT_DBG("Request passkey confirmation : agent %p sender %s priv->busname %s Device Path :%s\n",
379 agent, sender, priv->busname, path);
381 if (g_strcmp0(sender, priv->busname) != 0) {
386 if (!priv->cb.confirm_func) {
391 conn = _bt_get_system_gconn();
397 device = dbus_g_proxy_new_for_name(conn, BT_BLUEZ_NAME,
398 path, BT_PROPERTIES_INTERFACE);
400 if (device == NULL) {
401 GError *error = gap_agent_error(GAP_AGENT_ERROR_REJECT,
402 "No proxy for device");
403 BT_DBG("Fail to make device proxy\n");
404 dbus_g_method_return_error(context, error);
410 priv->exec_type = GAP_AGENT_EXEC_PAIRING;
411 priv->reply_context = context;
413 addr = strstr(path, "dev_");
417 g_strlcpy(priv->pairing_addr, addr, sizeof(priv->pairing_addr));
419 while ((pos = strchr(priv->pairing_addr, '_')) != NULL) {
424 result = priv->cb.confirm_func(agent, device, passkey);
426 g_object_unref(device);
432 static gboolean gap_agent_authorize_service(GapAgent *agent, const char *path,
434 DBusGMethodInvocation *context)
436 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
437 char *sender = dbus_g_method_get_sender(context);
439 DBusGConnection *conn;
446 BT_DBG("Request authorization : agent %p sender %s priv->busname %s Device Path :%s\n", agent,
447 sender, priv->busname, path);
449 if (g_strcmp0(sender, priv->busname) != 0) {
454 if (!priv->cb.authorize_func) {
459 conn = _bt_get_system_gconn();
465 device = dbus_g_proxy_new_for_name(conn, BT_BLUEZ_NAME,
466 path, BT_PROPERTIES_INTERFACE);
468 if (device == NULL) {
469 GError *error = gap_agent_error(GAP_AGENT_ERROR_REJECT,
470 "No proxy for device");
471 BT_DBG("Fail to make device proxy\n");
472 dbus_g_method_return_error(context, error);
478 priv->exec_type = GAP_AGENT_EXEC_AUTHORZATION;
479 priv->reply_context = context;
481 addr = strstr(path, "dev_");
485 g_strlcpy(priv->authorize_addr, addr,
486 sizeof(priv->authorize_addr));
488 while ((pos = strchr(priv->authorize_addr, '_')) != NULL) {
493 result = priv->cb.authorize_func(agent, device, uuid);
495 g_object_unref(device);
501 static gboolean gap_agent_request_authorization(GapAgent *agent,
503 DBusGMethodInvocation *context)
507 dbus_g_method_return(context);
511 static gboolean gap_agent_confirm_mode_change(GapAgent *agent,
513 DBusGMethodInvocation *context)
517 dbus_g_method_return(context);
521 static gboolean gap_agent_cancel(GapAgent *agent,
522 DBusGMethodInvocation *context)
524 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
525 char *sender = dbus_g_method_get_sender(context);
526 gboolean result = FALSE;
531 BT_DBG("Cancelled : agent %p sender %s\n", agent, sender);
533 if (g_strcmp0(sender, priv->busname) != 0) {
538 if (priv->cb.authorization_cancel_func &&
539 priv->exec_type == GAP_AGENT_EXEC_AUTHORZATION) {
540 result = priv->cb.authorization_cancel_func(agent,
541 priv->authorize_addr);
542 memset(priv->authorize_addr, 0x00,
543 sizeof(priv->authorize_addr));
544 } else if (priv->cb.pairing_cancel_func &&
545 priv->exec_type == GAP_AGENT_EXEC_PAIRING) {
546 result = priv->cb.pairing_cancel_func(agent,
548 memset(priv->pairing_addr, 0x00, sizeof(priv->pairing_addr));
551 if (priv->exec_type != GAP_AGENT_EXEC_CONFIRM_MODE &&
552 priv->exec_type != GAP_AGENT_EXEC_NO_OPERATION &&
553 priv->reply_context != NULL) {
554 GError *error = gap_agent_error(GAP_AGENT_ERROR_REJECT,
555 "Rejected by remote cancel");
556 dbus_g_method_return_error(priv->reply_context, error);
560 priv->exec_type = GAP_AGENT_EXEC_NO_OPERATION;
561 priv->reply_context = NULL;
567 static gboolean gap_agent_release(GapAgent *agent,
568 DBusGMethodInvocation *context)
570 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
571 char *sender = dbus_g_method_get_sender(context);
576 BT_DBG("Released : agent %p sender %s\n", agent, sender);
578 if (g_strcmp0(sender, priv->busname) != 0) {
583 dbus_g_method_return(context);
585 priv->exec_type = GAP_AGENT_EXEC_NO_OPERATION;
586 priv->reply_context = NULL;
588 memset(priv->pairing_addr, 0x00, sizeof(priv->pairing_addr));
589 memset(priv->authorize_addr, 0x00, sizeof(priv->authorize_addr));
595 static bt_agent_osp_server_t *__gap_agent_find_server(GSList *servers,
600 bt_agent_osp_server_t *transfer;
602 for (l = servers; l != NULL; l = l->next) {
605 if (transfer == NULL)
608 /* No uuid in obex server */
609 if (type == BT_OBEX_SERVER &&
610 transfer->type == BT_OBEX_SERVER)
613 if (g_strcmp0(transfer->uuid, uuid) == 0)
620 static void __gap_agent_remove_osp_servers(GSList *osp_servers)
623 bt_agent_osp_server_t *server;
625 for (l = osp_servers; l != NULL; l = g_slist_next(l)) {
631 g_free(server->uuid);
636 gboolean _gap_agent_register_osp_server(GapAgent *agent,
640 bt_agent_osp_server_t *server;
644 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
649 /* type: BT_OBEX_SERVER / BT_RFCOMM_SERVER*/
650 if (type > BT_RFCOMM_SERVER)
653 server = g_malloc0(sizeof(bt_agent_osp_server_t));
657 if (type == BT_RFCOMM_SERVER)
658 server->uuid = g_strdup(uuid);
660 priv->osp_servers = g_slist_append(priv->osp_servers, server);
667 gboolean _gap_agent_unregister_osp_server(GapAgent *agent,
671 bt_agent_osp_server_t *server;
675 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
680 /* type: BT_OBEX_SERVER / BT_RFCOMM_SERVER*/
681 if (type > BT_RFCOMM_SERVER)
684 server = __gap_agent_find_server(priv->osp_servers, type, uuid);
689 priv->osp_servers = g_slist_remove(priv->osp_servers, server);
691 g_free(server->uuid);
699 gboolean gap_agent_reply_pin_code(GapAgent *agent, const guint accept,
700 const char *pin_code,
701 DBusGMethodInvocation *context)
705 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
707 if (priv->exec_type != GAP_AGENT_EXEC_NO_OPERATION &&
708 priv->reply_context != NULL) {
709 if (accept == GAP_AGENT_ACCEPT) {
710 dbus_g_method_return(priv->reply_context, pin_code);
711 priv->canceled = FALSE;
713 GError *error = NULL;
715 case GAP_AGENT_CANCEL:
716 error = gap_agent_error(GAP_AGENT_ERROR_CANCEL,
718 priv->canceled = TRUE;
720 case GAP_AGENT_TIMEOUT:
721 case GAP_AGENT_REJECT:
723 error = gap_agent_error(GAP_AGENT_ERROR_REJECT,
724 "Pairing request rejected");
725 priv->canceled = FALSE;
728 dbus_g_method_return_error(priv->reply_context, error);
733 priv->exec_type = GAP_AGENT_EXEC_NO_OPERATION;
734 priv->reply_context = NULL;
735 memset(priv->pairing_addr, 0x00, sizeof(priv->pairing_addr));
742 gboolean gap_agent_reply_passkey(GapAgent *agent, const guint accept,
744 DBusGMethodInvocation *context)
748 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
750 if (priv->exec_type != GAP_AGENT_EXEC_NO_OPERATION &&
751 priv->reply_context != NULL) {
752 if (accept == GAP_AGENT_ACCEPT) {
753 guint pass_key = atoi(passkey);
754 dbus_g_method_return(priv->reply_context, pass_key);
755 priv->canceled = FALSE;
757 GError *error = NULL;
759 case GAP_AGENT_CANCEL:
760 error = gap_agent_error(GAP_AGENT_ERROR_CANCEL,
762 priv->canceled = TRUE;
764 case GAP_AGENT_TIMEOUT:
765 case GAP_AGENT_REJECT:
767 error = gap_agent_error(GAP_AGENT_ERROR_REJECT,
768 "Passkey request rejected");
769 priv->canceled = FALSE;
772 dbus_g_method_return_error(priv->reply_context, error);
777 priv->exec_type = GAP_AGENT_EXEC_NO_OPERATION;
778 priv->reply_context = NULL;
779 memset(priv->pairing_addr, 0x00, sizeof(priv->pairing_addr));
786 gboolean gap_agent_reply_confirmation(GapAgent *agent, const guint accept,
787 DBusGMethodInvocation *context)
791 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
793 if (priv->exec_type != GAP_AGENT_EXEC_NO_OPERATION &&
794 priv->reply_context != NULL) {
795 if (accept == GAP_AGENT_ACCEPT) {
796 dbus_g_method_return(priv->reply_context);
797 priv->canceled = FALSE;
799 GError *error = NULL;
801 case GAP_AGENT_CANCEL:
802 error = gap_agent_error(GAP_AGENT_ERROR_CANCEL,
804 priv->canceled = TRUE;
806 case GAP_AGENT_TIMEOUT:
807 case GAP_AGENT_REJECT:
809 error = gap_agent_error(GAP_AGENT_ERROR_REJECT,
810 "Confirmation request rejected");
811 priv->canceled = FALSE;
814 dbus_g_method_return_error(priv->reply_context, error);
819 priv->exec_type = GAP_AGENT_EXEC_NO_OPERATION;
820 priv->reply_context = NULL;
821 memset(priv->pairing_addr, 0x00, sizeof(priv->pairing_addr));
828 gboolean gap_agent_reply_authorize(GapAgent *agent, const guint accept,
829 DBusGMethodInvocation *context)
835 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
837 if (priv->exec_type != GAP_AGENT_EXEC_NO_OPERATION &&
838 priv->reply_context != NULL) {
839 if (accept == GAP_AGENT_ACCEPT) {
840 dbus_g_method_return(priv->reply_context);
842 GError *error = NULL;
844 case GAP_AGENT_CANCEL:
845 error = gap_agent_error(GAP_AGENT_ERROR_CANCEL,
848 case GAP_AGENT_TIMEOUT:
849 case GAP_AGENT_REJECT:
851 error = gap_agent_error(GAP_AGENT_ERROR_REJECT,
852 "Authorization request rejected");
855 dbus_g_method_return_error(priv->reply_context, error);
860 dbus_g_method_return(context);
862 GError *error = gap_agent_error(GAP_AGENT_ERROR_REJECT,
864 BT_DBG("No context");
867 dbus_g_method_return_error(context, error);
873 priv->exec_type = GAP_AGENT_EXEC_NO_OPERATION;
874 priv->reply_context = NULL;
875 memset(priv->authorize_addr, 0x00, sizeof(priv->authorize_addr));
882 static gboolean gap_agent_get_discoverable_timeout(GapAgent *agent,
883 DBusGMethodInvocation *context)
889 _bt_get_timeout_value(&timeout);
891 dbus_g_method_return(context, timeout);
898 gboolean _gap_agent_register(GapAgent *agent)
900 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
901 DBusGProxy *agent_manager;
902 GError *error = NULL;
904 retv_if(priv == NULL, FALSE);
905 retv_if(connection == NULL, FALSE);
907 if (priv->agent_manager == NULL) {
908 agent_manager = dbus_g_proxy_new_for_name(connection,
909 BT_BLUEZ_NAME, BT_BLUEZ_PATH,
910 BT_AGENT_MANAGER_INTERFACE);
912 retv_if(agent_manager == NULL, FALSE);
914 agent_manager = priv->agent_manager;
917 dbus_g_proxy_call(agent_manager, "RegisterAgent", &error,
918 DBUS_TYPE_G_OBJECT_PATH, priv->path,
919 G_TYPE_STRING, "DisplayYesNo", G_TYPE_INVALID,
922 BT_DBG("Agent registration failed: %s\n", error->message);
924 g_object_unref(agent_manager);
925 priv->agent_manager = NULL;
929 /* Set the defalut agent */
930 dbus_g_proxy_call(agent_manager, "RequestDefaultAgent", &error,
931 DBUS_TYPE_G_OBJECT_PATH, priv->path,
932 G_TYPE_INVALID, G_TYPE_INVALID);
935 BT_DBG("Request agent failed: %s\n", error->message);
937 g_object_unref(agent_manager);
938 priv->agent_manager = NULL;
942 priv->agent_manager = agent_manager;
947 static gboolean __gap_agent_unregister(GapAgent *agent)
949 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
950 DBusGProxy *agent_manager;
951 GError *error = NULL;
953 retv_if(priv == NULL, FALSE);
954 retv_if(priv->path == NULL, FALSE);
955 retv_if(connection == NULL, FALSE);
957 if (priv->agent_manager == NULL) {
958 agent_manager = dbus_g_proxy_new_for_name(connection,
959 BT_BLUEZ_NAME, BT_BLUEZ_PATH,
960 BT_AGENT_MANAGER_INTERFACE);
962 retv_if(agent_manager == NULL, FALSE);
964 agent_manager = priv->agent_manager;
967 dbus_g_proxy_call(agent_manager, "UnregisterAgent", &error,
968 DBUS_TYPE_G_OBJECT_PATH, priv->path,
969 G_TYPE_INVALID, G_TYPE_INVALID);
971 g_object_unref(agent_manager);
972 priv->agent_manager = NULL;
975 BT_DBG("Agent unregistration failed: %s\n", error->message);
983 void _gap_agent_setup_dbus(GapAgent *agent, GAP_AGENT_FUNC_CB *func_cb,
986 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
990 priv->path = g_strdup(path);
992 object = dbus_g_connection_lookup_g_object(connection, priv->path);
994 g_object_unref(object);
996 dbus_g_connection_register_g_object(connection, priv->path,
999 memcpy(&priv->cb, func_cb, sizeof(GAP_AGENT_FUNC_CB));
1001 priv->exec_type = GAP_AGENT_EXEC_NO_OPERATION;
1002 memset(priv->pairing_addr, 0x00, sizeof(priv->pairing_addr));
1003 memset(priv->authorize_addr, 0x00, sizeof(priv->authorize_addr));
1004 priv->reply_context = NULL;
1006 proxy = dbus_g_proxy_new_for_name_owner(connection,
1012 if (proxy != NULL) {
1013 priv->busname = g_strdup(dbus_g_proxy_get_bus_name(proxy));
1014 g_object_unref(proxy);
1016 priv->busname = NULL;
1020 void _gap_agent_reset_dbus(GapAgent *agent)
1022 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
1024 __gap_agent_unregister(agent);
1026 dbus_g_connection_unregister_g_object(connection, G_OBJECT(agent));
1028 if (priv->osp_servers) {
1029 __gap_agent_remove_osp_servers(priv->osp_servers);
1030 g_slist_free(priv->osp_servers);
1031 priv->osp_servers = NULL;
1034 if (priv->adapter) {
1035 g_object_unref(priv->adapter);
1036 priv->adapter = NULL;
1042 g_free(priv->busname);
1043 priv->busname = NULL;
1046 gboolean _gap_agent_exist_osp_server(GapAgent *agent, int type, char *uuid)
1048 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
1053 if (__gap_agent_find_server(priv->osp_servers,
1054 type, uuid) != NULL) {
1061 gchar* _gap_agent_get_path(GapAgent *agent)
1063 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
1068 gboolean _gap_agent_is_canceled(GapAgent *agent)
1070 GapAgentPrivate *priv = GAP_AGENT_GET_PRIVATE(agent);
1072 return priv->canceled;