/*
- * 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 <stdio.h>
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus.h>
+#include <gio/gio.h>
#include <glib.h>
#include <dlog.h>
#include <string.h>
#include <vconf.h>
-#include <status.h>
-#if !defined(LIBNOTIFY_SUPPORT) && !defined(LIBNOTIFICATION_SUPPORT)
#include <syspopup_caller.h>
-#endif
-#ifdef __TIZEN_MOBILE__
#include <aul.h>
-#endif
-#include <notification.h>
-#ifdef ENABLE_TIZEN_2_4
-#include <journal/device.h>
-#endif
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus.h>
+#include <bundle.h>
+#include <eventsystem.h>
+#include <bundle_internal.h>
#include "alarm.h"
-
#include "bluetooth-api.h"
#include "bt-internal-types.h"
-
#include "bt-service-common.h"
#include "bt-service-event.h"
#include "bt-service-adapter.h"
#include "bt-service-util.h"
#include "bt-service-network.h"
#include "bt-service-obex-server.h"
+#include "bt-service-opp-client.h"
#include "bt-service-agent.h"
#include "bt-service-main.h"
#include "bt-service-avrcp.h"
+#include "bt-service-device.h"
+#include "bt-service-adapter-le.h"
+
+#ifdef TIZEN_DPM_ENABLE
+#include "bt-service-dpm.h"
+#endif
typedef struct {
guint event_id;
int timeout;
time_t start_time;
- gboolean alarm_init;
int alarm_id;
} bt_adapter_timer_t;
bt_adapter_timer_t visible_timer = {0, };
+typedef struct {
+ alarm_id_t alarm_id;
+ bt_set_alarm_cb callback;
+ void *user_data;
+} bt_service_alarm_t;
+
+typedef struct {
+ gboolean is_alarm_initialized;
+ GList *g_alarm_list;
+} bt_service_alarm_mgr_t;
+
+static bt_service_alarm_mgr_t alarm_mgr = {0, };
+
static gboolean is_discovering;
-static gboolean is_le_discovering;
-static bt_le_discovery_type_t le_discovery_type = BT_LE_PASSIVE_SCAN;
static gboolean cancel_by_user;
static bt_status_t adapter_status = BT_DEACTIVATED;
static bt_le_status_t adapter_le_status = BT_LE_DEACTIVATED;
+static gboolean is_le_intended = FALSE;
static void *adapter_agent = NULL;
-static DBusGProxy *core_proxy = NULL;
+static GDBusProxy *core_proxy = NULL;
static guint timer_id = 0;
static guint le_timer_id = 0;
+static gboolean is_recovery_mode;
+static gboolean in_power_off;
+
+static guint poweroff_subscribe_id;
+static uint status_reg_id;
#define BT_CORE_NAME "org.projectx.bt_core"
#define BT_CORE_PATH "/org/projectx/bt_core"
#define BT_DISABLE_TIME 500 /* 500 ms */
-DBusGProxy *_bt_init_core_proxy(void)
+static int alarm_cb(alarm_id_t alarm_id, void* user_param);
+static void alarm_data_free(void *data);
+
+GDBusProxy *_bt_init_core_proxy(void)
{
- DBusGProxy *proxy;
- DBusGConnection *conn;
+ GDBusProxy *proxy;
+ GDBusConnection *conn;
- conn = _bt_get_system_gconn();
+ conn = _bt_gdbus_get_system_gconn();
if (!conn)
return NULL;
- proxy = dbus_g_proxy_new_for_name(conn, BT_CORE_NAME,
- BT_CORE_PATH, BT_CORE_INTERFACE);
+ proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ BT_CORE_NAME,
+ BT_CORE_PATH,
+ BT_CORE_INTERFACE,
+ NULL, NULL);
+
if (!proxy)
return NULL;
- core_proxy = proxy;
+ core_proxy = proxy;
- return proxy;
+ return proxy;
}
-static DBusGProxy *__bt_get_core_proxy(void)
+static GDBusProxy *__bt_get_core_proxy(void)
{
- return (core_proxy) ? core_proxy : _bt_init_core_proxy();
+ return (core_proxy) ? core_proxy : _bt_init_core_proxy();
}
static gboolean __bt_is_factory_test_mode(void)
{
int mode = 0;
-#ifdef ENABLE_TIZEN_2_4
if (vconf_get_bool(VCONFKEY_BT_DUT_MODE, &mode)) {
BT_ERR("Get the DUT Mode fail");
return TRUE;
}
-#endif
if (mode != FALSE) {
BT_INFO("DUT Test Mode !!");
/* Send event to application */
_bt_send_event(BT_ADAPTER_EVENT,
BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED,
- DBUS_TYPE_INT32, &result,
- DBUS_TYPE_INT16, &time_diff,
- DBUS_TYPE_INVALID);
+ g_variant_new("(in)", result, time_diff));
if (visible_timer.timeout <= time_diff) {
g_source_remove(visible_timer.event_id);
visible_timer.event_id = 0;
visible_timer.timeout = 0;
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
if (vconf_set_int(BT_FILE_VISIBLE_TIME, 0) != 0)
BT_ERR("Set vconf failed\n");
#endif
static int __bt_visibility_alarm_cb(alarm_id_t alarm_id, void* user_param)
{
- BT_DBG("__bt_visibility_alarm_cb - alram id = [%d] \n", alarm_id);
int result = BLUETOOTH_ERROR_NONE;
int timeout = 0;
if (visible_timer.event_id) {
_bt_send_event(BT_ADAPTER_EVENT,
BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED,
- DBUS_TYPE_INT32, &result,
- DBUS_TYPE_INT16, &timeout,
- DBUS_TYPE_INVALID);
+ g_variant_new("(in)", result, timeout));
g_source_remove(visible_timer.event_id);
visible_timer.event_id = 0;
visible_timer.timeout = 0;
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
if (vconf_set_int(BT_FILE_VISIBLE_TIME, 0) != 0)
BT_ERR("Set vconf failed\n");
#endif
return 0;
}
-static void __bt_visibility_alarm_create()
-{
- alarm_id_t alarm_id;
- int result;
-
- result = alarmmgr_add_alarm(ALARM_TYPE_VOLATILE, visible_timer.timeout,
- 0, NULL, &alarm_id);
- if(result < 0) {
- BT_ERR("Failed to create alarm error = %d\n", result);
- } else {
- BT_DBG("Alarm created = %d\n", alarm_id);
- visible_timer.alarm_id = alarm_id;
- }
-}
-
static void __bt_visibility_alarm_remove()
{
if (visible_timer.event_id > 0) {
}
if (visible_timer.alarm_id > 0) {
- alarmmgr_remove_alarm(visible_timer.alarm_id);
+ _bt_service_remove_alarm(visible_timer.alarm_id);
visible_timer.alarm_id = 0;
}
}
int __bt_set_visible_time(int timeout)
{
int result;
+ alarm_id_t alarm_id;
__bt_visibility_alarm_remove();
visible_timer.timeout = timeout;
-#ifndef TIZEN_WEARABLE
+#ifndef TIZEN_PROFILE_WEARABLE
+#ifdef TIZEN_DPM_ENABLE
+ if (_bt_dpm_get_bluetooth_limited_discoverable_state() != DPM_RESTRICTED) {
+#endif
if (vconf_set_int(BT_FILE_VISIBLE_TIME, timeout) != 0)
BT_ERR("Set vconf failed");
+#ifdef TIZEN_DPM_ENABLE
+ }
+#endif
#endif
- if (timeout <= 0)
- return BLUETOOTH_ERROR_NONE;
- if (!visible_timer.alarm_init) {
- /* Set Alarm timer to switch off BT */
- result = alarmmgr_init("bt-service");
- if (result != 0)
- return BLUETOOTH_ERROR_INTERNAL;
- visible_timer.alarm_init = TRUE;
- }
+ if (timeout <= 0)
+ return BLUETOOTH_ERROR_NONE;
- result = alarmmgr_set_cb(__bt_visibility_alarm_cb, NULL);
- if (result != 0)
+ result = _bt_service_set_alarm(visible_timer.timeout,
+ __bt_visibility_alarm_cb, NULL, &alarm_id);
+ if (result != BLUETOOTH_ERROR_NONE)
return BLUETOOTH_ERROR_INTERNAL;
-
+ visible_timer.alarm_id = alarm_id;
/* Take start time */
time(&(visible_timer.start_time));
visible_timer.event_id = g_timeout_add_seconds(1,
__bt_timeout_handler, NULL);
- __bt_visibility_alarm_create();
-
return BLUETOOTH_ERROR_NONE;
}
-static void __bt_get_service_list(GValue *value, bluetooth_device_info_t *dev)
+static void __bt_get_service_list(GVariant *value, bluetooth_device_info_t *dev)
{
- int i;
- char **uuids;
+ int i = 0;
char **parts;
+ GVariantIter *iter;
+ gchar *uuid = NULL;
ret_if(value == NULL);
ret_if(dev == NULL);
- uuids = g_value_get_boxed(value);
- ret_if(uuids == NULL);
-
dev->service_index = 0;
- for (i = 0; uuids[i] != NULL; i++) {
- g_strlcpy(dev->uuids[i], uuids[i], BLUETOOTH_UUID_STRING_MAX);
+ g_variant_get(value, "as", &iter);
+ while (g_variant_iter_loop(iter, "s", &uuid)) {
+ g_strlcpy(dev->uuids[i], uuid, BLUETOOTH_UUID_STRING_MAX);
+ parts = g_strsplit(uuid, "-", -1);
- parts = g_strsplit(uuids[i], "-", -1);
-
- if (parts == NULL || parts[0] == NULL)
+ if (parts == NULL || parts[0] == NULL) {
+ g_free(uuid);
break;
+ }
dev->service_list_array[i] = g_ascii_strtoull(parts[0], NULL, 16);
g_strfreev(parts);
dev->service_index++;
+ i++;
}
-}
-
-static bt_remote_dev_info_t *__bt_parse_remote_device_info(
- DBusMessageIter *item_iter)
-{
- DBusMessageIter value_iter;
- bt_remote_dev_info_t *dev_info;
-
- dbus_message_iter_recurse(item_iter, &value_iter);
-
- if (dbus_message_iter_get_arg_type(&value_iter) !=
- DBUS_TYPE_DICT_ENTRY) {
- BT_DBG("No entry");
- return NULL;
- }
-
- dev_info = g_malloc0(sizeof(bt_remote_dev_info_t));
-
- while (dbus_message_iter_get_arg_type(&value_iter) ==
- DBUS_TYPE_DICT_ENTRY) {
- char *value = NULL;
- char *key;
- DBusMessageIter dict_entry;
- DBusMessageIter iter_dict_val;
-
- dbus_message_iter_recurse(&value_iter, &dict_entry);
-
- dbus_message_iter_get_basic(&dict_entry, &key);
-
- if (key == NULL) {
- dbus_message_iter_next(&value_iter);
- continue;
- }
-
- if (!dbus_message_iter_next(&dict_entry)) {
- dbus_message_iter_next(&value_iter);
- continue;
- }
- dbus_message_iter_recurse(&dict_entry, &iter_dict_val);
-
- if (strcasecmp(key, "Address") == 0) {
- const char *address = NULL;
- dbus_message_iter_get_basic(&iter_dict_val,
- &address);
- dev_info->address = g_strdup(address);
- } else if (strcasecmp(key, "Class") == 0) {
- dbus_message_iter_get_basic(&iter_dict_val,
- &dev_info->class);
- } else if (strcasecmp(key, "Name") == 0) {
- dbus_message_iter_get_basic(&iter_dict_val,
- &value);
- if (dev_info->name == NULL)
- dev_info->name = g_strdup(value);
- } else if (strcasecmp(key, "Connected") == 0) {
- dbus_message_iter_get_basic(&iter_dict_val,
- &dev_info->connected);
- } else if (strcasecmp(key, "Paired") == 0) {
- dbus_message_iter_get_basic(&iter_dict_val,
- &dev_info->paired);
- } else if (strcasecmp(key, "Trusted") == 0) {
- dbus_message_iter_get_basic(&iter_dict_val,
- &dev_info->trust);
- } else if (strcasecmp(key, "RSSI") == 0) {
- dbus_message_iter_get_basic(&iter_dict_val,
- &dev_info->rssi);
- } else if (strcasecmp(key, "UUIDs") == 0) {
- DBusMessageIter uuid_iter;
- DBusMessageIter tmp_iter;
- int i = 0;
-
- dbus_message_iter_recurse(&iter_dict_val,
- &uuid_iter);
- tmp_iter = uuid_iter;
-
- /* Store the uuid count */
- while (dbus_message_iter_get_arg_type(&tmp_iter) !=
- DBUS_TYPE_INVALID) {
-
- dbus_message_iter_get_basic(&tmp_iter,
- &value);
-
- dev_info->uuid_count++;
- if (!dbus_message_iter_next(&tmp_iter))
- break;
- }
-
- /* Store the uuids */
- if (dev_info->uuid_count > 0) {
- dev_info->uuids = g_new0(char *,
- dev_info->uuid_count + 1);
- } else {
- dbus_message_iter_next(&value_iter);
- continue;
- }
-
- while (dbus_message_iter_get_arg_type(&uuid_iter) !=
- DBUS_TYPE_INVALID) {
- dbus_message_iter_get_basic(&uuid_iter,
- &value);
- dev_info->uuids[i] = g_strdup(value);
- i++;
- if (!dbus_message_iter_next(&uuid_iter)) {
- break;
- }
- }
- }
-
- dbus_message_iter_next(&value_iter);
- }
-
- return dev_info;
-}
-
-static void __bt_extract_remote_devinfo(DBusMessageIter *msg_iter,
- GArray **dev_list)
-{
- bt_remote_dev_info_t *dev_info = NULL;
- char *object_path = NULL;
- DBusMessageIter value_iter;
-
- /* Parse the signature: oa{sa{sv}}} */
- ret_if(dbus_message_iter_get_arg_type(msg_iter) !=
- DBUS_TYPE_OBJECT_PATH);
-
- dbus_message_iter_get_basic(msg_iter, &object_path);
- ret_if(object_path == NULL);
-
- /* object array (oa) */
- ret_if(dbus_message_iter_next(msg_iter) == FALSE);
- ret_if(dbus_message_iter_get_arg_type(msg_iter) != DBUS_TYPE_ARRAY);
-
- dbus_message_iter_recurse(msg_iter, &value_iter);
-
- /* string array (sa) */
- while (dbus_message_iter_get_arg_type(&value_iter) ==
- DBUS_TYPE_DICT_ENTRY) {
- char *interface_name = NULL;
- DBusMessageIter interface_iter;
-
- dbus_message_iter_recurse(&value_iter, &interface_iter);
-
- ret_if(dbus_message_iter_get_arg_type(&interface_iter) !=
- DBUS_TYPE_STRING);
-
- dbus_message_iter_get_basic(&interface_iter, &interface_name);
-
- ret_if(dbus_message_iter_next(&interface_iter) == FALSE);
-
- ret_if(dbus_message_iter_get_arg_type(&interface_iter) !=
- DBUS_TYPE_ARRAY);
-
- if (g_strcmp0(interface_name, "org.bluez.Device1") == 0) {
- BT_DBG("Found a device: %s", object_path);
- dev_info = __bt_parse_remote_device_info(
- &interface_iter);
-
- if (dev_info) {
- g_array_append_vals(*dev_list, dev_info,
- sizeof(bt_remote_dev_info_t));
- }
- }
-
- dbus_message_iter_next(&value_iter);
- }
-}
-
-int _bt_get_remote_found_devices(GArray **dev_list)
-{
- DBusMessage *msg;
- DBusMessage *reply;
- DBusMessageIter reply_iter;
- DBusMessageIter value_iter;
- DBusError err;
- DBusConnection *conn;
-
- conn = _bt_get_system_conn();
- retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
-
- msg = dbus_message_new_method_call(BT_BLUEZ_NAME, BT_MANAGER_PATH,
- BT_MANAGER_INTERFACE,
- "GetManagedObjects");
-
- retv_if(msg == NULL, BLUETOOTH_ERROR_INTERNAL);
-
- /* Synchronous call */
- dbus_error_init(&err);
- reply = dbus_connection_send_with_reply_and_block(
- conn, msg,
- -1, &err);
- dbus_message_unref(msg);
-
- if (!reply) {
- BT_ERR("Can't get managed objects");
-
- if (dbus_error_is_set(&err)) {
- BT_ERR("%s", err.message);
- dbus_error_free(&err);
- }
- return BLUETOOTH_ERROR_INTERNAL;
- }
-
- if (dbus_message_iter_init(reply, &reply_iter) == FALSE) {
- BT_ERR("Fail to iterate the reply");
- return BLUETOOTH_ERROR_INTERNAL;
- }
-
- dbus_message_iter_recurse(&reply_iter, &value_iter);
-
- /* signature of GetManagedObjects: a{oa{sa{sv}}} */
- while (dbus_message_iter_get_arg_type(&value_iter) ==
- DBUS_TYPE_DICT_ENTRY) {
- DBusMessageIter msg_iter;
-
- dbus_message_iter_recurse(&value_iter, &msg_iter);
-
- __bt_extract_remote_devinfo(&msg_iter, dev_list);
-
- dbus_message_iter_next(&value_iter);
- }
-
- return BLUETOOTH_ERROR_NONE;
+ g_variant_iter_free(iter);
}
static int __bt_get_bonded_device_info(gchar *device_path,
bluetooth_device_info_t *dev_info)
{
- GValue *value = { 0 };
- GError *err = NULL;
- DBusGProxy *device_proxy;
- const gchar *address;
- const gchar *name;
- unsigned int cod;
- gint rssi;
- gboolean trust;
- gboolean paired;
- gboolean connected;
+ GError *error = NULL;
+ GDBusProxy *device_proxy;
+ gchar *address = NULL;
+ gchar *name = NULL;
+ gchar *alias = NULL;
+ unsigned int cod = 0;
+ gint rssi = 0;
+ gboolean trust = FALSE;
+ gboolean paired = FALSE;
+ guchar connected = 0;
GByteArray *manufacturer_data = NULL;
- GHashTable *hash = NULL;
int ret;
- DBusGConnection *conn;
+ GDBusConnection *conn;
+ GVariant *result;
+ GVariantIter *property_iter;
+ const gchar *key;
+ GVariant *value;
+ guint8 char_value;
+ GVariantIter *char_value_iter;
BT_CHECK_PARAMETER(device_path, return);
BT_CHECK_PARAMETER(dev_info, return);
- conn = _bt_get_system_gconn();
+ conn = _bt_gdbus_get_system_gconn();
retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
- device_proxy = dbus_g_proxy_new_for_name(conn, BT_BLUEZ_NAME,
- device_path, BT_PROPERTIES_INTERFACE);
+ device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ BT_BLUEZ_NAME,
+ device_path,
+ BT_PROPERTIES_INTERFACE,
+ NULL, NULL);
retv_if(device_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
- dbus_g_proxy_call(device_proxy, "GetAll", &err,
- G_TYPE_STRING, BT_DEVICE_INTERFACE,
- G_TYPE_INVALID,
- dbus_g_type_get_map("GHashTable", G_TYPE_STRING,
- G_TYPE_VALUE), &hash, G_TYPE_INVALID);
-
- g_object_unref(device_proxy);
-
- if (err != NULL) {
- BT_ERR("Error occured in Proxy call [%s]\n", err->message);
- g_error_free(err);
+ result = g_dbus_proxy_call_sync(device_proxy,
+ "GetAll",
+ g_variant_new("(s)", BT_DEVICE_INTERFACE),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ BT_ERR("Error occured in Proxy call");
+ if (error != NULL) {
+ BT_ERR("Error occured in Proxy call (Error: %s)", error->message);
+ g_clear_error(&error);
+ }
+ g_object_unref(device_proxy);
return BLUETOOTH_ERROR_INTERNAL;
}
- if (hash != NULL) {
- value = g_hash_table_lookup(hash, "Paired");
- paired = g_value_get_boolean(value);
-
- value = g_hash_table_lookup(hash, "Address");
- address = value ? g_value_get_string(value) : NULL;
-
- value = g_hash_table_lookup(hash, "Alias");
- name = value ? g_value_get_string(value) : NULL;
-
- if (name != NULL)
- BT_DBG("Alias Name [%s]", name);
- else {
- value = g_hash_table_lookup(hash, "Name");
- name = value ? g_value_get_string(value) : NULL;
- }
-
- value = g_hash_table_lookup(hash, "Class");
- cod = value ? g_value_get_uint(value) : 0;
-
- value = g_hash_table_lookup(hash, "Connected");
- connected = value ? g_value_get_boolean(value) : FALSE;
-
- value = g_hash_table_lookup(hash, "Trusted");
- trust = value ? g_value_get_boolean(value) : FALSE;
-
- BT_DBG("paired: %d", paired);
- BT_DBG("trust: %d", trust);
+ g_object_unref(device_proxy);
- if ((paired == FALSE) && (trust == FALSE)) {
- return BLUETOOTH_ERROR_NOT_PAIRED;
+ g_variant_get(result, "(a{sv})", &property_iter);
+
+ while (g_variant_iter_loop(property_iter, "{sv}", &key, &value)) {
+ if (!g_strcmp0(key, "Paired")) {
+ paired = g_variant_get_boolean(value);
+ } else if (!g_strcmp0(key, "Address")) {
+ g_variant_get(value, "s", &address);
+ } else if (!g_strcmp0(key, "Alias")) {
+ g_variant_get(value, "s", &alias);
+ } else if (!g_strcmp0(key, "Name")) {
+ g_variant_get(value, "s", &name);
+ } else if (!g_strcmp0(key, "Class")) {
+ cod = g_variant_get_uint32(value);
+ } else if (!g_strcmp0(key, "Connected")) {
+ connected = g_variant_get_byte(value);
+ } else if (!g_strcmp0(key, "Trusted")) {
+ trust = g_variant_get_boolean(value);
+ } else if (!g_strcmp0(key, "RSSI")) {
+ rssi = g_variant_get_int16(value);
+ } else if (!g_strcmp0(key, "UUIDs")) {
+ __bt_get_service_list(value, dev_info);
+ } else if (!g_strcmp0(key, "LegacyManufacturerDataLen")) {
+ dev_info->manufacturer_data.data_len = g_variant_get_uint16(value);
+ } else if (!g_strcmp0(key, "LegacyManufacturerData")) {
+ manufacturer_data = g_byte_array_new();
+ g_variant_get(value, "ay", &char_value_iter);
+ while (g_variant_iter_loop(char_value_iter, "y", &char_value))
+ g_byte_array_append(manufacturer_data, &char_value, 1);
+
+ g_variant_iter_free(char_value_iter);
+
+ if (manufacturer_data) {
+ if (manufacturer_data->len > 0) {
+ memcpy(dev_info->manufacturer_data.data, manufacturer_data->data,
+ manufacturer_data->len);
+ }
+ }
+ g_byte_array_free(manufacturer_data, TRUE);
}
+ }
+ g_variant_iter_free(property_iter);
- value = g_hash_table_lookup(hash, "RSSI");
- rssi = value ? g_value_get_int(value) : 0;
-
- value = g_hash_table_lookup(hash, "UUIDs");
- __bt_get_service_list(value, dev_info);
+ BT_DBG("trust: %d, paired: %d", trust, paired);
- value = g_hash_table_lookup(hash, "ManufacturerDataLen");
- dev_info->manufacturer_data.data_len = value ? g_value_get_uint(value) : 0;
+ g_variant_unref(result);
- value = g_hash_table_lookup(hash, "ManufacturerData");
- manufacturer_data = value ? g_value_get_boxed(value) : NULL;
- if (manufacturer_data) {
- if (manufacturer_data->len > 0) {
- BT_DBG("manufacturer_data->len = %d", manufacturer_data->len);
- memcpy(dev_info->manufacturer_data.data, manufacturer_data->data, manufacturer_data->len);
- }
- }
+ if ((paired == FALSE) && (trust == FALSE)) {
+ g_free(address);
+ g_free(alias);
+ g_free(name);
+ return BLUETOOTH_ERROR_NOT_PAIRED;
+ }
- _bt_convert_addr_string_to_type(dev_info->device_address.addr,
- address);
+ _bt_convert_addr_string_to_type(dev_info->device_address.addr,
+ address);
- _bt_divide_device_class(&dev_info->device_class, cod);
+ _bt_divide_device_class(&dev_info->device_class, cod);
- g_strlcpy(dev_info->device_name.name, name,
- BLUETOOTH_DEVICE_NAME_LENGTH_MAX+1);
+ g_strlcpy(dev_info->device_name.name, alias ? alias : name,
+ BLUETOOTH_DEVICE_NAME_LENGTH_MAX+1);
- dev_info->rssi = rssi;
- dev_info->trust = trust;
- dev_info->paired = paired;
- dev_info->connected = connected;
- g_hash_table_destroy(hash);
- ret = BLUETOOTH_ERROR_NONE;
- } else {
- BT_ERR("Hash is NULL\n");
- ret = BLUETOOTH_ERROR_INTERNAL;
- }
+ dev_info->rssi = rssi;
+ dev_info->trust = trust;
+ dev_info->paired = paired;
+ dev_info->connected = connected;
+ ret = BLUETOOTH_ERROR_NONE;
+ g_free(address);
+ g_free(alias);
+ g_free(name);
return ret;
}
is_discovering = mode;
}
-void _bt_set_le_discovery_status(gboolean mode)
-{
- is_le_discovering = mode;
-}
-
-void _bt_set_le_discovery_type(bt_le_discovery_type_t type)
-{
- le_discovery_type = type;
-}
-
-bt_le_discovery_type_t _bt_get_le_discovery_type(void)
-{
- return le_discovery_type;
-}
-
void _bt_set_cancel_by_user(gboolean value)
{
cancel_by_user = value;
adapter_status = status;
}
-#ifdef __TIZEN_MOBILE__
-static void __launch_bt_service(int status, int run_type)
-{
- bundle *kb;
- char status_val[5] = { 0, };
- char run_type_val[5] = { 0, };
-
- snprintf(status_val, sizeof(status_val), "%d", status);
- snprintf(run_type_val, sizeof(run_type_val), "%d", run_type);
-
- BT_DBG("status: %s, run_type: %s", status_val, run_type_val);
-
- kb = bundle_create();
-
- bundle_add(kb, "launch-type", "setstate");
- bundle_add(kb, "status", status_val);
- bundle_add(kb, "run-type", run_type_val);
-
- aul_launch_app("com.samsung.bluetooth", kb);
-
- bundle_free(kb);
-}
-#endif
-
bt_status_t _bt_adapter_get_status(void)
{
return adapter_status;
return adapter_le_status;
}
+
+void _bt_set_le_intended_status(gboolean value)
+{
+ is_le_intended = value;
+}
+
+static void __bt_set_in_poweroff(void)
+{
+ BT_INFO("Set in_power_off to TRUE");
+ in_power_off = TRUE;
+}
+
+static gboolean __bt_is_in_poweroff(void)
+{
+ return in_power_off;
+}
+
static void __bt_phone_name_changed_cb(keynode_t *node, void *data)
{
char *phone_name = NULL;
phone_name = vconf_keynode_get_str(node);
if (phone_name && strlen(phone_name) != 0) {
- if (!g_utf8_validate(phone_name, -1,
+ if (!g_utf8_validate(phone_name, -1,
(const char **)&ptr))
- *ptr = '\0';
+ *ptr = '\0';
+ BT_INFO("device_name is changed to %s", phone_name);
_bt_set_local_name(phone_name);
+ } else {
+ BT_ERR("phone_name is NOT valid");
}
+ } else {
+ BT_ERR("vconf type is NOT string");
}
}
-#ifdef TIZEN_WEARABLE
-static char * __bt_change_dev_name(const char *default_name)
-{
- FILE *fp = NULL;
- char *buf = NULL;
- char *name = NULL;
- int result;
-
- if ((fp = fopen("/csa/bluetooth/.bd_addr", "r")) == NULL) {
- BT_ERR("Unable to open bd_addr");
- return NULL;
- }
-
- result = fseek(fp, -4, SEEK_END);
- if (result < 0) {
- BT_ERR("fseek is failed");
- fclose(fp);
- return NULL;
- }
-
- buf = (char *)malloc(sizeof(char) * 5);
- if (buf == NULL) {
- BT_ERR("malloc is failed");
- fclose(fp);
- return NULL;
- }
- memset(buf, 0, 5);
-
- result = fread(buf, 1, 4, fp);
- if (result)
- BT_DBG("Size Read: [%d]", result);
- else
- BT_ERR("Error reading file: code[%d]", result);
-
- name = g_strdup_printf("%s (%s)", default_name, buf);
-
- BT_INFO("%s", name);
-
- free(buf);
- fclose(fp);
-
- return name ;
-}
-#else
-static void __bt_set_visible_mode(void)
-{
- int timeout = 0;
-
- if (vconf_get_int(BT_FILE_VISIBLE_TIME, &timeout) != 0)
- BT_ERR("Fail to get the timeout value");
-
- /* -1: Always on */
-}
-#endif
-
static void __bt_set_local_name(void)
{
+ bluetooth_device_name_t local_name;
char *phone_name = NULL;
char *ptr = NULL;
+ char *temp = NULL;
- phone_name = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
+ if (_bt_get_local_name(&local_name) != BLUETOOTH_ERROR_NONE ||
+ (temp = strstr(local_name.name, "BlueZ")) != NULL) {
+ phone_name = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
- if (!phone_name)
- return;
+ if (!phone_name)
+ return;
- if (strlen(phone_name) != 0) {
- if (!g_utf8_validate(phone_name, -1, (const char **)&ptr))
- *ptr = '\0';
+ if (strlen(phone_name) != 0) {
+ if (!g_utf8_validate(phone_name, -1, (const char **)&ptr))
+ *ptr = '\0';
-#ifdef TIZEN_WEARABLE
- if (strstr(phone_name, "(") == NULL) {
- char *tmp = __bt_change_dev_name(phone_name);
- if (tmp != NULL) {
- free(phone_name);
- phone_name = tmp;
- }
+ _bt_set_local_name(phone_name);
}
-#endif
- _bt_set_local_name(phone_name);
+ free(phone_name);
}
- free(phone_name);
}
static int __bt_set_enabled(void)
int adapter_status = BT_ADAPTER_DISABLED;
int result = BLUETOOTH_ERROR_NONE;
+ if (timer_id > 0) {
+ BT_DBG("g_source is removed");
+ g_source_remove(timer_id);
+ timer_id = 0;
+ }
+
_bt_check_adapter(&adapter_status);
if (adapter_status == BT_ADAPTER_DISABLED) {
return BLUETOOTH_ERROR_INTERNAL;
}
-#ifndef TIZEN_WEARABLE
- __bt_set_visible_mode();
+#ifdef TIZEN_PROFILE_MOBILE || defined(TIZEN_PROFILE_IVI)
+ /* BT setting UI will control Mobile's visible mode. So in the FRWK...set the visible mode as off: */
+ if (_bt_set_discoverable_mode(
+ BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE, 0) != BLUETOOTH_ERROR_NONE)
+ BT_ERR("Set connectable mode failed");
+#else
+#ifdef TIZEN_TV
+ if (_bt_set_discoverable_mode(
+ BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE, 0) != BLUETOOTH_ERROR_NONE)
+ BT_ERR("Fail to set discoverable mode");
+#endif
#endif
-
- __bt_set_local_name();
/* Update Bluetooth Status to notify other modules */
if (vconf_set_int(VCONFKEY_BT_STATUS, VCONFKEY_BT_STATUS_ON) != 0)
if (vconf_set_int(VCONFKEY_BT_DEVICE, VCONFKEY_BT_DEVICE_NONE) != 0)
BT_ERR("Set vconf failed\n");
+ if (_bt_eventsystem_set_value(SYS_EVENT_BT_STATE, EVT_KEY_BT_STATE,
+ EVT_VAL_BT_ON) != ES_R_OK)
+ BT_ERR("Fail to set value");
+
/* Send enabled event to API */
_bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_ENABLED,
- DBUS_TYPE_INT32, &result, DBUS_TYPE_INVALID);
+ g_variant_new("(i)", result));
+
+#ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
+ _bt_audio_start_auto_connect(FALSE);
+#endif
+
+ __bt_set_local_name();
+ _bt_set_discovery_status(FALSE);
return BLUETOOTH_ERROR_NONE;
}
BT_DBG("Update vconf for BT normal Deactivation");
if (result == BLUETOOTH_ERROR_TIMEOUT)
- if (vconf_set_int(BT_OFF_DUE_TO_TIMEOUT, 1) != 0 )
+ if (vconf_set_int(BT_OFF_DUE_TO_TIMEOUT, 1) != 0)
BT_ERR("Set vconf failed");
/* Update Bluetooth Status to notify other modules */
if (vconf_set_int(VCONFKEY_BT_STATUS, VCONFKEY_BT_STATUS_OFF) != 0)
BT_ERR("Set vconf failed");
+
+ if (_bt_eventsystem_set_value(SYS_EVENT_BT_STATE, EVT_KEY_BT_STATE,
+ EVT_VAL_BT_OFF) != ES_R_OK)
+ BT_ERR("Fail to set value");
}
if (vconf_set_int(VCONFKEY_BT_DEVICE, VCONFKEY_BT_DEVICE_NONE) != 0)
BT_ERR("Set vconf failed\n");
+ _bt_cancel_queued_transfers();
_bt_adapter_set_status(BT_DEACTIVATED);
+ _bt_set_discovery_status(FALSE);
+#ifndef USB_BLUETOOTH
if (_bt_adapter_get_le_status() != BT_LE_DEACTIVATED) {
+#endif
/* Send disabled event */
_bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_DISABLED,
- DBUS_TYPE_INT32, &result, DBUS_TYPE_INVALID);
+ g_variant_new("(i)", result));
+#ifndef USB_BLUETOOTH
}
+#endif
BT_INFO("Adapter disabled");
}
int result = BLUETOOTH_ERROR_NONE;
bt_status_t status;
- __bt_set_local_name();
-
-#ifdef ENABLE_TIZEN_2_4
/* Update Bluetooth Status to notify other modules */
if (vconf_set_int(VCONFKEY_BT_LE_STATUS, VCONFKEY_BT_LE_STATUS_ON) != 0)
- BT_ERR("Set vconf failed\n");
-#endif
+ BT_ERR("Set vconf failed");
+
+ /* set packet length to max size to enable packet length extension */
+ if (BLUETOOTH_ERROR_NONE != _bt_le_set_max_packet_len())
+ BT_ERR("Fail to set max packet length");
+
+ if (_bt_eventsystem_set_value(SYS_EVENT_BT_STATE, EVT_KEY_BT_LE_STATE,
+ EVT_VAL_BT_LE_ON) != ES_R_OK)
+ BT_ERR("Fail to set value");
+
/* Send enabled event to API */
/*
_bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_ENABLED,
/* Send enabled event to API */
_bt_send_event(BT_LE_ADAPTER_EVENT, BLUETOOTH_EVENT_LE_ENABLED,
- DBUS_TYPE_INT32, &result, DBUS_TYPE_INVALID);
+ g_variant_new("(i)", result));
+
+ __bt_set_local_name();
BT_DBG("-");
return BLUETOOTH_ERROR_NONE;
/* Update Bluetooth Status to notify other modules */
BT_DBG("Update vconf for BT LE normal Deactivation");
-#ifdef ENABLE_TIZEN_2_4
if (vconf_set_int(VCONFKEY_BT_LE_STATUS, VCONFKEY_BT_LE_STATUS_OFF) != 0)
BT_ERR("Set vconf failed\n");
_bt_adapter_set_le_status(BT_LE_DEACTIVATED);
-#endif
- if (_bt_adapter_get_status() != BT_DEACTIVATED) {
- /* Send disabled event */
- _bt_send_event(BT_LE_ADAPTER_EVENT, BLUETOOTH_EVENT_LE_DISABLED,
- DBUS_TYPE_INT32, &result, DBUS_TYPE_INVALID);
- }
+ if (_bt_eventsystem_set_value(SYS_EVENT_BT_STATE, EVT_KEY_BT_LE_STATE,
+ EVT_VAL_BT_LE_OFF) != ES_R_OK)
+ BT_ERR("Fail to set value");
+
+ /* Send disabled event */
+ _bt_send_event(BT_LE_ADAPTER_EVENT, BLUETOOTH_EVENT_LE_DISABLED,
+ g_variant_new("(i)", result));
}
void *_bt_get_adapter_agent(void)
int _bt_enable_core(void)
{
- DBusGProxy *proxy;
+ GDBusProxy *proxy;
+ GVariant *result;
+ GError *error = NULL;
proxy = __bt_get_core_proxy();
retv_if(!proxy, BLUETOOTH_ERROR_INTERNAL);
- if (dbus_g_proxy_call(proxy, "EnableCore", NULL,
- G_TYPE_INVALID, G_TYPE_INVALID) == FALSE) {
- BT_ERR("Bt core call failed");
+ /* Clean up the process */
+ result = g_dbus_proxy_call_sync(proxy,
+ "EnableCore",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Bt core call failed(Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Bt core call failed");
+ return BLUETOOTH_ERROR_INTERNAL;
}
+ g_variant_unref(result);
return BLUETOOTH_ERROR_NONE;
}
+#if defined(TIZEN_FEATURE_FLIGHTMODE_ENABLED) || (!defined(TIZEN_PROFILE_WEARABLE))
static void __bt_service_flight_ps_mode_cb(keynode_t *node, void *data)
{
gboolean flight_mode = FALSE;
_bt_enable_core();
}
+#endif
+
+static void __bt_poweroff_event_filter(GDBusConnection *connection,
+ const gchar *sender_name, const gchar *object_path,
+ const gchar *interface_name, const gchar *signal_name,
+ GVariant *parameters, gpointer user_data)
+{
+ int state = 0;
+
+ g_variant_get(parameters, "(i)", &state);
+
+ if (state != BT_DEVICED_POWEROFF_SIGNAL_POWEROFF &&
+ state != BT_DEVICED_POWEROFF_SIGNAL_REBOOT) {
+ BT_DBG("Not interested event : %d", state);
+ return;
+ }
+
+ if (_bt_adapter_get_status() == BT_ACTIVATING) {
+ BT_INFO("Just update VCONFKEY_BT_STATUS in Power off");
+ if (vconf_set_int(VCONFKEY_BT_STATUS, VCONFKEY_BT_STATUS_ON))
+ BT_ERR("Set VCONFKEY_BT_STATUS failed");
+ } else {
+ __bt_set_in_poweroff();
+ }
+}
+
+void _bt_service_register_poweroff_event(void)
+{
+ if (poweroff_subscribe_id)
+ return;
+
+ poweroff_subscribe_id = g_dbus_connection_signal_subscribe(
+ _bt_gdbus_get_system_gconn(), NULL,
+ BT_DEVICED_POWEROFF_INTERFACE,
+ BT_DEVICED_POWEROFF_SIGNAL,
+ BT_DEVICED_POWEROFF_OBJECT_PATH,
+ NULL, 0, __bt_poweroff_event_filter, NULL, NULL);
+}
+
+void _bt_service_unregister_poweroff_event(void)
+{
+ if (poweroff_subscribe_id == 0)
+ return;
+
+ g_dbus_connection_signal_unsubscribe(_bt_gdbus_get_system_gconn(),
+ poweroff_subscribe_id);
+ poweroff_subscribe_id = 0;
+}
void _bt_service_register_vconf_handler(void)
{
- int ret;
BT_DBG("+");
-#ifdef TIZEN_TELEPHONY_ENABLED
- ret = vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
- (vconf_callback_fn)__bt_service_flight_ps_mode_cb, NULL);
- if (ret < 0)
+#ifdef TIZEN_FEATURE_FLIGHTMODE_ENABLED
+ if (vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
+ (vconf_callback_fn)__bt_service_flight_ps_mode_cb, NULL) < 0)
BT_ERR("Unable to register key handler");
#else
BT_DBG("Telephony is disabled");
#endif
-#ifndef TIZEN_WEARABLE
-#ifdef ENABLE_TIZEN_2_4
- ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE,
- (vconf_callback_fn)__bt_service_flight_ps_mode_cb, NULL);
- if (ret < 0)
+#ifndef TIZEN_PROFILE_WEARABLE
+ if (vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE,
+ (vconf_callback_fn)__bt_service_flight_ps_mode_cb, NULL) < 0)
BT_ERR("Unable to register key handler");
#endif
-#endif
}
void _bt_service_unregister_vconf_handler(void)
{
BT_DBG("+");
-#ifdef TIZEN_TELEPHONY_ENABLED
+#ifdef TIZEN_FEATURE_FLIGHTMODE_ENABLED
vconf_ignore_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
- (vconf_callback_fn)__bt_service_flight_ps_mode_cb);
+ (vconf_callback_fn)__bt_service_flight_ps_mode_cb);
#endif
-#ifndef TIZEN_WEARABLE
-#ifdef ENABLE_TIZEN_2_4
+#ifndef TIZEN_PROFILE_WEARABLE
vconf_ignore_key_changed(VCONFKEY_SETAPPL_PSMODE,
(vconf_callback_fn)__bt_service_flight_ps_mode_cb);
#endif
-#endif
+}
+
+static void __bt_state_event_handler(const char *event_name, bundle *data, void *user_data)
+{
+ const char *bt_status = NULL;
+ const char *bt_le_status = NULL;
+ BT_DBG("bt state set event(%s) received", event_name);
+
+ bt_status = bundle_get_val(data, EVT_KEY_BT_STATE);
+ BT_DBG("bt_state: (%s)", bt_status);
+
+ bt_le_status = bundle_get_val(data, EVT_KEY_BT_LE_STATE);
+ BT_DBG("bt_state: (%s)", bt_le_status);
}
void _bt_handle_adapter_added(void)
bt_status_t status;
bt_le_status_t le_status;
int ret;
-
+/*
if (timer_id > 0) {
BT_DBG("g_source is removed");
g_source_remove(timer_id);
timer_id = 0;
}
+*/
status = _bt_adapter_get_status();
le_status = _bt_adapter_get_le_status();
- BT_DBG("status : %d", status);
- BT_DBG("le_status : %d", le_status);
+ BT_INFO("status : %d", status);
+ BT_INFO("le_status : %d", le_status);
+#ifndef USB_BLUETOOTH
adapter_agent = _bt_create_agent(BT_ADAPTER_AGENT_PATH, TRUE);
if (!adapter_agent) {
BT_ERR("Fail to register agent");
return;
}
-
-#ifdef __TIZEN_MOBILE__
- if (!aul_app_is_running("com.samsung.bluetooth"))
- __launch_bt_service(0, 0);
+#else
+ if (adapter_agent == NULL) {
+ adapter_agent = _bt_create_agent(BT_ADAPTER_AGENT_PATH, TRUE);
+ if (!adapter_agent) {
+ BT_ERR("Fail to register agent");
+ return;
+ }
+ }
+#endif
if (_bt_register_media_player() != BLUETOOTH_ERROR_NONE)
BT_ERR("Fail to register media player");
-#endif
if (_bt_register_obex_server() != BLUETOOTH_ERROR_NONE)
BT_ERR("Fail to init obex server");
-#ifndef TIZEN_WEARABLE
-/*
+#ifdef TIZEN_BT_PAN_NAP_ENABLED
if (_bt_network_activate() != BLUETOOTH_ERROR_NONE)
BT_ERR("Fail to activate network");
-*/
#endif
/* add the vconf noti handler */
if (ret < 0)
BT_ERR("Unable to register key handler");
- if (le_status == BT_LE_ACTIVATING) {
+ if (le_status == BT_LE_ACTIVATING ||
+ status == BT_ACTIVATING) {
__bt_set_le_enabled();
_bt_adapter_set_le_status(BT_LE_ACTIVATED);
}
+
if (status == BT_ACTIVATING) {
__bt_set_enabled();
_bt_adapter_set_status(BT_ACTIVATED);
}
-#ifdef ENABLE_TIZEN_2_4
- journal_bt_on();
-#endif
- _bt_service_register_vconf_handler();
+ /* eventsystem */
+ if (eventsystem_register_event(SYS_EVENT_BT_STATE, &status_reg_id,
+ (eventsystem_handler)__bt_state_event_handler, NULL) != ES_R_OK) {
+ BT_ERR("Fail to register system event");
+ }
}
void _bt_handle_adapter_removed(void)
int ret;
_bt_adapter_set_status(BT_DEACTIVATED);
-#ifdef ENABLE_TIZEN_2_4
- journal_bt_off();
-#endif
__bt_visibility_alarm_remove();
- if (visible_timer.alarm_init) {
+ if (alarm_mgr.is_alarm_initialized == TRUE) {
alarmmgr_fini();
- visible_timer.alarm_init = FALSE;
+ alarm_mgr.is_alarm_initialized = FALSE;
+ g_list_free_full(alarm_mgr.g_alarm_list, alarm_data_free);
+ alarm_mgr.g_alarm_list = NULL;
}
+#ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
+ _bt_audio_stop_auto_connect();
+#endif
+
ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
(vconf_callback_fn)__bt_phone_name_changed_cb);
- if (0 != ret) {
+ if (0 != ret)
ERR("vconf_ignore_key_changed failed\n");
- }
+#ifndef USB_BLUETOOTH
_bt_destroy_agent(adapter_agent);
adapter_agent = NULL;
- _bt_reliable_terminate_service(NULL);
+ if (is_recovery_mode == TRUE) {
+ /* Send disabled event */
+ _bt_set_disabled(BLUETOOTH_ERROR_NONE);
+
+ /* Will recover BT by bt-core, so set the mode as activating */
+ _bt_adapter_set_status(BT_ACTIVATING);
+ is_recovery_mode = FALSE;
+ } else {
+ _bt_reliable_terminate_service(NULL);
+ }
+#else
+ _bt_set_disabled(BLUETOOTH_ERROR_NONE);
+#endif
+
+ if (eventsystem_unregister_event(status_reg_id) != ES_R_OK)
+ BT_ERR("Fail to unregister system event");
}
static gboolean __bt_enable_timeout_cb(gpointer user_data)
{
- DBusGProxy *proxy;
+ GDBusProxy *proxy;
+ GVariant *result;
+ GError *error = NULL;
timer_id = 0;
return FALSE;
/* Clean up the process */
- if (dbus_g_proxy_call(proxy, "DisableAdapter", NULL,
- G_TYPE_INVALID, G_TYPE_INVALID) == FALSE) {
- BT_ERR("Bt core call failed");
+ result = g_dbus_proxy_call_sync(proxy,
+ "DisableAdapter",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Bt core call failed(Error: %s)", error->message);
+ g_clear_error(&error);
+ } else {
+ BT_ERR("Bt core call failed");
+ }
+ return FALSE;
}
+ g_variant_unref(result);
_bt_set_disabled(BLUETOOTH_ERROR_TIMEOUT);
- /* Display notification */
- notification_status_message_post(BT_STR_NOT_SUPPORT);
-
+#ifndef USB_BLUETOOTH
_bt_terminate_service(NULL);
+#endif
return FALSE;
}
static gboolean __bt_enable_le_timeout_cb(gpointer user_data)
{
- DBusGProxy *proxy;
+ GDBusProxy *proxy;
+ GVariant *result;
+ GError *error = NULL;
le_timer_id = 0;
return FALSE;
/* Clean up the process */
- if (dbus_g_proxy_call(proxy, "DisableAdapterLe", NULL,
- G_TYPE_INVALID, G_TYPE_INVALID) == FALSE) {
- BT_ERR("Bt core call failed");
+ result = g_dbus_proxy_call_sync(proxy,
+ "DisableAdapterLe",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Bt core call failed(Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Bt core call failed");
+ return FALSE;
}
+ g_variant_unref(result);
_bt_adapter_set_le_status(BT_LE_DEACTIVATED);
_bt_set_le_disabled(BLUETOOTH_ERROR_TIMEOUT);
- /* Display notification */
- notification_status_message_post(BT_STR_NOT_SUPPORT);
-
if (_bt_adapter_get_status() == BT_DEACTIVATED)
_bt_terminate_service(NULL);
return;
}
+#ifdef TIZEN_TV
+static gboolean __bt_adapter_enabled_cb(gpointer user_data)
+{
+ BT_DBG("+");
+
+ __bt_set_enabled();
+ _bt_adapter_set_status(BT_ACTIVATED);
+
+ return FALSE;
+}
+#endif
+
+int _bt_enable_adapter_check_status(void)
+{
+ bt_status_t status = _bt_adapter_get_status();
+ bt_le_status_t le_status = _bt_adapter_get_le_status();
+
+ BT_DBG("");
+
+ if (status == BT_ACTIVATING) {
+ BT_ERR("Enabling in progress");
+ return BLUETOOTH_ERROR_IN_PROGRESS;
+ }
+
+ if (status == BT_ACTIVATED) {
+ BT_ERR("Already enabled");
+ return BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED;
+ }
+
+ if (status == BT_DEACTIVATING || le_status == BT_LE_DEACTIVATING) {
+ BT_ERR("Disabling in progress");
+ return BLUETOOTH_ERROR_DEVICE_BUSY;
+ }
+
+ return BLUETOOTH_ERROR_NONE;
+}
+
int _bt_enable_adapter(void)
{
- DBusGProxy *proxy;
- GError *err = NULL;
+ GDBusProxy *proxy;
+ GError *error = NULL;
int ret;
+ GVariant *result = NULL;
bt_status_t status = _bt_adapter_get_status();
bt_le_status_t le_status = _bt_adapter_get_le_status();
+
BT_DBG("");
if (status == BT_ACTIVATING) {
_bt_adapter_set_status(BT_ACTIVATING);
+#ifdef TIZEN_TV
+{
+ int adapter_status = BT_ADAPTER_DISABLED;
+
+ if (vconf_set_int(VCONFKEY_BT_STATUS, VCONFKEY_BT_STATUS_OFF) != 0)
+ BT_ERR("Set vconf failed");
+
+ _bt_check_adapter(&adapter_status);
+ if (adapter_status == BT_ADAPTER_ENABLED) {
+ g_idle_add(__bt_adapter_enabled_cb, NULL);
+ _bt_adapter_start_enable_timer();
+ return BLUETOOTH_ERROR_NONE;
+ }
+}
+#endif
+
+ if (__bt_is_in_poweroff() == TRUE) {
+ BT_INFO("Just update VCONFKEY_BT_STATUS in Power off");
+ if (vconf_set_int(VCONFKEY_BT_STATUS, VCONFKEY_BT_STATUS_ON) != 0)
+ BT_ERR("Set VCONFKEY_BT_STATUS failed");
+ return BLUETOOTH_ERROR_NONE;
+ }
+
proxy = __bt_get_core_proxy();
if (!proxy)
return BLUETOOTH_ERROR_INTERNAL;
if (le_status == BT_LE_ACTIVATED) {
BT_INFO("LE Already enabled. Just turn on PSCAN");
ret = _bt_set_connectable(TRUE);
- if (ret == BLUETOOTH_ERROR_NONE) {
+ if (ret == BLUETOOTH_ERROR_NONE)
_bt_adapter_set_status(BT_ACTIVATED);
- } else {
+ else
return BLUETOOTH_ERROR_INTERNAL;
- }
}
- if (dbus_g_proxy_call_with_timeout(proxy, "EnableAdapter",
- BT_ENABLE_TIMEOUT, &err,
- G_TYPE_INVALID,
- G_TYPE_INVALID) == FALSE) {
-
+ result = g_dbus_proxy_call_sync(proxy, "EnableAdapter",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE, BT_ENABLE_TIMEOUT,
+ NULL, &error);
+ if (error) {
+ BT_ERR("EnableAdapterLe failed: %s", error->message);
_bt_adapter_set_status(BT_DEACTIVATED);
-
- if (err != NULL) {
- BT_ERR("Bt core call failed: [%s]", err->message);
- g_error_free(err);
- }
-
- /* Clean up the process */
- if (dbus_g_proxy_call(proxy, "DisableAdapter", NULL,
- G_TYPE_INVALID, G_TYPE_INVALID) == FALSE) {
- BT_ERR("Bt core call failed");
+ g_clear_error(&error);
+ error = NULL;
+ result = g_dbus_proxy_call_sync(proxy,
+ "DisableAdapter",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (error != NULL) {
+ BT_ERR("Bt core call failed(Error: %s)", error->message);
+ g_clear_error(&error);
}
-
- /* Display notification */
- notification_status_message_post(BT_STR_NOT_SUPPORT);
-
+ g_variant_unref(result);
+#ifndef USB_BLUETOOTH
/* Terminate myself */
g_idle_add((GSourceFunc)_bt_terminate_service, NULL);
+#endif
return BLUETOOTH_ERROR_INTERNAL;
}
-
- if (le_status == BT_LE_ACTIVATED) {
+ g_variant_unref(result);
+ if (le_status == BT_LE_ACTIVATED)
__bt_set_enabled();
- } else {
+ else
_bt_adapter_start_enable_timer();
- }
return BLUETOOTH_ERROR_NONE;
}
static gboolean __bt_disconnect_all(void)
{
int i;
- DBusGConnection *conn;
- DBusGProxy *dev_proxy;
+ GDBusConnection *conn;
+ GDBusProxy *dev_proxy;
gboolean ret = FALSE;
-
+ GVariant *result;
+ GError *error = NULL;
GArray *device_list;
- bluetooth_device_info_t info;
+ bluetooth_device_info_t *info;
guint size;
char *device_path = NULL;
char address[BT_ADDRESS_STRING_SIZE] = { 0 };
BT_DBG("");
- conn = _bt_get_system_gconn();
+ conn = _bt_gdbus_get_system_gconn();
device_list = g_array_new(FALSE, FALSE, sizeof(gchar));
for (i = 0; i < size; i++) {
- info = g_array_index(device_list,
+ info = &g_array_index(device_list,
bluetooth_device_info_t, i);
- if (info.connected == TRUE) {
+ if (info->connected != BLUETOOTH_CONNECTED_LINK_NONE) {
BT_DBG("Found Connected device");
- _bt_convert_addr_type_to_string(address, info.device_address.addr);
+ _bt_convert_addr_type_to_string(address, info->device_address.addr);
device_path = _bt_get_device_object_path(address);
if (device_path == NULL)
continue;
BT_DBG("Disconnecting : %s", device_path);
- dev_proxy = dbus_g_proxy_new_for_name(conn, BT_BLUEZ_NAME,
- device_path, BT_DEVICE_INTERFACE);
+ dev_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ BT_BLUEZ_NAME,
+ device_path,
+ BT_DEVICE_INTERFACE,
+ NULL, NULL);
+
if (dev_proxy == NULL)
continue;
- if(!dbus_g_proxy_call(dev_proxy, "Disconnect",
- NULL, G_TYPE_INVALID, G_TYPE_INVALID)) {
- BT_ERR("Disconnect fail error.");
+ result = g_dbus_proxy_call_sync(dev_proxy,
+ "Disconnect",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Disconnect call failed(Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Disconnect call failed");
g_object_unref(dev_proxy);
return FALSE;
}
+
+ g_variant_unref(result);
+ g_object_unref(dev_proxy);
}
}
ret = TRUE;
return ret;
}
+#if 0
static gboolean __bt_set_disabled_timeout_cb(gpointer user_data)
{
BT_DBG("");
return FALSE;
}
+#endif
-int __bt_disable_cb(void)
+int _bt_disable_cb(void)
{
FN_START;
- DBusGProxy *proxy;
- bt_le_status_t le_status;
+ GDBusProxy *proxy;
+#if 0
int ret;
+#endif
+ GVariant *result;
+ GError *error = NULL;
_bt_adapter_set_status(BT_DEACTIVATING);
+#if 0
+ bt_le_status_t le_status;
le_status = _bt_adapter_get_le_status();
BT_DBG("le_status : %d", le_status);
if (le_status == BT_LE_ACTIVATED) {
}
}
}
-
+#endif
proxy = __bt_get_core_proxy();
retv_if(!proxy, BLUETOOTH_ERROR_INTERNAL);
- if (dbus_g_proxy_call(proxy, "DisableAdapter", NULL,
- G_TYPE_INVALID, G_TYPE_INVALID) == FALSE) {
- BT_ERR("Bt core call failed");
+ result = g_dbus_proxy_call_sync(proxy,
+ "DisableAdapter",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to DisableAdapter (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Failed to DisableAdapter");
_bt_adapter_set_status(BT_ACTIVATED);
return BLUETOOTH_ERROR_INTERNAL;
}
+ g_variant_unref(result);
+ return BLUETOOTH_ERROR_NONE;
+}
+
+int _bt_disable_adapter_check_status(void)
+{
+ bt_status_t status = _bt_adapter_get_status();
+
+ BT_DBG("");
+
+ if (status == BT_DEACTIVATING) {
+ BT_DBG("Disabling in progress");
+ return BLUETOOTH_ERROR_IN_PROGRESS;
+ }
+
+ if (status == BT_DEACTIVATED) {
+ BT_DBG("Already disabled");
+ return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
+ }
+
return BLUETOOTH_ERROR_NONE;
}
}
__bt_disconnect_all();
- ret = __bt_disable_cb();
+ ret = _bt_disable_cb();
BT_DBG("-");
return ret;
int _bt_recover_adapter(void)
{
BT_DBG("+");
- DBusGProxy *proxy;
+ GDBusProxy *proxy;
+ GVariant *result;
+ GError *error = NULL;
if (_bt_adapter_get_status() == BT_DEACTIVATING) {
- BT_DBG("Disabling in progress");
+ BT_ERR("Disabling in progress");
return BLUETOOTH_ERROR_IN_PROGRESS;
}
if (_bt_adapter_get_status() == BT_DEACTIVATED) {
- BT_DBG("Already disabled");
+ BT_ERR("Already disabled");
return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
}
proxy = __bt_get_core_proxy();
retv_if(!proxy, BLUETOOTH_ERROR_INTERNAL);
- if (dbus_g_proxy_call(proxy, "RecoverAdapter", NULL,
- G_TYPE_INVALID, G_TYPE_INVALID) == FALSE) {
- BT_ERR("Bt core call failed");
+ result = g_dbus_proxy_call_sync(proxy,
+ "RecoverAdapter",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to RecoverAdapter (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Failed to RecoverAdapter");
return BLUETOOTH_ERROR_INTERNAL;
}
+ is_recovery_mode = TRUE;
+
+ g_variant_unref(result);
__bt_disconnect_all();
- BT_ERR("-");
+ BT_DBG("-");
return BLUETOOTH_ERROR_NONE;
}
int _bt_reset_adapter(void)
{
- DBusGProxy *proxy;
+ GDBusProxy *proxy;
+ GVariant *result;
+ GError *error = NULL;
BT_DBG("");
if (!proxy)
return BLUETOOTH_ERROR_INTERNAL;
- if (dbus_g_proxy_call(proxy, "ResetAdapter", NULL,
- G_TYPE_INVALID, G_TYPE_INVALID) == FALSE) {
- BT_ERR("Bt core call failed");
+ result = g_dbus_proxy_call_sync(proxy,
+ "ResetAdapter",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to ResetAdapter (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Failed to ResetAdapter");
return BLUETOOTH_ERROR_INTERNAL;
}
+ g_variant_unref(result);
/* Terminate myself */
- if (_bt_adapter_get_status() == BT_DEACTIVATED) {
+ if (_bt_adapter_get_status() == BT_DEACTIVATED)
g_idle_add((GSourceFunc)_bt_terminate_service, NULL);
- }
return BLUETOOTH_ERROR_NONE;
}
+#ifndef TIZEN_TV
+int _bt_check_adapter(int *status)
+{
+
+ char *adapter_path = NULL;
+
+ BT_CHECK_PARAMETER(status, return);
+
+ *status = BT_ADAPTER_DISABLED;
+
+ adapter_path = _bt_get_adapter_path();
+
+
+ if (adapter_path != NULL)
+ *status = BT_ADAPTER_ENABLED;
+
+ g_free(adapter_path);
+ return BLUETOOTH_ERROR_NONE;
+}
+#else
int _bt_check_adapter(int *status)
{
+ GDBusProxy *proxy;
+ GError *error = NULL;
+ GVariant *result;
+ GVariant *temp;
+ gboolean powered = FALSE;
+
BT_CHECK_PARAMETER(status, return);
- *status = 0; /* 0: disabled */
+ *status = BT_ADAPTER_DISABLED;
+
+ proxy = _bt_get_adapter_properties_proxy();
+ retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+ result = g_dbus_proxy_call_sync(proxy,
+ "Get",
+ g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
+ "Powered"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ BT_ERR("Failed to get local address");
+ if (error != NULL) {
+ BT_ERR("Failed to get local address (Error: %s)", error->message);
+ g_clear_error(&error);
+ }
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
+
+ g_variant_get(result, "(v)", &temp);
+ powered = g_variant_get_boolean(temp);
+ BT_DBG("powered: %d", powered);
- if (_bt_get_adapter_power())
- *status = 1; /* 1: enabled */
+ if (powered)
+ *status = BT_ADAPTER_ENABLED;
+ g_variant_unref(result);
+ g_variant_unref(temp);
return BLUETOOTH_ERROR_NONE;
}
+#endif
int _bt_enable_adapter_le(void)
{
BT_DBG("+");
- DBusGProxy *proxy;
- GError *err = NULL;
+ GDBusProxy *proxy;
+ GError *error = NULL;
bt_status_t status = _bt_adapter_get_status();
bt_le_status_t le_status = _bt_adapter_get_le_status();
+ GVariant *result;
if (le_status == BT_LE_ACTIVATING) {
BT_ERR("Enabling in progress");
proxy = __bt_get_core_proxy();
retv_if(!proxy, BLUETOOTH_ERROR_INTERNAL);
- if (dbus_g_proxy_call_with_timeout(proxy, "EnableAdapterLe",
- BT_ENABLE_TIMEOUT, &err,
- G_TYPE_INVALID,
- G_TYPE_INVALID) == FALSE) {
-
+ result = g_dbus_proxy_call_sync(proxy, "EnableAdapterLe",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE, BT_ENABLE_TIMEOUT,
+ NULL, &error);
+ if (error) {
+ BT_ERR("EnableAdapterLe failed: %s", error->message);
_bt_adapter_set_le_status(BT_DEACTIVATED);
-
- if (err != NULL) {
- BT_ERR("Bt core call failed: [%s]", err->message);
- g_error_free(err);
- }
+ g_clear_error(&error);
/* Clean up the process */
- if (dbus_g_proxy_call(proxy, "DisableAdapterLe", NULL,
- G_TYPE_INVALID, G_TYPE_INVALID) == FALSE) {
- BT_ERR("Bt core call failed");
+ result = g_dbus_proxy_call_sync(proxy,
+ "DisableAdapterLe",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ BT_ERR("Bt core call failed");
+ if (error) {
+ BT_ERR("EnableAdapterLE Failed %s", error->message);
+ g_clear_error(&error);
+ }
}
-
- /* Display notification */
- notification_status_message_post(BT_STR_NOT_SUPPORT);
-
+ g_variant_unref(result);
/* Terminate myself */
if (_bt_adapter_get_status() == BT_DEACTIVATED)
g_idle_add((GSourceFunc)_bt_terminate_service, NULL);
return BLUETOOTH_ERROR_INTERNAL;
}
+ if (result)
+ g_variant_unref(result);
+
_bt_adapter_start_le_enable_timer();
if (status == BT_ACTIVATED) {
int _bt_disable_adapter_le(void)
{
BT_DBG("+");
- DBusGProxy *proxy;
+ GDBusProxy *proxy;
bt_le_status_t bt_le_state;
+ GVariant *result;
+ GError *error = NULL;
bt_le_state = _bt_adapter_get_le_status();
if (bt_le_state == BT_LE_DEACTIVATING) {
if (!proxy)
return BLUETOOTH_ERROR_INTERNAL;
- if (dbus_g_proxy_call(proxy, "DisableAdapterLe", NULL,
- G_TYPE_INVALID, G_TYPE_INVALID) == FALSE) {
- BT_ERR("Bt core call failed");
+ result = g_dbus_proxy_call_sync(proxy,
+ "DisableAdapterLe",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Bt core call failed (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Bt core call failed");
_bt_adapter_set_le_status(BT_LE_ACTIVATED);
return BLUETOOTH_ERROR_INTERNAL;
- }
+ }
+ g_variant_unref(result);
_bt_set_le_disabled(BLUETOOTH_ERROR_NONE);
BT_DBG("le status : %d", _bt_adapter_get_le_status());
BT_DBG("-");
int _bt_get_local_address(bluetooth_device_address_t *local_address)
{
- DBusGProxy *proxy;
- GError *err = NULL;
- char *address;
- GValue address_v = { 0 };
+ GDBusProxy *proxy;
+ GError *error = NULL;
+ const char *address;
+ GVariant *result;
+ GVariant *temp;
BT_CHECK_PARAMETER(local_address, return);
proxy = _bt_get_adapter_properties_proxy();
retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
- if (!dbus_g_proxy_call(proxy, "Get", &err,
- G_TYPE_STRING, BT_ADAPTER_INTERFACE,
- G_TYPE_STRING, "Address",
- G_TYPE_INVALID,
- G_TYPE_VALUE, &address_v,
- G_TYPE_INVALID)) {
- if (err != NULL) {
- BT_ERR("Getting property failed: [%s]\n", err->message);
- g_error_free(err);
+ result = g_dbus_proxy_call_sync(proxy,
+ "Get",
+ g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
+ "Address"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ BT_ERR("Failed to get local address");
+ if (error != NULL) {
+ BT_ERR("Failed to get local address (Error: %s)", error->message);
+ g_clear_error(&error);
}
return BLUETOOTH_ERROR_INTERNAL;
}
- address = (char *)g_value_get_string(&address_v);
+ g_variant_get(result, "(v)", &temp);
+ address = g_variant_get_string(temp, NULL);
+ BT_DBG("Address:%s", address);
- if (address) {
+ if (address)
_bt_convert_addr_string_to_type(local_address->addr, address);
- } else {
+ else
return BLUETOOTH_ERROR_INTERNAL;
- }
+ g_variant_unref(result);
+ g_variant_unref(temp);
return BLUETOOTH_ERROR_NONE;
}
int _bt_get_local_version(bluetooth_version_t *local_version)
{
- DBusGProxy *proxy;
- GHashTable *hash = NULL;
- char *ver = NULL;
+ GDBusProxy *proxy;
+ const char *ver = NULL;
char *ptr = NULL;
int ret = BLUETOOTH_ERROR_NONE;
+ GVariant *result;
+ GVariant *temp;
BT_CHECK_PARAMETER(local_version, return);
- GError *err = NULL;
- GValue version_v = { 0 };
+ GError *error = NULL;
proxy = _bt_get_adapter_properties_proxy();
retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
- if (!dbus_g_proxy_call(proxy, "Get", &err,
- G_TYPE_STRING, BT_ADAPTER_INTERFACE,
- G_TYPE_STRING, "Version",
- G_TYPE_INVALID,
- G_TYPE_VALUE, &version_v,
- G_TYPE_INVALID)) {
- if (err != NULL) {
- BT_ERR("Getting property failed: [%s]\n", err->message);
- g_error_free(err);
- }
+ result = g_dbus_proxy_call_sync(proxy,
+ "Get",
+ g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
+ "Version"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to get local version (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Failed to get local version");
return BLUETOOTH_ERROR_INTERNAL;
}
- ver = (char *)g_value_get_string(&version_v);
-
+ g_variant_get(result, "(v)", &temp);
+ ver = g_variant_get_string(temp, NULL);
+ BT_DBG("VERSION: %s", ver);
if (ver && (strlen(ver) > 0)) {
/* Check the utf8 valitation & Fill the NULL in the invalid location*/
ret = BLUETOOTH_ERROR_INTERNAL;
}
- g_hash_table_destroy(hash);
+ g_variant_unref(result);
+ g_variant_unref(temp);
return ret;
}
int _bt_get_local_name(bluetooth_device_name_t *local_name)
{
- DBusGProxy *proxy;
- GHashTable *hash = NULL;
- char *name = NULL;
+ GDBusProxy *proxy;
+ const char *name = NULL;
char *ptr = NULL;
int ret = BLUETOOTH_ERROR_NONE;
-
- GError *err = NULL;
- GValue name_v = { 0 };
+ GVariant *result;
+ GVariant *temp;
+ GError *error = NULL;
BT_CHECK_PARAMETER(local_name, return);
proxy = _bt_get_adapter_properties_proxy();
retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
- if (!dbus_g_proxy_call(proxy, "Get", &err,
- G_TYPE_STRING, BT_ADAPTER_INTERFACE,
- G_TYPE_STRING, "Alias",
- G_TYPE_INVALID,
- G_TYPE_VALUE, &name_v,
- G_TYPE_INVALID)) {
- if (err != NULL) {
- BT_ERR("Getting property failed: [%s]\n", err->message);
- g_error_free(err);
- }
+ result = g_dbus_proxy_call_sync(proxy,
+ "Get",
+ g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
+ "Alias"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to get local name (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Failed to get local name");
return BLUETOOTH_ERROR_INTERNAL;
}
- name = (char *)g_value_get_string(&name_v);
+ g_variant_get(result, "(v)", &temp);
+ name = g_variant_get_string(temp, NULL);
+ BT_DBG("LOCAL NAME:%s", name);
if (name && (strlen(name) > 0)) {
/* Check the utf8 valitation & Fill the NULL in the invalid location*/
} else {
ret = BLUETOOTH_ERROR_INTERNAL;
}
-
- g_hash_table_destroy(hash);
+ g_variant_unref(result);
+ g_variant_unref(temp);
return ret;
}
int _bt_set_local_name(char *local_name)
{
- GValue name = { 0 };
- DBusGProxy *proxy;
+ GDBusProxy *proxy;
GError *error = NULL;
char *ptr = NULL;
+ GVariant *result;
BT_CHECK_PARAMETER(local_name, return);
if (!g_utf8_validate(local_name, -1, (const char **)&ptr))
*ptr = '\0';
- g_value_init(&name, G_TYPE_STRING);
- g_value_set_string(&name, local_name);
-
- dbus_g_proxy_call(proxy, "Set", &error,
- G_TYPE_STRING, BT_ADAPTER_INTERFACE,
- G_TYPE_STRING, "Alias",
- G_TYPE_VALUE, &name,
- G_TYPE_INVALID, G_TYPE_INVALID);
-
- g_value_unset(&name);
-
- if (error) {
- BT_ERR("SetProperty Fail: %s", error->message);
- g_error_free(error);
+ result = g_dbus_proxy_call_sync(proxy,
+ "Set",
+ g_variant_new("(ssv)", BT_ADAPTER_INTERFACE,
+ "Alias", g_variant_new("s", local_name)),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to set Alias (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Failed to set Alias");
return BLUETOOTH_ERROR_INTERNAL;
}
+ g_variant_unref(result);
return BLUETOOTH_ERROR_NONE;
}
int _bt_is_service_used(char *service_uuid, gboolean *used)
{
- char **uuids;
- int i;
- DBusGProxy *proxy;
- GError *err = NULL;
- GValue uuids_v = { 0 };
+ GDBusProxy *proxy;
+ GError *error = NULL;
int ret = BLUETOOTH_ERROR_NONE;
+ GVariant *result;
+ GVariant *temp = NULL;
+ GVariantIter *iter = NULL;
+ gchar *uuid = NULL;
BT_DBG("+");
BT_CHECK_PARAMETER(service_uuid, return);
proxy = _bt_get_adapter_properties_proxy();
retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
- if (!dbus_g_proxy_call(proxy, "Get", &err,
- G_TYPE_STRING, BT_ADAPTER_INTERFACE,
- G_TYPE_STRING, "UUIDs",
- G_TYPE_INVALID,
- G_TYPE_VALUE, &uuids_v,
- G_TYPE_INVALID)) {
- if (err != NULL) {
- BT_ERR("Getting property failed: [%s]\n", err->message);
- g_error_free(err);
- }
+ result = g_dbus_proxy_call_sync(proxy,
+ "Get",
+ g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
+ "UUIDs"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to get UUIDs (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Failed to get UUIDs");
return BLUETOOTH_ERROR_INTERNAL;
}
- uuids = g_value_get_boxed(&uuids_v);
-
- if (uuids == NULL) {
- /* Normal case */
- *used = FALSE;
- goto done;
- }
+ g_variant_get(result, "(v)", &temp);
+ g_variant_get(temp, "as", &iter);
- for (i = 0; uuids[i] != NULL; i++) {
- if (strcasecmp(uuids[i], service_uuid) == 0) {
+ *used = FALSE;
+ while (g_variant_iter_loop(iter, "&s", &uuid)) {
+ if (strcasecmp(uuid, service_uuid) == 0) {
*used = TRUE;
- goto done;
+ break;
}
}
+ g_variant_iter_free(iter);
+ g_variant_unref(result);
+ g_variant_unref(temp);
- *used = FALSE;
-done:
BT_DBG("Service Used? %d", *used);
+
return ret;
}
-
static gboolean __bt_get_discoverable_property(void)
{
- DBusGProxy *proxy;
- GValue discoverable_v = { 0 };
- GError *err = NULL;
+ GDBusProxy *proxy;
+ gboolean discoverable_v;
+ GError *error = NULL;
+ GVariant *result;
+ GVariant *temp;
proxy = _bt_get_adapter_properties_proxy();
retv_if(proxy == NULL, FALSE);
- if (!dbus_g_proxy_call(proxy, "Get", &err,
- G_TYPE_STRING, BT_ADAPTER_INTERFACE,
- G_TYPE_STRING, "Discoverable",
- G_TYPE_INVALID,
- G_TYPE_VALUE, &discoverable_v,
- G_TYPE_INVALID)) {
- if (err != NULL) {
- BT_ERR("Getting property failed: [%s]\n", err->message);
- g_error_free(err);
- }
- return FALSE;
+ result = g_dbus_proxy_call_sync(proxy,
+ "Get",
+ g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
+ "Discoverable"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to get Discoverable property (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Failed to get Discoverable property");
+ return BLUETOOTH_ERROR_INTERNAL;
}
- return g_value_get_boolean(&discoverable_v);
+ g_variant_get(result, "(v)", &temp);
+ discoverable_v = g_variant_get_boolean(temp);
+ BT_DBG("discoverable_v:%d", discoverable_v);
+
+ g_variant_unref(result);
+ g_variant_unref(temp);
+
+ return discoverable_v;
}
int _bt_get_discoverable_mode(int *mode)
gboolean inq_scan;
gboolean pg_scan;
GError *error = NULL;
- GValue connectable = { 0 };
- GValue discoverable = { 0 };
- GValue val_timeout = { 0 };
- DBusGProxy *proxy;
+ GDBusProxy *proxy;
+ GVariant *result;
proxy = _bt_get_adapter_properties_proxy();
retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
- g_value_init(&connectable, G_TYPE_BOOLEAN);
- g_value_init(&discoverable, G_TYPE_BOOLEAN);
- g_value_init(&val_timeout, G_TYPE_UINT);
+#ifdef TIZEN_DPM_ENABLE
+ if (discoverable_mode != BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE &&
+ _bt_dpm_get_bluetooth_limited_discoverable_state() == DPM_RESTRICTED) {
+ _bt_launch_dpm_popup("DPM_POLICY_DISABLE_BT_HANDSFREE");
+ return BLUETOOTH_ERROR_ACCESS_DENIED;
+ }
+ if (discoverable_mode != BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE &&
+ _bt_dpm_get_bluetooth_limited_discoverable_state() == DPM_RESTRICTED) {
+ _bt_launch_dpm_popup("DPM_POLICY_DISABLE_BT");
+ return BLUETOOTH_ERROR_ACCESS_DENIED;
+ }
+#endif
switch (discoverable_mode) {
case BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE:
BT_INFO("Req. discoverable_mode : %d, timeout : %d",
discoverable_mode, timeout);
- g_value_set_boolean(&connectable, pg_scan);
- g_value_set_boolean(&discoverable, inq_scan);
- g_value_set_uint(&val_timeout, timeout);
-
- dbus_g_proxy_call(proxy, "Set", &error,
- G_TYPE_STRING, BT_ADAPTER_INTERFACE,
- G_TYPE_STRING, "Connectable",
- G_TYPE_VALUE, &connectable,
- G_TYPE_INVALID, G_TYPE_INVALID);
-
- if (error != NULL) {
- BT_ERR("Connectable set err:[%s]", error->message);
- g_error_free(error);
- ret = BLUETOOTH_ERROR_INTERNAL;
- goto done;
+ result = g_dbus_proxy_call_sync(proxy,
+ "Set",
+ g_variant_new("(ssv)", BT_ADAPTER_INTERFACE,
+ "Connectable", g_variant_new("b", pg_scan)),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to set connectable property (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Failed to set connectable property");
+ return BLUETOOTH_ERROR_INTERNAL;
}
-
- dbus_g_proxy_call(proxy, "Set", &error,
- G_TYPE_STRING, BT_ADAPTER_INTERFACE,
- G_TYPE_STRING, "Discoverable",
- G_TYPE_VALUE, &discoverable,
- G_TYPE_INVALID, G_TYPE_INVALID);
-
-
- if (error != NULL) {
- BT_ERR("Discoverable set err:[%s]", error->message);
- g_error_free(error);
- ret = BLUETOOTH_ERROR_INTERNAL;
- goto done;
+ g_variant_unref(result);
+ result = g_dbus_proxy_call_sync(proxy,
+ "Set",
+ g_variant_new("(ssv)", BT_ADAPTER_INTERFACE, "Discoverable",
+ g_variant_new("b", inq_scan)),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to set Discoverable property (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Failed to set Discoverable property");
+ return BLUETOOTH_ERROR_INTERNAL;
}
-
- dbus_g_proxy_call(proxy, "Set", &error,
- G_TYPE_STRING, BT_ADAPTER_INTERFACE,
- G_TYPE_STRING, "DiscoverableTimeout",
- G_TYPE_VALUE, &val_timeout,
- G_TYPE_INVALID, G_TYPE_INVALID);
-
- if (error != NULL) {
- BT_ERR("Timeout set err:[%s]", error->message);
- g_error_free(error);
- ret = BLUETOOTH_ERROR_INTERNAL;
- goto done;
+ g_variant_unref(result);
+ result = g_dbus_proxy_call_sync(proxy,
+ "Set",
+ g_variant_new("(ssv)", BT_ADAPTER_INTERFACE,
+ "DiscoverableTimeout", g_variant_new("u", timeout)),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to set DiscoverableTimeout property (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Failed to set DiscoverableTimeout property");
+ return BLUETOOTH_ERROR_INTERNAL;
}
if (discoverable_mode == BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE)
ret = __bt_set_visible_time(timeout);
-done:
- g_value_unset(&val_timeout);
- g_value_unset(&connectable);
- g_value_unset(&discoverable);
+ g_variant_unref(result);
return ret;
}
int _bt_start_discovery(void)
{
- DBusGProxy *proxy;
- GError *err = NULL;
+ GDBusProxy *proxy;
+ GError *error = NULL;
+ GVariant *result;
if (_bt_is_discovering() == TRUE) {
BT_ERR("BT is already in discovering");
proxy = _bt_get_adapter_proxy();
retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
- if (!dbus_g_proxy_call(proxy, "StartDiscovery", &err,
- G_TYPE_INVALID, G_TYPE_INVALID)) {
- if (err != NULL) {
- BT_ERR("StartDiscovery failed: [%s]\n", err->message);
- g_error_free(err);
- }
- BT_ERR("Discover start failed");
+ result = g_dbus_proxy_call_sync(proxy,
+ "StartDiscovery",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("StartDiscovery failed (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("StartDiscovery failed");
return BLUETOOTH_ERROR_INTERNAL;
}
is_discovering = TRUE;
cancel_by_user = FALSE;
/* discovery status will be change in event */
-
+ g_variant_unref(result);
return BLUETOOTH_ERROR_NONE;
}
int _bt_start_custom_discovery(bt_discovery_role_type_t role)
{
- DBusGProxy *proxy;
-
+ GDBusProxy *proxy;
+ GVariant *result;
+ GError *error = NULL;
const gchar *disc_type;
if (_bt_is_discovering() == TRUE) {
else
return BLUETOOTH_ERROR_INVALID_PARAM;
- if (!dbus_g_proxy_call(proxy, "StartCustomDiscovery", NULL,
- G_TYPE_STRING, disc_type,
- G_TYPE_INVALID, G_TYPE_INVALID)) {
- BT_ERR("StartCustomDiscovery failed");
+ result = g_dbus_proxy_call_sync(proxy,
+ "StartCustomDiscovery",
+ g_variant_new("s", disc_type),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("StartCustomDiscovery failed (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("StartCustomDiscovery failed");
return BLUETOOTH_ERROR_INTERNAL;
}
is_discovering = TRUE;
cancel_by_user = FALSE;
/* discovery status will be change in event */
-
+ g_variant_unref(result);
return BLUETOOTH_ERROR_NONE;
}
int _bt_cancel_discovery(void)
{
- DBusGProxy *proxy;
- GError *err = NULL;
+ GDBusProxy *proxy;
+ GError *error = NULL;
+ GVariant *result;
if (_bt_is_discovering() == FALSE) {
BT_ERR("BT is not in discovering");
proxy = _bt_get_adapter_proxy();
retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
- if (!dbus_g_proxy_call(proxy, "StopDiscovery", &err,
- G_TYPE_INVALID, G_TYPE_INVALID)) {
- if (err != NULL) {
- BT_ERR("StopDiscovery failed: [%s]\n", err->message);
- g_error_free(err);
+ result = g_dbus_proxy_call_sync(proxy,
+ "StopDiscovery",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ int ret = BLUETOOTH_ERROR_INTERNAL;
+ if (error != NULL) {
+ BT_ERR("StopDiscovery failed (Error: %s)", error->message);
+
+ if (g_strrstr(error->message, "No discovery started"))
+ ret = BLUETOOTH_ERROR_NOT_IN_OPERATION;
+
+ g_clear_error(&error);
+ } else {
+ BT_ERR("StopDiscovery failed");
}
- return BLUETOOTH_ERROR_INTERNAL;
+
+ return ret;
}
cancel_by_user = TRUE;
/* discovery status will be change in event */
-
+ g_variant_unref(result);
return BLUETOOTH_ERROR_NONE;
}
-int _bt_start_le_discovery(void)
-{
- DBusGProxy *proxy;
-
- if (_bt_is_le_discovering() == TRUE) {
- BT_ERR("BT is already in LE discovering");
- return BLUETOOTH_ERROR_IN_PROGRESS;
- }
-
- proxy = _bt_get_adapter_proxy();
- retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
-
- if (!dbus_g_proxy_call(proxy, "StartLEDiscovery", NULL,
- G_TYPE_INVALID, G_TYPE_INVALID)) {
- BT_ERR("LE Discover start failed");
- return BLUETOOTH_ERROR_INTERNAL;
- }
-
- is_le_discovering = TRUE;
-
- return BLUETOOTH_ERROR_NONE;
-}
-
-int _bt_stop_le_discovery(void)
-{
- DBusGProxy *proxy;
-
- if (_bt_is_le_discovering() == FALSE) {
- BT_ERR("BT is not in LE discovering");
- return BLUETOOTH_ERROR_NOT_IN_OPERATION;
- }
-
- proxy = _bt_get_adapter_proxy();
- retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
-
- if (!dbus_g_proxy_call(proxy, "StopLEDiscovery", NULL,
- G_TYPE_INVALID, G_TYPE_INVALID)) {
- BT_ERR("LE Discover stop failed");
- return BLUETOOTH_ERROR_INTERNAL;
- }
-
- return BLUETOOTH_ERROR_NONE;
-}
-
gboolean _bt_is_discovering(void)
{
return is_discovering;
}
-gboolean _bt_is_le_discovering(void)
-{
- return is_le_discovering;
-}
-
gboolean _bt_is_connectable(void)
{
- DBusGProxy *proxy;
- GValue connectable_v = { 0 };
- GError *err = NULL;
+ GDBusProxy *proxy;
+ GError *error = NULL;
gboolean is_connectable = FALSE;
+ GVariant *result;
+ GVariant *temp;
proxy = _bt_get_adapter_properties_proxy();
retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
- if (!dbus_g_proxy_call(proxy, "Get", &err,
- G_TYPE_STRING, BT_ADAPTER_INTERFACE,
- G_TYPE_STRING, "Connectable",
- G_TYPE_INVALID,
- G_TYPE_VALUE, &connectable_v,
- G_TYPE_INVALID)) {
- if (err != NULL) {
- BT_ERR("Getting property failed: [%s]\n", err->message);
- g_error_free(err);
- }
+ result = g_dbus_proxy_call_sync(proxy,
+ "Get",
+ g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
+ "Connectable"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to get connectable property (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Failed to get connectable property");
return BLUETOOTH_ERROR_INTERNAL;
}
- is_connectable = g_value_get_boolean(&connectable_v);
- BT_INFO("Get connectable [%d]", is_connectable);
+ g_variant_get(result, "(v)", &temp);
+ is_connectable = g_variant_get_boolean(temp);
+ BT_DBG("discoverable_v:%d", is_connectable);
+
+ g_variant_unref(result);
+ g_variant_unref(temp);
+ BT_INFO("Get connectable [%d]", is_connectable);
return is_connectable;
}
int _bt_set_connectable(gboolean is_connectable)
{
- DBusGProxy *proxy;
- GValue connectable = { 0 };
+ GDBusProxy *proxy;
GError *error = NULL;
+ GVariant *result;
if (__bt_is_factory_test_mode()) {
BT_ERR("Unable to set connectable in factory binary !!");
retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
- g_value_init(&connectable, G_TYPE_BOOLEAN);
- g_value_set_boolean(&connectable, is_connectable);
-
- dbus_g_proxy_call(proxy, "Set", &error,
- G_TYPE_STRING, BT_ADAPTER_INTERFACE,
- G_TYPE_STRING, "Connectable",
- G_TYPE_VALUE, &connectable,
- G_TYPE_INVALID, G_TYPE_INVALID);
-
- g_value_unset(&connectable);
- if (error != NULL) {
- BT_ERR("Connectable set err:[%s]", error->message);
- g_error_free(error);
+ result = g_dbus_proxy_call_sync(proxy,
+ "Set",
+ g_variant_new("(ssv)", BT_ADAPTER_INTERFACE, "Connectable",
+ g_variant_new("b", is_connectable)),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to set connectable property (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Failed to set connectable property");
return BLUETOOTH_ERROR_INTERNAL;
}
- BT_INFO("Set connectable [%d]", is_connectable);
+ BT_INFO_C("### Set connectable [%d]", is_connectable);
+ g_variant_unref(result);
return BLUETOOTH_ERROR_NONE;
}
gboolean _bt_get_discovering_property(bt_discovery_role_type_t discovery_type)
{
- DBusGProxy *proxy;
- GValue discovering_v = { 0 };
- GError *err = NULL;
+ GDBusProxy *proxy;
+ gboolean discovering_v;
+ GError *error = NULL;
char *discovering_type = NULL;
+ GVariant *result;
+ GVariant *temp;
proxy = _bt_get_adapter_properties_proxy();
retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
else if (discovery_type == DISCOVERY_ROLE_LE)
discovering_type = "LEDiscovering";
- if (!dbus_g_proxy_call(proxy, "Get", &err,
- G_TYPE_STRING, BT_ADAPTER_INTERFACE,
- G_TYPE_STRING, discovering_type,
- G_TYPE_INVALID,
- G_TYPE_VALUE, &discovering_v,
- G_TYPE_INVALID)) {
- if (err != NULL) {
- BT_ERR("Getting property failed: [%s]\n", err->message);
- g_error_free(err);
- }
+ result = g_dbus_proxy_call_sync(proxy,
+ "Get",
+ g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
+ discovering_type),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to get discovering property (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Failed to get discovering property");
return BLUETOOTH_ERROR_INTERNAL;
}
- return g_value_get_boolean(&discovering_v);
+ g_variant_get(result, "(v)", &temp);
+ discovering_v = g_variant_get_boolean(temp);
+ BT_DBG("discoverable_v:%d", discovering_v);
+
+ g_variant_unref(result);
+ g_variant_unref(temp);
+
+ return discovering_v;
}
unsigned int _bt_get_discoverable_timeout_property(void)
{
- DBusGProxy *proxy;
- GValue timeout_v = { 0 };
- GError *err = NULL;
+ GDBusProxy *proxy;
+ unsigned int timeout_v;
+ GError *error = NULL;
+ GVariant *result;
+ GVariant *temp;
proxy = _bt_get_adapter_properties_proxy();
retv_if(proxy == NULL, 0);
- if (!dbus_g_proxy_call(proxy, "Get", &err,
- G_TYPE_STRING, BT_ADAPTER_INTERFACE,
- G_TYPE_STRING, "DiscoverableTimeout",
- G_TYPE_INVALID,
- G_TYPE_VALUE, &timeout_v,
- G_TYPE_INVALID)) {
- if (err != NULL) {
- BT_ERR("Getting property failed: [%s]\n", err->message);
- g_error_free(err);
+ result = g_dbus_proxy_call_sync(proxy,
+ "Get",
+ g_variant_new("(ss)", BT_ADAPTER_INTERFACE,
+ "DiscoverableTimeout"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ BT_ERR("Fail to get discoverable timeout");
+ if (error != NULL) {
+ BT_ERR("Fail to get discoverable timeout (Error: %s)", error->message);
+ g_clear_error(&error);
}
return 0;
}
- return g_value_get_uint(&timeout_v);
+ g_variant_get(result, "(v)", &temp);
+ timeout_v = g_variant_get_uint32(temp);
+ BT_DBG("discoverable_v:%d", timeout_v);
+
+ g_variant_unref(result);
+ g_variant_unref(temp);
+
+ return timeout_v;
}
-static bluetooth_device_info_t *__bt_parse_device_info(DBusMessageIter *item_iter)
+static bluetooth_device_info_t *__bt_parse_device_info(GVariantIter *item_iter)
{
- DBusMessageIter value_iter;
bluetooth_device_info_t *dev_info;
-
- dbus_message_iter_recurse(item_iter, &value_iter);
-
- if (dbus_message_iter_get_arg_type(&value_iter) != DBUS_TYPE_DICT_ENTRY) {
- BT_DBG("No entry");
- return NULL;
- }
+ GVariant *value;
+ const gchar *key;
+ GByteArray *manufacturer_data = NULL;
+ guint8 char_value;
+ GVariantIter *char_value_iter;
dev_info = g_malloc0(sizeof(bluetooth_device_info_t));
- while (dbus_message_iter_get_arg_type(&value_iter) ==
- DBUS_TYPE_DICT_ENTRY) {
- char *value = NULL;
- char *key;
- DBusMessageIter dict_entry;
- DBusMessageIter iter_dict_val;
+ while (g_variant_iter_loop(item_iter, "{sv}", &key, &value)) {
- dbus_message_iter_recurse(&value_iter, &dict_entry);
-
- dbus_message_iter_get_basic(&dict_entry, &key);
-
- if (key == NULL) {
- dbus_message_iter_next(&value_iter);
- continue;
- }
-
- if (!dbus_message_iter_next(&dict_entry)) {
- dbus_message_iter_next(&value_iter);
+ if (key == NULL)
continue;
- }
- dbus_message_iter_recurse(&dict_entry, &iter_dict_val);
- if (strcasecmp(key, "Address") == 0) {
+ if (!g_strcmp0(key, "Address")) {
const char *address = NULL;
- dbus_message_iter_get_basic(&iter_dict_val, &address);
+ address = g_variant_get_string(value, NULL);
_bt_convert_addr_string_to_type(dev_info->device_address.addr,
address);
-
- } else if (strcasecmp(key, "Class") == 0) {
+ } else if (!g_strcmp0(key, "Class")) {
unsigned int cod;
- dbus_message_iter_get_basic(&iter_dict_val, &cod);
+ cod = g_variant_get_uint32(value);
_bt_divide_device_class(&dev_info->device_class, cod);
- } else if (strcasecmp(key, "Name") == 0) {
- dbus_message_iter_get_basic(&iter_dict_val, &value);
-
+ } else if (!g_strcmp0(key, "Name")) {
+ const char *name = NULL;
+ name = g_variant_get_string(value, NULL);
/* If there is no Alias */
if (strlen(dev_info->device_name.name) == 0) {
- g_strlcpy(dev_info->device_name.name, value,
+ g_strlcpy(dev_info->device_name.name, name,
BLUETOOTH_DEVICE_NAME_LENGTH_MAX+1);
}
- } else if (strcasecmp(key, "Alias") == 0) {
- dbus_message_iter_get_basic(&iter_dict_val, &value);
-
+ } else if (!g_strcmp0(key, "Alias")) {
+ const char *alias = NULL;
+ alias = g_variant_get_string(value, NULL);
/* Overwrite the name */
- if (value) {
+ if (alias) {
memset(dev_info->device_name.name, 0x00,
BLUETOOTH_DEVICE_NAME_LENGTH_MAX+1);
- g_strlcpy(dev_info->device_name.name, value,
+ g_strlcpy(dev_info->device_name.name, alias,
BLUETOOTH_DEVICE_NAME_LENGTH_MAX+1);
}
- } else if (strcasecmp(key, "Connected") == 0) {
- dbus_message_iter_get_basic(&iter_dict_val,
- &dev_info->connected);
- } else if (strcasecmp(key, "Paired") == 0) {
- dbus_message_iter_get_basic(&iter_dict_val,
- &dev_info->paired);
- } else if (strcasecmp(key, "Trusted") == 0) {
- dbus_message_iter_get_basic(&iter_dict_val,
- &dev_info->trust);
- } else if (strcasecmp(key, "RSSI") == 0) {
- dbus_message_iter_get_basic(&iter_dict_val,
- &dev_info->rssi);
- } else if (strcasecmp(key, "UUIDs") == 0) {
- DBusMessageIter uuid_iter;
+ } else if (!g_strcmp0(key, "IsAliasSet")) {
+ dev_info->is_alias_set = g_variant_get_boolean(value);
+ } else if (!g_strcmp0(key, "Connected")) {
+ dev_info->connected = g_variant_get_byte(value);
+ } else if (!g_strcmp0(key, "Paired")) {
+ dev_info->paired = g_variant_get_boolean(value);
+ } else if (!g_strcmp0(key, "Trusted")) {
+ dev_info->trust = g_variant_get_boolean(value);
+ } else if (!g_strcmp0(key, "RSSI")) {
+ dev_info->rssi = g_variant_get_int16(value);
+ } else if (!g_strcmp0(key, "UUIDs")) {
+ GVariantIter *iter;
+ gchar *uuid = NULL;
char **parts;
int i = 0;
- dbus_message_iter_recurse(&iter_dict_val, &uuid_iter);
-
- while (dbus_message_iter_get_arg_type(&uuid_iter) != DBUS_TYPE_INVALID) {
- dbus_message_iter_get_basic(&uuid_iter,
- &value);
-
- g_strlcpy(dev_info->uuids[i], value,
- BLUETOOTH_UUID_STRING_MAX);
+ dev_info->service_index = 0;
+ g_variant_get(value, "as", &iter);
+ while (g_variant_iter_loop(iter, "s", &uuid)) {
+ g_strlcpy(dev_info->uuids[i], uuid, BLUETOOTH_UUID_STRING_MAX);
+ parts = g_strsplit(uuid, "-", -1);
- parts = g_strsplit(value, "-", -1);
-
- if (parts == NULL || parts[0] == NULL)
+ if (parts == NULL || parts[0] == NULL) {
+ g_free(uuid);
break;
+ }
dev_info->service_list_array[i] = g_ascii_strtoull(parts[0], NULL, 16);
g_strfreev(parts);
i++;
- if (!dbus_message_iter_next(&uuid_iter)) {
- break;
- }
}
-
dev_info->service_index = i;
- } else if (strcasecmp(key, "ManufacturerDataLen") == 0) {
- dbus_message_iter_get_basic(&iter_dict_val,
- &dev_info->manufacturer_data.data_len);
- } else if (strcasecmp(key, "ManufacturerData") == 0) {
- DBusMessageIter manufacturer_iter;
- int i = 0;
- char byte = 0;
-
- dbus_message_iter_recurse(&iter_dict_val, &manufacturer_iter);
-
- while (dbus_message_iter_get_arg_type(&manufacturer_iter) == DBUS_TYPE_BYTE) {
- dbus_message_iter_get_basic(&manufacturer_iter, &byte);
- dev_info->manufacturer_data.data[i] = byte;
- i++;
- dbus_message_iter_next(&manufacturer_iter);
+ g_variant_iter_free(iter);
+ } else if (strcasecmp(key, "LegacyManufacturerDataLen") == 0) {
+ dev_info->manufacturer_data.data_len = g_variant_get_uint16(value);
+ } else if (strcasecmp(key, "LegacyManufacturerData") == 0) {
+ manufacturer_data = g_byte_array_new();
+ g_variant_get(value, "ay", &char_value_iter);
+ while (g_variant_iter_loop(char_value_iter, "y", &char_value))
+ g_byte_array_append(manufacturer_data, &char_value, 1);
+
+ if (manufacturer_data) {
+ if (manufacturer_data->len > 0)
+ memcpy(dev_info->manufacturer_data.data, manufacturer_data->data, manufacturer_data->len);
}
+ g_variant_iter_free(char_value_iter);
+ g_byte_array_free(manufacturer_data, TRUE);
}
-
- dbus_message_iter_next(&value_iter);
}
return dev_info;
}
-static void __bt_extract_device_info(DBusMessageIter *msg_iter,
+static void __bt_extract_device_info(GVariantIter *iter,
GArray **dev_list)
{
bluetooth_device_info_t *dev_info = NULL;
char *object_path = NULL;
- DBusMessageIter value_iter;
+ GVariantIter *interface_iter;
+ GVariantIter *svc_iter;
+ char *interface_str = NULL;
/* Parse the signature: oa{sa{sv}}} */
- ret_if(dbus_message_iter_get_arg_type(msg_iter) !=
- DBUS_TYPE_OBJECT_PATH);
+ while (g_variant_iter_loop(iter, "{&oa{sa{sv}}}", &object_path,
+ &interface_iter)) {
- dbus_message_iter_get_basic(msg_iter, &object_path);
- ret_if(object_path == NULL);
+ if (object_path == NULL)
+ continue;
- /* object array (oa) */
- ret_if(dbus_message_iter_next(msg_iter) == FALSE);
- ret_if(dbus_message_iter_get_arg_type(msg_iter) != DBUS_TYPE_ARRAY);
+ while (g_variant_iter_loop(interface_iter, "{sa{sv}}",
+ &interface_str, &svc_iter)) {
+ if (g_strcmp0(interface_str, "org.bluez.Device1") == 0) {
+ BT_DBG("Found a device: %s", object_path);
+ dev_info = __bt_parse_device_info(svc_iter);
+ if (dev_info) {
+ if (dev_info->paired == TRUE) {
+ g_array_append_vals(*dev_list, dev_info,
+ sizeof(bluetooth_device_info_t));
+ }
+ g_free(dev_info);
+ }
+ g_free(interface_str);
+ g_variant_iter_free(svc_iter);
+ break;
+ }
+ }
+ }
+ BT_DBG("-");
+}
- dbus_message_iter_recurse(msg_iter, &value_iter);
+int _bt_get_bonded_devices(GArray **dev_list)
+{
+ BT_DBG("+");
+ GDBusConnection *conn;
+ GDBusProxy *manager_proxy;
+ GVariant *result = NULL;
+ GVariantIter *iter = NULL;
+ GError *error = NULL;
- /* string array (sa) */
- while (dbus_message_iter_get_arg_type(&value_iter) ==
- DBUS_TYPE_DICT_ENTRY) {
- char *interface_name = NULL;
- DBusMessageIter interface_iter;
+ conn = _bt_gdbus_get_system_gconn();
+ retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
- dbus_message_iter_recurse(&value_iter, &interface_iter);
+ manager_proxy = _bt_get_manager_proxy();
+ retv_if(manager_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+ result = g_dbus_proxy_call_sync(manager_proxy, "GetManagedObjects",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ NULL);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to GetManagedObjects (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Failed to Failed to GetManagedObjects");
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
- ret_if(dbus_message_iter_get_arg_type(&interface_iter) !=
- DBUS_TYPE_STRING);
+ /* signature of GetManagedObjects: a{oa{sa{sv}}} */
+ g_variant_get(result, "(a{oa{sa{sv}}})", &iter);
- dbus_message_iter_get_basic(&interface_iter, &interface_name);
+ __bt_extract_device_info(iter, dev_list);
+ g_variant_iter_free(iter);
+ g_variant_unref(result);
- ret_if(dbus_message_iter_next(&interface_iter) == FALSE);
+ BT_DBG("-");
+ return BLUETOOTH_ERROR_NONE;
+}
- ret_if(dbus_message_iter_get_arg_type(&interface_iter) !=
- DBUS_TYPE_ARRAY);
+int _bt_get_profile_connected_devices(char *profile_uuid, GArray **addr_list)
+{
+ BT_DBG("+");
+ GDBusConnection *conn;
+ GDBusProxy *manager_proxy;
+ GVariant *result = NULL;
+ GVariant *result1 = NULL;
+ GVariantIter *iter = NULL;
+ GError *error = NULL;
+ char *object_path = NULL;
+ GVariantIter *interface_iter;
+ char *interface_str = NULL;
+ GDBusProxy *device_proxy = NULL;
+ gboolean is_connected = FALSE;
- if (g_strcmp0(interface_name, "org.bluez.Device1") == 0) {
- BT_DBG("Found a device: %s", object_path);
- dev_info = __bt_parse_device_info(&interface_iter);
+ conn = _bt_gdbus_get_system_gconn();
+ retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
- if (dev_info) {
- if (dev_info->paired == FALSE)
- goto not_paired;
+ manager_proxy = _bt_get_manager_proxy();
+ retv_if(manager_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+ result = g_dbus_proxy_call_sync(manager_proxy, "GetManagedObjects",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ NULL);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to GetManagedObjects (Error: %s)", error->message);
+ g_clear_error(&error);
+ error = NULL;
+ } else
+ BT_ERR("Failed to Failed to GetManagedObjects");
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
- g_array_append_vals(*dev_list, dev_info,
- sizeof(bluetooth_device_info_t));
+ /* signature of GetManagedObjects: a{oa{sa{sv}}} */
+ g_variant_get(result, "(a{oa{sa{sv}}})", &iter);
- g_free(dev_info);
- }
+ /* Parse the signature: oa{sa{sv}}} */
+ while (g_variant_iter_loop(iter, "{&oa{sa{sv}}}", &object_path, &interface_iter)) {
+ if (object_path == NULL)
+ continue;
- return;
- }
+ while (g_variant_iter_loop(interface_iter, "{sa{sv}}",
+ &interface_str, NULL)) {
+ if (g_strcmp0(interface_str, "org.bluez.Device1") == 0) {
+ BT_DBG("Found a device: %s", object_path);
+ g_free(interface_str);
- dbus_message_iter_next(&value_iter);
- }
+ device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+ NULL, BT_BLUEZ_NAME,
+ object_path, BT_DEVICE_INTERFACE, NULL, NULL);
- BT_DBG("There is no device interface");
+ if (device_proxy == NULL) {
+ BT_DBG("Device don't have this service");
+ break;
+ }
-not_paired:
- BT_DBG("Not paired");
- g_free(dev_info);
-}
+ result1 = g_dbus_proxy_call_sync(device_proxy, "IsConnectedProfile",
+ g_variant_new("(s)", profile_uuid),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (result1 == NULL) {
+ BT_ERR("Error occured in Proxy call");
+ if (error) {
+ BT_ERR("Error occured in Proxy call [%s]\n", error->message);
+ g_error_free(error);
+ error = NULL;
+ }
+ g_object_unref(device_proxy);
+ break;
+ }
+ g_variant_get(result1, "(b)", &is_connected);
-int _bt_get_bonded_devices(GArray **dev_list)
-{
- BT_DBG("+");
- DBusMessage *msg;
- DBusMessage *reply;
- DBusMessageIter reply_iter;
- DBusMessageIter value_iter;
- DBusError err;
- DBusConnection *conn;
-
- conn = _bt_get_system_conn();
- retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+ if (is_connected == TRUE) {
+ char address[BT_ADDRESS_STRING_SIZE];
+ bluetooth_device_address_t *addr = NULL;
- msg = dbus_message_new_method_call(BT_BLUEZ_NAME, BT_MANAGER_PATH,
- BT_MANAGER_INTERFACE,
- "GetManagedObjects");
+ _bt_convert_device_path_to_address(object_path, address);
- retv_if(msg == NULL, BLUETOOTH_ERROR_INTERNAL);
+ addr = g_malloc0(sizeof(bluetooth_device_address_t));
+ _bt_convert_addr_string_to_type(addr->addr, address);
- /* Synchronous call */
- dbus_error_init(&err);
- reply = dbus_connection_send_with_reply_and_block(
- conn, msg,
- -1, &err);
- dbus_message_unref(msg);
+ g_array_append_vals(*addr_list, addr,
+ sizeof(bluetooth_device_address_t));
+ }
- if (!reply) {
- BT_ERR("Can't get managed objects");
+ g_variant_unref(result1);
+ g_object_unref(device_proxy);
- if (dbus_error_is_set(&err)) {
- BT_ERR("%s", err.message);
- dbus_error_free(&err);
+ break;
+ }
}
- return BLUETOOTH_ERROR_INTERNAL;
}
- if (dbus_message_iter_init(reply, &reply_iter) == FALSE) {
- BT_ERR("Fail to iterate the reply");
- dbus_message_unref(reply);
- return BLUETOOTH_ERROR_INTERNAL;
- }
-
- dbus_message_iter_recurse(&reply_iter, &value_iter);
-
- /* signature of GetManagedObjects: a{oa{sa{sv}}} */
- while (dbus_message_iter_get_arg_type(&value_iter) ==
- DBUS_TYPE_DICT_ENTRY) {
- DBusMessageIter msg_iter;
-
- dbus_message_iter_recurse(&value_iter, &msg_iter);
+ g_variant_unref(result);
+ g_variant_iter_free(iter);
- __bt_extract_device_info(&msg_iter, dev_list);
-
- dbus_message_iter_next(&value_iter);
- }
- dbus_message_unref(reply);
BT_DBG("-");
return BLUETOOTH_ERROR_NONE;
}
bluetooth_device_info_t *dev_info)
{
char *object_path = NULL;
- DBusGProxy *adapter_proxy;
+ GDBusProxy *adapter_proxy;
char address[BT_ADDRESS_STRING_SIZE] = { 0 };
int ret = BLUETOOTH_ERROR_NONE;
return ret;
}
+int _bt_is_alias_set(bluetooth_device_address_t *device_address, gboolean *is_alias_set)
+{
+ char *object_path = NULL;
+ char address[BT_ADDRESS_STRING_SIZE] = { 0 };
+ gboolean alias_set = FALSE;
+
+ GDBusConnection *conn;
+ GDBusProxy *device_proxy;
+ GError *error = NULL;
+ GVariant *result = NULL;
+ GVariant *temp = NULL;
+
+
+ BT_CHECK_PARAMETER(device_address, return);
+ BT_CHECK_PARAMETER(is_alias_set, return);
+
+ _bt_convert_addr_type_to_string(address, device_address->addr);
+
+ object_path = _bt_get_device_object_path(address);
+ retv_if(object_path == NULL, BLUETOOTH_ERROR_NOT_PAIRED);
+
+ conn = _bt_gdbus_get_system_gconn();
+ if (conn == NULL) {
+ g_free(object_path);
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
+
+ device_proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ BT_BLUEZ_NAME,
+ object_path,
+ BT_PROPERTIES_INTERFACE,
+ NULL, NULL);
+ if (device_proxy == NULL) {
+ g_free(object_path);
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
+
+ result = g_dbus_proxy_call_sync(device_proxy, "Get",
+ g_variant_new("(ss)", BT_DEVICE_INTERFACE, "IsAliasSet"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ BT_ERR("Error occured in Proxy call");
+ if (error != NULL) {
+ BT_ERR("Getting is_alias_set property failed: [%s]\n", error->message);
+ g_error_free(error);
+ }
+ g_object_unref(device_proxy);
+ g_free(object_path);
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
+
+ g_variant_get(result, "(v)", &temp);
+ alias_set = g_variant_get_boolean(temp);
+ *is_alias_set = alias_set;
+ BT_DBG("address: [%s] | *is_alias_set: %s", address, *is_alias_set ? "TRUE" : "FALSE");
+ g_variant_unref(temp);
+ g_variant_unref(result);
+ g_object_unref(device_proxy);
+
+ g_free(object_path);
+
+ return BLUETOOTH_ERROR_NONE;
+}
+
int _bt_get_timeout_value(int *timeout)
{
time_t current_time;
int _bt_set_le_privacy(gboolean set_privacy)
{
- DBusGProxy *proxy;
+ GDBusProxy *proxy;
GError *error = NULL;
- int ret = BLUETOOTH_ERROR_NONE;
+ GVariant *result = NULL;
if (__bt_is_factory_test_mode()) {
BT_ERR("Unable to set le privacy in factory binary !!");
proxy = _bt_get_adapter_proxy();
retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
- dbus_g_proxy_call(proxy, "SetLePrivacy", &error,
- G_TYPE_BOOLEAN, set_privacy,
- G_TYPE_INVALID, G_TYPE_INVALID);
-
- if (error) {
- BT_ERR("SetLePrivacy Failed :[%s]", error->message);
- if (g_strrstr(error->message, BT_SERVICE_ERR_MSG_NOT_SUPPORTED))
- ret = BLUETOOTH_ERROR_NOT_SUPPORT;
- else
- ret = BLUETOOTH_ERROR_INTERNAL;
- g_error_free(error);
- return ret;
+ result = g_dbus_proxy_call_sync(proxy,
+ "SetLePrivacy",
+ g_variant_new("(b)", set_privacy),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to SetLePrivacy (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Failed to SetLePrivacy");
+ return BLUETOOTH_ERROR_INTERNAL;
}
+ g_variant_unref(result);
BT_INFO("SetLePrivacy as %d", set_privacy);
+ return BLUETOOTH_ERROR_NONE;
+}
+int _bt_set_le_static_random_address(gboolean is_enable)
+{
+ GDBusProxy *proxy;
+ GError *error = NULL;
+ GVariant *result = NULL;
+
+ if (__bt_is_factory_test_mode()) {
+ BT_ERR("Unable to set le random address in factory binary !!");
+ return BLUETOOTH_ERROR_NOT_SUPPORT;
+ }
+
+ if (_bt_adapter_get_status() != BT_ACTIVATED &&
+ _bt_adapter_get_le_status() != BT_LE_ACTIVATED) {
+ return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
+ }
+
+ proxy = _bt_get_adapter_proxy();
+ retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+ result = g_dbus_proxy_call_sync(proxy,
+ "SetLeStaticRandomAddress",
+ g_variant_new("(b)", is_enable),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to SetLeStaticRandomAddress (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else
+ BT_ERR("Failed to SetLeStaticRandomAddress");
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
+
+ g_variant_unref(result);
+ BT_INFO("SetLeStaticRandomAddress as %d", is_enable);
return BLUETOOTH_ERROR_NONE;
}
int _bt_set_manufacturer_data(bluetooth_manufacturer_data_t *m_data)
{
- DBusGProxy *proxy;
+ GDBusProxy *proxy;
GError *error = NULL;
- GArray *arr;
int i;
+ GVariant *val;
+ GVariant *result;
+ GVariantBuilder *builder;
BT_CHECK_PARAMETER(m_data, return);
proxy = _bt_get_adapter_proxy();
retv_if(proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
- arr = g_array_new(TRUE, TRUE, sizeof(guint8));
+ builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
for (i = 0; i < (m_data->data_len) + 2; i++)
- g_array_append_vals(arr, &(m_data->data[i]), sizeof(guint8));
-
- dbus_g_proxy_call(proxy, "SetManufacturerData", &error,
- DBUS_TYPE_G_UCHAR_ARRAY, arr,
- G_TYPE_INVALID, G_TYPE_INVALID);
-
- g_array_free(arr, TRUE);
-
- if (error) {
- BT_ERR("SetManufacturerData Fail: %s", error->message);
- g_error_free(error);
+ g_variant_builder_add(builder, "y", m_data->data[i]);
+
+ val = g_variant_new("(ay)", builder);
+
+ result = g_dbus_proxy_call_sync(proxy,
+ "SetManufacturerData",
+ val,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ g_variant_builder_unref(builder);
+ if (!result) {
+ if (error != NULL) {
+ BT_ERR("Failed to SetManufacturerData (Error: %s)", error->message);
+ g_clear_error(&error);
+ } else {
+ BT_ERR("Failed to SetManufacturerData");
+ }
return BLUETOOTH_ERROR_INTERNAL;
}
+ builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+
+ for (i = 0; i < (m_data->data_len) + 2; i++)
+ g_variant_builder_add(builder, "y", m_data->data[i]);
+
+ val = g_variant_new("(ay)", builder);
_bt_send_event(BT_ADAPTER_EVENT,
BLUETOOTH_EVENT_MANUFACTURER_DATA_CHANGED,
- DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
- &m_data, m_data->data_len,
- DBUS_TYPE_INVALID);
+ val);
BT_INFO("Set manufacturer data");
+ g_variant_builder_unref(builder);
+ g_variant_unref(result);
+
+ return BLUETOOTH_ERROR_NONE;
+}
+
+
+int _bt_service_set_alarm(int timeout, bt_set_alarm_cb call_back, void *user_data, alarm_id_t *alarm_id)
+{
+ int result = BLUETOOTH_ERROR_NONE;
+ bt_service_alarm_t *alarm = NULL;
+
+ if (!call_back || !alarm_id)
+ return BLUETOOTH_ERROR_INVALID_PARAM;
+
+ if (!alarm_mgr.is_alarm_initialized) {
+ result = alarmmgr_init("bt-service");
+ if (result != 0) {
+ BT_ERR("Failed to initialize alarm = %d", result);
+ result = BLUETOOTH_ERROR_INTERNAL;
+ goto finish;
+ }
+ result = alarmmgr_set_cb(alarm_cb, NULL);
+ if (result != 0) {
+ BT_ERR("Failed to set the callback = %d", result);
+ result = BLUETOOTH_ERROR_INTERNAL;
+ goto finish;
+ }
+ alarm_mgr.is_alarm_initialized = TRUE;
+ }
+
+ alarm = g_malloc0(sizeof(bt_service_alarm_t));
+ if (!alarm)
+ return BLUETOOTH_ERROR_MEMORY_ALLOCATION;
+
+ result = alarmmgr_add_alarm(ALARM_TYPE_VOLATILE, timeout,
+ 0, NULL, alarm_id);
+ if (result != 0) {
+ BT_ERR("Failed to create alarm error = %d", result);
+ result = BLUETOOTH_ERROR_INTERNAL;
+ g_free(alarm);
+ goto finish;
+ }
+ alarm->alarm_id = *alarm_id;
+ alarm->callback = call_back;
+ alarm->user_data = user_data;
+
+ alarm_mgr.g_alarm_list = g_list_append(alarm_mgr.g_alarm_list, alarm);
+ result = BLUETOOTH_ERROR_NONE;
+finish:
+ return result;
+}
+
+static int alarm_cb(alarm_id_t alarm_id, void* user_param)
+{
+ GList *node = NULL;
+ bt_service_alarm_t *p_data;
+ bt_set_alarm_cb callback = NULL;
+ void *user_data = NULL;
+
+ node = g_list_find_custom(alarm_mgr.g_alarm_list,
+ GINT_TO_POINTER(alarm_id), compare_alarm);
+ if (!node)
+ return 0;
+
+ p_data = (bt_service_alarm_t *)node->data;
+ alarm_mgr.g_alarm_list = g_list_delete_link(alarm_mgr.g_alarm_list,
+ node);
+
+ if (!p_data)
+ return 0;
+
+ callback = p_data->callback;
+ user_data = p_data->user_data;
+ g_free(p_data);
+
+ if (callback)
+ callback(alarm_id, user_data);
+
+ return 0;
+}
+
+int _bt_service_remove_alarm(alarm_id_t alarm_id)
+{
+ GList *list = NULL;
+ bt_service_alarm_t *p_data;
+ list = g_list_find_custom(alarm_mgr.g_alarm_list, GINT_TO_POINTER(alarm_id), compare_alarm);
+
+ if (list != NULL) {
+ alarmmgr_remove_alarm(alarm_id);
+ p_data = (bt_service_alarm_t *)list->data;
+ alarm_mgr.g_alarm_list = g_list_remove(alarm_mgr.g_alarm_list, list->data);
+ g_free(p_data);
+ }
+
+ return 0;
+}
+
+gint compare_alarm(gconstpointer list_data, gconstpointer data)
+{
+ alarm_id_t alarm_id = (alarm_id_t)data;
+ bt_service_alarm_t *p_data = (bt_service_alarm_t *)list_data;
+
+ if (p_data->alarm_id == alarm_id)
+ return 0;
+
+ return 1;
+}
+
+static void alarm_data_free(void *data)
+{
+ bt_service_alarm_t *p_data = (bt_service_alarm_t *)data;
+ g_free(p_data);
+ return;
+}
+
+static gboolean _bt_adapter_request_delayed_cb(gpointer user_data)
+{
+ int result;
+ int function = (int)user_data;
+
+ switch (function) {
+ case BT_ENABLE_ADAPTER:
+ result = _bt_enable_adapter();
+ if (result != BLUETOOTH_ERROR_NONE) {
+ BT_ERR("_bt_enable_adapter is failed");
+ /* Send enabled event to API */
+ _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_ENABLED,
+ g_variant_new("(i)", result));
+ }
+ break;
+ case BT_DISABLE_ADAPTER:
+ result = _bt_disable_adapter();
+ if (result != BLUETOOTH_ERROR_NONE) {
+ BT_ERR("_bt_disable_adapter is failed");
+ /* Send disabled event to API */
+ _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_DISABLED,
+ g_variant_new("(i)", result));
+ }
+ break;
+ default:
+ BT_ERR("function is NOT matched");
+ break;
+ }
+
+ return FALSE;
+}
+
+int _bt_adapter_request_delayed(int function)
+{
+ int ret;
+
+ switch (function) {
+ case BT_ENABLE_ADAPTER:
+ ret = _bt_enable_adapter_check_status();
+ if (ret == BLUETOOTH_ERROR_NONE)
+ _bt_adapter_set_status(BT_ACTIVATING);
+ else
+ return ret;
+
+ break;
+ case BT_DISABLE_ADAPTER:
+ ret = _bt_disable_adapter_check_status();
+ if (ret == BLUETOOTH_ERROR_NONE)
+ _bt_adapter_set_status(BT_DEACTIVATING);
+ else
+ return ret;
+
+ break;
+ default:
+ BT_ERR("function is NOT matched");
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
+
+ g_idle_add((GSourceFunc)_bt_adapter_request_delayed_cb, (void*)function);
+
return BLUETOOTH_ERROR_NONE;
}
+
+
+int _bt_get_enable_timer_id(void)
+{
+ return timer_id;
+}
+