Date: Thursday, May 6, 2010 @ 09:03:33 Author: jgc Revision: 79735 upgpkg: dbus-glib 0.86-1 Update to 0.86, remove upstream-applied patch
Modified: dbus-glib/trunk/PKGBUILD Deleted: dbus-glib/trunk/duplicate-object-fixes.patch ------------------------------+ PKGBUILD | 16 - duplicate-object-fixes.patch | 418 ----------------------------------------- 2 files changed, 7 insertions(+), 427 deletions(-) Modified: PKGBUILD =================================================================== --- PKGBUILD 2010-05-06 12:52:39 UTC (rev 79734) +++ PKGBUILD 2010-05-06 13:03:33 UTC (rev 79735) @@ -2,24 +2,22 @@ # Maintainer: Jan de Groot <j...@archlinux.org> pkgname=dbus-glib -pkgver=0.82 -pkgrel=2 +pkgver=0.86 +pkgrel=1 pkgdesc="GLib bindings for DBUS" arch=(i686 x86_64) license=('GPL') url="http://www.freedesktop.org/wiki/Software/DBusBindings" -depends=('dbus-core>=1.2.16' 'glib2>=2.22.2') +depends=('dbus-core>=1.2.24' 'glib2>=2.24.1') makedepends=('pkgconfig') options=('!libtool' '!emptydirs') -source=(http://dbus.freedesktop.org/releases/${pkgname}/${pkgname}-${pkgver}.tar.gz - duplicate-object-fixes.patch) -md5sums=('aa2a4517de0e9144be3bce2cf8cdd924' - 'fd4cdbe0d6d6dfc51b5ab6b220d49f9e') +source=(http://dbus.freedesktop.org/releases/${pkgname}/${pkgname}-${pkgver}.tar.gz) +md5sums=('cd0ab148fb0c786fc88be49d19971f50') build() { cd "${srcdir}/${pkgname}-${pkgver}" - patch -Np1 -i "${srcdir}/duplicate-object-fixes.patch" || return 1 - ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-static=no --enable-bash-completion=no || return 1 + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \ + --enable-static=no --enable-bash-completion=no || return 1 make || return 1 make DESTDIR="${pkgdir}" install || return 1 } Deleted: duplicate-object-fixes.patch =================================================================== --- duplicate-object-fixes.patch 2010-05-06 12:52:39 UTC (rev 79734) +++ duplicate-object-fixes.patch 2010-05-06 13:03:33 UTC (rev 79735) @@ -1,418 +0,0 @@ -From: Colin Walters <walt...@verbum.org> -Date: Wed, 19 Aug 2009 17:27:53 +0000 (-0400) -Subject: Support duplicate object registrations -X-Git-Url: http://git.collabora.co.uk/?p=user%2Fwjt%2Fdbus-glib-wjt.git;a=commitdiff_plain;h=0263b72669de710e0adda419a520ae9f123a1be9 - -Support duplicate object registrations - -Before commit e869fda4, we semi-supported registering the -same object multiple times. We'd accept messages for both paths, -however when signals were emitted, they'd both use the first object -path. - -That commit simply disallowed multiple registrations, which broke -backwards compatibility with some projects like PolicyKit which -had the same object registered with different paths. - -With this commit, explicitly allow and support multiple registrations. -The primary change is that signals are now emitted once for each -registration path of an object, using the correct path. ---- - -diff --git a/dbus/dbus-gobject.c b/dbus/dbus-gobject.c -index f0c4df8..fb41168 100644 ---- a/dbus/dbus-gobject.c -+++ b/dbus/dbus-gobject.c -@@ -407,9 +407,16 @@ object_registration_free (ObjectRegistration *o) - { - if (o->object != NULL) - { -+ GSList *registrations; -+ -+ /* Ok, the object is still around; clear out this particular registration -+ * from the registrations list. -+ */ -+ registrations = g_object_steal_data (o->object, "dbus_glib_object_registrations"); -+ registrations = g_slist_remove (registrations, o); -+ g_object_set_data (o->object, "dbus_glib_object_registrations", registrations); -+ - g_object_weak_unref (o->object, object_registration_object_died, o); -- g_object_steal_data (o->object, "dbus_glib_object_registration"); -- o->object = NULL; - } - - g_free (o->object_path); -@@ -1741,30 +1748,19 @@ dbus_g_signal_closure_finalize (gpointer data, - } - - static void --signal_emitter_marshaller (GClosure *closure, -- GValue *retval, -- guint n_param_values, -- const GValue *param_values, -- gpointer invocation_hint, -- gpointer marshal_data) -+emit_signal_for_registration (ObjectRegistration *o, -+ DBusGSignalClosure *sigclosure, -+ GValue *retval, -+ guint n_param_values, -+ const GValue *param_values) - { -- DBusGSignalClosure *sigclosure; - DBusMessage *signal; - DBusMessageIter iter; - guint i; -- const char *path; -- -- sigclosure = (DBusGSignalClosure *) closure; -- -- g_assert (retval == NULL); -- -- path = _dbus_gobject_get_path (sigclosure->object); - -- g_assert (path != NULL); -- -- signal = dbus_message_new_signal (path, -- sigclosure->sigiface, -- sigclosure->signame); -+ signal = dbus_message_new_signal (o->object_path, -+ sigclosure->sigiface, -+ sigclosure->signame); - if (!signal) - { - g_error ("out of memory"); -@@ -1777,20 +1773,45 @@ signal_emitter_marshaller (GClosure *closure, - for (i = 1; i < n_param_values; i++) - { - if (!_dbus_gvalue_marshal (&iter, -- (GValue *) (&(param_values[i])))) -- { -- g_warning ("failed to marshal parameter %d for signal %s", -- i, sigclosure->signame); -- goto out; -- } -+ (GValue *) (&(param_values[i])))) -+ { -+ g_warning ("failed to marshal parameter %d for signal %s", -+ i, sigclosure->signame); -+ goto out; -+ } - } - dbus_connection_send (DBUS_CONNECTION_FROM_G_CONNECTION (sigclosure->connection), -- signal, NULL); -- out: -+ signal, NULL); -+out: - dbus_message_unref (signal); - } - - static void -+signal_emitter_marshaller (GClosure *closure, -+ GValue *retval, -+ guint n_param_values, -+ const GValue *param_values, -+ gpointer invocation_hint, -+ gpointer marshal_data) -+{ -+ DBusGSignalClosure *sigclosure; -+ GSList *registrations, *iter; -+ -+ sigclosure = (DBusGSignalClosure *) closure; -+ -+ g_assert (retval == NULL); -+ -+ registrations = g_object_get_data (sigclosure->object, "dbus_glib_object_registrations"); -+ -+ for (iter = registrations; iter; iter = iter->next) -+ { -+ ObjectRegistration *o = iter->data; -+ -+ emit_signal_for_registration (o, sigclosure, retval, n_param_values, param_values); -+ } -+} -+ -+static void - export_signals (DBusGConnection *connection, const GList *info_list, GObject *object) - { - GType gtype; -@@ -2092,14 +2113,18 @@ void - dbus_g_connection_unregister_g_object (DBusGConnection *connection, - GObject *object) - { -- ObjectRegistration *o; -+ GList *registrations, *iter; - -- o = g_object_get_data (object, "dbus_glib_object_registration"); -+ registrations = g_object_get_data (object, "dbus_glib_object_registrations"); - -- g_return_if_fail (o != NULL); -+ g_return_if_fail (registrations != NULL); - -- dbus_connection_unregister_object_path (DBUS_CONNECTION_FROM_G_CONNECTION (o->connection), -- o->object_path); -+ for (iter = registrations; iter; iter = iter->next) -+ { -+ ObjectRegistration *o = iter->data; -+ dbus_connection_unregister_object_path (DBUS_CONNECTION_FROM_G_CONNECTION (o->connection), -+ o->object_path); -+ } - } - - /** -@@ -2116,6 +2141,9 @@ dbus_g_connection_unregister_g_object (DBusGConnection *connection, - * The registration will be cancelled if either the #DBusConnection or - * the #GObject gets finalized, or if dbus_g_connection_unregister_g_object() - * is used. -+ * -+ * Note: If an object is registered multiple times, the first registration -+ * takes priority for cases such as turning an object into an object path. - */ - void - dbus_g_connection_register_g_object (DBusGConnection *connection, -@@ -2123,28 +2151,44 @@ dbus_g_connection_register_g_object (DBusGConnection *connection, - GObject *object) - { - GList *info_list; -+ GSList *registrations, *iter; - ObjectRegistration *o; -+ gboolean is_first_registration; - - g_return_if_fail (connection != NULL); - g_return_if_fail (at_path != NULL); - g_return_if_fail (G_IS_OBJECT (object)); - -- info_list = lookup_object_info (object); -- if (info_list == NULL) -+ /* This is a GSList of ObjectRegistration* */ -+ registrations = g_object_steal_data (object, "dbus_glib_object_registrations"); -+ -+ for (iter = registrations; iter; iter = iter->next) - { -- g_warning ("No introspection data registered for object class \"%s\"", -- g_type_name (G_TYPE_FROM_INSTANCE (object))); -- return; -+ o = iter->data; -+ -+ /* Silently ignore duplicate registrations */ -+ if (strcmp (o->object_path, at_path) == 0) -+ return; - } - -- o = g_object_get_data (object, "dbus_glib_object_registration"); -+ is_first_registration = registrations == NULL; - -- if (o != NULL) -+ /* This is used to hook up signals below, but we do this check -+ * before trying to register the object to make sure we have -+ * introspection data for it. -+ */ -+ if (is_first_registration) - { -- g_warning ("Object already registered at %s, can't re-register at %s", -- o->object_path, at_path); -- return; -+ info_list = lookup_object_info (object); -+ if (info_list == NULL) -+ { -+ g_warning ("No introspection data registered for object class \"%s\"", -+ g_type_name (G_TYPE_FROM_INSTANCE (object))); -+ return; -+ } - } -+ else -+ info_list = NULL; - - o = object_registration_new (connection, at_path, object); - -@@ -2155,12 +2199,22 @@ dbus_g_connection_register_g_object (DBusGConnection *connection, - { - g_error ("Failed to register GObject with DBusConnection"); - object_registration_free (o); -+ g_list_free (info_list); - return; - } - -- export_signals (connection, info_list, object); -- g_list_free (info_list); -- g_object_set_data (object, "dbus_glib_object_registration", o); -+ if (is_first_registration) -+ { -+ /* This adds a hook into every signal for the object. Only do this -+ * on the first registration, because inside the signal marshaller -+ * we emit a signal for each registration. -+ */ -+ export_signals (connection, info_list, object); -+ g_list_free (info_list); -+ } -+ -+ registrations = g_slist_append (registrations, o); -+ g_object_set_data (object, "dbus_glib_object_registrations", registrations); - } - - /** -@@ -2539,15 +2593,20 @@ dbus_g_method_return_error (DBusGMethodInvocation *context, const GError *error) - g_free (context); - } - --const char * _dbus_gobject_get_path (GObject *obj) -+const char * -+_dbus_gobject_get_path (GObject *obj) - { -+ GSList *registrations; - ObjectRegistration *o; - -- o = g_object_get_data (obj, "dbus_glib_object_registration"); -+ registrations = g_object_get_data (obj, "dbus_glib_object_registrations"); - -- if (o == NULL) -+ if (registrations == NULL) - return NULL; - -+ /* First one to have been registered wins */ -+ o = registrations->data; -+ - return o->object_path; - } - -diff --git a/test/core/test-dbus-glib.c b/test/core/test-dbus-glib.c -index c6071a7..288606f 100644 ---- a/test/core/test-dbus-glib.c -+++ b/test/core/test-dbus-glib.c -@@ -15,6 +15,7 @@ static const char *await_terminating_service = NULL; - static int n_times_foo_received = 0; - static int n_times_frobnicate_received = 0; - static int n_times_frobnicate_received_2 = 0; -+static int n_times_compat_frobnicate_received = 0; - static int n_times_sig0_received = 0; - static int n_times_sig1_received = 0; - static int n_times_sig2_received = 0; -@@ -139,6 +140,20 @@ frobnicate_signal_handler_2 (DBusGProxy *proxy, - } - - static void -+frobnicate_signal_handler_compat (DBusGProxy *proxy, -+ int val, -+ void *user_data) -+{ -+ n_times_compat_frobnicate_received += 1; -+ -+ g_assert (val == 42); -+ g_print ("Got Frobnicate signal (compat)\n"); -+ -+ g_main_loop_quit (loop); -+ g_source_remove (exit_timeout); -+} -+ -+static void - sig0_signal_handler (DBusGProxy *proxy, - const char *str0, - int val, -@@ -1886,6 +1901,32 @@ main (int argc, char **argv) - - run_mainloop (); - -+ /* Tests for a "compatibilty" object path. This is the same object as above, just -+ * at a different path. -+ */ -+ proxy = dbus_g_proxy_new_for_name_owner (connection, -+ "org.freedesktop.DBus.GLib.TestService", -+ "/org/freedesktop/DBus/GLib/Tests/Compat/MyTestObjectCompat", -+ "org.freedesktop.DBus.GLib.Tests.MyObject", -+ &error); -+ dbus_g_proxy_add_signal (proxy, "Frobnicate", G_TYPE_INT, G_TYPE_INVALID); -+ -+ dbus_g_proxy_connect_signal (proxy, "Frobnicate", -+ G_CALLBACK (frobnicate_signal_handler_compat), -+ NULL, NULL); -+ -+ g_print ("Calling EmitFrobnicate (compat)\n"); -+ if (!dbus_g_proxy_call (proxy, "EmitFrobnicate", &error, -+ G_TYPE_INVALID, G_TYPE_INVALID)) -+ lose_gerror ("Failed to complete EmitFrobnicate call on compat proxy", error); -+ -+ g_main_loop_run (loop); -+ -+ if (n_times_compat_frobnicate_received != 1) -+ lose ("Frobnicate signal received %d times for compat proxy, should have been 1", n_times_compat_frobnicate_received); -+ -+ g_object_unref (proxy); -+ - /* Test introspection */ - proxy = dbus_g_proxy_new_for_name_owner (connection, - "org.freedesktop.DBus.GLib.TestService", -diff --git a/test/core/test-service-glib.c b/test/core/test-service-glib.c -index 1cdb0ac..fad2473 100644 ---- a/test/core/test-service-glib.c -+++ b/test/core/test-service-glib.c -@@ -66,6 +66,10 @@ main (int argc, char **argv) - dbus_g_connection_register_g_object (connection, - "/org/freedesktop/DBus/GLib/Tests/MyTestObject", - obj); -+ /* Register a second time; we want the object to also be reachable through this interface */ -+ dbus_g_connection_register_g_object (connection, -+ "/org/freedesktop/DBus/GLib/Tests/Compat/MyTestObjectCompat", -+ obj); - dbus_g_connection_register_g_object (connection, - "/org/freedesktop/DBus/GLib/Tests/MyTestObject2", - obj2); -From: Will Thompson <will.thomp...@collabora.co.uk> -Date: Sat, 12 Sep 2009 10:28:25 +0000 (+0100) -Subject: Only re-set registration list if it's non-empty -X-Git-Url: http://git.collabora.co.uk/?p=user%2Fwjt%2Fdbus-glib-wjt.git;a=commitdiff_plain;h=39e2642e41b2293de7556fa15c57872f78ffcdc8 - -Only re-set registration list if it's non-empty ---- - -diff --git a/dbus/dbus-gobject.c b/dbus/dbus-gobject.c -index fb41168..85574c7 100644 ---- a/dbus/dbus-gobject.c -+++ b/dbus/dbus-gobject.c -@@ -414,7 +414,9 @@ object_registration_free (ObjectRegistration *o) - */ - registrations = g_object_steal_data (o->object, "dbus_glib_object_registrations"); - registrations = g_slist_remove (registrations, o); -- g_object_set_data (o->object, "dbus_glib_object_registrations", registrations); -+ -+ if (registrations != NULL) -+ g_object_set_data (o->object, "dbus_glib_object_registrations", registrations); - - g_object_weak_unref (o->object, object_registration_object_died, o); - } -From: Will Thompson <will.thomp...@collabora.co.uk> -Date: Sat, 12 Sep 2009 10:58:22 +0000 (+0100) -Subject: Copy object registration list when unregistering. -X-Git-Url: http://git.collabora.co.uk/?p=user%2Fwjt%2Fdbus-glib-wjt.git;a=commitdiff_plain;h=90e2199ac99f5b8ab0cd5f45dcb398ecf9af03d9 - -Copy object registration list when unregistering. - -Since the list of registrations on the object is modified when each path -is removed, iterating it directly is wrong: after the first pass of the -loop, 'iter' would point to a link which has been freed. ---- - -diff --git a/dbus/dbus-gobject.c b/dbus/dbus-gobject.c -index 85574c7..816194c 100644 ---- a/dbus/dbus-gobject.c -+++ b/dbus/dbus-gobject.c -@@ -2117,7 +2117,10 @@ dbus_g_connection_unregister_g_object (DBusGConnection *connection, - { - GList *registrations, *iter; - -- registrations = g_object_get_data (object, "dbus_glib_object_registrations"); -+ /* Copy the list before iterating it: it will be modified in -+ * object_registration_free() each time an object path is unregistered. -+ */ -+ registrations = g_list_copy (g_object_get_data (object, "dbus_glib_object_registrations")); - - g_return_if_fail (registrations != NULL); - -@@ -2127,6 +2130,9 @@ dbus_g_connection_unregister_g_object (DBusGConnection *connection, - dbus_connection_unregister_object_path (DBUS_CONNECTION_FROM_G_CONNECTION (o->connection), - o->object_path); - } -+ -+ g_list_free (registrations); -+ g_assert (g_object_get_data (object, "dbus_glib_object_registrations") == NULL); - } - - /**