diff --git a/bin/dbus/configurationmanager-introspec.xml b/bin/dbus/configurationmanager-introspec.xml index 50f4a6108b4180bc5d388df8d0df4e51f6dcf28e..d06a812a1afbeec61c2d7d5f56792312bc0b2233 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 e40eaf20872b8d97dae6fe1f7f81f94d84b1a0f7..a3c8c08b3dff52067046658aed2ccc0aecdb41fa 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 e4737e65297d42fed5b8b1eef1d87cac2ac0d3f4..52b5da537fb28fdf8a1793e40d2a729899747e5d 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 214a7d5e63919ea2104fec519bfd71e7fd2f6849..d8f91e9dce638abdc473b42e63301b88a98347e4 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 2e0158ec40d98ba207d6f384280838917e69e791..3e3bd5daa0c790f24820cc1438e372c22c2578f9 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 56b3370be0153a9b552f2f3e5bbb6906dae533dc..de7aa4f093400d7a94737d14ced47cb89edcadf0 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 1a8551c67b195bbe39369388d802d80c978dc8b8..e1edc894a99603b68f54e363a43ae9351ef51aef 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 4a3b82c4f7618799c6f4d791385b2108e59c76e3..79e50e4ad983876e9cbb83853fe0bc6cebe9ad50 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 eb3edcd4e23f901b6800ed92533837686edcea41..5747912611944dd1f0459385fa748057bbe7b3f8 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 2515e7ce5432a4c72a6d90e930c5e552e65b4fd5..0843fe93c0eaae25d26e0d33264f01c8667ef3b1 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 e1db0a592383b2c2259fa4b2c79ad4e566a94cb8..3fba632ccbc9c08baa557f883ba3bbbc898057d4 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() {}