[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