]> git.0d.be Git - empathy.git/commitdiff
Add a concept of ready to the account manager
authorSjoerd Simons <sjoerd.simons@collabora.co.uk>
Wed, 15 Jul 2009 17:19:31 +0000 (18:19 +0100)
committerSjoerd Simons <sjoerd.simons@collabora.co.uk>
Thu, 16 Jul 2009 11:41:49 +0000 (12:41 +0100)
libempathy/empathy-account-manager.c
libempathy/empathy-account-manager.h

index dc15651cb3b7717a98762470a1eb8d72f2829f24..ed24e06230166be4cecc6783eff4fe28fde05358 100644 (file)
@@ -44,6 +44,7 @@ typedef struct {
   int               connected;
   int               connecting;
   gboolean          dispose_run;
   int               connected;
   int               connecting;
   gboolean          dispose_run;
+  gboolean          ready;
   TpProxySignalConnection *proxy_signal;
   TpAccountManager *tp_manager;
   TpDBusDaemon *dbus;
   TpProxySignalConnection *proxy_signal;
   TpAccountManager *tp_manager;
   TpDBusDaemon *dbus;
@@ -68,6 +69,10 @@ enum {
   LAST_SIGNAL
 };
 
   LAST_SIGNAL
 };
 
+enum {
+  PROP_READY = 1,
+};
+
 static guint signals[LAST_SIGNAL];
 static EmpathyAccountManager *manager_singleton = NULL;
 
 static guint signals[LAST_SIGNAL];
 static EmpathyAccountManager *manager_singleton = NULL;
 
@@ -215,6 +220,32 @@ signal:
       priv->global_presence, priv->global_status, priv->global_status_message);
 }
 
       priv->global_presence, priv->global_status, priv->global_status_message);
 }
 
+static void
+empathy_account_manager_check_ready (EmpathyAccountManager *manager)
+{
+  EmpathyAccountManagerPriv *priv = GET_PRIV (manager);
+  GHashTableIter iter;
+  gpointer value;
+
+  if (priv->ready)
+    return;
+
+  g_hash_table_iter_init (&iter, priv->accounts);
+  while (g_hash_table_iter_next (&iter, NULL, &value))
+    {
+      EmpathyAccount *account = EMPATHY_ACCOUNT (value);
+      gboolean ready;
+
+      g_object_get (account, "ready", &ready, NULL);
+
+      if (!ready)
+        return;
+    }
+
+  priv->ready = TRUE;
+  g_object_notify (G_OBJECT (manager), "ready");
+}
+
 static void
 emp_account_ready_cb (GObject *obj, GParamSpec *spec, gpointer user_data)
 {
 static void
 emp_account_ready_cb (GObject *obj, GParamSpec *spec, gpointer user_data)
 {
@@ -240,6 +271,8 @@ emp_account_ready_cb (GObject *obj, GParamSpec *spec, gpointer user_data)
 
   g_signal_connect (account, "presence-changed",
     G_CALLBACK (emp_account_presence_changed_cb), manager);
 
   g_signal_connect (account, "presence-changed",
     G_CALLBACK (emp_account_presence_changed_cb), manager);
+
+  empathy_account_manager_check_ready (manager);
 }
 
 static void
 }
 
 static void
@@ -263,7 +296,6 @@ account_manager_got_all_cb (TpProxy *proxy,
   accounts = tp_asv_get_boxed (properties, "ValidAccounts",
     EMPATHY_ARRAY_TYPE_OBJECT);
 
   accounts = tp_asv_get_boxed (properties, "ValidAccounts",
     EMPATHY_ARRAY_TYPE_OBJECT);
 
-
   for (i = 0; i < accounts->len; i++)
     {
       EmpathyAccount *account;
   for (i = 0; i < accounts->len; i++)
     {
       EmpathyAccount *account;
@@ -275,6 +307,8 @@ account_manager_got_all_cb (TpProxy *proxy,
       g_signal_connect (account, "notify::ready",
         G_CALLBACK (emp_account_ready_cb), manager);
     }
       g_signal_connect (account, "notify::ready",
         G_CALLBACK (emp_account_ready_cb), manager);
     }
+
+  empathy_account_manager_check_ready (manager);
 }
 
 static void
 }
 
 static void
@@ -391,6 +425,26 @@ do_constructor (GType type,
   return retval;
 }
 
   return retval;
 }
 
+static void
+do_get_property (GObject *object,
+    guint prop_id,
+    GValue *value,
+    GParamSpec *pspec)
+{
+  EmpathyAccountManager *manager = EMPATHY_ACCOUNT_MANAGER (object);
+  EmpathyAccountManagerPriv *priv = GET_PRIV (manager);
+
+  switch (prop_id)
+    {
+      case PROP_READY:
+        g_value_set_boolean (value, priv->ready);
+        break;
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+        break;
+    }
+}
+
 static void
 empathy_account_manager_class_init (EmpathyAccountManagerClass *klass)
 {
 static void
 empathy_account_manager_class_init (EmpathyAccountManagerClass *klass)
 {
@@ -399,6 +453,14 @@ empathy_account_manager_class_init (EmpathyAccountManagerClass *klass)
   oclass->finalize = do_finalize;
   oclass->dispose = do_dispose;
   oclass->constructor = do_constructor;
   oclass->finalize = do_finalize;
   oclass->dispose = do_dispose;
   oclass->constructor = do_constructor;
+  oclass->get_property = do_get_property;
+
+  g_object_class_install_property (oclass, PROP_READY,
+    g_param_spec_boolean ("ready",
+      "Ready",
+      "Whether the initial state dump from the account manager is finished",
+      FALSE,
+      G_PARAM_STATIC_STRINGS | G_PARAM_READABLE));
 
   signals[ACCOUNT_CREATED] =
     g_signal_new ("account-created",
 
   signals[ACCOUNT_CREATED] =
     g_signal_new ("account-created",
@@ -506,6 +568,15 @@ empathy_account_manager_create (EmpathyAccountManager *manager,
   return NULL;
 }
 
   return NULL;
 }
 
+
+gboolean
+empathy_account_manager_is_ready (EmpathyAccountManager *manager)
+{
+  EmpathyAccountManagerPriv *priv = GET_PRIV (manager);
+
+  return priv->ready;
+}
+
 int
 empathy_account_manager_get_connected_accounts (EmpathyAccountManager *manager)
 {
 int
 empathy_account_manager_get_connected_accounts (EmpathyAccountManager *manager)
 {
@@ -689,4 +760,3 @@ empathy_account_manager_get_global_presence (
 
   return priv->global_presence;
 }
 
   return priv->global_presence;
 }
-
index bbf091997c531639467bf64fffcbce2225d57277..e77f5017e2af4e1e70c864ec592db788d1512467 100644 (file)
@@ -58,6 +58,8 @@ EmpathyAccount *        empathy_account_manager_create (
     const gchar *protocol,
     const gchar *display_name);
 
     const gchar *protocol,
     const gchar *display_name);
 
+gboolean empathy_account_manager_is_ready (EmpathyAccountManager *manager);
+
 int                     empathy_account_manager_get_connected_accounts
                                 (EmpathyAccountManager *manager);
 int                     empathy_account_manager_get_connecting_accounts
 int                     empathy_account_manager_get_connected_accounts
                                 (EmpathyAccountManager *manager);
 int                     empathy_account_manager_get_connecting_accounts