giving the message model the control over the dynamic backlog requests
authorMarcus Eggenberger <egs@quassel-irc.org>
Mon, 27 Oct 2008 14:35:16 +0000 (15:35 +0100)
committerMarcus Eggenberger <egs@quassel-irc.org>
Mon, 27 Oct 2008 14:35:16 +0000 (15:35 +0100)
13 files changed:
src/client/backlogrequester.cpp
src/client/backlogrequester.h
src/client/client.cpp
src/client/clientbacklogmanager.cpp
src/client/clientbacklogmanager.h
src/client/messagefilter.cpp
src/client/messagefilter.h
src/client/messagemodel.cpp
src/client/messagemodel.h
src/common/backlogmanager.cpp
src/common/backlogmanager.h
src/qtui/chatscene.cpp
src/qtui/mainwin.cpp

index 8b53cf3..8b4d374 100644 (file)
 
 #include "backlogrequester.h"
 
-#include <QDebug>
+#include <QObject>
 
-#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<BufferId> 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);
   }
index b942d7b..af7696a 100644 (file)
@@ -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<BufferId> &buffers) { _buffersWaiting = buffers.toSet(); }
   inline void setWaitingBuffers(const QSet<BufferId> &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:
index 19f0c5e..93c5e21 100644 (file)
@@ -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);
 
index f28913f..35d46fa 100644 (file)
@@ -27,6 +27,8 @@
 
 #include <ctime>
 
+#include <QDebug>
+
 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<Message>();
index 2fb6a2d..6d76789 100644 (file)
@@ -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();
index 3ef02ee..a764a32 100644 (file)
  ***************************************************************************/
 
 #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<BufferId>::const_iterator bufferIdIter = _validBuffers.constBegin();
+  while(bufferIdIter != _validBuffers.constEnd()) {
+    Client::messageModel()->requestBacklog(*bufferIdIter);
+    bufferIdIter++;
+  }
+}
index 8f2cc18..d2ce699 100644 (file)
@@ -42,6 +42,7 @@ public:
 
 public slots:
   void messageTypeFilterChanged();
+  void requestBacklog();
 
 private:
   void init();
index 818c254..fd0ae3e 100644 (file)
 
 #include "messagemodel.h"
 
-#include "message.h"
-
 #include <QEvent>
 
+#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()),
index ee0e79e..f8ffaa5 100644 (file)
@@ -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<Message> _messageBuffer;
   QTimer _dayChangeTimer;
   QDateTime _nextDayChange;
+  QHash<BufferId, int> _messagesWaiting;
 };
 
 // **************************************************
index 399db0c..6375251 100644 (file)
 
 #include "backlogmanager.h"
 
-#include <QDebug>
-
-BacklogManager::BacklogManager(QObject *parent)
-  : SyncableObject(parent)
-{
-}
-
 QVariantList BacklogManager::requestBacklog(BufferId bufferId, int lastMsgs, int offset) {
   emit backlogRequested(bufferId, lastMsgs, offset);
   return QVariantList();
index c060f9c..05ed59c 100644 (file)
@@ -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);
index c24933a..56f5154 100644 (file)
@@ -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<MsgId>();
-    BufferId bufferId = model()->data(msgIdx, ChatLineModel::BufferIdRole).value<BufferId>();
-    _lastBacklogSize = backlogSize;
-    Client::backlogManager()->requestBacklog(bufferId, REQUEST_COUNT, msgId.toInt());
-  }
+  MessageFilter *filter = qobject_cast<MessageFilter*>(model());
+  if(filter)
+    return filter->requestBacklog();
+  return;
 }
 
 int ChatScene::sectionByScenePos(int x) {
index 5137447..1f701f5 100644 (file)
@@ -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);
 }