1 /***************************************************************************
2 * Copyright (C) 2005-2022 by the Quassel Project *
3 * devel@quassel-irc.org *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) version 3. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
19 ***************************************************************************/
21 #include "backlogrequester.h"
25 #include "backlogsettings.h"
26 #include "bufferviewoverlay.h"
27 #include "clientbacklogmanager.h"
29 BacklogRequester::BacklogRequester(bool buffering, RequesterType requesterType, ClientBacklogManager* backlogManager)
30 : backlogManager(backlogManager)
31 , _isBuffering(buffering)
32 , _requesterType(requesterType)
35 Q_ASSERT(backlogManager);
38 void BacklogRequester::setWaitingBuffers(const BufferIdList& buffers)
40 _buffersWaiting = {buffers.begin(), buffers.end()};
41 _totalBuffers = int(_buffersWaiting.size());
44 bool BacklogRequester::buffer(BufferId bufferId, const MessageList& messages)
46 _bufferedMessages << messages;
47 _buffersWaiting.erase(bufferId);
48 return !_buffersWaiting.empty();
51 BufferIdList BacklogRequester::allBufferIds() const
53 QSet<BufferId> bufferIds = Client::bufferViewOverlay()->bufferIds();
54 bufferIds += Client::bufferViewOverlay()->tempRemovedBufferIds();
55 return bufferIds.values();
58 void BacklogRequester::flushBuffer()
60 if (!_buffersWaiting.empty()) {
61 qWarning() << Q_FUNC_INFO << "was called before all backlog was received:" << _buffersWaiting.size() << "buffers are waiting.";
63 _bufferedMessages.clear();
65 _buffersWaiting.clear();
68 // ========================================
69 // FIXED BACKLOG REQUESTER
70 // ========================================
71 FixedBacklogRequester::FixedBacklogRequester(ClientBacklogManager* backlogManager)
72 : BacklogRequester(true, BacklogRequester::PerBufferFixed, backlogManager)
74 BacklogSettings backlogSettings;
75 _backlogCount = backlogSettings.fixedBacklogAmount();
78 void FixedBacklogRequester::requestBacklog(const BufferIdList& bufferIds)
80 setWaitingBuffers(bufferIds);
81 backlogManager->emitMessagesRequested(QObject::tr("Requesting a total of up to %1 backlog messages for %2 buffers")
82 .arg(_backlogCount * bufferIds.count())
83 .arg(bufferIds.count()));
84 foreach (BufferId bufferId, bufferIds) {
85 backlogManager->requestBacklog(bufferId, -1, -1, _backlogCount);
89 // ========================================
90 // GLOBAL UNREAD BACKLOG REQUESTER
91 // ========================================
92 GlobalUnreadBacklogRequester::GlobalUnreadBacklogRequester(ClientBacklogManager* backlogManager)
93 : BacklogRequester(false, BacklogRequester::GlobalUnread, backlogManager)
95 BacklogSettings backlogSettings;
96 _limit = backlogSettings.globalUnreadBacklogLimit();
97 _additional = backlogSettings.globalUnreadBacklogAdditional();
100 void GlobalUnreadBacklogRequester::requestInitialBacklog()
102 MsgId oldestUnreadMessage;
103 foreach (BufferId bufferId, allBufferIds()) {
104 MsgId msgId = Client::networkModel()->lastSeenMsgId(bufferId);
105 if (!oldestUnreadMessage.isValid() || oldestUnreadMessage > msgId)
106 oldestUnreadMessage = msgId;
108 backlogManager->emitMessagesRequested(
109 QObject::tr("Requesting up to %1 of all unread backlog messages (plus additional %2)").arg(_limit).arg(_additional));
110 backlogManager->requestBacklogAll(oldestUnreadMessage, -1, _limit, _additional);
113 // ========================================
114 // PER BUFFER UNREAD BACKLOG REQUESTER
115 // ========================================
116 PerBufferUnreadBacklogRequester::PerBufferUnreadBacklogRequester(ClientBacklogManager* backlogManager)
117 : BacklogRequester(true, BacklogRequester::PerBufferUnread, backlogManager)
119 BacklogSettings backlogSettings;
120 _limit = backlogSettings.perBufferUnreadBacklogLimit();
121 _additional = backlogSettings.perBufferUnreadBacklogAdditional();
124 void PerBufferUnreadBacklogRequester::requestBacklog(const BufferIdList& bufferIds)
126 setWaitingBuffers(bufferIds);
127 backlogManager->emitMessagesRequested(QObject::tr("Requesting a total of up to %1 unread backlog messages for %2 buffers")
128 .arg((_limit + _additional) * bufferIds.count())
129 .arg(bufferIds.count()));
130 foreach (BufferId bufferId, bufferIds) {
131 backlogManager->requestBacklog(bufferId, Client::networkModel()->lastSeenMsgId(bufferId), -1, _limit, _additional);
135 // ========================================
136 // AS NEEDED BACKLOG REQUESTER
137 // ========================================
138 AsNeededBacklogRequester::AsNeededBacklogRequester(ClientBacklogManager* backlogManager)
139 : BacklogRequester(false, BacklogRequester::AsNeeded, backlogManager)
141 BacklogSettings backlogSettings;
142 _legacyBacklogCount = backlogSettings.asNeededLegacyBacklogAmount();
145 void AsNeededBacklogRequester::requestBacklog(const BufferIdList& bufferIds)
147 // Check if the core supports activity tracking
148 if (Client::isCoreFeatureEnabled(Quassel::Feature::BufferActivitySync)) {
149 // Don't fetch any backlog, the core will track buffer activity for us
153 setWaitingBuffers(bufferIds);
154 backlogManager->emitMessagesRequested(QObject::tr("Requesting a total of up to %1 backlog messages for %2 buffers")
155 .arg(_legacyBacklogCount * bufferIds.count())
156 .arg(bufferIds.count()));
157 foreach (BufferId bufferId, bufferIds) {
158 backlogManager->requestBacklog(bufferId, -1, -1, _legacyBacklogCount);