From a4196cd9fa2679a985d2ab6b65165c9683f63f05 Mon Sep 17 00:00:00 2001 From: Julien Wadel Date: Mon, 23 May 2022 16:44:39 +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/src/utils/Constants.hpp | 2 +- linphone-app/ui/views/App/Main/Conversation.qml | 6 +++--- 9 files changed, 48 insertions(+), 15 deletions(-) diff --git a/linphone-app/CMakeLists.txt b/linphone-app/CMakeLists.txt index 9ebb98dc6..a3dcbcb87 100644 --- a/linphone-app/CMakeLists.txt +++ b/linphone-app/CMakeLists.txt @@ -92,6 +92,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 2474e881e..ee1042530 100644 --- a/linphone-app/src/components/chat-events/ChatMessageModel.cpp +++ b/linphone-app/src/components/chat-events/ChatMessageModel.cpp @@ -139,10 +139,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 = std::make_shared(this); } @@ -266,6 +269,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 6fc0aca84..1f5797f35 100644 --- a/linphone-app/src/components/chat-events/ChatMessageModel.hpp +++ b/linphone-app/src/components/chat-events/ChatMessageModel.hpp @@ -149,12 +149,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 991c53238..fa88004b2 100644 --- a/linphone-app/src/components/chat-room/ChatRoomModel.cpp +++ b/linphone-app/src/components/chat-room/ChatRoomModel.cpp @@ -1118,9 +1118,10 @@ void ChatRoomModel::insertCalls (const QList } } -void ChatRoomModel::insertMessageAtEnd (const std::shared_ptr &message) { +std::shared_ptr ChatRoomModel::insertMessageAtEnd (const std::shared_ptr &message) { + std::shared_ptr model; if(mIsInitialized){ - std::shared_ptr model = ChatMessageModel::create(message, this); + model = ChatMessageModel::create(message, this); if(model){ setUnreadMessagesCount(mChatRoom->getUnreadMessagesCount()); int row = mEntries.count(); @@ -1129,6 +1130,7 @@ void ChatRoomModel::insertMessageAtEnd (const std::shared_ptr > &messages) { @@ -1275,8 +1277,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 03c74b85e..87e04be46 100644 --- a/linphone-app/src/components/chat-room/ChatRoomModel.hpp +++ b/linphone-app/src/components/chat-room/ChatRoomModel.hpp @@ -252,7 +252,7 @@ public: void insertCall (const std::shared_ptr &callLog); void insertCalls (const QList > &calls); - void insertMessageAtEnd (const std::shared_ptr &message); + std::shared_ptr 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 3b6b6011b..fe6139c87 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/src/utils/Constants.hpp b/linphone-app/src/utils/Constants.hpp index 3537dddbe..e57078460 100644 --- a/linphone-app/src/utils/Constants.hpp +++ b/linphone-app/src/utils/Constants.hpp @@ -151,7 +151,7 @@ public: #ifdef Q_PROCESSOR_X86_64 static constexpr char PluginUrlH264[] = "http://ciscobinary.openh264.org/libopenh264-2.1.0-linux64.5.so.bz2"; #else - static constexpr char PluginUrlH264[] = "http://ciscobinary.openh264.org/libopenh264-2.1-0-linux32.5.so.bz2"; + static constexpr char PluginUrlH264[] = "http://ciscobinary.openh264.org/libopenh264-2.1.0-linux32.5.so.bz2"; #endif // ifdef Q_PROCESSOR_X86_64 #elif defined(Q_OS_WIN) static constexpr char LibraryExtension[] = "dll"; diff --git a/linphone-app/ui/views/App/Main/Conversation.qml b/linphone-app/ui/views/App/Main/Conversation.qml index 81423dd6e..77b0c79d4 100644 --- a/linphone-app/ui/views/App/Main/Conversation.qml +++ b/linphone-app/ui/views/App/Main/Conversation.qml @@ -125,7 +125,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 @@ -153,7 +153,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; @@ -187,7 +187,7 @@ ColumnLayout { Item{ Layout.fillHeight: true Layout.fillWidth: true - visible: chatRoomModel.isMeAdmin + visible: chatRoomModel.isMeAdmin && !chatRoomModel.isOneToOne } } Icon{