Merge "DPM: Add basic code for device policy manager for BT." into tizen
[platform/core/connectivity/bluetooth-frwk.git] / bt-service / bt-service-oob.c
old mode 100644 (file)
new mode 100755 (executable)
index d436b5d..77ffa3c
@@ -1,11 +1,5 @@
 /*
- * 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>
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  *
  */
 
-#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"
 
 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 *hash = NULL;
+       GVariant *randomizer = NULL;
 
        BT_CHECK_PARAMETER(local_oob_data, return);
 
@@ -50,46 +45,66 @@ int _bt_oob_read_local_data(bt_oob_data_t *local_oob_data)
        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);
+       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;
+       }
 
-       dbus_error_init(&err);
-       reply = dbus_connection_send_with_reply_and_block(conn,
-                                       msg, -1, &err);
+       g_variant_get(reply ,"(@ay@ay)", &hash, &randomizer);
+       g_variant_unref(reply);
 
-       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);
-               }
+       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 (!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_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 (NULL != local_hash)
+       g_variant_unref(randomizer);
+
+       if (local_oob_data->hash_len > 0)
                memcpy(local_oob_data->hash, local_hash, local_oob_data->hash_len);
 
-       if (NULL != local_randomizer)
+       if (local_oob_data->randomizer_len > 0)
                memcpy(local_oob_data->randomizer, local_randomizer,
-                                       local_oob_data->randomizer_len);
-
-       dbus_message_unref(reply);
+                               local_oob_data->randomizer_len);
 
        return BLUETOOTH_ERROR_NONE;
 }
@@ -98,15 +113,19 @@ 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;
+       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;
+       GArray *in_param1 = NULL;
+       GArray *in_param2 = NULL;
+       GVariant *hash;
+       GVariant *randomizer;
 
        BT_CHECK_PARAMETER(remote_device_address, return);
        BT_CHECK_PARAMETER(remote_oob_data, return);
@@ -120,60 +139,79 @@ int _bt_oob_add_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, "AddRemoteData");
-
+       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);
-
-       BT_DBG("remote hash len = [%d] and remote random len = [%d]\n",
-               remote_oob_data->hash_len, remote_oob_data->randomizer_len);
+       if (!proxy) {
+               BT_ERR("Unable to create proxy");
+               if (err) {
+                       BT_ERR("Error: %s", err->message);
+                       g_clear_error(&err);
+               }
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
 
        remote_hash = remote_oob_data->hash;
        remote_randomizer = remote_oob_data->randomizer;
-
        dev_addr = g_strdup(address);
 
-       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;
+       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));
+
+       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);
+
+       hash = g_variant_new_from_data((const GVariantType *)"ay",
+                       in_param1->data, in_param1->len,
+                       TRUE, NULL, NULL);
+
+       randomizer = g_variant_new_from_data((const GVariantType *)"ay",
+                       in_param2->data, in_param2->len,
+                       TRUE, NULL, NULL);
+
+       g_array_free(in_param1, TRUE);
+       g_array_free(in_param2, TRUE);
+
+       /* Call AddRemoteData Method*/
+       reply = g_dbus_proxy_call_sync(proxy, "AddRemoteData",
+                       g_variant_new("s@ay@ay", dev_addr, hash, randomizer),
+                       G_DBUS_CALL_FLAGS_NONE, -1,
+                       NULL, &err);
+       g_object_unref(proxy);
+       g_free(dev_addr);
+
+       /* 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_free(dev_addr);
-       dbus_message_unref(reply);
-
+       g_variant_unref(reply);
        return BLUETOOTH_ERROR_NONE;
 }
 
 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);
 
@@ -186,36 +224,42 @@ 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;
 }