mirror of
https://github.com/qTox/qTox.git
synced 2024-03-22 14:00:36 +08:00
fix(offlinemsg): fix offline message dispatching on history load
* Fix callback hookup order in ChatHistory * Add correct call to SessionChatLog to insert an unfinished message * Fix incorrect logic in parsing History database response
This commit is contained in:
parent
86b55a0fb0
commit
dbef0b7508
|
@ -94,9 +94,10 @@ ChatHistory::ChatHistory(Friend& f_, History* history_, const ICoreIdHandler& co
|
|||
, settings(settings_)
|
||||
, coreIdHandler(coreIdHandler)
|
||||
{
|
||||
connect(&messageDispatcher, &IMessageDispatcher::messageSent, this, &ChatHistory::onMessageSent);
|
||||
connect(&messageDispatcher, &IMessageDispatcher::messageComplete, this,
|
||||
&ChatHistory::onMessageComplete);
|
||||
connect(&messageDispatcher, &IMessageDispatcher::messageReceived, this,
|
||||
&ChatHistory::onMessageReceived);
|
||||
|
||||
if (canUseHistory()) {
|
||||
// Defer messageSent callback until we finish firing off all our unsent messages.
|
||||
|
@ -105,8 +106,7 @@ ChatHistory::ChatHistory(Friend& f_, History* history_, const ICoreIdHandler& co
|
|||
}
|
||||
|
||||
// Now that we've fired off our unsent messages we can connect the message
|
||||
connect(&messageDispatcher, &IMessageDispatcher::messageReceived, this,
|
||||
&ChatHistory::onMessageReceived);
|
||||
connect(&messageDispatcher, &IMessageDispatcher::messageSent, this, &ChatHistory::onMessageSent);
|
||||
|
||||
// NOTE: this has to be done _after_ sending all sent messages since initial
|
||||
// state of the message has to be marked according to our dispatch state
|
||||
|
@ -395,14 +395,13 @@ void ChatHistory::loadHistoryIntoSessionChatLog(ChatLogIdx start) const
|
|||
[&](RowId dispatchedId) { return dispatchedId == message.id; });
|
||||
|
||||
bool isComplete = dispatchedMessageIt == dispatchedMessageRowIdMap.end();
|
||||
|
||||
auto chatLogMessage = ChatLogMessage{isComplete, processedMessage};
|
||||
if (isComplete) {
|
||||
auto chatLogMessage = ChatLogMessage{true, processedMessage};
|
||||
sessionChatLog.insertMessageAtIdx(currentIdx, sender, message.dispName, chatLogMessage);
|
||||
sessionChatLog.insertCompleteMessageAtIdx(currentIdx, sender, message.dispName,
|
||||
chatLogMessage);
|
||||
} else {
|
||||
// If the message is incomplete we have to pretend we sent it to ensure
|
||||
// sessionChatLog state is correct
|
||||
sessionChatLog.onMessageSent(dispatchedMessageIt.key(), processedMessage);
|
||||
sessionChatLog.insertIncompleteMessageAtIdx(currentIdx, sender, message.dispName,
|
||||
chatLogMessage, dispatchedMessageIt.key());
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -294,8 +294,8 @@ std::size_t SessionChatLog::size() const
|
|||
return items.size();
|
||||
}
|
||||
|
||||
void SessionChatLog::insertMessageAtIdx(ChatLogIdx idx, ToxPk sender, QString senderName,
|
||||
ChatLogMessage message)
|
||||
void SessionChatLog::insertCompleteMessageAtIdx(ChatLogIdx idx, const ToxPk& sender, const QString& senderName,
|
||||
const ChatLogMessage& message)
|
||||
{
|
||||
auto item = ChatLogItem(sender, message);
|
||||
|
||||
|
@ -303,10 +303,28 @@ void SessionChatLog::insertMessageAtIdx(ChatLogIdx idx, ToxPk sender, QString se
|
|||
item.setDisplayName(senderName);
|
||||
}
|
||||
|
||||
assert(message.isComplete == true);
|
||||
|
||||
items.emplace(idx, std::move(item));
|
||||
}
|
||||
|
||||
void SessionChatLog::insertFileAtIdx(ChatLogIdx idx, ToxPk sender, QString senderName, ChatLogFile file)
|
||||
void SessionChatLog::insertIncompleteMessageAtIdx(ChatLogIdx idx, const ToxPk& sender, const QString& senderName,
|
||||
const ChatLogMessage& message,
|
||||
DispatchedMessageId dispatchId)
|
||||
{
|
||||
auto item = ChatLogItem(sender, message);
|
||||
|
||||
if (!senderName.isEmpty()) {
|
||||
item.setDisplayName(senderName);
|
||||
}
|
||||
|
||||
assert(message.isComplete == false);
|
||||
|
||||
items.emplace(idx, std::move(item));
|
||||
outgoingMessages.insert(dispatchId, idx);
|
||||
}
|
||||
|
||||
void SessionChatLog::insertFileAtIdx(ChatLogIdx idx, const ToxPk& sender, const QString& senderName, const ChatLogFile& file)
|
||||
{
|
||||
auto item = ChatLogItem(sender, file);
|
||||
|
||||
|
|
|
@ -47,8 +47,11 @@ public:
|
|||
std::vector<DateChatLogIdxPair> getDateIdxs(const QDate& startDate, size_t maxDates) const override;
|
||||
std::size_t size() const override;
|
||||
|
||||
void insertMessageAtIdx(ChatLogIdx idx, ToxPk sender, QString senderName, ChatLogMessage message);
|
||||
void insertFileAtIdx(ChatLogIdx idx, ToxPk sender, QString senderName, ChatLogFile file);
|
||||
void insertCompleteMessageAtIdx(ChatLogIdx idx, const ToxPk& sender, const QString& senderName,
|
||||
const ChatLogMessage& message);
|
||||
void insertIncompleteMessageAtIdx(ChatLogIdx idx, const ToxPk& sender, const QString& senderName,
|
||||
const ChatLogMessage& message, DispatchedMessageId dispatchId);
|
||||
void insertFileAtIdx(ChatLogIdx idx, const ToxPk& sender, const QString& senderName, const ChatLogFile& file);
|
||||
|
||||
public slots:
|
||||
void onMessageReceived(const ToxPk& sender, const Message& message);
|
||||
|
|
|
@ -628,10 +628,8 @@ QList<History::HistMessage> History::getUnsentMessagesForFriend(const ToxPk& fri
|
|||
auto friend_key = row[3].toString();
|
||||
auto display_name = QString::fromUtf8(row[4].toByteArray().replace('\0', ""));
|
||||
auto sender_key = row[5].toString();
|
||||
if (row[6].isNull()) {
|
||||
ret += {id, isOfflineMessage, timestamp, friend_key,
|
||||
display_name, sender_key, row[6].toString()};
|
||||
}
|
||||
ret += {id, isOfflineMessage, timestamp, friend_key,
|
||||
display_name, sender_key, row[6].toString()};
|
||||
};
|
||||
|
||||
db->execNow({queryText, rowCallback});
|
||||
|
|
Loading…
Reference in New Issue
Block a user