qTox  Version: nightly | Commit: bc751c8e1cac455f9690654fcfe0f560d2d7dfdd
friendmessagedispatcher.cpp
Go to the documentation of this file.
1 /*
2  Copyright © 2019 by The qTox Project Contributors
3 
4  This file is part of qTox, a Qt-based graphical interface for Tox.
5 
6  qTox is libre software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  qTox is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with qTox. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
22 #include "src/model/status.h"
23 
25  ICoreFriendMessageSender& messageSender_,
26  ICoreExtPacketAllocator& coreExtPacketAllocator_)
27  : f(f_)
28  , messageSender(messageSender_)
29  , processor(std::move(processor_))
30  , coreExtPacketAllocator(coreExtPacketAllocator_)
31 {
33 }
34 
38 std::pair<DispatchedMessageId, DispatchedMessageId>
39 FriendMessageDispatcher::sendMessage(bool isAction, const QString& content)
40 {
41  const auto firstId = nextMessageId;
42  auto lastId = nextMessageId;
43  for (const auto& message : processor.processOutgoingMessage(isAction, content, f.getSupportedExtensions())) {
44  auto messageId = nextMessageId++;
45  lastId = messageId;
46 
47  auto onOfflineMsgComplete = getCompletionFn(messageId);
48  sendProcessedMessage(message, onOfflineMsgComplete);
49 
50  emit this->messageSent(messageId, message);
51  }
52  return std::make_pair(firstId, lastId);
53 }
54 
58 std::pair<DispatchedMessageId, DispatchedMessageId>
60 {
61  const auto firstId = nextMessageId;
62  auto lastId = nextMessageId;
63 
64  for (const auto& message : processor.processOutgoingMessage(false, content, extensions)) {
65  auto messageId = nextMessageId++;
66  lastId = messageId;
67 
68  auto onOfflineMsgComplete = getCompletionFn(messageId);
69  sendProcessedMessage(message, onOfflineMsgComplete);
70 
71  emit this->messageSent(messageId, message);
72  }
73  return std::make_pair(firstId, lastId);
74 }
75 
81 void FriendMessageDispatcher::onMessageReceived(bool isAction, const QString& content)
82 {
83  emit this->messageReceived(f.getPublicKey(), processor.processIncomingCoreMessage(isAction, content));
84 }
85 
91 {
93 }
94 
96 {
98  emit this->messageReceived(f.getPublicKey(), message);
99 }
100 
102 {
104 }
105 
111 {
112  if (isOnline) {
113  auto messagesToResend = offlineMsgEngine.removeAllMessages();
114  for (auto const& message : messagesToResend) {
115  sendProcessedMessage(message.message, message.callback);
116  }
117  }
118 }
119 
124 {
126 }
127 
128 
130 {
131  if (!Status::isOnline(f.getStatus())) {
132  offlineMsgEngine.addUnsentMessage(message, onOfflineMsgComplete);
133  return;
134  }
135 
136  if (message.extensionSet[ExtensionType::messages] && !message.isAction) {
137  sendExtendedProcessedMessage(message, onOfflineMsgComplete);
138  } else {
139  sendCoreProcessedMessage(message, onOfflineMsgComplete);
140  }
141 }
142 
143 
144 
146 {
147  assert(!message.isAction); // Actions not supported with extensions
148 
149  if ((f.getSupportedExtensions() & message.extensionSet) != message.extensionSet) {
150  onOfflineMsgComplete(false);
151  return;
152  }
153 
154  auto receipt = ExtendedReceiptNum();
155 
156  const auto friendId = f.getId();
157  auto packet = coreExtPacketAllocator.getPacket(friendId);
158 
159  if (message.extensionSet[ExtensionType::messages]) {
160  receipt.get() = packet->addExtendedMessage(message.content);
161  }
162 
163  const auto messageSent = packet->send();
164 
165  if (messageSent) {
166  offlineMsgEngine.addSentExtendedMessage(receipt, message, onOfflineMsgComplete);
167  } else {
168  offlineMsgEngine.addUnsentMessage(message, onOfflineMsgComplete);
169  }
170 }
171 
173 {
174  auto receipt = ReceiptNum();
175 
176  uint32_t friendId = f.getId();
177 
178  auto sendFn = message.isAction ? std::mem_fn(&ICoreFriendMessageSender::sendAction)
180 
181  const auto messageSent = sendFn(messageSender, friendId, message.content, receipt);
182 
183  if (messageSent) {
184  offlineMsgEngine.addSentCoreMessage(receipt, message, onOfflineMsgComplete);
185  } else {
186  offlineMsgEngine.addUnsentMessage(message, onOfflineMsgComplete);
187  }
188 }
189 
191 {
192  return [this, messageId] (bool success) {
193  if (success) {
194  emit this->messageComplete(messageId);
195  } else {
196  // For now we know the only reason we can fail after giving to the
197  // offline message engine is due to a reduced extension set
199  }
200  };
201 }
FriendMessageDispatcher::clearOutgoingMessages
void clearOutgoingMessages()
Clears all currently outgoing messages.
Definition: friendmessagedispatcher.cpp:123
FriendMessageDispatcher::sendProcessedMessage
void sendProcessedMessage(Message const &msg, OfflineMsgEngine::CompletionFn fn)
Definition: friendmessagedispatcher.cpp:129
FriendMessageDispatcher::onReceiptReceived
void onReceiptReceived(ReceiptNum receipt)
Handles received receipt from toxcore.
Definition: friendmessagedispatcher.cpp:90
ICoreFriendMessageSender::sendAction
virtual bool sendAction(uint32_t friendId, const QString &action, ReceiptNum &receipt)=0
BrokenMessageReason::unsupportedExtensions
@ unsupportedExtensions
Friend::onlineOfflineChanged
void onlineOfflineChanged(const ToxPk &friendId, bool isOnline)
FriendMessageDispatcher::offlineMsgEngine
OfflineMsgEngine offlineMsgEngine
Definition: friendmessagedispatcher.h:64
settings.h
ICoreFriendMessageSender::sendMessage
virtual bool sendMessage(uint32_t friendId, const QString &message, ReceiptNum &receipt)=0
FriendMessageDispatcher::onExtMessageReceived
void onExtMessageReceived(const QString &message)
Definition: friendmessagedispatcher.cpp:95
ICoreFriendMessageSender
Definition: icorefriendmessagesender.h:27
FriendMessageDispatcher::sendExtendedProcessedMessage
void sendExtendedProcessedMessage(Message const &msg, OfflineMsgEngine::CompletionFn fn)
Definition: friendmessagedispatcher.cpp:145
FriendMessageDispatcher::sendExtendedMessage
std::pair< DispatchedMessageId, DispatchedMessageId > sendExtendedMessage(const QString &content, ExtensionSet extensions) override
Definition: friendmessagedispatcher.cpp:59
FriendMessageDispatcher::f
Friend & f
Definition: friendmessagedispatcher.h:59
IMessageDispatcher::messageSent
void messageSent(DispatchedMessageId id, const Message &message)
Emitted when a message is processed and sent.
FriendMessageDispatcher::FriendMessageDispatcher
FriendMessageDispatcher(Friend &f, MessageProcessor processor, ICoreFriendMessageSender &messageSender, ICoreExtPacketAllocator &coreExt)
Definition: friendmessagedispatcher.cpp:24
MessageProcessor::processIncomingExtMessage
Message processIncomingExtMessage(const QString &content)
Definition: message.cpp:155
ExtensionType::messages
@ messages
Definition: extension.h:28
FriendMessageDispatcher::processor
MessageProcessor processor
Definition: friendmessagedispatcher.h:65
Friend::getStatus
Status::Status getStatus() const
Definition: friend.cpp:190
FriendMessageDispatcher::getCompletionFn
OfflineMsgEngine::CompletionFn getCompletionFn(DispatchedMessageId messageId)
Definition: friendmessagedispatcher.cpp:190
OfflineMsgEngine::addSentCoreMessage
void addSentCoreMessage(ReceiptNum receipt, Message const &message, CompletionFn completionCallback)
Add a message which has been saved to history, and which has been sent to the peer.
Definition: offlinemsgengine.cpp:74
FriendMessageDispatcher::onMessageReceived
void onMessageReceived(bool isAction, const QString &content)
Handles received message from toxcore.
Definition: friendmessagedispatcher.cpp:81
Friend::getSupportedExtensions
ExtensionSet getSupportedExtensions() const
Definition: friend.cpp:206
HistMessageContentType::message
@ message
IMessageDispatcher::messageComplete
void messageComplete(DispatchedMessageId id)
Emitted when a receiver report is received from the associated chat.
OfflineMsgEngine::onReceiptReceived
void onReceiptReceived(ReceiptNum receipt)
Notification that the message is now delivered.
Definition: offlinemsgengine.cpp:37
ToxPk
This class represents a Tox Public Key, which is a part of Tox ID.
Definition: toxpk.h:26
Friend
Definition: friend.h:31
ExtendedReceiptNum
NamedType< uint32_t, struct ExtendedReceiptNumTag, Orderable > ExtendedReceiptNum
Definition: receiptnum.h:30
OfflineMsgEngine::addUnsentMessage
void addUnsentMessage(Message const &message, CompletionFn completionCallback)
Add a message which has been saved to history, but not sent yet to the peer.
Definition: offlinemsgengine.cpp:58
DispatchedMessageId
NamedType< size_t, struct SentMessageIdTag, Orderable, Incrementable > DispatchedMessageId
Definition: imessagedispatcher.h:31
FriendMessageDispatcher::messageSender
ICoreFriendMessageSender & messageSender
Definition: friendmessagedispatcher.h:63
ICoreExtPacketAllocator::getPacket
virtual std::unique_ptr< ICoreExtPacket > getPacket(uint32_t friendId)=0
Gets a new packet builder for friend with core friend id friendId.
FriendMessageDispatcher::sendMessage
std::pair< DispatchedMessageId, DispatchedMessageId > sendMessage(bool isAction, const QString &content) override
Definition: friendmessagedispatcher.cpp:39
MessageProcessor::processOutgoingMessage
std::vector< Message > processOutgoingMessage(bool isAction, const QString &content, ExtensionSet extensions)
Converts an outgoing message into one (or many) sanitized Message(s)
Definition: message.cpp:86
ExtensionSet
std::bitset< ExtensionType::max > ExtensionSet
Definition: extension.h:32
MessageProcessor::processIncomingCoreMessage
Message processIncomingCoreMessage(bool isAction, const QString &content)
Converts an incoming message into a sanitized Message.
Definition: message.cpp:118
OfflineMsgEngine::removeAllMessages
std::vector< RemovedMessage > removeAllMessages()
Removes all messages which are being tracked.
Definition: offlinemsgengine.cpp:91
OfflineMsgEngine::addSentExtendedMessage
void addSentExtendedMessage(ExtendedReceiptNum receipt, Message const &message, CompletionFn completionCallback)
Definition: offlinemsgengine.cpp:81
OfflineMsgEngine::CompletionFn
std::function< void(bool)> CompletionFn
Definition: offlinemsgengine.h:41
Friend::getPublicKey
const ToxPk & getPublicKey() const
Definition: friend.cpp:131
FriendMessageDispatcher::sendCoreProcessedMessage
void sendCoreProcessedMessage(Message const &msg, OfflineMsgEngine::CompletionFn fn)
Definition: friendmessagedispatcher.cpp:172
IMessageDispatcher::messageReceived
void messageReceived(const ToxPk &sender, const Message &message)
Emitted when a message is received and processed.
OfflineMsgEngine::onExtendedReceiptReceived
void onExtendedReceiptReceived(ExtendedReceiptNum receipt)
Definition: offlinemsgengine.cpp:43
FriendMessageDispatcher::onFriendOnlineOfflineChanged
void onFriendOnlineOfflineChanged(const ToxPk &key, bool isOnline)
Handles status change for friend.
Definition: friendmessagedispatcher.cpp:110
ReceiptNum
NamedType< uint32_t, struct ReceiptNumTag, Orderable > ReceiptNum
Definition: receiptnum.h:27
MessageProcessor
Definition: message.h:62
FriendMessageDispatcher::nextMessageId
DispatchedMessageId nextMessageId
Definition: friendmessagedispatcher.h:61
Friend::getId
uint32_t getId() const override
Definition: friend.cpp:136
Status::isOnline
bool isOnline(Status status)
Definition: status.cpp:83
FriendMessageDispatcher::onExtReceiptReceived
void onExtReceiptReceived(uint64_t receiptId)
Definition: friendmessagedispatcher.cpp:101
ICoreExtPacketAllocator
Definition: icoreextpacket.h:63
FriendMessageDispatcher::coreExtPacketAllocator
ICoreExtPacketAllocator & coreExtPacketAllocator
Definition: friendmessagedispatcher.h:60
IMessageDispatcher::messageBroken
void messageBroken(DispatchedMessageId id, BrokenMessageReason reason)
status.h
Message
Definition: message.h:52
friendmessagedispatcher.h