From b8d3e0d3827322e8f02da4c81749f372ea2eec9b Mon Sep 17 00:00:00 2001 From: Julien Wadel Date: Tue, 3 Oct 2023 12:09:05 +0200 Subject: [PATCH] Fix message order and remove local timestamp received. --- .../chat-events/ChatMessageModel.cpp | 39 ++++++++-------- .../chat-events/ChatMessageModel.hpp | 8 ++-- .../components/chat-room/ChatRoomModel.cpp | 45 +++++++++---------- .../components/chat-room/ChatRoomModel.hpp | 4 +- .../src/components/core/CoreHandlers.cpp | 1 - linphone-app/src/config.h.cmake | 4 ++ linphone-sdk | 2 +- 7 files changed, 53 insertions(+), 50 deletions(-) diff --git a/linphone-app/src/components/chat-events/ChatMessageModel.cpp b/linphone-app/src/components/chat-events/ChatMessageModel.cpp index 33a8b7d12..18b94c42d 100644 --- a/linphone-app/src/components/chat-events/ChatMessageModel.cpp +++ b/linphone-app/src/components/chat-events/ChatMessageModel.cpp @@ -72,8 +72,17 @@ void ChatMessageModel::connectTo(ChatMessageListener * listener){ } // ============================================================================= -ChatMessageModel::ChatMessageModel ( std::shared_ptr chatMessage, QObject * parent) : ChatEvent(ChatRoomModel::EntryType::MessageEntry, parent) { +ChatMessageModel::ChatMessageModel (const std::shared_ptr& chatMessage, const std::shared_ptr& chatMessageLog, QObject * parent) : ChatEvent(ChatRoomModel::EntryType::MessageEntry, parent) { App::getInstance()->getEngine()->setObjectOwnership(this, QQmlEngine::CppOwnership);// Avoid QML to destroy it + init(chatMessage, chatMessageLog); +} + +ChatMessageModel::~ChatMessageModel(){ + if(mChatMessage) + mChatMessage->removeListener(mChatMessageListener); +} + +void ChatMessageModel::init(const std::shared_ptr& chatMessage, const std::shared_ptr& chatMessageLog){ if(chatMessage){ mParticipantImdnStateListModel = QSharedPointer::create(chatMessage); mChatMessageListener = std::make_shared(); @@ -83,7 +92,7 @@ ChatMessageModel::ChatMessageModel ( std::shared_ptr chat if( mChatMessage->isReply()){ auto replyMessage = mChatMessage->getReplyMessage(); if( replyMessage)// Reply message could be inexistant (for example : when locally deleted) - mReplyChatMessageModel = create(replyMessage, parent); + mReplyChatMessageModel = create(replyMessage, this->parent()); } std::list> contents = chatMessage->getContents(); QString txt; @@ -94,7 +103,10 @@ ChatMessageModel::ChatMessageModel ( std::shared_ptr chat mContent = txt; mTimestamp = QDateTime::fromMSecsSinceEpoch(chatMessage->getTime() * 1000); - mReceivedTimestamp = ChatMessageModel::initReceivedTimestamp(chatMessage, false); + if(chatMessageLog) + mReceivedTimestamp = QDateTime::fromMSecsSinceEpoch(chatMessageLog->getCreationTime() * 1000); + else + mReceivedTimestamp = mTimestamp; } mWasDownloaded = false; @@ -102,12 +114,13 @@ ChatMessageModel::ChatMessageModel ( std::shared_ptr chat mChatReactionListModel = QSharedPointer::create(this); } -ChatMessageModel::~ChatMessageModel(){ - if(mChatMessage) - mChatMessage->removeListener(mChatMessageListener); +QSharedPointer ChatMessageModel::create(const std::shared_ptr& chatMessageLog, QObject * parent){ + auto model = QSharedPointer::create(chatMessageLog->getChatMessage(), chatMessageLog, parent); + return model; } -QSharedPointer ChatMessageModel::create(std::shared_ptr chatMessage, QObject * parent){ - auto model = QSharedPointer::create(chatMessage, parent); + +QSharedPointer ChatMessageModel::create(const std::shared_ptr& chatMessage, QObject * parent){ + auto model = QSharedPointer::create(chatMessage, nullptr, parent); return model; } @@ -288,16 +301,6 @@ void ChatMessageModel::updateFileTransferInformation(){ mContentListModel->updateContents(this); } -QDateTime ChatMessageModel::initReceivedTimestamp(const std::shared_ptr &message, bool isNew, bool force){ - auto appdata = ChatEvent::AppDataManager(QString::fromStdString(message->getAppdata())); - if(force || !appdata.mData.contains("receivedTime")){// If already set : Do not overwrite. - appdata.mData["receivedTime"] = QString::number(isNew ? QDateTime::currentMSecsSinceEpoch() : message->getTime()*1000); - qDebug() << (isNew ? "New" : "Old") << " message received at " << QDateTime::fromMSecsSinceEpoch(appdata.mData["receivedTime"].toLongLong()).toString("yyyy/MM/dd hh:mm:ss.zzz") << QDateTime::fromMSecsSinceEpoch(message->getTime()*1000).toString("yyyy/MM/dd hh:mm:ss.zzz"); - message->setAppdata(Utils::appStringToCoreString(appdata.toString())); - } - return QDateTime::fromMSecsSinceEpoch(appdata.mData["receivedTime"].toLongLong()); -} - void ChatMessageModel::onFileTransferRecv(const std::shared_ptr & message, const std::shared_ptr & content, const std::shared_ptr & buffer){ } void ChatMessageModel::onFileTransferSendChunk(const std::shared_ptr & message, const std::shared_ptr & content, size_t offset, size_t size, const std::shared_ptr & buffer) { diff --git a/linphone-app/src/components/chat-events/ChatMessageModel.hpp b/linphone-app/src/components/chat-events/ChatMessageModel.hpp index c2401b43c..3216a8f6d 100644 --- a/linphone-app/src/components/chat-events/ChatMessageModel.hpp +++ b/linphone-app/src/components/chat-events/ChatMessageModel.hpp @@ -44,10 +44,13 @@ class ContentProxyModel; class ChatMessageModel : public ChatEvent { Q_OBJECT public: - static QSharedPointer create(std::shared_ptr chatMessage, QObject * parent = nullptr);// Call it instead constructor - ChatMessageModel (std::shared_ptr chatMessage, QObject * parent = nullptr); + static QSharedPointer create(const std::shared_ptr& chatMessageLog, QObject * parent = nullptr);// Call it instead constructor + static QSharedPointer create(const std::shared_ptr& chatMessage, QObject * parent = nullptr);// Call it instead constructor + ChatMessageModel (const std::shared_ptr& chatMessage, const std::shared_ptr& chatMessageLog, QObject * parent = nullptr); virtual ~ChatMessageModel(); + void init(const std::shared_ptr& chatMessage, const std::shared_ptr& chatMessageLog); + Q_PROPERTY(QString fromDisplayName READ getFromDisplayName CONSTANT) Q_PROPERTY(QString fromDisplayNameReplyMessage READ getFromDisplayNameReplyMessage CONSTANT) Q_PROPERTY(QString fromSipAddress READ getFromSipAddress CONSTANT) @@ -119,7 +122,6 @@ public: virtual void deleteEvent() override; void updateFileTransferInformation(); - static QDateTime initReceivedTimestamp(const std::shared_ptr &message, bool isNew, bool force = false); // return received timestamp // Linphone callbacks void onFileTransferRecv(const std::shared_ptr & message, const std::shared_ptr & content, const std::shared_ptr & buffer) ; diff --git a/linphone-app/src/components/chat-room/ChatRoomModel.cpp b/linphone-app/src/components/chat-room/ChatRoomModel.cpp index 0f49f8166..b9a36beda 100644 --- a/linphone-app/src/components/chat-room/ChatRoomModel.cpp +++ b/linphone-app/src/components/chat-room/ChatRoomModel.cpp @@ -785,7 +785,7 @@ public: itEntries = entries.begin(); for(; itEntries != entries.end() ; ++itEntries){ if( (*itEntries).mType== ChatRoomModel::EntryType::MessageEntry) - *resultEntries << ChatMessageModel::create(std::dynamic_pointer_cast(itEntries->mObject)); + *resultEntries << ChatMessageModel::create(std::dynamic_pointer_cast(itEntries->mObject)); else if( (*itEntries).mType == ChatRoomModel::EntryType::CallEntry) { auto entry = ChatCallModel::create(std::dynamic_pointer_cast(itEntries->mObject), true); if(entry) { @@ -817,10 +817,11 @@ void ChatRoomModel::updateNewMessageNotice(const int& count){ QDateTime lastReceivedMessage = lastUnreadMessage; enableMarkAsRead(false); // Get chat messages - for (auto &message : mChatRoom->getHistory(mLastEntriesStep)) { - if( !message->isRead()) { + for (auto &messageLog : mChatRoom->getHistoryMessageEvents(mLastEntriesStep)) { + auto message = messageLog->getChatMessage(); + if( message && !message->isRead()) { lastUnreadMessage = min(lastUnreadMessage, QDateTime::fromMSecsSinceEpoch(message->getTime() * 1000 - 1 )); //-1 to be sure that event will be before the message - lastReceivedMessage = min(lastReceivedMessage, ChatMessageModel::initReceivedTimestamp(message, false).addMSecs(-1)); + lastReceivedMessage = min(lastReceivedMessage, QDateTime::fromMSecsSinceEpoch(messageLog->getCreationTime() * 1000 - 1)); } } mUnreadMessageNotice = ChatNoticeModel::create(ChatNoticeModel::NoticeType::NoticeUnreadMessages, lastUnreadMessage,lastReceivedMessage, QString::number(count)); @@ -936,8 +937,8 @@ void ChatRoomModel::initEntries(){ QList > entries; QList prepareEntries; // Get chat messages - for (auto &message : mChatRoom->getHistory(mFirstLastEntriesStep)) { - prepareEntries << EntrySorterHelper(ChatMessageModel::initReceivedTimestamp(message, false).toTime_t() ,MessageEntry, message); + for (auto &messageLog : mChatRoom->getHistoryMessageEvents(mFirstLastEntriesStep)) { + prepareEntries << EntrySorterHelper(messageLog->getCreationTime() ,MessageEntry, messageLog); } // Get events for(auto &eventLog : mChatRoom->getHistoryEvents(mFirstLastEntriesStep)) @@ -994,7 +995,8 @@ int ChatRoomModel::loadMoreEntries(){ } // Messages - for (auto &message : mChatRoom->getHistoryRange(entriesCounts[0], entriesCounts[0]+mLastEntriesStep)){ + for (auto &messageLog : mChatRoom->getHistoryRangeMessageEvents(entriesCounts[0], entriesCounts[0]+mLastEntriesStep)){ + auto message = messageLog->getChatMessage(); auto itEntries = mList.begin(); bool haveEntry = false; while(!haveEntry && itEntries != mList.end()){ @@ -1003,7 +1005,7 @@ int ChatRoomModel::loadMoreEntries(){ ++itEntries; } if(!haveEntry) - prepareEntries << EntrySorterHelper(ChatMessageModel::initReceivedTimestamp(message, false).toTime_t() ,MessageEntry, message); + prepareEntries << EntrySorterHelper(messageLog->getCreationTime() ,MessageEntry, messageLog); } // Notices @@ -1052,12 +1054,12 @@ void ChatRoomModel::onCallEnded(std::shared_ptr call){ // ----------------------------------------------------------------------------- -QSharedPointer ChatRoomModel::insertMessageAtEnd (const std::shared_ptr &message) { +QSharedPointer ChatRoomModel::insertMessageAtEnd (const std::shared_ptr &messageLog) { QSharedPointer model; - if(mIsInitialized && !exists(message)){ - model = ChatMessageModel::create(message); + if(mIsInitialized && !exists(messageLog->getChatMessage())){ + model = ChatMessageModel::create(messageLog); if(model){ - qDebug() << "Adding at end" << model->getReceivedTimestamp().toString("hh:mm:ss.zzz") << model->getTimestamp().toString("hh:mm:ss.zzz") << QString(message->getUtf8Text().c_str()).left(5); + qDebug() << "Adding at end" << model->getReceivedTimestamp().toString("hh:mm:ss.zzz") << model->getTimestamp().toString("hh:mm:ss.zzz") << QString(messageLog->getChatMessage()->getUtf8Text().c_str()).left(5); connect(model.get(), &ChatMessageModel::remove, this, &ChatRoomModel::removeEntry); emit unreadMessagesCountChanged(); add(model); @@ -1066,11 +1068,11 @@ QSharedPointer ChatRoomModel::insertMessageAtEnd (const std::s return model; } -void ChatRoomModel::insertMessages (const QList > &messages) { +void ChatRoomModel::insertMessages (const QList > &messageLogs) { if(mIsInitialized){ QList > entries; - for(auto message : messages) { - QSharedPointer model = ChatMessageModel::create(message); + for(auto messageLog : messageLogs) { + QSharedPointer model = ChatMessageModel::create(messageLog); if(model){ connect(model.get(), &ChatMessageModel::remove, this, &ChatRoomModel::removeEntry); entries << model; @@ -1169,14 +1171,11 @@ void ChatRoomModel::onIsComposingReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & message){ - if(message) ChatMessageModel::initReceivedTimestamp(message, true); emit unreadMessagesCountChanged(); updateLastUpdateTime(); } void ChatRoomModel::onMessagesReceived(const std::shared_ptr & chatRoom, const std::list> & messages){ - for(auto message : messages) - if(message) ChatMessageModel::initReceivedTimestamp(message, true); emit unreadMessagesCountChanged(); updateLastUpdateTime(); } @@ -1206,8 +1205,7 @@ void ChatRoomModel::onNewEvents(const std::shared_ptr & chat void ChatRoomModel::onChatMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) { auto message = eventLog->getChatMessage(); if(message){ - ChatMessageModel::initReceivedTimestamp(message, true); - insertMessageAtEnd(message); + insertMessageAtEnd(eventLog); updateLastUpdateTime(); emit messageReceived(message); } @@ -1217,8 +1215,7 @@ void ChatRoomModel::onChatMessagesReceived(const std::shared_ptrgetChatMessage(); if(message){ - ChatMessageModel::initReceivedTimestamp(message, true); - insertMessageAtEnd(message); + insertMessageAtEnd(eventLog); updateLastUpdateTime(); emit messageReceived(message); } @@ -1228,8 +1225,7 @@ void ChatRoomModel::onChatMessagesReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ auto message = eventLog->getChatMessage(); if(message){ - ChatMessageModel::initReceivedTimestamp(message, true, true); - insertMessageAtEnd(message); + insertMessageAtEnd(eventLog); updateLastUpdateTime(); emit messageReceived(message); } @@ -1237,7 +1233,6 @@ void ChatRoomModel::onChatMessageSending(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog){ auto message = eventLog->getChatMessage(); - if(message) ChatMessageModel::initReceivedTimestamp(message, true); // Just in case updateLastUpdateTime(); } diff --git a/linphone-app/src/components/chat-room/ChatRoomModel.hpp b/linphone-app/src/components/chat-room/ChatRoomModel.hpp index ebc0ca34d..fa9b3debb 100644 --- a/linphone-app/src/components/chat-room/ChatRoomModel.hpp +++ b/linphone-app/src/components/chat-room/ChatRoomModel.hpp @@ -202,8 +202,8 @@ public: bool mMarkAsReadEnabled = true; bool mEntriesLoading = false; - QSharedPointer insertMessageAtEnd (const std::shared_ptr &message); - void insertMessages (const QList > &messages); + QSharedPointer insertMessageAtEnd (const std::shared_ptr &messageLog); + void insertMessages (const QList > &messageLogs); void insertNotice (const std::shared_ptr &enventLog); void insertNotices (const QList> &eventLogs); diff --git a/linphone-app/src/components/core/CoreHandlers.cpp b/linphone-app/src/components/core/CoreHandlers.cpp index c0fc47b98..5a67bb05a 100644 --- a/linphone-app/src/components/core/CoreHandlers.cpp +++ b/linphone-app/src/components/core/CoreHandlers.cpp @@ -272,7 +272,6 @@ void CoreHandlers::onMessagesReceived ( appSettings.beginGroup("chatrooms"); for(auto message : messages){ - if(message) ChatMessageModel::initReceivedTimestamp(message, true); if( !message || message->isOutgoing() ) continue; // 1. Do not notify if chat is not activated. diff --git a/linphone-app/src/config.h.cmake b/linphone-app/src/config.h.cmake index a8ce73734..dca99094b 100644 --- a/linphone-app/src/config.h.cmake +++ b/linphone-app/src/config.h.cmake @@ -20,6 +20,9 @@ * *******************************************************************************/ +#ifndef CONFIG_H +#define CONFIG_H + #cmakedefine APPLICATION_DESCRIPTION "${APPLICATION_DESCRIPTION}" #cmakedefine APPLICATION_ID "${APPLICATION_ID}" #cmakedefine APPLICATION_NAME "${APPLICATION_NAME}" @@ -36,3 +39,4 @@ #cmakedefine QTKEYCHAIN_TARGET_NAME ${QTKEYCHAIN_TARGET_NAME} #cmakedefine PDF_ENABLED +#endif \ No newline at end of file diff --git a/linphone-sdk b/linphone-sdk index 12fc0869e..521a001ab 160000 --- a/linphone-sdk +++ b/linphone-sdk @@ -1 +1 @@ -Subproject commit 12fc0869e41db12362fd3e7617712e2069882696 +Subproject commit 521a001ab21f1127682333efce8d4a292099203c