From af109522bb9a345c28ace3a05c785c4273fb48b5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Wed, 15 Aug 2018 15:05:19 -0400
Subject: [PATCH] configuration: store Ring account config in account dir

Change-Id: I56e4a8f74400f1c838bc3cd1a9b82b1e2c23ccb1
---
 src/account_factory.h     |  1 +
 src/manager.cpp           | 39 ++++++++++++++++++++++++++++++++++++++-
 src/ringdht/ringaccount.h |  4 ++++
 3 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/src/account_factory.h b/src/account_factory.h
index 571d820d15..2b4421d4ee 100644
--- a/src/account_factory.h
+++ b/src/account_factory.h
@@ -28,6 +28,7 @@
 #include <mutex>
 #include <utility>
 #include <functional>
+#include <ciso646>
 
 namespace ring {
 
diff --git a/src/manager.cpp b/src/manager.cpp
index c877dbd8ea..48af7c3dff 100644
--- a/src/manager.cpp
+++ b/src/manager.cpp
@@ -1792,7 +1792,20 @@ Manager::saveConfig()
         out << YAML::Value << YAML::BeginSeq;
 
         for (const auto& account : accountFactory.getAllAccounts()) {
-            account->serialize(out);
+            if (auto ringAccount = std::dynamic_pointer_cast<RingAccount>(account)) {
+                try {
+                    YAML::Emitter accountOut;
+                    ringAccount->serialize(accountOut);
+                    auto accountConfig = ringAccount->getPath() + DIR_SEPARATOR_STR + "config.yml";
+                    std::ofstream fout(accountConfig);
+                    fout << accountOut.c_str();
+                    RING_DBG("Exported Ring account to %s", accountConfig.c_str());
+                } catch (const std::exception& e) {
+                    RING_ERR("Error exporting Ring account: %s", e.what());
+                }
+            } else {
+                account->serialize(out);
+            }
         }
         out << YAML::EndSeq;
 
@@ -2839,6 +2852,30 @@ Manager::loadAccountMap(const YAML::Node& node)
         pimpl_->loadAccount(a, errorCount, accountOrder);
     }
 
+    auto accountBaseDir = fileutils::get_data_dir();
+    auto dirs = fileutils::readDirectory(accountBaseDir);
+    for (const auto& dir : dirs) {
+        if (accountFactory.hasAccount<RingAccount>(dir)) {
+            continue;
+        }
+        auto configFile = accountBaseDir + DIR_SEPARATOR_STR + dir + DIR_SEPARATOR_STR + "config.yml";
+        if (fileutils::isFile(configFile)) {
+            try {
+                if (auto a = accountFactory.createAccount(RingAccount::ACCOUNT_TYPE, dir)) {
+                    YAML::Node parsedConfig = YAML::LoadFile(configFile);
+                    a->unserialize(parsedConfig);
+                }
+            } catch (const std::exception& e) {
+                RING_ERR("Can't import Ring account %s: %s", dir.c_str(), e.what());
+            }
+            continue;
+        }
+        auto exportFile = accountBaseDir + DIR_SEPARATOR_STR + dir + DIR_SEPARATOR_STR + "export.gz";
+        if (fileutils::isFile(exportFile)) {
+            RING_WARN("Found abandonned Ring account: %s", exportFile.c_str());
+        }
+    }
+
     return errorCount;
 }
 
diff --git a/src/ringdht/ringaccount.h b/src/ringdht/ringaccount.h
index c16f3cf2c4..b2b5ebb5c2 100644
--- a/src/ringdht/ringaccount.h
+++ b/src/ringdht/ringaccount.h
@@ -101,6 +101,10 @@ class RingAccount : public SIPAccountBase {
             return std::static_pointer_cast<RingAccount const>(shared_from_this());
         }
 
+        const std::string& getPath() const {
+            return idPath_;
+        }
+
         /**
          * Constructor
          * @param accountID The account identifier
-- 
GitLab