summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Orlenko <zxteam@gmail.com>2010-07-16 23:30:34 +1100
committerAlexander Orlenko <zxteam@gmail.com>2010-07-16 23:30:34 +1100
commit9cef574490407c149831be8c7c89e50f77eb813c (patch)
treed155c2d75e785c2a1ae6c20dd979223b60747695
parent604486754e362ebd3cae2e436ca102ed2a33b833 (diff)
downloadbluez-tools-9cef574490407c149831be8c7c89e50f77eb813c.tar.gz
Removed DeviceDisappeared signal (seem never called) in bt-adapter.cv0.1rc1v0.1-rc1v0.1
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
-rw-r--r--src/bt-adapter.c16
-rw-r--r--src/bt-agent.c6
-rw-r--r--src/bt-audio.c9
-rw-r--r--src/bt-device.c252
-rw-r--r--src/bt-input.c3
-rw-r--r--src/bt-monitor.c147
-rw-r--r--src/bt-network.c13
-rw-r--r--src/bt-serial.c1
-rw-r--r--src/lib/agent.c31
-rw-r--r--src/lib/bluez-dbus.h2
-rw-r--r--src/lib/helpers.c144
-rw-r--r--src/lib/helpers.h5
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", "<name|mac>"},
@@ -175,8 +236,9 @@ static GOptionEntry entries[] = {
{"connect", 'c', 0, G_OPTION_ARG_STRING, &connect_arg, "Connect to a device", "<mac>"},
{"remove", 'r', 0, G_OPTION_ARG_STRING, &remove_arg, "Remove device", "<name|mac>"},
{"info", 'i', 0, G_OPTION_ARG_STRING, &info_arg, "Get info about device", "<name|mac>"},
- {"services", 's', 0, G_OPTION_ARG_STRING, &services_arg, "Discover device services", "<name|mac>"},
+ {"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 <name|mac> [<pattern>]\n"
+ " Where `pattern` is an optional specific UUID\n\n"
"Set Options:\n"
" --set <name|mac> <property> <value>\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", "<name|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 <stdio.h>
+#include <errno.h>
+#include <string.h>
#include <glib.h>
#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("<interface name=\"", BLUEZ_DBUS_DEVICE_INTERFACE, "\">", NULL);
+ break;
case AUDIO_INTF:
check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_AUDIO_INTERFACE, "\">", 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);