X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bt-service%2Fbt-service-oob.c;h=77ca5ca4fb32ac7ed2e6981893e1dac5aa918371;hb=a0e93a330aa0362824aa37ab8aebd20a3127a434;hp=d436b5de503d960665332e325899c18abbd47b66;hpb=f8cd843634b70ab96c83bd552606c197fcf5decc;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git diff --git a/bt-service/bt-service-oob.c b/bt-service/bt-service-oob.c old mode 100755 new mode 100644 index d436b5d..77ca5ca --- a/bt-service/bt-service-oob.c +++ b/bt-service/bt-service-oob.c @@ -21,75 +21,113 @@ * */ -#include -#include #include #include #include +#include #include "bluetooth-api.h" #include "bt-service-common.h" #include "bt-service-oob.h" #include "bt-service-event.h" +static int __get_oob_data_from_variant(GVariant *variant, + unsigned char *buf, int size) +{ + int i; + unsigned char *v; + + i = g_variant_get_size(variant); + v = (unsigned char *)g_variant_get_data(variant); + if (i && v) { + i = i > size ? size : i; + memcpy(buf, v, i); + } + + return i; +} + int _bt_oob_read_local_data(bt_oob_data_t *local_oob_data) { - DBusMessage *msg; - DBusMessage *reply; - DBusError err; + GDBusProxy *proxy; + GVariant *reply; + GError *err = NULL; char *adapter_path; - unsigned char *local_hash = NULL; - unsigned char *local_randomizer = NULL; - DBusConnection *conn; + GDBusConnection *conn; + GVariant *hash192 = NULL; + GVariant *randomizer192 = NULL; + GVariant *hash256 = NULL; + GVariant *randomizer256 = NULL; BT_CHECK_PARAMETER(local_oob_data, return); - conn = _bt_get_system_conn(); + conn = _bt_gdbus_get_system_gconn(); retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL); adapter_path = _bt_get_adapter_path(); retv_if(adapter_path == NULL, BLUETOOTH_ERROR_INTERNAL); - msg = dbus_message_new_method_call(BT_BLUEZ_NAME, adapter_path, - BT_OOB_INTERFACE, "ReadLocalData"); - + proxy = g_dbus_proxy_new_sync(conn, + G_DBUS_PROXY_FLAGS_NONE, NULL, + BT_BLUEZ_NAME, adapter_path, + BT_OOB_INTERFACE, NULL, &err); g_free(adapter_path); + if (!proxy) { + BT_ERR("Unable to create proxy"); + if (err) { + BT_ERR("Error: %s", err->message); + g_clear_error(&err); + } + return BLUETOOTH_ERROR_INTERNAL; + } - retv_if(msg == NULL, BLUETOOTH_ERROR_INTERNAL); - - dbus_error_init(&err); - reply = dbus_connection_send_with_reply_and_block(conn, - msg, -1, &err); - - dbus_message_unref(msg); - if (!reply) { - BT_ERR("Error in ReadLocalData \n"); - if (dbus_error_is_set(&err)) { - BT_ERR("%s", err.message); - dbus_error_free(&err); + reply = g_dbus_proxy_call_sync(proxy, "ReadLocalData", + NULL, + G_DBUS_CALL_FLAGS_NONE, -1, + NULL, &err); + g_object_unref(proxy); + + if (reply == NULL) { + BT_ERR("ReadLocalData dBUS-RPC is failed"); + if (err != NULL) { + BT_ERR("D-Bus API failure: errCode[%x], message[%s]", + err->code, err->message); + g_clear_error(&err); } return BLUETOOTH_ERROR_INTERNAL; } - if (!dbus_message_get_args(reply, NULL, - DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, - &local_hash, &local_oob_data->hash_len, - DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, - &local_randomizer, &local_oob_data->randomizer_len, - DBUS_TYPE_INVALID)) { - BT_ERR("Error in reading arguments\n"); - dbus_message_unref(reply); - return BLUETOOTH_ERROR_INVALID_DATA; + g_variant_get(reply, "(@ay@ay@ay@ay)", &hash192, &randomizer192, + &hash256, &randomizer256); + g_variant_unref(reply); + + if (hash192) { + local_oob_data->hash_len = __get_oob_data_from_variant(hash192, + local_oob_data->hash, + sizeof(local_oob_data->hash)); + g_variant_unref(hash192); } - if (NULL != local_hash) - memcpy(local_oob_data->hash, local_hash, local_oob_data->hash_len); + if (randomizer192) { + local_oob_data->randomizer_len = __get_oob_data_from_variant(randomizer192, + local_oob_data->randomizer, + sizeof(local_oob_data->randomizer)); + g_variant_unref(randomizer192); + } - if (NULL != local_randomizer) - memcpy(local_oob_data->randomizer, local_randomizer, - local_oob_data->randomizer_len); + if (hash256) { + local_oob_data->hash256_len = __get_oob_data_from_variant(hash256, + local_oob_data->hash256, + sizeof(local_oob_data->hash256)); + g_variant_unref(hash256); + } - dbus_message_unref(reply); + if (randomizer256) { + local_oob_data->randomizer256_len = __get_oob_data_from_variant(randomizer256, + local_oob_data->randomizer256, + sizeof(local_oob_data->randomizer256)); + g_variant_unref(randomizer256); + } return BLUETOOTH_ERROR_NONE; } @@ -98,68 +136,109 @@ int _bt_oob_add_remote_data( bluetooth_device_address_t *remote_device_address, bt_oob_data_t *remote_oob_data) { - DBusMessage *msg; - DBusMessage *reply; - DBusError err; + int i; + GDBusProxy *proxy; + GVariant *reply; + GError *err = NULL; char *dev_addr; char *adapter_path; char address[BT_ADDRESS_STRING_SIZE] = { 0 }; unsigned char *remote_hash; unsigned char *remote_randomizer; - DBusConnection *conn; + GDBusConnection *conn; + GVariantBuilder *builder; + GVariantBuilder *builder2; + GVariant *hash192; + GVariant *randomizer192; + GVariant *hash256; + GVariant *randomizer256; BT_CHECK_PARAMETER(remote_device_address, return); BT_CHECK_PARAMETER(remote_oob_data, return); - conn = _bt_get_system_conn(); + conn = _bt_gdbus_get_system_gconn(); retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL); adapter_path = _bt_get_adapter_path(); retv_if(adapter_path == NULL, BLUETOOTH_ERROR_INTERNAL); - _bt_convert_addr_type_to_string(address, - remote_device_address->addr); - - msg = dbus_message_new_method_call(BT_BLUEZ_NAME, adapter_path, - BT_OOB_INTERFACE, "AddRemoteData"); + _bt_convert_addr_type_to_string(address, remote_device_address->addr); + proxy = g_dbus_proxy_new_sync(conn, + G_DBUS_PROXY_FLAGS_NONE, NULL, + BT_BLUEZ_NAME, adapter_path, + BT_OOB_INTERFACE, NULL, &err); g_free(adapter_path); + if (!proxy) { + BT_ERR("Unable to create proxy"); + if (err) { + BT_ERR("Error: %s", err->message); + g_clear_error(&err); + } + return BLUETOOTH_ERROR_INTERNAL; + } - retv_if(msg == NULL, BLUETOOTH_ERROR_INTERNAL); - - BT_DBG("remote hash len = [%d] and remote random len = [%d]\n", - remote_oob_data->hash_len, remote_oob_data->randomizer_len); + /* Remote address */ + dev_addr = g_strdup(address); + /* P-192 */ remote_hash = remote_oob_data->hash; remote_randomizer = remote_oob_data->randomizer; - dev_addr = g_strdup(address); + builder = g_variant_builder_new(G_VARIANT_TYPE("ay")); + builder2 = g_variant_builder_new(G_VARIANT_TYPE("ay")); - dbus_message_append_args(msg, - DBUS_TYPE_STRING, &dev_addr, - DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, - &remote_hash, remote_oob_data->hash_len, - DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, - &remote_randomizer, remote_oob_data->randomizer_len, - DBUS_TYPE_INVALID); - - dbus_error_init(&err); - reply = dbus_connection_send_with_reply_and_block(conn, - msg, -1, &err); - - dbus_message_unref(msg); - if (!reply) { - BT_ERR("Error in AddRemoteData \n"); - if (dbus_error_is_set(&err)) { - BT_ERR("%s", err.message); - dbus_error_free(&err); - g_free(dev_addr); - return BLUETOOTH_ERROR_INTERNAL; - } - } + for (i = 0; i < remote_oob_data->hash_len; i++) + g_variant_builder_add(builder, "y", remote_hash[i]); + + for (i = 0; i < remote_oob_data->randomizer_len; i++) + g_variant_builder_add(builder2, "y", remote_randomizer[i]); + hash192 = g_variant_new("ay", builder); + randomizer192 = g_variant_new("ay", builder2); + + g_variant_builder_unref(builder2); + g_variant_builder_unref(builder); + + /* P-256 */ + remote_hash = remote_oob_data->hash256; + remote_randomizer = remote_oob_data->randomizer256; + + builder = g_variant_builder_new(G_VARIANT_TYPE("ay")); + builder2 = g_variant_builder_new(G_VARIANT_TYPE("ay")); + + for (i = 0; i < remote_oob_data->hash256_len; i++) + g_variant_builder_add(builder, "y", remote_hash[i]); + + for (i = 0; i < remote_oob_data->randomizer256_len; i++) + g_variant_builder_add(builder2, "y", remote_randomizer[i]); + + hash256 = g_variant_new("ay", builder); + randomizer256 = g_variant_new("ay", builder2); + + g_variant_builder_unref(builder2); + g_variant_builder_unref(builder); + + /* Call AddRemoteData Method */ + reply = g_dbus_proxy_call_sync(proxy, "AddRemoteData", + g_variant_new("(s@ay@ay@ay@ay)", dev_addr, + hash192, randomizer192, hash256, randomizer256), + G_DBUS_CALL_FLAGS_NONE, -1, + NULL, &err); + g_object_unref(proxy); g_free(dev_addr); - dbus_message_unref(reply); + + /* Check the reply */ + if (reply == NULL) { + BT_ERR("AddRemoteData dBUS-RPC is failed"); + if (err != NULL) { + 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(reply); return BLUETOOTH_ERROR_NONE; } @@ -167,17 +246,17 @@ int _bt_oob_add_remote_data( int _bt_oob_remove_remote_data( bluetooth_device_address_t *remote_device_address) { - DBusMessage *msg; - DBusMessage *reply; - DBusError err; + GDBusProxy *proxy; + GVariant *reply; + GError *err = NULL; char *dev_addr; char *adapter_path; char address[BT_ADDRESS_STRING_SIZE] = { 0 }; - DBusConnection *conn; + GDBusConnection *conn; BT_CHECK_PARAMETER(remote_device_address, return); - conn = _bt_get_system_conn(); + conn = _bt_gdbus_get_system_gconn(); retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL); adapter_path = _bt_get_adapter_path(); @@ -186,35 +265,106 @@ int _bt_oob_remove_remote_data( _bt_convert_addr_type_to_string(address, remote_device_address->addr); - msg = dbus_message_new_method_call(BT_BLUEZ_NAME, adapter_path, - BT_OOB_INTERFACE, "RemoveRemoteData"); - + proxy = g_dbus_proxy_new_sync(conn, + G_DBUS_PROXY_FLAGS_NONE, NULL, + BT_BLUEZ_NAME, adapter_path, + BT_OOB_INTERFACE, NULL, &err); g_free(adapter_path); - - retv_if(msg == NULL, BLUETOOTH_ERROR_INTERNAL); + if (!proxy) { + BT_ERR("Unable to create proxy"); + if (err) { + BT_ERR("Error: %s", err->message); + g_clear_error(&err); + } + return BLUETOOTH_ERROR_INTERNAL; + } dev_addr = g_strdup(address); - dbus_message_append_args(msg, DBUS_TYPE_STRING, - &dev_addr, DBUS_TYPE_INVALID); - - dbus_error_init(&err); - reply = dbus_connection_send_with_reply_and_block(conn, - msg, -1, &err); - - dbus_message_unref(msg); - if (!reply) { - BT_ERR("Error in RemoveRemoteData \n"); - if (dbus_error_is_set(&err)) { - BT_ERR("%s", err.message); - dbus_error_free(&err); - g_free(dev_addr); - return BLUETOOTH_ERROR_INTERNAL; + /* Call RemoveRemoteData Method*/ + reply = g_dbus_proxy_call_sync(proxy, "RemoveRemoteData", + g_variant_new("(s)", dev_addr), + G_DBUS_CALL_FLAGS_NONE, -1, + NULL, &err); + g_object_unref(proxy); + g_free(dev_addr); + + /* Check the reply*/ + if (reply == NULL) { + BT_ERR("RemoveRemoteData dBUS-RPC is failed"); + if (err != NULL) { + BT_ERR("D-Bus API failure: errCode[%x], message[%s]", + err->code, err->message); + g_clear_error(&err); } + return BLUETOOTH_ERROR_INTERNAL; } - g_free(dev_addr); - dbus_message_unref(reply); + g_variant_unref(reply); + return BLUETOOTH_ERROR_NONE; +} + +int _bt_le_oob_read_local_data(bt_oob_data_t *local_oob_data) +{ + GDBusProxy *proxy; + GVariant *reply; + GError *err = NULL; + char *adapter_path; + GDBusConnection *conn; + GVariant *eir = NULL; + + BT_CHECK_PARAMETER(local_oob_data, return); + + conn = _bt_gdbus_get_system_gconn(); + retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL); + + adapter_path = _bt_get_adapter_path(); + retv_if(adapter_path == NULL, BLUETOOTH_ERROR_INTERNAL); + + proxy = g_dbus_proxy_new_sync(conn, + G_DBUS_PROXY_FLAGS_NONE, NULL, + BT_BLUEZ_NAME, adapter_path, + BT_OOB_INTERFACE, NULL, &err); + g_free(adapter_path); + if (!proxy) { + BT_ERR("Unable to create proxy"); + if (err) { + BT_ERR("Error: %s", err->message); + g_clear_error(&err); + } + return BLUETOOTH_ERROR_INTERNAL; + } + + if (device_power_request_lock(POWER_LOCK_CPU, 2000) != DEVICE_ERROR_NONE) + BT_ERR("device_power_request_lock() failed"); + else + BT_ERR("device_power_request_lock() succeed"); + + reply = g_dbus_proxy_call_sync(proxy, "LEReadLocalData", + NULL, + G_DBUS_CALL_FLAGS_NONE, -1, + NULL, &err); + g_object_unref(proxy); + + if (reply == NULL) { + BT_ERR("LEReadLocalData dBUS-RPC is failed"); + if (err != NULL) { + BT_ERR("D-Bus API failure: errCode[%x], message[%s]", + err->code, err->message); + g_clear_error(&err); + } + return BLUETOOTH_ERROR_INTERNAL; + } + + g_variant_get(reply, "(@ay)", &eir); + g_variant_unref(reply); + + if (eir) { + local_oob_data->eir_len = __get_oob_data_from_variant(eir, + local_oob_data->eir, + sizeof(local_oob_data->eir)); + g_variant_unref(eir); + } return BLUETOOTH_ERROR_NONE; }