diff options
author | David Zeuthen <davidz@redhat.com> | 2010-09-15 17:39:23 -0400 |
---|---|---|
committer | David Zeuthen <davidz@redhat.com> | 2010-09-15 17:39:23 -0400 |
commit | 83b1a040309d5378713903e398a00eeca1af4f89 (patch) | |
tree | 9871a4cbed908be825834f46b53ab35275a89bb0 | |
parent | 50423cbfa2320310169a6a685949d1036c62914f (diff) |
Also emit object- and interface-proxy signals on the proxy manager
Signed-off-by: David Zeuthen <davidz@redhat.com>
-rw-r--r-- | src/gdbuscodegen-marshal.list | 3 | ||||
-rw-r--r-- | src/gdbusproxymanager.c | 178 | ||||
-rw-r--r-- | src/gdbusproxymanager.h | 32 |
3 files changed, 208 insertions, 5 deletions
diff --git a/src/gdbuscodegen-marshal.list b/src/gdbuscodegen-marshal.list index 845c635..97683c7 100644 --- a/src/gdbuscodegen-marshal.list +++ b/src/gdbuscodegen-marshal.list @@ -1 +1,4 @@ BOOLEAN:VARIANT,BOXED +VOID:OBJECT,OBJECT +VOID:OBJECT,OBJECT,STRING,STRING,VARIANT +VOID:OBJECT,OBJECT,VARIANT,BOXED diff --git a/src/gdbusproxymanager.c b/src/gdbusproxymanager.c index f59bdae..e8db471 100644 --- a/src/gdbusproxymanager.c +++ b/src/gdbusproxymanager.c @@ -90,6 +90,19 @@ * and the other half is from the new owner</quote></emphasis> problem * cannot happen. * + * To avoid having the application connect to signals on the returned + * #GDBusObjectProxy and #GDBusProxy objects, the + * #GDBusObjectProxy::interface-proxy-added, + * #GDBusObjectProxy::interface-proxy-removed, + * #GDBusProxy::g-properties-changed and + * #GDBusProxy::g-signal signals + * are also emitted on the #GDBusProxyManager instance managing these + * objects. The signals emitted are + * #GDBusProxyManager::interface-proxy-added, + * #GDBusProxyManager::interface-proxy-removed, + * #GDBusProxyManager::interface-proxy-properties-changed and + * #GDBusProxyManager::interface-proxy-signal. + * * Note that all callbacks and signals are emitted in the * <link linkend="g-main-context-push-thread-default">thread-default main loop</link> * that the #GDBusProxyManager object was constructed @@ -135,6 +148,10 @@ enum { OBJECT_PROXY_ADDED_SIGNAL, OBJECT_PROXY_REMOVED_SIGNAL, + INTERFACE_PROXY_ADDED_SIGNAL, + INTERFACE_PROXY_REMOVED_SIGNAL, + INTERFACE_PROXY_SIGNAL_SIGNAL, + INTERFACE_PROXY_PROPERTIES_CHANGED_SIGNAL, LAST_SIGNAL }; @@ -463,6 +480,131 @@ g_dbus_proxy_manager_class_init (GDBusProxyManagerClass *klass) 1, G_TYPE_DBUS_OBJECT_PROXY); + /** + * GDBusProxyManager::interface-proxy-added: + * @manager: The #GDBusProxyManager emitting the signal. + * @object_proxy: The #GDBusObjectProxy on which an interface was added. + * @interface_proxy: The #GDBusProxy that was added. + * + * Emitted when @interface_proxy is added to @object_proxy. + * + * This signal exists purely as a convenience to avoid having to + * connect signals to all object proxies managed by @manager. + * + * This signal is emitted in the + * <link linkend="g-main-context-push-thread-default">thread-default main loop</link> + * that @manager was constructed in. + */ + signals[INTERFACE_PROXY_ADDED_SIGNAL] = + g_signal_new ("interface-proxy-added", + G_TYPE_DBUS_PROXY_MANAGER, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusProxyManagerClass, interface_proxy_added), + NULL, + NULL, + _gdbuscodegen_marshal_VOID__OBJECT_OBJECT, + G_TYPE_NONE, + 2, + G_TYPE_DBUS_OBJECT_PROXY, + G_TYPE_DBUS_PROXY); + + /** + * GDBusProxyManager::interface-proxy-removed: + * @manager: The #GDBusProxyManager emitting the signal. + * @object_proxy: The #GDBusObjectProxy on which an interface was removed. + * @interface_proxy: The #GDBusProxy that was removed. + * + * Emitted when @interface_proxy has been removed from @object_proxy. + * + * This signal exists purely as a convenience to avoid having to + * connect signals to all object proxies managed by @manager. + * + * This signal is emitted in the + * <link linkend="g-main-context-push-thread-default">thread-default main loop</link> + * that @manager was constructed in. + */ + signals[INTERFACE_PROXY_REMOVED_SIGNAL] = + g_signal_new ("interface-proxy-removed", + G_TYPE_DBUS_PROXY_MANAGER, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusProxyManagerClass, interface_proxy_removed), + NULL, + NULL, + _gdbuscodegen_marshal_VOID__OBJECT_OBJECT, + G_TYPE_NONE, + 2, + G_TYPE_DBUS_OBJECT_PROXY, + G_TYPE_DBUS_PROXY); + + /** + * GDBusProxyManager::interface-proxy-signal: + * @manager: The #GDBusProxyManager emitting the signal. + * @object_proxy: The #GDBusObjectProxy on which an interface is emitting a D-Bus signal. + * @interface_proxy: The #GDBusProxy that is emitting a D-Bus signal. + * @sender_name: The sender of the signal or NULL if the connection is not a bus connection. + * @signal_name: The signal name. + * @parameters: A #GVariant tuple with parameters for the signal. + * + * Emitted when a D-Bus signal is received on @interface_proxy. + * + * This signal exists purely as a convenience to avoid having to + * connect signals to all interface proxies managed by @manager. + * + * This signal is emitted in the + * <link linkend="g-main-context-push-thread-default">thread-default main loop</link> + * that @manager was constructed in. + */ + signals[INTERFACE_PROXY_SIGNAL_SIGNAL] = + g_signal_new ("interface-proxy-signal", + G_TYPE_DBUS_PROXY_MANAGER, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusProxyManagerClass, interface_proxy_signal), + NULL, + NULL, + _gdbuscodegen_marshal_VOID__OBJECT_OBJECT_STRING_STRING_VARIANT, + G_TYPE_NONE, + 5, + G_TYPE_DBUS_OBJECT_PROXY, + G_TYPE_DBUS_PROXY, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_VARIANT); + + /** + * GDBusProxyManager::interface-proxy-properties-changed: + * @manager: The #GDBusProxyManager emitting the signal. + * @object_proxy: The #GDBusObjectProxy on which an interface has properties that are changing. + * @interface_proxy: The #GDBusProxy that has properties that are changing. + * @changed_properties: A #GVariant containing the properties that changed. + * @invalidated_properties: A %NULL terminated array of properties that was invalidated. + * + * Emitted when one or more D-Bus properties on proxy changes. The + * local cache has already been updated when this signal fires. Note + * that both @changed_properties and @invalidated_properties are + * guaranteed to never be %NULL (either may be empty though). + * + * This signal exists purely as a convenience to avoid having to + * connect signals to all interface proxies managed by @manager. + * + * This signal is emitted in the + * <link linkend="g-main-context-push-thread-default">thread-default main loop</link> + * that @manager was constructed in. + */ + signals[INTERFACE_PROXY_PROPERTIES_CHANGED_SIGNAL] = + g_signal_new ("interface-proxy-properties-changed", + G_TYPE_DBUS_PROXY_MANAGER, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusProxyManagerClass, interface_proxy_properties_changed), + NULL, + NULL, + _gdbuscodegen_marshal_VOID__OBJECT_OBJECT_VARIANT_BOXED, + G_TYPE_NONE, + 4, + G_TYPE_DBUS_OBJECT_PROXY, + G_TYPE_DBUS_PROXY, + G_TYPE_VARIANT, + G_TYPE_STRV); + g_type_class_add_private (klass, sizeof (GDBusProxyManagerPrivate)); } @@ -905,6 +1047,13 @@ signal_cb (GDBusConnection *connection, NULL); } /* ... and then synthesize the signal */ + g_signal_emit (manager, + signals[INTERFACE_PROXY_PROPERTIES_CHANGED_SIGNAL], + 0, + object_proxy, + interface_proxy, + changed_properties, + invalidated_properties); g_signal_emit_by_name (interface_proxy, "g-properties-changed", changed_properties, @@ -921,6 +1070,14 @@ signal_cb (GDBusConnection *connection, interface_proxy = g_dbus_object_proxy_lookup (object_proxy, interface_name); if (interface_proxy != NULL) { + g_signal_emit (manager, + signals[INTERFACE_PROXY_SIGNAL_SIGNAL], + 0, + object_proxy, + interface_proxy, + sender_name, + signal_name, + parameters); g_signal_emit_by_name (interface_proxy, "g-signal", sender_name, @@ -1265,6 +1422,12 @@ add_interfaces (GDBusProxyManager *manager, } _g_dbus_object_proxy_add_interface (op, interface_proxy); + if (!added) + g_signal_emit (manager, + signals[INTERFACE_PROXY_ADDED_SIGNAL], + 0, + op, + interface_proxy); g_object_unref (interface_proxy); } g_variant_unref (properties); @@ -1323,7 +1486,20 @@ remove_interfaces (GDBusProxyManager *manager, else { for (n = 0; interface_names != NULL && interface_names[n] != NULL; n++) - _g_dbus_object_proxy_remove_interface (op, interface_names[n]); + { + GDBusProxy *interface_proxy; + interface_proxy = g_dbus_object_proxy_lookup (op, interface_names[n]); + _g_dbus_object_proxy_remove_interface (op, interface_names[n]); + if (interface_proxy != NULL) + { + g_signal_emit (manager, + signals[INTERFACE_PROXY_REMOVED_SIGNAL], + 0, + op, + interface_proxy); + g_object_unref (interface_proxy); + } + } } out: ; diff --git a/src/gdbusproxymanager.h b/src/gdbusproxymanager.h index f23e65f..b43849b 100644 --- a/src/gdbusproxymanager.h +++ b/src/gdbusproxymanager.h @@ -57,6 +57,10 @@ struct _GDBusProxyManager * @parent_class: The parent class. * @object_proxy_added: Signal class handler for the #GDBusProxyManager::object-proxy-added signal. * @object_proxy_removed: Signal class handler for the #GDBusProxyManager::object-proxy-removed signal. + * @interface_proxy_added: Signal class handler for the #GDBusProxyManager::interface-proxy-added signal. + * @interface_proxy_removed: Signal class handler for the #GDBusProxyManager::interface-proxy-removed signal. + * @interface_proxy_signal: Signal class handler for the #GDBusProxyManager::interface-proxy-signal signal. + * @interface_proxy_properties_changed: Signal class handler for the #GDBusProxyManager::interface-proxy-properties-changed signal. * * Class structure for #GDBusProxyManager. */ @@ -65,10 +69,30 @@ struct _GDBusProxyManagerClass GObjectClass parent_class; /* signals */ - void (*object_proxy_added) (GDBusProxyManager *manager, - GDBusObjectProxy *object_proxy); - void (*object_proxy_removed) (GDBusProxyManager *manager, - GDBusObjectProxy *object_proxy); + void (*object_proxy_added) (GDBusProxyManager *manager, + GDBusObjectProxy *object_proxy); + void (*object_proxy_removed) (GDBusProxyManager *manager, + GDBusObjectProxy *object_proxy); + + void (*interface_proxy_added) (GDBusProxyManager *manager, + GDBusObjectProxy *object_proxy, + GDBusProxy *interface_proxy); + void (*interface_proxy_removed) (GDBusProxyManager *manager, + GDBusObjectProxy *object_proxy, + GDBusProxy *interface_proxy); + + void (*interface_proxy_signal) (GDBusProxyManager *manager, + GDBusObjectProxy *object_proxy, + GDBusProxy *interface_proxy, + const gchar *sender_name, + const gchar *signal_name, + GVariant *parameters); + + void (*interface_proxy_properties_changed) (GDBusProxyManager *manager, + GDBusObjectProxy *object_proxy, + GDBusProxy *interface_proxy, + GVariant *changed_properties, + const gchar* const *invalidated_properties); /*< private >*/ gpointer padding[8]; |