*
*/
-#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;
}
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;
}
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();
_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;
+}
+
+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;
}