summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2005-11-01 16:41:24 +0000
committerMarcel Holtmann <marcel@holtmann.org>2005-11-01 16:41:24 +0000
commit0443fc32d957c04964d6b875fbb203980b57775a (patch)
tree9ae164139cab2b1dc3cf5b8643be956e6f4a6a1d
parentf1ba02d0f86e0e954ac7a27d4beee3a6ee386223 (diff)
Implement the interface redesign
-rw-r--r--hcid/dbus.c731
-rw-r--r--hcid/dbus.h94
-rw-r--r--hcid/hcid.h5
-rw-r--r--hcid/main.c10
4 files changed, 319 insertions, 521 deletions
diff --git a/hcid/dbus.c b/hcid/dbus.c
index 399856ff..b9838b0a 100644
--- a/hcid/dbus.c
+++ b/hcid/dbus.c
@@ -45,15 +45,16 @@
#include "dbus.h"
static DBusConnection *connection;
+static int default_dev = -1;
static int up_adapters = 0;
-#define TIMEOUT (30 * 1000) /* 30 seconds */
-#define BLUETOOTH_DEVICE_NAME_LEN (18)
-#define BLUETOOTH_DEVICE_ADDR_LEN (18)
-#define MAX_PATH_LENGTH (64)
-#define READ_REMOTE_NAME_TIMEOUT (25000)
-#define MAX_CONN_NUMBER (10)
-#define DEVICE_FLAG_NAME (16)
+#define TIMEOUT (30 * 1000) /* 30 seconds */
+#define BLUETOOTH_DEVICE_NAME_LEN 18
+#define BLUETOOTH_DEVICE_ADDR_LEN 18
+#define MAX_PATH_LENGTH 64
+#define READ_REMOTE_NAME_TIMEOUT 25000
+#define MAX_CONN_NUMBER 10
+#define DEVICE_FLAG_NAME 16
#define PINAGENT_SERVICE_NAME BASE_INTERFACE ".PinAgent"
#define PINAGENT_INTERFACE PINAGENT_SERVICE_NAME
@@ -77,13 +78,13 @@ struct hci_dbus_data {
uint16_t id;
};
-typedef int register_function_t(DBusConnection *conn, int dft_reg, uint16_t id);
-typedef int unregister_function_t(DBusConnection *conn, int unreg_dft, uint16_t id);
+typedef int register_function_t(DBusConnection *conn, uint16_t id);
+typedef int unregister_function_t(DBusConnection *conn, uint16_t id);
const struct service_data *get_hci_table(void);
-static int hci_dbus_reg_obj_path(DBusConnection *conn, int dft_reg, uint16_t id);
-static int hci_dbus_unreg_obj_path(DBusConnection *conn, int unreg_dft, uint16_t id);
+static int hci_dbus_reg_obj_path(DBusConnection *conn, uint16_t id);
+static int hci_dbus_unreg_obj_path(DBusConnection *conn, uint16_t id);
typedef const struct service_data *get_svc_table_func_t(void);
@@ -257,8 +258,8 @@ static struct profile_obj_path_data obj_path_table[] = {
static DBusHandlerResult msg_func_device(DBusConnection *conn, DBusMessage *msg, void *data);
static DBusHandlerResult msg_func_manager(DBusConnection *conn, DBusMessage *msg, void *data);
-static DBusMessage* handle_get_devices_req_device(DBusMessage *msg, void *data);
-static DBusMessage* handle_get_devices_req_manager(DBusMessage *msg, void *data);
+static DBusMessage* handle_device_list_req(DBusMessage *msg, void *data);
+static DBusMessage* handle_default_device_req(DBusMessage *msg, void *data);
static DBusMessage* handle_not_implemented_req(DBusMessage *msg, void *data);
static const DBusObjectPathVTable obj_dev_vtable = {
@@ -271,16 +272,7 @@ static const DBusObjectPathVTable obj_mgr_vtable = {
.unregister_function = NULL
};
-/*
- * Service provided under the path DEVICE_PATH
- * TODO add the handlers
- */
-static const struct service_data dev_root_services[] = {
- { DEV_GET_DEV, handle_get_devices_req_device, DEV_GET_DEV_SIGNATURE },
- { NULL, NULL, NULL}
-};
-
-static const struct service_data dev_services[] = {
+static const struct service_data device_services[] = {
{ DEV_UP, handle_not_implemented_req, DEV_UP_SIGNATURE },
{ DEV_DOWN, handle_not_implemented_req, DEV_DOWN_SIGNATURE },
{ DEV_RESET, handle_not_implemented_req, DEV_RESET_SIGNATURE },
@@ -293,11 +285,12 @@ static const struct service_data dev_services[] = {
* Manager Message handler functions object table declaration
*
*/
-static const struct service_data mgr_services[] = {
- { MGR_GET_DEV, handle_get_devices_req_manager, MGR_GET_DEV_SIGNATURE },
- { MGR_INIT, handle_not_implemented_req, NULL },
- { MGR_ENABLE, handle_not_implemented_req, NULL },
- { MGR_DISABLE, handle_not_implemented_req, NULL },
+static const struct service_data manager_services[] = {
+ { MGR_DEVICE_LIST, handle_device_list_req, MGR_GET_DEV_SIGNATURE },
+ { MGR_DEFAULT_DEVICE, handle_default_device_req, MGR_DEFAULT_DEV_SIGNATURE },
+ { MGR_INIT, handle_not_implemented_req, NULL },
+ { MGR_ENABLE, handle_not_implemented_req, NULL },
+ { MGR_DISABLE, handle_not_implemented_req, NULL },
{ NULL, NULL, NULL }
};
@@ -316,7 +309,7 @@ static DBusMessage* handle_remote_name_req(DBusMessage *msg, void *data);
static DBusMessage* handle_display_conn_req(DBusMessage *msg, void *data);
static DBusMessage* handle_auth_req(DBusMessage *msg, void *data);
-static const struct service_data hci_services[] = {
+static const struct service_data device_hci_services[] = {
{ HCI_PERIODIC_INQ, handle_periodic_inq_req, HCI_PERIODIC_INQ_SIGNATURE },
{ HCI_CANCEL_PERIODIC_INQ, handle_cancel_periodic_inq_req, HCI_CANCEL_PERIODIC_INQ_SIGNATURE },
{ HCI_ROLE_SWITCH, handle_role_switch_req, HCI_ROLE_SWITCH_SIGNATURE },
@@ -384,7 +377,7 @@ static void free_pin_req(void *req)
free(req);
}
-static gboolean register_dbus_path(char *path, uint16_t id, const DBusObjectPathVTable *pvtable)
+static gboolean register_dbus_path(const char *path, uint16_t id, const DBusObjectPathVTable *pvtable)
{
struct hci_dbus_data *data;
syslog(LOG_INFO,"Registering DBUS Path: %s", path);
@@ -403,7 +396,7 @@ static gboolean register_dbus_path(char *path, uint16_t id, const DBusObjectPath
return TRUE;
}
-static gboolean unregister_dbus_path(char *path)
+static gboolean unregister_dbus_path(const char *path)
{
void *data;
syslog(LOG_INFO,"Unregistering DBUS Path: %s", path);
@@ -477,10 +470,10 @@ void hcid_dbus_inquiry_start(bdaddr_t *local)
goto failed;
}
- snprintf(path, sizeof(path), "%s/hci%d/%s", MANAGER_PATH, id, BLUEZ_HCI);
+ snprintf(path, sizeof(path), "%s/hci%d/%s", DEVICE_PATH, id, BLUEZ_HCI);
- message = dbus_message_new_signal(path,
- BLUEZ_HCI_INTERFACE, BLUEZ_HCI_INQ_START);
+ message = dbus_message_new_signal(path, DEV_HCI_INTERFACE,
+ BLUEZ_HCI_INQ_START);
if (message == NULL) {
syslog(LOG_ERR, "Can't allocate D-BUS inquiry start message");
goto failed;
@@ -517,10 +510,10 @@ void hcid_dbus_inquiry_complete(bdaddr_t *local)
goto failed;
}
- snprintf(path, sizeof(path), "%s/hci%d/%s", MANAGER_PATH, id, BLUEZ_HCI);
+ snprintf(path, sizeof(path), "%s/hci%d/%s", DEVICE_PATH, id, BLUEZ_HCI);
- message = dbus_message_new_signal(path,
- BLUEZ_HCI_INTERFACE, BLUEZ_HCI_INQ_COMPLETE);
+ message = dbus_message_new_signal(path, DEV_HCI_INTERFACE,
+ BLUEZ_HCI_INQ_COMPLETE);
if (message == NULL) {
syslog(LOG_ERR, "Can't allocate D-BUS inquiry complete message");
goto failed;
@@ -560,10 +553,10 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, i
goto failed;
}
- snprintf(path, sizeof(path), "%s/hci%d/%s", MANAGER_PATH, id, BLUEZ_HCI);
+ snprintf(path, sizeof(path), "%s/hci%d/%s", DEVICE_PATH, id, BLUEZ_HCI);
- message = dbus_message_new_signal(path,
- BLUEZ_HCI_INTERFACE, BLUEZ_HCI_INQ_RESULT);
+ message = dbus_message_new_signal(path, DEV_HCI_INTERFACE,
+ BLUEZ_HCI_INQ_RESULT);
if (message == NULL) {
syslog(LOG_ERR, "Can't allocate D-BUS inquiry result message");
goto failed;
@@ -608,10 +601,10 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, char *name)
goto failed;
}
- snprintf(path, sizeof(path), "%s/hci%d/%s", MANAGER_PATH, id, BLUEZ_HCI);
+ snprintf(path, sizeof(path), "%s/hci%d/%s", DEVICE_PATH, id, BLUEZ_HCI);
- message = dbus_message_new_signal(path,
- BLUEZ_HCI_INTERFACE, BLUEZ_HCI_REMOTE_NAME);
+ message = dbus_message_new_signal(path, DEV_HCI_INTERFACE,
+ BLUEZ_HCI_REMOTE_NAME);
if (message == NULL) {
syslog(LOG_ERR, "Can't allocate D-BUS remote name message");
goto failed;
@@ -655,19 +648,19 @@ void hcid_dbus_remote_name_failed(bdaddr_t *local, bdaddr_t *peer, uint8_t statu
goto failed;
}
- snprintf(path, sizeof(path), "%s/hci%d/%s", MANAGER_PATH, id, BLUEZ_HCI);
+ snprintf(path, sizeof(path), "%s/hci%d/%s", DEVICE_PATH, id, BLUEZ_HCI);
- message = dbus_message_new_signal(path,
- BLUEZ_HCI_INTERFACE, BLUEZ_HCI_REMOTE_NAME_FAILED);
+ message = dbus_message_new_signal(path, DEV_HCI_INTERFACE,
+ BLUEZ_HCI_REMOTE_NAME_FAILED);
if (message == NULL) {
syslog(LOG_ERR, "Can't allocate D-BUS remote name message");
goto failed;
}
dbus_message_append_args(message,
- DBUS_TYPE_STRING, &peer_addr,
- DBUS_TYPE_BYTE, &status,
- DBUS_TYPE_INVALID);
+ DBUS_TYPE_STRING, &peer_addr,
+ DBUS_TYPE_BYTE, &status,
+ DBUS_TYPE_INVALID);
if (dbus_connection_send(connection, message, NULL) == FALSE) {
syslog(LOG_ERR, "Can't send D-BUS remote name message");
@@ -710,9 +703,10 @@ void hcid_dbus_auth_complete(bdaddr_t *local, bdaddr_t *peer, const uint8_t stat
goto failed;
}
- snprintf(path, sizeof(path), "%s/hci%d/%s", MANAGER_PATH, id, BLUEZ_HCI);
+ snprintf(path, sizeof(path), "%s/hci%d/%s", DEVICE_PATH, id, BLUEZ_HCI);
- message = dbus_message_new_signal(path, BLUEZ_HCI_INTERFACE, BLUEZ_HCI_AUTH_COMPLETE);
+ message = dbus_message_new_signal(path, DEV_HCI_INTERFACE,
+ BLUEZ_HCI_AUTH_COMPLETE);
if (message == NULL) {
syslog(LOG_ERR, "Can't allocate D-BUS remote name message");
goto failed;
@@ -810,6 +804,26 @@ static void watch_toggled(DBusWatch *watch, void *data)
remove_watch(watch, data);
}
+static gboolean unregister_device_path(const char *path)
+{
+ char **children = NULL;
+
+ if (dbus_connection_list_registered(connection, path, &children)) {
+ for (; *children; children++) {
+ char child_path[MAX_PATH_LENGTH];
+
+ snprintf(child_path, sizeof(child_path), "%s/%s", path, *children);
+
+ unregister_dbus_path(child_path);
+ }
+
+ if (*children)
+ dbus_free_string_array(children);
+ }
+
+ return unregister_dbus_path(path);
+}
+
gboolean hcid_dbus_init(void)
{
struct hci_dbus_data *data;
@@ -854,7 +868,7 @@ gboolean hcid_dbus_init(void)
data->id = MANAGER_PATH_ID;
- if (!dbus_connection_register_fallback(connection, MANAGER_PATH,
+ if (!dbus_connection_register_object_path(connection, MANAGER_PATH,
&obj_mgr_vtable, data)) {
syslog(LOG_ERR, "Can't register %s object", MANAGER_PATH);
return FALSE;
@@ -873,149 +887,137 @@ gboolean hcid_dbus_init(void)
void hcid_dbus_exit(void)
{
- char path[MAX_PATH_LENGTH];
- char fst_parent[] = MANAGER_PATH;
- char snd_parent[MAX_PATH_LENGTH];
- char **fst_level = NULL;
- char **snd_level = NULL;
- char *ptr1;
- char *ptr2;
- void *data = NULL;
+ char **children = NULL;
if (!connection)
return;
- if (dbus_connection_get_object_path_data(connection,
- DEVICE_PATH, &data)) {
- if (data) {
- free(data);
- data = NULL;
- }
- }
+ /* Unregister all paths in Device path hierarchy */
+ if (dbus_connection_list_registered(connection, DEVICE_PATH, &children)) {
+
+ for (; *children; children++) {
+ char dev_path[MAX_PATH_LENGTH];
- if (!dbus_connection_unregister_object_path(connection, DEVICE_PATH))
- syslog(LOG_ERR, "Can't unregister %s object", DEVICE_PATH);
+ snprintf(dev_path, sizeof(dev_path), "%s/%s", DEVICE_PATH, *children);
- if (dbus_connection_get_object_path_data(connection,
- MANAGER_PATH, &data)) {
- if (data) {
- free(data);
- data = NULL;
+ unregister_device_path(dev_path);
}
+
+ if (*children)
+ dbus_free_string_array(children);
}
- if (!dbus_connection_unregister_object_path(connection, MANAGER_PATH))
- syslog(LOG_ERR, "Can't unregister %s object", MANAGER_PATH);
+ unregister_dbus_path(DEVICE_PATH);
+ unregister_dbus_path(MANAGER_PATH);
- if (dbus_connection_list_registered(connection, fst_parent, &fst_level)) {
+}
- for (; *fst_level; fst_level++) {
- ptr1 = *fst_level;
- snprintf(snd_parent, sizeof(snd_parent), "%s/%s", fst_parent, ptr1);
+gboolean hcid_dbus_register_device(uint16_t id)
+{
+ char path[MAX_PATH_LENGTH];
+ char *pptr = path;
+ gboolean ret;
+ DBusMessage *message = NULL;
- if (dbus_connection_list_registered(connection, snd_parent, &snd_level)) {
+ snprintf(path, sizeof(path), "%s/hci%d", DEVICE_PATH, id);
- if (!(*snd_level)) {
- snprintf(path, sizeof(path), "%s/%s", MANAGER_PATH, ptr1);
+ message = dbus_message_new_signal(MANAGER_PATH, MANAGER_INTERFACE,
+ BLUEZ_MGR_DEV_ADDED);
- if (dbus_connection_get_object_path_data(connection,
- path, &data)) {
- if (data) {
- free(data);
- data = NULL;
- }
- }
+ if (message == NULL) {
+ syslog(LOG_ERR, "Can't allocate D-BUS remote name message");
+ goto out;
+ }
- if (!dbus_connection_unregister_object_path(connection, path))
- syslog(LOG_ERR, "Can't unregister %s object", path);
+ dbus_message_append_args(message,
+ DBUS_TYPE_STRING, &pptr,
+ DBUS_TYPE_INVALID);
- continue;
- }
+ if (!dbus_connection_send(connection, message, NULL)) {
+ syslog(LOG_ERR, "Can't send D-BUS added device message");
+ goto out;
+ }
- for (; *snd_level; snd_level++) {
- ptr2 = *snd_level;
- snprintf(path, sizeof(path), "%s/%s/%s", MANAGER_PATH, ptr1, ptr2);
+ dbus_connection_flush(connection);
- if (dbus_connection_get_object_path_data(connection,
- path, &data)) {
- if (data) {
- free(data);
- data = NULL;
- }
- }
+out:
+ if (message)
+ dbus_message_unref(message);
- if (!dbus_connection_unregister_object_path(connection, path))
- syslog(LOG_ERR, "Can't unregister %s object", path);
- }
+ ret = register_dbus_path(path, id, &obj_dev_vtable);
- if (*snd_level)
- dbus_free_string_array(snd_level);
- }
- }
+ if (ret && default_dev < 0)
+ default_dev = id;
- if (*fst_level)
- dbus_free_string_array(fst_level);
- }
+ return ret;
}
-gboolean hcid_dbus_register_device(uint16_t id)
+gboolean hcid_dbus_unregister_device(uint16_t id)
{
+ gboolean ret;
+ DBusMessage *message = NULL;
char path[MAX_PATH_LENGTH];
- char dev[BLUETOOTH_DEVICE_NAME_LEN];
- const char *pdev = dev;
+ char *pptr = path;
- snprintf(dev, sizeof(dev), HCI_DEVICE_NAME "%d", id);
- snprintf(path, sizeof(path), "%s/%s", DEVICE_PATH, pdev);
+ snprintf(path, sizeof(path), "%s/hci%d", DEVICE_PATH, id);
- /* register the default path*/
- return register_dbus_path(path, id, &obj_dev_vtable);
-}
+ message = dbus_message_new_signal(MANAGER_PATH, MANAGER_INTERFACE,
+ BLUEZ_MGR_DEV_REMOVED);
+ if (message == NULL) {
+ syslog(LOG_ERR, "Can't allocate D-BUS remote name message");
+ goto out;
+ }
-gboolean hcid_dbus_unregister_device(uint16_t id)
-{
- char dev[BLUETOOTH_DEVICE_NAME_LEN];
- char path[MAX_PATH_LENGTH];
- const char *pdev = dev;
+ dbus_message_append_args(message,
+ DBUS_TYPE_STRING, &pptr,
+ DBUS_TYPE_INVALID);
+
+ if (!dbus_connection_send(connection, message, NULL)) {
+ syslog(LOG_ERR, "Can't send D-BUS added device message");
+ goto out;
+ }
- snprintf(dev, sizeof(dev), HCI_DEVICE_NAME "%d", id);
- snprintf(path, sizeof(path), "%s/%s", DEVICE_PATH, pdev);
+ dbus_connection_flush(connection);
- return unregister_dbus_path(path);
+out:
+ if (message)
+ dbus_message_unref(message);
+
+ ret = unregister_device_path(path);
+
+ /* FIXME: If there are any devices left after this removal the default
+ * device should be changed to one of them */
+ if (ret && default_dev == id)
+ default_dev = -1;
+
+ return ret;
}
-gboolean hcid_dbus_register_manager(uint16_t id)
+gboolean hcid_dbus_dev_up(uint16_t id)
{
- char dev[BLUETOOTH_DEVICE_NAME_LEN];
+ char path[MAX_PATH_LENGTH];
struct profile_obj_path_data *ptr = obj_path_table;
DBusMessage *message = NULL;
- const char *pdev = dev;
- DBusMessageIter iter;
- int ret = -1;
if (!connection)
return FALSE;
for (; ptr->name; ptr++) {
- ret = ptr->reg_func(connection, ptr->dft_reg, id);
- ptr->dft_reg = 1;
+ if (ptr->reg_func(connection, id) < 0)
+ goto failed;
}
- if (!ret)
- up_adapters++;
+ up_adapters++;
+
+ snprintf(path, sizeof(path), "%s/hci%d", DEVICE_PATH, id);
- message = dbus_message_new_signal(BLUEZ_HCI_PATH,
- BLUEZ_HCI_INTERFACE, BLUEZ_HCI_DEV_ADDED);
+ message = dbus_message_new_signal(path, DEVICE_INTERFACE, DEV_UP);
if (message == NULL) {
syslog(LOG_ERR, "Can't allocate D-BUS remote name message");
goto failed;
}
- snprintf(dev, sizeof(dev), HCI_DEVICE_NAME "%d", id);
-
- dbus_message_iter_init_append(message, &iter);
- dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING ,&pdev);
-
if (dbus_connection_send(connection, message, NULL) == FALSE) {
syslog(LOG_ERR, "Can't send D-BUS added device message");
goto failed;
@@ -1032,40 +1034,30 @@ failed:
return TRUE;
}
-gboolean hcid_dbus_unregister_manager(uint16_t id)
+gboolean hcid_dbus_dev_down(uint16_t id)
{
- char dev[BLUETOOTH_DEVICE_NAME_LEN];
+ char path[MAX_PATH_LENGTH];
struct profile_obj_path_data *ptr = obj_path_table;
DBusMessage *message = NULL;
- const char *pdev = dev;
- DBusMessageIter iter;
- int dft_unreg = 0;
if (!connection)
return FALSE;
for (; ptr->name; ptr++) {
- dft_unreg = (up_adapters > 1) ? 0 : 1;
- up_adapters--;
- ptr->unreg_func(connection, dft_unreg, id);
-
- if (dft_unreg )
- ptr->dft_reg = 0;
+ if (ptr->unreg_func(connection, id) < 0)
+ goto failed;
}
- message = dbus_message_new_signal(BLUEZ_HCI_PATH,
- BLUEZ_HCI_INTERFACE, BLUEZ_HCI_DEV_REMOVED);
+ up_adapters--;
+
+ snprintf(path, sizeof(path), "%s/hci%d", DEVICE_PATH, id);
+ message = dbus_message_new_signal(path, DEVICE_INTERFACE, DEV_DOWN);
if (message == NULL) {
syslog(LOG_ERR, "Can't allocate D-BUS device removed message");
goto failed;
}
- snprintf(dev, sizeof(dev), HCI_DEVICE_NAME "%d", id);
-
- dbus_message_iter_init_append(message, &iter);
- dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING ,&pdev);
-
if (dbus_connection_send(connection, message, NULL) == FALSE) {
syslog(LOG_ERR, "Can't send D-BUS removed device message");
goto failed;
@@ -1087,23 +1079,17 @@ failed:
* Detailed description: function responsible for register a new hci
* D-Bus path. If necessary the default path must be registered too.
* @param conn D-Bus connection
- * @param dft_reg register the default path(0 or !0)
* @param id hci device identification
* @return (0-Success/-1 failure)
*/
-static int hci_dbus_reg_obj_path(DBusConnection *conn, int dft_reg, uint16_t id)
+static int hci_dbus_reg_obj_path(DBusConnection *conn, uint16_t id)
{
char path[MAX_PATH_LENGTH];
/* register the default path*/
- if (!dft_reg) {
- snprintf(path, sizeof(path), "%s/%s/%s", MANAGER_PATH, HCI_DEFAULT_DEVICE_NAME, BLUEZ_HCI);
- register_dbus_path(path, DEFAULT_DEVICE_PATH_ID, &obj_mgr_vtable);
- }
-
- /* register the default path*/
- snprintf(path, sizeof(path), "%s/%s%d/%s", MANAGER_PATH, HCI_DEVICE_NAME, id, BLUEZ_HCI);
- register_dbus_path(path, id, &obj_mgr_vtable);
+ snprintf(path, sizeof(path), "%s/hci%d/%s", DEVICE_PATH, id, BLUEZ_HCI);
+ if (!register_dbus_path(path, id, &obj_dev_vtable))
+ return -1;
return 0;
}
@@ -1118,25 +1104,20 @@ static int hci_dbus_reg_obj_path(DBusConnection *conn, int dft_reg, uint16_t id)
* @param id hci device identification
* @return (0-Success/-1 failure)
*/
-static int hci_dbus_unreg_obj_path(DBusConnection *conn, int unreg_dft, uint16_t id)
+static int hci_dbus_unreg_obj_path(DBusConnection *conn, uint16_t id)
{
- int ret = 0;
char path[MAX_PATH_LENGTH];
- if (unreg_dft) {
- snprintf(path, sizeof(path), "%s/%s/%s", MANAGER_PATH, HCI_DEFAULT_DEVICE_NAME, BLUEZ_HCI);
- unregister_dbus_path(path);
- }
+ snprintf(path, sizeof(path), "%s/hci%d/%s", DEVICE_PATH, id, BLUEZ_HCI);
+ if (!unregister_dbus_path(path))
+ return -1;
- snprintf(path, sizeof(path), "%s/%s%d/%s", MANAGER_PATH, HCI_DEVICE_NAME, id, BLUEZ_HCI);
- unregister_dbus_path(path);
-
- return ret;
+ return 0;
}
const struct service_data *get_hci_table(void)
{
- return hci_services;
+ return device_hci_services;
}
/*****************************************************************
@@ -1173,24 +1154,20 @@ static DBusHandlerResult hci_signal_filter (DBusConnection *conn, DBusMessage *m
return ret;
}
-/*
- * There is only one message handler function for all object paths
- *
- */
static DBusHandlerResult msg_func_device(DBusConnection *conn, DBusMessage *msg, void *data)
{
- const struct service_data *ptr_handlers = NULL;
+ const struct service_data *handlers = NULL;
DBusMessage *reply = NULL;
+ struct hci_dbus_data *dbus_data = data;
int type;
+ const char *child;
const char *iface;
const char *method;
const char *signature;
const char *path;
- struct hci_dbus_data *dbus_data = data;
- uint32_t result = BLUEZ_EDBUS_UNKNOWN_METHOD;
+ uint32_t error = BLUEZ_EDBUS_UNKNOWN_METHOD;
DBusHandlerResult ret = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- uint8_t found = 0;
path = dbus_message_get_path(msg);
type = dbus_message_get_type(msg);
@@ -1198,50 +1175,48 @@ static DBusHandlerResult msg_func_device(DBusConnection *conn, DBusMessage *msg,
method = dbus_message_get_member(msg);
signature = dbus_message_get_signature(msg);
- if (strcmp(iface, DEVICE_INTERFACE))
+ syslog(LOG_INFO, "%s - path:%s, id:%04X", __PRETTY_FUNCTION__, path, dbus_data->id);
+
+ if (dbus_data->id == DEVICE_PATH_ID)
return ret;
- if (strcmp(path, DEVICE_PATH) > 0) {
- if (dbus_data->id == DEVICE_PATH_ID) {
- /* fallback handling. The child path IS NOT registered */
- reply = bluez_new_failure_msg(msg, BLUEZ_EDBUS_UNKNOWN_PATH);
- ret = DBUS_HANDLER_RESULT_HANDLED;
- } else {
- /* hciX code */
+ if (strcmp(path, DEVICE_PATH) == 0)
+ handlers = device_services;
+ else {
+ child = strrchr(path,'/');
+ if (child && *child) {
+ struct profile_obj_path_data *profile;
+ child++;
+
+ for (profile = obj_path_table ;profile->name != NULL; profile++) {
+ if (strcmp(profile->name, child) == 0) {
+ handlers = profile->get_svc_table();
+ break;
+ }
+ }
+
}
- } else {
- /* it's the device path */
- ptr_handlers = dev_root_services;
- found = 1;
}
- if (found && (type == DBUS_MESSAGE_TYPE_METHOD_CALL) && (method != NULL)) {
-
- for (; ptr_handlers->name; ptr_handlers++) {
- if (strcmp(method, ptr_handlers->name) == 0) {
- /* resetting unknown method. It's possible handle method overload */
- result = BLUEZ_EDBUS_WRONG_SIGNATURE;
- if (strcmp(ptr_handlers->signature, signature) == 0) {
- if (ptr_handlers->handler_func) {
- reply = (ptr_handlers->handler_func) (msg, data);
- result = 0; /* resetting wrong signature*/
- } else
- syslog(LOG_INFO, "Service not implemented");
-
- break;
+ if (handlers) {
+ for (; handlers->name != NULL; handlers++) {
+ if (strcmp(handlers->name, method) == 0) {
+ if (strcmp(handlers->signature, signature) != 0)
+ error = BLUEZ_EDBUS_WRONG_SIGNATURE;
+ else {
+ reply = handlers->handler_func(msg, data);
+ error = 0;
}
-
+
+ ret = DBUS_HANDLER_RESULT_HANDLED;
}
}
+ }
- if (result) {
- reply = bluez_new_failure_msg(msg, result);
- }
+ if (error)
+ reply = bluez_new_failure_msg(msg, error);
- ret = DBUS_HANDLER_RESULT_HANDLED;
- }
- /* send an error or the success reply*/
if (reply) {
if (!dbus_connection_send (conn, reply, NULL)) {
syslog(LOG_ERR, "Can't send reply message!");
@@ -1254,88 +1229,45 @@ static DBusHandlerResult msg_func_device(DBusConnection *conn, DBusMessage *msg,
static DBusHandlerResult msg_func_manager(DBusConnection *conn, DBusMessage *msg, void *data)
{
- const struct service_data *ptr_handlers = NULL;
+ const struct service_data *handlers;
DBusMessage *reply = NULL;
- int type;
const char *iface;
const char *method;
const char *signature;
const char *path;
- const char *rel_path;
- struct hci_dbus_data *dbus_data = data;
- uint32_t result = BLUEZ_EDBUS_UNKNOWN_METHOD;
+ uint32_t error = BLUEZ_EDBUS_UNKNOWN_METHOD;
DBusHandlerResult ret = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- uint8_t found = 0;
path = dbus_message_get_path(msg);
- type = dbus_message_get_type(msg);
iface = dbus_message_get_interface(msg);
method = dbus_message_get_member (msg);
signature = dbus_message_get_signature(msg);
- syslog (LOG_INFO, "%s - path:%s, id:0x%X", __PRETTY_FUNCTION__, path, dbus_data->id);
+ syslog (LOG_INFO, "%s - path:%s", __PRETTY_FUNCTION__, path);
- if (strcmp(iface, MANAGER_INTERFACE))
+ if (strcmp(iface, MANAGER_INTERFACE) != 0)
return ret;
- if (strcmp(path, MANAGER_PATH) > 0) {
- /* it is device specific path */
- if (dbus_data->id == MANAGER_PATH_ID) {
- /* fallback handling. The child path IS NOT registered */
- reply = bluez_new_failure_msg(msg, BLUEZ_EDBUS_UNKNOWN_PATH);
- ret = DBUS_HANDLER_RESULT_HANDLED;
- } else {
- const struct profile_obj_path_data *mgr_child = obj_path_table;
- rel_path = strrchr(path,'/');
- rel_path++;
-
- if (rel_path) {
- for ( ;mgr_child->name; mgr_child++) {
- if (strcmp(mgr_child->name, rel_path) == 0) {
- ptr_handlers = mgr_child->get_svc_table();
- found = 1;
- break;
- }
- }
-
+ for (handlers = manager_services; handlers->name != NULL; handlers++) {
+ if (strcmp(handlers->name, method) == 0) {
+ if (strcmp(handlers->signature, signature) != 0)
+ error = BLUEZ_EDBUS_WRONG_SIGNATURE;
+ else {
+ reply = handlers->handler_func(msg, data);
+ error = 0;
}
- }
- } else {
- /* it's the manager! path */
- ptr_handlers = mgr_services;
- found = 1;
- }
-
- if (found && (type == DBUS_MESSAGE_TYPE_METHOD_CALL) && (method != NULL)) {
- for (; ptr_handlers->name; ptr_handlers++) {
- if (strcmp(method, ptr_handlers->name) == 0) {
- /* resetting unknown method. It's possible handle method overload */
- result = BLUEZ_EDBUS_WRONG_SIGNATURE;
- if (strcmp(ptr_handlers->signature, signature) == 0) {
- if (ptr_handlers->handler_func) {
- reply = (ptr_handlers->handler_func)(msg, data);
- result = 0; /* resetting wrong signature*/
- } else
- syslog(LOG_INFO, "Service not implemented");
-
- break;
- }
-
- }
+ ret = DBUS_HANDLER_RESULT_HANDLED;
}
+ }
- if (result) {
- reply = bluez_new_failure_msg(msg, result);
- }
+ if (error)
+ reply = bluez_new_failure_msg(msg, error);
- ret = DBUS_HANDLER_RESULT_HANDLED;
- }
- /* send an error or the success reply*/
if (reply) {
if (!dbus_connection_send (conn, reply, NULL)) {
- syslog(LOG_ERR, "Can't send reply message!") ;
+ syslog(LOG_ERR, "Can't send reply message!");
}
dbus_message_unref (reply);
}
@@ -1354,20 +1286,8 @@ static DBusMessage* handle_periodic_inq_req(DBusMessage *msg, void *data)
uint8_t max_period;
uint8_t min_period;
int dd = -1;
- int dev_id = -1;
-
- if (dbus_data->id == DEFAULT_DEVICE_PATH_ID) {
- dev_id = hci_get_route(NULL);
- if (dev_id < 0) {
- syslog(LOG_ERR, "Bluetooth device is not available");
- reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_ENODEV);
- goto failed;
-
- }
- } else
- dev_id = dbus_data->id;
- dd = hci_open_dev(dev_id);
+ dd = hci_open_dev(dbus_data->id);
if (dd < 0) {
syslog(LOG_ERR, "HCI device open failed");
reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_ENODEV);
@@ -1378,7 +1298,7 @@ static DBusMessage* handle_periodic_inq_req(DBusMessage *msg, void *data)
dbus_message_iter_get_basic(&iter, &length);
dbus_message_iter_next(&iter);
dbus_message_iter_get_basic(&iter, &min_period);
- dbus_message_iter_next(&iter);
+ dbus_message_iter_next(&iter);
dbus_message_iter_get_basic(&iter, &max_period);
if (length >= min_period || min_period >= max_period) {
@@ -1427,19 +1347,8 @@ static DBusMessage* handle_cancel_periodic_inq_req(DBusMessage *msg, void *data)
DBusMessage *reply = NULL;
struct hci_dbus_data *dbus_data = data;
int dd = -1;
- int dev_id = -1;
-
- if (dbus_data->id == DEFAULT_DEVICE_PATH_ID) {
- dev_id = hci_get_route(NULL);
- if (dev_id < 0) {
- syslog(LOG_ERR, "Bluetooth device is not available");
- reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_ENODEV);
- goto failed;
- }
- } else
- dev_id = dbus_data->id;
- dd = hci_open_dev(dev_id);
+ dd = hci_open_dev(dbus_data->id);
if (dd < 0) {
syslog(LOG_ERR, "HCI device open failed");
reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_ENODEV);
@@ -1469,19 +1378,10 @@ static DBusMessage* handle_inq_req(DBusMessage *msg, void *data)
evt_cmd_status rp;
struct hci_request rq;
struct hci_dbus_data *dbus_data = data;
- int dev_id = -1, dd = -1;
+ int dd = -1;
int8_t length;
int8_t num_rsp;
- if (dbus_data->id == DEFAULT_DEVICE_PATH_ID) {
- if ((dev_id = hci_get_route(NULL)) < 0) {
- syslog(LOG_ERR, "Bluetooth device is not available");
- reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_ENODEV);
- goto failed;
- }
- } else
- dev_id = dbus_data->id;
-
dbus_message_iter_init(msg, &iter);
dbus_message_iter_get_basic(&iter, &length);
dbus_message_iter_next(&iter);
@@ -1492,9 +1392,9 @@ static DBusMessage* handle_inq_req(DBusMessage *msg, void *data)
goto failed;
}
- dd = hci_open_dev(dev_id);
+ dd = hci_open_dev(dbus_data->id);
if (dd < 0) {
- syslog(LOG_ERR, "Unable to open device %d: %s", dev_id, strerror(errno));
+ syslog(LOG_ERR, "Unable to open device %d: %s", dbus_data->id, strerror(errno));
reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_OFFSET + errno);
goto failed;
}
@@ -1535,20 +1435,11 @@ static DBusMessage* handle_cancel_inq_req(DBusMessage *msg, void *data)
DBusMessage *reply = NULL;
struct hci_request rq;
struct hci_dbus_data *dbus_data = data;
- int dev_id = -1, dd = -1;
-
- if (dbus_data->id == DEFAULT_DEVICE_PATH_ID) {
- if ((dev_id = hci_get_route(NULL)) < 0) {
- syslog(LOG_ERR, "Bluetooth device is not available");
- reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_ENODEV);
- goto failed;
- }
- } else
- dev_id = dbus_data->id;
+ int dd = -1;
- dd = hci_open_dev(dev_id);
+ dd = hci_open_dev(dbus_data->id);
if (dd < 0) {
- syslog(LOG_ERR, "Unable to open device %d: %s", dev_id, strerror(errno));
+ syslog(LOG_ERR, "Unable to open device %d: %s", dbus_data->id, strerror(errno));
reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_OFFSET + errno);
goto failed;
}
@@ -1580,8 +1471,7 @@ static DBusMessage* handle_role_switch_req(DBusMessage *msg, void *data)
struct hci_dbus_data *dbus_data = data;
bdaddr_t bdaddr;
uint8_t role;
- int dev_id = -1;
- int dd = -1;
+ int dev_id = -1, dd = -1;
dbus_message_iter_init(msg, &iter);
dbus_message_iter_get_basic(&iter, &str_bdaddr);
@@ -1598,7 +1488,7 @@ static DBusMessage* handle_role_switch_req(DBusMessage *msg, void *data)
goto failed;
}
- if (dbus_data->id != DEFAULT_DEVICE_PATH_ID && dbus_data->id != dev_id) {
+ if (dbus_data->id != dev_id) {
syslog(LOG_ERR, "Connection not found\n");
reply = bluez_new_failure_msg(msg, BLUEZ_EDBUS_CONN_NOT_FOUND);
goto failed;
@@ -1631,7 +1521,6 @@ static DBusMessage* handle_remote_name_req(DBusMessage *msg, void *data)
DBusMessageIter iter;
DBusMessage *reply = NULL;
struct hci_dbus_data *dbus_data = data;
- int dev_id = -1;
int dd = -1;
const char *str_bdaddr;
bdaddr_t bdaddr;
@@ -1644,19 +1533,9 @@ static DBusMessage* handle_remote_name_req(DBusMessage *msg, void *data)
str2ba(str_bdaddr, &bdaddr);
- if (dbus_data->id == DEFAULT_DEVICE_PATH_ID) {
- dev_id = hci_get_route(&bdaddr);
- if (dev_id < 0) {
- syslog(LOG_ERR, "Bluetooth device is not available");
- reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_ENODEV);
- goto failed;
- }
- } else
- dev_id = dbus_data->id;
-
- dd = hci_open_dev(dev_id);
+ dd = hci_open_dev(dbus_data->id);
if (dd < 0) {
- syslog(LOG_ERR, "Unable to open device %d: %s", dev_id, strerror(errno));
+ syslog(LOG_ERR, "Unable to open device %d: %s", dbus_data->id, strerror(errno));
reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_OFFSET + errno);
goto failed;
}
@@ -1701,21 +1580,9 @@ static DBusMessage* handle_display_conn_req(DBusMessage *msg, void *data)
const char array_sig[] = HCI_CONN_INFO_STRUCT_SIGNATURE;
const char *paddr = addr;
struct hci_dbus_data *dbus_data = data;
- int dev_id = -1;
int sk = -1;
int i;
- if (dbus_data->id == DEFAULT_DEVICE_PATH_ID) {
- dev_id = hci_get_route(NULL);
- if (dev_id < 0) {
- syslog(LOG_ERR, "Bluetooth device is not available");
- reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_ENODEV);
- goto failed;
- }
- } else {
- dev_id = dbus_data->id;
- }
-
sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
if (sk < 0) {
reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_OFFSET + errno);
@@ -1728,7 +1595,7 @@ static DBusMessage* handle_display_conn_req(DBusMessage *msg, void *data)
goto failed;
}
- cl->dev_id = dev_id;
+ cl->dev_id = dbus_data->id;
cl->conn_num = MAX_CONN_NUMBER;
ci = cl->conn_info;
@@ -1791,7 +1658,7 @@ static DBusMessage* handle_auth_req(DBusMessage *msg, void *data)
goto failed;
}
- if (dbus_data->id != DEFAULT_DEVICE_PATH_ID && dbus_data->id != dev_id) {
+ if (dbus_data->id != dev_id) {
reply = bluez_new_failure_msg(msg, BLUEZ_EDBUS_CONN_NOT_FOUND);
goto failed;
}
@@ -1849,27 +1716,16 @@ failed:
* Section reserved to Manager D-Bus message handlers
*
*****************************************************************/
-static DBusMessage* handle_get_devices_req_device(DBusMessage *msg, void *data)
+static DBusMessage* handle_device_list_req(DBusMessage *msg, void *data)
{
DBusMessageIter iter;
DBusMessageIter array_iter;
- DBusMessageIter flag_array_iter;
- DBusMessageIter struct_iter;
DBusMessage *reply = NULL;
struct hci_dev_list_req *dl = NULL;
struct hci_dev_req *dr = NULL;
- struct hci_dev_info di;
int sk = -1;
int i;
- char aname[BLUETOOTH_DEVICE_NAME_LEN+1];
- char aaddr[BLUETOOTH_DEVICE_ADDR_LEN];
- char aflag[DEVICE_FLAG_NAME];
- char *paddr = aaddr;
- char *pname = aname;
- char *pflag = aflag;
- char *ptype;
- const char array_sig[] = DEV_GET_DEV_REPLY_STRUCT_SIGNATURE;
- hci_map *mp;
+ const char array_sig[] = MGR_GET_DEV_REPLY_STRUCT_SIGNATURE;
/* Create and bind HCI socket */
sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
@@ -1901,6 +1757,16 @@ static DBusMessage* handle_get_devices_req_device(DBusMessage *msg, void *data)
dr = dl->dev_req;
for (i = 0; i < dl->dev_num; i++, dr++) {
+ char apath[MAX_PATH_LENGTH];
+ char aaddr[BLUETOOTH_DEVICE_ADDR_LEN];
+ char *paddr = aaddr;
+ char *ppath = apath;
+ char *ptype;
+ const char *flag;
+ DBusMessageIter flag_array_iter, struct_iter;
+ struct hci_dev_info di;
+ hci_map *mp;
+
mp = dev_flags_map;
memset(&di, 0 , sizeof(struct hci_dev_info));
di.dev_id = dr->dev_id;
@@ -1908,8 +1774,7 @@ static DBusMessage* handle_get_devices_req_device(DBusMessage *msg, void *data)
if (ioctl(sk, HCIGETDEVINFO, &di) < 0)
continue;
- strncpy(aname, di.name, BLUETOOTH_DEVICE_NAME_LEN);
- aname[BLUETOOTH_DEVICE_NAME_LEN] = '\0';
+ snprintf(apath, sizeof(apath), "%s/%s", DEVICE_PATH, di.name);
ba2str(&di.bdaddr, aaddr);
ptype = hci_dtypetostr(di.type);
@@ -1917,25 +1782,23 @@ static DBusMessage* handle_get_devices_req_device(DBusMessage *msg, void *data)
dbus_message_iter_open_container(&array_iter,
DBUS_TYPE_STRUCT, NULL, &struct_iter);
- dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &pname);
+ dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &ppath);
dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &paddr);
dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &ptype);
- if (hci_test_bit(HCI_UP, &dr->dev_opt)) {
- sprintf(pflag, "%s", "UP");
- } else {
- sprintf(pflag, "%s", "DOWN");
- }
- dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &pflag);
+ if (hci_test_bit(HCI_UP, &dr->dev_opt))
+ flag = "UP";
+ else
+ flag = "DOWN";
+
+ dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &flag);
dbus_message_iter_open_container(&struct_iter,
DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &flag_array_iter);
while (mp->str) {
- if (hci_test_bit(mp->val, &dr->dev_opt)) {
- sprintf(pflag, "%s", mp->str);
- dbus_message_iter_append_basic(&flag_array_iter, DBUS_TYPE_STRING, &pflag);
- }
+ if (hci_test_bit(mp->val, &dr->dev_opt))
+ dbus_message_iter_append_basic(&flag_array_iter, DBUS_TYPE_STRING, &mp->str);
mp++;
}
dbus_message_iter_close_container(&struct_iter, &flag_array_iter);
@@ -1952,86 +1815,28 @@ failed:
return reply;
}
-
-static DBusMessage* handle_get_devices_req_manager(DBusMessage *msg, void *data)
-{
- DBusMessageIter iter;
- DBusMessageIter array_iter;
- DBusMessageIter struct_iter;
+static DBusMessage* handle_default_device_req(DBusMessage *msg, void *data) {
+ char path[MAX_PATH_LENGTH];
+ char *pptr = path;
DBusMessage *reply = NULL;
- struct hci_dev_list_req *dl = NULL;
- struct hci_dev_req *dr = NULL;
- struct hci_dev_info di;
- int sk = -1;
- int i;
-
- char aname[BLUETOOTH_DEVICE_NAME_LEN];
- char aaddr[BLUETOOTH_DEVICE_ADDR_LEN];
- char *paddr = aaddr;
- char *pname = aname;
- const char array_sig[] = HCI_DEVICE_STRUCT_SIGNATURE;
-
- /* Create and bind HCI socket */
- sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
- if (sk < 0) {
- syslog(LOG_ERR, "Can't open HCI socket: %s (%d)", strerror(errno), errno);
- reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_OFFSET + errno);
- goto failed;
- }
-
- dl = malloc(HCI_MAX_DEV * sizeof(*dr) + sizeof(*dl));
- if (!dl) {
- syslog(LOG_ERR, "Can't allocate memory");
- reply = bluez_new_failure_msg(msg, BLUEZ_EDBUS_NO_MEM);
- goto failed;
- }
-
- dl->dev_num = HCI_MAX_DEV;
- dr = dl->dev_req;
-
- if (ioctl(sk, HCIGETDEVLIST, dl) < 0) {
- reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_OFFSET + errno);
- goto failed;
+ if (default_dev < 0) {
+ reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_ENODEV);
+ goto out;
}
- /* active bluetooth adapter found */
reply = dbus_message_new_method_return(msg);
- dbus_message_iter_init_append(reply, &iter);
- dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, array_sig, &array_iter);
- dr = dl->dev_req;
-
- for (i = 0; i < dl->dev_num; i++, dr++) {
- if (!hci_test_bit(HCI_UP, &dr->dev_opt))
- continue;
-
- memset(&di, 0 , sizeof(struct hci_dev_info));
- di.dev_id = dr->dev_id;
-
- if (ioctl(sk, HCIGETDEVINFO, &di) < 0)
- continue;
-
- strcpy(aname, di.name);
- ba2str(&di.bdaddr, aaddr);
-
- dbus_message_iter_open_container(&array_iter,
- DBUS_TYPE_STRUCT, NULL, &struct_iter);
-
- dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &pname);
- dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &paddr);
-
- dbus_message_iter_close_container(&array_iter, &struct_iter);
+ if (reply == NULL) {
+ syslog(LOG_ERR, "Out of memory while calling new_method_return");
+ goto out;
}
- dbus_message_iter_close_container(&iter, &array_iter);
-
-failed:
- if (sk >= 0)
- close(sk);
-
- if (dl)
- free(dl);
+ snprintf(path, sizeof(path), "%s/hci%d", DEVICE_PATH, default_dev);
+ dbus_message_append_args(reply,
+ DBUS_TYPE_STRING, &pptr,
+ DBUS_TYPE_INVALID);
+out:
return reply;
}
diff --git a/hcid/dbus.h b/hcid/dbus.h
index 4ac2f738..1ec747a1 100644
--- a/hcid/dbus.h
+++ b/hcid/dbus.h
@@ -34,27 +34,31 @@
#define ERROR_INTERFACE BASE_INTERFACE ".Error"
-#define DEFAULT_DEVICE_PATH_ID (0xFFFF)
-#define MANAGER_PATH_ID (0xFFFE)
-#define DEVICE_PATH_ID (0xFFFD)
-
-#define HCI_DEFAULT_DEVICE_NAME "default"
-#define HCI_DEVICE_NAME "hci"
+#define MANAGER_PATH_ID (0xFFFF)
+#define DEVICE_PATH_ID (0xFFFE)
/*========================================================================
- BlueZ D-Bus Device service definitions "/org/bluez/Device"
+ BlueZ D-Bus Manager service definitions "/org/bluez/Manager"
*========================================================================*/
-#define DEV_GET_DEV "DeviceList"
-#define DEV_UP "Up"
-#define DEV_DOWN "Down"
-#define DEV_RESET "Reset"
-#define DEV_SET_PROPERTY "SetProperty"
-#define DEV_GET_PROPERTY "GetProperty"
-#define DEV_GET_DEV_SIGNATURE __END_SIG__
+#define MGR_DEVICE_LIST "DeviceList"
+#define MGR_DEFAULT_DEVICE "DefaultDevice"
+#define MGR_INIT "Init"
+
+/* Enable/Disable services controller, pan, serial, ... */
+#define MGR_ENABLE "Enable"
+#define MGR_DISABLE "Disable"
+
+/* Signatures */
+
+#define MGR_GET_DEV_SIGNATURE __END_SIG__
/* DeviceList Reply: a(devname, addr, type, up/down, a(flags)) - all types strings */
-#define DEV_GET_DEV_REPLY_STRUCT_SIGNATURE DBUS_STRUCT_BEGIN_CHAR_AS_STRING \
+#define MGR_GET_DEV_REPLY_SIGNATURE DBUS_TYPE_ARRAY_AS_STRING \
+ DEV_GET_DEV_REPLY_STRUCT_SIGNATURE \
+ __END_SIG__
+
+#define MGR_GET_DEV_REPLY_STRUCT_SIGNATURE DBUS_STRUCT_BEGIN_CHAR_AS_STRING \
DBUS_TYPE_STRING_AS_STRING \
DBUS_TYPE_STRING_AS_STRING \
DBUS_TYPE_STRING_AS_STRING \
@@ -64,44 +68,23 @@
DBUS_STRUCT_END_CHAR_AS_STRING \
__END_SIG__
-#define DEV_GET_DEV_REPLY_SIGNATURE DBUS_TYPE_ARRAY_AS_STRING \
- DEV_GET_DEV_REPLY_STRUCT_SIGNATURE \
- __END_SIG__
-
-#define DEV_UP_SIGNATURE __END_SIG__
-#define DEV_DOWN_SIGNATURE __END_SIG__
-#define DEV_RESET_SIGNATURE __END_SIG__
-#define DEV_SET_PROPERTY_SIGNATURE __END_SIG__
-#define DEV_GET_PROPERTY_SIGNATURE __END_SIG__
-
-/*========================================================================
- BlueZ D-Bus Manager service definitions "/org/bluez/Manager"
- *========================================================================*/
+#define MGR_DEFAULT_DEV_SIGNATURE __END_SIG__
- /* ===== Manager definitions, services under DEVICE_PATH ===== */
-#define MGR_GET_DEV "DeviceList"
-#define MGR_INIT "Init"
-/* Enable/Disable services controller, pan, serial, ... */
-#define MGR_ENABLE "Enable"
-#define MGR_DISABLE "Disable"
+/* Signals sent in the Manager path */
+#define BLUEZ_MGR_DEV_ADDED "DeviceAdded"
+#define BLUEZ_MGR_DEV_REMOVED "DeviceRemoved"
-/* Signatures */
-#define MGR_GET_DEV_SIGNATURE __END_SIG__
-/* yya(ss) */
-#define MGR_GET_DEV_REPLY_SIGNATURE DBUS_TYPE_BYTE_AS_STRING \
- DBUS_TYPE_BYTE_AS_STRING \
- DBUS_TYPE_ARRAY_AS_STRING \
- HCI_DEVICE_STRUCT_SIGNATURE \
- __END_SIG__
+/*========================================================================
+ BlueZ D-Bus Device path definitions "/org/bluez/Device"
+ *========================================================================*/
-/* ===== HCI definitions ===== */
+/* Interfaces implemented in the "/org/bluez/Device" path */
#define BLUEZ_HCI "Controller"
-#define BLUEZ_HCI_PATH MANAGER_PATH "/" BLUEZ_HCI
-#define BLUEZ_HCI_INTERFACE MANAGER_INTERFACE "." BLUEZ_HCI
+#define DEV_HCI_INTERFACE DEVICE_INTERFACE "." BLUEZ_HCI
-/* Device based HCI signals */
+/* Control interface signals */
#define BLUEZ_HCI_INQ_START "InquiryStart"
#define BLUEZ_HCI_INQ_COMPLETE "InquiryComplete"
#define BLUEZ_HCI_INQ_RESULT "InquiryResult"
@@ -109,11 +92,7 @@
#define BLUEZ_HCI_REMOTE_NAME_FAILED "RemoteNameFailed"
#define BLUEZ_HCI_AUTH_COMPLETE "AuthenticationComplete"
-/* HCI signals sent in the BLUEZ_HCI_PATH */
-#define BLUEZ_HCI_DEV_ADDED "DeviceAdded"
-#define BLUEZ_HCI_DEV_REMOVED "DeviceRemoved"
-
-/* HCI Provided services */
+/* Control interface methods */
#define HCI_PERIODIC_INQ "PeriodicInquiry"
#define HCI_CANCEL_PERIODIC_INQ "CancelPeriodic"
#define HCI_INQ "Inquiry"
@@ -123,6 +102,19 @@
#define HCI_CONNECTIONS "Connections"
#define HCI_AUTHENTICATE "Authenticate"
+/* Control interface methods */
+#define DEV_UP "Up"
+#define DEV_DOWN "Down"
+#define DEV_RESET "Reset"
+#define DEV_SET_PROPERTY "SetProperty"
+#define DEV_GET_PROPERTY "GetProperty"
+
+#define DEV_UP_SIGNATURE __END_SIG__
+#define DEV_DOWN_SIGNATURE __END_SIG__
+#define DEV_RESET_SIGNATURE __END_SIG__
+#define DEV_SET_PROPERTY_SIGNATURE __END_SIG__
+#define DEV_GET_PROPERTY_SIGNATURE __END_SIG__
+
#define HCI_PERIODIC_INQ_SIGNATURE DBUS_TYPE_BYTE_AS_STRING \
DBUS_TYPE_BYTE_AS_STRING \
diff --git a/hcid/hcid.h b/hcid/hcid.h
index fb318015..6dd6437c 100644
--- a/hcid/hcid.h
+++ b/hcid/hcid.h
@@ -121,10 +121,11 @@ void toggle_pairing(int enable);
gboolean hcid_dbus_init(void);
void hcid_dbus_exit(void);
gboolean hcid_dbus_register_device(uint16_t id);
-gboolean hcid_dbus_register_manager(uint16_t id);
gboolean hcid_dbus_unregister_device(uint16_t id);
-gboolean hcid_dbus_unregister_manager(uint16_t id);
+gboolean hcid_dbus_dev_up(uint16_t id);
+gboolean hcid_dbus_dev_down(uint16_t id);
void hcid_dbus_request_pin(int dev, struct hci_conn_info *ci);
+
void hcid_dbus_inquiry_start(bdaddr_t *local);
void hcid_dbus_inquiry_complete(bdaddr_t *local);
void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, int8_t rssi);
diff --git a/hcid/main.c b/hcid/main.c
index e6d43590..5ff9fcf3 100644
--- a/hcid/main.c
+++ b/hcid/main.c
@@ -401,10 +401,10 @@ static void init_all_devices(int ctl)
start_security_manager(dr->dev_id);
#ifdef ENABLE_DBUS
- if (hci_test_bit(HCI_UP, &dr->dev_opt))
- hcid_dbus_register_manager(dr->dev_id);
-
hcid_dbus_register_device(dr->dev_id);
+
+ if (hci_test_bit(HCI_UP, &dr->dev_opt))
+ hcid_dbus_dev_up(dr->dev_id);
#endif
}
@@ -476,7 +476,7 @@ static inline void device_event(GIOChannel *chan, evt_stack_internal *si)
if (hcid.security)
start_security_manager(sd->dev_id);
#ifdef ENABLE_DBUS
- hcid_dbus_register_manager(sd->dev_id);
+ hcid_dbus_dev_up(sd->dev_id);
#endif
break;
@@ -485,7 +485,7 @@ static inline void device_event(GIOChannel *chan, evt_stack_internal *si)
if (hcid.security)
stop_security_manager(sd->dev_id);
#ifdef ENABLE_DBUS
- hcid_dbus_unregister_manager(sd->dev_id);
+ hcid_dbus_dev_down(sd->dev_id);
#endif
break;
}