From 93414948503ada3b128762d93e1857d84f5816fc Mon Sep 17 00:00:00 2001 From: Julien Wadel Date: Mon, 23 May 2022 17:56:15 +0200 Subject: [PATCH] Order messages from receiving time. Fix H264 download URL on Linux. Hide Admin status in One-to-one chats. Add Sanitizer build. --- linphone-app/CMakeLists.txt | 14 ++++++++++++++ .../src/components/chat-events/ChatEvent.hpp | 2 +- .../components/chat-events/ChatMessageModel.cpp | 17 +++++++++++++++-- .../components/chat-events/ChatMessageModel.hpp | 3 ++- .../src/components/chat-room/ChatRoomModel.cpp | 13 +++++++++---- .../src/components/chat-room/ChatRoomModel.hpp | 2 +- .../src/components/content/ContentModel.cpp | 4 ++-- linphone-app/ui/views/App/Main/Conversation.qml | 6 +++--- 8 files changed, 47 insertions(+), 14 deletions(-) diff --git a/linphone-app/CMakeLists.txt b/linphone-app/CMakeLists.txt index 557fa1b34..2373c8166 100644 --- a/linphone-app/CMakeLists.txt +++ b/linphone-app/CMakeLists.txt @@ -107,6 +107,20 @@ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNDEBUG -DQT_NO_DEBUG") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG" ) +############################# +#Sanitizer +if(ENABLE_SANITIZER) + set(sanitize_flags "-fsanitize=address,undefined -fno-omit-frame-pointer -fno-optimize-sibling-calls") + set(sanitize_linker_flags "-fsanitize=address,undefined") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${sanitize_flags}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${sanitize_flags}") + + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${sanitize_linker_flags}") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${sanitize_linker_flags}") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${sanitize_linker_flags}") +endif() +############################# + if( WIN32) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WINSOCKAPI_")#remove error from windows headers order endif() diff --git a/linphone-app/src/components/chat-events/ChatEvent.hpp b/linphone-app/src/components/chat-events/ChatEvent.hpp index a977c8e7d..c4b17f802 100644 --- a/linphone-app/src/components/chat-events/ChatEvent.hpp +++ b/linphone-app/src/components/chat-events/ChatEvent.hpp @@ -34,7 +34,7 @@ public: ChatRoomModel::EntryType mType; virtual QDateTime getTimestamp() const; - virtual void setTimestamp(const QDateTime& timestamp); + virtual void setTimestamp(const QDateTime& timestamp = QDateTime::currentDateTime()); virtual void deleteEvent(); diff --git a/linphone-app/src/components/chat-events/ChatMessageModel.cpp b/linphone-app/src/components/chat-events/ChatMessageModel.cpp index 5b5290312..4b437550e 100644 --- a/linphone-app/src/components/chat-events/ChatMessageModel.cpp +++ b/linphone-app/src/components/chat-events/ChatMessageModel.cpp @@ -107,10 +107,13 @@ ChatMessageModel::ChatMessageModel ( std::shared_ptr chat txt += content->getUtf8Text().c_str(); } mContent = txt; + auto appData = AppDataManager(QString::fromStdString(getChatMessage()->getAppdata())); + if(appData.mData.contains("timestamp")) + mTimestamp = QDateTime::fromMSecsSinceEpoch(appData.mData["timestamp"].toLongLong()); + else + mTimestamp = QDateTime::fromMSecsSinceEpoch(chatMessage->getTime() * 1000); } mWasDownloaded = false; - - mTimestamp = QDateTime::fromMSecsSinceEpoch(chatMessage->getTime() * 1000); mContentListModel = QSharedPointer::create(this); } @@ -231,6 +234,16 @@ void ChatMessageModel::setWasDownloaded(bool wasDownloaded){ } } +void ChatMessageModel::setTimestamp(const QDateTime& timestamp) { + mTimestamp = timestamp; + auto timeT = timestamp.toMSecsSinceEpoch(); + auto appData = AppDataManager(QString::fromStdString(getChatMessage()->getAppdata())); + if(appData.mData["timestamp"].toLongLong() != timeT) { + appData.mData["timestamp"] = timeT; + getChatMessage()->setAppdata(appData.toString().toStdString()); + } +} + //----------------------------------------------------------------------------------------------------------------------- void ChatMessageModel::resendMessage (){ diff --git a/linphone-app/src/components/chat-events/ChatMessageModel.hpp b/linphone-app/src/components/chat-events/ChatMessageModel.hpp index 7ef95690c..f9aaa1551 100644 --- a/linphone-app/src/components/chat-events/ChatMessageModel.hpp +++ b/linphone-app/src/components/chat-events/ChatMessageModel.hpp @@ -124,12 +124,13 @@ public: //---------------------------------------------------------------------------- void setWasDownloaded(bool wasDownloaded); + virtual void setTimestamp(const QDateTime& timestamp = QDateTime::currentDateTime()) override; //---------------------------------------------------------------------------- Q_INVOKABLE void resendMessage (); - virtual void deleteEvent(); + virtual void deleteEvent() override; void updateFileTransferInformation(); // 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 9ef5714f4..665da52d8 100644 --- a/linphone-app/src/components/chat-room/ChatRoomModel.cpp +++ b/linphone-app/src/components/chat-room/ChatRoomModel.cpp @@ -1026,15 +1026,17 @@ void ChatRoomModel::insertCalls (const QList } } -void ChatRoomModel::insertMessageAtEnd (const std::shared_ptr &message) { +QSharedPointer ChatRoomModel::insertMessageAtEnd (const std::shared_ptr &message) { + QSharedPointer model; if(mIsInitialized){ - QSharedPointer model = ChatMessageModel::create(message); + model = ChatMessageModel::create(message); if(model){ connect(model.get(), &ChatMessageModel::remove, this, &ChatRoomModel::removeEntry); setUnreadMessagesCount(mChatRoom->getUnreadMessagesCount()); add(model); } } + return model; } void ChatRoomModel::insertMessages (const QList > &messages) { @@ -1171,8 +1173,11 @@ void ChatRoomModel::onNewEvent(const std::shared_ptr & chatR void ChatRoomModel::onChatMessageReceived(const std::shared_ptr & chatRoom, const std::shared_ptr & eventLog) { auto message = eventLog->getChatMessage(); if(message){ - insertMessageAtEnd(message); - updateLastUpdateTime(); + auto messageModel = insertMessageAtEnd(message); + if(messageModel){ + messageModel->setTimestamp(); + updateLastUpdateTime(); + } emit messageReceived(message); } } diff --git a/linphone-app/src/components/chat-room/ChatRoomModel.hpp b/linphone-app/src/components/chat-room/ChatRoomModel.hpp index b4d9480d0..00c5a164b 100644 --- a/linphone-app/src/components/chat-room/ChatRoomModel.hpp +++ b/linphone-app/src/components/chat-room/ChatRoomModel.hpp @@ -188,7 +188,7 @@ public: void insertCall (const std::shared_ptr &callLog); void insertCalls (const QList > &calls); - void insertMessageAtEnd (const std::shared_ptr &message); + QSharedPointer insertMessageAtEnd (const std::shared_ptr &message); void insertMessages (const QList > &messages); void insertNotice (const std::shared_ptr &enventLog); void insertNotices (const QList> &eventLogs); diff --git a/linphone-app/src/components/content/ContentModel.cpp b/linphone-app/src/components/content/ContentModel.cpp index 6ad886e17..4c040a8d7 100644 --- a/linphone-app/src/components/content/ContentModel.cpp +++ b/linphone-app/src/components/content/ContentModel.cpp @@ -38,13 +38,13 @@ // ============================================================================= -ContentModel::ContentModel(ChatMessageModel* chatModel) : mAppData(""){ +ContentModel::ContentModel(ChatMessageModel* chatModel) : mAppData(chatModel ? QString::fromStdString(chatModel->getChatMessage()->getAppdata()) : ""){ App::getInstance()->getEngine()->setObjectOwnership(this, QQmlEngine::CppOwnership);// Avoid QML to destroy it when passing by Q_INVOKABLE mChatMessageModel = chatModel; mWasDownloaded = false; mFileOffset = 0; } -ContentModel::ContentModel(std::shared_ptr content, ChatMessageModel* chatModel) : mAppData(""){ +ContentModel::ContentModel(std::shared_ptr content, ChatMessageModel* chatModel) : mAppData(chatModel ? QString::fromStdString(chatModel->getChatMessage()->getAppdata()) : ""){ App::getInstance()->getEngine()->setObjectOwnership(this, QQmlEngine::CppOwnership);// Avoid QML to destroy it when passing by Q_INVOKABLE mChatMessageModel = chatModel; mWasDownloaded = false; diff --git a/linphone-app/ui/views/App/Main/Conversation.qml b/linphone-app/ui/views/App/Main/Conversation.qml index 565ae7b3a..2e9f16df1 100644 --- a/linphone-app/ui/views/App/Main/Conversation.qml +++ b/linphone-app/ui/views/App/Main/Conversation.qml @@ -126,7 +126,7 @@ ColumnLayout { Layout.topMargin: 15 Layout.preferredHeight: implicitHeight Layout.alignment: Qt.AlignBottom - visible:chatRoomModel.isMeAdmin && !usernameEdit.visible + visible:chatRoomModel.isMeAdmin && !usernameEdit.visible && !chatRoomModel.isOneToOne Icon{ id:adminIcon @@ -154,7 +154,7 @@ ColumnLayout { visible: !usernameEdit.visible contactDescriptionStyle: ConversationStyle.bar.contactDescription username: avatar.username - usernameClickable: chatRoomModel.isMeAdmin + usernameClickable: chatRoomModel.isMeAdmin && !chatRoomModel.isOneToOne participants: if(chatRoomModel) { if(chatRoomModel.groupEnabled) { return chatRoomModel.participants.displayNamesToString; @@ -188,7 +188,7 @@ ColumnLayout { Item{ Layout.fillHeight: true Layout.fillWidth: true - visible: chatRoomModel.isMeAdmin + visible: chatRoomModel.isMeAdmin && !chatRoomModel.isOneToOne } } Icon{