diff --git a/src/blackmisc/network/textmessage.cpp b/src/blackmisc/network/textmessage.cpp index 61a7e01bb..cbd7b7406 100644 --- a/src/blackmisc/network/textmessage.cpp +++ b/src/blackmisc/network/textmessage.cpp @@ -65,6 +65,31 @@ namespace BlackMisc } } + bool CTextMessage::canBeAppended(const CTextMessage &textMessage) const + { + if (textMessage.isEmpty()) { return false; } + if (this->getSenderCallsign() != textMessage.getSenderCallsign()) { return false; } + if (this->isRadioMessage() && textMessage.isRadioMessage()) + { + if (this->getFrequency() != textMessage.getFrequency()) { return false; } + return true; + } + else if (this->isPrivateMessage() && textMessage.isPrivateMessage()) + { + if (this->getRecipientCallsign() != textMessage.getRecipientCallsign()) { return false; } + return true; + } + return false; + } + + bool CTextMessage::appendIfPossible(const CTextMessage &textMessage) + { + if (textMessage.isEmpty()) { return false; } + if (!this->canBeAppended(textMessage)) { return false; } + m_message += " " + textMessage.getMessage(); + return true; + } + QString CTextMessage::getRecipientCallsignOrFrequency() const { if (!m_recipientCallsign.isEmpty()) { return m_recipientCallsign.asString(); } diff --git a/src/blackmisc/network/textmessage.h b/src/blackmisc/network/textmessage.h index 6a507a66c..f27b66b5e 100644 --- a/src/blackmisc/network/textmessage.h +++ b/src/blackmisc/network/textmessage.h @@ -153,6 +153,12 @@ namespace BlackMisc //! \remark also sets current timestamp if there is no valid timestamp void markAsSent(); + //! Can another message be appended + bool canBeAppended(const CTextMessage &textMessage) const; + + //! Append if possible + bool appendIfPossible(const CTextMessage &textMessage); + //! Get SELCAL code (if applicable, e.g. ABCD), otherwise "" QString getSelcalCode() const; diff --git a/src/blackmisc/network/textmessagelist.cpp b/src/blackmisc/network/textmessagelist.cpp index 763e2659d..ef3984426 100644 --- a/src/blackmisc/network/textmessagelist.cpp +++ b/src/blackmisc/network/textmessagelist.cpp @@ -109,5 +109,14 @@ namespace BlackMisc std::for_each(this->begin(), this->end(), [](CTextMessage & tm) { tm.markAsSent(); }); } + void CTextMessageList::addConsolidatedTextMessage(const CTextMessage &message) + { + if (message.isEmpty()) { return; } + for (CTextMessage &tm : *this) + { + if (tm.appendIfPossible(message)) { return; } + } + this->push_back(message); + } } // namespace } // namespace diff --git a/src/blackmisc/network/textmessagelist.h b/src/blackmisc/network/textmessagelist.h index 21b63a9ec..f8f810e2a 100644 --- a/src/blackmisc/network/textmessagelist.h +++ b/src/blackmisc/network/textmessagelist.h @@ -88,6 +88,8 @@ namespace BlackMisc //! Mark all messages as sent void markAsSent(); + //! Add a text message, but append it to an existing message if possible + void addConsolidatedTextMessage(const CTextMessage &message); }; } //namespace } // namespace