summaryrefslogtreecommitdiff
path: root/src/mcd-account-manager-default.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mcd-account-manager-default.c')
-rw-r--r--src/mcd-account-manager-default.c64
1 files changed, 61 insertions, 3 deletions
diff --git a/src/mcd-account-manager-default.c b/src/mcd-account-manager-default.c
index dcf8c959..ff48ac73 100644
--- a/src/mcd-account-manager-default.c
+++ b/src/mcd-account-manager-default.c
@@ -20,7 +20,12 @@
*/
#include "config.h"
+
+#include <errno.h>
#include <string.h>
+
+#include <glib/gstdio.h>
+
#include "mcd-account-manager-default.h"
#include "mcd-debug.h"
#include "mcd-misc.h"
@@ -343,7 +348,7 @@ G_DEFINE_TYPE_WITH_CODE (McdAccountManagerDefault, mcd_account_manager_default,
account_storage_iface_init));
static gchar *
-get_account_conf_filename (void)
+get_old_filename (void)
{
const gchar *base;
@@ -361,11 +366,18 @@ get_account_conf_filename (void)
return g_build_filename (base, "accounts.cfg", NULL);
}
+static gchar *
+account_filename_in (const gchar *dir)
+{
+ return g_build_filename (dir, "telepathy", "mission-control", "accounts.cfg",
+ NULL);
+}
+
static void
mcd_account_manager_default_init (McdAccountManagerDefault *self)
{
DEBUG ("mcd_account_manager_default_init");
- self->filename = get_account_conf_filename ();
+ self->filename = account_filename_in (g_get_user_data_dir ());
self->keyfile = g_key_file_new ();
self->secrets = g_key_file_new ();
self->removed = g_key_file_new ();
@@ -677,11 +689,57 @@ _list (const McpAccountStorage *self,
if (!amd->loaded)
{
+ const gchar * const *iter;
+
+ for (iter = g_get_system_data_dirs ();
+ iter != NULL && *iter != NULL;
+ iter++)
+ {
+ gchar *filename = account_filename_in (*iter);
+
+ if (g_file_test (filename, G_FILE_TEST_EXISTS))
+ {
+ am_default_load_keyfile (amd, filename);
+ amd->loaded = TRUE;
+ /* Do not set amd->save: we don't need to write it to a
+ * higher-priority directory until it actually changes. */
+ }
+
+ g_free (filename);
+
+ if (amd->loaded)
+ break;
+ }
+ }
+
+ if (!amd->loaded)
+ {
+ gchar *old_filename = get_old_filename ();
+
+ if (g_file_test (old_filename, G_FILE_TEST_EXISTS))
+ {
+ am_default_load_keyfile (amd, old_filename);
+ amd->loaded = TRUE;
+ amd->save = TRUE;
+
+ if (_commit (self, am, NULL))
+ {
+ DEBUG ("Migrated %s to new location: deleting old copy");
+ if (g_unlink (old_filename) != 0)
+ g_warning ("Unable to delete %s: %s", old_filename,
+ g_strerror (errno));
+ }
+ }
+
+ g_free (old_filename);
+ }
+
+ if (!amd->loaded)
+ {
DEBUG ("Creating initial account data");
g_key_file_load_from_data (amd->keyfile, INITIAL_CONFIG, -1,
G_KEY_FILE_KEEP_COMMENTS, NULL);
amd->loaded = TRUE;
- /* create the placeholder file */
amd->save = TRUE;
_commit (self, am, NULL);
}