static int register_pending_cnt = 0;
static bool is_server_started = false;
+GCancellable *register_cancel;
+
/* Introspection data for the service we are exporting */
static const gchar service_introspection_xml[] =
"<node name='/'>"
parameters = g_variant_new("(a{sv}as)", inner_builder, invalidated_builder);
g_variant_builder_unref(invalidated_builder);
g_variant_builder_unref(inner_builder);
- } else if (BLUETOOTH_EVENT_GATT_SERVER_READ_REQUESTED) {
+ } else if (event == BLUETOOTH_EVENT_GATT_SERVER_READ_REQUESTED) {
GVariantBuilder *inner_builder;
GVariantBuilder *invalidated_builder;
parameters = g_variant_new("(a{sv}as)", inner_builder, invalidated_builder);
g_variant_builder_unref(invalidated_builder);
g_variant_builder_unref(inner_builder);
+ } else {
+ g_varaiant_unref(var);
}
msg = g_dbus_message_new_signal(BT_HPS_OBJECT_PATH, BT_HPS_INTERFACE_NAME, PROPERTIES_CHANGED);
#endif
}
}
+ g_object_unref(invocation);
+ return;
} else if (g_strcmp0(method_name, "StopNotify") == 0) {
bt_user_info_t *user_info = NULL;
bt_gatt_char_notify_change_t notify_change = {0, };
#endif
}
}
+ g_object_unref(invocation);
+ return;
} else if (g_strcmp0(method_name, "IndicateConfirm") == 0) {
gchar *addr = NULL;
bt_gatt_indicate_confirm_t confirm = {0, };
int n_char = 1;
BT_DBG(" ");
- result = g_dbus_proxy_call_finish(manager_gproxy, res, &error);
+ result = g_dbus_proxy_call_finish(G_DBUS_PROXY(object), res, &error);
if (result == NULL) {
/* dBUS-RPC is failed */
register_pending_cnt = 0;
- result = g_dbus_proxy_call_finish(manager_gproxy, res, &error);
-
- if (result == NULL) {
- /* dBUS-RPC is failed */
- BT_ERR("Dbus-RPC is failed\n");
-
- if (error != NULL) {
- /* dBUS gives error cause */
- BT_ERR("D-Bus API failure: errCode[%x], message[%s]\n",
- error->code, error->message);
- g_clear_error(&error);
- }
- } else {
- g_variant_unref(result);
+ if (register_cancel) {
+ g_object_unref(register_cancel);
+ register_cancel = NULL;
}
-}
-
-void unregister_application_cb(GObject *object, GAsyncResult *res,
- gpointer user_data)
-{
- BT_INFO("UnregisterApplication is completed");
- GError *error = NULL;
- GVariant *result;
-
- result = g_dbus_proxy_call_finish(manager_gproxy, res, &error);
+ result = g_dbus_proxy_call_finish(G_DBUS_PROXY(object), res, &error);
if (result == NULL) {
/* dBUS-RPC is failed */
BT_ERR("Dbus-RPC is failed\n");
if (error != NULL) {
- /* dBUS gives error cause */
+ /* dBUS gives error cause */
BT_ERR("D-Bus API failure: errCode[%x], message[%s]\n",
- error->code, error->message);
+ error->code, error->message);
g_clear_error(&error);
}
} else {
GDBusProxy *proxy = NULL;
if (is_server_started) {
+ GVariant *ret;
+ GError *err = NULL;
+
proxy = __bt_gatt_gdbus_get_manager_proxy("org.bluez",
"/org/bluez/hci0", GATT_MNGR_INTERFACE);
BT_INFO("UnregisterApplication");
+ is_server_started = false;
+
/* Async Call to Unregister Service */
- g_dbus_proxy_call(proxy,
+ ret = g_dbus_proxy_call_sync(proxy,
"UnregisterApplication",
g_variant_new("(o)",
app_path),
G_DBUS_CALL_FLAGS_NONE, -1,
- NULL,
- (GAsyncReadyCallback) unregister_application_cb,
- NULL);
+ NULL, &err);
+
+ if (ret == NULL) {
+ /* dBUS-RPC is failed */
+ BT_ERR("dBUS-RPC is failed");
+ if (err != NULL) {
+ /* dBUS gives error cause */
+ BT_ERR("D-Bus API failure: errCode[%x], message[%s]",
+ err->code, err->message);
+
+ g_clear_error(&err);
+ }
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
+ g_variant_unref(ret);
+
+ BT_INFO("UnregisterApplication is completed");
- is_server_started = false;
return BLUETOOTH_ERROR_NONE;
}
NULL, /* GDBusAuthObserver */
NULL,
&err);
+ g_free(address);
if (!g_conn) {
if (err) {
BT_ERR("Unable to connect to dbus: %s", err->message);
NULL, /* GDBusAuthObserver */
NULL,
&err);
-
+ g_free(address);
if (!local_system_gconn) {
BT_ERR("Unable to connect to dbus: %s", err->message);
g_clear_error(&err);
/* Register ObjectManager interface */
node_info = __bt_gatt_create_method_node_info(
manager_introspection_xml);
-
if (node_info == NULL) {
BT_ERR("failed to get node info");
goto failed;
&manager_interface_vtable,
NULL, NULL, &error);
}
-
+ g_dbus_node_info_unref(node_info);
if (manager_id == 0) {
BT_ERR("failed to register: %s", error->message);
g_error_free(error);
BT_EXPORT_API int bluetooth_gatt_deinit()
{
int ret = BLUETOOTH_ERROR_NONE;
+
+ if (register_cancel) {
+ g_cancellable_cancel(register_cancel);
+ g_object_unref(register_cancel);
+ register_cancel = NULL;
+ }
+
/* Unown gdbus bus */
if (owner_id) {
/* remove/unregister all services */
node_info = __bt_gatt_create_method_node_info(
service_introspection_xml);
-
if (node_info == NULL)
return BLUETOOTH_ERROR_INTERNAL;
node_info->interfaces[0],
&serv_interface_vtable,
NULL, NULL, &error);
+ g_dbus_node_info_unref(node_info);
if (object_id == 0) {
BT_ERR("failed to register: %s", error->message);
node_info = __bt_gatt_create_method_node_info(
characteristics_introspection_xml);
-
if (node_info == NULL)
return BLUETOOTH_ERROR_INTERNAL;
node_info->interfaces[0],
&char_interface_vtable,
NULL, NULL, &error);
+ g_dbus_node_info_unref(node_info);
if (object_id == 0) {
BT_ERR("failed to register: %s", error->message);
node_info = __bt_gatt_create_method_node_info(
descriptor_introspection_xml);
-
if (node_info == NULL) {
g_strfreev(line_argv);
g_free(serv_path);
node_info->interfaces[0],
&desc_interface_vtable,
NULL, NULL, &error);
+ g_dbus_node_info_unref(node_info);
if (object_id == 0) {
BT_ERR("failed to register: %s", error->message);
g_strfreev(line_argv);
g_variant_builder_unref(inner_builder);
g_variant_builder_unref(builder);
+ g_variant_builder_unref(builder2);
return BLUETOOTH_ERROR_NONE;
}
BT_INFO("RegisterApplication");
+ if (register_cancel) {
+ g_cancellable_cancel(register_cancel);
+ g_object_unref(register_cancel);
+ }
+
+ register_cancel = g_cancellable_new();
+
g_dbus_proxy_call(proxy,
"RegisterApplication",
g_variant_new("(oa{sv})",
app_path, NULL),
G_DBUS_CALL_FLAGS_NONE, -1,
- NULL,
+ register_cancel,
(GAsyncReadyCallback) register_application_cb,
NULL);
int i = 0;
gchar **line_argv = NULL;
gchar *serv_path = NULL;
+ const char *value = NULL;
line_argv = g_strsplit_set(char_path, "/", 0);
serv_path = g_strdup_printf("/%s/%s/%s", line_argv[1], line_argv[2], line_argv[3]);
char_info->value_length = value_length;
- char_info->char_value = (char *)realloc(char_info->char_value, value_length);
+ value = (char *)realloc(char_info->char_value, value_length);
+ if (value == NULL) {
+ g_free(serv_path);
+ g_strfreev(line_argv);
+ g_variant_builder_unref(inner_builder);
+ g_variant_builder_unref(outer_builder);
+ g_variant_builder_unref(invalidated_builder);
+
+ return BLUETOOTH_ERROR_MEMORY_ALLOCATION;
+ }
+
+ char_info->char_value = (char*)value;
if (char_info->char_value) {
for (i = 0; i < value_length; i++)
char_info->char_value[i] = char_value[i];
return BLUETOOTH_ERROR_INTERNAL;
}
- if (resp_state != BLUETOOTH_ERROR_NONE) {
+ if (resp_state != BLUETOOTH_ATT_ERROR_NONE) {
BT_ERR("resp_state is 0x%X", resp_state);
-
- switch (resp_state) {
- case BLUETOOTH_ERROR_WRITE_REQUEST_REJECTED:
- g_dbus_method_invocation_return_dbus_error(req_info->context,
- "org.bluez.Error.Failed", "Write Request Rejected");
- break;
- case BLUETOOTH_ERROR_OBJECT_NOT_SELECTED:
- g_dbus_method_invocation_return_dbus_error(req_info->context,
- "org.bluez.Error.Failed", "Object Not Selected");
- break;
- case BLUETOOTH_ERROR_CONCURRENCY_LIMIT_EXCEEDED:
- g_dbus_method_invocation_return_dbus_error(req_info->context,
- "org.bluez.Error.Failed", "Concurrency Limit Exceeded");
- break;
- case BLUETOOTH_ERROR_OBJECT_NAME_EXISITS:
- g_dbus_method_invocation_return_dbus_error(req_info->context,
- "org.bluez.Error.Failed", "Object Name Already Exists");
- break;
- case BLUETOOTH_ERROR_CCC_IMPROPERLY_CONFIGURED:
- g_dbus_method_invocation_return_dbus_error(req_info->context,
- "org.bluez.Error.Failed", "CCC Improperly Configured");
- break;
- default:
- g_dbus_method_invocation_return_dbus_error(req_info->context,
- "org.bluez.Error.Failed", "Application Error");
- break;
- }
+ char err_msg[20] = { 0, };
+ g_snprintf(err_msg, sizeof(err_msg), "ATT error: 0x%02x", resp_state);
+ g_dbus_method_invocation_return_dbus_error(req_info->context,
+ "org.bluez.Error.Failed", err_msg);
gatt_requests = g_slist_remove(gatt_requests, req_info);