+void MessageModel::requestBacklog(BufferId bufferId)
+{
+ if (_messagesWaiting.contains(bufferId))
+ return;
+
+ BacklogSettings backlogSettings;
+ int requestCount = backlogSettings.dynamicBacklogAmount();
+
+ // Assume there's no available messages
+ MsgId oldestAvailableMsgId{-1};
+
+ // Try to find the oldest (lowest ID) message belonging to this buffer
+ for (int i = 0; i < messageCount(); i++) {
+ if (messageItemAt(i)->bufferId() == bufferId) {
+ // Match found, use this message ID for requesting more backlog
+ oldestAvailableMsgId = messageItemAt(i)->msgId();
+ break;
+ }
+ }
+
+ // Prepare to fetch messages
+ _messagesWaiting[bufferId] = requestCount;
+ Client::backlogManager()->emitMessagesRequested(tr("Requesting %1 messages from backlog for buffer %2:%3")
+ .arg(requestCount)
+ .arg(Client::networkModel()->networkName(bufferId))
+ .arg(Client::networkModel()->bufferName(bufferId)));
+
+ if (oldestAvailableMsgId.isValid()) {
+ // Request messages from backlog starting from this message ID, going into the past
+ Client::backlogManager()->requestBacklog(bufferId, -1, oldestAvailableMsgId, requestCount);
+ }
+ else {
+ // No existing messages could be found. Try to fetch the newest available messages instead.
+ // This may happen when initial backlog fetching is set to zero, or if no messages exist in
+ // a buffer.
+ Client::backlogManager()->requestBacklog(bufferId, -1, -1, requestCount);
+ }
+}
+
+void MessageModel::messagesReceived(BufferId bufferId, int count)
+{
+ if (!_messagesWaiting.contains(bufferId))
+ return;
+
+ _messagesWaiting[bufferId] -= count;
+ if (_messagesWaiting[bufferId] <= 0) {
+ _messagesWaiting.remove(bufferId);
+ emit finishedBacklogFetch(bufferId);
+ }
+}