diff options
Diffstat (limited to 'hcid')
-rw-r--r-- | hcid/dbus-common.c | 104 | ||||
-rw-r--r-- | hcid/dbus-common.h | 9 |
2 files changed, 113 insertions, 0 deletions
diff --git a/hcid/dbus-common.c b/hcid/dbus-common.c index 1270a002..734e2100 100644 --- a/hcid/dbus-common.c +++ b/hcid/dbus-common.c @@ -337,3 +337,107 @@ int hcid_dbus_init(void) return 0; } + +static void dbus_message_iter_append_variant(DBusMessageIter *iter, + int type, void *val) +{ + DBusMessageIter value; + DBusMessageIter array; + char *sig; + + switch (type) { + case DBUS_TYPE_STRING: + sig = DBUS_TYPE_STRING_AS_STRING; + break; + case DBUS_TYPE_BYTE: + sig = DBUS_TYPE_BYTE_AS_STRING; + break; + case DBUS_TYPE_INT16: + sig = DBUS_TYPE_INT16_AS_STRING; + break; + case DBUS_TYPE_UINT16: + sig = DBUS_TYPE_UINT16_AS_STRING; + break; + case DBUS_TYPE_INT32: + sig = DBUS_TYPE_INT32_AS_STRING; + break; + case DBUS_TYPE_UINT32: + sig = DBUS_TYPE_UINT32_AS_STRING; + break; + case DBUS_TYPE_BOOLEAN: + sig = DBUS_TYPE_BOOLEAN_AS_STRING; + break; + case DBUS_TYPE_ARRAY: + sig = DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING; + break; + case DBUS_TYPE_OBJECT_PATH: + sig = DBUS_TYPE_OBJECT_PATH_AS_STRING; + break; + default: + error("Could not append variant with type %d", type); + return; + } + + dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, sig, &value); + + if (type == DBUS_TYPE_ARRAY) { + int i; + const char ***str_array = val; + + dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY, + DBUS_TYPE_STRING_AS_STRING, &array); + + for (i = 0; (*str_array)[i]; i++) + dbus_message_iter_append_basic(&array, DBUS_TYPE_STRING, + &((*str_array)[i])); + + dbus_message_iter_close_container(&value, &array); + } else + dbus_message_iter_append_basic(&value, type, val); + + dbus_message_iter_close_container(iter, &value); +} + +void dbus_message_iter_append_dict_entry(DBusMessageIter *dict, + const char *key, int type, void *val) +{ + DBusMessageIter entry; + + dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY, + NULL, &entry); + + dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key); + + dbus_message_iter_append_variant(&entry, type, val); + + dbus_message_iter_close_container(dict, &entry); +} + +dbus_bool_t dbus_connection_emit_property_changed(DBusConnection *conn, + const char *path, + const char *interface, + const char *name, + int type, void *value) +{ + DBusMessage *signal; + DBusMessageIter iter; + gboolean ret; + + signal = dbus_message_new_signal(path, interface, "PropertyChanged"); + + if (!signal) { + error("Unable to allocate new %s.PropertyChanged signal", + interface); + return FALSE; + } + + dbus_message_iter_init_append(signal, &iter); + + dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &name); + dbus_message_iter_append_variant(&iter, type, value); + + ret = dbus_connection_send(conn, signal, NULL); + + dbus_message_unref(signal); + return ret; +} diff --git a/hcid/dbus-common.h b/hcid/dbus-common.h index 54148f8f..26af83ee 100644 --- a/hcid/dbus-common.h +++ b/hcid/dbus-common.h @@ -37,3 +37,12 @@ int find_conn(int s, int dev_id, long arg); void hcid_dbus_exit(void); int hcid_dbus_init(void); + +void dbus_message_iter_append_dict_entry(DBusMessageIter *dict, + const char *key, int type, void *val); + +dbus_bool_t dbus_connection_emit_property_changed(DBusConnection *conn, + const char *path, + const char *interface, + const char *name, + int type, void *value); |