X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bt-oal%2Fbluez_hal%2Fsrc%2Fbt-hal-gatt-server.c;h=020c0a071bd26f3c6613dc66d4b67d5ee5a3ad2c;hb=4921852946c1f260b4749ea05e0996555f546e05;hp=b90ed57b446555e993ef13a5dbd745caf1e4a4cb;hpb=e8132a5b1e7fc5a1e8feab203393d3f772fbebd2;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git diff --git a/bt-oal/bluez_hal/src/bt-hal-gatt-server.c b/bt-oal/bluez_hal/src/bt-hal-gatt-server.c index b90ed57..020c0a0 100644 --- a/bt-oal/bluez_hal/src/bt-hal-gatt-server.c +++ b/bt-oal/bluez_hal/src/bt-hal-gatt-server.c @@ -230,7 +230,7 @@ static const gchar characteristics_introspection_xml[] = " " " " " " -" " +" " " " " " " " @@ -322,7 +322,7 @@ static const gchar manager_introspection_xml[] = " " ""; -GSList *_bt_get_service_list_from_server(int instance) +static GSList *_bt_get_service_list_from_server(int instance) { GSList *l; INFO("Number of GATT Server apps [%d]", g_slist_length(gatt_server_apps)); @@ -340,7 +340,7 @@ GSList *_bt_get_service_list_from_server(int instance) return NULL; } -void _bt_remote_service_from_gatt_server(int instance, int service_handle) +static void _bt_remote_service_from_gatt_server(int instance, int service_handle) { GSList *l; GSList *l1; @@ -360,7 +360,7 @@ void _bt_remote_service_from_gatt_server(int instance, int service_handle) } } -void _bt_hal_update_gatt_service_in_gatt_server(int slot, struct gatt_service_info *serv_info) +static void _bt_hal_update_gatt_service_in_gatt_server(int slot, struct gatt_service_info *serv_info) { GSList *l; for (l = gatt_server_apps; l; l = g_slist_next(l)) { @@ -535,7 +535,7 @@ static struct gatt_service_info *__bt_gatt_find_gatt_service_from_char(const cha return NULL; } -char *__bt_gatt_find_char_path_from_handle(int char_hdl) +static char *__bt_gatt_find_char_path_from_handle(int char_hdl) { GSList *l1, *l2; @@ -553,7 +553,7 @@ char *__bt_gatt_find_char_path_from_handle(int char_hdl) return NULL; } -struct gatt_char_info *__bt_gatt_find_char_info_from_handle(int char_hdl) +static struct gatt_char_info *__bt_gatt_find_char_info_from_handle(int char_hdl) { GSList *l1, *l2; @@ -1069,8 +1069,13 @@ static void __bt_gatt_char_method_call(GDBusConnection *connection, struct gatt_client_info_t *conn_info = NULL; struct gatt_service_info *svc_info = NULL; + g_variant_get(parameters, "(&suq)", + &addr, &req_id, &offset); + + DBG("Request id = %u, Offset = %u", req_id, offset); DBG("Application path = %s", object_path); DBG("Sender = %s", sender); + DBG("Address = %s", addr); /* Check if device is already in connected list */ conn_info = __bt_find_remote_gatt_client_info(addr); @@ -1088,9 +1093,6 @@ static void __bt_gatt_char_method_call(GDBusConnection *connection, return; } - g_variant_get(parameters, "(&suq)", &addr, &req_id, &offset); - DBG("Request id = %u, Offset = %u", req_id, offset); - /* Store requets information */ req_info = g_new0(struct gatt_req_info, 1); req_info->attr_path = g_strdup(object_path); @@ -1113,7 +1115,6 @@ static void __bt_gatt_char_method_call(GDBusConnection *connection, /* Convert address to hex */ _bt_hal_convert_addr_string_to_type(ev.bdaddr, addr); - event_cb(HAL_EV_GATT_READ_REQUESTED, (void *)&ev, sizeof(ev)); return; } else if (g_strcmp0(method_name, "WriteValue") == 0) { @@ -1317,7 +1318,7 @@ static void __bt_gatt_char_method_call(GDBusConnection *connection, _bt_hal_convert_device_path_to_address(dev_path, addr); - DBG("remote adress %s", addr); + DBG("remote address %s", addr); /* Check if device is already in connected list */ conn_info = __bt_find_remote_gatt_client_info(addr); @@ -1365,8 +1366,6 @@ static void __bt_gatt_char_method_call(GDBusConnection *connection, struct gatt_service_info *svc_info = NULL; struct gatt_client_info_t *conn_info = NULL; struct gatt_req_info *req_info = NULL; - char * link = 0; - int len = 0; DBG("AcquireNotify"); DBG("Application path = %s", object_path); @@ -1427,7 +1426,7 @@ done: g_dbus_method_invocation_return_value(invocation, NULL); } -gboolean __bt_hal_gatt_emit_interface_removed(gchar *object_path, gchar *interface) +static gboolean __bt_hal_gatt_emit_interface_removed(gchar *object_path, gchar *interface) { gboolean ret; GError *error = NULL; @@ -1736,7 +1735,7 @@ static bt_status_t gatt_server_register_app(bt_uuid_t *uuid) return BT_STATUS_SUCCESS; } -void _bt_hal_remove_gatt_server_from_list(int server_if) +static void _bt_hal_remove_gatt_server_from_list(int server_if) { GSList *l; struct gatt_server_app *info = NULL; @@ -1792,93 +1791,93 @@ static bt_status_t gatt_server_open(int server_if, const bt_bdaddr_t *bd_addr, b return BT_STATUS_SUCCESS; } -static bt_status_t gatt_server_close(int server_if, const bt_bdaddr_t *bd_addr, int conn_id) +static void __le_disconnection_req_cb(GDBusProxy *proxy, GAsyncResult *res, + gpointer user_data) { - CHECK_BTGATT_INIT(); - return BT_STATUS_SUCCESS; -} + GError *g_error = NULL; + GVariant *reply = NULL; -static void __bt_gatt_close_gdbus_connection(void) -{ - GError *err = NULL; DBG("+"); - if (g_conn == NULL) - return; - - if (!g_dbus_connection_flush_sync(g_conn, NULL, &err)) { - ERR("Fail to flush the connection: %s", err->message); - g_error_free(err); - err = NULL; - } - - if (!g_dbus_connection_close_sync(g_conn, NULL, &err)) { - if (err) { - ERR("Fail to close the dbus connection: %s", err->message); - g_error_free(err); + reply = g_dbus_proxy_call_finish(proxy, res, &g_error); + g_object_unref(proxy); + if (reply == NULL) { + ERR("Disconnect LE Dbus Call Error"); + if (g_error) { + ERR("Error: %s\n", g_error->message); + g_clear_error(&g_error); } } - - g_object_unref(g_conn); - g_conn = NULL; - DBG("-"); + g_variant_unref(reply); } -static GDBusConnection *__bt_gatt_get_gdbus_connection(void) + +static bt_status_t gatt_server_close(int server_if, const bt_bdaddr_t *bd_addr, int conn_id) { - GDBusConnection *local_system_gconn = NULL; - char *address; - GError *err = NULL; + CHECK_BTGATT_INIT(); + + char device_address[BT_HAL_ADDRESS_STRING_SIZE] = { 0 }; + gchar *device_path; + GDBusProxy *device_proxy; + GDBusConnection *g_conn; + struct gatt_client_info_t *conn_info = NULL; + + INFO("+"); + + if (NULL == bd_addr) { + ERR("bd_addr is NULL"); + return BT_STATUS_PARM_INVALID; + } + /* GDBUS Connection Info validate */ + g_conn = _bt_hal_get_system_gconn(); if (g_conn == NULL) { - address = g_dbus_address_get_for_bus_sync(G_BUS_TYPE_SYSTEM, NULL, &err); - if (address == NULL) { - if (err) { - ERR("Failed to get bus address: %s", err->message); - g_clear_error(&err); - } - return NULL; - } + ERR("Could not get System DBUS Connection"); + return BT_STATUS_FAIL; + } - g_conn = g_dbus_connection_new_for_address_sync(address, - G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | - G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, - NULL, /* GDBusAuthObserver */ - NULL, - &err); - if (!g_conn) { - if (err) { - ERR("Unable to connect to dbus: %s", err->message); - g_clear_error(&err); - } - return NULL; - } - } else if (g_dbus_connection_is_closed(g_conn)) { - address = g_dbus_address_get_for_bus_sync(G_BUS_TYPE_SYSTEM, NULL, &err); - if (address == NULL) { - if (err) { - ERR("Failed to get bus address: %s", err->message); - g_clear_error(&err); - } - return NULL; - } + /* Connection Info validate */ + conn_info = __bt_find_remote_gatt_client_info_from_conn(conn_id); + if (conn_info == NULL) { + ERR("No Connection Inforamtion!!!"); + return BT_STATUS_FAIL; + } - local_system_gconn = g_dbus_connection_new_for_address_sync(address, - G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | - G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, - NULL, /* GDBusAuthObserver */ - NULL, - &err); + _bt_hal_convert_addr_type_to_string(device_address, + (unsigned char *)bd_addr->address); - if (!local_system_gconn) { - ERR("Unable to connect to dbus: %s", err->message); - g_clear_error(&err); - } + //check if connection has the same device address + if (g_strcmp0(conn_info->addr, device_address) != 0) { + ERR("device address [%s] does not match", device_address); + return BT_STATUS_FAIL; + } - g_conn = local_system_gconn; + device_path = _bt_hal_get_device_object_path(conn_info->addr); + if (device_path == NULL) { + ERR("device_path is NULL"); + return BT_STATUS_PARM_INVALID; } - return g_conn; + device_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE, + NULL, BT_HAL_BLUEZ_NAME, + device_path, BT_HAL_DEVICE_INTERFACE, NULL, NULL); + + + g_free(device_path); + if (device_proxy == NULL) + return BT_STATUS_FAIL; + + INFO("Disconnect LE [%s]", device_address); + + g_dbus_proxy_call(device_proxy, "DisconnectLE", + NULL, + G_DBUS_CALL_FLAGS_NONE, + BT_HAL_MAX_DBUS_TIMEOUT, + NULL, + (GAsyncReadyCallback)__le_disconnection_req_cb, conn_info); + + INFO("-"); + return BT_STATUS_SUCCESS; } static char* __bt_hal_convert_uuid_to_string(bt_uuid_t *srvc_id) @@ -1899,7 +1898,7 @@ static char* __bt_hal_convert_uuid_to_string(bt_uuid_t *srvc_id) return strdup(uuid); } -int __bt_hal_add_service_to_dbus(char *app_path, int slot, btgatt_srvc_id_t *srvc_id) +static int __bt_hal_add_service_to_dbus(char *app_path, int slot, btgatt_srvc_id_t *srvc_id) { gboolean ret; /* For GATT service specific */ @@ -2060,43 +2059,45 @@ static void __bt_hal_gatt_deinit(char *app_path) if (gatt_server_apps == NULL) { INFO("All GATT servers are removed, clean all DBUS resources"); if (owner_id) { - /* unregister the exported interface for object manager - g_conn and manager_id are common for all GATT servers */ - g_dbus_connection_unregister_object(g_conn, - manager_id); + /* unregister the exported interface for object manager */ + g_dbus_connection_unregister_object(g_conn, manager_id); manager_id = 0; g_bus_unown_name(owner_id); owner_id = 0; g_object_unref(manager_gproxy); manager_gproxy = NULL; - - /* Close the GDBUS connection */ - __bt_gatt_close_gdbus_connection(); } } INFO("-"); } -int __bt_hal_gatt_init(void) +static int __bt_hal_gatt_init(void) { - GDBusConnection *conn = NULL; DBG("+"); + /* Only once for ALL GATT Servers */ if (owner_id == 0) { - owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, - BT_GATT_SERVICE_NAME, - G_BUS_NAME_OWNER_FLAGS_NONE, - NULL, NULL, NULL, NULL, NULL); - } - INFO("Owner ID [%d]", owner_id); + GError *err = NULL; + gchar *name = NULL; - /* Only once for ALL GATT Servers conn = g_conn(global)*/ - conn = __bt_gatt_get_gdbus_connection(); - if (!conn) { - ERR("Unable to get connection"); - return BT_STATUS_FAIL; + g_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err); + if (!g_conn) { + if (err) { + ERR("Unable to connect to gdbus: %s", err->message); + g_clear_error(&err); + } + return BT_STATUS_FAIL; + } + + name = g_strdup_printf("%s.p%d", BT_GATT_SERVICE_NAME, getpid()); + INFO("well-known name: %s", name); + + owner_id = g_bus_own_name_on_connection(g_conn, name, + G_BUS_NAME_OWNER_FLAGS_NONE, + NULL, NULL, NULL, NULL); } + INFO("Owner ID [%d]", owner_id); /* Only once for ALL GATT Servers */ if (manager_node_info == NULL) { @@ -2114,7 +2115,7 @@ int __bt_hal_gatt_init(void) return BT_STATUS_SUCCESS; } -void _bt_hal_is_gatt_server_initialzed(int slot, char **app_path) +static void _bt_hal_is_gatt_server_initialzed(int slot, char **app_path) { GSList *l; @@ -2131,7 +2132,7 @@ void _bt_hal_is_gatt_server_initialzed(int slot, char **app_path) *app_path = NULL; } -void _bt_hal_update_gatt_server_path(int slot, char *app_path) +static void _bt_hal_update_gatt_server_path(int slot, char *app_path) { if (app_path == NULL) return; @@ -2152,7 +2153,6 @@ static bt_status_t gatt_server_add_service(int server_if, btgatt_srvc_id_t *srvc char *app_path = NULL; GError *error = NULL; int *app_id = NULL; - guint manager_id; int result = BT_STATUS_SUCCESS; @@ -2187,6 +2187,7 @@ static bt_status_t gatt_server_add_service(int server_if, btgatt_srvc_id_t *srvc g_error_free(error); goto failed; } + INFO("manager_id [%d]", manager_id); /* For current GATT Server, app_path is created, save it in Table */ _bt_hal_update_gatt_server_path(server_if, app_path); @@ -2883,7 +2884,8 @@ static bt_status_t gatt_server_send_indication(int server_if, int attribute_hand g_variant_builder_add(outer_builder, "{sv}", "Notifying", g_variant_new("b", notify)); - _bt_hal_convert_addr_type_to_string(addr, (unsigned char *)conn_info->addr); + memcpy(addr, conn_info->addr, BT_HAL_ADDRESS_STRING_SIZE); + DBG("Send Indication to Unicast addr [%s]", addr); g_variant_builder_add(outer_builder, "{sv}", "Unicast", g_variant_new("s", addr)); @@ -3022,7 +3024,7 @@ static bt_status_t gatt_server_send_response(int conn_id, int trans_id, /* DEBUG */ for (i = 0; i < response->attr_value.len; i++) - DBG("Resonse [%d] = [0x%x]", response->attr_value.value[i]); + DBG("Resonse [%d] = [0x%x]", i, response->attr_value.value[i]); if (req_info->request_type == BT_HAL_GATT_REQUEST_TYPE_READ) { GVariantBuilder *inner_builder = NULL; @@ -3059,7 +3061,6 @@ static bt_status_t gatt_server_send_acquire_response(int conn_id, int trans_id, struct gatt_req_info *req_info = NULL; struct gatt_client_info_t *conn_info = NULL; - int i; DBG("GATT Server Send Response Conn ID [%d]", conn_id); @@ -3362,26 +3363,26 @@ static bt_status_t gatt_server_get_mtu_size(int conn_id, int *mtu_size) } const btgatt_server_interface_t btgatt_server_interface = { - gatt_server_register_app, - gatt_server_unregister_app, - gatt_server_open, - gatt_server_close, - gatt_server_add_service, - gatt_server_add_included_service, - gatt_server_add_characteristic, - gatt_server_add_descriptor, - gatt_server_start_service, - gatt_server_stop_service, - gatt_server_delete_service, - gatt_server_send_indication, - gatt_server_send_response, - gatt_server_update_att_value, - gatt_server_listen, - gatt_server_set_adv_data, - gatt_server_multi_adv_enable, - gatt_server_multi_adv_update, - gatt_server_multi_adv_set_inst_data, - gatt_server_multi_adv_disable, - gatt_server_get_mtu_size, - gatt_server_send_acquire_response + .register_server = gatt_server_register_app, + .unregister_server = gatt_server_unregister_app, + .connect = gatt_server_open, + .disconnect = gatt_server_close, + .add_service = gatt_server_add_service, + .add_included_service = gatt_server_add_included_service, + .add_characteristic = gatt_server_add_characteristic, + .add_descriptor = gatt_server_add_descriptor, + .start_service = gatt_server_start_service, + .stop_service = gatt_server_stop_service, + .delete_service = gatt_server_delete_service, + .send_indication = gatt_server_send_indication, + .send_response = gatt_server_send_response, + .update_att_value = gatt_server_update_att_value, + .listen = gatt_server_listen, + .set_adv_data = gatt_server_set_adv_data, + .multi_adv_enable = gatt_server_multi_adv_enable, + .multi_adv_update = gatt_server_multi_adv_update, + .multi_adv_set_inst_data = gatt_server_multi_adv_set_inst_data, + .multi_adv_disable = gatt_server_multi_adv_disable, + .get_att_mtu = gatt_server_get_mtu_size, + .send_response_acquire = gatt_server_send_acquire_response };