/***************************************************************************
- * Copyright (C) 2005-2019 by the Quassel Project *
+ * Copyright (C) 2005-2022 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
Message dayChangeMsg;
if (start > 0) {
- // check if the preceeding msg is a daychange message and if so if
+ // check if the preceding msg is a daychange message and if so if
// we have to drop or relocate it at the end of this chunk
int prevIdx = start - 1;
if (messageItemAt(prevIdx)->msgType() == Message::DayChange && messageItemAt(prevIdx)->timestamp() > msglist.at(0).timestamp()) {
// check if we need to insert a daychange message at the end of the this group
// if this assert triggers then indexForId() would have found a spot right before a DayChangeMsg
- // this should never happen as daychange messages share the msgId with the preceeding message
+ // this should never happen as daychange messages share the msgId with the preceding message
Q_ASSERT(messageItemAt(start)->msgType() != Message::DayChange);
QDateTime nextTs = messageItemAt(start)->timestamp();
QDateTime prevTs = msglist.last().timestamp();
/* short description:
* 1) first we check where the message with the highest msgId from msglist would be inserted
* 2) check that position for dupe
- * 3) determine the messageId of the preceeding msg
+ * 3) determine the messageId of the preceding msg
* 4) insert as many msgs from msglist with with msgId larger then the just determined id
* those messages are automatically less then the msg of the position we just determined in 1)
*/
QList<Message>::const_iterator iter;
if (inOrder) {
iter = msglist.constEnd();
- --iter; // this op is safe as we've allready passed an empty check
+ --iter; // this op is safe as we've already passed an empty check
}
else {
iter = msglist.constBegin();
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) {
- _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)));
- Client::backlogManager()->requestBacklog(bufferId, -1, messageItemAt(i)->msgId(), requestCount);
- return;
+ // 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)