X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bt-service%2Fbt-service-oob.c;h=77ca5ca4fb32ac7ed2e6981893e1dac5aa918371;hb=d3072a95f5ef23bf7749832d5873a5ee200aaffb;hp=77ffa3cb0bf4bdd8c750fe015fc68a3dff002674;hpb=d9b08c1cb048357d6bdfc8ce9ce6f59ef364a4ad;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 77ffa3c..77ca5ca --- a/bt-service/bt-service-oob.c +++ b/bt-service/bt-service-oob.c @@ -1,5 +1,11 @@ /* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * Bluetooth-frwk + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Hocheol Seo + * Girishashok Joshi + * Chanyeol Park * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,27 +31,42 @@ #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) { GDBusProxy *proxy; GVariant *reply; GError *err = NULL; char *adapter_path; - unsigned char *local_hash = NULL; - unsigned char *local_randomizer = NULL; GDBusConnection *conn; - GVariant *hash = NULL; - GVariant *randomizer = NULL; + 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); - proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE, NULL, BT_BLUEZ_NAME, adapter_path, @@ -76,35 +97,37 @@ int _bt_oob_read_local_data(bt_oob_data_t *local_oob_data) return BLUETOOTH_ERROR_INTERNAL; } - g_variant_get(reply ,"(@ay@ay)", &hash, &randomizer); + g_variant_get(reply, "(@ay@ay@ay@ay)", &hash192, &randomizer192, + &hash256, &randomizer256); g_variant_unref(reply); - if(hash != NULL){ - local_oob_data->hash_len = (unsigned int)g_variant_get_size(hash); - local_hash = (unsigned char *)g_variant_get_data(hash); - } else { - BT_ERR("hash is NULL"); - return BLUETOOTH_ERROR_INTERNAL; + 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); } - g_variant_unref(hash); - - if(randomizer != NULL){ - local_oob_data->randomizer_len = (unsigned int)g_variant_get_size(randomizer); - local_randomizer = (unsigned char *)g_variant_get_data(randomizer); - } else { - BT_ERR("randomizer is NULL"); - return BLUETOOTH_ERROR_INTERNAL; + 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); } - g_variant_unref(randomizer); - - if (local_oob_data->hash_len > 0) - memcpy(local_oob_data->hash, local_hash, local_oob_data->hash_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); + } - if (local_oob_data->randomizer_len > 0) - memcpy(local_oob_data->randomizer, local_randomizer, - local_oob_data->randomizer_len); + 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; } @@ -113,6 +136,7 @@ int _bt_oob_add_remote_data( bluetooth_device_address_t *remote_device_address, bt_oob_data_t *remote_oob_data) { + int i; GDBusProxy *proxy; GVariant *reply; GError *err = NULL; @@ -122,22 +146,23 @@ int _bt_oob_add_remote_data( unsigned char *remote_hash; unsigned char *remote_randomizer; GDBusConnection *conn; - GArray *in_param1 = NULL; - GArray *in_param2 = NULL; - GVariant *hash; - GVariant *randomizer; + 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); + _bt_convert_addr_type_to_string(address, remote_device_address->addr); proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE, NULL, @@ -153,41 +178,57 @@ int _bt_oob_add_remote_data( return BLUETOOTH_ERROR_INTERNAL; } + /* 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); - BT_DBG("remote hash len = [%d] and remote random len = [%d]\n", - remote_oob_data->hash_len, remote_oob_data->randomizer_len); - /*Create array of bytes variant*/ - in_param1 = g_array_new(TRUE, TRUE, sizeof(gchar)); - in_param2 = g_array_new(TRUE, TRUE, sizeof(gchar)); + 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->hash_len; i++) + g_variant_builder_add(builder, "y", remote_hash[i]); - g_array_append_vals(in_param1, remote_hash, - remote_oob_data->hash_len); - g_array_append_vals(in_param2, remote_randomizer, - remote_oob_data->randomizer_len); + for (i = 0; i < remote_oob_data->randomizer_len; i++) + g_variant_builder_add(builder2, "y", remote_randomizer[i]); - hash = g_variant_new_from_data((const GVariantType *)"ay", - in_param1->data, in_param1->len, - TRUE, NULL, NULL); + hash192 = g_variant_new("ay", builder); + randomizer192 = g_variant_new("ay", builder2); - randomizer = g_variant_new_from_data((const GVariantType *)"ay", - in_param2->data, in_param2->len, - TRUE, NULL, NULL); + g_variant_builder_unref(builder2); + g_variant_builder_unref(builder); - g_array_free(in_param1, TRUE); - g_array_free(in_param2, TRUE); + /* P-256 */ + remote_hash = remote_oob_data->hash256; + remote_randomizer = remote_oob_data->randomizer256; - /* Call AddRemoteData Method*/ + 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", dev_addr, hash, randomizer), + 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); - /* Check the reply*/ + /* Check the reply */ if (reply == NULL) { BT_ERR("AddRemoteData dBUS-RPC is failed"); if (err != NULL) { @@ -197,8 +238,8 @@ int _bt_oob_add_remote_data( } return BLUETOOTH_ERROR_INTERNAL; } - g_variant_unref(reply); + return BLUETOOTH_ERROR_NONE; } @@ -215,7 +256,7 @@ int _bt_oob_remove_remote_data( 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(); @@ -242,7 +283,7 @@ int _bt_oob_remove_remote_data( /* Call RemoveRemoteData Method*/ reply = g_dbus_proxy_call_sync(proxy, "RemoveRemoteData", - g_variant_new("s", dev_addr), + g_variant_new("(s)", dev_addr), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err); g_object_unref(proxy); @@ -263,3 +304,68 @@ int _bt_oob_remove_remote_data( 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; +} +