summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2017-12-04 18:41:19 +0200
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2017-12-04 18:41:19 +0200
commita605e4486f4b9d90d668d6d1844ba5f0d58bbc26 (patch)
treec82001904cb120d975361edb38a62b5b77fa0644
parent1976a3280cc392df722ebc6cb6dd74f0746ec017 (diff)
Migrate to matrix-structs for event and response parsing
-rwxr-xr-x.ci/linux/gtest.sh19
-rwxr-xr-x.ci/linux/run-tests.sh7
-rw-r--r--.travis.yml3
-rw-r--r--CMakeLists.txt58
-rw-r--r--Makefile9
-rw-r--r--include/ChatPage.h71
-rw-r--r--include/MatrixClient.h15
-rw-r--r--include/RoomState.h96
-rw-r--r--include/Sync.h131
-rw-r--r--include/TextInputWidget.h3
-rw-r--r--include/events/AliasesEventContent.h42
-rw-r--r--include/events/AvatarEventContent.h46
-rw-r--r--include/events/CanonicalAliasEventContent.h48
-rw-r--r--include/events/CreateEventContent.h47
-rw-r--r--include/events/Event.h183
-rw-r--r--include/events/HistoryVisibilityEventContent.h49
-rw-r--r--include/events/JoinRulesEventContent.h61
-rw-r--r--include/events/MemberEventContent.h68
-rw-r--r--include/events/MessageEvent.h64
-rw-r--r--include/events/MessageEventContent.h74
-rw-r--r--include/events/NameEventContent.h45
-rw-r--r--include/events/PowerLevelsEventContent.h73
-rw-r--r--include/events/RoomEvent.h116
-rw-r--r--include/events/StateEvent.h88
-rw-r--r--include/events/TopicEventContent.h46
-rw-r--r--include/events/messages/Audio.h50
-rw-r--r--include/events/messages/Emote.h34
-rw-r--r--include/events/messages/File.h55
-rw-r--r--include/events/messages/Image.h54
-rw-r--r--include/events/messages/Location.h50
-rw-r--r--include/events/messages/Notice.h34
-rw-r--r--include/events/messages/Text.h34
-rw-r--r--include/events/messages/Video.h55
-rw-r--r--include/timeline/TimelineItem.h43
-rw-r--r--include/timeline/TimelineView.h86
-rw-r--r--include/timeline/TimelineViewManager.h10
-rw-r--r--include/timeline/widgets/AudioItem.h9
-rw-r--r--include/timeline/widgets/FileItem.h11
-rw-r--r--include/timeline/widgets/ImageItem.h11
-rw-r--r--include/timeline/widgets/VideoItem.h9
m---------libs/matrix-structs0
-rw-r--r--src/Cache.cc65
-rw-r--r--src/ChatPage.cc280
-rw-r--r--src/MatrixClient.cc56
-rw-r--r--src/RoomList.cc1
-rw-r--r--src/RoomState.cc316
-rw-r--r--src/Sync.cc307
-rw-r--r--src/events/AliasesEventContent.cc55
-rw-r--r--src/events/AvatarEventContent.cc50
-rw-r--r--src/events/CanonicalAliasEventContent.cc45
-rw-r--r--src/events/CreateEventContent.cc45
-rw-r--r--src/events/Event.cc106
-rw-r--r--src/events/HistoryVisibilityEventContent.cc64
-rw-r--r--src/events/JoinRulesEventContent.cc63
-rw-r--r--src/events/MemberEventContent.cc84
-rw-r--r--src/events/MessageEventContent.cc74
-rw-r--r--src/events/NameEventContent.cc45
-rw-r--r--src/events/PowerLevelsEventContent.cc114
-rw-r--r--src/events/TopicEventContent.cc45
-rw-r--r--src/events/messages/Audio.cc40
-rw-r--r--src/events/messages/Emote.cc27
-rw-r--r--src/events/messages/File.cc50
-rw-r--r--src/events/messages/Image.cc52
-rw-r--r--src/events/messages/Location.cc47
-rw-r--r--src/events/messages/Notice.cc27
-rw-r--r--src/events/messages/Text.cc27
-rw-r--r--src/events/messages/Video.cc53
-rw-r--r--src/timeline/TimelineItem.cc79
-rw-r--r--src/timeline/TimelineView.cc200
-rw-r--r--src/timeline/TimelineViewManager.cc29
-rw-r--r--src/timeline/widgets/AudioItem.cc15
-rw-r--r--src/timeline/widgets/FileItem.cc15
-rw-r--r--src/timeline/widgets/ImageItem.cc13
-rw-r--r--src/timeline/widgets/VideoItem.cc11
-rw-r--r--tests/event_collection.cc111
-rw-r--r--tests/events.cc707
-rw-r--r--tests/message_events.cc287
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)
diff --git a/Makefile b/Makefile
index 1a23d6b2..fbbbed9b 100644
--- a/Makefile
+++ b/Makefile
@@ -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