summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Cache.cpp56
-rw-r--r--src/Cache.h28
-rw-r--r--src/CacheCryptoStructs.h6
-rw-r--r--src/Cache_p.h10
-rw-r--r--src/CallManager.cpp5
-rw-r--r--src/CallManager.h2
-rw-r--r--src/ChatPage.cpp186
-rw-r--r--src/ChatPage.h39
-rw-r--r--src/CommunitiesList.cpp1
-rw-r--r--src/DeviceVerificationFlow.cpp6
-rw-r--r--src/DeviceVerificationFlow.h1
-rw-r--r--src/EventAccessors.cpp2
-rw-r--r--src/MainWindow.cpp1
-rw-r--r--src/MxcImageProvider.cpp2
-rw-r--r--src/Olm.cpp20
-rw-r--r--src/Olm.h17
-rw-r--r--src/RoomInfoListItem.h2
-rw-r--r--src/TextInputWidget.cpp4
-rw-r--r--src/UserSettingsPage.cpp12
-rw-r--r--src/Utils.cpp2
-rw-r--r--src/dialogs/RoomSettings.cpp2
-rw-r--r--src/popups/SuggestionsPopup.cpp6
-rw-r--r--src/popups/SuggestionsPopup.h3
-rw-r--r--src/popups/UserMentions.h2
-rw-r--r--src/timeline/EventStore.cpp3
-rw-r--r--src/timeline/TimelineViewManager.cpp10
-rw-r--r--src/timeline/TimelineViewManager.h7
-rw-r--r--src/ui/UserProfile.cpp4
-rw-r--r--src/ui/UserProfile.h6
29 files changed, 225 insertions, 220 deletions
diff --git a/src/Cache.cpp b/src/Cache.cpp

index 993fbfe7..b37f69b3 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp
@@ -1469,22 +1469,22 @@ Cache::getRoomInfo(const std::vector<std::string> &rooms) return room_info; } -std::map<QString, mtx::responses::Timeline> -Cache::roomMessages() +std::vector<QString> +Cache::roomIds() { auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY); - std::map<QString, mtx::responses::Timeline> msgs; + std::vector<QString> rooms; std::string room_id, unused; auto roomsCursor = lmdb::cursor::open(txn, roomsDb_); while (roomsCursor.get(room_id, unused, MDB_NEXT)) - msgs.emplace(QString::fromStdString(room_id), mtx::responses::Timeline()); + rooms.push_back(QString::fromStdString(room_id)); roomsCursor.close(); txn.commit(); - return msgs; + return rooms; } QMap<QString, mtx::responses::Notifications> @@ -3377,6 +3377,46 @@ Cache::markUserKeysOutOfDate(lmdb::txn &txn, } void +Cache::query_keys(const std::string &user_id, + std::function<void(const UserKeyCache &, mtx::http::RequestErr)> cb) +{ + auto cache_ = cache::userKeys(user_id); + + if (cache_.has_value()) { + if (!cache_->updated_at.empty() && cache_->updated_at == cache_->last_changed) { + cb(cache_.value(), {}); + return; + } + } + + mtx::requests::QueryKeys req; + req.device_keys[user_id] = {}; + + std::string last_changed; + if (cache_) + last_changed = cache_->last_changed; + req.token = last_changed; + + http::client()->query_keys(req, + [cb, user_id, last_changed](const mtx::responses::QueryKeys &res, + mtx::http::RequestErr err) { + if (err) { + nhlog::net()->warn( + "failed to query device keys: {},{}", + err->matrix_error.errcode, + static_cast<int>(err->status_code)); + cb({}, err); + return; + } + + cache::updateUserKeys(last_changed, res); + + auto keys = cache::userKeys(user_id); + cb(keys.value_or(UserKeyCache{}), err); + }); +} + +void to_json(json &j, const VerificationCache &info) { j["device_verified"] = info.device_verified; @@ -3927,10 +3967,10 @@ setCurrentFormat() instance_->setCurrentFormat(); } -std::map<QString, mtx::responses::Timeline> -roomMessages() +std::vector<QString> +roomIds() { - return instance_->roomMessages(); + return instance_->roomIds(); } QMap<QString, mtx::responses::Notifications> diff --git a/src/Cache.h b/src/Cache.h
index 98e6cb75..4c4f7071 100644 --- a/src/Cache.h +++ b/src/Cache.h
@@ -28,11 +28,18 @@ #include <lmdb++.h> #endif -#include <mtx/responses.hpp> +#include <mtx/events/event_type.hpp> +#include <mtx/events/presence.hpp> +#include <mtx/responses/crypto.hpp> +#include <mtxclient/crypto/types.hpp> #include "CacheCryptoStructs.h" #include "CacheStructs.h" +namespace mtx::responses { +struct Notifications; +} + namespace cache { void init(const QString &user_id); @@ -94,8 +101,6 @@ getRoomVersion(lmdb::txn &txn, lmdb::dbi &statesdb); std::vector<RoomMember> getMembers(const std::string &room_id, std::size_t startIndex = 0, std::size_t len = 30); -void -saveState(const mtx::responses::Sync &res); bool isInitialized(); @@ -128,9 +133,6 @@ setCurrentFormat(); bool runMigrations(); -std::map<QString, mtx::responses::Timeline> -roomMessages(); - QMap<QString, mtx::responses::Notifications> getTimelineMentions(); @@ -182,22 +184,8 @@ saveImage(const QString &url, const QByteArray &data); RoomInfo singleRoomInfo(const std::string &room_id); -std::vector<std::string> -roomsWithStateUpdates(const mtx::responses::Sync &res); -std::vector<std::string> -roomsWithTagUpdates(const mtx::responses::Sync &res); std::map<QString, RoomInfo> getRoomInfo(const std::vector<std::string> &rooms); -inline std::map<QString, RoomInfo> -roomUpdates(const mtx::responses::Sync &sync) -{ - return getRoomInfo(roomsWithStateUpdates(sync)); -} -inline std::map<QString, RoomInfo> -roomTagUpdates(const mtx::responses::Sync &sync) -{ - return getRoomInfo(roomsWithTagUpdates(sync)); -} //! Calculates which the read status of a room. //! Whether all the events in the timeline have been read. diff --git a/src/CacheCryptoStructs.h b/src/CacheCryptoStructs.h
index a693e233..6256dcf9 100644 --- a/src/CacheCryptoStructs.h +++ b/src/CacheCryptoStructs.h
@@ -3,10 +3,8 @@ #include <map> #include <mutex> -//#include <nlohmann/json.hpp> - -#include <mtx/responses.hpp> -#include <mtxclient/crypto/client.hpp> +#include <mtx/responses/crypto.hpp> +#include <mtxclient/crypto/objects.hpp> // Extra information associated with an outbound megolm session. struct OutboundGroupSessionData diff --git a/src/Cache_p.h b/src/Cache_p.h
index a32793ea..05e13128 100644 --- a/src/Cache_p.h +++ b/src/Cache_p.h
@@ -33,8 +33,11 @@ #endif #include <nlohmann/json.hpp> -#include <mtx/responses.hpp> +#include <mtx/responses/messages.hpp> +#include <mtx/responses/notifications.hpp> +#include <mtx/responses/sync.hpp> #include <mtxclient/crypto/client.hpp> +#include <mtxclient/http/client.hpp> #include "CacheCryptoStructs.h" #include "CacheStructs.h" @@ -65,6 +68,8 @@ public: void deleteUserKeys(lmdb::txn &txn, lmdb::dbi &db, const std::vector<std::string> &user_ids); + void query_keys(const std::string &user_id, + std::function<void(const UserKeyCache &, mtx::http::RequestErr)> cb); // device & user verification cache VerificationStatus verificationStatus(const std::string &user_id); @@ -113,8 +118,7 @@ public: void setCurrentFormat(); bool runMigrations(); - std::map<QString, mtx::responses::Timeline> roomMessages(); - + std::vector<QString> roomIds(); QMap<QString, mtx::responses::Notifications> getTimelineMentions(); //! Retrieve all the user ids from a room. diff --git a/src/CallManager.cpp b/src/CallManager.cpp
index a376a607..ac0636e0 100644 --- a/src/CallManager.cpp +++ b/src/CallManager.cpp
@@ -12,6 +12,7 @@ #include "Logging.h" #include "MainWindow.h" #include "MatrixClient.h" +#include "Utils.h" #include "WebRTCSession.h" #include "dialogs/AcceptCall.h" @@ -29,8 +30,8 @@ std::vector<std::string> getTurnURIs(const mtx::responses::TurnServer &turnServer); } -CallManager::CallManager() - : QObject() +CallManager::CallManager(QObject *parent) + : QObject(parent) , session_(WebRTCSession::instance()) , turnServerTimer_(this) { diff --git a/src/CallManager.h b/src/CallManager.h
index f0e46b4b..da7569e2 100644 --- a/src/CallManager.h +++ b/src/CallManager.h
@@ -22,7 +22,7 @@ class CallManager : public QObject Q_OBJECT public: - CallManager(); + CallManager(QObject *); void sendInvite(const QString &roomid, bool isVideo); void hangUp( diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index 4d46b8c6..78987fb9 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp
@@ -22,9 +22,12 @@ #include <QShortcut> #include <QtConcurrent> +#include <mtx/responses.hpp> + #include "AvatarProvider.h" #include "Cache.h" #include "Cache_p.h" +#include "CallManager.h" #include "ChatPage.h" #include "DeviceVerificationFlow.h" #include "EventAccessors.h" @@ -69,6 +72,7 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent) , isConnected_(true) , userSettings_{userSettings} , notificationsManager(this) + , callManager_(new CallManager(this)) { setObjectName("chatPage"); @@ -125,7 +129,7 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent) contentLayout_->setSpacing(0); contentLayout_->setMargin(0); - view_manager_ = new TimelineViewManager(&callManager_, this); + view_manager_ = new TimelineViewManager(callManager_, this); contentLayout_->addWidget(view_manager_->getWidget()); @@ -433,8 +437,8 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent) }); connect(text_input_, &TextInputWidget::callButtonPress, this, [this]() { - if (callManager_.onActiveCall()) { - callManager_.hangUp(); + if (callManager_->onActiveCall()) { + callManager_->hangUp(); } else { if (auto roomInfo = cache::singleRoomInfo(current_room_.toStdString()); roomInfo.member_count != 2) { @@ -453,10 +457,10 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent) userSettings_, MainWindow::instance()); connect(dialog, &dialogs::PlaceCall::voice, this, [this]() { - callManager_.sendInvite(current_room_, false); + callManager_->sendInvite(current_room_, false); }); connect(dialog, &dialogs::PlaceCall::video, this, [this]() { - callManager_.sendInvite(current_room_, true); + callManager_->sendInvite(current_room_, true); }); utils::centerWidget(dialog, MainWindow::instance()); dialog->show(); @@ -694,7 +698,7 @@ ChatPage::bootstrap(QString userid, QString homeserver, QString token) const bool isInitialized = cache::isInitialized(); const auto cacheVersion = cache::formatVersion(); - callManager_.refreshTurnServer(); + callManager_->refreshTurnServer(); if (!isInitialized) { cache::setCurrentFormat(); @@ -764,7 +768,7 @@ ChatPage::loadStateFromCache() cache::restoreSessions(); olm::client()->load(cache::restoreOlmAccount(), STORAGE_SECRET_KEY); - emit initializeEmptyViews(cache::roomMessages()); + emit initializeEmptyViews(cache::client()->roomIds()); emit initializeRoomList(cache::roomInfo()); emit initializeMentions(cache::getTimelineMentions()); emit syncTags(cache::roomInfo().toStdMap()); @@ -971,13 +975,64 @@ ChatPage::startInitialSync() opts.set_presence = currentPresence(); http::client()->sync( - opts, - std::bind( - &ChatPage::initialSyncHandler, this, std::placeholders::_1, std::placeholders::_2)); + opts, [this](const mtx::responses::Sync &res, mtx::http::RequestErr err) { + // TODO: Initial Sync should include mentions as well... + + if (err) { + const auto error = QString::fromStdString(err->matrix_error.error); + const auto msg = tr("Please try to login again: %1").arg(error); + const auto err_code = mtx::errors::to_string(err->matrix_error.errcode); + const int status_code = static_cast<int>(err->status_code); + + nhlog::net()->error("initial sync error: {} {}", status_code, err_code); + + // non http related errors + if (status_code <= 0 || status_code >= 600) { + startInitialSync(); + return; + } + + switch (status_code) { + case 502: + case 504: + case 524: { + startInitialSync(); + return; + } + default: { + emit dropToLoginPageCb(msg); + return; + } + } + } + + nhlog::net()->info("initial sync completed"); + + try { + cache::client()->saveState(res); + + olm::handle_to_device_messages(res.to_device.events); + + emit initializeViews(std::move(res.rooms)); + emit initializeRoomList(cache::roomInfo()); + emit initializeMentions(cache::getTimelineMentions()); + + cache::calculateRoomReadStatus(); + emit syncTags(cache::roomInfo().toStdMap()); + } catch (const lmdb::error &e) { + nhlog::db()->error("failed to save state after initial sync: {}", + e.what()); + startInitialSync(); + return; + } + + emit trySyncCb(); + emit contentLoaded(); + }); } void -ChatPage::handleSyncResponse(mtx::responses::Sync res) +ChatPage::handleSyncResponse(const mtx::responses::Sync &res) { nhlog::net()->debug("sync completed: {}", res.next_batch); @@ -986,16 +1041,16 @@ ChatPage::handleSyncResponse(mtx::responses::Sync res) // TODO: fine grained error handling try { - cache::saveState(res); + cache::client()->saveState(res); olm::handle_to_device_messages(res.to_device.events); - auto updates = cache::roomUpdates(res); + auto updates = cache::getRoomInfo(cache::client()->roomsWithStateUpdates(res)); emit syncRoomlist(updates); emit syncUI(res.rooms); - emit syncTags(cache::roomTagUpdates(res)); + emit syncTags(cache::getRoomInfo(cache::client()->roomsWithTagUpdates(res))); // if we process a lot of syncs (1 every 200ms), this means we clean the // db every 100s @@ -1070,7 +1125,7 @@ ChatPage::joinRoom(const QString &room) const auto room_id = room.toStdString(); http::client()->join_room( - room_id, [this, room_id](const nlohmann::json &, mtx::http::RequestErr err) { + room_id, [this, room_id](const mtx::responses::RoomId &, mtx::http::RequestErr err) { if (err) { emit showNotification( tr("Failed to join room: %1") @@ -1116,7 +1171,8 @@ void ChatPage::leaveRoom(const QString &room_id) { http::client()->leave_room( - room_id.toStdString(), [this, room_id](const json &, mtx::http::RequestErr err) { + room_id.toStdString(), + [this, room_id](const mtx::responses::Empty &, mtx::http::RequestErr err) { if (err) { emit showNotification( tr("Failed to leave room: %1") @@ -1292,62 +1348,6 @@ ChatPage::currentPresence() const } void -ChatPage::initialSyncHandler(const mtx::responses::Sync &res, mtx::http::RequestErr err) -{ - // TODO: Initial Sync should include mentions as well... - - if (err) { - const auto error = QString::fromStdString(err->matrix_error.error); - const auto msg = tr("Please try to login again: %1").arg(error); - const auto err_code = mtx::errors::to_string(err->matrix_error.errcode); - const int status_code = static_cast<int>(err->status_code); - - nhlog::net()->error("initial sync error: {} {}", status_code, err_code); - - // non http related errors - if (status_code <= 0 || status_code >= 600) { - startInitialSync(); - return; - } - - switch (status_code) { - case 502: - case 504: - case 524: { - startInitialSync(); - return; - } - default: { - emit dropToLoginPageCb(msg); - return; - } - } - } - - nhlog::net()->info("initial sync completed"); - - try { - cache::saveState(res); - - olm::handle_to_device_messages(res.to_device.events); - - emit initializeViews(std::move(res.rooms)); - emit initializeRoomList(cache::roomInfo()); - emit initializeMentions(cache::getTimelineMentions()); - - cache::calculateRoomReadStatus(); - emit syncTags(cache::roomInfo().toStdMap()); - } catch (const lmdb::error &e) { - nhlog::db()->error("failed to save state after initial sync: {}", e.what()); - startInitialSync(); - return; - } - - emit trySyncCb(); - emit contentLoaded(); -} - -void ChatPage::ensureOneTimeKeyCount(const std::map<std::string, uint16_t> &counts) { for (const auto &entry : counts) { @@ -1455,51 +1455,11 @@ ChatPage::initiateLogout() emit showOverlayProgressBar(); } -void -ChatPage::query_keys(const std::string &user_id, - std::function<void(const UserKeyCache &, mtx::http::RequestErr)> cb) -{ - auto cache_ = cache::userKeys(user_id); - - if (cache_.has_value()) { - if (!cache_->updated_at.empty() && cache_->updated_at == cache_->last_changed) { - cb(cache_.value(), {}); - return; - } - } - - mtx::requests::QueryKeys req; - req.device_keys[user_id] = {}; - - std::string last_changed; - if (cache_) - last_changed = cache_->last_changed; - req.token = last_changed; - - http::client()->query_keys(req, - [cb, user_id, last_changed](const mtx::responses::QueryKeys &res, - mtx::http::RequestErr err) { - if (err) { - nhlog::net()->warn( - "failed to query device keys: {},{}", - err->matrix_error.errcode, - static_cast<int>(err->status_code)); - cb({}, err); - return; - } - - cache::updateUserKeys(last_changed, res); - - auto keys = cache::userKeys(user_id); - cb(keys.value_or(UserKeyCache{}), err); - }); -} - template<typename T> void ChatPage::connectCallMessage() { - connect(&callManager_, + connect(callManager_, qOverload<const QString &, const T &>(&CallManager::newMessage), view_manager_, qOverload<const QString &, const T &>(&TimelineViewManager::queueCallMessage)); diff --git a/src/ChatPage.h b/src/ChatPage.h
index a29cea7b..0c12d89f 100644 --- a/src/ChatPage.h +++ b/src/ChatPage.h
@@ -23,9 +23,10 @@ #include <variant> #include <mtx/common.hpp> -#include <mtx/requests.hpp> -#include <mtx/responses.hpp> -#include <mtxclient/http/errors.hpp> +#include <mtx/events.hpp> +#include <mtx/events/encrypted.hpp> +#include <mtx/events/member.hpp> +#include <mtx/events/presence.hpp> #include <QFrame> #include <QHBoxLayout> @@ -37,11 +38,8 @@ #include "CacheCryptoStructs.h" #include "CacheStructs.h" -#include "CallManager.h" #include "CommunitiesList.h" -#include "Utils.h" #include "notifications/Manager.h" -#include "popups/UserMentions.h" class OverlayModal; class QuickSwitcher; @@ -54,13 +52,25 @@ class UserInfoWidget; class UserSettings; class NotificationsManager; class TimelineModel; +class CallManager; constexpr int CONSENSUS_TIMEOUT = 1000; constexpr int SHOW_CONTENT_TIMEOUT = 3000; constexpr int TYPING_REFRESH_TIMEOUT = 10000; -namespace mtx::http { -using RequestErr = const std::optional<mtx::http::ClientError> &; +namespace mtx::requests { +struct CreateRoom; +} +namespace mtx::responses { +struct Notifications; +struct Sync; +struct Timeline; +struct Rooms; +struct LeftRoom; +} + +namespace popups { +class UserMentions; } class ChatPage : public QWidget @@ -89,8 +99,6 @@ public: //! Show the room/group list (if it was visible). void showSideBars(); void initiateLogout(); - void query_keys(const std::string &req, - std::function<void(const UserKeyCache &, mtx::http::RequestErr)> cb); void focusMessageInput(); QString status() const; @@ -145,12 +153,12 @@ signals: void trySyncCb(); void tryDelayedSyncCb(); void tryInitialSyncCb(); - void newSyncResponse(mtx::responses::Sync res); + void newSyncResponse(const mtx::responses::Sync &res); void leftRoom(const QString &room_id); void initializeRoomList(QMap<QString, RoomInfo>); void initializeViews(const mtx::responses::Rooms &rooms); - void initializeEmptyViews(const std::map<QString, mtx::responses::Timeline> &msgs); + void initializeEmptyViews(const std::vector<QString> &roomIds); void initializeMentions(const QMap<QString, mtx::responses::Notifications> &notifs); void syncUI(const mtx::responses::Rooms &rooms); void syncRoomlist(const std::map<QString, RoomInfo> &updates); @@ -194,14 +202,11 @@ private slots: void joinRoom(const QString &room); void sendTypingNotifications(); - void handleSyncResponse(mtx::responses::Sync res); + void handleSyncResponse(const mtx::responses::Sync &res); private: static ChatPage *instance_; - //! Handler callback for initial sync. It doesn't run on the main thread so all - //! communication with the GUI should be done through signals. - void initialSyncHandler(const mtx::responses::Sync &res, mtx::http::RequestErr err); void startInitialSync(); void tryInitialSync(); void trySync(); @@ -276,7 +281,7 @@ private: QSharedPointer<UserSettings> userSettings_; NotificationsManager notificationsManager; - CallManager callManager_; + CallManager *callManager_; }; template<class Collection> diff --git a/src/CommunitiesList.cpp b/src/CommunitiesList.cpp
index 8a938646..c1d0706f 100644 --- a/src/CommunitiesList.cpp +++ b/src/CommunitiesList.cpp
@@ -5,6 +5,7 @@ #include "Splitter.h" #include <mtx/responses/groups.hpp> +#include <nlohmann/json.hpp> #include <QLabel> diff --git a/src/DeviceVerificationFlow.cpp b/src/DeviceVerificationFlow.cpp
index aa1a9607..509fce8c 100644 --- a/src/DeviceVerificationFlow.cpp +++ b/src/DeviceVerificationFlow.cpp
@@ -1,8 +1,10 @@ #include "DeviceVerificationFlow.h" #include "Cache.h" +#include "Cache_p.h" #include "ChatPage.h" #include "Logging.h" +#include "Utils.h" #include "timeline/TimelineModel.h" #include <QDateTime> @@ -39,7 +41,7 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *, auto user_id = userID.toStdString(); this->toClient = mtx::identifiers::parse<mtx::identifiers::User>(user_id); - ChatPage::instance()->query_keys( + cache::client()->query_keys( user_id, [user_id, this](const UserKeyCache &res, mtx::http::RequestErr err) { if (err) { nhlog::net()->warn("failed to query device keys: {},{}", @@ -57,7 +59,7 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *, this->their_keys = res; }); - ChatPage::instance()->query_keys( + cache::client()->query_keys( http::client()->user_id().to_string(), [this](const UserKeyCache &res, mtx::http::RequestErr err) { if (err) { diff --git a/src/DeviceVerificationFlow.h b/src/DeviceVerificationFlow.h
index 70b5d9b3..d6e5411e 100644 --- a/src/DeviceVerificationFlow.h +++ b/src/DeviceVerificationFlow.h
@@ -3,6 +3,7 @@ #include <QObject> #include <mtx/responses/crypto.hpp> +#include <nlohmann/json.hpp> #include "CacheCryptoStructs.h" #include "Logging.h" diff --git a/src/EventAccessors.cpp b/src/EventAccessors.cpp
index b62be9a5..3ae781f0 100644 --- a/src/EventAccessors.cpp +++ b/src/EventAccessors.cpp
@@ -1,5 +1,7 @@ #include "EventAccessors.h" +#include <nlohmann/json.hpp> + #include <algorithm> #include <cctype> #include <type_traits> diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index f7c9fbf0..37b54151 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp
@@ -23,6 +23,7 @@ #include <QShortcut> #include <mtx/requests.hpp> +#include <mtx/responses/login.hpp> #include "Cache.h" #include "ChatPage.h" diff --git a/src/MxcImageProvider.cpp b/src/MxcImageProvider.cpp
index b59fdff8..d6564277 100644 --- a/src/MxcImageProvider.cpp +++ b/src/MxcImageProvider.cpp
@@ -1,5 +1,7 @@ #include "MxcImageProvider.h" +#include <mtxclient/crypto/client.hpp> + #include "Cache.h" #include "Logging.h" #include "MatrixClient.h" diff --git a/src/Olm.cpp b/src/Olm.cpp
index 6e68bd42..af8bb512 100644 --- a/src/Olm.cpp +++ b/src/Olm.cpp
@@ -1,6 +1,7 @@ #include "Olm.h" #include <QObject> +#include <nlohmann/json.hpp> #include <variant> #include "Cache.h" @@ -20,6 +21,21 @@ auto client_ = std::make_unique<mtx::crypto::OlmClient>(); } namespace olm { +void +from_json(const nlohmann::json &obj, OlmMessage &msg) +{ + if (obj.at("type") != "m.room.encrypted") + throw std::invalid_argument("invalid type for olm message"); + + if (obj.at("content").at("algorithm") != OLM_ALGO) + throw std::invalid_argument("invalid algorithm for olm message"); + + msg.sender = obj.at("sender"); + msg.sender_key = obj.at("content").at("sender_key"); + msg.ciphertext = obj.at("content") + .at("ciphertext") + .get<std::map<std::string, mtx::events::msg::OlmCipherContent>>(); +} mtx::crypto::OlmClient * client() @@ -419,8 +435,8 @@ send_key_request_for(mtx::events::EncryptedEvent<mtx::events::msg::Encrypted> e, e.content.session_id); mtx::events::msg::KeyRequest request; - request.action = !cancel ? mtx::events::msg::RequestAction::Request - : mtx::events::msg::RequestAction::Cancellation; + request.action = !cancel ? mtx::events::msg::RequestAction::Request + : mtx::events::msg::RequestAction::Cancellation; request.algorithm = MEGOLM_ALGO; request.room_id = e.room_id; request.sender_key = e.content.sender_key; diff --git a/src/Olm.h b/src/Olm.h
index 322affa1..3400f993 100644 --- a/src/Olm.h +++ b/src/Olm.h
@@ -40,21 +40,8 @@ struct OlmMessage std::map<RecipientKey, mtx::events::msg::OlmCipherContent> ciphertext; }; -inline void -from_json(const nlohmann::json &obj, OlmMessage &msg) -{ - if (obj.at("type") != "m.room.encrypted") - throw std::invalid_argument("invalid type for olm message"); - - if (obj.at("content").at("algorithm") != OLM_ALGO) - throw std::invalid_argument("invalid algorithm for olm message"); - - msg.sender = obj.at("sender"); - msg.sender_key = obj.at("content").at("sender_key"); - msg.ciphertext = obj.at("content") - .at("ciphertext") - .get<std::map<std::string, mtx::events::msg::OlmCipherContent>>(); -} +void +from_json(const nlohmann::json &obj, OlmMessage &msg); mtx::crypto::OlmClient * client(); diff --git a/src/RoomInfoListItem.h b/src/RoomInfoListItem.h
index da5a1bc4..af919592 100644 --- a/src/RoomInfoListItem.h +++ b/src/RoomInfoListItem.h
@@ -22,7 +22,7 @@ #include <QSharedPointer> #include <QWidget> -#include <mtx/responses.hpp> +#include <mtx/responses/sync.hpp> #include "CacheStructs.h" #include "UserSettingsPage.h" diff --git a/src/TextInputWidget.cpp b/src/TextInputWidget.cpp
index e6a10f0a..13a7c6d0 100644 --- a/src/TextInputWidget.cpp +++ b/src/TextInputWidget.cpp
@@ -453,8 +453,8 @@ FilteredTextEdit::completerRect() auto item_height = completer_->popup()->sizeHintForRow(0); auto max_height = item_height * completer_->maxVisibleItems(); auto height = (completer_->completionCount() > completer_->maxVisibleItems()) - ? max_height - : completer_->completionCount() * item_height; + ? max_height + : completer_->completionCount() * item_height; rect.setWidth(completer_->popup()->sizeHintForColumn(0)); rect.moveBottom(-height); return rect; diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp
index 308ec9a2..a5a40111 100644 --- a/src/UserSettingsPage.cpp +++ b/src/UserSettingsPage.cpp
@@ -1006,11 +1006,7 @@ UserSettingsPage::importSessionKeys() auto sessions = mtx::crypto::decrypt_exported_sessions(payload, password.toStdString()); cache::importSessionKeys(std::move(sessions)); - } catch (const mtx::crypto::sodium_exception &e) { - QMessageBox::warning(this, tr("Error"), e.what()); - } catch (const lmdb::error &e) { - QMessageBox::warning(this, tr("Error"), e.what()); - } catch (const nlohmann::json::exception &e) { + } catch (const std::exception &e) { QMessageBox::warning(this, tr("Error"), e.what()); } } @@ -1058,11 +1054,7 @@ UserSettingsPage::exportSessionKeys() QTextStream out(&file); out << prefix << newline << b64 << newline << suffix; file.close(); - } catch (const mtx::crypto::sodium_exception &e) { - QMessageBox::warning(this, tr("Error"), e.what()); - } catch (const lmdb::error &e) { - QMessageBox::warning(this, tr("Error"), e.what()); - } catch (const nlohmann::json::exception &e) { + } catch (const std::exception &e) { QMessageBox::warning(this, tr("Error"), e.what()); } } diff --git a/src/Utils.cpp b/src/Utils.cpp
index 0bfc82c3..38dbba22 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp
@@ -638,7 +638,7 @@ utils::luminance(const QColor &col) qreal lumRgb[3]; for (int i = 0; i < 3; i++) { - qreal v = colRgb[i] / 255.0; + qreal v = colRgb[i] / 255.0; v <= 0.03928 ? lumRgb[i] = v / 12.92 : lumRgb[i] = qPow((v + 0.055) / 1.055, 2.4); } diff --git a/src/dialogs/RoomSettings.cpp b/src/dialogs/RoomSettings.cpp
index 822b7218..5b7dc59a 100644 --- a/src/dialogs/RoomSettings.cpp +++ b/src/dialogs/RoomSettings.cpp
@@ -17,6 +17,8 @@ #include <QVBoxLayout> #include "dialogs/RoomSettings.h" +#include <mtx/responses/common.hpp> +#include <mtx/responses/media.hpp> #include "Cache.h" #include "ChatPage.h" diff --git a/src/popups/SuggestionsPopup.cpp b/src/popups/SuggestionsPopup.cpp
index 8f355b38..e84435b7 100644 --- a/src/popups/SuggestionsPopup.cpp +++ b/src/popups/SuggestionsPopup.cpp
@@ -19,6 +19,12 @@ SuggestionsPopup::SuggestionsPopup(QWidget *parent) layout_->setSpacing(0); } +QString +SuggestionsPopup::displayName(QString room, QString user) +{ + return cache::displayName(room, user); +} + void SuggestionsPopup::addRooms(const std::vector<RoomSearchResult> &rooms) { diff --git a/src/popups/SuggestionsPopup.h b/src/popups/SuggestionsPopup.h
index 73bfe6f7..c66f2903 100644 --- a/src/popups/SuggestionsPopup.h +++ b/src/popups/SuggestionsPopup.h
@@ -22,7 +22,7 @@ public: const auto &widget = qobject_cast<Item *>(item->widget()); emit itemSelected( - cache::displayName(ChatPage::instance()->currentRoom(), widget->selectedText())); + displayName(ChatPage::instance()->currentRoom(), widget->selectedText())); resetSelection(); } @@ -47,6 +47,7 @@ signals: void itemSelected(const QString &user); private: + QString displayName(QString roomid, QString userid); void hoverSelection(); void resetSelection() { selectedItem_ = -1; } void selectFirstItem() { selectedItem_ = 0; } diff --git a/src/popups/UserMentions.h b/src/popups/UserMentions.h
index b7c4e51d..885fe67d 100644 --- a/src/popups/UserMentions.h +++ b/src/popups/UserMentions.h
@@ -1,6 +1,6 @@ #pragma once -#include <mtx/responses.hpp> +#include <mtx/responses/notifications.hpp> #include <QMap> #include <QString> diff --git a/src/timeline/EventStore.cpp b/src/timeline/EventStore.cpp
index 38292f49..1cb729d3 100644 --- a/src/timeline/EventStore.cpp +++ b/src/timeline/EventStore.cpp
@@ -3,6 +3,8 @@ #include <QThread> #include <QTimer> +#include <mtx/responses/common.hpp> + #include "Cache.h" #include "Cache_p.h" #include "ChatPage.h" @@ -10,6 +12,7 @@ #include "Logging.h" #include "MatrixClient.h" #include "Olm.h" +#include "Utils.h" Q_DECLARE_METATYPE(Reaction) diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index 598af31e..f9d7d00c 100644 --- a/src/timeline/TimelineViewManager.cpp +++ b/src/timeline/TimelineViewManager.cpp
@@ -11,6 +11,7 @@ #include "ChatPage.h" #include "ColorImageProvider.h" #include "DelegateChooser.h" +#include "DeviceVerificationFlow.h" #include "Logging.h" #include "MainWindow.h" #include "MatrixClient.h" @@ -461,13 +462,10 @@ TimelineViewManager::receivedSessionKey(const std::string &room_id, const std::s } void -TimelineViewManager::initWithMessages(const std::map<QString, mtx::responses::Timeline> &msgs) +TimelineViewManager::initWithMessages(const std::vector<QString> &roomIds) { - for (const auto &e : msgs) { - addRoom(e.first); - - models.value(e.first)->addEvents(e.second); - } + for (const auto &roomId : roomIds) + addRoom(roomId); } void diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h
index 895c4b39..67eeee5b 100644 --- a/src/timeline/TimelineViewManager.h +++ b/src/timeline/TimelineViewManager.h
@@ -7,11 +7,11 @@ #include <QWidget> #include <mtx/common.hpp> -#include <mtx/responses.hpp> +#include <mtx/responses/messages.hpp> +#include <mtx/responses/sync.hpp> #include "Cache.h" #include "CallManager.h" -#include "DeviceVerificationFlow.h" #include "Logging.h" #include "TimelineModel.h" #include "Utils.h" @@ -24,6 +24,7 @@ class BlurhashProvider; class ColorImageProvider; class UserSettings; class ChatPage; +class DeviceVerificationFlow; class TimelineViewManager : public QObject { @@ -97,7 +98,7 @@ signals: public slots: void updateReadReceipts(const QString &room_id, const std::vector<QString> &event_ids); void receivedSessionKey(const std::string &room_id, const std::string &session_id); - void initWithMessages(const std::map<QString, mtx::responses::Timeline> &msgs); + void initWithMessages(const std::vector<QString> &roomIds); void setHistoryView(const QString &room_id); void updateColorPalette(); diff --git a/src/ui/UserProfile.cpp b/src/ui/UserProfile.cpp
index 2bb0370f..974aa5cc 100644 --- a/src/ui/UserProfile.cpp +++ b/src/ui/UserProfile.cpp
@@ -117,7 +117,7 @@ UserProfile::fetchDeviceList(const QString &userID) { auto localUser = utils::localUser(); - ChatPage::instance()->query_keys( + cache::client()->query_keys( userID.toStdString(), [other_user_id = userID.toStdString(), this](const UserKeyCache &other_user_keys, mtx::http::RequestErr err) { @@ -129,7 +129,7 @@ UserProfile::fetchDeviceList(const QString &userID) } // Finding if the User is Verified or not based on the Signatures - ChatPage::instance()->query_keys( + cache::client()->query_keys( utils::localUser().toStdString(), [other_user_id, other_user_keys, this](const UserKeyCache &res, mtx::http::RequestErr err) { diff --git a/src/ui/UserProfile.h b/src/ui/UserProfile.h
index 77b22323..62151266 100644 --- a/src/ui/UserProfile.h +++ b/src/ui/UserProfile.h
@@ -5,8 +5,6 @@ #include <QString> #include <QVector> -#include "MatrixClient.h" - namespace verification { Q_NAMESPACE @@ -116,8 +114,4 @@ private: bool isUserVerified = false; TimelineViewManager *manager; TimelineModel *model; - - void callback_fn(const mtx::responses::QueryKeys &res, - mtx::http::RequestErr err, - std::string user_id); };