From 9cef574490407c149831be8c7c89e50f77eb813c Mon Sep 17 00:00:00 2001 From: Alexander Orlenko Date: Fri, 16 Jul 2010 23:30:34 +1100 Subject: Removed DeviceDisappeared signal (seem never called) in bt-adapter.c Added calling of dbus_disconnect() to all tools Rewrited SDP parser (bt-device.c) Added verbose option for service discovering (bt-device.c) A lot of improvements and fixes in all tools --- src/bt-adapter.c | 16 ++-- src/bt-agent.c | 6 +- src/bt-audio.c | 9 +- src/bt-device.c | 252 +++++++++++++++++++++++++++++++++------------------ src/bt-input.c | 3 + src/bt-monitor.c | 147 ++++++++++++++++++++++-------- src/bt-network.c | 13 ++- src/bt-serial.c | 1 + src/lib/agent.c | 31 +++++-- src/lib/bluez-dbus.h | 2 +- src/lib/helpers.c | 144 ++++++++++++++++------------- src/lib/helpers.h | 5 +- 12 files changed, 417 insertions(+), 212 deletions(-) diff --git a/src/bt-adapter.c b/src/bt-adapter.c index 907554a..5bdd779 100644 --- a/src/bt-adapter.c +++ b/src/bt-adapter.c @@ -32,8 +32,8 @@ static void adapter_device_found(Adapter *adapter, const gchar *address, GHashTable *values, gpointer data) { + g_assert(data != NULL); GHashTable *found_devices = data; - g_assert(found_devices != NULL); if (g_hash_table_lookup(found_devices, address) != NULL) { return; @@ -41,12 +41,11 @@ static void adapter_device_found(Adapter *adapter, const gchar *address, GHashTa if (g_hash_table_size(found_devices) == 0) g_print("\n"); - // TODO: Translate class of adapter ? - g_print("[%s]\n", address); g_print(" Name: %s\n", g_value_get_string(g_hash_table_lookup(values, "Name"))); g_print(" Alias: %s\n", g_value_get_string(g_hash_table_lookup(values, "Alias"))); g_print(" Address: %s\n", g_value_get_string(g_hash_table_lookup(values, "Address"))); + g_print(" Icon: %s\n", g_value_get_string(g_hash_table_lookup(values, "Icon"))); g_print(" Class: 0x%x\n", g_value_get_uint(g_hash_table_lookup(values, "Class"))); g_print(" LegacyPairing: %d\n", g_value_get_boolean(g_hash_table_lookup(values, "LegacyPairing"))); g_print(" Paired: %d\n", g_value_get_boolean(g_hash_table_lookup(values, "Paired"))); @@ -56,17 +55,21 @@ static void adapter_device_found(Adapter *adapter, const gchar *address, GHashTa g_hash_table_insert(found_devices, g_strdup(address), g_value_dup_string(g_hash_table_lookup(values, "Alias"))); } +/* static void adapter_device_disappeared(Adapter *adapter, const gchar *address, gpointer data) { + g_assert(data != NULL); GHashTable *found_devices = data; - g_assert(found_devices != NULL); g_print("Device disappeared: %s (%s)\n", g_value_get_string(g_hash_table_lookup(found_devices, address)), address); } +*/ static void adapter_property_changed(Adapter *adapter, const gchar *name, const GValue *value, gpointer data) { + g_assert(data != NULL); GMainLoop *mainloop = data; + if (g_strcmp0(name, "Discovering") == 0 && g_value_get_boolean(value) == FALSE) { g_main_loop_quit(mainloop); } @@ -169,7 +172,7 @@ int main(int argc, char *argv[]) const gchar **uuids = adapter_get_uuids(adapter); for (int j = 0; uuids[j] != NULL; j++) { if (j > 0) g_print(", "); - g_print("%s", get_uuid_name(uuids[j])); + g_print("%s", uuid2name(uuids[j])); } g_print("]\n"); @@ -186,7 +189,7 @@ int main(int argc, char *argv[]) GMainLoop *mainloop = g_main_loop_new(NULL, FALSE); g_signal_connect(adapter, "DeviceFound", G_CALLBACK(adapter_device_found), found_devices); - g_signal_connect(adapter, "DeviceDisappeared", G_CALLBACK(adapter_device_disappeared), found_devices); + //g_signal_connect(adapter, "DeviceDisappeared", G_CALLBACK(adapter_device_disappeared), found_devices); g_signal_connect(adapter, "PropertyChanged", G_CALLBACK(adapter_property_changed), mainloop); g_print("Searching...\n"); @@ -261,6 +264,7 @@ int main(int argc, char *argv[]) } g_object_unref(manager); + dbus_disconnect(); exit(EXIT_SUCCESS); } diff --git a/src/bt-agent.c b/src/bt-agent.c index e8656b6..4ba26dc 100644 --- a/src/bt-agent.c +++ b/src/bt-agent.c @@ -72,23 +72,19 @@ int main(int argc, char *argv[]) adapter_register_agent(adapter, DBUS_AGENT_PATH, "DisplayYesNo", &error); exit_if_error(error); - g_print("Agent registered\n"); - GMainLoop *mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); - // It is unnecessary... // TODO: Add SIGINT handler (Ctrl+C) adapter_unregister_agent(adapter, DBUS_AGENT_PATH, &error); exit_if_error(error); - g_print("Agent unregistered\n"); - g_main_loop_unref(mainloop); g_object_unref(agent); g_object_unref(adapter); g_object_unref(manager); + dbus_disconnect(); exit(EXIT_SUCCESS); } diff --git a/src/bt-audio.c b/src/bt-audio.c index 8e0b1e1..663d915 100644 --- a/src/bt-audio.c +++ b/src/bt-audio.c @@ -32,7 +32,9 @@ static void audio_property_changed(Audio *audio, const gchar *name, const GValue *value, gpointer data) { + g_assert(data != NULL); GMainLoop *mainloop = data; + if (g_strcmp0(name, "State") == 0) { if (g_ascii_strcasecmp(g_value_get_string(value), "connecting") == 0) { g_print("Connecting to an audio service\n"); @@ -102,9 +104,9 @@ int main(int argc, char *argv[]) g_signal_connect(audio, "PropertyChanged", G_CALLBACK(audio_property_changed), mainloop); if (connect_arg) { - if (g_strcmp0(audio_get_state(audio), "connected") == 0) { + if (g_ascii_strcasecmp(audio_get_state(audio), "connected") == 0) { g_print("Audio service is already connected\n"); - } else if (g_strcmp0(audio_get_state(audio), "connecting") == 0) { + } else if (g_ascii_strcasecmp(audio_get_state(audio), "connecting") == 0) { g_print("Audio service is already in connection state\n"); } else { audio_connect(audio, &error); @@ -112,7 +114,7 @@ int main(int argc, char *argv[]) g_main_loop_run(mainloop); } } else if (disconnect_arg) { - if (g_strcmp0(audio_get_state(audio), "disconnected") == 0) { + if (g_ascii_strcasecmp(audio_get_state(audio), "disconnected") == 0) { g_print("Audio service is already disconnected\n"); } else { audio_disconnect(audio, &error); @@ -125,6 +127,7 @@ int main(int argc, char *argv[]) g_object_unref(audio); g_object_unref(device); g_object_unref(adapter); + dbus_disconnect(); exit(EXIT_SUCCESS); } diff --git a/src/bt-device.c b/src/bt-device.c index b20e502..baeaba6 100644 --- a/src/bt-device.c +++ b/src/bt-device.c @@ -31,143 +31,204 @@ #include "lib/bluez-dbus.h" -static void create_paired_device_done(gpointer data) +enum { + REC, + ATTR, + SEQ, + ELEM, + + ATTR_ID, + UUID_ID, + + LAST_E +}; + +static int xml_t[LAST_E] = {0, 0, 0, 0, -1, -1}; + +static gchar *adapter_arg = NULL; +static gboolean list_arg = FALSE; +static gchar *connect_arg = NULL; +static gchar *remove_arg = NULL; +static gchar *info_arg = NULL; +static gboolean services_arg = FALSE; +static gchar *services_device_arg = NULL; +static gchar *services_pattern_arg = NULL; +static gboolean set_arg = FALSE; +static gchar *set_device_arg = NULL; +static gchar *set_property_arg = NULL; +static gchar *set_value_arg = NULL; +static gboolean verbose_arg = FALSE; + +static gboolean is_verbose_attr(int attr_id) { - GMainLoop *mainloop = data; - g_main_loop_quit(mainloop); + if ( + attr_id == SDP_ATTR_ID_SERVICE_CLASS_ID_LIST || + attr_id == SDP_ATTR_ID_PROTOCOL_DESCRIPTOR_LIST || + attr_id == SDP_ATTR_ID_BLUETOOTH_PROFILE_DESCRIPTOR_LIST || + attr_id == SDP_ATTR_ID_DOCUMENTATION_URL || + attr_id == SDP_ATTR_ID_SERVICE_NAME || + attr_id == SDP_ATTR_ID_SERVICE_DESCRIPTION || + attr_id == SDP_ATTR_ID_PROVIDER_NAME || + attr_id == SDP_ATTR_ID_SECURITY_DESCRIPTION + ) + return FALSE; + + return TRUE; } -static int rec_elem_num = 0; -static int attr_elem_num = 0; -static int seq_elem_num = 0; -static int int_elem_num = 0; +static const gchar *xml_get_attr_value(const gchar *attr_name, const gchar **attribute_names, const gchar **attribute_values) +{ + for (int i = 0; attribute_names[i] != NULL; i++) { + if (g_strcmp0(attribute_names[i], attr_name) == 0) { + return attribute_values[i]; + } + } -static int current_attr_id = -1; -static int current_uuid_id = -1; + return NULL; +} -void xml_start_element(GMarkupParseContext *context, +static void xml_start_element(GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error) { - GPatternSpec *int_pattern = g_pattern_spec_new("*int*"); + const gchar *id_t = xml_get_attr_value("id", attribute_names, attribute_values); + const gchar *value_t = xml_get_attr_value("value", attribute_names, attribute_values); if (g_strcmp0(element_name, "record") == 0) { - rec_elem_num++; - - attr_elem_num = 0; - seq_elem_num = 0; - int_elem_num = 0; + xml_t[REC]++; + } else if (g_strcmp0(element_name, "attribute") == 0 && id_t) { + int attr_id = xtoi(id_t); + const gchar *attr_name = sdp_get_attr_id_name(attr_id); - current_attr_id = -1; - current_uuid_id = -1; + xml_t[ATTR]++; + xml_t[ATTR_ID] = attr_id; - if (rec_elem_num == 1) g_print("\n"); - } else if (g_strcmp0(element_name, "attribute") == 0 && g_strcmp0(attribute_names[0], "id") == 0) { - int attr_id = xtoi(attribute_values[0]); - const gchar *attr_name = sdp_get_attr_id_name(attr_id); - current_attr_id = attr_id; - attr_elem_num++; + if (!verbose_arg && is_verbose_attr(xml_t[ATTR_ID])) return; - if (attr_elem_num > 1) g_print("\n"); if (attr_name == NULL) { - g_print("AttrID-%s: ", attribute_values[0]); + g_print("AttrID-%s: ", id_t); } else { g_print("%s: ", attr_name); } } else if (g_strcmp0(element_name, "sequence") == 0) { - seq_elem_num++; - int_elem_num = 0; - if (seq_elem_num > 1) { + xml_t[SEQ]++; + } else if (g_pattern_match_simple("*int*", element_name) && value_t) { + xml_t[ELEM]++; + + if (!verbose_arg && is_verbose_attr(xml_t[ATTR_ID])) return; + + if (xml_t[ELEM] == 1 && xml_t[SEQ] > 1) { g_print("\n"); - for (int i = 0; i < seq_elem_num; i++) g_print(" "); + for (int i = 0; i < xml_t[SEQ]; i++) g_print(" "); + } else if (xml_t[ELEM] > 1) { + g_print(", "); } - } else if ((g_pattern_match(int_pattern, strlen(element_name), element_name, NULL)) && g_strcmp0(attribute_names[0], "value") == 0) { - int_elem_num++; - if (int_elem_num > 1) g_print(", "); - if (current_uuid_id == SDP_UUID_RFCOMM) { - g_print("Channel: %d", xtoi(attribute_values[0])); + if (xml_t[UUID_ID] == SDP_UUID_RFCOMM) { + g_print("Channel: %d", xtoi(value_t)); } else { - g_print("0x%x", xtoi(attribute_values[0])); + g_print("0x%x", xtoi(value_t)); } - } else if (g_strcmp0(element_name, "uuid") == 0 && g_strcmp0(attribute_names[0], "value") == 0) { + } else if (g_strcmp0(element_name, "uuid") == 0 && value_t) { int uuid_id = -1; const gchar *uuid_name; - int_elem_num++; - if (attribute_values[0][0] == '0' && attribute_values[0][1] == 'x') { - uuid_id = xtoi(attribute_values[0]); + if (value_t[0] == '0' && value_t[1] == 'x') { + uuid_id = xtoi(value_t); uuid_name = sdp_get_uuid_name(uuid_id); - current_uuid_id = uuid_id; } else { - uuid_name = get_uuid_name(attribute_values[0]); + uuid_name = uuid2name(value_t); + } + + xml_t[ELEM]++; + xml_t[UUID_ID] = uuid_id; + + if (!verbose_arg && is_verbose_attr(xml_t[ATTR_ID])) return; + + if (xml_t[ELEM] == 1 && xml_t[SEQ] > 1) { + g_print("\n"); + for (int i = 0; i < xml_t[SEQ]; i++) g_print(" "); + } else if (xml_t[ELEM] > 1) { + g_print(", "); } - if (int_elem_num > 1) g_print(", "); if (uuid_name == NULL) { - g_print("\"UUID-%s\"", attribute_values[0]); + g_print("\"UUID-%s\"", value_t); } else { g_print("\"%s\"", uuid_name); } - } else if (g_strcmp0(element_name, "text") == 0 && g_strcmp0(attribute_names[0], "value") == 0) { - int_elem_num++; + } else if (g_strcmp0(element_name, "text") == 0 && value_t) { + xml_t[ELEM]++; - if (int_elem_num > 1) g_print(", "); - g_print("\"%s\"", attribute_values[0]); - } else if (g_strcmp0(element_name, "boolean") == 0 && g_strcmp0(attribute_names[0], "value") == 0) { - int_elem_num++; + if (!verbose_arg && is_verbose_attr(xml_t[ATTR_ID])) return; - if (int_elem_num > 1) g_print(", "); - g_print("%s", attribute_values[0]); + if (xml_t[ELEM] == 1 && xml_t[SEQ] > 1) { + g_print("\n"); + for (int i = 0; i < xml_t[SEQ]; i++) g_print(" "); + } else if (xml_t[ELEM] > 1) { + g_print(", "); + } + + g_print("\"%s\"", value_t); + } else if (g_strcmp0(element_name, "boolean") == 0 && value_t) { + xml_t[ELEM]++; + + if (!verbose_arg && is_verbose_attr(xml_t[ATTR_ID])) return; + + if (xml_t[ELEM] == 1 && xml_t[SEQ] > 1) { + g_print("\n"); + for (int i = 0; i < xml_t[SEQ]; i++) g_print(" "); + } else if (xml_t[ELEM] > 1) { + g_print(", "); + } + + g_print("%s", value_t); } else { if (error) *error = g_error_new(G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, "Invalid XML element: %s", element_name); } - - g_pattern_spec_free(int_pattern); } -void xml_end_element(GMarkupParseContext *context, +static void xml_end_element(GMarkupParseContext *context, const gchar *element_name, gpointer user_data, GError **error) { if (g_strcmp0(element_name, "record") == 0) { - attr_elem_num = 0; - seq_elem_num = 0; - int_elem_num = 0; + xml_t[ATTR] = 0; + xml_t[SEQ] = 0; + xml_t[ELEM] = 0; - current_attr_id = -1; - current_uuid_id = -1; - - g_print("\n\n"); + xml_t[ATTR_ID] = -1; + xml_t[UUID_ID] = -1; } else if (g_strcmp0(element_name, "attribute") == 0) { - seq_elem_num = 0; - int_elem_num = 0; + xml_t[SEQ] = 0; + xml_t[ELEM] = 0; + + int old_attr_id = xml_t[ATTR_ID]; + xml_t[ATTR_ID] = -1; + xml_t[UUID_ID] = -1; - current_attr_id = -1; - current_uuid_id = -1; + if (!verbose_arg && is_verbose_attr(old_attr_id)) return; + + g_print("\n"); } else if (g_strcmp0(element_name, "sequence") == 0) { - seq_elem_num--; - int_elem_num = 0; + xml_t[SEQ]--; + xml_t[ELEM] = 0; - current_uuid_id = -1; + xml_t[UUID_ID] = -1; } } -static gchar *adapter_arg = NULL; -static gboolean list_arg = FALSE; -static gchar *connect_arg = NULL; -static gchar *remove_arg = NULL; -static gchar *info_arg = NULL; -static gchar *services_arg = NULL; -static gboolean set_arg = FALSE; -static gchar *set_device_arg = NULL; -static gchar *set_property_arg = NULL; -static gchar *set_value_arg = NULL; +static void create_paired_device_done(gpointer data) +{ + g_assert(data != NULL); + GMainLoop *mainloop = data; + g_main_loop_quit(mainloop); +} static GOptionEntry entries[] = { {"adapter", 'a', 0, G_OPTION_ARG_STRING, &adapter_arg, "Adapter name or MAC", ""}, @@ -175,8 +236,9 @@ static GOptionEntry entries[] = { {"connect", 'c', 0, G_OPTION_ARG_STRING, &connect_arg, "Connect to a device", ""}, {"remove", 'r', 0, G_OPTION_ARG_STRING, &remove_arg, "Remove device", ""}, {"info", 'i', 0, G_OPTION_ARG_STRING, &info_arg, "Get info about device", ""}, - {"services", 's', 0, G_OPTION_ARG_STRING, &services_arg, "Discover device services", ""}, + {"services", 's', 0, G_OPTION_ARG_NONE, &services_arg, "Discover device services", NULL}, {"set", 0, 0, G_OPTION_ARG_NONE, &set_arg, "Set device property", NULL}, + {"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose_arg, "Verbosely list services", NULL}, {NULL} }; @@ -191,6 +253,9 @@ int main(int argc, char *argv[]) g_option_context_add_main_entries(context, entries, NULL); g_option_context_set_summary(context, "Version "PACKAGE_VERSION); g_option_context_set_description(context, + "Services Options:\n" + " -s, --services []\n" + " Where `pattern` is an optional specific UUID\n\n" "Set Options:\n" " --set \n" " Where `property` is one of:\n" @@ -207,6 +272,10 @@ int main(int argc, char *argv[]) } else if (!list_arg && !connect_arg && !remove_arg && !info_arg && !services_arg && !set_arg) { g_print("%s", g_option_context_get_help(context, FALSE, NULL)); exit(EXIT_FAILURE); + } else if (services_arg && argc != 2 && argc != 3) { + g_print("%s: Invalid arguments for --services\n", g_get_prgname()); + g_print("Try `%s --help` for more information.\n", g_get_prgname()); + exit(EXIT_FAILURE); } else if (set_arg && argc != 4) { g_print("%s: Invalid arguments for --set\n", g_get_prgname()); g_print("Try `%s --help` for more information.\n", g_get_prgname()); @@ -266,12 +335,11 @@ int main(int argc, char *argv[]) Device *device = find_device(adapter, info_arg, &error); exit_if_error(error); - // TODO: Translate class of device ? - g_print("[%s]\n", device_get_address(device)); g_print(" Name: %s\n", device_get_name(device)); g_print(" Alias: %s [rw]\n", device_get_alias(device)); g_print(" Address: %s\n", device_get_address(device)); + g_print(" Icon: %s\n", device_get_icon(device)); g_print(" Class: %x\n", device_get_class(device)); g_print(" Paired: %d\n", device_get_paired(device)); g_print(" Trusted: %d [rw]\n", device_get_trusted(device)); @@ -281,32 +349,39 @@ int main(int argc, char *argv[]) const gchar **uuids = device_get_uuids(device); for (int j = 0; uuids[j] != NULL; j++) { if (j > 0) g_print(", "); - g_print("%s", get_uuid_name(uuids[j])); + g_print("%s", uuid2name(uuids[j])); } g_print("]\n"); g_object_unref(device); } else if (services_arg) { - Device *device = find_device(adapter, services_arg, &error); + services_device_arg = argv[1]; + if (argc == 3) { + services_pattern_arg = argv[2]; + } + + Device *device = find_device(adapter, services_device_arg, &error); exit_if_error(error); g_print("Discovering services...\n"); - GHashTable *device_services = device_discover_services(device, NULL, &error); + GHashTable *device_services = device_discover_services(device, name2uuid(services_pattern_arg), &error); exit_if_error(error); GHashTableIter iter; gpointer key, value; - // TOOD: Add verbose option - g_hash_table_iter_init(&iter, device_services); + int n = 0; while (g_hash_table_iter_next(&iter, &key, &value)) { + n++; + if (n == 1) g_print("\n"); + g_print("[RECORD:%d]\n", (int)key); GMarkupParser xml_parser = {xml_start_element, xml_end_element, NULL, NULL, NULL}; GMarkupParseContext *xml_parse_context = g_markup_parse_context_new(&xml_parser, 0, NULL, NULL); g_markup_parse_context_parse(xml_parse_context, value, strlen(value), &error); exit_if_error(error); g_markup_parse_context_free(xml_parse_context); - //g_print("%s", value); + g_print("\n"); } g_print("Done\n"); @@ -364,6 +439,7 @@ int main(int argc, char *argv[]) } g_object_unref(adapter); + dbus_disconnect(); exit(EXIT_SUCCESS); } diff --git a/src/bt-input.c b/src/bt-input.c index 42979d4..ab9e310 100644 --- a/src/bt-input.c +++ b/src/bt-input.c @@ -32,7 +32,9 @@ static void input_property_changed(Input *input, const gchar *name, const GValue *value, gpointer data) { + g_assert(data != NULL); GMainLoop *mainloop = data; + if (g_strcmp0(name, "Connected") == 0) { if (g_value_get_boolean(value) == TRUE) { g_print("Input service is connected\n"); @@ -120,6 +122,7 @@ int main(int argc, char *argv[]) g_object_unref(input); g_object_unref(device); g_object_unref(adapter); + dbus_disconnect(); exit(EXIT_SUCCESS); } diff --git a/src/bt-monitor.c b/src/bt-monitor.c index d527d6f..03f7bdb 100644 --- a/src/bt-monitor.c +++ b/src/bt-monitor.c @@ -38,15 +38,18 @@ static GHashTable *captured_adapters_devices_t = NULL; static GHashTable *captured_devices_services_t = NULL; static void capture_adapter(Adapter *adapter); -static void capture_device(Device *device); static void release_adapter(Adapter *adapter); -static void release_device(Device *device, gboolean full_release); +static void capture_device(Device *device); +static void release_device(Device *device); +static void reload_device_services(Device *device); /* * Manager signals */ static void manager_adapter_added(Manager *manager, const gchar *adapter_path, gpointer data) { + //g_print("manager_adapter_added()\n"); + if (adapter_arg == NULL) { Adapter *adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL); g_print("[Manager] Adapter added: %s (%s)\n", adapter_get_name(adapter), adapter_get_address(adapter)); @@ -56,6 +59,8 @@ static void manager_adapter_added(Manager *manager, const gchar *adapter_path, g static void manager_adapter_removed(Manager *manager, const gchar *adapter_path, gpointer data) { + //g_print("manager_adapter_removed()\n"); + GSList *t = g_hash_table_lookup(captured_adapters_devices_t, adapter_path); if (t != NULL) { Adapter *adapter = ADAPTER(g_slist_nth_data(t, 0)); @@ -71,6 +76,8 @@ static void manager_adapter_removed(Manager *manager, const gchar *adapter_path, static void manager_default_adapter_changed(Manager *manager, const gchar *adapter_path, gpointer data) { + //g_print("manager_default_adapter_changed()\n"); + if (adapter_arg == NULL) { Adapter *adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL); g_print("[Manager] Default adapter changed: %s (%s)\n", adapter_get_name(adapter), adapter_get_address(adapter)); @@ -80,6 +87,8 @@ static void manager_default_adapter_changed(Manager *manager, const gchar *adapt static void manager_property_changed(Manager *manager, const gchar *name, const GValue *value, gpointer data) { + //g_print("manager_property_changed()\n"); + if (adapter_arg == NULL) { // Only one property: Adapters g_print("[Manager] Property changed: %s\n", name); @@ -91,23 +100,34 @@ static void manager_property_changed(Manager *manager, const gchar *name, const */ static void adapter_device_created(Adapter *adapter, const gchar *device_path, gpointer data) { - Device *device = g_object_new(DEVICE_TYPE, "DBusObjectPath", device_path, NULL); - g_print("[Adapter: %s (%s)] Device created: %s (%s)\n", adapter_get_name(adapter), adapter_get_address(adapter), device_get_alias(device), device_get_address(device)); - capture_device(device); + //g_print("adapter_device_created()\n"); + + if (intf_is_supported(device_path, DEVICE_INTF)) { + Device *device = g_object_new(DEVICE_TYPE, "DBusObjectPath", device_path, NULL); + g_print("[Adapter: %s (%s)] Device created: %s (%s)\n", adapter_get_name(adapter), adapter_get_address(adapter), device_get_alias(device), device_get_address(device)); + capture_device(device); + } else { + g_print("[Adapter: %s (%s)]* Device created: %s\n", adapter_get_name(adapter), adapter_get_address(adapter), device_path); + } } static void adapter_device_disappeared(Adapter *adapter, const gchar *address, gpointer data) { + //g_print("adapter_device_disappeared()\n"); + g_print("[Adapter: %s (%s)] Device disappeared: %s\n", adapter_get_name(adapter), adapter_get_address(adapter), address); } static void adapter_device_found(Adapter *adapter, const gchar *address, GHashTable *values, gpointer data) { + //g_print("adapter_device_found()\n"); + g_print("[Adapter: %s (%s)] Device found:\n", adapter_get_name(adapter), adapter_get_address(adapter)); g_print("[%s]\n", address); g_print(" Name: %s\n", g_value_get_string(g_hash_table_lookup(values, "Name"))); g_print(" Alias: %s\n", g_value_get_string(g_hash_table_lookup(values, "Alias"))); g_print(" Address: %s\n", g_value_get_string(g_hash_table_lookup(values, "Address"))); + g_print(" Icon: %s\n", g_value_get_string(g_hash_table_lookup(values, "Icon"))); g_print(" Class: 0x%x\n", g_value_get_uint(g_hash_table_lookup(values, "Class"))); g_print(" LegacyPairing: %d\n", g_value_get_boolean(g_hash_table_lookup(values, "LegacyPairing"))); g_print(" Paired: %d\n", g_value_get_boolean(g_hash_table_lookup(values, "Paired"))); @@ -117,16 +137,22 @@ static void adapter_device_found(Adapter *adapter, const gchar *address, GHashTa static void adapter_device_removed(Adapter *adapter, const gchar *device_path, gpointer data) { + //g_print("adapter_device_removed()\n"); + GSList *t2 = g_hash_table_lookup(captured_devices_services_t, device_path); if (t2 != NULL) { Device *device = DEVICE(g_slist_nth_data(t2, 0)); g_print("[Adapter: %s (%s)] Device removed: %s (%s)\n", adapter_get_name(adapter), adapter_get_address(adapter), device_get_alias(device), device_get_address(device)); - release_device(device, TRUE); + release_device(device); + } else { + g_print("[Adapter: %s (%s)]* Device removed: %s\n", adapter_get_name(adapter), adapter_get_address(adapter), device_path); } } static void adapter_property_changed(Adapter *adapter, const gchar *name, const GValue *value, gpointer data) { + //g_print("adapter_property_changed()\n"); + g_print("[Adapter: %s (%s)] Property changed: %s", adapter_get_name(adapter), adapter_get_address(adapter), name); if (G_VALUE_HOLDS_BOOLEAN(value)) { g_print(" -> %d\n", g_value_get_boolean(value)); @@ -146,21 +172,29 @@ static void adapter_property_changed(Adapter *adapter, const gchar *name, const */ static void device_disconnect_requested(Device *device, gpointer data) { + //g_print("device_disconnect_requested()\n"); + g_print("[Device: %s (%s)] Disconnect requested\n", device_get_alias(device), device_get_address(device)); } static void device_node_created(Device *device, const gchar *node, gpointer data) { + //g_print("device_node_created()\n"); + g_print("[Device: %s (%s)] Node created: %s\n", device_get_alias(device), device_get_address(device), node); } static void device_node_removed(Device *device, const gchar *node, gpointer data) { + //g_print("device_node_removed()\n"); + g_print("[Device: %s (%s)] Node removed: %s\n", device_get_alias(device), device_get_address(device), node); } static void device_property_changed(Device *device, const gchar *name, const GValue *value, gpointer data) { + //g_print("device_property_changed()\n"); + g_print("[Device: %s (%s)] Property changed: %s", device_get_alias(device), device_get_address(device), name); if (G_VALUE_HOLDS_BOOLEAN(value)) { g_print(" -> %d\n", g_value_get_boolean(value)); @@ -173,6 +207,10 @@ static void device_property_changed(Device *device, const gchar *name, const GVa } else { g_print("\n"); } + + if (g_strcmp0(name, "UUIDs") == 0) { + reload_device_services(device); + } } /* @@ -180,6 +218,8 @@ static void device_property_changed(Device *device, const gchar *name, const GVa */ static void audio_property_changed(Audio *audio, const gchar *name, const GValue *value, gpointer data) { + //g_print("audio_property_changed()\n"); + Device *device = DEVICE(data); g_print("[Device: %s (%s)] Audio property changed: %s", device_get_alias(device), device_get_address(device), name); if (G_VALUE_HOLDS_BOOLEAN(value)) { @@ -197,6 +237,8 @@ static void audio_property_changed(Audio *audio, const gchar *name, const GValue static void input_property_changed(Input *input, const gchar *name, const GValue *value, gpointer data) { + //g_print("input_property_changed()\n"); + Device *device = DEVICE(data); g_print("[Device: %s (%s)] Input property changed: %s", device_get_alias(device), device_get_address(device), name); if (G_VALUE_HOLDS_BOOLEAN(value)) { @@ -214,6 +256,8 @@ static void input_property_changed(Input *input, const gchar *name, const GValue static void network_property_changed(Network *network, const gchar *name, const GValue *value, gpointer data) { + //g_print("network_property_changed()\n"); + Device *device = DEVICE(data); g_print("[Device: %s (%s)] Network property changed: %s", device_get_alias(device), device_get_address(device), name); if (G_VALUE_HOLDS_BOOLEAN(value)) { @@ -234,6 +278,8 @@ static void network_property_changed(Network *network, const gchar *name, const */ static void capture_adapter(Adapter *adapter) { + //g_print("capture_adapter()\n"); + g_assert(ADAPTER_IS(adapter)); GSList *t = g_slist_append(NULL, adapter); @@ -257,16 +303,16 @@ static void capture_adapter(Adapter *adapter) static void release_adapter(Adapter *adapter) { + //g_print("release_adapter()\n"); + g_assert(ADAPTER_IS(adapter)); GSList *t = g_hash_table_lookup(captured_adapters_devices_t, adapter_get_dbus_object_path(adapter)); - while (g_slist_length(t) > 1) { Device *device = DEVICE(g_slist_nth_data(t, 1)); - t = g_slist_remove(t, device); - release_device(device, FALSE); + release_device(device); + t = g_hash_table_lookup(captured_adapters_devices_t, adapter_get_dbus_object_path(adapter)); } - g_slist_free(t); g_hash_table_remove(captured_adapters_devices_t, adapter_get_dbus_object_path(adapter)); g_object_unref(adapter); @@ -274,18 +320,22 @@ static void release_adapter(Adapter *adapter) static void capture_device(Device *device) { + //g_print("capture_device()\n"); + g_assert(DEVICE_IS(device)); GSList *t = g_hash_table_lookup(captured_adapters_devices_t, device_get_adapter(device)); if (t == NULL) { - g_printerr("[error:capture_device()] Uncaptured adapter: %s\n", device_get_adapter(device)); + Adapter *adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", device_get_adapter(device), NULL); + g_printerr("[Device: %s (%s)] Uncaptured adapter: %s (%s)\n", device_get_alias(device), device_get_address(device), adapter_get_name(adapter), adapter_get_address(adapter)); + g_object_unref(adapter); return; } t = g_slist_append(t, device); GSList *t2 = g_hash_table_lookup(captured_devices_services_t, device_get_dbus_object_path(device)); if (t2 != NULL) { - g_printerr("[error:capture_device()] Already captured device: %s\n", device_get_dbus_object_path(device)); + g_printerr("[Device: %s (%s)] Already captured device\n", device_get_alias(device), device_get_address(device)); return; } t2 = g_slist_append(t2, device); @@ -295,6 +345,52 @@ static void capture_device(Device *device) g_signal_connect(device, "NodeRemoved", G_CALLBACK(device_node_removed), NULL); g_signal_connect(device, "PropertyChanged", G_CALLBACK(device_property_changed), NULL); + g_hash_table_insert(captured_adapters_devices_t, device_get_adapter(device), t); + g_hash_table_insert(captured_devices_services_t, device_get_dbus_object_path(device), t2); + + reload_device_services(device); +} + +static void release_device(Device *device) +{ + //g_print("release_device()\n"); + + g_assert(DEVICE_IS(device)); + + GSList *t = g_hash_table_lookup(captured_adapters_devices_t, device_get_adapter(device)); + if (t != NULL) { + t = g_slist_remove(t, device); + g_hash_table_insert(captured_adapters_devices_t, device_get_adapter(device), t); + } + + GSList *t2 = g_hash_table_lookup(captured_devices_services_t, device_get_dbus_object_path(device)); + while (g_slist_length(t2) > 1) { + GObject *service = g_slist_nth_data(t2, 1); + t2 = g_slist_remove(t2, service); + g_object_unref(service); + } + g_slist_free(t2); + g_hash_table_remove(captured_devices_services_t, device_get_dbus_object_path(device)); + + g_object_unref(device); +} + +static void reload_device_services(Device *device) +{ + //g_print("reload_device_services()\n"); + + GSList *t2 = g_hash_table_lookup(captured_devices_services_t, device_get_dbus_object_path(device)); + if (t2 == NULL) { + g_printerr("[Device: %s (%s)] Uncaptured device\n", device_get_alias(device), device_get_address(device)); + return; + } + + while (g_slist_length(t2) > 1) { + GObject *service = g_slist_nth_data(t2, 1); + t2 = g_slist_remove(t2, service); + g_object_unref(service); + } + // Capturing signals from available services if (intf_is_supported(device_get_dbus_object_path(device), AUDIO_INTF)) { Audio *audio = g_object_new(AUDIO_TYPE, "DBusObjectPath", device_get_dbus_object_path(device), NULL); @@ -315,30 +411,6 @@ static void capture_device(Device *device) g_hash_table_insert(captured_devices_services_t, device_get_dbus_object_path(device), t2); } -static void release_device(Device *device, gboolean full_release) -{ - g_assert(DEVICE_IS(device)); - - GSList *t2 = g_hash_table_lookup(captured_devices_services_t, device_get_dbus_object_path(device)); - - while (g_slist_length(t2) > 1) { - GObject *service = g_slist_nth_data(t2, 1); - t2 = g_slist_remove(t2, service); - g_object_unref(service); - } - - g_slist_free(t2); - g_hash_table_remove(captured_devices_services_t, device_get_dbus_object_path(device)); - - if (full_release) { - GSList *t = g_hash_table_lookup(captured_adapters_devices_t, device_get_adapter(device)); - t = g_slist_remove(t, device); - g_hash_table_insert(captured_adapters_devices_t, device_get_adapter(device), t); - } - - g_object_unref(device); -} - static GOptionEntry entries[] = { {"adapter", 'a', 0, G_OPTION_ARG_STRING, &adapter_arg, "Adapter name or MAC", ""}, {NULL} @@ -399,6 +471,8 @@ int main(int argc, char *argv[]) g_signal_connect(manager, "DefaultAdapterChanged", G_CALLBACK(manager_default_adapter_changed), NULL); g_signal_connect(manager, "PropertyChanged", G_CALLBACK(manager_property_changed), NULL); + g_print("Monitor registered\n"); + GMainLoop *mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); @@ -406,6 +480,7 @@ int main(int argc, char *argv[]) g_main_loop_unref(mainloop); g_object_unref(manager); + dbus_disconnect(); exit(EXIT_SUCCESS); } diff --git a/src/bt-network.c b/src/bt-network.c index 8368a91..f7cd678 100644 --- a/src/bt-network.c +++ b/src/bt-network.c @@ -32,7 +32,9 @@ static void network_property_changed(Network *network, const gchar *name, const GValue *value, gpointer data) { + g_assert(data != NULL); GMainLoop *mainloop = data; + if (g_strcmp0(name, "Connected") == 0) { if (g_value_get_boolean(value) == TRUE) { g_print("Network service is connected\n"); @@ -143,7 +145,7 @@ int main(int argc, char *argv[]) g_free(intf); } g_print("Interface: %s\n", network_get_interface(network)); - g_print("UUID: %s (%s)\n", get_uuid_name(network_get_uuid(network)), network_get_uuid(network)); + g_print("UUID: %s (%s)\n", uuid2name(network_get_uuid(network)), network_get_uuid(network)); } else if (disconnect_arg) { if (network_get_connected(network) == FALSE) { g_print("Network service is already disconnected\n"); @@ -199,7 +201,7 @@ int main(int argc, char *argv[]) g_print("[Service: GN]\n"); g_print(" Name: %s\n", network_hub_get_name(hub)); g_print(" Enabled: %d\n", network_hub_get_enabled(hub)); - g_print(" UUID: %s (%s)\n", get_uuid_name(network_hub_get_uuid(hub)), network_hub_get_uuid(hub)); + g_print(" UUID: %s (%s)\n", uuid2name(network_hub_get_uuid(hub)), network_hub_get_uuid(hub)); } else { GHashTable *props = network_hub_get_properties(hub, &error); exit_if_error(error); @@ -229,7 +231,7 @@ int main(int argc, char *argv[]) g_print("[Service: PANU]\n"); g_print(" Name: %s\n", network_peer_get_name(peer)); g_print(" Enabled: %d\n", network_peer_get_enabled(peer)); - g_print(" UUID: %s (%s)\n", get_uuid_name(network_peer_get_uuid(peer)), network_peer_get_uuid(peer)); + g_print(" UUID: %s (%s)\n", uuid2name(network_peer_get_uuid(peer)), network_peer_get_uuid(peer)); } else { GHashTable *props = network_peer_get_properties(peer, &error); exit_if_error(error); @@ -259,12 +261,12 @@ int main(int argc, char *argv[]) g_print("[Service: NAP]\n"); g_print(" Name: %s\n", network_router_get_name(router)); g_print(" Enabled: %d\n", network_router_get_enabled(router)); - g_print(" UUID: %s (%s)\n", get_uuid_name(network_router_get_uuid(router)), network_router_get_uuid(router)); + g_print(" UUID: %s (%s)\n", uuid2name(network_router_get_uuid(router)), network_router_get_uuid(router)); } else { GHashTable *props = network_router_get_properties(router, &error); exit_if_error(error); GValue *old_value = g_hash_table_lookup(props, service_property_arg); - //g_assert(old_value != NULL); + g_assert(old_value != NULL); if (G_VALUE_HOLDS_STRING(old_value)) { g_print("%s: %s -> %s\n", service_property_arg, g_value_get_string(old_value), g_value_get_string(&v)); } else if (G_VALUE_HOLDS_BOOLEAN(old_value)) { @@ -289,6 +291,7 @@ int main(int argc, char *argv[]) } g_object_unref(adapter); + dbus_disconnect(); exit(EXIT_SUCCESS); } diff --git a/src/bt-serial.c b/src/bt-serial.c index 7007cbe..5cb71b0 100644 --- a/src/bt-serial.c +++ b/src/bt-serial.c @@ -128,6 +128,7 @@ int main(int argc, char *argv[]) g_object_unref(serial); g_object_unref(device); g_object_unref(adapter); + dbus_disconnect(); exit(EXIT_SUCCESS); } diff --git a/src/lib/agent.c b/src/lib/agent.c index 90d64d3..5781c0d 100644 --- a/src/lib/agent.c +++ b/src/lib/agent.c @@ -26,6 +26,8 @@ #endif #include +#include +#include #include #include "dbus-common.h" @@ -67,6 +69,8 @@ static void agent_init(Agent *self) g_assert(conn != NULL); dbus_g_connection_register_g_object(conn, DBUS_AGENT_PATH, G_OBJECT(self)); + + g_print("Agent registered\n"); } /* Methods */ @@ -85,7 +89,10 @@ gboolean agent_request_pin_code(Agent *self, const gchar *device, gchar **ret, G *ret = g_new0(gchar, 17); g_print("Enter PIN code: "); - scanf("%16s", *ret); + errno = 0; + if (scanf("%16s", *ret) == EOF && errno) { + g_warning("%s\n", strerror(errno)); + } return TRUE; } @@ -96,7 +103,10 @@ gboolean agent_request_passkey(Agent *self, const gchar *device, guint *ret, GEr g_object_unref(device_obj); g_print("Enter passkey: "); - scanf("%u", ret); + errno = 0; + if (scanf("%u", ret) == EOF && errno) { + g_warning("%s\n", strerror(errno)); + } return TRUE; } @@ -118,7 +128,10 @@ gboolean agent_request_confirmation(Agent *self, const gchar *device, guint pass gchar yn[4] = {0,}; g_print("Confirm passkey: %u (yes/no)? ", passkey); - scanf("%3s", yn); + errno = 0; + if (scanf("%3s", yn) == EOF && errno) { + g_warning("%s\n", strerror(errno)); + } if (g_strcmp0(yn, "y") == 0 || g_strcmp0(yn, "yes") == 0) { return TRUE; } else { @@ -138,8 +151,11 @@ gboolean agent_authorize(Agent *self, const gchar *device, const gchar *uuid, GE g_object_unref(device_obj); gchar yn[4] = {0,}; - g_print("Authorize a connection to: %s (yes/no)? ", get_uuid_name(uuid)); - scanf("%3s", yn); + g_print("Authorize a connection to: %s (yes/no)? ", uuid2name(uuid)); + errno = 0; + if (scanf("%3s", yn) == EOF && errno) { + g_warning("%s\n", strerror(errno)); + } if (g_strcmp0(yn, "y") == 0 || g_strcmp0(yn, "yes") == 0) { return TRUE; } else { @@ -156,7 +172,10 @@ gboolean agent_confirm_mode_change(Agent *self, const gchar *mode, GError **erro { gchar yn[4] = {0,}; g_print("Confirm mode change: %s (yes/no)? ", mode); - scanf("%3s", yn); + errno = 0; + if (scanf("%3s", yn) == EOF && errno) { + g_warning("%s\n", strerror(errno)); + } if (g_strcmp0(yn, "y") == 0 || g_strcmp0(yn, "yes") == 0) { return TRUE; } else { diff --git a/src/lib/bluez-dbus.h b/src/lib/bluez-dbus.h index 9f67361..c5c8d03 100644 --- a/src/lib/bluez-dbus.h +++ b/src/lib/bluez-dbus.h @@ -31,8 +31,8 @@ /* Local includes */ #include "dbus-common.h" #include "helpers.h" -#include "sdp.h" #include "marshallers.h" +#include "sdp.h" /* Bluez DBus Interfaces */ #include "adapter.h" diff --git a/src/lib/helpers.c b/src/lib/helpers.c index d62c503..67a12f5 100644 --- a/src/lib/helpers.c +++ b/src/lib/helpers.c @@ -37,78 +37,81 @@ typedef struct { gchar *uuid; gchar *name; + gchar *alt_name; } uuid_name_lookup_table_t; static uuid_name_lookup_table_t uuid_name_lookup_table[] = { - {"00001000-0000-1000-8000-00805F9B34FB", "ServiceDiscoveryServerService"}, - {"00001001-0000-1000-8000-00805F9B34FB", "BrowseGroupDescriptorService"}, - {"00001002-0000-1000-8000-00805F9B34FB", "PublicBrowseGroupService"}, - {"00001101-0000-1000-8000-00805F9B34FB", "SerialPortService"}, - {"00001102-0000-1000-8000-00805F9B34FB", "LANAccessUsingPPPService"}, - {"00001103-0000-1000-8000-00805F9B34FB", "DialupNetworkingService"}, - {"00001104-0000-1000-8000-00805F9B34FB", "IrMCSyncService"}, - {"00001105-0000-1000-8000-00805F9B34FB", "OBEXObjectPushService"}, - {"00001106-0000-1000-8000-00805F9B34FB", "OBEXFileTransferService"}, - {"00001107-0000-1000-8000-00805F9B34FB", "IrMCSyncCommandService"}, - {"00001108-0000-1000-8000-00805F9B34FB", "HeadsetService"}, - {"00001109-0000-1000-8000-00805F9B34FB", "CordlessTelephonyService"}, - {"0000110A-0000-1000-8000-00805F9B34FB", "AudioSourceService"}, - {"0000110B-0000-1000-8000-00805F9B34FB", "AudioSinkService"}, - {"0000110C-0000-1000-8000-00805F9B34FB", "AVRemoteControlTargetService"}, - {"0000110D-0000-1000-8000-00805F9B34FB", "AdvancedAudioDistributionService"}, - {"0000110E-0000-1000-8000-00805F9B34FB", "AVRemoteControlService"}, - {"0000110F-0000-1000-8000-00805F9B34FB", "VideoConferencingService"}, - {"00001110-0000-1000-8000-00805F9B34FB", "IntercomService"}, - {"00001111-0000-1000-8000-00805F9B34FB", "FaxService"}, - {"00001112-0000-1000-8000-00805F9B34FB", "HeadsetAudioGatewayService"}, - {"00001113-0000-1000-8000-00805F9B34FB", "WAPService"}, - {"00001114-0000-1000-8000-00805F9B34FB", "WAPClientService"}, - {"00001115-0000-1000-8000-00805F9B34FB", "PANUService"}, - {"00001116-0000-1000-8000-00805F9B34FB", "NAPService"}, - {"00001117-0000-1000-8000-00805F9B34FB", "GNService"}, - {"00001118-0000-1000-8000-00805F9B34FB", "DirectPrintingService"}, - {"00001119-0000-1000-8000-00805F9B34FB", "ReferencePrintingService"}, - {"0000111A-0000-1000-8000-00805F9B34FB", "ImagingService"}, - {"0000111B-0000-1000-8000-00805F9B34FB", "ImagingResponderService"}, - {"0000111C-0000-1000-8000-00805F9B34FB", "ImagingAutomaticArchiveService"}, - {"0000111D-0000-1000-8000-00805F9B34FB", "ImagingReferenceObjectsService"}, - {"0000111E-0000-1000-8000-00805F9B34FB", "HandsfreeService"}, - {"0000111F-0000-1000-8000-00805F9B34FB", "HandsfreeAudioGatewayService"}, - {"00001120-0000-1000-8000-00805F9B34FB", "DirectPrintingReferenceObjectsService"}, - {"00001121-0000-1000-8000-00805F9B34FB", "ReflectedUIService"}, - {"00001122-0000-1000-8000-00805F9B34FB", "BasicPringingService"}, - {"00001123-0000-1000-8000-00805F9B34FB", "PrintingStatusService"}, - {"00001124-0000-1000-8000-00805F9B34FB", "HumanInterfaceDeviceService"}, - {"00001125-0000-1000-8000-00805F9B34FB", "HardcopyCableReplacementService"}, - {"00001126-0000-1000-8000-00805F9B34FB", "HCRPrintService"}, - {"00001127-0000-1000-8000-00805F9B34FB", "HCRScanService"}, - {"00001128-0000-1000-8000-00805F9B34FB", "CommonISDNAccessService"}, - {"00001129-0000-1000-8000-00805F9B34FB", "VideoConferencingGWService"}, - {"0000112A-0000-1000-8000-00805F9B34FB", "UDIMTService"}, - {"0000112B-0000-1000-8000-00805F9B34FB", "UDITAService"}, - {"0000112C-0000-1000-8000-00805F9B34FB", "AudioVideoService"}, - {"00001200-0000-1000-8000-00805F9B34FB", "PnPInformationService"}, - {"00001201-0000-1000-8000-00805F9B34FB", "GenericNetworkingService"}, - {"00001202-0000-1000-8000-00805F9B34FB", "GenericFileTransferService"}, - {"00001203-0000-1000-8000-00805F9B34FB", "GenericAudioService"}, - {"00001203-0000-1000-8000-00805F9B34FB", "GenericAudioService"}, - {"00001204-0000-1000-8000-00805F9B34FB", "GenericTelephonyService"}, - {"00001205-0000-1000-8000-00805F9B34FB", "UPnPService"}, - {"00001206-0000-1000-8000-00805F9B34FB", "UPnPIpService"}, - {"00001300-0000-1000-8000-00805F9B34FB", "ESdpUPnPIpPanService"}, - {"00001301-0000-1000-8000-00805F9B34FB", "ESdpUPnPIpLapService"}, - {"00001302-0000-1000-8000-00805F9B34FB", "EdpUPnpIpL2CAPService"}, + {"00001000-0000-1000-8000-00805F9B34FB", "ServiceDiscoveryServer", NULL}, + {"00001001-0000-1000-8000-00805F9B34FB", "BrowseGroupDescriptor", NULL}, + {"00001002-0000-1000-8000-00805F9B34FB", "PublicBrowseGroup", NULL}, + {"00001101-0000-1000-8000-00805F9B34FB", "SerialPort", "Serial"}, + {"00001102-0000-1000-8000-00805F9B34FB", "LANAccessUsingPPP", NULL}, + {"00001103-0000-1000-8000-00805F9B34FB", "DialupNetworking", "DUN"}, + {"00001104-0000-1000-8000-00805F9B34FB", "IrMCSync", NULL}, + {"00001105-0000-1000-8000-00805F9B34FB", "OBEXObjectPush", NULL}, + {"00001106-0000-1000-8000-00805F9B34FB", "OBEXFileTransfer", NULL}, + {"00001107-0000-1000-8000-00805F9B34FB", "IrMCSyncCommand", NULL}, + {"00001108-0000-1000-8000-00805F9B34FB", "Headset", NULL}, + {"00001109-0000-1000-8000-00805F9B34FB", "CordlessTelephony", NULL}, + {"0000110A-0000-1000-8000-00805F9B34FB", "AudioSource", NULL}, + {"0000110B-0000-1000-8000-00805F9B34FB", "AudioSink", NULL}, + {"0000110C-0000-1000-8000-00805F9B34FB", "AVRemoteControlTarget", NULL}, + {"0000110D-0000-1000-8000-00805F9B34FB", "AdvancedAudioDistribution", "A2DP"}, + {"0000110E-0000-1000-8000-00805F9B34FB", "AVRemoteControl", NULL}, + {"0000110F-0000-1000-8000-00805F9B34FB", "VideoConferencing", NULL}, + {"00001110-0000-1000-8000-00805F9B34FB", "Intercom", NULL}, + {"00001111-0000-1000-8000-00805F9B34FB", "Fax", NULL}, + {"00001112-0000-1000-8000-00805F9B34FB", "HeadsetAudioGateway", NULL}, + {"00001113-0000-1000-8000-00805F9B34FB", "WAP", NULL}, + {"00001114-0000-1000-8000-00805F9B34FB", "WAPClient", NULL}, + {"00001115-0000-1000-8000-00805F9B34FB", "PANU", NULL}, + {"00001116-0000-1000-8000-00805F9B34FB", "NAP", NULL}, + {"00001117-0000-1000-8000-00805F9B34FB", "GN", NULL}, + {"00001118-0000-1000-8000-00805F9B34FB", "DirectPrinting", NULL}, + {"00001119-0000-1000-8000-00805F9B34FB", "ReferencePrinting", NULL}, + {"0000111A-0000-1000-8000-00805F9B34FB", "Imaging", NULL}, + {"0000111B-0000-1000-8000-00805F9B34FB", "ImagingResponder", NULL}, + {"0000111C-0000-1000-8000-00805F9B34FB", "ImagingAutomaticArchive", NULL}, + {"0000111D-0000-1000-8000-00805F9B34FB", "ImagingReferenceObjects", NULL}, + {"0000111E-0000-1000-8000-00805F9B34FB", "Handsfree", NULL}, + {"0000111F-0000-1000-8000-00805F9B34FB", "HandsfreeAudioGateway", NULL}, + {"00001120-0000-1000-8000-00805F9B34FB", "DirectPrintingReferenceObjects", NULL}, + {"00001121-0000-1000-8000-00805F9B34FB", "ReflectedUI", NULL}, + {"00001122-0000-1000-8000-00805F9B34FB", "BasicPringing", NULL}, + {"00001123-0000-1000-8000-00805F9B34FB", "PrintingStatus", NULL}, + {"00001124-0000-1000-8000-00805F9B34FB", "HumanInterfaceDevice", "HID"}, + {"00001125-0000-1000-8000-00805F9B34FB", "HardcopyCableReplacement", NULL}, + {"00001126-0000-1000-8000-00805F9B34FB", "HCRPrint", NULL}, + {"00001127-0000-1000-8000-00805F9B34FB", "HCRScan", NULL}, + {"00001128-0000-1000-8000-00805F9B34FB", "CommonISDNAccess", NULL}, + {"00001129-0000-1000-8000-00805F9B34FB", "VideoConferencingGW", NULL}, + {"0000112A-0000-1000-8000-00805F9B34FB", "UDIMT", NULL}, + {"0000112B-0000-1000-8000-00805F9B34FB", "UDITA", NULL}, + {"0000112C-0000-1000-8000-00805F9B34FB", "AudioVideo", NULL}, + {"00001200-0000-1000-8000-00805F9B34FB", "PnPInformation", NULL}, + {"00001201-0000-1000-8000-00805F9B34FB", "GenericNetworking", NULL}, + {"00001202-0000-1000-8000-00805F9B34FB", "GenericFileTransfer", NULL}, + {"00001203-0000-1000-8000-00805F9B34FB", "GenericAudio", NULL}, + {"00001204-0000-1000-8000-00805F9B34FB", "GenericTelephony", NULL}, + {"00001205-0000-1000-8000-00805F9B34FB", "UPnP", NULL}, + {"00001206-0000-1000-8000-00805F9B34FB", "UPnPIp", NULL}, + {"00001300-0000-1000-8000-00805F9B34FB", "ESdpUPnPIpPan", NULL}, + {"00001301-0000-1000-8000-00805F9B34FB", "ESdpUPnPIpLap", NULL}, + {"00001302-0000-1000-8000-00805F9B34FB", "EdpUPnpIpL2CAP", NULL}, // Custom: - {"0000112F-0000-1000-8000-00805F9B34FB", "PhoneBookAccessService"}, - {"831C4071-7BC8-4A9C-A01C-15DF25A4ADBC", "ActiveSyncService"}, + {"0000112F-0000-1000-8000-00805F9B34FB", "PhoneBookAccess", NULL}, + {"831C4071-7BC8-4A9C-A01C-15DF25A4ADBC", "ActiveSync", NULL}, }; #define UUID_NAME_LOOKUP_TABLE_SIZE \ (sizeof(uuid_name_lookup_table)/sizeof(uuid_name_lookup_table_t)) -const gchar *get_uuid_name(const gchar *uuid) +const gchar *uuid2name(const gchar *uuid) { + if (uuid == NULL || strlen(uuid) == 0) + return NULL; + for (int i = 0; i < UUID_NAME_LOOKUP_TABLE_SIZE; i++) { if (g_ascii_strcasecmp(uuid_name_lookup_table[i].uuid, uuid) == 0) return uuid_name_lookup_table[i].name; @@ -117,6 +120,22 @@ const gchar *get_uuid_name(const gchar *uuid) return uuid; } +const gchar *name2uuid(const gchar *name) +{ + if (name == NULL || strlen(name) == 0) + return NULL; + + for (int i = 0; i < UUID_NAME_LOOKUP_TABLE_SIZE; i++) { + if ( + g_ascii_strcasecmp(uuid_name_lookup_table[i].name, name) == 0 || + (uuid_name_lookup_table[i].alt_name && g_ascii_strcasecmp(uuid_name_lookup_table[i].alt_name, name) == 0) + ) + return uuid_name_lookup_table[i].uuid; + } + + return name; +} + Adapter *find_adapter(const gchar *name, GError **error) { gchar *adapter_path = NULL; @@ -228,6 +247,9 @@ gboolean intf_is_supported(const gchar *dbus_object_path, int intf_id) gchar *check_intf_regex_str = NULL; switch (intf_id) { + case DEVICE_INTF: + check_intf_regex_str = g_strconcat("", NULL); + break; case AUDIO_INTF: check_intf_regex_str = g_strconcat("", NULL); break; diff --git a/src/lib/helpers.h b/src/lib/helpers.h index 2ec0797..acffb3b 100644 --- a/src/lib/helpers.h +++ b/src/lib/helpers.h @@ -38,6 +38,8 @@ #include "serial.h" enum { + DEVICE_INTF, + AUDIO_INTF, INPUT_INTF, NETWORK_INTF, @@ -66,7 +68,8 @@ inline int xtoi(const gchar *str) { return i; } -const gchar *get_uuid_name(const gchar *uuid); +const gchar *uuid2name(const gchar *uuid); +const gchar *name2uuid(const gchar *name); /* Interface helpers */ gboolean intf_is_supported(const gchar *dbus_object_path, int intf_id); -- cgit v1.2.1