modernize: Reformat ALL the source... again!
[quassel.git] / src / core / corebuffersyncer.cpp
1 /***************************************************************************
2  *   Copyright (C) 2005-2018 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 "corebuffersyncer.h"
22
23 #include "core.h"
24 #include "corenetwork.h"
25 #include "coresession.h"
26 #include "ircchannel.h"
27
28 class PurgeEvent : public QEvent
29 {
30 public:
31     PurgeEvent()
32         : QEvent(QEvent::User)
33     {}
34 };
35
36 CoreBufferSyncer::CoreBufferSyncer(CoreSession* parent)
37     : BufferSyncer(Core::bufferLastSeenMsgIds(parent->user()),
38                    Core::bufferMarkerLineMsgIds(parent->user()),
39                    Core::bufferActivities(parent->user()),
40                    Core::highlightCounts(parent->user()),
41                    parent)
42     , _coreSession(parent)
43     , _purgeBuffers(false)
44 {
45     connect(parent, &CoreSession::displayMsg, this, &CoreBufferSyncer::addBufferActivity);
46     connect(parent, &CoreSession::displayMsg, this, &CoreBufferSyncer::addCoreHighlight);
47 }
48
49 void CoreBufferSyncer::requestSetLastSeenMsg(BufferId buffer, const MsgId& msgId)
50 {
51     if (setLastSeenMsg(buffer, msgId)) {
52         int activity = Core::bufferActivity(buffer, msgId);
53         int highlightCount = Core::highlightCount(buffer, msgId);
54
55         setBufferActivity(buffer, activity);
56         setHighlightCount(buffer, highlightCount);
57
58         dirtyLastSeenBuffers << buffer;
59     }
60 }
61
62 void CoreBufferSyncer::requestSetMarkerLine(BufferId buffer, const MsgId& msgId)
63 {
64     if (setMarkerLine(buffer, msgId))
65         dirtyMarkerLineBuffers << buffer;
66 }
67
68 void CoreBufferSyncer::storeDirtyIds()
69 {
70     UserId userId = _coreSession->user();
71     MsgId msgId;
72     foreach (BufferId bufferId, dirtyLastSeenBuffers) {
73         msgId = lastSeenMsg(bufferId);
74         if (msgId.isValid())
75             Core::setBufferLastSeenMsg(userId, bufferId, msgId);
76     }
77
78     foreach (BufferId bufferId, dirtyMarkerLineBuffers) {
79         msgId = markerLine(bufferId);
80         if (msgId.isValid())
81             Core::setBufferMarkerLineMsg(userId, bufferId, msgId);
82     }
83
84     foreach (BufferId bufferId, dirtyActivities) {
85         Core::setBufferActivity(userId, bufferId, activity(bufferId));
86     }
87
88     foreach (BufferId bufferId, dirtyHighlights) {
89         Core::setHighlightCount(userId, bufferId, highlightCount(bufferId));
90     }
91
92     dirtyLastSeenBuffers.clear();
93     dirtyMarkerLineBuffers.clear();
94     dirtyActivities.clear();
95     dirtyHighlights.clear();
96 }
97
98 void CoreBufferSyncer::removeBuffer(BufferId bufferId)
99 {
100     BufferInfo bufferInfo = Core::getBufferInfo(_coreSession->user(), bufferId);
101     if (!bufferInfo.isValid()) {
102         qWarning() << "CoreBufferSyncer::removeBuffer(): invalid BufferId:" << bufferId << "for User:" << _coreSession->user();
103         return;
104     }
105
106     if (bufferInfo.type() == BufferInfo::StatusBuffer) {
107         qWarning() << "CoreBufferSyncer::removeBuffer(): Status Buffers cannot be removed!";
108         return;
109     }
110
111     if (bufferInfo.type() == BufferInfo::ChannelBuffer) {
112         CoreNetwork* net = _coreSession->network(bufferInfo.networkId());
113         if (!net) {
114             qWarning() << "CoreBufferSyncer::removeBuffer(): Received BufferInfo with unknown networkId!";
115             return;
116         }
117         IrcChannel* chan = net->ircChannel(bufferInfo.bufferName());
118         if (chan) {
119             qWarning() << "CoreBufferSyncer::removeBuffer(): Unable to remove Buffer for joined Channel:" << bufferInfo.bufferName();
120             return;
121         }
122     }
123     if (Core::removeBuffer(_coreSession->user(), bufferId))
124         BufferSyncer::removeBuffer(bufferId);
125 }
126
127 void CoreBufferSyncer::renameBuffer(BufferId bufferId, QString newName)
128 {
129     BufferInfo bufferInfo = Core::getBufferInfo(_coreSession->user(), bufferId);
130     if (!bufferInfo.isValid()) {
131         qWarning() << "CoreBufferSyncer::renameBuffer(): invalid BufferId:" << bufferId << "for User:" << _coreSession->user();
132         return;
133     }
134
135     if (bufferInfo.type() != BufferInfo::QueryBuffer) {
136         qWarning() << "CoreBufferSyncer::renameBuffer(): only QueryBuffers can be renamed" << bufferId;
137         return;
138     }
139
140     if (Core::renameBuffer(_coreSession->user(), bufferId, newName))
141         BufferSyncer::renameBuffer(bufferId, newName);
142 }
143
144 void CoreBufferSyncer::mergeBuffersPermanently(BufferId bufferId1, BufferId bufferId2)
145 {
146     BufferInfo bufferInfo1 = Core::getBufferInfo(_coreSession->user(), bufferId1);
147     BufferInfo bufferInfo2 = Core::getBufferInfo(_coreSession->user(), bufferId2);
148     if (!bufferInfo1.isValid() || !bufferInfo2.isValid()) {
149         qWarning() << "CoreBufferSyncer::mergeBuffersPermanently(): invalid BufferIds:" << bufferId1 << bufferId2
150                    << "for User:" << _coreSession->user();
151         return;
152     }
153
154     if ((bufferInfo1.type() != BufferInfo::QueryBuffer && bufferInfo1.type() != BufferInfo::ChannelBuffer)
155         || (bufferInfo2.type() != BufferInfo::QueryBuffer && bufferInfo2.type() != BufferInfo::ChannelBuffer)) {
156         qWarning() << "CoreBufferSyncer::mergeBuffersPermanently(): only QueryBuffers and/or ChannelBuffers can be merged!" << bufferId1
157                    << bufferId2;
158         return;
159     }
160
161     if (Core::mergeBuffersPermanently(_coreSession->user(), bufferId1, bufferId2)) {
162         BufferSyncer::mergeBuffersPermanently(bufferId1, bufferId2);
163     }
164 }
165
166 void CoreBufferSyncer::customEvent(QEvent* event)
167 {
168     if (event->type() != QEvent::User)
169         return;
170
171     purgeBufferIds();
172     event->accept();
173 }
174
175 void CoreBufferSyncer::requestPurgeBufferIds()
176 {
177     if (_purgeBuffers)
178         return;
179
180     _purgeBuffers = true;
181     QCoreApplication::postEvent(this, new PurgeEvent());
182 }
183
184 void CoreBufferSyncer::purgeBufferIds()
185 {
186     _purgeBuffers = false;
187     QList<BufferInfo> bufferInfos = Core::requestBuffers(_coreSession->user());
188     QSet<BufferId> actualBuffers;
189     foreach (BufferInfo bufferInfo, bufferInfos) {
190         actualBuffers << bufferInfo.bufferId();
191     }
192
193     QSet<BufferId> storedIds = lastSeenBufferIds().toSet() + markerLineBufferIds().toSet();
194     foreach (BufferId bufferId, storedIds) {
195         if (!actualBuffers.contains(bufferId)) {
196             BufferSyncer::removeBuffer(bufferId);
197         }
198     }
199 }
200
201 void CoreBufferSyncer::setBufferActivity(BufferId buffer, int activity)
202 {
203     BufferSyncer::setBufferActivity(buffer, activity);
204     dirtyActivities << buffer;
205 }
206
207 void CoreBufferSyncer::setHighlightCount(BufferId buffer, int highlightCount)
208 {
209     BufferSyncer::setHighlightCount(buffer, highlightCount);
210     dirtyHighlights << buffer;
211 }