diff options
author | Nicolas Dufresne <nicolas.dufresne@collabora.com> | 2011-10-14 14:07:17 -0400 |
---|---|---|
committer | Nicolas Dufresne <nicolas.dufresne@collabora.com> | 2011-10-14 17:49:49 -0400 |
commit | 0216bb188d24f51ba563d7d06295e9c263bfd5be (patch) | |
tree | d6fe06e2513bcdad765b4a27e07e3ecc0de7bcb0 /logger | |
parent | ba16a3788ad0eabacb0ba5a8f5cc3b84c7788c90 (diff) |
Fix observer singleton and select features
Diffstat (limited to 'logger')
-rw-r--r-- | logger/configure.ac | 2 | ||||
-rw-r--r-- | logger/src/telepathy-logger.c | 10 | ||||
-rw-r--r-- | logger/telepathy-logger/call-channel.c | 4 | ||||
-rw-r--r-- | logger/telepathy-logger/observer-internal.h | 2 | ||||
-rw-r--r-- | logger/telepathy-logger/observer.c | 73 | ||||
-rw-r--r-- | logger/telepathy-logger/streamed-media-channel.c | 4 | ||||
-rw-r--r-- | logger/telepathy-logger/text-channel.c | 4 | ||||
-rw-r--r-- | logger/tests/dbus/test-tpl-observer.c | 4 |
8 files changed, 59 insertions, 44 deletions
diff --git a/logger/configure.ac b/logger/configure.ac index 2ee6eabd7..75aaba91e 100644 --- a/logger/configure.ac +++ b/logger/configure.ac @@ -69,7 +69,7 @@ AC_COPYRIGHT([ GLIB_REQUIRED=2.25.11 DBUS_REQUIRED=1.1.0 DBUS_GLIB_REQUIRED=0.82 -TELEPATHY_GLIB_REQUIRED=0.14.0 +TELEPATHY_GLIB_REQUIRED=0.15.6 # Warning if GLib/GDK/GTK headers are included AC_DEFINE(G_DISABLE_SINGLE_INCLUDES, [], [Disable single includes for GLib]) diff --git a/logger/src/telepathy-logger.c b/logger/src/telepathy-logger.c index e0548f765..e47b4ed52 100644 --- a/logger/src/telepathy-logger.c +++ b/logger/src/telepathy-logger.c @@ -187,7 +187,15 @@ main (int argc, DEBUG ("- TplCallChannel registered."); #endif /* ENABLE_CALL */ - observer = _tpl_observer_new (); + + observer = _tpl_observer_dup (&error); + + if (observer == NULL) { + g_critical ("Failed to create observer: %s", error->message); + g_error_free (error); + goto out; + } + DEBUG ("Registering channel factory into TplObserver"); _tpl_observer_set_channel_factory (observer, _tpl_channel_factory_build); diff --git a/logger/telepathy-logger/call-channel.c b/logger/telepathy-logger/call-channel.c index 9775f7bc0..4dbc142b0 100644 --- a/logger/telepathy-logger/call-channel.c +++ b/logger/telepathy-logger/call-channel.c @@ -527,7 +527,9 @@ channel_invalidated_cb (TpProxy *proxy, gpointer user_data) { TplChannel *tpl_chan = TPL_CHANNEL (user_data); - TplObserver *observer = _tpl_observer_new (); + TplObserver *observer = _tpl_observer_dup (NULL); + + g_return_if_fail (observer); PATH_DEBUG (tpl_chan, "%s #%d %s", g_quark_to_string (domain), code, message); diff --git a/logger/telepathy-logger/observer-internal.h b/logger/telepathy-logger/observer-internal.h index 856e26aa1..972b03bc3 100644 --- a/logger/telepathy-logger/observer-internal.h +++ b/logger/telepathy-logger/observer-internal.h @@ -60,7 +60,7 @@ typedef struct GType _tpl_observer_get_type (void); -TplObserver * _tpl_observer_new (void); +TplObserver * _tpl_observer_dup (GError **error); gboolean _tpl_observer_unregister_channel (TplObserver *self, TplChannel *channel); diff --git a/logger/telepathy-logger/observer.c b/logger/telepathy-logger/observer.c index fcb18b874..318805c50 100644 --- a/logger/telepathy-logger/observer.c +++ b/logger/telepathy-logger/observer.c @@ -291,36 +291,12 @@ tpl_observer_get_property (GObject *object, } } -/* Singleton Constructor */ -static GObject * -tpl_observer_constructor (GType type, - guint n_props, - GObjectConstructParam *props) -{ - GObject *retval; - - if (observer_singleton) - retval = g_object_ref (observer_singleton); - else - { - retval = G_OBJECT_CLASS (_tpl_observer_parent_class)->constructor (type, - n_props, props); - - observer_singleton = TPL_OBSERVER (retval); - g_object_add_weak_pointer (retval, (gpointer *) & observer_singleton); - } - - return retval; -} - - static void _tpl_observer_class_init (TplObserverClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); TpBaseClientClass *base_clt_cls = TP_BASE_CLIENT_CLASS (klass); - object_class->constructor = tpl_observer_constructor; object_class->dispose = tpl_observer_dispose; object_class->get_property = tpl_observer_get_property; @@ -431,22 +407,47 @@ tpl_observer_dispose (GObject *obj) TplObserver * -_tpl_observer_new (void) +_tpl_observer_dup (GError **error) { - TpDBusDaemon *dbus; - TplObserver *result; + /* WARNING Not thread safe */ + if (G_UNLIKELY (observer_singleton == NULL)) + { + GError *dbus_error = NULL; + TpDBusDaemon *dbus = tp_dbus_daemon_dup (&dbus_error); + TpSimpleClientFactory *factory; + + if (dbus == NULL) + { + g_propagate_error (error, dbus_error); + return NULL; + } + + factory = (TpSimpleClientFactory *) tp_automatic_client_factory_new (dbus); + + /* Pre-select feature to be initialized. */ + tp_simple_client_factory_add_contact_features_varargs (factory, + TP_CONTACT_FEATURE_ALIAS, + TP_CONTACT_FEATURE_AVATAR_TOKEN, + TP_CONTACT_FEATURE_INVALID); - dbus = tp_dbus_daemon_dup (NULL); - g_return_val_if_fail (dbus != NULL, NULL); + observer_singleton = g_object_new (TPL_TYPE_OBSERVER, + "factory", factory, + "name", "Logger", + "uniquify-name", FALSE, + NULL); - result = g_object_new (TPL_TYPE_OBSERVER, - "dbus-daemon", dbus, - "name", "Logger", - "uniquify-name", FALSE, - NULL); + g_object_add_weak_pointer (G_OBJECT (observer_singleton), + (gpointer *) &observer_singleton); + + g_object_unref (dbus); + g_object_unref (factory); + } + else + { + g_object_ref (observer_singleton); + } - g_object_unref (dbus); - return result; + return observer_singleton; } /** diff --git a/logger/telepathy-logger/streamed-media-channel.c b/logger/telepathy-logger/streamed-media-channel.c index b51b6392d..15d831dce 100644 --- a/logger/telepathy-logger/streamed-media-channel.c +++ b/logger/telepathy-logger/streamed-media-channel.c @@ -474,7 +474,9 @@ on_channel_invalidated_cb (TpProxy *proxy, gpointer user_data) { TplChannel *tpl_chan = TPL_CHANNEL (user_data); - TplObserver *observer = _tpl_observer_new (); + TplObserver *observer = _tpl_observer_dup (NULL); + + g_return_if_fail (observer); PATH_DEBUG (tpl_chan, "%s #%d %s", g_quark_to_string (domain), code, message); diff --git a/logger/telepathy-logger/text-channel.c b/logger/telepathy-logger/text-channel.c index 2eba42749..97615751a 100644 --- a/logger/telepathy-logger/text-channel.c +++ b/logger/telepathy-logger/text-channel.c @@ -287,7 +287,9 @@ on_channel_invalidated_cb (TpProxy *proxy, gpointer user_data) { TplChannel *tpl_chan = TPL_CHANNEL (user_data); - TplObserver *observer = _tpl_observer_new (); + TplObserver *observer = _tpl_observer_dup (NULL); + + g_return_if_fail (observer); PATH_DEBUG (tpl_chan, "%s #%d %s", g_quark_to_string (domain), code, message); diff --git a/logger/tests/dbus/test-tpl-observer.c b/logger/tests/dbus/test-tpl-observer.c index 5e07bb96b..b15811e2f 100644 --- a/logger/tests/dbus/test-tpl-observer.c +++ b/logger/tests/dbus/test-tpl-observer.c @@ -21,11 +21,11 @@ main (int argc, char **argv) g_type_init (); - obs = _tpl_observer_new (); + obs = _tpl_observer_dup (NULL); /* TplObserver is a singleton, be sure both references point to the same * memory address */ - obs2 = _tpl_observer_new (); + obs2 = _tpl_observer_dup (NULL); g_assert (obs == obs2); /* unref the second singleton pointer and check that the it is still |