From 64b17b787c4f3d117e5d303c5ed8eac84d84f3a2 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 21 Nov 2019 21:52:26 +0100 Subject: [PATCH] Ref T761, relay original sender AND recipient * display sent messages of partner callsing as send by myself * allow PMs from partner as normal PMs --- src/blackcore/context/contextnetworkimpl.cpp | 40 ++++++++++++++++---- src/blackmisc/network/textmessage.cpp | 14 +++++-- src/blackmisc/network/textmessagelist.cpp | 25 ++++++++++++ src/blackmisc/network/textmessagelist.h | 9 +++++ 4 files changed, 77 insertions(+), 11 deletions(-) diff --git a/src/blackcore/context/contextnetworkimpl.cpp b/src/blackcore/context/contextnetworkimpl.cpp index 4ed65a84a..a6c6d060d 100644 --- a/src/blackcore/context/contextnetworkimpl.cpp +++ b/src/blackcore/context/contextnetworkimpl.cpp @@ -711,8 +711,34 @@ namespace BlackCore void CContextNetwork::onTextMessagesReceived(const CTextMessageList &messages) { - const CTextMessageList textMessages = messages.withRelayedToPrivateMessages(); - emit this->textMessagesReceived(textMessages); // relayed messaged "now look like PMs" + if (messages.isEmpty()) { return; } + + const CCallsign partnerCallsign = this->getPartnerCallsign(); + const CCallsign ownCallsign = this->ownAircraft().getCallsign(); + + CTextMessageList textMessages = messages.withRelayedToPrivateMessages(); + CTextMessageList partnerMessages; + + if (!partnerCallsign.isEmpty()) + { + partnerMessages = textMessages.findBySender(partnerCallsign); + const CTextMessageList relayedSentMessages = partnerMessages.findByNotForRecipient(ownCallsign).markedAsSent(); + partnerMessages = partnerMessages.findByRecipient(ownCallsign); // really send to me as PM and not a forwared one + + // avoid infinite rountrips + textMessages = textMessages.withRemovedPrivateMessagesFromCallsign(partnerCallsign); + + // fake those as sent by myself + for (const CTextMessage &rsm : relayedSentMessages) + { + emit this->textMessageSent(rsm); + } + } + + // 1) relayed messaged "now look like PMs" + // 2) all messaged of partner are EXCLUDED + if (!textMessages.isEmpty()) { emit this->textMessagesReceived(textMessages); } + if (!partnerMessages.isEmpty()) { emit this->textMessagesReceived(partnerMessages); } if (textMessages.containsPrivateMessages()) { @@ -722,13 +748,12 @@ namespace BlackCore emit this->supervisorTextMessageReceived(m); } - // part to send to partner "forward" - const CCallsign partnerCallsign = this->getPartnerCallsign(); + // part to send to partner, "forward/relay" to partner if (!partnerCallsign.isEmpty()) { - // IMPORTANT: use messages AND NOT textMessages here, exclude messages from partner to avoid infinite roundtrips + // IMPORTANT: partner messages already received CTextMessageList relayedMessages; - const CTextMessageList privateMessages = messages.getPrivateMessages().withRemovedPrivateMessagesFromCallsign(partnerCallsign); + const CTextMessageList privateMessages = messages.getPrivateMessages(); for (const CTextMessage &m : privateMessages) { this->createRelayMessageToPartnerCallsign(m, partnerCallsign, relayedMessages); @@ -753,8 +778,9 @@ namespace BlackCore if (message.isPrivateMessage()) { + // forward messages which are NO real PMs tp the partner const CCallsign partnerCallsign = this->getPartnerCallsign(); - if (!partnerCallsign.isEmpty()) + if (!partnerCallsign.isEmpty() && message.getRecipientCallsign() != partnerCallsign) { QPointer myself(this); CTextMessageList relayedMessages; diff --git a/src/blackmisc/network/textmessage.cpp b/src/blackmisc/network/textmessage.cpp index f47188800..6a8ea774b 100644 --- a/src/blackmisc/network/textmessage.cpp +++ b/src/blackmisc/network/textmessage.cpp @@ -82,11 +82,12 @@ namespace BlackMisc void CTextMessage::makeRelayedMessage(const CCallsign &partnerCallsign) { if (this->getMessage().startsWith(CTextMessage::swiftRelayMessage())) { return; } + const QString sender = this->getSenderCallsign().asString(); + const QString recipient = this->getRecipientCallsign().asString(); this->markAsRelayedMessage(); this->setRecipientCallsign(partnerCallsign); m_recipientCallsign.setTypeHint(CCallsign::Aircraft); - const QString sender = this->getSenderCallsign().asString(); - const QString newMessage = CTextMessage::swiftRelayMessage() % sender % u";" % this->getMessage(); + const QString newMessage = CTextMessage::swiftRelayMessage() % sender % u" " % recipient % u";" % this->getMessage(); m_message = newMessage; } @@ -96,8 +97,13 @@ namespace BlackMisc const int index = m_message.indexOf(';'); if (index < CTextMessage::swiftRelayMessage().length()) { return false; } if (m_message.length() <= index + 1) { return false; } // no next line - const QString originalSender = m_message.left(index).remove(CTextMessage::swiftRelayMessage()).trimmed(); - this->setSenderCallsign(CCallsign(originalSender)); // sender can be aircraft or ATC + const QString senderRecipient = m_message.left(index).remove(CTextMessage::swiftRelayMessage()).trimmed(); + const QStringList sr = senderRecipient.split(' '); + if (sr.size() != 2) { return false; } + const QString originalSender = sr.first(); + const QString originalRecipient = sr.last(); + this->setSenderCallsign(CCallsign(originalSender)); // sender can be aircraft or ATC + this->setRecipientCallsign(CCallsign(originalRecipient)); // recipient can be aircraft or ATC m_message = m_message.mid(index + 1); return true; } diff --git a/src/blackmisc/network/textmessagelist.cpp b/src/blackmisc/network/textmessagelist.cpp index 0e236e30b..b1bedc8ec 100644 --- a/src/blackmisc/network/textmessagelist.cpp +++ b/src/blackmisc/network/textmessagelist.cpp @@ -97,6 +97,31 @@ namespace BlackMisc return this->findBy(&CTextMessage::getFrequency, frequency); } + CTextMessageList CTextMessageList::findBySender(const CCallsign &sender) const + { + return this->findBy(&CTextMessage::getSenderCallsign, sender); + } + + CTextMessageList CTextMessageList::findByRecipient(const CCallsign &recipient) const + { + return this->findBy(&CTextMessage::getRecipientCallsign, recipient); + } + + CTextMessageList CTextMessageList::findByNotForRecipient(const CCallsign &recipient) const + { + CTextMessageList result; + if (recipient.isEmpty()) { return result; } + for (const CTextMessage &m : *this) + { + if (m.getRecipientCallsign().isEmpty()) { continue; } + if (m.getRecipientCallsign() != recipient) + { + result.push_back(m); + } + } + return result; + } + void CTextMessageList::toggleSenderRecipients() { if (this->isEmpty()) { return; } diff --git a/src/blackmisc/network/textmessagelist.h b/src/blackmisc/network/textmessagelist.h index fd3ec02f2..b5e9f6b52 100644 --- a/src/blackmisc/network/textmessagelist.h +++ b/src/blackmisc/network/textmessagelist.h @@ -82,6 +82,15 @@ namespace BlackMisc //! Find by frequency CTextMessageList findByFrequency(const PhysicalQuantities::CFrequency &frequency) const; + //! Find by sender + CTextMessageList findBySender(const BlackMisc::Aviation::CCallsign &sender) const; + + //! Find by recipient + CTextMessageList findByRecipient(const BlackMisc::Aviation::CCallsign &recipient) const; + + //! Find by recipient is NOT addressed + CTextMessageList findByNotForRecipient(const BlackMisc::Aviation::CCallsign &recipient) const; + //! Toggle all sender <-> recipients void toggleSenderRecipients();