qTox  Version: nightly | Commit: bc751c8e1cac455f9690654fcfe0f560d2d7dfdd
offlinemsgengine.h
Go to the documentation of this file.
1 /*
2  Copyright © 2014-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 
20 #pragma once
21 
23 #include "src/core/core.h"
24 #include "src/model/message.h"
26 
27 #include "util/compatiblerecursivemutex.h"
28 
29 #include <QDateTime>
30 #include <QMap>
31 #include <QMutex>
32 #include <QObject>
33 #include <QSet>
34 #include <chrono>
35 
36 
37 class OfflineMsgEngine : public QObject
38 {
39  Q_OBJECT
40 public:
41  using CompletionFn = std::function<void(bool)>;
42  OfflineMsgEngine() = default;
43  void addUnsentMessage(Message const& message, CompletionFn completionCallback);
44  void addSentCoreMessage(ReceiptNum receipt, Message const& message, CompletionFn completionCallback);
45  void addSentExtendedMessage(ExtendedReceiptNum receipt, Message const& message, CompletionFn completionCallback);
46 
48  {
51  };
52  std::vector<RemovedMessage> removeAllMessages();
53 
54 public slots:
55  void onReceiptReceived(ReceiptNum receipt);
57 
58 private:
60  {
62  std::chrono::time_point<std::chrono::steady_clock> authorshipTime;
64  };
65 
66  CompatibleRecursiveMutex mutex;
67 
68  template <class ReceiptT>
70  {
71  public:
72  void notifyMessageSent(ReceiptT receipt, OfflineMessage const& message)
73  {
74  auto receivedReceiptIt = std::find(
75  receivedReceipts.begin(), receivedReceipts.end(), receipt);
76 
77  if (receivedReceiptIt != receivedReceipts.end()) {
78  receivedReceipts.erase(receivedReceiptIt);
79  message.completionFn(true);
80  return;
81  }
82 
83  unAckedMessages[receipt] = message;
84  }
85 
86  void notifyReceiptReceived(ReceiptT receipt)
87  {
88  auto unackedMessageIt = unAckedMessages.find(receipt);
89  if (unackedMessageIt != unAckedMessages.end()) {
90  unackedMessageIt->second.completionFn(true);
91  unAckedMessages.erase(unackedMessageIt);
92  return;
93  }
94 
95  receivedReceipts.push_back(receipt);
96  }
97 
98  std::vector<OfflineMessage> clear()
99  {
100  auto ret = std::vector<OfflineMessage>();
101  std::transform(
102  std::make_move_iterator(unAckedMessages.begin()), std::make_move_iterator(unAckedMessages.end()),
103  std::back_inserter(ret),
104  [] (const std::pair<ReceiptT, OfflineMessage>& pair) {
105  return std::move(pair.second);
106  });
107 
108  receivedReceipts.clear();
109  unAckedMessages.clear();
110  return ret;
111  }
112 
113  std::vector<ReceiptT> receivedReceipts;
114  std::map<ReceiptT, OfflineMessage> unAckedMessages;
115  };
116 
119  std::vector<OfflineMessage> unsentMessages;
120 };
OfflineMsgEngine::extendedReceiptResolver
ReceiptResolver< ExtendedReceiptNum > extendedReceiptResolver
Definition: offlinemsgengine.h:118
OfflineMsgEngine::OfflineMessage
Definition: offlinemsgengine.h:59
OfflineMsgEngine::ReceiptResolver::notifyReceiptReceived
void notifyReceiptReceived(ReceiptT receipt)
Definition: offlinemsgengine.h:86
OfflineMsgEngine::OfflineMsgEngine
OfflineMsgEngine()=default
OfflineMsgEngine
Definition: offlinemsgengine.h:37
OfflineMsgEngine::ReceiptResolver::receivedReceipts
std::vector< ReceiptT > receivedReceipts
Definition: offlinemsgengine.h:113
OfflineMsgEngine::mutex
CompatibleRecursiveMutex mutex
Definition: offlinemsgengine.h:66
OfflineMsgEngine::ReceiptResolver::clear
std::vector< OfflineMessage > clear()
Definition: offlinemsgengine.h:98
OfflineMsgEngine::OfflineMessage::completionFn
CompletionFn completionFn
Definition: offlinemsgengine.h:63
message.h
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
HistMessageContentType::message
@ message
OfflineMsgEngine::onReceiptReceived
void onReceiptReceived(ReceiptNum receipt)
Notification that the message is now delivered.
Definition: offlinemsgengine.cpp:37
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
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
OfflineMsgEngine::RemovedMessage
Definition: offlinemsgengine.h:47
OfflineMsgEngine::RemovedMessage::message
Message message
Definition: offlinemsgengine.h:49
OfflineMsgEngine::OfflineMessage::message
Message message
Definition: offlinemsgengine.h:61
OfflineMsgEngine::OfflineMessage::authorshipTime
std::chrono::time_point< std::chrono::steady_clock > authorshipTime
Definition: offlinemsgengine.h:62
OfflineMsgEngine::onExtendedReceiptReceived
void onExtendedReceiptReceived(ExtendedReceiptNum receipt)
Definition: offlinemsgengine.cpp:43
core.h
ReceiptNum
NamedType< uint32_t, struct ReceiptNumTag, Orderable > ReceiptNum
Definition: receiptnum.h:27
chatmessage.h
OfflineMsgEngine::receiptResolver
ReceiptResolver< ReceiptNum > receiptResolver
Definition: offlinemsgengine.h:117
OfflineMsgEngine::RemovedMessage::callback
CompletionFn callback
Definition: offlinemsgengine.h:50
rawdatabase.h
OfflineMsgEngine::ReceiptResolver::notifyMessageSent
void notifyMessageSent(ReceiptT receipt, OfflineMessage const &message)
Definition: offlinemsgengine.h:72
OfflineMsgEngine::ReceiptResolver::unAckedMessages
std::map< ReceiptT, OfflineMessage > unAckedMessages
Definition: offlinemsgengine.h:114
OfflineMsgEngine::unsentMessages
std::vector< OfflineMessage > unsentMessages
Definition: offlinemsgengine.h:119
Message
Definition: message.h:52
OfflineMsgEngine::ReceiptResolver
Definition: offlinemsgengine.h:69