diff --git a/src/chat/chat-message/imdn-message-p.h b/src/chat/chat-message/imdn-message-p.h index 31262e9db..57b0678e9 100644 --- a/src/chat/chat-message/imdn-message-p.h +++ b/src/chat/chat-message/imdn-message-p.h @@ -29,7 +29,7 @@ LINPHONE_BEGIN_NAMESPACE class ImdnMessagePrivate : public NotificationMessagePrivate { public: - ImdnMessage::Context getContext () {return context;} + const ImdnMessage::Context &getContext () { return context; } private: ImdnMessagePrivate (const ImdnMessage::Context &context) diff --git a/src/chat/notification/imdn.cpp b/src/chat/notification/imdn.cpp index 7f70d2952..8afe38a6b 100644 --- a/src/chat/notification/imdn.cpp +++ b/src/chat/notification/imdn.cpp @@ -86,7 +86,7 @@ void Imdn::notifyDisplay (const shared_ptr &message) { void Imdn::onImdnMessageDelivered (const std::shared_ptr &message) { // If an IMDN has been successfully delivered, remove it from the list so that // it does not get sent again - ImdnMessage::Context context = message->getPrivate()->getContext(); + auto context = message->getPrivate()->getContext(); for (const auto &deliveredMsg : context.deliveredMessages) deliveredMessages.remove(deliveredMsg); @@ -113,15 +113,9 @@ void Imdn::onGlobalStateChanged (LinphoneGlobalState state) { void Imdn::onNetworkReachable (bool sipNetworkReachable, bool mediaNetworkReachable) { if (sipNetworkReachable) { - // When the SIP network gets up, retry sending every IMDN message that has not - // successfully been delivered - auto messages = sentImdnMessages; + // When the SIP network gets up, retry notification sentImdnMessages.clear(); - for (const auto &message : messages) { - auto imdnMessage = chatRoom->getPrivate()->createImdnMessage(message); - sentImdnMessages.push_back(imdnMessage); - imdnMessage->send(); - } + send(); } } @@ -208,26 +202,37 @@ int Imdn::timerExpired (void *data, unsigned int revents) { // ----------------------------------------------------------------------------- +bool Imdn::aggregationEnabled () const { + auto config = linphone_core_get_config(chatRoom->getCore()->getCCore()); + bool aggregateImdn = linphone_config_get_bool(config, "misc", "aggregate_imdn", TRUE); + return (chatRoom->canHandleCpim() && aggregateImdn); +} + void Imdn::send () { bool networkReachable = linphone_core_is_network_reachable(chatRoom->getCore()->getCCore()); + if (!networkReachable) + return; + if (!deliveredMessages.empty() || !displayedMessages.empty()) { auto imdnMessage = chatRoom->getPrivate()->createImdnMessage(deliveredMessages, displayedMessages); sentImdnMessages.push_back(imdnMessage); - if (networkReachable) - imdnMessage->getPrivate()->send(); + imdnMessage->getPrivate()->send(); + if (!aggregationEnabled()) { + deliveredMessages.clear(); + displayedMessages.clear(); + } } if (!nonDeliveredMessages.empty()) { auto imdnMessage = chatRoom->getPrivate()->createImdnMessage(nonDeliveredMessages); sentImdnMessages.push_back(imdnMessage); - if (networkReachable) - imdnMessage->getPrivate()->send(); + imdnMessage->getPrivate()->send(); + if (!aggregationEnabled()) + nonDeliveredMessages.clear(); } } void Imdn::startTimer () { - auto config = linphone_core_get_config(chatRoom->getCore()->getCCore()); - bool aggregateImdn = linphone_config_get_bool(config, "misc", "aggregate_imdn", TRUE); - if (!chatRoom->canHandleCpim() || !aggregateImdn) { + if (!aggregationEnabled()) { // Compatibility mode for basic chat rooms, do not aggregate notifications send(); return; diff --git a/src/chat/notification/imdn.h b/src/chat/notification/imdn.h index 789cd4854..58755fdd8 100644 --- a/src/chat/notification/imdn.h +++ b/src/chat/notification/imdn.h @@ -46,7 +46,9 @@ public: MessageReason (const std::shared_ptr &message, LinphoneReason reason) : message(message), reason(reason) {} - bool operator== (const MessageReason &other) const {return message == other.message && reason == other.reason;} + bool operator== (const MessageReason &other) const { + return (message == other.message) && (reason == other.reason); + } const std::shared_ptr message; LinphoneReason reason; @@ -73,6 +75,7 @@ public: private: static int timerExpired (void *data, unsigned int revents); + bool aggregationEnabled () const; void send (); void startTimer (); void stopTimer ();