From 041a0ced53bc5e2bc4bb4454c718500ca41688ae Mon Sep 17 00:00:00 2001 From: Nicolas Jager <nicolas.jager@savoirfairelinux.com> Date: Fri, 27 Jan 2017 12:17:50 -0500 Subject: [PATCH] migration : add signals - adds a new kind of signals, called MigrationState. RingAccount::migrateAccount now use those signals. Change-Id: I1ef5bbd495f5f99d247549e883c8a001418a9bd2 --- .../cx.ring.Ring.ConfigurationManager.xml | 20 ++++++++++ bin/dbus/dbusclient.cpp | 1 + src/client/ring_signal.cpp | 1 + src/dring/configurationmanager_interface.h | 4 ++ src/ringdht/ringaccount.cpp | 38 +++++++++++++++++-- src/ringdht/ringaccount.h | 2 +- 6 files changed, 61 insertions(+), 5 deletions(-) diff --git a/bin/dbus/cx.ring.Ring.ConfigurationManager.xml b/bin/dbus/cx.ring.Ring.ConfigurationManager.xml index c48e950162..f1cf90e3a6 100644 --- a/bin/dbus/cx.ring.Ring.ConfigurationManager.xml +++ b/bin/dbus/cx.ring.Ring.ConfigurationManager.xml @@ -1358,5 +1358,25 @@ </tp:docstring> </method> + <signal name="migrationEnded" tp:name-for-bindings="migrationEnded"> + <tp:added version="3.0.0"/> + <tp:docstring> + Notify clients when migration is ended. + </tp:docstring> + <arg type="s" name="accountID"> + <tp:docstring> + An account id. + </tp:docstring> + </arg> + <arg type="s" name="result"> + <tp:docstring> + The result of the migration. + SUCCESS : account migrated. + INVALID : account migration failed. + </tp:docstring> + </arg> + </signal> + + </interface> </node> diff --git a/bin/dbus/dbusclient.cpp b/bin/dbus/dbusclient.cpp index 5dca85827a..edcf3249fc 100644 --- a/bin/dbus/dbusclient.cpp +++ b/bin/dbus/dbusclient.cpp @@ -187,6 +187,7 @@ DBusClient::initLibrary(int flags) exportable_callback<ConfigurationSignal::CertificateExpired>(bind(&DBusConfigurationManager::certificateExpired, confM, _1 )), exportable_callback<ConfigurationSignal::CertificateStateChanged>(bind(&DBusConfigurationManager::certificateStateChanged, confM, _1, _2, _3 )), exportable_callback<ConfigurationSignal::MediaParametersChanged>(bind(&DBusConfigurationManager::mediaParametersChanged, confM, _1 )), + exportable_callback<ConfigurationSignal::MigrationEnded>(bind(&DBusConfigurationManager::migrationEnded, confM, _1, _2 )), }; // Presence event handlers diff --git a/src/client/ring_signal.cpp b/src/client/ring_signal.cpp index 5cbbaecbfe..3a94ff3815 100644 --- a/src/client/ring_signal.cpp +++ b/src/client/ring_signal.cpp @@ -70,6 +70,7 @@ getSignalHandlers() exported_callback<DRing::ConfigurationSignal::NameRegistrationEnded>(), exported_callback<DRing::ConfigurationSignal::RegisteredNameFound>(), exported_callback<DRing::ConfigurationSignal::MediaParametersChanged>(), + exported_callback<DRing::ConfigurationSignal::MigrationEnded>(), exported_callback<DRing::ConfigurationSignal::Error>(), #ifdef __ANDROID__ exported_callback<DRing::ConfigurationSignal::GetHardwareAudioFormat>(), diff --git a/src/dring/configurationmanager_interface.h b/src/dring/configurationmanager_interface.h index 502ddb0aea..4d8b2c9d7b 100644 --- a/src/dring/configurationmanager_interface.h +++ b/src/dring/configurationmanager_interface.h @@ -266,6 +266,10 @@ struct ConfigurationSignal { constexpr static const char* name = "MediaParametersChanged"; using cb_type = void(const std::string& /*accountId*/); }; + struct MigrationEnded { + constexpr static const char* name = "MigrationEnded"; + using cb_type = void(const std::string& /*accountId*/, const std::string& /*state*/); + }; /** * These are special getters for Android and UWP, so the daemon can retreive * information only accessible through their respective platform APIs diff --git a/src/ringdht/ringaccount.cpp b/src/ringdht/ringaccount.cpp index d57ade141f..49005d43cd 100644 --- a/src/ringdht/ringaccount.cpp +++ b/src/ringdht/ringaccount.cpp @@ -4,6 +4,7 @@ * Author: Adrien Béraud <adrien.beraud@savoirfairelinux.com> * Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> * Author: Simon Désaulniers <simon.desaulniers@savoirfairelinux.com> + * Author: Nicolas Jäger <nicolas.jager@savoirfairelinux.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -80,6 +81,34 @@ namespace ring { using sip_utils::CONST_PJ_STR; using std::chrono::system_clock; +namespace Migration { + +enum class State { // Contains all the Migration states + SUCCESS, + INVALID +}; + +std::string +mapStateNumberToString(const State migrationState) +{ +#define CASE_STATE(X) case Migration::State::X: \ + return #X + +switch (migrationState) { + CASE_STATE(INVALID); + CASE_STATE(SUCCESS); +} +} + +void +setState (const std::string& accountID, + const State migrationState) +{ + emitSignal<DRing::ConfigurationSignal::MigrationEnded>(accountID, + mapStateNumberToString(migrationState)); +} +} + struct RingAccount::BuddyInfo { /* the buddy id */ @@ -1364,22 +1393,23 @@ RingAccount::updateCertificates(ArchiveContent& archive, dht::crypto::Identity& return updated; } -bool +void RingAccount::migrateAccount(const std::string& pwd) { ArchiveContent archive; try { archive = readArchive(pwd); } catch (...) { - return false; + return; } if (updateCertificates(archive, identity_)) { std::tie(tlsPrivateKeyFile_, tlsCertificateFile_) = saveIdentity(identity_, idPath_ + DIR_SEPARATOR_STR "ring_device"); saveArchive(archive, pwd); - return true; + setRegistrationState(RegistrationState::UNREGISTERED); + Migration::setState(accountID_, Migration::State::SUCCESS); } - return false; + Migration::setState(accountID_, Migration::State::INVALID); } void diff --git a/src/ringdht/ringaccount.h b/src/ringdht/ringaccount.h index 92bdca7bda..e1882754de 100644 --- a/src/ringdht/ringaccount.h +++ b/src/ringdht/ringaccount.h @@ -489,7 +489,7 @@ class RingAccount : public SIPAccountBase { std::string makeReceipt(const dht::crypto::Identity& id); void createRingDevice(const dht::crypto::Identity& id); void initRingDevice(const ArchiveContent& a); - bool migrateAccount(const std::string& pwd); + void migrateAccount(const std::string& pwd); static bool updateCertificates(ArchiveContent& archive, dht::crypto::Identity& device); void createAccount(const std::string& archive_password); -- GitLab