diff options
author | Konstantinos Sideris <sideris.konstantin@gmail.com> | 2017-12-04 18:41:19 +0200 |
---|---|---|
committer | Konstantinos Sideris <sideris.konstantin@gmail.com> | 2017-12-04 18:41:19 +0200 |
commit | a605e4486f4b9d90d668d6d1844ba5f0d58bbc26 (patch) | |
tree | c82001904cb120d975361edb38a62b5b77fa0644 | |
parent | 1976a3280cc392df722ebc6cb6dd74f0746ec017 (diff) |
Migrate to matrix-structs for event and response parsing
77 files changed, 649 insertions, 4963 deletions
diff --git a/.ci/linux/gtest.sh b/.ci/linux/gtest.sh deleted file mode 100755 index 8dd7084c..00000000 --- a/.ci/linux/gtest.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -set -evx - -sudo apt-get -qq update -sudo apt-get install -y libgtest-dev -wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz -tar xf release-1.8.0.tar.gz -cd googletest-release-1.8.0 - -cmake -DBUILD_SHARED_LIBS=ON . -make -sudo cp -a googletest/include/gtest /usr/include -sudo cp -a googlemock/gtest/*.so /usr/lib/ - -sudo ldconfig -v | grep gtest - -cd $TRAVIS_BUILD_DIR - diff --git a/.ci/linux/run-tests.sh b/.ci/linux/run-tests.sh deleted file mode 100755 index dc9e303c..00000000 --- a/.ci/linux/run-tests.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -set -evx - -cmake -DBUILD_TESTS=ON -H. -Bbuild && cmake --build build - -cd build && GTEST_COLOR=1 ctest --verbose diff --git a/.travis.yml b/.travis.yml index c0f0ed16..ba45a88b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,6 @@ matrix: compiler: gcc env: - COMPILER=g++-6 - - RUN_TESTS=1 addons: apt: sources: ['ubuntu-toolchain-r-test'] @@ -30,7 +29,6 @@ matrix: before_install: - export CXX=${COMPILER} - - if [ $TRAVIS_OS_NAME == linux ]; then ./.ci/linux/gtest.sh; fi install: - if [ $TRAVIS_OS_NAME == osx ]; then brew update && brew install qt5 lmdb clang-format; fi @@ -45,7 +43,6 @@ script: - make -C build -j2 - if [ $TRAVIS_OS_NAME == osx ]; then make lint; fi - if [ $TRAVIS_OS_NAME == osx ]; then ./.ci/macos/deploy.sh; fi - - if [ $RUN_TESTS == 1 ]; then ./.ci/linux/run-tests.sh; fi - if [ $TRAVIS_OS_NAME == linux ]; then ./.ci/linux/deploy.sh; fi deploy: diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d518fe6..69efeedd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,5 @@ cmake_minimum_required(VERSION 3.1) -option(BUILD_TESTS "Build all tests" OFF) option(APPVEYOR_BUILD "Build on appveyor" OFF) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) @@ -122,6 +121,7 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU") -Werror \ -pipe \ -pedantic \ + -ferror-limit=3 \ -Wunreachable-code") if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") @@ -200,7 +200,6 @@ set(SRC_FILES src/RoomState.cc src/SideBarActions.cc src/Splitter.cc - src/Sync.cc src/TextInputWidget.cc src/TopRoomBar.cc src/TrayIcon.cc @@ -211,35 +210,8 @@ set(SRC_FILES src/main.cc ) -set(MATRIX_EVENTS - src/events/Event.cc - - src/events/AliasesEventContent.cc - src/events/AvatarEventContent.cc - src/events/CanonicalAliasEventContent.cc - src/events/CreateEventContent.cc - src/events/HistoryVisibilityEventContent.cc - src/events/JoinRulesEventContent.cc - src/events/MemberEventContent.cc - src/events/MessageEventContent.cc - src/events/NameEventContent.cc - src/events/PowerLevelsEventContent.cc - src/events/TopicEventContent.cc - - src/events/messages/Audio.cc - src/events/messages/Emote.cc - src/events/messages/File.cc - src/events/messages/Image.cc - src/events/messages/Location.cc - src/events/messages/Notice.cc - src/events/messages/Text.cc - src/events/messages/Video.cc -) - include_directories(include) include_directories(include/ui) -include_directories(include/events) -include_directories(include/events/messages) include_directories(libs/lmdbxx) include_directories(${LMDB_INCLUDE_DIR}) @@ -324,35 +296,9 @@ file(APPEND ${_qrc} "</qresource> </RCC>") qt5_add_resources(LANG_QRC ${_qrc}) qt5_add_resources(QRC resources/res.qrc) -# -# Matrix events library. -# -add_library(matrix_events ${MATRIX_EVENTS} src/Deserializable.cc) -target_link_libraries(matrix_events Qt5::Core) - add_subdirectory(libs/matrix-structs) -if (BUILD_TESTS) - enable_testing() - - find_package(GTest REQUIRED) - include_directories(${GTEST_INCLUDE_DIRS}) - - add_executable(events_test tests/events.cc) - target_link_libraries(events_test matrix_events ${GTEST_BOTH_LIBRARIES}) - - add_executable(event_collection_test tests/event_collection.cc) - target_link_libraries(event_collection_test matrix_events ${GTEST_BOTH_LIBRARIES}) - - add_executable(message_events tests/message_events.cc) - target_link_libraries(message_events matrix_events ${GTEST_BOTH_LIBRARIES}) - - add_test(MatrixEvents events_test) - add_test(MatrixEventCollection event_collection_test) - add_test(MatrixMessageEvents message_events) -endif() - -set(COMMON_LIBS matrix_events matrix_structs Qt5::Widgets Qt5::Network Qt5::Concurrent) +set(COMMON_LIBS matrix_structs Qt5::Widgets Qt5::Network Qt5::Concurrent) if(APPVEYOR_BUILD) set(NHEKO_LIBS ${COMMON_LIBS} lmdb) @@ -1,17 +1,12 @@ debug: - @cmake -DBUILD_TESTS=OFF -H. -GNinja -Bbuild -DCMAKE_BUILD_TYPE=Debug + @cmake -H. -GNinja -Bbuild -DCMAKE_BUILD_TYPE=Debug @cmake --build build release-debug: - @cmake -DBUILD_TESTS=OFF -H. -GNinja -Bbuild -DCMAKE_BUILD_TYPE=RelWithDebInfo + @cmake -H. -GNinja -Bbuild -DCMAKE_BUILD_TYPE=RelWithDebInfo @cmake --build build -test: - @cmake -DBUILD_TESTS=ON -H. -GNinja -Bbuild -DCMAKE_BUILD_TYPE=RelWithDebInfo - @cmake --build build - @cd build && GTEST_COLOR=1 ctest --verbose - linux-appimage: @./.ci/linux/deploy.sh diff --git a/include/ChatPage.h b/include/ChatPage.h index 01f6c5d7..94c54f0b 100644 --- a/include/ChatPage.h +++ b/include/ChatPage.h @@ -24,9 +24,7 @@ #include <QTimer> #include <QWidget> -#include "MemberEventContent.h" -#include "MessageEvent.h" -#include "StateEvent.h" +#include <mtx.hpp> class Cache; class MatrixClient; @@ -37,14 +35,11 @@ class RoomSettings; class RoomState; class SideBarActions; class Splitter; -class SyncResponse; class TextInputWidget; class TimelineViewManager; class TopRoomBar; class TypingDisplay; class UserInfoWidget; -class JoinedRoom; -class LeftRoom; constexpr int CONSENSUS_TIMEOUT = 1000; constexpr int SHOW_CONTENT_TIMEOUT = 3000; @@ -76,8 +71,8 @@ private slots: void updateTopBarAvatar(const QString &roomid, const QPixmap &img); void updateOwnProfileInfo(const QUrl &avatar_url, const QString &display_name); void setOwnAvatar(const QPixmap &img); - void initialSyncCompleted(const SyncResponse &response); - void syncCompleted(const SyncResponse &response); + void initialSyncCompleted(const mtx::responses::Sync &response); + void syncCompleted(const mtx::responses::Sync &response); void syncFailed(const QString &msg); void changeTopRoomInfo(const QString &room_id); void logout(); @@ -87,26 +82,34 @@ private slots: private: using UserID = QString; using RoomStates = QMap<UserID, RoomState>; - using JoinedRooms = QMap<UserID, JoinedRoom>; - using LeftRooms = QMap<UserID, LeftRoom>; - using Membership = matrix::events::StateEvent<matrix::events::MemberEventContent>; - using Memberships = QMap<UserID, Membership>; + using Membership = mtx::events::StateEvent<mtx::events::state::Member>; + using Memberships = std::map<std::string, Membership>; + + using JoinedRooms = std::map<std::string, mtx::responses::JoinedRoom>; + using LeftRooms = std::map<std::string, mtx::responses::LeftRoom>; void removeLeftRooms(const LeftRooms &rooms); void updateJoinedRooms(const JoinedRooms &rooms); - Memberships getMemberships(const QJsonArray &events) const; RoomStates generateMembershipDifference(const JoinedRooms &rooms, const RoomStates &states) const; - void updateTypingUsers(const QString &roomid, const QList<QString> &user_ids); - void updateUserMetadata(const QJsonArray &events); - void updateUserDisplayName(const Membership &event); - void updateUserAvatarUrl(const Membership &event); + void updateTypingUsers(const QString &roomid, const std::vector<std::string> &user_ids); + + using MemberEvent = mtx::events::StateEvent<mtx::events::state::Member>; + void updateUserDisplayName(const MemberEvent &event); + void updateUserAvatarUrl(const MemberEvent &event); + void loadStateFromCache(); void deleteConfigs(); void resetUI(); + template<class Collection> + Memberships getMemberships(const std::vector<Collection> &events) const; + + template<class Collection> + void updateUserMetadata(const std::vector<Collection> &collection); + QHBoxLayout *topLayout_; Splitter *splitter; @@ -153,3 +156,37 @@ private: // return to the login page. int initialSyncFailures = 0; }; + +template<class Collection> +void +ChatPage::updateUserMetadata(const std::vector<Collection> &collection) +{ + using Member = mtx::events::StateEvent<mtx::events::state::Member>; + + for (auto &event : collection) { + if (mpark::holds_alternative<Member>(event)) { + auto member = mpark::get<Member>(event); + + updateUserAvatarUrl(member); + updateUserDisplayName(member); + } + } +} + +template<class Collection> +std::map<std::string, mtx::events::StateEvent<mtx::events::state::Member>> +ChatPage::getMemberships(const std::vector<Collection> &collection) const +{ + std::map<std::string, mtx::events::StateEvent<mtx::events::state::Member>> memberships; + + using Member = mtx::events::StateEvent<mtx::events::state::Member>; + + for (auto &event : collection) { + if (mpark::holds_alternative<Member>(event)) { + auto member = mpark::get<Member>(event); + memberships.emplace(member.state_key, member); + } + } + + return memberships; +} diff --git a/include/MatrixClient.h b/include/MatrixClient.h index 722a8611..397ba11d 100644 --- a/include/MatrixClient.h +++ b/include/MatrixClient.h @@ -20,12 +20,7 @@ #include <QFileInfo> #include <QNetworkAccessManager> #include <QUrl> - -#include "MessageEvent.h" - -class SyncResponse; -class Profile; -class RoomMessages; +#include <mtx.hpp> /* * MatrixClient provides the high level API to communicate with @@ -40,7 +35,7 @@ public: // Client API. void initialSync() noexcept; void sync() noexcept; - void sendRoomMessage(matrix::events::MessageEventType ty, + void sendRoomMessage(mtx::events::MessageType ty, int txnId, const QString &roomid, const QString &msg, @@ -107,15 +102,15 @@ signals: // Returned profile data for the user's account. void getOwnProfileResponse(const QUrl &avatar_url, const QString &display_name); - void initialSyncCompleted(const SyncResponse &response); + void initialSyncCompleted(const mtx::responses::Sync &response); void initialSyncFailed(const QString &msg); - void syncCompleted(const SyncResponse &response); + void syncCompleted(const mtx::responses::Sync &response); void syncFailed(const QString &msg); void joinFailed(const QString &msg); void messageSent(const QString &event_id, const QString &roomid, const int txn_id); void messageSendFailed(const QString &roomid, const int txn_id); void emoteSent(const QString &event_id, const QString &roomid, const int txn_id); - void messagesRetrieved(const QString &room_id, const RoomMessages &msgs); + void messagesRetrieved(const QString &room_id, const mtx::responses::Messages &msgs); void joinedRoom(const QString &room_id); void leftRoom(const QString &room_id); diff --git a/include/RoomState.h b/include/RoomState.h index db1cdc68..0e91410c 100644 --- a/include/RoomState.h +++ b/include/RoomState.h @@ -21,28 +21,14 @@ #include <QPixmap> #include <QUrl> -#include "AliasesEventContent.h" -#include "AvatarEventContent.h" -#include "CanonicalAliasEventContent.h" -#include "CreateEventContent.h" -#include "HistoryVisibilityEventContent.h" -#include "JoinRulesEventContent.h" -#include "MemberEventContent.h" -#include "NameEventContent.h" -#include "PowerLevelsEventContent.h" -#include "TopicEventContent.h" - -#include "Event.h" -#include "RoomEvent.h" -#include "StateEvent.h" - -namespace events = matrix::events; +#include <mtx.hpp> class RoomState { public: RoomState(); - RoomState(const QJsonArray &events); + RoomState(const mtx::responses::Timeline &timeline); + RoomState(const mtx::responses::State &state); // Calculate room data that are not immediatly accessible. Like room name and // avatar. @@ -50,32 +36,37 @@ public: // e.g If the room is 1-on-1 name and avatar sh |