summaryrefslogtreecommitdiffstats
path: root/plugins/bluetooth.c
diff options
context:
space:
mode:
authorGustavo F. Padovan <gustavo@padovan.org>2010-06-14 15:04:24 -0300
committerDenis Kenzior <denkenz@gmail.com>2010-06-17 05:06:55 -0500
commit4ccb481f4d46e9c53285594bd7941b7826f4f871 (patch)
tree36af8e8f9cbb522b0a2e54ebf206c2eb3bd08fe4 /plugins/bluetooth.c
parent5bf4bec526e59f1241a19edc8d299f237c3e091f (diff)
downloadofono-4ccb481f4d46e9c53285594bd7941b7826f4f871.tar.bz2
Add parse properties stuff to bluetooth.c
Diffstat (limited to 'plugins/bluetooth.c')
-rw-r--r--plugins/bluetooth.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/plugins/bluetooth.c b/plugins/bluetooth.c
index 46eb304d..254fe5be 100644
--- a/plugins/bluetooth.c
+++ b/plugins/bluetooth.c
@@ -93,6 +93,90 @@ fail:
return err;
}
+typedef void (*PropertyHandler)(DBusMessageIter *iter, gpointer user_data);
+
+struct property_handler {
+ const char *property;
+ PropertyHandler callback;
+ gpointer user_data;
+};
+
+static gint property_handler_compare(gconstpointer a, gconstpointer b)
+{
+ const struct property_handler *handler = a;
+ const char *property = b;
+
+ return strcmp(handler->property, property);
+}
+
+static void parse_properties_reply(DBusMessage *reply,
+ const char *property, ...)
+{
+ va_list args;
+ GSList *prop_handlers = NULL;
+ DBusMessageIter array, dict;
+
+ va_start(args, property);
+
+ while (property != NULL) {
+ struct property_handler *handler =
+ g_new0(struct property_handler, 1);
+
+ handler->property = property;
+ handler->callback = va_arg(args, PropertyHandler);
+ handler->user_data = va_arg(args, gpointer);
+
+ property = va_arg(args, const char *);
+
+ prop_handlers = g_slist_prepend(prop_handlers, handler);
+ }
+
+ va_end(args);
+
+ if (dbus_message_iter_init(reply, &array) == FALSE)
+ goto done;
+
+ if (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_ARRAY)
+ goto done;
+
+ dbus_message_iter_recurse(&array, &dict);
+
+ while (dbus_message_iter_get_arg_type(&dict) == DBUS_TYPE_DICT_ENTRY) {
+ DBusMessageIter entry, value;
+ const char *key;
+ GSList *l;
+
+ dbus_message_iter_recurse(&dict, &entry);
+
+ if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_STRING)
+ goto done;
+
+ dbus_message_iter_get_basic(&entry, &key);
+
+ dbus_message_iter_next(&entry);
+
+ if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_VARIANT)
+ goto done;
+
+ dbus_message_iter_recurse(&entry, &value);
+
+ l = g_slist_find_custom(prop_handlers, key,
+ property_handler_compare);
+
+ if (l) {
+ struct property_handler *handler = l->data;
+
+ handler->callback(&value, handler->user_data);
+ }
+
+ dbus_message_iter_next(&dict);
+ }
+
+done:
+ g_slist_foreach(prop_handlers, (GFunc)g_free, NULL);
+ g_slist_free(prop_handlers);
+}
+
int bluetooth_register_uuid(const char *uuid, struct bluetooth_profile *profile)
{
if (uuid_hash)