From 4d079e875fd4edcfb2724c3ec3dddf1020fee6df Mon Sep 17 00:00:00 2001 From: Edric Milaret <edric.ladent-milaret@savoirfairelinux.com> Date: Thu, 28 Apr 2016 11:41:30 -0400 Subject: [PATCH] message_engine: modify API - Provide destination contact method for conveniency - Use an enum for message states to prevent string comparison * This will also be useful if we want to display it (translation) - Fixes some print format - Fixes some compilation warning Change-Id: I3dd18728e386a84e547692c2471f7905faba0e9f Tuleap: #647 --- bin/dbus/configurationmanager-introspec.xml | 25 ++++++++--------- bin/dbus/dbusconfigurationmanager.h | 2 +- src/client/configurationmanager.cpp | 2 +- src/client/ring_signal.cpp | 2 +- src/dring/account_const.h | 16 +++++------ src/dring/configurationmanager_interface.h | 8 +++--- src/im/message_engine.cpp | 15 ++++++++--- src/manager.cpp | 30 ++++++++++----------- src/manager.h | 2 +- src/ringdht/ringaccount.cpp | 4 +-- src/sip/sipaccountbase.cpp | 4 ++- 11 files changed, 60 insertions(+), 50 deletions(-) diff --git a/bin/dbus/configurationmanager-introspec.xml b/bin/dbus/configurationmanager-introspec.xml index 50f4a6108b..d06a812a1a 100644 --- a/bin/dbus/configurationmanager-introspec.xml +++ b/bin/dbus/configurationmanager-introspec.xml @@ -272,22 +272,23 @@ <arg type="a{ss}" name="payloads" direction="in"/> <arg type="t" name="id" direction="out"> <tp:docstring> - The message ID. + The message ID. An ID of 0 means that the message was not sent, + likely because one of the parameters was invalid. </tp:docstring> </arg> </method> - <method name="getMessageStatus" tp:name-for-bindings="getMessageStatus"> + <method name="getMessageStatus" tp:name-for-bindings="getMessageStatus"> <arg type="t" name="id" direction="in"/> - <arg type="s" name="status" direction="out"> + <arg type="i" name="status" direction="out"> <tp:docstring> The message status. <ul> - <li>UNKNOWN: unknown message or message status</li> - <li>SENDING: message is being sent or waiting for peer confirmation.</li> - <li>SENT: message have been received from the other end.</li> - <li>READ: message have been read by the peer.</li> - <li>FAILURE: the message coudn't be delivered.</li> + <li>UNKNOWN = 0 unknown message or message status</li> + <li>SENDING = 1 message is being sent or waiting for peer confirmation.</li> + <li>SENT = 2 message have been received from the other end.</li> + <li>READ = 3 message have been read by the peer.</li> + <li>FAILURE = 4 the message coudn't be delivered.</li> </ul> </tp:docstring> </arg> @@ -304,17 +305,17 @@ <arg type="a{ss}" name="payloads"/> </signal> - <signal name="accountMessageStatus" tp:name-for-bindings="accountMessageStatus"> + <signal name="accountMessageStatusChanged" tp:name-for-bindings="accountMessageStatusChanged"> <tp:added version="2.3.0"/> <tp:docstring> Notify clients that a sent text message status have changed </tp:docstring> + <arg type="s" name="accountID"/> <arg type="t" name="id"/> - <arg type="s" name="status"> + <arg type="s" name="to"/> + <arg type="i" name="status"> <tp:docstring>The new status of the message, see getMessageStatus for possible values.</tp:docstring> </arg> - <annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="MapStringString"/> - <arg type="a{ss}" name="payloads"/> </signal> <method name="setVolume" tp:name-for-bindings="setVolume"> diff --git a/bin/dbus/dbusconfigurationmanager.h b/bin/dbus/dbusconfigurationmanager.h index e40eaf2087..a3c8c08b3d 100644 --- a/bin/dbus/dbusconfigurationmanager.h +++ b/bin/dbus/dbusconfigurationmanager.h @@ -67,7 +67,7 @@ class DBusConfigurationManager : void sendRegister(const std::string& accoundID, const bool& enable); void registerAllAccounts(void); uint64_t sendTextMessage(const std::string& accoundID, const std::string& to, const std::map<std::string, std::string>& payloads); - std::string getMessageStatus(const uint64_t& id); + int getMessageStatus(const uint64_t& id); std::map<std::string, std::string> getTlsDefaultSettings(); std::vector<std::string> getSupportedCiphers(const std::string& accountID); std::vector<unsigned> getCodecList(); diff --git a/src/client/configurationmanager.cpp b/src/client/configurationmanager.cpp index e4737e6529..52b5da537f 100644 --- a/src/client/configurationmanager.cpp +++ b/src/client/configurationmanager.cpp @@ -283,7 +283,7 @@ sendAccountTextMessage(const std::string& accountID, const std::string& to, cons return ring::Manager::instance().sendTextMessage(accountID, to, payloads); } -std::string +int getMessageStatus(uint64_t id) { return ring::Manager::instance().getMessageStatus(id); diff --git a/src/client/ring_signal.cpp b/src/client/ring_signal.cpp index 214a7d5e63..d8f91e9dce 100644 --- a/src/client/ring_signal.cpp +++ b/src/client/ring_signal.cpp @@ -65,7 +65,7 @@ getSignalHandlers() exported_callback<DRing::ConfigurationSignal::CertificateExpired>(), exported_callback<DRing::ConfigurationSignal::CertificateStateChanged>(), exported_callback<DRing::ConfigurationSignal::IncomingAccountMessage>(), - exported_callback<DRing::ConfigurationSignal::AccountMessageStatus>(), + exported_callback<DRing::ConfigurationSignal::AccountMessageStatusChanged>(), exported_callback<DRing::ConfigurationSignal::IncomingTrustRequest>(), exported_callback<DRing::ConfigurationSignal::MediaParametersChanged>(), exported_callback<DRing::ConfigurationSignal::Error>(), diff --git a/src/dring/account_const.h b/src/dring/account_const.h index 2e0158ec40..3e3bd5daa0 100644 --- a/src/dring/account_const.h +++ b/src/dring/account_const.h @@ -58,15 +58,13 @@ constexpr static const char REQUEST_TIMEOUT [] = "Request Timeout"; } //namespace DRing::Account -namespace MessageStates { - -constexpr static const char UNKNOWN [] = "UNKNOWN"; -constexpr static const char SENDING [] = "SENDING"; -constexpr static const char SENT [] = "SENT"; -constexpr static const char READ [] = "READ"; -constexpr static const char FAILURE [] = "FAILURE"; - -} //namespace DRing::MessageStates +enum class MessageStates : int { + UNKNOWN = 0, + SENDING, + SENT, + READ, + FAILURE +}; //DRing::Account::MessageStates namespace VolatileProperties { diff --git a/src/dring/configurationmanager_interface.h b/src/dring/configurationmanager_interface.h index 56b3370be0..de7aa4f093 100644 --- a/src/dring/configurationmanager_interface.h +++ b/src/dring/configurationmanager_interface.h @@ -50,7 +50,7 @@ std::vector<std::string> getAccountList(); void sendRegister(const std::string& accountID, bool enable); void registerAllAccounts(void); uint64_t sendAccountTextMessage(const std::string& accountID, const std::string& to, const std::map<std::string, std::string>& payloads); -std::string getMessageStatus(uint64_t id); +int getMessageStatus(uint64_t id); std::map<std::string, std::string> getTlsDefaultSettings(); @@ -195,9 +195,9 @@ struct ConfigurationSignal { constexpr static const char* name = "IncomingAccountMessage"; using cb_type = void(const std::string& /*account_id*/, const std::string& /*from*/, const std::map<std::string, std::string>& /*payloads*/); }; - struct AccountMessageStatus { - constexpr static const char* name = "AccountMessageStatus"; - using cb_type = void(uint64_t /*message_id*/, const std::string& /*state*/); + struct AccountMessageStatusChanged { + constexpr static const char* name = "AccountMessageStatusChanged"; + using cb_type = void(const std::string& /*account_id*/, uint64_t /*message_id*/, const std::string& /*to*/, int /*state*/); }; struct IncomingTrustRequest { constexpr static const char* name = "IncomingTrustRequest"; diff --git a/src/im/message_engine.cpp b/src/im/message_engine.cpp index 1a8551c67b..e1edc894a9 100644 --- a/src/im/message_engine.cpp +++ b/src/im/message_engine.cpp @@ -125,7 +125,10 @@ MessageEngine::trySend(decltype(MessageEngine::messages_)::iterator m) m->second.status = MessageStatus::SENDING; m->second.retried++; m->second.last_op = clock::now(); - emitSignal<DRing::ConfigurationSignal::AccountMessageStatus>(m->first, DRing::Account::MessageStates::SENDING); + emitSignal<DRing::ConfigurationSignal::AccountMessageStatusChanged>(account_.getAccountID(), + m->first, + m->second.to, + static_cast<int>(DRing::Account::MessageStates::SENDING)); account_.sendTextMessage(m->second.to, m->second.payloads, m->first); } @@ -139,10 +142,16 @@ MessageEngine::onMessageSent(MessageToken token, bool ok) if (f->second.status == MessageStatus::SENDING) { if (ok) { f->second.status = MessageStatus::SENT; - emitSignal<DRing::ConfigurationSignal::AccountMessageStatus>(token, DRing::Account::MessageStates::SENT); + emitSignal<DRing::ConfigurationSignal::AccountMessageStatusChanged>(account_.getAccountID(), + token, + f->second.to, + static_cast<int>(DRing::Account::MessageStates::SENT)); } else if (f->second.retried == MAX_RETRIES) { f->second.status = MessageStatus::FAILURE; - emitSignal<DRing::ConfigurationSignal::AccountMessageStatus>(token, DRing::Account::MessageStates::FAILURE); + emitSignal<DRing::ConfigurationSignal::AccountMessageStatusChanged>(account_.getAccountID(), + token, + f->second.to, + static_cast<int>(DRing::Account::MessageStates::FAILURE)); } else { f->second.status = MessageStatus::IDLE; // TODO: reschedule sending diff --git a/src/manager.cpp b/src/manager.cpp index 4a3b82c4f7..79e50e4ad9 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -1408,7 +1408,7 @@ Manager::scheduleTask(std::shared_ptr<Runnable> task, std::chrono::steady_clock: { std::lock_guard<std::mutex> lock(scheduledTasksMutex_); scheduledTasks_.emplace(when, task); - RING_DBG("Task scheduled. Next in %lds", std::chrono::duration_cast<std::chrono::seconds>(scheduledTasks_.begin()->first - std::chrono::steady_clock::now()).count()); + RING_DBG("Task scheduled. Next in %llds", std::chrono::duration_cast<std::chrono::seconds>(scheduledTasks_.begin()->first - std::chrono::steady_clock::now()).count()); } // Must be invoked periodically by a timer from the main event loop @@ -2740,17 +2740,17 @@ uint64_t Manager::sendTextMessage(const std::string& accountID, const std::string& to, const std::map<std::string, std::string>& payloads) { - const auto acc = getAccount(accountID); - if (!acc) - return 0; - try { - return acc->sendTextMessage(to, payloads); - } catch (const std::exception& e) { - RING_ERR("Exception during text message sending: %s", e.what()); + if (const auto acc = getAccount(accountID)) { + try { + return acc->sendTextMessage(to, payloads); + } catch (const std::exception& e) { + RING_ERR("Exception during text message sending: %s", e.what()); + } } + return 0; } -std::string +int Manager::getMessageStatus(uint64_t id) { const auto& allAccounts = accountFactory_.getAllAccounts(); @@ -2760,19 +2760,19 @@ Manager::getMessageStatus(uint64_t id) switch (status) { case im::MessageStatus::IDLE: case im::MessageStatus::SENDING: - return DRing::Account::MessageStates::SENDING; + return static_cast<int>(DRing::Account::MessageStates::SENDING); case im::MessageStatus::SENT: - return DRing::Account::MessageStates::SENT; + return static_cast<int>(DRing::Account::MessageStates::SENT); case im::MessageStatus::READ: - return DRing::Account::MessageStates::READ; + return static_cast<int>(DRing::Account::MessageStates::READ); case im::MessageStatus::FAILURE: - return DRing::Account::MessageStates::FAILURE; + return static_cast<int>(DRing::Account::MessageStates::FAILURE); default: - return DRing::Account::MessageStates::UNKNOWN; + return static_cast<int>(DRing::Account::MessageStates::UNKNOWN); } } } - return DRing::Account::MessageStates::UNKNOWN; + return static_cast<int>(DRing::Account::MessageStates::UNKNOWN); } void diff --git a/src/manager.h b/src/manager.h index eb3edcd4e2..5747912611 100644 --- a/src/manager.h +++ b/src/manager.h @@ -419,7 +419,7 @@ class Manager { uint64_t sendTextMessage(const std::string& accountID, const std::string& to, const std::map<std::string, std::string>& payloads); - std::string getMessageStatus(uint64_t id); + int getMessageStatus(uint64_t id); /** * Get account list diff --git a/src/ringdht/ringaccount.cpp b/src/ringdht/ringaccount.cpp index 2515e7ce54..0843fe93c0 100644 --- a/src/ringdht/ringaccount.cpp +++ b/src/ringdht/ringaccount.cpp @@ -963,7 +963,7 @@ RingAccount::doRegister_() std::map<std::string, std::string> payloads = {{"text/plain", utf8_make_valid(v.msg)}}; shared->onTextMessage(from, payloads); - RING_WARN("Sending message confirmation %lu", v.id); + RING_DBG("Sending message confirmation %llu", v.id); this_.dht_.putEncrypted(inboxKey, v.from, dht::ImMessage(v.id, std::string(), now)); @@ -1429,7 +1429,7 @@ RingAccount::sendTextMessage(const std::string& to, const std::map<std::string, return true; } this_->sentMessages_.erase(e); - RING_WARN("Relevent text message reply for %lu", token); + RING_DBG("Relevant text message reply for %llu", token); // add treated message auto res = this_->treatedMessages_.insert(msg.id); diff --git a/src/sip/sipaccountbase.cpp b/src/sip/sipaccountbase.cpp index e1db0a5923..3fba632ccb 100644 --- a/src/sip/sipaccountbase.cpp +++ b/src/sip/sipaccountbase.cpp @@ -46,7 +46,9 @@ namespace ring { SIPAccountBase::SIPAccountBase(const std::string& accountID) - : Account(accountID), link_(getSIPVoIPLink()), messageEngine_(*this, fileutils::get_cache_dir()+DIR_SEPARATOR_STR+getAccountID()+DIR_SEPARATOR_STR "messages") + : Account(accountID), + messageEngine_(*this, fileutils::get_cache_dir()+DIR_SEPARATOR_STR+getAccountID()+DIR_SEPARATOR_STR "messages"), + link_(getSIPVoIPLink()) {} SIPAccountBase::~SIPAccountBase() {} -- GitLab