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> ¬ifs);
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);
};
|