Add the session timer to handle the exception case
[platform/core/connectivity/bluetooth-frwk.git] / bt-service / bt-service-oob.c
index e517701..77ca5ca 100644 (file)
@@ -1,13 +1,17 @@
 /*
- * bluetooth-frwk
+ * Bluetooth-frwk
  *
- * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ * 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.
  * You may obtain a copy of the License at
  *
- *              http://www.apache.org/licenses/LICENSE-2.0
+ *             http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  *
  */
 
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus.h>
 #include <glib.h>
 #include <dlog.h>
 #include <string.h>
+#include <gio/gio.h>
 
 #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;
 }
@@ -94,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;
 }
@@ -163,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();
@@ -182,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_DBG("%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;
 }