src: Yearly copyright bump
[quassel.git] / src / client / backlogrequester.cpp
1 /***************************************************************************
2  *   Copyright (C) 2005-2020 by the Quassel Project                        *
3  *   devel@quassel-irc.org                                                 *
4  *                                                                         *
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.                                           *
9  *                                                                         *
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.                          *
14  *                                                                         *
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  ***************************************************************************/
20
21 #include "backlogrequester.h"
22
23 #include <QObject>
24
25 #include "backlogsettings.h"
26 #include "bufferviewoverlay.h"
27 #include "clientbacklogmanager.h"
28
29 BacklogRequester::BacklogRequester(bool buffering, RequesterType requesterType, ClientBacklogManager* backlogManager)
30     : backlogManager(backlogManager)
31     , _isBuffering(buffering)
32     , _requesterType(requesterType)
33     , _totalBuffers(0)
34 {
35     Q_ASSERT(backlogManager);
36 }
37
38 void BacklogRequester::setWaitingBuffers(const BufferIdList& buffers)
39 {
40     _buffersWaiting = {buffers.begin(), buffers.end()};
41     _totalBuffers = int(_buffersWaiting.size());
42 }
43
44 bool BacklogRequester::buffer(BufferId bufferId, const MessageList& messages)
45 {
46     _bufferedMessages << messages;
47     _buffersWaiting.erase(bufferId);
48     return !_buffersWaiting.empty();
49 }
50
51 BufferIdList BacklogRequester::allBufferIds() const
52 {
53     QSet<BufferId> bufferIds = Client::bufferViewOverlay()->bufferIds();
54     bufferIds += Client::bufferViewOverlay()->tempRemovedBufferIds();
55     return bufferIds.values();
56 }
57
58 void BacklogRequester::flushBuffer()
59 {
60     if (!_buffersWaiting.empty()) {
61         qWarning() << Q_FUNC_INFO << "was called before all backlog was received:" << _buffersWaiting.size() << "buffers are waiting.";
62     }
63     _bufferedMessages.clear();
64     _totalBuffers = 0;
65     _buffersWaiting.clear();
66 }
67
68 // ========================================
69 //  FIXED BACKLOG REQUESTER
70 // ========================================
71 FixedBacklogRequester::FixedBacklogRequester(ClientBacklogManager* backlogManager)
72     : BacklogRequester(true, BacklogRequester::PerBufferFixed, backlogManager)
73 {
74     BacklogSettings backlogSettings;
75     _backlogCount = backlogSettings.fixedBacklogAmount();
76 }
77
78 void FixedBacklogRequester::requestBacklog(const BufferIdList& bufferIds)
79 {
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);
86     }
87 }
88
89 // ========================================
90 //  GLOBAL UNREAD BACKLOG REQUESTER
91 // ========================================
92 GlobalUnreadBacklogRequester::GlobalUnreadBacklogRequester(ClientBacklogManager* backlogManager)
93     : BacklogRequester(false, BacklogRequester::GlobalUnread, backlogManager)
94 {
95     BacklogSettings backlogSettings;
96     _limit = backlogSettings.globalUnreadBacklogLimit();
97     _additional = backlogSettings.globalUnreadBacklogAdditional();
98 }
99
100 void GlobalUnreadBacklogRequester::requestInitialBacklog()
101 {
102     MsgId oldestUnreadMessage;
103     foreach (BufferId bufferId, allBufferIds()) {
104         MsgId msgId = Client::networkModel()->lastSeenMsgId(bufferId);
105         if (!oldestUnreadMessage.isValid() || oldestUnreadMessage > msgId)
106             oldestUnreadMessage = msgId;
107     }
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);
111 }
112
113 // ========================================
114 //  PER BUFFER UNREAD BACKLOG REQUESTER
115 // ========================================
116 PerBufferUnreadBacklogRequester::PerBufferUnreadBacklogRequester(ClientBacklogManager* backlogManager)
117     : BacklogRequester(true, BacklogRequester::PerBufferUnread, backlogManager)
118 {
119     BacklogSettings backlogSettings;
120     _limit = backlogSettings.perBufferUnreadBacklogLimit();
121     _additional = backlogSettings.perBufferUnreadBacklogAdditional();
122 }
123
124 void PerBufferUnreadBacklogRequester::requestBacklog(const BufferIdList& bufferIds)
125 {
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);
132     }
133 }