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 | 5d28629e4324a370b383897716cc760cc1e9f1be (patch) | |
tree | fb1f40f15e06fd77f16a0da6abb3284e41e8d822 /telepathy-logger | |
parent | 589eac5c37a2dc5020e18fc9197cfcb2e5934f25 (diff) | |
download | telepathy-logger-5d28629e4324a370b383897716cc760cc1e9f1be.tar.gz |
Fix observer singleton and select features
Diffstat (limited to 'telepathy-logger')
-rw-r--r-- | telepathy-logger/call-channel.c | 4 | ||||
-rw-r--r-- | telepathy-logger/observer-internal.h | 2 | ||||
-rw-r--r-- | telepathy-logger/observer.c | 73 | ||||
-rw-r--r-- | telepathy-logger/streamed-media-channel.c | 4 | ||||
-rw-r--r-- | telepathy-logger/text-channel.c | 4 |
5 files changed, 47 insertions, 40 deletions
diff --git a/telepathy-logger/call-channel.c b/telepathy-logger/call-channel.c index 9775f7b..4dbc142 100644 --- a/telepathy-logger/call-channel.c +++ b/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/telepathy-logger/observer-internal.h b/telepathy-logger/observer-internal.h index 856e26a..972b03b 100644 --- a/telepathy-logger/observer-internal.h +++ b/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/telepathy-logger/observer.c b/telepathy-logger/observer.c index fcb18b8..318805c 100644 --- a/telepathy-logger/observer.c +++ b/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/telepathy-logger/streamed-media-channel.c b/telepathy-logger/streamed-media-channel.c index b51b639..15d831d 100644 --- a/telepathy-logger/streamed-media-channel.c +++ b/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/telepathy-logger/text-channel.c b/telepathy-logger/text-channel.c index 2eba427..9761575 100644 --- a/telepathy-logger/text-channel.c +++ b/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); |