X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bt-api%2Fbt-request-sender.c;h=c31ab18f5d1077f8a804b45a36da6581a998975c;hb=5d4fceb6764b266b0be5b0a0357b7ec1de561103;hp=b1c1c773e5f84475102a8729a2d2fb08a7fcb28b;hpb=7640de5c091be29285bd031bcbd591aa14cf0d3e;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git diff --git a/bt-api/bt-request-sender.c b/bt-api/bt-request-sender.c index b1c1c77..c31ab18 100644 --- a/bt-api/bt-request-sender.c +++ b/bt-api/bt-request-sender.c @@ -1,11 +1,5 @@ /* - * Bluetooth-frwk - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Hocheol Seo - * Girishashok Joshi - * Chanyeol Park + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +15,6 @@ * */ -#include #include #include #include @@ -30,44 +23,34 @@ #include "bluetooth-hid-api.h" #include "bluetooth-audio-api.h" #include "bt-internal-types.h" +#include "bluetooth-ipsp-api.h" #include "bt-common.h" #include "bt-request-sender.h" #include "bt-event-handler.h" #include "bluetooth-media-control.h" -/* auto generated header by bt-request-service.xml*/ -#include "bt-request-service.h" +#ifdef TIZEN_GATT_CLIENT +#include "bluetooth-gatt-client-api.h" +#endif static GSList *sending_requests; -DBusGConnection *service_conn; -DBusGConnection *system_conn; -DBusGProxy *service_proxy; - -static GDBusConnection *service_gconn; static GDBusProxy *service_gproxy; static GDBusProxy *__bt_gdbus_init_service_proxy(void) { + GDBusConnection *service_gconn; GDBusProxy *proxy; GError *err = NULL; - g_type_init(); - - if (service_gconn == NULL) - service_gconn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err); + service_gconn = _bt_get_system_private_conn(); - if (!service_gconn) { - if (err) { - BT_ERR("Unable to connect to dbus: %s", err->message); - g_clear_error(&err); - } + if (!service_gconn) return NULL; - } proxy = g_dbus_proxy_new_sync(service_gconn, - G_DBUS_PROXY_FLAGS_NONE, NULL, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, NULL, BT_DBUS_NAME, BT_SERVICE_PATH, BT_DBUS_NAME, @@ -78,8 +61,6 @@ static GDBusProxy *__bt_gdbus_init_service_proxy(void) g_clear_error(&err); } - g_object_unref(service_gconn); - service_gconn = NULL; return NULL; } @@ -96,13 +77,8 @@ static GDBusProxy *__bt_gdbus_get_service_proxy(void) void _bt_gdbus_deinit_proxys(void) { if (service_gproxy) { - g_object_unref(service_proxy); - service_proxy = NULL; - } - - if (service_gconn) { - g_object_unref(service_gconn); - service_gconn = NULL; + g_object_unref(service_gproxy); + service_gproxy = NULL; } } @@ -111,7 +87,9 @@ static void __bt_get_event_info(int service_function, GArray *output, { ret_if(event == NULL); - BT_DBG("service_function : %x", service_function); + BT_DBG("service_function : %s (0x%x)", + _bt_convert_service_function_to_string(service_function), + service_function); switch (service_function) { case BT_BOND_DEVICE: case BT_BOND_DEVICE_BY_TYPE: @@ -126,14 +104,14 @@ static void __bt_get_event_info(int service_function, GArray *output, *event = BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED; ret_if(output == NULL); *param_data = &g_array_index(output, - bluetooth_device_info_t, 0); + bluetooth_device_address_t, 0); break; case BT_SEARCH_SERVICE: *event_type = BT_ADAPTER_EVENT; *event = BLUETOOTH_EVENT_SERVICE_SEARCHED; ret_if(output == NULL); *param_data = &g_array_index(output, - bluetooth_device_info_t, 0); + bt_sdp_info_t, 0); break; case BT_HID_CONNECT: *event_type = BT_HID_EVENT; @@ -184,8 +162,8 @@ static void __bt_get_event_info(int service_function, GArray *output, case BT_AV_SOURCE_DISCONNECT: *event_type = BT_A2DP_SOURCE_EVENT; *event = BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED; - ret_if (output == NULL); - *param_data = &g_array_index (output, char, 0); + ret_if(output == NULL); + *param_data = &g_array_index(output, char, 0); break; case BT_HF_CONNECT: *event_type = BT_HF_AGENT_EVENT; @@ -220,6 +198,18 @@ static void __bt_get_event_info(int service_function, GArray *output, *param_data = &g_array_index(output, bluetooth_rfcomm_connection_t, 0); break; + case BT_AVRCP_TARGET_CONNECT: + *event_type = BT_AVRCP_EVENT; + *event = BLUETOOTH_EVENT_AVRCP_CONNECTED; + ret_if(output == NULL); + *param_data = &g_array_index(output, char, 0); + break; + case BT_AVRCP_TARGET_DISCONNECT: + *event_type = BT_AVRCP_EVENT; + *event = BLUETOOTH_EVENT_AVRCP_DISCONNECTED; + ret_if(output == NULL); + *param_data = &g_array_index(output, char, 0); + break; case BT_AVRCP_CONTROL_CONNECT: *event_type = BT_AVRCP_CONTROL_EVENT; *event = BLUETOOTH_EVENT_AVRCP_CONTROL_CONNECTED; @@ -232,6 +222,113 @@ static void __bt_get_event_info(int service_function, GArray *output, ret_if(output == NULL); *param_data = &g_array_index(output, char, 0); break; + case BT_REQ_ATT_MTU: + *event_type = BT_DEVICE_EVENT; + *event = BLUETOOTH_EVENT_GATT_ATT_MTU_CHANGED; + ret_if(output == NULL); + *param_data = &g_array_index(output, + bluetooth_device_address_t, 0); + break; +#ifdef TIZEN_GATT_CLIENT + case BT_CONNECT_LE: + *event_type = BT_DEVICE_EVENT; + *event = BLUETOOTH_EVENT_GATT_CLIENT_CONNECTED; + ret_if(output == NULL); + *param_data = &g_array_index(output, + bluetooth_device_address_t, 0); + break; + case BT_DISCONNECT_LE: + *event_type = BT_DEVICE_EVENT; + *event = BLUETOOTH_EVENT_GATT_CLIENT_DISCONNECTED; + ret_if(output == NULL); + *param_data = &g_array_index(output, + bluetooth_device_address_t, 0); + break; +#else + case BT_CONNECT_LE: + *event_type = BT_DEVICE_EVENT; + *event = BLUETOOTH_EVENT_GATT_CONNECTED; + ret_if(output == NULL); + *param_data = &g_array_index(output, + bluetooth_device_address_t, 0); + break; + case BT_DISCONNECT_LE: + *event_type = BT_DEVICE_EVENT; + *event = BLUETOOTH_EVENT_GATT_DISCONNECTED; + ret_if(output == NULL); + *param_data = &g_array_index(output, + bluetooth_device_address_t, 0); + break; +#endif +#ifdef TIZEN_GATT_CLIENT + case BT_GATT_READ_CHARACTERISTIC: + BT_INFO("BT_GATT_READ_CHARACTERISTIC"); + *event_type = BT_GATT_CLIENT_EVENT; + *event = BLUETOOTH_EVENT_GATT_READ_CHAR; + ret_if(output == NULL); + *param_data = &g_array_index(output, + bluetooth_gatt_client_char_prop_info_t, 0); + break; + case BT_GATT_WRITE_CHARACTERISTIC_VALUE_BY_TYPE: + BT_INFO("BT_GATT_WRITE_CHARACTERISTIC_VALUE_BY_TYPE"); + *event_type = BT_GATT_CLIENT_EVENT; + *event = BLUETOOTH_EVENT_GATT_WRITE_CHAR; + ret_if(output == NULL); + *param_data = &g_array_index(output, + bluetooth_gatt_client_char_prop_info_t, 0); + break; + case BT_GATT_READ_DESCRIPTOR_VALUE: + BT_INFO("BT_GATT_READ_DESCRIPTOR_VALUE"); + *event_type = BT_GATT_CLIENT_EVENT; + *event = BLUETOOTH_EVENT_GATT_READ_DESC; + ret_if(output == NULL); + *param_data = &g_array_index(output, + bluetooth_gatt_client_desc_prop_info_t, 0); + break; + case BT_GATT_WRITE_DESCRIPTOR_VALUE: + BT_INFO("BT_GATT_WRITE_DESCRIPTOR_VALUE"); + *event_type = BT_GATT_CLIENT_EVENT; + *event = BLUETOOTH_EVENT_GATT_WRITE_DESC; + ret_if(output == NULL); + *param_data = &g_array_index(output, + bluetooth_gatt_client_desc_prop_info_t, 0); + break; +#endif + case BT_TDS_READ_TRANSPORT_DATA: + *event_type = BT_TDS_EVENT; + *event = BLUETOOTH_EVENT_TDS_TRANSPORT_DATA_RECEIVED; + ret_if(output == NULL); + *param_data = &g_array_index(output, + bluetooth_device_address_t, 0); + break; + case BT_TDS_ENABLE_CONTROL_POINT: + *event_type = BT_TDS_EVENT; + *event = BLUETOOTH_EVENT_TDS_CONTROL_POINT_ENABLED; + ret_if(output == NULL); + *param_data = &g_array_index(output, + bluetooth_device_address_t, 0); + break; + case BT_TDS_ACTIVATE_CONTROL_POINT: + *event_type = BT_TDS_EVENT; + *event = BLUETOOTH_EVENT_TDS_ACTIVATION_RESULT; + ret_if(output == NULL); + *param_data = &g_array_index(output, + bluetooth_device_address_t, 0); + break; + case BT_HDP_CONNECT: + *event_type = BT_HDP_EVENT; + *event = BLUETOOTH_EVENT_HDP_CONNECTED; + ret_if(output == NULL); + *param_data = &g_array_index(output, + bt_hdp_connected_t, 0); + break; + case BT_HDP_DISCONNECT: + *event_type = BT_HDP_EVENT; + *event = BLUETOOTH_EVENT_HDP_DISCONNECTED; + ret_if(output == NULL); + *param_data = &g_array_index(output, + bt_hdp_disconnected_t, 0); + break; default: BT_ERR("Unknown function"); return; @@ -258,8 +355,8 @@ static void __bt_fill_garray_from_variant(GVariant *var, GArray *param) } static void __send_request_cb(GDBusProxy *proxy, - GAsyncResult *res, - gpointer user_data) + GAsyncResult *res, + gpointer user_data) { bluetooth_event_param_t bt_event; bt_req_info_t *cb_data = user_data; @@ -317,16 +414,36 @@ static void __send_request_cb(GDBusProxy *proxy, &bt_event.event, &event_type, &bt_event.param_data); + BT_DBG("service_function [%d]", cb_data->service_function); if (result == BLUETOOTH_ERROR_NONE && out_param1) { if (cb_data->service_function == BT_OPP_PUSH_FILES) { request_id = g_array_index(out_param1, int, 0); BT_DBG("request_id : %d", request_id); _bt_add_push_request_id(request_id); + } else if (cb_data->service_function == BT_MAP_LIST_FOLDERS) { + request_id = g_array_index(out_param1, int, 0); + BT_DBG("request_id : %d", request_id); + _bt_add_push_request_id(request_id); + } else if (cb_data->service_function == BT_MAP_LIST_FILTER_FIELDS) { + request_id = g_array_index(out_param1, int, 0); + BT_DBG("request_id : %d", request_id); + _bt_add_push_request_id(request_id); + } else if (cb_data->service_function == BT_MAP_LIST_MESSAGES) { + request_id = g_array_index(out_param1, int, 0); + BT_DBG("request_id : %d", request_id); + _bt_add_push_request_id(request_id); + } else if (cb_data->service_function == BT_MAP_GET_MESSAGE) { + request_id = g_array_index(out_param1, int, 0); + BT_DBG("request_id : %d", request_id); + _bt_add_push_request_id(request_id); + } else if (cb_data->service_function == BT_MAP_PUSH_MESSAGE) { + request_id = g_array_index(out_param1, int, 0); + BT_DBG("request_id : %d", request_id); + _bt_add_push_request_id(request_id); } goto done; } - } if (cb_data->cb == NULL) @@ -334,7 +451,8 @@ static void __send_request_cb(GDBusProxy *proxy, /* Only if fail case, call the callback function*/ bt_event.result = result; - BT_INFO("event_type[%d], result=[%d]", event_type, result); + BT_INFO("event_type[%d], result= %s [0x%x]", event_type, + _bt_convert_error_to_string(result), result); if (event_type == BT_ADAPTER_EVENT || event_type == BT_RFCOMM_CLIENT_EVENT) { ((bluetooth_cb_func_ptr)cb_data->cb)(bt_event.event, @@ -360,6 +478,25 @@ static void __send_request_cb(GDBusProxy *proxy, ((bt_audio_func_ptr)cb_data->cb)(bt_event.event, (bt_audio_event_param_t *)&bt_event, cb_data->user_data); + } else if (event_type == BT_DEVICE_EVENT) { + ((bluetooth_cb_func_ptr)cb_data->cb)(bt_event.event, + &bt_event, + cb_data->user_data); + } else if (event_type == BT_TDS_EVENT) { + ((bluetooth_cb_func_ptr)cb_data->cb)(bt_event.event, + &bt_event, + cb_data->user_data); + } else if (event_type == BT_HDP_EVENT) { + ((bluetooth_cb_func_ptr)cb_data->cb)(bt_event.event, + &bt_event, cb_data->user_data); + } else if (event_type == BT_AVRCP_EVENT) { + ((bluetooth_cb_func_ptr)cb_data->cb)(bt_event.event, + &bt_event, cb_data->user_data); +#ifdef TIZEN_GATT_CLIENT + } else if (event_type == BT_GATT_CLIENT_EVENT) { + ((gatt_client_cb_func_ptr)cb_data->cb)(bt_event.event, + (gatt_client_event_param_t*)&bt_event, cb_data->user_data); +#endif } else { BT_INFO("Not handled event type : %d", event_type); } @@ -379,7 +516,6 @@ int _bt_sync_send_request(int service_type, int service_function, GArray **out_param1) { int result = BLUETOOTH_ERROR_NONE; - char *cookie; GError *error = NULL; GArray *in_param5 = NULL; // GArray *out_param2 = NULL; @@ -403,12 +539,7 @@ int _bt_sync_send_request(int service_type, int service_function, in_param5 = g_array_new(TRUE, TRUE, sizeof(gchar)); - cookie = _bt_get_cookie(); - if (cookie) { - g_array_append_vals(in_param5, cookie, - _bt_get_cookie_size()); - } param1 = g_variant_new_from_data((const GVariantType *)"ay", in_param1->data, in_param1->len, @@ -423,7 +554,7 @@ int _bt_sync_send_request(int service_type, int service_function, in_param4->data, in_param4->len, TRUE, NULL, NULL); param5 = g_variant_new_from_data((const GVariantType *)"ay", - in_param5->data, in_param5->len, + in_param5->data, in_param5->len, TRUE, NULL, NULL); ret = g_dbus_proxy_call_sync(proxy, "service_request", @@ -493,7 +624,6 @@ int _bt_async_send_request(int service_type, int service_function, { GArray* in_param5 = NULL; bt_req_info_t *cb_data; - char *cookie; GDBusProxy *proxy; int timeout; @@ -503,7 +633,9 @@ int _bt_async_send_request(int service_type, int service_function, GVariant *param4; GVariant *param5; - BT_DBG("service_function : %x", service_function); + BT_DBG("service_function : %s (0x%x)", + _bt_convert_service_function_to_string(service_function), + service_function); cb_data = g_new0(bt_req_info_t, 1); @@ -531,12 +663,6 @@ int _bt_async_send_request(int service_type, int service_function, in_param5 = g_array_new(TRUE, TRUE, sizeof(gchar)); - cookie = _bt_get_cookie(); - - if (cookie) { - g_array_append_vals(in_param5, cookie, - _bt_get_cookie_size()); - } param1 = g_variant_new_from_data((const GVariantType *)"ay", in_param1->data, in_param1->len, TRUE, NULL, NULL); @@ -566,8 +692,182 @@ int _bt_async_send_request(int service_type, int service_function, g_array_free(in_param5, TRUE); break; + default: + g_free(cb_data); + break; + } + + return BLUETOOTH_ERROR_NONE; +} + +int _bt_async_send_request_with_unix_fd_list(int service_type, int service_function, + GArray *in_param1, GArray *in_param2, + GArray *in_param3, GArray *in_param4, + void *callback, void *user_data, + GUnixFDList *fd_list, GAsyncReadyCallback __async_req_cb) +{ + GArray* in_param5 = NULL; + bt_req_info_t *cb_data; + + GDBusProxy *proxy; + int timeout; + GVariant *param1; + GVariant *param2; + GVariant *param3; + GVariant *param4; + GVariant *param5; + + BT_DBG("service_function : %d", service_function); + + cb_data = g_new0(bt_req_info_t, 1); + cb_data->service_function = service_function; + cb_data->cb = callback; + cb_data->user_data = user_data; + + switch (service_type) { + case BT_BLUEZ_SERVICE: + case BT_OBEX_SERVICE: + proxy = __bt_gdbus_get_service_proxy(); + if (!proxy) { + g_free(cb_data); + return BLUETOOTH_ERROR_INTERNAL; + } + + /* Do not timeout the request in certain cases. Sometime the + * request may take undeterministic time to reponse. + * (for ex: pairing retry) */ + if (service_function == BT_BOND_DEVICE || + service_function == BT_BOND_DEVICE_BY_TYPE) + timeout = INT_MAX; + else + timeout = BT_DBUS_TIMEOUT_MAX; + + in_param5 = g_array_new(TRUE, TRUE, sizeof(gchar)); + + param1 = g_variant_new_from_data((const GVariantType *)"ay", + in_param1->data, in_param1->len, + TRUE, NULL, NULL); + param2 = g_variant_new_from_data((const GVariantType *)"ay", + in_param2->data, in_param2->len, + TRUE, NULL, NULL); + param3 = g_variant_new_from_data((const GVariantType *)"ay", + in_param3->data, in_param3->len, + TRUE, NULL, NULL); + param4 = g_variant_new_from_data((const GVariantType *)"ay", + in_param4->data, in_param4->len, + TRUE, NULL, NULL); + param5 = g_variant_new_from_data((const GVariantType *)"ay", + in_param5->data, in_param5->len, + TRUE, NULL, NULL); + + g_dbus_proxy_call_with_unix_fd_list(proxy, "service_request", + g_variant_new("(iii@ay@ay@ay@ay@ay)", + service_type, service_function, + BT_ASYNC_REQ, param1, param2, + param3, param4, param5), + G_DBUS_CALL_FLAGS_NONE, + timeout, fd_list, NULL, + __async_req_cb, (gpointer)cb_data); + sending_requests = g_slist_append(sending_requests, cb_data); + + g_array_free(in_param5, TRUE); + break; + default: + g_free(cb_data); + break; } return BLUETOOTH_ERROR_NONE; } +int _bt_sync_send_request_with_unix_fd_list( + int service_type, int service_function, + GArray *in_param1, GArray *in_param2, + GArray *in_param3, GArray *in_param4, + GUnixFDList *fd_list, GArray **out_param1, + GUnixFDList **out_fd_list) +{ + int result = BLUETOOTH_ERROR_NONE; + GError *error = NULL; + GArray *in_param5 = NULL; + + GDBusProxy *proxy; + GVariant *ret; + GVariant *param1; + GVariant *param2; + GVariant *param3; + GVariant *param4; + GVariant *param5; + + switch (service_type) { + case BT_BLUEZ_SERVICE: + case BT_OBEX_SERVICE: + case BT_AGENT_SERVICE: + case BT_CHECK_PRIVILEGE: + proxy = __bt_gdbus_get_service_proxy(); + if (!proxy) + return BLUETOOTH_ERROR_INTERNAL; + + in_param5 = g_array_new(TRUE, TRUE, sizeof(gchar)); + + param1 = g_variant_new_from_data((const GVariantType *)"ay", + in_param1->data, in_param1->len, + TRUE, NULL, NULL); + param2 = g_variant_new_from_data((const GVariantType *)"ay", + in_param2->data, in_param2->len, + TRUE, NULL, NULL); + param3 = g_variant_new_from_data((const GVariantType *)"ay", + in_param3->data, in_param3->len, + TRUE, NULL, NULL); + param4 = g_variant_new_from_data((const GVariantType *)"ay", + in_param4->data, in_param4->len, + TRUE, NULL, NULL); + param5 = g_variant_new_from_data((const GVariantType *)"ay", + in_param5->data, in_param5->len, + TRUE, NULL, NULL); + + ret = g_dbus_proxy_call_with_unix_fd_list_sync(proxy, "service_request", + g_variant_new("(iii@ay@ay@ay@ay@ay)", + service_type, service_function, + BT_SYNC_REQ, param1, param2, + param3, param4, param5), + G_DBUS_CALL_FLAGS_NONE, -1, + fd_list, out_fd_list, NULL, &error); + g_array_free(in_param5, TRUE); + + if (ret == NULL) { + /* dBUS-RPC is failed */ + BT_ERR("dBUS-RPC is failed"); + + if (error != NULL) { + /* dBUS gives error cause */ + BT_ERR("D-Bus API failure: errCode[%x], message[%s]", + error->code, error->message); + + g_clear_error(&error); + } else { + /* dBUS does not give error cause dBUS-RPC is failed */ + BT_ERR("error returned was NULL"); + } + + return BLUETOOTH_ERROR_INTERNAL; + } + + param1 = NULL; + g_variant_get(ret, "(iv)", &result, ¶m1); + + if (param1) { + *out_param1 = g_array_new(TRUE, TRUE, sizeof(gchar)); + __bt_fill_garray_from_variant(param1, *out_param1); + g_variant_unref(param1); + } + + g_variant_unref(ret); + break; + default: + BT_ERR("Unknown service type"); + return BLUETOOTH_ERROR_INTERNAL; + } + + return result; +}