Ignore vconfkey value change for AVC mode on
[platform/core/connectivity/bluetooth-frwk.git] / bt-service / bt-service-oob.c
old mode 100755 (executable)
new mode 100644 (file)
index 77ffa3c..77ca5ca
@@ -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 <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,
@@ -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;
+}
+