[telepathy-glib/master] account-manager: add accessors for requested, actual and missing features

Jonny Lamb jonny.lamb at collabora.co.uk
Thu Sep 24 06:25:54 PDT 2009


Signed-off-by: Jonny Lamb <jonny.lamb at collabora.co.uk>
---
 docs/reference/telepathy-glib-sections.txt |    5 +-
 telepathy-glib/account-manager.c           |   97 +++++++++++++++++++++++++--
 telepathy-glib/account-manager.h           |    9 ++-
 3 files changed, 100 insertions(+), 11 deletions(-)

diff --git a/docs/reference/telepathy-glib-sections.txt b/docs/reference/telepathy-glib-sections.txt
index b18258b..f486fdf 100644
--- a/docs/reference/telepathy-glib-sections.txt
+++ b/docs/reference/telepathy-glib-sections.txt
@@ -3088,8 +3088,9 @@ tp_account_manager_get_feature_quark_core
 tp_account_manager_is_ready
 tp_account_manager_prepare_async
 tp_account_manager_prepare_finish
-tp_account_manager_set_features
-tp_account_manager_get_features
+tp_account_manager_get_requested_features
+tp_account_manager_get_actual_features
+tp_account_manager_get_missing_features
 <SUBSECTION>
 tp_cli_account_manager_callback_for_create_account
 tp_cli_account_manager_call_create_account
diff --git a/telepathy-glib/account-manager.c b/telepathy-glib/account-manager.c
index f77d265..0f6fca5 100644
--- a/telepathy-glib/account-manager.c
+++ b/telepathy-glib/account-manager.c
@@ -84,7 +84,9 @@ struct _TpAccountManagerPrivate {
   /* Features */
   GList *features;
   GList *callbacks;
-  GArray *features_array;
+  GArray *requested_features;
+  GArray *actual_features;
+  GArray *missing_features;
 };
 
 typedef struct {
@@ -163,6 +165,43 @@ _tp_account_manager_get_feature (TpAccountManager *self,
 }
 
 static gboolean
+_tp_account_manager_feature_in_array (GQuark feature,
+    const GArray *array)
+{
+  const GQuark *c = (const GQuark *) array->data;
+
+  for (; *c != 0; c++)
+    {
+      if (*c == feature)
+        return TRUE;
+    }
+
+  return FALSE;
+}
+
+static void
+_tp_account_manager_update_feature_arrays (TpAccountManager *manager,
+    const GQuark *features)
+{
+  TpAccountManagerPrivate *priv = manager->priv;
+  const GQuark *f;
+
+  for (f = features; *f != 0; f++)
+    {
+      TpAccountManagerFeature *feature;
+
+      feature = _tp_account_manager_get_feature (manager, *f);
+
+      if (feature == NULL
+          && !_tp_account_manager_feature_in_array (*f, priv->missing_features))
+        g_array_append_val (priv->missing_features, feature);
+
+      if (!_tp_account_manager_feature_in_array (*f, priv->requested_features))
+        g_array_append_val (priv->requested_features, *f);
+    }
+}
+
+static gboolean
 _tp_account_manager_check_features (TpAccountManager *self,
     const GQuark *features)
 {
@@ -201,7 +240,10 @@ _tp_account_manager_become_ready (TpAccountManager *self,
 
   f->ready = TRUE;
 
-  g_array_append_val (priv->features_array, feature);
+  /* Possibly a useless check -- should never get this far with
+   * this expression evaluating to false. */
+  if (!_tp_account_manager_feature_in_array (feature, priv->missing_features))
+    g_array_append_val (priv->actual_features, feature);
 
   for (l = priv->callbacks; l != NULL; l = l->next)
     {
@@ -426,7 +468,10 @@ _tp_account_manager_constructed (GObject *object)
 
   priv->features = NULL;
   priv->callbacks = NULL;
-  priv->features_array = g_array_new (TRUE, FALSE, sizeof (GQuark));
+
+  priv->requested_features = g_array_new (TRUE, FALSE, sizeof (GQuark));
+  priv->actual_features = g_array_new (TRUE, FALSE, sizeof (GQuark));
+  priv->missing_features = g_array_new (TRUE, FALSE, sizeof (GQuark));
 
   known_features = _tp_account_manager_get_known_features ();
 
@@ -500,7 +545,9 @@ _tp_account_manager_finalize (GObject *object)
   g_list_free (priv->callbacks);
   priv->callbacks = NULL;
 
-  g_array_free (priv->features_array, TRUE);
+  g_array_free (priv->requested_features, TRUE);
+  g_array_free (priv->actual_features, TRUE);
+  g_array_free (priv->missing_features, TRUE);
 
   G_OBJECT_CLASS (tp_account_manager_parent_class)->finalize (object);
 }
@@ -1326,6 +1373,8 @@ tp_account_manager_prepare_async (TpAccountManager *manager,
   /* In this object, there are no features which are activatable (core is
    * forced on you). They'd be activated here though. */
 
+  _tp_account_manager_update_feature_arrays (manager, features);
+
   if (callback == NULL)
     return;
 
@@ -1375,17 +1424,49 @@ tp_account_manager_prepare_finish (TpAccountManager *manager,
 }
 
 /**
- * tp_account_manager_get_features:
+ * tp_account_manager_get_requested_features:
+ * @manager: a #TpAccountManager
+ *
+ * <!-- -->
+ *
+ * Returns: a 0-terminated list of requested features on @manager
+ *
+ * Since: 0.7.UNRELEASED
+ */
+const GQuark *
+tp_account_manager_get_requested_features (TpAccountManager *manager)
+{
+  return (const GQuark *) manager->priv->requested_features->data;
+}
+
+/**
+ * tp_account_manager_get_actual_features:
+ * @manager: a #TpAccountManager
+ *
+ * <!-- -->
+ *
+ * Returns: a 0-terminated list of actual features on @manager
+ *
+ * Since: 0.7.UNRELEASED
+ */
+const GQuark *
+tp_account_manager_get_actual_features (TpAccountManager *manager)
+{
+  return (const GQuark *) manager->priv->actual_features->data;
+}
+
+/**
+ * tp_account_manager_get_missing_features:
  * @manager: a #TpAccountManager
  *
  * <!-- -->
  *
- * Returns: a 0-terminated list of features set on @manager
+ * Returns: a 0-terminated list of missing features on @manager
  *
  * Since: 0.7.UNRELEASED
  */
 const GQuark *
-tp_account_manager_get_features (TpAccountManager *manager)
+tp_account_manager_get_missing_features (TpAccountManager *manager)
 {
-  return (const GQuark *) manager->priv->features_array->data;
+  return (const GQuark *) manager->priv->missing_features->data;
 }
diff --git a/telepathy-glib/account-manager.h b/telepathy-glib/account-manager.h
index aca0da2..60fe49b 100644
--- a/telepathy-glib/account-manager.h
+++ b/telepathy-glib/account-manager.h
@@ -103,7 +103,14 @@ void tp_account_manager_prepare_async (TpAccountManager *manager,
 gboolean tp_account_manager_prepare_finish (TpAccountManager *manager,
     GAsyncResult *result, GError **error);
 
-const GQuark * tp_account_manager_get_features (TpAccountManager *manager);
+const GQuark * tp_account_manager_get_requested_features (
+    TpAccountManager *manager);
+
+const GQuark * tp_account_manager_get_actual_features (
+    TpAccountManager *manager);
+
+const GQuark * tp_account_manager_get_missing_features (
+    TpAccountManager *manager);
 
 G_END_DECLS
 
-- 
1.5.6.5




More information about the telepathy-commits mailing list