/*
- * 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 <hocheol.seo@samsung.com>
+ * Girishashok Joshi <girish.joshi@samsung.com>
+ * Chanyeol Park <chanyeol.park@samsung.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#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,
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;
}
bluetooth_device_address_t *remote_device_address,
bt_oob_data_t *remote_oob_data)
{
+ int i;
GDBusProxy *proxy;
GVariant *reply;
GError *err = NULL;
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,
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) {
}
return BLUETOOTH_ERROR_INTERNAL;
}
-
g_variant_unref(reply);
+
return BLUETOOTH_ERROR_NONE;
}
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();
/* 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);
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;
+}
+