return !_buffersWaiting.isEmpty();
}
-QList<BufferId> BacklogRequester::allBufferIds() const {
+BufferIdList BacklogRequester::allBufferIds() const {
QSet<BufferId> bufferIds = Client::bufferViewOverlay()->bufferIds();
bufferIds += Client::bufferViewOverlay()->tempRemovedBufferIds();
return bufferIds.toList();
_backlogCount = backlogSettings.fixedBacklogAmount();
}
-void FixedBacklogRequester::requestBacklog(const QList<BufferId> &bufferIds) {
+void FixedBacklogRequester::requestBacklog(const BufferIdList &bufferIds) {
setWaitingBuffers(bufferIds);
backlogManager->emitMessagesRequested(QObject::tr("Requesting a total of up to %1 backlog messages for %2 buffers").arg(_backlogCount * bufferIds.count()).arg(bufferIds.count()));
foreach(BufferId bufferId, bufferIds) {
_additional = backlogSettings.perBufferUnreadBacklogAdditional();
}
-void PerBufferUnreadBacklogRequester::requestBacklog(const QList<BufferId> &bufferIds) {
+void PerBufferUnreadBacklogRequester::requestBacklog(const BufferIdList &bufferIds) {
setWaitingBuffers(bufferIds);
backlogManager->emitMessagesRequested(QObject::tr("Requesting a total of up to %1 unread backlog messages for %2 buffers").arg((_limit + _additional) * bufferIds.count()).arg(bufferIds.count()));
foreach(BufferId bufferId, bufferIds) {
//! returns false if it was the last missing backlogpart
bool buffer(BufferId bufferId, const MessageList &messages);
+ virtual void requestBacklog(const BufferIdList &bufferIds) = 0;
virtual inline void requestBacklog() { requestBacklog(allBufferIds()); }
- virtual void requestBacklog(const QList<BufferId> &bufferIds) = 0;
protected:
- QList<BufferId> allBufferIds() const;
+ BufferIdList allBufferIds() const;
inline void setWaitingBuffers(const QList<BufferId> &buffers) { setWaitingBuffers(buffers.toSet()); }
void setWaitingBuffers(const QSet<BufferId> &buffers);
void addWaitingBuffer(BufferId buffer);
class FixedBacklogRequester : public BacklogRequester {
public:
FixedBacklogRequester(ClientBacklogManager *backlogManager);
- virtual void requestBacklog(const QList<BufferId> &bufferIds);
+ virtual void requestBacklog(const BufferIdList &bufferIds);
private:
int _backlogCount;
public:
GlobalUnreadBacklogRequester(ClientBacklogManager *backlogManager);
virtual void requestBacklog();
- virtual void requestBacklog(const QList<BufferId> &) {}
+ virtual void requestBacklog(const BufferIdList &) {}
private:
int _limit;
class PerBufferUnreadBacklogRequester : public BacklogRequester {
public:
PerBufferUnreadBacklogRequester(ClientBacklogManager *backlogManager);
- virtual void requestBacklog(const QList<BufferId> &bufferIds);
+ virtual void requestBacklog(const BufferIdList &bufferIds);
private:
int _limit;
msglist << msg;
}
- _backlogReceived << bufferId;
-
if(isBuffering()) {
bool lastPart = !_requester->buffer(bufferId, msglist);
updateProgress(_requester->totalBuffers() - _requester->buffersWaiting(), _requester->totalBuffers());
}
}
-void ClientBacklogManager::checkForBacklog(const BufferId bufferId) {
- if(_backlogReceived.contains(bufferId))
- return;
-
- QList<BufferId> bufferIds;
- bufferIds << bufferId;
- checkForBacklog(bufferIds);
+BufferIdList ClientBacklogManager::filterNewBufferIds(const BufferIdList &bufferIds) {
+ BufferIdList newBuffers;
+ foreach(BufferId bufferId, bufferIds) {
+ if(!_buffersRequested.contains(bufferId))
+ newBuffers << bufferId;
+ }
+ _buffersRequested += bufferIds.toSet();
+ return newBuffers;
}
void ClientBacklogManager::checkForBacklog(const QList<BufferId> &bufferIds) {
case BacklogRequester::PerBufferFixed:
default:
{
- QList<BufferId> buffers;
- foreach(BufferId bufferId, bufferIds)
- if(!_backlogReceived.contains(bufferId))
- buffers << bufferId;
- _requester->requestBacklog(buffers);
+ BufferIdList buffers = filterNewBufferIds(bufferIds);
+ if(!buffers.isEmpty())
+ _requester->requestBacklog(buffers);
}
};
}
void ClientBacklogManager::reset() {
delete _requester;
_requester = 0;
- _backlogReceived.clear();
+ _buffersRequested.clear();
}
void requestInitialBacklog();
void checkForBacklog(BufferId bufferId);
- void checkForBacklog(const QList<BufferId> &bufferIds);
+ void checkForBacklog(const BufferIdList &bufferIds);
signals:
void messagesReceived(BufferId bufferId, int count) const;
private:
bool isBuffering();
void stopBuffering();
+ BufferIdList filterNewBufferIds(const BufferIdList &bufferIds);
void dispatchMessages(const MessageList &messages, bool sort = false);
BacklogRequester *_requester;
- QSet<BufferId> _backlogReceived;
+ QSet<BufferId> _buffersRequested;
};
+// inlines
+inline void ClientBacklogManager::checkForBacklog(BufferId bufferId) {
+ checkForBacklog(BufferIdList() << bufferId);
+}
+
#endif // CLIENTBACKLOGMANAGER_H
while(iter != msglist.constBegin()) {
iter--;
- if(!fastForward && (*iter).msgId() < minId)
+ if(!fastForward && (*iter).msgId() <= minId)
break;
processedMsgs++;
}
} else {
while(iter != msglist.constEnd()) {
- if(!fastForward && (*iter).msgId() < minId)
+ if(!fastForward && (*iter).msgId() <= minId)
break;
processedMsgs++;
Q_DECLARE_METATYPE(IdentityId)
Q_DECLARE_METATYPE(AccountId)
+// a few typedefs
+typedef QList<MsgId> MsgIdList;
+typedef QList<BufferId> BufferIdList;
+
//! Base class for exceptions.
struct Exception {
Exception(QString msg = "Unknown Exception") : _msg(msg) {};
protected:
QString _msg;
-
};
#endif
Q_ASSERT(dock);
if(enabled) {
Client::bufferViewOverlay()->addView(dock->bufferViewId());
+ BufferViewConfig *config = dock->config();
+ if(config && config->isInitialized()) {
+ BufferIdList buffers;
+ if(config->networkId().isValid()) {
+ foreach(BufferId bufferId, config->bufferList()) {
+ if(Client::networkModel()->networkId(bufferId) == config->networkId())
+ buffers << bufferId;
+ }
+ foreach(BufferId bufferId, config->temporarilyRemovedBuffers().toList()) {
+ if(Client::networkModel()->networkId(bufferId) == config->networkId())
+ buffers << bufferId;
+ }
+ } else {
+ buffers = BufferIdList::fromSet(config->bufferList().toSet() + config->temporarilyRemovedBuffers());
+ }
+ Client::backlogManager()->checkForBacklog(buffers);
+ }
} else {
Client::bufferViewOverlay()->removeView(dock->bufferViewId());
}
else
return 0;
}
+
+BufferViewConfig *BufferViewDock::config() const {
+ BufferView *view = bufferView();
+ if(!view)
+ return 0;
+ else
+ return view->config();
+}
BufferViewDock(BufferViewConfig *config, QWidget *parent);
int bufferViewId() const;
+ BufferViewConfig *config() const;
inline BufferView *bufferView() const { return qobject_cast<BufferView *>(widget()); }
public slots: