[Telepathy-commits] [telepathy-glib/master] Until constructor has run, constructor is responsible for queueing .manager file read
Simon McVittie
simon.mcvittie at collabora.co.uk
Thu Feb 12 08:59:59 PST 2009
This means that tp_connection_manager_find_manager_file can never
be called with name = NULL.
---
telepathy-glib/connection-manager.c | 49 +++++++++++++++++++++++-----------
1 files changed, 33 insertions(+), 16 deletions(-)
diff --git a/telepathy-glib/connection-manager.c b/telepathy-glib/connection-manager.c
index 68eb22f..5437858 100644
--- a/telepathy-glib/connection-manager.c
+++ b/telepathy-glib/connection-manager.c
@@ -185,6 +185,9 @@ struct _TpConnectionManagerPrivate {
/* source ID for introspecting later */
guint introspect_idle_id;
+ /* FALSE if constructor hasn't run yet */
+ unsigned constructed:1;
+
/* TRUE if we're waiting for ListProtocols */
unsigned listing_protocols:1;
@@ -986,9 +989,7 @@ tp_connection_manager_find_manager_file (const gchar *name)
gchar *filename;
const gchar * const * data_dirs;
- /* if no name yet, do nothing */
- if (name == NULL)
- return NULL;
+ g_assert (name != NULL);
filename = g_strdup_printf ("%s/telepathy/managers/%s.manager",
g_get_user_data_dir (), name);
@@ -1049,9 +1050,13 @@ tp_connection_manager_constructor (GType type,
tp_connection_manager_find_manager_file (self->name);
}
- if (self->priv->manager_file_read_idle_id == 0)
- self->priv->manager_file_read_idle_id = g_idle_add (
- tp_connection_manager_idle_read_manager_file, self);
+ g_assert (self->priv->manager_file_read_idle_id == 0);
+
+ self->priv->manager_file_read_idle_id = g_idle_add (
+ tp_connection_manager_idle_read_manager_file, self);
+
+ /* Unfreeze automatic reading of .manager file if manager-file changes */
+ self->priv->constructed = TRUE;
return (GObject *) self;
}
@@ -1148,28 +1153,40 @@ tp_connection_manager_set_property (GObject *object,
GParamSpec *pspec)
{
TpConnectionManager *self = TP_CONNECTION_MANAGER (object);
- const gchar *tmp;
switch (property_id)
{
case PROP_MANAGER_FILE:
g_free (self->priv->manager_file);
- tmp = g_value_get_string (value);
- if (tmp == NULL)
+ /* If the constructor has already run, change the definition of where
+ * we expect to find the .manager file and trigger re-introspection.
+ * Otherwise, just take the value - _constructor queues the first-time
+ * manager file lookup anyway.
+ */
+ if (self->priv->constructed)
{
- self->priv->manager_file =
- tp_connection_manager_find_manager_file (self->name);
+ const gchar *tmp = g_value_get_string (value);
+
+ if (tmp == NULL)
+ {
+ self->priv->manager_file =
+ tp_connection_manager_find_manager_file (self->name);
+ }
+ else
+ {
+ self->priv->manager_file = g_strdup (tmp);
+ }
+
+ if (self->priv->manager_file_read_idle_id == 0)
+ self->priv->manager_file_read_idle_id = g_idle_add (
+ tp_connection_manager_idle_read_manager_file, self);
}
else
{
- self->priv->manager_file = g_strdup (tmp);
+ self->priv->manager_file = g_value_dup_string (value);
}
- if (self->priv->manager_file_read_idle_id == 0)
- self->priv->manager_file_read_idle_id = g_idle_add (
- tp_connection_manager_idle_read_manager_file, self);
-
break;
case PROP_ALWAYS_INTROSPECT:
--
1.5.6.5
More information about the telepathy-commits
mailing list