X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fclient%2Fmessagemodel.cpp;h=6c93a7f685de76e1622b7982a32a836bab276797;hb=c8ddabf364eff2400c61cea395aefe69eb8ba1b3;hp=1211af9ad4a993f60400525c0a003c1ed317fd45;hpb=41bf70c263ee0af80ad1850fabe77ffffee188f4;p=quassel.git diff --git a/src/client/messagemodel.cpp b/src/client/messagemodel.cpp index 1211af9a..6c93a7f6 100644 --- a/src/client/messagemodel.cpp +++ b/src/client/messagemodel.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * 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 * @@ -127,7 +127,7 @@ void MessageModel::insertMessageGroup(const QList& msglist) 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()) { @@ -150,7 +150,7 @@ void MessageModel::insertMessageGroup(const QList& msglist) // 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(); @@ -188,7 +188,7 @@ int MessageModel::insertMessagesGracefully(const QList& msglist) /* 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) */ @@ -204,7 +204,7 @@ int MessageModel::insertMessagesGracefully(const QList& msglist) QList::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(); @@ -393,17 +393,35 @@ void MessageModel::requestBacklog(BufferId bufferId) 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)