diff options
author | Luiz Augusto von Dentz <luiz.dentz@indt.org.br> | 2008-07-01 10:31:38 -0300 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.dentz@indt.org.br> | 2008-07-28 10:30:22 -0300 |
commit | d2e9d02070441523b6cb98e84b754b11e9813ecf (patch) | |
tree | 62bd27db85c2eb043c7a5c5f36221a82340cc85f /hcid | |
parent | 7e2df7ddca88aa74c4eb54139c93a3dcc74490aa (diff) |
Cleanup hci manager.
Diffstat (limited to 'hcid')
-rw-r--r-- | hcid/manager.c | 323 |
1 files changed, 11 insertions, 312 deletions
diff --git a/hcid/manager.c b/hcid/manager.c index c2d5fdf1..212bddc8 100644 --- a/hcid/manager.c +++ b/hcid/manager.c @@ -91,49 +91,6 @@ static inline DBusMessage *failed_strerror(DBusMessage *msg, int err) strerror(err)); } -static DBusMessage *interface_version(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - DBusMessage *reply; - dbus_uint32_t version = 0; - - if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) - return invalid_args(msg); - - reply = dbus_message_new_method_return(msg); - if (!reply) - return NULL; - - dbus_message_append_args(reply, DBUS_TYPE_UINT32, &version, - DBUS_TYPE_INVALID); - - return reply; -} - -static DBusMessage *old_default_adapter(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - DBusMessage *reply; - char path[MAX_PATH_LENGTH], *path_ptr = path; - - if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) - return invalid_args(msg); - - if (default_adapter_id < 0) - return no_such_adapter(msg); - - reply = dbus_message_new_method_return(msg); - if (!reply) - return NULL; - - snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, default_adapter_id); - - dbus_message_append_args(reply, DBUS_TYPE_STRING, &path_ptr, - DBUS_TYPE_INVALID); - - return reply; -} - static int find_by_address(const char *str) { struct hci_dev_list_req *dl; @@ -178,214 +135,6 @@ out: return devid; } -static DBusMessage *old_find_adapter(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - DBusMessage *reply; - char path[MAX_PATH_LENGTH], *path_ptr = path; - struct hci_dev_info di; - const char *pattern; - int dev_id; - - if (!dbus_message_get_args(msg, NULL, - DBUS_TYPE_STRING, &pattern, - DBUS_TYPE_INVALID)) - return invalid_args(msg); - - /* hci_devid() would make sense to use here, except it - is restricted to devices which are up */ - if (!strncmp(pattern, "hci", 3) && strlen(pattern) >= 4) - dev_id = atoi(pattern + 3); - else - dev_id = find_by_address(pattern); - - if (dev_id < 0) - return no_such_adapter(msg); - - if (hci_devinfo(dev_id, &di) < 0) - return no_such_adapter(msg); - - if (hci_test_bit(HCI_RAW, &di.flags)) - return no_such_adapter(msg); - - reply = dbus_message_new_method_return(msg); - if (!reply) - return NULL; - - snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, dev_id); - - dbus_message_append_args(reply, DBUS_TYPE_STRING, &path_ptr, - DBUS_TYPE_INVALID); - - return reply; -} - -static DBusMessage *old_list_adapters(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - DBusMessageIter iter; - DBusMessageIter array_iter; - DBusMessage *reply; - struct hci_dev_list_req *dl; - struct hci_dev_req *dr; - int i, sk; - - if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) - return invalid_args(msg); - - sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); - if (sk < 0) - return failed_strerror(msg, errno); - - dl = g_malloc0(HCI_MAX_DEV * sizeof(*dr) + sizeof(*dl)); - - dl->dev_num = HCI_MAX_DEV; - dr = dl->dev_req; - - if (ioctl(sk, HCIGETDEVLIST, dl) < 0) { - int err = errno; - close(sk); - g_free(dl); - return failed_strerror(msg, err); - } - - dr = dl->dev_req; - - reply = dbus_message_new_method_return(msg); - if (!reply) { - close(sk); - g_free(dl); - return NULL; - } - - dbus_message_iter_init_append(reply, &iter); - - dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, - DBUS_TYPE_STRING_AS_STRING, &array_iter); - - for (i = 0; i < dl->dev_num; i++, dr++) { - char path[MAX_PATH_LENGTH], *path_ptr = path; - struct hci_dev_info di; - - if (hci_devinfo(dr->dev_id, &di) < 0) - continue; - - if (hci_test_bit(HCI_RAW, &di.flags)) - continue; - - snprintf(path, sizeof(path), "%s/%s", BASE_PATH, di.name); - - dbus_message_iter_append_basic(&array_iter, - DBUS_TYPE_STRING, &path_ptr); - } - - dbus_message_iter_close_container(&iter, &array_iter); - - g_free(dl); - - close(sk); - - return reply; -} - -static DBusMessage *find_service(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - DBusMessage *reply; - const char *pattern; - struct service *service; - - if (!dbus_message_get_args(msg, NULL, - DBUS_TYPE_STRING, &pattern, - DBUS_TYPE_INVALID)) - return invalid_args(msg); - - service = search_service(pattern); - if (!service) - return no_such_service(msg); - - reply = dbus_message_new_method_return(msg); - if (!reply) - return NULL; - - dbus_message_append_args(reply, DBUS_TYPE_STRING, &service->object_path, - DBUS_TYPE_INVALID); - - return reply; -} - -static DBusMessage *list_services(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - DBusMessage *reply; - DBusMessageIter iter; - DBusMessageIter array_iter; - - if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) - return invalid_args(msg); - - reply = dbus_message_new_method_return(msg); - if (!reply) - return NULL; - - dbus_message_iter_init_append(reply, &iter); - dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, - DBUS_TYPE_STRING_AS_STRING, &array_iter); - - append_available_services(&array_iter); - - dbus_message_iter_close_container(&iter, &array_iter); - - return reply; -} - -static DBusMessage *activate_service(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - DBusMessage *reply; - const char *pattern; - struct service *service; - const char *busname = "org.bluez"; - - if (!dbus_message_get_args(msg, NULL, - DBUS_TYPE_STRING, &pattern, - DBUS_TYPE_INVALID)) - return invalid_args(msg); - - service = search_service(pattern); - if (!service) - return no_such_service(msg); - - reply = dbus_message_new_method_return(msg); - if (!reply) - return NULL; - - dbus_message_append_args(reply, DBUS_TYPE_STRING, &busname, - DBUS_TYPE_INVALID); - - return reply; -} - -static GDBusMethodTable old_manager_methods[] = { - { "InterfaceVersion", "", "u", interface_version }, - { "DefaultAdapter", "", "s", old_default_adapter }, - { "FindAdapter", "s", "s", old_find_adapter }, - { "ListAdapters", "", "as", old_list_adapters }, - { "FindService", "s", "s", find_service }, - { "ListServices", "", "as", list_services }, - { "ActivateService", "s", "s", activate_service }, - { NULL, NULL, NULL, NULL } -}; - -static GDBusSignalTable old_manager_signals[] = { - { "AdapterAdded", "s" }, - { "AdapterRemoved", "s" }, - { "DefaultAdapterChanged", "s" }, - { "ServiceAdded", "s" }, - { "ServiceRemoved", "s" }, - { NULL, NULL } -}; - static DBusMessage *default_adapter(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -512,24 +261,14 @@ dbus_bool_t manager_init(DBusConnection *conn, const char *path) { connection = conn; - if (hcid_dbus_use_experimental()) { - debug("Registering experimental manager interface"); - g_dbus_register_interface(conn, "/", MANAGER_INTERFACE, - manager_methods, manager_signals, - NULL, NULL, NULL); - } - - return g_dbus_register_interface(conn, path, MANAGER_INTERFACE, - old_manager_methods, old_manager_signals, + return g_dbus_register_interface(conn, "/", MANAGER_INTERFACE, + manager_methods, manager_signals, NULL, NULL, NULL); } void manager_cleanup(DBusConnection *conn, const char *path) { - g_dbus_unregister_interface(conn, path, MANAGER_INTERFACE); - - if (hcid_dbus_use_experimental()) - g_dbus_unregister_interface(conn, "/", MANAGER_INTERFACE); + g_dbus_unregister_interface(conn, "/", MANAGER_INTERFACE); } static gint adapter_id_cmp(gconstpointer a, gconstpointer b) @@ -596,16 +335,9 @@ void manager_add_adapter(struct adapter *adapter) { const char *ptr = adapter->path + ADAPTER_PATH_INDEX; - if (hcid_dbus_use_experimental()) { - g_dbus_emit_signal(connection, "/", - MANAGER_INTERFACE, "AdapterAdded", - DBUS_TYPE_OBJECT_PATH, &ptr, - DBUS_TYPE_INVALID); - } - - g_dbus_emit_signal(connection, BASE_PATH, + g_dbus_emit_signal(connection, "/", MANAGER_INTERFACE, "AdapterAdded", - DBUS_TYPE_STRING, &adapter->path, + DBUS_TYPE_OBJECT_PATH, &ptr, DBUS_TYPE_INVALID); adapters = g_slist_append(adapters, adapter); @@ -615,42 +347,16 @@ void manager_remove_adapter(struct adapter *adapter) { const char *ptr = adapter->path + ADAPTER_PATH_INDEX; - if (hcid_dbus_use_experimental()) { - g_dbus_emit_signal(connection, "/", - MANAGER_INTERFACE, "AdapterRemoved", - DBUS_TYPE_OBJECT_PATH, &ptr, - DBUS_TYPE_INVALID); - } - - g_dbus_emit_signal(connection, BASE_PATH, + g_dbus_emit_signal(connection, "/", MANAGER_INTERFACE, "AdapterRemoved", - DBUS_TYPE_STRING, &adapter->path, + DBUS_TYPE_OBJECT_PATH, &ptr, DBUS_TYPE_INVALID); if ((default_adapter_id == adapter->dev_id || default_adapter_id < 0)) { int new_default = hci_get_route(NULL); - default_adapter_id = new_default; - if (new_default >= 0) { - if (hcid_dbus_use_experimental()) { - g_dbus_emit_signal(connection, "/", - MANAGER_INTERFACE, - "DefaultAdapterChanged", - DBUS_TYPE_OBJECT_PATH, &ptr, - DBUS_TYPE_INVALID); - } - g_dbus_emit_signal(connection, BASE_PATH, - MANAGER_INTERFACE, - "DefaultAdapterChanged", - DBUS_TYPE_STRING, &adapter->path, - DBUS_TYPE_INVALID); - } else { - g_dbus_emit_signal(connection, BASE_PATH, - MANAGER_INTERFACE, - "DefaultAdapterChanged", - DBUS_TYPE_STRING, &adapter->path, - DBUS_TYPE_INVALID); - } + if (new_default >= 0) + manager_set_default_adapter(new_default); } adapters = g_slist_remove(adapters, adapter); @@ -668,16 +374,9 @@ void manager_set_default_adapter(int id) default_adapter_id = id; - if (hcid_dbus_use_experimental()) - g_dbus_emit_signal(connection, "/", - MANAGER_INTERFACE, - "DefaultAdapterChanged", - DBUS_TYPE_OBJECT_PATH, &ptr, - DBUS_TYPE_INVALID); - - g_dbus_emit_signal(connection, BASE_PATH, + g_dbus_emit_signal(connection, "/", MANAGER_INTERFACE, "DefaultAdapterChanged", - DBUS_TYPE_STRING, &adapter->path, + DBUS_TYPE_OBJECT_PATH, &ptr, DBUS_TYPE_INVALID); } |