aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--goa-mc-plugin/mcp-account-manager-goa.c131
1 files changed, 124 insertions, 7 deletions
diff --git a/goa-mc-plugin/mcp-account-manager-goa.c b/goa-mc-plugin/mcp-account-manager-goa.c
index 8717b2e45..7319f8cfc 100644
--- a/goa-mc-plugin/mcp-account-manager-goa.c
+++ b/goa-mc-plugin/mcp-account-manager-goa.c
@@ -42,6 +42,8 @@
#define PLUGIN_DESCRIPTION "Provide Telepathy Accounts from GOA"
#define PLUGIN_PROVIDER "org.gnome.OnlineAccounts"
+#define INITIAL_COMMENT "Parameters of GOA Telepathy accounts"
+
static void account_storage_iface_init (McpAccountStorageIface *iface);
G_DEFINE_TYPE_WITH_CODE (McpAccountManagerGoa,
@@ -56,6 +58,9 @@ struct _McpAccountManagerGoaPrivate
GoaClient *client;
GHashTable *accounts; /* alloc'ed string -> ref'ed GoaObject */
+
+ GKeyFile *store;
+ gchar *filename;
};
@@ -76,6 +81,8 @@ mcp_account_manager_goa_finalize (GObject *self)
McpAccountManagerGoaPrivate *priv = GET_PRIVATE (self);
g_hash_table_destroy (priv->accounts);
+ g_key_file_free (priv->store);
+ g_free (priv->filename);
G_OBJECT_CLASS (mcp_account_manager_goa_parent_class)->finalize (self);
}
@@ -200,8 +207,34 @@ _new_account (McpAccountManagerGoa *self,
DECLARE_GASYNC_CALLBACK (_goa_client_new_cb);
static void
+load_store (McpAccountManagerGoa *self)
+{
+ GError *error = NULL;
+
+ if (!g_key_file_load_from_file (self->priv->store, self->priv->filename,
+ G_KEY_FILE_KEEP_COMMENTS, &error))
+ {
+ gchar *dir;
+
+ DEBUG ("Failed to load keyfile, creating a new one: %s", error->message);
+
+ dir = g_path_get_dirname (self->priv->filename);
+
+ g_mkdir_with_parents (dir, 0700);
+ g_free (dir);
+
+ g_key_file_set_comment (self->priv->store, NULL, NULL, INITIAL_COMMENT,
+ NULL);
+
+ g_error_free (error);
+ }
+}
+
+static void
mcp_account_manager_goa_init (McpAccountManagerGoa *self)
{
+ gchar *path;
+
DEBUG ("GOA MC plugin initialised");
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
@@ -211,6 +244,13 @@ mcp_account_manager_goa_init (McpAccountManagerGoa *self)
g_free, g_object_unref);
goa_client_new (NULL, _goa_client_new_cb, self);
+
+ /* key file store */
+ self->priv->store = g_key_file_new ();
+ self->priv->filename = g_build_filename (g_get_user_data_dir (), "telepathy",
+ "mission-control", "accounts-goa.cfg", NULL);
+
+ load_store (self);
}
@@ -331,13 +371,35 @@ mcp_account_manager_goa_get (const McpAccountStorage *self,
GHashTable *params = get_tp_parameters (account);
GHashTableIter iter;
gpointer key, value;
+ GStrv keys;
+ guint i;
+ gssize n;
+ /* Properties from GOA */
g_hash_table_iter_init (&iter, params);
while (g_hash_table_iter_next (&iter, &key, &value))
mcp_account_manager_set_value (am, acct, key, value);
g_hash_table_destroy (params);
+ /* Stored properties */
+ keys = g_key_file_get_keys (priv->store, acct, &n, NULL);
+
+ if (keys == NULL)
+ n = 0;
+
+ for (i = 0; i < n; i++)
+ {
+ gchar *v = g_key_file_get_value (priv->store, acct, keys[i], NULL);
+
+ if (v != NULL)
+ {
+ mcp_account_manager_set_value (am, acct, keys[i], v);
+ g_free (v);
+ }
+ }
+
+ /* Enabled */
get_enabled (self, am, acct, object);
}
else if (!tp_strdiff (key, "Enabled"))
@@ -348,11 +410,19 @@ mcp_account_manager_goa_get (const McpAccountStorage *self,
{
/* get a specific key */
GHashTable *params = get_tp_parameters (account);
+ gchar *value;
+
+ value = g_hash_table_lookup (params, key);
- mcp_account_manager_set_value (am, acct, key,
- g_hash_table_lookup (params, key));
+ if (value == NULL)
+ value = g_key_file_get_value (priv->store, acct, key, NULL);
+ else
+ value = g_strdup (value);
+
+ mcp_account_manager_set_value (am, acct, key, value);
g_hash_table_destroy (params);
+ g_free (value);
}
return TRUE;
@@ -362,13 +432,24 @@ mcp_account_manager_goa_get (const McpAccountStorage *self,
static gboolean
mcp_account_manager_goa_set (const McpAccountStorage *self,
const McpAccountManager *am,
- const gchar *acct,
+ const gchar *account,
const gchar *key,
const gchar *val)
{
+ McpAccountManagerGoaPrivate *priv = GET_PRIVATE (self);
GError *error = NULL;
- DEBUG ("%s: (%s, %s, %s)", G_STRFUNC, acct, key, val);
+ /* No need to save Enabled, it's up to the GOA configuration if the account
+ * is configured or not. */
+ if (!tp_strdiff (key, "Enabled"))
+ return TRUE;
+
+ DEBUG ("%s: (%s, %s, %s)", G_STRFUNC, account, key, val);
+
+ if (val != NULL)
+ g_key_file_set_value (priv->store, account, key, val);
+ else
+ g_key_file_remove_key (priv->store, account, key, NULL);
/* Pretend we save everything so MC won't save this in accounts.cfg */
return TRUE;
@@ -378,10 +459,21 @@ mcp_account_manager_goa_set (const McpAccountStorage *self,
static gboolean
mcp_account_manager_goa_delete (const McpAccountStorage *self,
const McpAccountManager *am,
- const gchar *acct,
+ const gchar *account,
const gchar *key)
{
- DEBUG ("%s: (%s, %s)", G_STRFUNC, acct, key);
+ McpAccountManagerGoaPrivate *priv = GET_PRIVATE (self);
+
+ DEBUG ("%s: (%s, %s)", G_STRFUNC, account, key);
+
+ if (key == NULL)
+ {
+ g_key_file_remove_group (priv->store, account, NULL);
+ }
+ else
+ {
+ g_key_file_remove_key (priv->store, account, key, NULL);
+ }
/* Pretend we deleted everything */
return TRUE;
@@ -392,7 +484,32 @@ static gboolean
mcp_account_manager_goa_commit (const McpAccountStorage *self,
const McpAccountManager *am)
{
- DEBUG ("%s", G_STRFUNC);
+ McpAccountManagerGoaPrivate *priv = GET_PRIVATE (self);
+ gchar *data;
+ gsize len;
+ GError *error = NULL;
+
+ DEBUG ("Save config to %s", priv->filename);
+
+ data = g_key_file_to_data (priv->store, &len, &error);
+ if (data == NULL)
+ {
+ DEBUG ("Failed to get data from store: %s", error->message);
+
+ g_error_free (error);
+ return FALSE;
+ }
+
+ if (!g_file_set_contents (priv->filename, data, len, &error))
+ {
+ DEBUG ("Failed to write file: %s", error->message);
+
+ g_free (data);
+ g_error_free (error);
+ return FALSE;
+ }
+
+ g_free (data);
return TRUE;
}