#include "bt-internal-types.h"
#include "bt-request-sender.h"
-#ifdef TIZEN_GATT_CLIENT
#include "bluetooth-gatt-client-api.h"
#include <arpa/inet.h>
static GSList *gatt_characteristic_notify_list;
static GSList *gatt_characteristic_write_list = NULL;;
-#endif
#define GATT_DEFAULT_TIMEOUT (6 * 1000) // Dependent on supervision timeout 6 sec
BT_EXPORT_API int bluetooth_gatt_free_service_property(bt_gatt_service_property_t *svc_pty)
{
- BT_DBG("+");
-
BT_CHECK_PARAMETER(svc_pty, return);
-#ifdef TIZEN_GATT_CLIENT
g_free(svc_pty->uuid);
-#else
- g_free(svc_pty->uuid);
- g_free(svc_pty->handle);
- g_strfreev(svc_pty->include_handles.handle);
- g_strfreev(svc_pty->char_handle.handle);
-#endif
memset(svc_pty, 0, sizeof(bt_gatt_service_property_t));
- BT_DBG("-");
return BLUETOOTH_ERROR_NONE;
}
BT_EXPORT_API int bluetooth_gatt_free_char_property(bt_gatt_char_property_t *char_pty)
{
- BT_DBG("+");
-
BT_CHECK_PARAMETER(char_pty, return);
g_free(char_pty->uuid);
g_free(char_pty->name);
g_free(char_pty->description);
g_free(char_pty->val);
-#ifndef TIZEN_GATT_CLIENT
- g_free(char_pty->handle);
- g_strfreev(char_pty->char_desc_handle.handle);
-#endif
memset(char_pty, 0, sizeof(bt_gatt_char_property_t));
- BT_DBG("-");
return BLUETOOTH_ERROR_NONE;
}
BT_EXPORT_API int bluetooth_gatt_free_desc_property(bt_gatt_char_descriptor_property_t *desc_pty)
{
- BT_DBG("+");
-
BT_CHECK_PARAMETER(desc_pty, return);
g_free(desc_pty->uuid);
g_free(desc_pty->val);
-#ifndef TIZEN_GATT_CLIENT
- g_free(desc_pty->handle);
-#endif
memset(desc_pty, 0, sizeof(bt_gatt_char_descriptor_property_t));
- BT_DBG("-");
return BLUETOOTH_ERROR_NONE;
}
{
GSList *l;
char device_address[BT_ADDRESS_STRING_SIZE] = { 0 };
- char secure_address[BT_ADDRESS_STRING_SIZE] = { 0 };
_bt_convert_addr_type_to_string(device_address,
(unsigned char *)device_addr->addr);
for (l = service_monitor_list; l != NULL; l = l->next) {
char device_address2[BT_ADDRESS_STRING_SIZE] = { 0 };
- char secure_address2[BT_ADDRESS_STRING_SIZE] = { 0 };
bluetooth_device_address_t *addr = l->data;
_bt_convert_addr_type_to_string(device_address2,
(unsigned char *)addr->addr);
- _bt_convert_addr_string_to_secure_string(secure_address,
- device_address);
- _bt_convert_addr_string_to_secure_string(secure_address2,
- device_address2);
- BT_INFO("service_monitor_list [%s] - Input [%s]",
- secure_address2, secure_address);
if (!memcmp(device_addr, addr,
sizeof(bluetooth_device_address_t)))
BT_CHECK_PARAMETER(service, return);
BT_CHECK_ENABLED(return);
- g_conn = _bt_get_system_private_conn();
+ g_conn = _bt_get_system_common_conn();
retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
properties_proxy = g_dbus_proxy_new_sync(g_conn,
g_strstr_len(service->uuid, -1,
service_uuid)) {
ret = BLUETOOTH_ERROR_NONE;
+
+ /* release resources */
+ g_free(object_path);
+ g_variant_iter_free(interface_iter);
+ g_free(interface_str);
+ g_variant_iter_free(svc_iter);
+
goto done;
}
}
g_variant_iter_free(char_iter);
g_variant_unref(value);
g_object_unref(proxy);
+ g_variant_unref(char_value);
}
BT_EXPORT_API int bluetooth_gatt_discover_service_characteristics(
BT_CHECK_PARAMETER(service_handle, return);
BT_CHECK_ENABLED(return);
- g_conn = _bt_get_system_private_conn();
+ g_conn = _bt_get_system_common_conn();
retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
properties_proxy = g_dbus_proxy_new_sync(g_conn,
BT_CHECK_ENABLED(return);
- g_conn = _bt_get_system_private_conn();
+ g_conn = _bt_get_system_common_conn();
retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
properties_proxy = g_dbus_proxy_new_sync(g_conn,
BT_CHECK_PARAMETER(char_uuid, return);
BT_CHECK_ENABLED(return);
- g_conn = _bt_get_system_private_conn();
+ g_conn = _bt_get_system_common_conn();
retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
properties_proxy = g_dbus_proxy_new_sync(g_conn,
BT_CHECK_ENABLED(return);
- g_conn = _bt_get_system_private_conn();
+ g_conn = _bt_get_system_common_conn();
retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
properties_proxy = g_dbus_proxy_new_sync(g_conn,
BT_DBG("+");
- system_gconn = _bt_get_system_private_conn();
+ system_gconn = _bt_get_system_common_conn();
value = g_dbus_connection_call_finish(system_gconn, res, &error);
user_info = _bt_get_user_data(BT_COMMON);
BT_CHECK_PARAMETER(chr, return);
BT_CHECK_ENABLED(return);
- conn = _bt_get_system_private_conn();
+ conn = _bt_get_system_common_conn();
retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
resp_data = g_malloc0(sizeof(bt_gatt_resp_data_t));
int att_ecode = 0;
bt_gatt_resp_data_t *resp_data = user_data;
- system_gconn = _bt_get_system_private_conn();
+ system_gconn = _bt_get_system_common_conn();
value = g_dbus_connection_call_finish(system_gconn, res, &error);
user_info = _bt_get_user_data(BT_COMMON);
GVariant *val, *options;
GVariantBuilder *builder1;
GVariantBuilder *builder2;
- GError *error = NULL;
GDBusConnection *conn;
int i = 0;
guint16 offset = 0;
retv_if(length == 0, BLUETOOTH_ERROR_INVALID_PARAM);
BT_CHECK_ENABLED(return);
- conn = _bt_get_system_private_conn();
+ conn = _bt_get_system_common_conn();
retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
builder1 = g_variant_builder_new(G_VARIANT_TYPE("ay"));
(GAsyncReadyCallback)__bluetooth_internal_write_cb,
NULL);
-
- if (error) {
- BT_ERR("Set value Failed: %s", error->message);
- g_clear_error(&error);
- g_variant_builder_unref(builder1);
- return BLUETOOTH_ERROR_INTERNAL;
- }
g_variant_builder_unref(builder1);
g_variant_builder_unref(builder2);
retv_if(length == 0, BLUETOOTH_ERROR_INVALID_PARAM);
BT_CHECK_ENABLED_INTERNAL(return);
- conn = _bt_get_system_private_conn();
+ conn = _bt_get_system_common_conn();
retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
builder1 = g_variant_builder_new(G_VARIANT_TYPE("ay"));
retv_if(length == 0, BLUETOOTH_ERROR_INVALID_PARAM);
BT_CHECK_ENABLED(return);
- conn = _bt_get_system_private_conn();
+ conn = _bt_get_system_common_conn();
retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
builder1 = g_variant_builder_new(G_VARIANT_TYPE("ay"));
const gchar *key;
char_descriptor_type_t desc_type = TYPE_NONE;
- g_conn = _bt_get_system_private_conn();
+ g_conn = _bt_get_system_common_conn();
retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
properties_proxy = g_dbus_proxy_new_sync(g_conn,
g_variant_iter_free(char_iter);
g_variant_unref(value);
+ g_variant_unref(char_value);
BT_DBG("-");
}
-BT_EXPORT_API int bluetooth_gatt_discover_characteristic_descriptor(
+BT_EXPORT_API int bltooth_gatt_discover_characteristic_descriptor(
const char *characteristic_handle)
{
GDBusProxy *properties_proxy = NULL;
BT_CHECK_PARAMETER(characteristic_handle, return);
BT_CHECK_ENABLED(return);
- g_conn = _bt_get_system_private_conn();
+ g_conn = _bt_get_system_common_conn();
retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
properties_proxy = g_dbus_proxy_new_sync(g_conn,
BT_DBG("+");
- system_gconn = _bt_get_system_private_conn();
+ system_gconn = _bt_get_system_common_conn();
value = g_dbus_connection_call_finish(system_gconn, res, &error);
user_info = _bt_get_user_data(BT_COMMON);
BT_CHECK_PARAMETER(desc, return);
BT_CHECK_ENABLED(return);
- conn = _bt_get_system_private_conn();
+ conn = _bt_get_system_common_conn();
retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
resp_data = g_malloc0(sizeof(bt_gatt_resp_data_t));
BT_DBG("+");
- system_gconn = _bt_get_system_private_conn();
+ system_gconn = _bt_get_system_common_conn();
value = g_dbus_connection_call_finish(system_gconn, res, &error);
user_info = _bt_get_user_data(BT_COMMON);
retv_if(length == 0, BLUETOOTH_ERROR_INVALID_PARAM);
BT_CHECK_ENABLED(return);
- conn = _bt_get_system_private_conn();
+ conn = _bt_get_system_common_conn();
retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
builder1 = g_variant_builder_new(G_VARIANT_TYPE("ay"));
BT_INFO_C("### Enable CCCD : %s [%s]", char_handle + 15, svc_name);
- conn = _bt_get_system_private_conn();
+ conn = _bt_get_system_common_conn();
retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
g_dbus_connection_call_sync(conn,
BT_INFO("Disable CCCD : %s", char_handle);
- conn = _bt_get_system_private_conn();
+ conn = _bt_get_system_common_conn();
retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
g_dbus_connection_call_sync(conn,
return ret;
}
-#ifdef TIZEN_GATT_CLIENT
void __bt_uuid_hex_to_string(unsigned char *uuid, char *str)
{
uint32_t uuid0, uuid4;
/* Now fill all the char handles [UUID and Instance ID's]*/
for (count = 0; count < props->count; count++) {
- BT_INFO("[%d] %s instance_id [%d] properties [%d]",
+ BT_DBG("[%d] %s instance_id [%d] properties [%d]",
count, props->uuids[count], props->inst_id[count], props->props[count]);
g_strlcpy(service->char_handle.uuids[count],
/* Now fill all the descriptor handles [UUID and Instance ID's]*/
for (count = 0; count < props->count; count++) {
- BT_INFO("[%d] %s instance_id [%d]",
+ BT_DBG("[%d] %s instance_id [%d]",
count, props->uuids[count], props->inst_id[count]);
g_strlcpy(charc->char_desc_handle.uuids[count],
BT_ERR("chr_info is invalid");
return FALSE;
}
+
+ if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR)) {
+ BT_ERR("Error : GIOCondition %d, [%s]", cond, chr_info->UUID);
+ g_io_channel_shutdown(gio, TRUE, NULL);
+ g_io_channel_unref(gio);
+
+ gatt_characteristic_notify_list = g_slist_remove(gatt_characteristic_notify_list, chr_info);
+ g_free(chr_info);
+
+ return FALSE;
+ }
+
if (cond & G_IO_IN) {
GIOStatus status = G_IO_STATUS_NORMAL;
GError *err = NULL;
return TRUE;
}
- if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR)) {
- BT_ERR("Error : GIOCondition %d, [%s]", cond, chr_info->UUID);
- g_io_channel_shutdown(gio, TRUE, NULL);
- g_io_channel_unref(gio);
-
- gatt_characteristic_notify_list = g_slist_remove(gatt_characteristic_notify_list, chr_info);
- g_free(chr_info);
-
- return FALSE;
- }
-
return TRUE;
}
int fd = -1;
fd_list_array = g_unix_fd_list_steal_fds(out_fd_list, &len);
- BT_INFO("Num fds in fd_list is : %d, fd_list[0]: %d", len, fd_list_array[0]);
+ BT_DBG("Num fds in fd_list is : %d, fd_list[0]: %d", len, fd_list_array[0]);
fd = fd_list_array[0];
mtu = g_array_index(out_param, int, 0);
return FALSE;
if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR)) {
- BT_ERR("Error : GIOCondition %d, [%s]", cond, chr_info->UUID);
+ char uuid_str[37];
+ _bt_convert_uuid_type_to_string(uuid_str, chr_info->UUID);
+ BT_ERR("Error : GIOCondition %d, [%s]", cond, uuid_str);
g_io_channel_shutdown(gio, TRUE, NULL);
g_io_channel_unref(gio);
if (written != length) {
att_result = BLUETOOTH_ERROR_INTERNAL;
BT_ERR("write data failed. ret : %d ", written);
+ if (TIZEN_FEATURE_DA_REFERENCE) {
+ /* If bluetooth_gatt_client_write_channel_watch_cb() is not called
+ * due to a server issue and write request fails,
+ * remove the existing fd from the list and reallocate it.*/
+ GSList *l;
+ for (l = gatt_characteristic_write_list; l != NULL; l = l->next) {
+ bt_gatt_characteristic_write_info_t *info = l->data;
+ if (!info)
+ continue;
+ if (info->write_fd == fd) {
+ gatt_characteristic_write_list = g_slist_remove(gatt_characteristic_write_list, info);
+ break;
+ }
+ }
+ }
}
return att_result;
mtu = g_array_index(out_param, int, 0);
if (result != BLUETOOTH_ERROR_NONE) {
- BT_ERR("Fail to get Write FD. result %d", result);
- BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
- return result;
+ BT_ERR("Fail to get Write FD. result %d", result);
+ BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+ return result;
} else if (NULL == out_fd_list) {
BT_ERR("out_fd_list is NULL");
+ BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
return BLUETOOTH_ERROR_INTERNAL;
} else {
int *fd_list_array;
int len = 0;
- if (!out_fd_list) {
- BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
- return BLUETOOTH_ERROR_INTERNAL;
- }
-
fd_list_array = g_unix_fd_list_steal_fds(out_fd_list, &len);
fd = fd_list_array[0];
if (result != BLUETOOTH_ERROR_NONE)
BT_ERR("GATT Client Unregistration failed result [%d]", result);
- else
- BT_INFO("GATT Client Unregistration successful");
/* Unregister event handler if this is the only instance */
event_info = _bt_event_get_cb_data(BT_GATT_CLIENT_EVENT);
if (event_info) {
count = (int*)event_info->user_data;
- BT_INFO("Total num of GATT client instances [%d]", *count);
+ BT_DBG("Total num of GATT client instances [%d]", *count);
if (*count == 1) {
BT_DBG("Currently only one GATT client instance, so remove it and unregister GATT client events");
return result;
}
-#endif
+BT_EXPORT_API int bluetooth_gatt_client_read_phy(const bluetooth_device_address_t *device_address)
+{
+ int result;
+
+ BT_CHECK_PARAMETER(device_address, return);
+ BT_CHECK_ENABLED(return);
+
+ BT_INIT_PARAMS();
+ BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+ g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
+
+ result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GATT_CLIENT_READ_PHY,
+ in_param1, in_param2, in_param3, in_param4, &out_param);
+
+ if (result != BLUETOOTH_ERROR_NONE)
+ BT_INFO("GATT Client Read PHY failed result [%d]", result);
+ else
+ BT_INFO("GATT Client Read PHY successful");
+
+ BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+ return result;
+}
+
+BT_EXPORT_API int bluetooth_gatt_client_set_phy(const bluetooth_device_address_t *device_address,
+ int tx_phy, int rx_phy, int phy_options)
+{
+ int result;
+
+ BT_CHECK_PARAMETER(device_address, return);
+ BT_CHECK_ENABLED(return);
+
+ BT_INFO("Set PHY: Tx[%d], Rx[%d], Phy_options[%d]", tx_phy, rx_phy, phy_options);
+
+ BT_INIT_PARAMS();
+ BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+ g_array_append_vals(in_param1, device_address, sizeof(bluetooth_device_address_t));
+ g_array_append_vals(in_param2, &tx_phy, sizeof(int));
+ g_array_append_vals(in_param3, &rx_phy, sizeof(int));
+ g_array_append_vals(in_param4, &phy_options, sizeof(int));
+
+ result = _bt_send_request(BT_BLUEZ_SERVICE, BT_GATT_CLIENT_SET_PHY,
+ in_param1, in_param2, in_param3, in_param4, &out_param);
+
+ if (result != BLUETOOTH_ERROR_NONE)
+ BT_INFO("GATT Client Set PHY failed result [%d]", result);
+ else
+ BT_INFO("GATT Client Set PHY successful");
+
+ BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+
+ return result;
+}