diff options
author | Johan Hedberg <johan.hedberg@nokia.com> | 2007-05-07 10:52:10 +0000 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2007-05-07 10:52:10 +0000 |
commit | 55466e2f43cf52b563954a9c2d1a722f6c646f7c (patch) | |
tree | 28d0addef2787b7b467e4fe4606cf4217ca55775 | |
parent | 9306a904c561b8d6552c0de2584ee875d2034751 (diff) |
Implement generic signal sending function which also checks for signal interface, name and paramter type conformance
-rw-r--r-- | common/dbus-helper.c | 90 | ||||
-rw-r--r-- | common/dbus-helper.h | 11 |
2 files changed, 101 insertions, 0 deletions
diff --git a/common/dbus-helper.c b/common/dbus-helper.c index 40cd3eac..fb7bce98 100644 --- a/common/dbus-helper.c +++ b/common/dbus-helper.c @@ -449,3 +449,93 @@ void dbus_message_iter_append_dict_entry(DBusMessageIter *dict, dbus_message_iter_close_container(dict, &entry); } + +dbus_bool_t dbus_connection_emit_signal_valist(DBusConnection *conn, + const char *path, + const char *interface, + const char *name, + int first, + va_list var_args) +{ + struct generic_data *data; + struct interface_data *iface; + DBusMessageIter iter; + DBusSignalVTable *sig_data; + DBusMessage *signal; + int type; + const char *args = NULL; + + if (dbus_connection_get_object_path_data(conn, path, + (void *) &data) == FALSE) { + error("dbus_connection_emit_signal: path %s isn't registered", path); + return FALSE; + } + + iface = find_interface(data->interfaces, interface); + + if (!iface) { + error("dbus_connection_emit_signal: %s does not implement %s", + path, interface); + return FALSE; + } + + for (sig_data = iface->signals; sig_data && sig_data->name; sig_data++) { + if (!strcmp(sig_data->name, name)) { + args = sig_data->signature; + break; + } + } + + if (!args) { + error("No signal named %s on interface %s", name, interface); + return FALSE; + } + + signal = dbus_message_new_signal(path, interface, name); + if (!signal) { + error("Unable to allocate new %s.%s signal", interface, name); + return FALSE; + } + + dbus_message_iter_init_append(signal, &iter); + + for (type = first; type != DBUS_TYPE_INVALID; + type = va_arg(var_args, int), args++) { + void *value; + + if (type != *args) { + error("Expected arg type '%c' but got '%c'", *args, type); + dbus_message_unref(signal); + return FALSE; + } + + value = va_arg(var_args, void *); + + if (!dbus_message_iter_append_basic(&iter, type, value)) { + error("Append property argument error (type %d)", type); + dbus_message_unref(signal); + return FALSE; + } + } + + dbus_connection_send(conn, signal, NULL); + dbus_message_unref(signal); + + return TRUE; +} + +dbus_bool_t dbus_connection_emit_signal(DBusConnection *conn, const char *path, + const char *interface, const char *name, + int first, ...) +{ + dbus_bool_t ret; + va_list var_args; + + va_start(var_args, first); + ret = dbus_connection_emit_signal_valist(conn, path, interface, name, + first, var_args); + va_end(var_args); + + return ret; +} + diff --git a/common/dbus-helper.h b/common/dbus-helper.h index 49db1c58..4dd9d155 100644 --- a/common/dbus-helper.h +++ b/common/dbus-helper.h @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ +#include <stdarg.h> #define DBUS_TYPE_STRING_ARRAY_AS_STRING (DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING) #define DBUS_TYPE_BYTE_ARRAY_AS_STRING (DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BYTE_AS_STRING) @@ -71,3 +72,13 @@ dbus_bool_t dbus_connection_unregister_interface(DBusConnection *connection, void dbus_message_iter_append_dict_entry(DBusMessageIter *dict, const char *key, int type, void *val); +dbus_bool_t dbus_connection_emit_signal(DBusConnection *conn, const char *path, + const char *interface, const char *name, + int first, ...); + +dbus_bool_t dbus_connection_emit_signal_valist(DBusConnection *conn, + const char *path, + const char *interface, + const char *name, + int first, + va_list var_args); |