48f161775f6f0828ef9b66aa5f59ce1893d49102
[quassel.git] / src / client / backlogrequester.cpp
1 /***************************************************************************
2  *   Copyright (C) 2005-2019 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 QSet<BufferId>& buffers)
39 {
40     _buffersWaiting = buffers;
41     _totalBuffers = _buffersWaiting.count();
42 }
43
44 void BacklogRequester::addWaitingBuffer(BufferId buffer)
45 {
46     _buffersWaiting << buffer;
47     _totalBuffers++;
48 }
49
50 bool BacklogRequester::buffer(BufferId bufferId, const MessageList& messages)
51 {
52     _bufferedMessages << messages;
53     _buffersWaiting.remove(bufferId);
54     return !_buffersWaiting.isEmpty();
55 }
56
57 BufferIdList BacklogRequester::allBufferIds() const
58 {
59     QSet<BufferId> bufferIds = Client::bufferViewOverlay()->bufferIds();
60     bufferIds += Client::bufferViewOverlay()->tempRemovedBufferIds();
61     return bufferIds.toList();
62 }
63
64 void BacklogRequester::flushBuffer()
65 {
66     if (!_buffersWaiting.isEmpty()) {
67         qWarning() << Q_FUNC_INFO << "was called before all backlog was received:" << _buffersWaiting.count() << "buffers are waiting.";
68     }
69     _bufferedMessages.clear();
70     _totalBuffers = 0;
71     _buffersWaiting.clear();
72 }
73
74 // ========================================
75 //  FIXED BACKLOG REQUESTER
76 // ========================================
77 FixedBacklogRequester::FixedBacklogRequester(ClientBacklogManager* backlogManager)
78     : BacklogRequester(true, BacklogRequester::PerBufferFixed, backlogManager)
79 {
80     BacklogSettings backlogSettings;
81     _backlogCount = backlogSettings.fixedBacklogAmount();
82 }
83
84 void FixedBacklogRequester::requestBacklog(const BufferIdList& bufferIds)
85 {
86     setWaitingBuffers(bufferIds);
87     backlogManager->emitMessagesRequested(QObject::tr("Requesting a total of up to %1 backlog messages for %2 buffers")
88                                               .arg(_backlogCount * bufferIds.count())
89                                               .arg(bufferIds.count()));
90     foreach (BufferId bufferId, bufferIds) {
91         backlogManager->requestBacklog(bufferId, -1, -1, _backlogCount);
92     }
93 }
94
95 // ========================================
96 //  GLOBAL UNREAD BACKLOG REQUESTER
97 // ========================================
98 GlobalUnreadBacklogRequester::GlobalUnreadBacklogRequester(ClientBacklogManager* backlogManager)
99     : BacklogRequester(false, BacklogRequester::GlobalUnread, backlogManager)
100 {
101     BacklogSettings backlogSettings;
102     _limit = backlogSettings.globalUnreadBacklogLimit();
103     _additional = backlogSettings.globalUnreadBacklogAdditional();
104 }
105
106 void GlobalUnreadBacklogRequester::requestInitialBacklog()
107 {
108     MsgId oldestUnreadMessage;
109     foreach (BufferId bufferId, allBufferIds()) {
110         MsgId msgId = Client::networkModel()->lastSeenMsgId(bufferId);
111         if (!oldestUnreadMessage.isValid() || oldestUnreadMessage > msgId)
112             oldestUnreadMessage = msgId;
113     }
114     backlogManager->emitMessagesRequested(
115         QObject::tr("Requesting up to %1 of all unread backlog messages (plus additional %2)").arg(_limit).arg(_additional));
116     backlogManager->requestBacklogAll(oldestUnreadMessage, -1, _limit, _additional);
117 }
118
119 // ========================================
120 //  PER BUFFER UNREAD BACKLOG REQUESTER
121 // ========================================
122 PerBufferUnreadBacklogRequester::PerBufferUnreadBacklogRequester(ClientBacklogManager* backlogManager)
123     : BacklogRequester(true, BacklogRequester::PerBufferUnread, backlogManager)
124 {
125     BacklogSettings backlogSettings;
126     _limit = backlogSettings.perBufferUnreadBacklogLimit();
127     _additional = backlogSettings.perBufferUnreadBacklogAdditional();
128 }
129
130 void PerBufferUnreadBacklogRequester::requestBacklog(const BufferIdList& bufferIds)
131 {
132     setWaitingBuffers(bufferIds);
133     backlogManager->emitMessagesRequested(QObject::tr("Requesting a total of up to %1 unread backlog messages for %2 buffers")
134                                               .arg((_limit + _additional) * bufferIds.count())
135                                               .arg(bufferIds.count()));
136     foreach (BufferId bufferId, bufferIds) {
137         backlogManager->requestBacklog(bufferId, Client::networkModel()->lastSeenMsgId(bufferId), -1, _limit, _additional);
138     }
139 }