summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Zeuthen <davidz@redhat.com>2010-09-15 17:39:23 -0400
committerDavid Zeuthen <davidz@redhat.com>2010-09-15 17:39:23 -0400
commit83b1a040309d5378713903e398a00eeca1af4f89 (patch)
tree9871a4cbed908be825834f46b53ab35275a89bb0
parent50423cbfa2320310169a6a685949d1036c62914f (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.list3
-rw-r--r--src/gdbusproxymanager.c178
-rw-r--r--src/gdbusproxymanager.h32
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];