From fb011e52bc6613198a65e037f0752f6361339aeb Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Mon, 27 Oct 2008 15:35:16 +0100 Subject: [PATCH] giving the message model the control over the dynamic backlog requests --- src/client/backlogrequester.cpp | 9 +++--- src/client/backlogrequester.h | 9 +++--- src/client/client.cpp | 6 ++-- src/client/clientbacklogmanager.cpp | 4 +++ src/client/clientbacklogmanager.h | 7 ++++- src/client/messagefilter.cpp | 11 ++++++++ src/client/messagefilter.h | 1 + src/client/messagemodel.cpp | 43 ++++++++++++++++++++++++----- src/client/messagemodel.h | 5 ++++ src/common/backlogmanager.cpp | 7 ----- src/common/backlogmanager.h | 2 +- src/qtui/chatscene.cpp | 16 +++-------- src/qtui/mainwin.cpp | 5 ++-- 13 files changed, 84 insertions(+), 41 deletions(-) diff --git a/src/client/backlogrequester.cpp b/src/client/backlogrequester.cpp index 8b53cf32..8b4d374b 100644 --- a/src/client/backlogrequester.cpp +++ b/src/client/backlogrequester.cpp @@ -20,11 +20,11 @@ #include "backlogrequester.h" -#include +#include -#include "backlogmanager.h" +#include "clientbacklogmanager.h" -BacklogRequester::BacklogRequester(bool buffering, BacklogManager *backlogManager) +BacklogRequester::BacklogRequester(bool buffering, ClientBacklogManager *backlogManager) : backlogManager(backlogManager), _isBuffering(buffering) { @@ -40,7 +40,7 @@ bool BacklogRequester::buffer(BufferId bufferId, const MessageList &messages) { // ======================================== // FIXED BACKLOG REQUESTER // ======================================== -FixedBacklogRequester::FixedBacklogRequester(BacklogManager *backlogManager) +FixedBacklogRequester::FixedBacklogRequester(ClientBacklogManager *backlogManager) : BacklogRequester(true, backlogManager), _backlogCount(500) { @@ -49,6 +49,7 @@ FixedBacklogRequester::FixedBacklogRequester(BacklogManager *backlogManager) void FixedBacklogRequester::requestBacklog() { QList allBuffers = allBufferIds(); setWaitingBuffers(allBuffers); + backlogManager->emitMessagesRequested(QObject::tr("Requesting a total of up to %1 backlog messages for %2 buffers").arg(_backlogCount * allBuffers.count()).arg(allBuffers.count())); foreach(BufferId bufferId, allBuffers) { backlogManager->requestBacklog(bufferId, _backlogCount, -1); } diff --git a/src/client/backlogrequester.h b/src/client/backlogrequester.h index b942d7b3..af7696af 100644 --- a/src/client/backlogrequester.h +++ b/src/client/backlogrequester.h @@ -28,7 +28,7 @@ #include "networkmodel.h" #include "types.h" -class BacklogManager; +class ClientBacklogManager; class BacklogRequester { public: @@ -39,7 +39,7 @@ public: PerBufferFixed }; - BacklogRequester(bool buffering, BacklogManager *backlogManger); + BacklogRequester(bool buffering, ClientBacklogManager *backlogManger); virtual inline ~BacklogRequester() {} inline bool isBuffering() { return _isBuffering; } @@ -55,7 +55,8 @@ protected: inline void setWaitingBuffers(const QList &buffers) { _buffersWaiting = buffers.toSet(); } inline void setWaitingBuffers(const QSet &buffers) { _buffersWaiting = buffers; } inline void addWaitingBuffer(BufferId buffer) { _buffersWaiting << buffer; } - BacklogManager *backlogManager; + + ClientBacklogManager *backlogManager; private: bool _isBuffering; @@ -68,7 +69,7 @@ private: // ======================================== class FixedBacklogRequester : public BacklogRequester { public: - FixedBacklogRequester(BacklogManager *backlogManager); + FixedBacklogRequester(ClientBacklogManager *backlogManager); virtual void requestBacklog(); private: diff --git a/src/client/client.cpp b/src/client/client.cpp index 19f0c5e0..93c5e215 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -122,6 +122,9 @@ void Client::init() { connect(this, SIGNAL(connected()), mainUi, SLOT(connectedToCore())); connect(this, SIGNAL(disconnected()), mainUi, SLOT(disconnectedFromCore())); + // attach backlog manager + p->synchronize(backlogManager()); + connect(backlogManager(), SIGNAL(messagesReceived(BufferId, int)), _messageModel, SLOT(messagesReceived(BufferId, int))); } /*** public static methods ***/ @@ -274,9 +277,6 @@ void Client::setSyncedToCore() { connect(bufferSyncer(), SIGNAL(bufferRenamed(BufferId, QString)), this, SLOT(bufferRenamed(BufferId, QString))); signalProxy()->synchronize(bufferSyncer()); - // attach backlog manager - signalProxy()->synchronize(backlogManager()); - // create a new BufferViewManager _bufferViewManager = new BufferViewManager(signalProxy(), this); diff --git a/src/client/clientbacklogmanager.cpp b/src/client/clientbacklogmanager.cpp index f28913fc..35d46fa1 100644 --- a/src/client/clientbacklogmanager.cpp +++ b/src/client/clientbacklogmanager.cpp @@ -27,6 +27,8 @@ #include +#include + ClientBacklogManager::ClientBacklogManager(QObject *parent) : BacklogManager(parent), _requester(0) @@ -40,6 +42,8 @@ void ClientBacklogManager::receiveBacklog(BufferId bufferId, int lastMsgs, int o if(msgs.isEmpty()) return; + emit messagesReceived(bufferId, msgs.count()); + MessageList msglist; foreach(QVariant v, msgs) { Message msg = v.value(); diff --git a/src/client/clientbacklogmanager.h b/src/client/clientbacklogmanager.h index 2fb6a2d4..6d76789b 100644 --- a/src/client/clientbacklogmanager.h +++ b/src/client/clientbacklogmanager.h @@ -34,12 +34,17 @@ public: virtual const QMetaObject *syncMetaObject() const { return &BacklogManager::staticMetaObject; } + // helper for the backlogRequester, as it isn't a QObject and can't emit itself + inline void emitMessagesRequested(const QString &msg) const { emit messagesRequested(msg); } + public slots: virtual void receiveBacklog(BufferId bufferId, int lastMsgs, int offset, QVariantList msgs); void requestInitialBacklog(); signals: - void messagesProcessed(const QString &); + void messagesReceived(BufferId bufferId, int count) const; + void messagesRequested(const QString &) const; + void messagesProcessed(const QString &) const; private: bool isBuffering(); diff --git a/src/client/messagefilter.cpp b/src/client/messagefilter.cpp index 3ef02ee5..a764a32f 100644 --- a/src/client/messagefilter.cpp +++ b/src/client/messagefilter.cpp @@ -19,7 +19,10 @@ ***************************************************************************/ #include "messagefilter.h" + #include "buffersettings.h" +#include "client.h" +#include "messagemodel.h" MessageFilter::MessageFilter(QAbstractItemModel *source, QObject *parent) : QSortFilterProxyModel(parent), @@ -93,3 +96,11 @@ bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourcePar } return _validBuffers.contains(id); } + +void MessageFilter::requestBacklog() { + QSet::const_iterator bufferIdIter = _validBuffers.constBegin(); + while(bufferIdIter != _validBuffers.constEnd()) { + Client::messageModel()->requestBacklog(*bufferIdIter); + bufferIdIter++; + } +} diff --git a/src/client/messagefilter.h b/src/client/messagefilter.h index 8f2cc18c..d2ce6996 100644 --- a/src/client/messagefilter.h +++ b/src/client/messagefilter.h @@ -42,6 +42,7 @@ public: public slots: void messageTypeFilterChanged(); + void requestBacklog(); private: void init(); diff --git a/src/client/messagemodel.cpp b/src/client/messagemodel.cpp index 818c254e..fd0ae3e6 100644 --- a/src/client/messagemodel.cpp +++ b/src/client/messagemodel.cpp @@ -20,10 +20,13 @@ #include "messagemodel.h" -#include "message.h" - #include +#include "clientbacklogmanager.h" +#include "client.h" +#include "message.h" +#include "networkmodel.h" + class ProcessBufferEvent : public QEvent { public: inline ProcessBufferEvent() : QEvent(QEvent::User) {} @@ -66,8 +69,6 @@ bool MessageModel::setData(const QModelIndex &index, const QVariant &value, int return false; } - - bool MessageModel::insertMessage(const Message &msg, bool fakeMsg) { MsgId id = msg.msgId(); int idx = indexForId(id); @@ -307,10 +308,9 @@ void MessageModel::clear() { qDeleteAll(_messageList); _messageList.clear(); endRemoveRows(); + _messagesWaiting.clear(); } - - // returns index of msg with given Id or of the next message after that (i.e., the index where we'd insert this msg) int MessageModel::indexForId(MsgId id) { if(_messageList.isEmpty() || id <= _messageList.value(0)->msgId()) @@ -345,8 +345,37 @@ void MessageModel::changeOfDay() { _nextDayChange = _nextDayChange.addSecs(86400); } -/**********************************************************************************/ +void MessageModel::requestBacklog(BufferId bufferId) { + if(_messagesWaiting.contains(bufferId)) + return; + + static const int REQUEST_COUNT = 500; + + for(int i = 0; i < _messageList.count(); i++) { + if(_messageList.at(i)->bufferId() == bufferId) { + _messagesWaiting[bufferId] = REQUEST_COUNT; + Client::backlogManager()->emitMessagesRequested(tr("Requesting %1 messages from backlog for buffer %2:%3") + .arg(REQUEST_COUNT) + .arg(Client::networkModel()->networkName(bufferId)) + .arg(Client::networkModel()->bufferName(bufferId))); + Client::backlogManager()->requestBacklog(bufferId, REQUEST_COUNT, _messageList.at(i)->msgId().toInt()); + return; + } + } +} + +void MessageModel::messagesReceived(BufferId bufferId, int count) { + if(!_messagesWaiting.contains(bufferId)) + return; + + _messagesWaiting[bufferId] -= count; + if(_messagesWaiting[bufferId] <= 0) + _messagesWaiting.remove(bufferId); +} +// ======================================== +// MessageModelItem +// ======================================== MessageModelItem::MessageModelItem(const Message &msg) : _timestamp(msg.timestamp()), _msgId(msg.msgId()), diff --git a/src/client/messagemodel.h b/src/client/messagemodel.h index ee0e79ec..f8ffaa5a 100644 --- a/src/client/messagemodel.h +++ b/src/client/messagemodel.h @@ -68,6 +68,10 @@ public: void clear(); +public slots: + void requestBacklog(BufferId bufferId); + void messagesReceived(BufferId bufferId, int count); + protected: virtual MessageModelItem *createMessageModelItem(const Message &) = 0; virtual void customEvent(QEvent *event); @@ -84,6 +88,7 @@ private: QList _messageBuffer; QTimer _dayChangeTimer; QDateTime _nextDayChange; + QHash _messagesWaiting; }; // ************************************************** diff --git a/src/common/backlogmanager.cpp b/src/common/backlogmanager.cpp index 399db0cb..63752517 100644 --- a/src/common/backlogmanager.cpp +++ b/src/common/backlogmanager.cpp @@ -20,13 +20,6 @@ #include "backlogmanager.h" -#include - -BacklogManager::BacklogManager(QObject *parent) - : SyncableObject(parent) -{ -} - QVariantList BacklogManager::requestBacklog(BufferId bufferId, int lastMsgs, int offset) { emit backlogRequested(bufferId, lastMsgs, offset); return QVariantList(); diff --git a/src/common/backlogmanager.h b/src/common/backlogmanager.h index c060f9c2..05ed59ca 100644 --- a/src/common/backlogmanager.h +++ b/src/common/backlogmanager.h @@ -28,7 +28,7 @@ class BacklogManager : public SyncableObject { Q_OBJECT public: - BacklogManager(QObject *parent = 0); + BacklogManager(QObject *parent = 0) : SyncableObject(parent) {} public slots: virtual QVariantList requestBacklog(BufferId bufferId, int lastMsgs = -1, int offset = -1); diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index c24933a2..56f51548 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -525,18 +525,10 @@ QString ChatScene::selectionToString() const { } void ChatScene::requestBacklog() { - static const int REQUEST_COUNT = 500; - int backlogSize = model()->rowCount(); - if(isSingleBufferScene() && backlogSize != 0 && _lastBacklogSize + REQUEST_COUNT <= backlogSize) { - QModelIndex msgIdx = model()->index(0, 0); - while((Message::Type)(model()->data(msgIdx, ChatLineModel::TypeRole).toInt()) == Message::DayChange) { - msgIdx = msgIdx.sibling(msgIdx.row() + 1, 0); - } - MsgId msgId = model()->data(msgIdx, ChatLineModel::MsgIdRole).value(); - BufferId bufferId = model()->data(msgIdx, ChatLineModel::BufferIdRole).value(); - _lastBacklogSize = backlogSize; - Client::backlogManager()->requestBacklog(bufferId, REQUEST_COUNT, msgId.toInt()); - } + MessageFilter *filter = qobject_cast(model()); + if(filter) + return filter->requestBacklog(); + return; } int ChatScene::sectionByScenePos(int x) { diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 5137447a..1f701f56 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -411,6 +411,7 @@ void MainWin::setupStatusBar() { connect(showStatusbar, SIGNAL(toggled(bool)), statusBar(), SLOT(setVisible(bool))); connect(showStatusbar, SIGNAL(toggled(bool)), this, SLOT(saveStatusBarStatus(bool))); + connect(Client::backlogManager(), SIGNAL(messagesRequested(const QString &)), this, SLOT(showStatusBarMessage(const QString &))); connect(Client::backlogManager(), SIGNAL(messagesProcessed(const QString &)), this, SLOT(showStatusBarMessage(const QString &))); } @@ -464,8 +465,8 @@ void MainWin::connectedToCore() { connect(Client::bufferViewManager(), SIGNAL(bufferViewConfigDeleted(int)), this, SLOT(removeBufferView(int))); connect(Client::bufferViewManager(), SIGNAL(initDone()), this, SLOT(loadLayout())); - Client::backlogManager()->requestInitialBacklog(); setConnectedState(); + Client::backlogManager()->requestInitialBacklog(); } void MainWin::setConnectedState() { @@ -749,5 +750,5 @@ void MainWin::saveStateToSessionSettings(SessionSettings & s) } void MainWin::showStatusBarMessage(const QString &message) { - statusBar()->showMessage(message, 10); + statusBar()->showMessage(message, 10000); } -- 2.20.1