From e88627976488b0b6eea6da3389eefb860980d661 Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Thu, 19 Oct 2017 19:23:10 +0900 Subject: Generated jobs: Don't dump empty strings to body parameters This is important for (soon to be added) LoginJob, since the server is sensitive to getting an (even empty) entity for "medium" as opposed to omitting it entirely. This cannot be addressed on the spec level; on the other hand, removing empty parameters from the payload reduces useless bytes getting on the wire. --- jobs/generated/banning.cpp | 25 ++++++++++++++----------- jobs/generated/inviting.cpp | 11 ++++++----- jobs/generated/kicking.cpp | 14 ++++++++------ jobs/generated/leaving.cpp | 6 ++---- jobs/generated/logout.cpp | 3 +-- jobs/generated/profile.cpp | 33 +++++++++++++++++---------------- 6 files changed, 48 insertions(+), 44 deletions(-) (limited to 'jobs') diff --git a/jobs/generated/banning.cpp b/jobs/generated/banning.cpp index c47d3419..ebb4c96c 100644 --- a/jobs/generated/banning.cpp +++ b/jobs/generated/banning.cpp @@ -15,21 +15,24 @@ static const auto basePath = QStringLiteral("/_matrix/client/r0"); BanJob::BanJob(QString roomId, QString user_id, QString reason) : BaseJob(HttpVerb::Post, "BanJob", basePath % "/rooms/" % roomId % "/ban", - Query { }, - Data { - { "user_id", toJson(user_id) }, - { "reason", toJson(reason) } - } + Query { } ) -{ } +{ + Data _data; + _data.insert("user_id", toJson(user_id)); + if (!reason.isEmpty()) + _data.insert("reason", toJson(reason)); + setRequestData(_data); +} UnbanJob::UnbanJob(QString roomId, QString user_id) : BaseJob(HttpVerb::Post, "UnbanJob", basePath % "/rooms/" % roomId % "/unban", - Query { }, - Data { - { "user_id", toJson(user_id) } - } + Query { } ) -{ } +{ + Data _data; + _data.insert("user_id", toJson(user_id)); + setRequestData(_data); +} diff --git a/jobs/generated/inviting.cpp b/jobs/generated/inviting.cpp index 11384c5e..73c73076 100644 --- a/jobs/generated/inviting.cpp +++ b/jobs/generated/inviting.cpp @@ -15,10 +15,11 @@ static const auto basePath = QStringLiteral("/_matrix/client/r0"); InviteUserJob::InviteUserJob(QString roomId, QString user_id) : BaseJob(HttpVerb::Post, "InviteUserJob", basePath % "/rooms/" % roomId % "/invite", - Query { }, - Data { - { "user_id", toJson(user_id) } - } + Query { } ) -{ } +{ + Data _data; + _data.insert("user_id", toJson(user_id)); + setRequestData(_data); +} diff --git a/jobs/generated/kicking.cpp b/jobs/generated/kicking.cpp index e75b900a..28d51d05 100644 --- a/jobs/generated/kicking.cpp +++ b/jobs/generated/kicking.cpp @@ -15,11 +15,13 @@ static const auto basePath = QStringLiteral("/_matrix/client/r0"); KickJob::KickJob(QString roomId, QString user_id, QString reason) : BaseJob(HttpVerb::Post, "KickJob", basePath % "/rooms/" % roomId % "/kick", - Query { }, - Data { - { "user_id", toJson(user_id) }, - { "reason", toJson(reason) } - } + Query { } ) -{ } +{ + Data _data; + _data.insert("user_id", toJson(user_id)); + if (!reason.isEmpty()) + _data.insert("reason", toJson(reason)); + setRequestData(_data); +} diff --git a/jobs/generated/leaving.cpp b/jobs/generated/leaving.cpp index e443612e..392f1ca8 100644 --- a/jobs/generated/leaving.cpp +++ b/jobs/generated/leaving.cpp @@ -15,16 +15,14 @@ static const auto basePath = QStringLiteral("/_matrix/client/r0"); LeaveRoomJob::LeaveRoomJob(QString roomId) : BaseJob(HttpVerb::Post, "LeaveRoomJob", basePath % "/rooms/" % roomId % "/leave", - Query { }, - Data { } + Query { } ) { } ForgetRoomJob::ForgetRoomJob(QString roomId) : BaseJob(HttpVerb::Post, "ForgetRoomJob", basePath % "/rooms/" % roomId % "/forget", - Query { }, - Data { } + Query { } ) { } diff --git a/jobs/generated/logout.cpp b/jobs/generated/logout.cpp index a5848e7c..c2480ff9 100644 --- a/jobs/generated/logout.cpp +++ b/jobs/generated/logout.cpp @@ -15,8 +15,7 @@ static const auto basePath = QStringLiteral("/_matrix/client/r0"); LogoutJob::LogoutJob() : BaseJob(HttpVerb::Post, "LogoutJob", basePath % "/logout", - Query { }, - Data { } + Query { } ) { } diff --git a/jobs/generated/profile.cpp b/jobs/generated/profile.cpp index 201bca79..f24db15a 100644 --- a/jobs/generated/profile.cpp +++ b/jobs/generated/profile.cpp @@ -15,12 +15,14 @@ static const auto basePath = QStringLiteral("/_matrix/client/r0"); SetDisplayNameJob::SetDisplayNameJob(QString userId, QString displayname) : BaseJob(HttpVerb::Put, "SetDisplayNameJob", basePath % "/profile/" % userId % "/displayname", - Query { }, - Data { - { "displayname", toJson(displayname) } - } + Query { } ) -{ } +{ + Data _data; + if (!displayname.isEmpty()) + _data.insert("displayname", toJson(displayname)); + setRequestData(_data); +} class GetDisplayNameJob::Private { @@ -32,8 +34,7 @@ class GetDisplayNameJob::Private GetDisplayNameJob::GetDisplayNameJob(QString userId) : BaseJob(HttpVerb::Get, "GetDisplayNameJob", basePath % "/profile/" % userId % "/displayname", - Query { }, - Data { } + Query { }, Data { }, false ), d(new Private) { } @@ -59,12 +60,14 @@ BaseJob::Status GetDisplayNameJob::parseJson(const QJsonDocument& data) SetAvatarUrlJob::SetAvatarUrlJob(QString userId, QString avatar_url) : BaseJob(HttpVerb::Put, "SetAvatarUrlJob", basePath % "/profile/" % userId % "/avatar_url", - Query { }, - Data { - { "avatar_url", toJson(avatar_url) } - } + Query { } ) -{ } +{ + Data _data; + if (!avatar_url.isEmpty()) + _data.insert("avatar_url", toJson(avatar_url)); + setRequestData(_data); +} class GetAvatarUrlJob::Private { @@ -76,8 +79,7 @@ class GetAvatarUrlJob::Private GetAvatarUrlJob::GetAvatarUrlJob(QString userId) : BaseJob(HttpVerb::Get, "GetAvatarUrlJob", basePath % "/profile/" % userId % "/avatar_url", - Query { }, - Data { } + Query { }, Data { }, false ), d(new Private) { } @@ -111,8 +113,7 @@ class GetUserProfileJob::Private GetUserProfileJob::GetUserProfileJob(QString userId) : BaseJob(HttpVerb::Get, "GetUserProfileJob", basePath % "/profile/" % userId, - Query { }, - Data { } + Query { }, Data { }, false ), d(new Private) { } -- cgit v1.2.3 From 6fc3c79c2b3ac318d3a140594ded28020f9a8afb Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Thu, 30 Nov 2017 03:36:29 +0900 Subject: Generated jobs: Apply naming convention to parameters It's now camelCase everywhere, even if The Spec uses snake_case (it is not consistent in that respect). --- connection.cpp | 4 ++-- jobs/generated/banning.cpp | 8 ++++---- jobs/generated/banning.h | 4 ++-- jobs/generated/inviting.cpp | 4 ++-- jobs/generated/inviting.h | 2 +- jobs/generated/kicking.cpp | 4 ++-- jobs/generated/kicking.h | 2 +- jobs/generated/login.cpp | 42 +++++++++++++++++++++--------------------- jobs/generated/login.h | 10 +++++----- jobs/generated/profile.cpp | 22 +++++++++++----------- jobs/generated/profile.h | 6 +++--- 11 files changed, 54 insertions(+), 54 deletions(-) (limited to 'jobs') diff --git a/connection.cpp b/connection.cpp index 78ef9754..c29f09fe 100644 --- a/connection.cpp +++ b/connection.cpp @@ -165,8 +165,8 @@ void Connection::doConnectToServer(const QString& user, const QString& password, deviceId, initialDeviceName); connect(loginJob, &BaseJob::success, this, [=] { - d->connectWithToken(loginJob->user_id(), loginJob->access_token(), - loginJob->device_id()); + d->connectWithToken(loginJob->userId(), loginJob->accessToken(), + loginJob->deviceId()); }); connect(loginJob, &BaseJob::failure, this, [=] { diff --git a/jobs/generated/banning.cpp b/jobs/generated/banning.cpp index ebb4c96c..67b0e8a1 100644 --- a/jobs/generated/banning.cpp +++ b/jobs/generated/banning.cpp @@ -12,27 +12,27 @@ using namespace QMatrixClient; static const auto basePath = QStringLiteral("/_matrix/client/r0"); -BanJob::BanJob(QString roomId, QString user_id, QString reason) +BanJob::BanJob(QString roomId, QString userId, QString reason) : BaseJob(HttpVerb::Post, "BanJob", basePath % "/rooms/" % roomId % "/ban", Query { } ) { Data _data; - _data.insert("user_id", toJson(user_id)); + _data.insert("user_id", toJson(userId)); if (!reason.isEmpty()) _data.insert("reason", toJson(reason)); setRequestData(_data); } -UnbanJob::UnbanJob(QString roomId, QString user_id) +UnbanJob::UnbanJob(QString roomId, QString userId) : BaseJob(HttpVerb::Post, "UnbanJob", basePath % "/rooms/" % roomId % "/unban", Query { } ) { Data _data; - _data.insert("user_id", toJson(user_id)); + _data.insert("user_id", toJson(userId)); setRequestData(_data); } diff --git a/jobs/generated/banning.h b/jobs/generated/banning.h index b9d5b8db..e225a6ef 100644 --- a/jobs/generated/banning.h +++ b/jobs/generated/banning.h @@ -18,13 +18,13 @@ namespace QMatrixClient class BanJob : public BaseJob { public: - explicit BanJob(QString roomId, QString user_id, QString reason = {}); + explicit BanJob(QString roomId, QString userId, QString reason = {}); }; class UnbanJob : public BaseJob { public: - explicit UnbanJob(QString roomId, QString user_id); + explicit UnbanJob(QString roomId, QString userId); }; diff --git a/jobs/generated/inviting.cpp b/jobs/generated/inviting.cpp index 73c73076..e72bf734 100644 --- a/jobs/generated/inviting.cpp +++ b/jobs/generated/inviting.cpp @@ -12,14 +12,14 @@ using namespace QMatrixClient; static const auto basePath = QStringLiteral("/_matrix/client/r0"); -InviteUserJob::InviteUserJob(QString roomId, QString user_id) +InviteUserJob::InviteUserJob(QString roomId, QString userId) : BaseJob(HttpVerb::Post, "InviteUserJob", basePath % "/rooms/" % roomId % "/invite", Query { } ) { Data _data; - _data.insert("user_id", toJson(user_id)); + _data.insert("user_id", toJson(userId)); setRequestData(_data); } diff --git a/jobs/generated/inviting.h b/jobs/generated/inviting.h index ac0fd5fa..e4b61beb 100644 --- a/jobs/generated/inviting.h +++ b/jobs/generated/inviting.h @@ -18,7 +18,7 @@ namespace QMatrixClient class InviteUserJob : public BaseJob { public: - explicit InviteUserJob(QString roomId, QString user_id); + explicit InviteUserJob(QString roomId, QString userId); }; diff --git a/jobs/generated/kicking.cpp b/jobs/generated/kicking.cpp index 28d51d05..a0719aa2 100644 --- a/jobs/generated/kicking.cpp +++ b/jobs/generated/kicking.cpp @@ -12,14 +12,14 @@ using namespace QMatrixClient; static const auto basePath = QStringLiteral("/_matrix/client/r0"); -KickJob::KickJob(QString roomId, QString user_id, QString reason) +KickJob::KickJob(QString roomId, QString userId, QString reason) : BaseJob(HttpVerb::Post, "KickJob", basePath % "/rooms/" % roomId % "/kick", Query { } ) { Data _data; - _data.insert("user_id", toJson(user_id)); + _data.insert("user_id", toJson(userId)); if (!reason.isEmpty()) _data.insert("reason", toJson(reason)); setRequestData(_data); diff --git a/jobs/generated/kicking.h b/jobs/generated/kicking.h index 658193d5..e7daada8 100644 --- a/jobs/generated/kicking.h +++ b/jobs/generated/kicking.h @@ -18,7 +18,7 @@ namespace QMatrixClient class KickJob : public BaseJob { public: - explicit KickJob(QString roomId, QString user_id, QString reason = {}); + explicit KickJob(QString roomId, QString userId, QString reason = {}); }; diff --git a/jobs/generated/login.cpp b/jobs/generated/login.cpp index 0c57c684..7bd905ee 100644 --- a/jobs/generated/login.cpp +++ b/jobs/generated/login.cpp @@ -15,14 +15,14 @@ static const auto basePath = QStringLiteral("/_matrix/client/r0"); class LoginJob::Private { public: - QString user_id; - QString access_token; - QString home_server; - QString device_id; + QString userId; + QString accessToken; + QString homeServer; + QString deviceId; }; -LoginJob::LoginJob(QString type, QString user, QString medium, QString address, QString password, QString token, QString device_id, QString initial_device_display_name) +LoginJob::LoginJob(QString type, QString user, QString medium, QString address, QString password, QString token, QString deviceId, QString initialDeviceDisplayName) : BaseJob(HttpVerb::Post, "LoginJob", basePath % "/login", Query { }, Data { }, false @@ -40,10 +40,10 @@ LoginJob::LoginJob(QString type, QString user, QString medium, QString address, _data.insert("password", toJson(password)); if (!token.isEmpty()) _data.insert("token", toJson(token)); - if (!device_id.isEmpty()) - _data.insert("device_id", toJson(device_id)); - if (!initial_device_display_name.isEmpty()) - _data.insert("initial_device_display_name", toJson(initial_device_display_name)); + if (!deviceId.isEmpty()) + _data.insert("device_id", toJson(deviceId)); + if (!initialDeviceDisplayName.isEmpty()) + _data.insert("initial_device_display_name", toJson(initialDeviceDisplayName)); setRequestData(_data); } @@ -52,37 +52,37 @@ LoginJob::~LoginJob() delete d; } -const QString& LoginJob::user_id() const +const QString& LoginJob::userId() const { - return d->user_id; + return d->userId; } -const QString& LoginJob::access_token() const +const QString& LoginJob::accessToken() const { - return d->access_token; + return d->accessToken; } -const QString& LoginJob::home_server() const +const QString& LoginJob::homeServer() const { - return d->home_server; + return d->homeServer; } -const QString& LoginJob::device_id() const +const QString& LoginJob::deviceId() const { - return d->device_id; + return d->deviceId; } BaseJob::Status LoginJob::parseJson(const QJsonDocument& data) { auto json = data.object(); - d->user_id = fromJson(json.value("user_id")); + d->userId = fromJson(json.value("user_id")); - d->access_token = fromJson(json.value("access_token")); + d->accessToken = fromJson(json.value("access_token")); - d->home_server = fromJson(json.value("home_server")); + d->homeServer = fromJson(json.value("home_server")); - d->device_id = fromJson(json.value("device_id")); + d->deviceId = fromJson(json.value("device_id")); return Success; } diff --git a/jobs/generated/login.h b/jobs/generated/login.h index dc89206d..8fcca09a 100644 --- a/jobs/generated/login.h +++ b/jobs/generated/login.h @@ -18,14 +18,14 @@ namespace QMatrixClient class LoginJob : public BaseJob { public: - explicit LoginJob(QString type, QString user = {}, QString medium = {}, QString address = {}, QString password = {}, QString token = {}, QString device_id = {}, QString initial_device_display_name = {}); + explicit LoginJob(QString type, QString user = {}, QString medium = {}, QString address = {}, QString password = {}, QString token = {}, QString deviceId = {}, QString initialDeviceDisplayName = {}); ~LoginJob() override; - const QString& user_id() const; - const QString& access_token() const; - const QString& home_server() const; - const QString& device_id() const; + const QString& userId() const; + const QString& accessToken() const; + const QString& homeServer() const; + const QString& deviceId() const; protected: Status parseJson(const QJsonDocument& data) override; diff --git a/jobs/generated/profile.cpp b/jobs/generated/profile.cpp index f24db15a..f682ad31 100644 --- a/jobs/generated/profile.cpp +++ b/jobs/generated/profile.cpp @@ -57,22 +57,22 @@ BaseJob::Status GetDisplayNameJob::parseJson(const QJsonDocument& data) return Success; } -SetAvatarUrlJob::SetAvatarUrlJob(QString userId, QString avatar_url) +SetAvatarUrlJob::SetAvatarUrlJob(QString userId, QString avatarUrl) : BaseJob(HttpVerb::Put, "SetAvatarUrlJob", basePath % "/profile/" % userId % "/avatar_url", Query { } ) { Data _data; - if (!avatar_url.isEmpty()) - _data.insert("avatar_url", toJson(avatar_url)); + if (!avatarUrl.isEmpty()) + _data.insert("avatar_url", toJson(avatarUrl)); setRequestData(_data); } class GetAvatarUrlJob::Private { public: - QString avatar_url; + QString avatarUrl; }; @@ -88,16 +88,16 @@ GetAvatarUrlJob::~GetAvatarUrlJob() delete d; } -const QString& GetAvatarUrlJob::avatar_url() const +const QString& GetAvatarUrlJob::avatarUrl() const { - return d->avatar_url; + return d->avatarUrl; } BaseJob::Status GetAvatarUrlJob::parseJson(const QJsonDocument& data) { auto json = data.object(); - d->avatar_url = fromJson(json.value("avatar_url")); + d->avatarUrl = fromJson(json.value("avatar_url")); return Success; } @@ -105,7 +105,7 @@ BaseJob::Status GetAvatarUrlJob::parseJson(const QJsonDocument& data) class GetUserProfileJob::Private { public: - QString avatar_url; + QString avatarUrl; QString displayname; }; @@ -122,9 +122,9 @@ GetUserProfileJob::~GetUserProfileJob() delete d; } -const QString& GetUserProfileJob::avatar_url() const +const QString& GetUserProfileJob::avatarUrl() const { - return d->avatar_url; + return d->avatarUrl; } const QString& GetUserProfileJob::displayname() const @@ -136,7 +136,7 @@ BaseJob::Status GetUserProfileJob::parseJson(const QJsonDocument& data) { auto json = data.object(); - d->avatar_url = fromJson(json.value("avatar_url")); + d->avatarUrl = fromJson(json.value("avatar_url")); d->displayname = fromJson(json.value("displayname")); diff --git a/jobs/generated/profile.h b/jobs/generated/profile.h index 8e2b195b..cd460ac3 100644 --- a/jobs/generated/profile.h +++ b/jobs/generated/profile.h @@ -40,7 +40,7 @@ namespace QMatrixClient class SetAvatarUrlJob : public BaseJob { public: - explicit SetAvatarUrlJob(QString userId, QString avatar_url = {}); + explicit SetAvatarUrlJob(QString userId, QString avatarUrl = {}); }; class GetAvatarUrlJob : public BaseJob @@ -50,7 +50,7 @@ namespace QMatrixClient ~GetAvatarUrlJob() override; - const QString& avatar_url() const; + const QString& avatarUrl() const; protected: Status parseJson(const QJsonDocument& data) override; @@ -66,7 +66,7 @@ namespace QMatrixClient ~GetUserProfileJob() override; - const QString& avatar_url() const; + const QString& avatarUrl() const; const QString& displayname() const; protected: -- cgit v1.2.3 From c18b0c5be800a39898b6f6619209d1f96d022afa Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Wed, 6 Dec 2017 19:24:03 +0900 Subject: jobs/generated: don't rely on QString's COW; firmer formatting --- jobs/generated/banning.cpp | 5 +++-- jobs/generated/banning.h | 9 +++------ jobs/generated/inviting.cpp | 3 ++- jobs/generated/inviting.h | 5 +---- jobs/generated/kicking.cpp | 3 ++- jobs/generated/kicking.h | 5 +---- jobs/generated/leaving.cpp | 5 +++-- jobs/generated/leaving.h | 9 +++------ jobs/generated/login.cpp | 9 ++------- jobs/generated/login.h | 5 +---- jobs/generated/logout.cpp | 1 + jobs/generated/logout.h | 3 --- jobs/generated/profile.cpp | 21 ++++++--------------- jobs/generated/profile.h | 21 +++++++++------------ 14 files changed, 37 insertions(+), 67 deletions(-) (limited to 'jobs') diff --git a/jobs/generated/banning.cpp b/jobs/generated/banning.cpp index 67b0e8a1..61677da6 100644 --- a/jobs/generated/banning.cpp +++ b/jobs/generated/banning.cpp @@ -6,13 +6,14 @@ #include "banning.h" #include "converters.h" + #include using namespace QMatrixClient; static const auto basePath = QStringLiteral("/_matrix/client/r0"); -BanJob::BanJob(QString roomId, QString userId, QString reason) +BanJob::BanJob(const QString& roomId, const QString& userId, const QString& reason) : BaseJob(HttpVerb::Post, "BanJob", basePath % "/rooms/" % roomId % "/ban", Query { } @@ -25,7 +26,7 @@ BanJob::BanJob(QString roomId, QString userId, QString reason) setRequestData(_data); } -UnbanJob::UnbanJob(QString roomId, QString userId) +UnbanJob::UnbanJob(const QString& roomId, const QString& userId) : BaseJob(HttpVerb::Post, "UnbanJob", basePath % "/rooms/" % roomId % "/unban", Query { } diff --git a/jobs/generated/banning.h b/jobs/generated/banning.h index e225a6ef..6db096ee 100644 --- a/jobs/generated/banning.h +++ b/jobs/generated/banning.h @@ -12,20 +12,17 @@ namespace QMatrixClient { - // Operations class BanJob : public BaseJob { public: - explicit BanJob(QString roomId, QString userId, QString reason = {}); - + explicit BanJob(const QString& roomId, const QString& userId, const QString& reason = {}); }; + class UnbanJob : public BaseJob { public: - explicit UnbanJob(QString roomId, QString userId); - + explicit UnbanJob(const QString& roomId, const QString& userId); }; - } // namespace QMatrixClient diff --git a/jobs/generated/inviting.cpp b/jobs/generated/inviting.cpp index e72bf734..78c9a2f6 100644 --- a/jobs/generated/inviting.cpp +++ b/jobs/generated/inviting.cpp @@ -6,13 +6,14 @@ #include "inviting.h" #include "converters.h" + #include using namespace QMatrixClient; static const auto basePath = QStringLiteral("/_matrix/client/r0"); -InviteUserJob::InviteUserJob(QString roomId, QString userId) +InviteUserJob::InviteUserJob(const QString& roomId, const QString& userId) : BaseJob(HttpVerb::Post, "InviteUserJob", basePath % "/rooms/" % roomId % "/invite", Query { } diff --git a/jobs/generated/inviting.h b/jobs/generated/inviting.h index e4b61beb..225cb516 100644 --- a/jobs/generated/inviting.h +++ b/jobs/generated/inviting.h @@ -12,14 +12,11 @@ namespace QMatrixClient { - // Operations class InviteUserJob : public BaseJob { public: - explicit InviteUserJob(QString roomId, QString userId); - + explicit InviteUserJob(const QString& roomId, const QString& userId); }; - } // namespace QMatrixClient diff --git a/jobs/generated/kicking.cpp b/jobs/generated/kicking.cpp index a0719aa2..5d6f1a64 100644 --- a/jobs/generated/kicking.cpp +++ b/jobs/generated/kicking.cpp @@ -6,13 +6,14 @@ #include "kicking.h" #include "converters.h" + #include using namespace QMatrixClient; static const auto basePath = QStringLiteral("/_matrix/client/r0"); -KickJob::KickJob(QString roomId, QString userId, QString reason) +KickJob::KickJob(const QString& roomId, const QString& userId, const QString& reason) : BaseJob(HttpVerb::Post, "KickJob", basePath % "/rooms/" % roomId % "/kick", Query { } diff --git a/jobs/generated/kicking.h b/jobs/generated/kicking.h index e7daada8..7c834e45 100644 --- a/jobs/generated/kicking.h +++ b/jobs/generated/kicking.h @@ -12,14 +12,11 @@ namespace QMatrixClient { - // Operations class KickJob : public BaseJob { public: - explicit KickJob(QString roomId, QString userId, QString reason = {}); - + explicit KickJob(const QString& roomId, const QString& userId, const QString& reason = {}); }; - } // namespace QMatrixClient diff --git a/jobs/generated/leaving.cpp b/jobs/generated/leaving.cpp index 392f1ca8..2cf7fda3 100644 --- a/jobs/generated/leaving.cpp +++ b/jobs/generated/leaving.cpp @@ -6,20 +6,21 @@ #include "leaving.h" #include "converters.h" + #include using namespace QMatrixClient; static const auto basePath = QStringLiteral("/_matrix/client/r0"); -LeaveRoomJob::LeaveRoomJob(QString roomId) +LeaveRoomJob::LeaveRoomJob(const QString& roomId) : BaseJob(HttpVerb::Post, "LeaveRoomJob", basePath % "/rooms/" % roomId % "/leave", Query { } ) { } -ForgetRoomJob::ForgetRoomJob(QString roomId) +ForgetRoomJob::ForgetRoomJob(const QString& roomId) : BaseJob(HttpVerb::Post, "ForgetRoomJob", basePath % "/rooms/" % roomId % "/forget", Query { } diff --git a/jobs/generated/leaving.h b/jobs/generated/leaving.h index 96304084..28ba3d92 100644 --- a/jobs/generated/leaving.h +++ b/jobs/generated/leaving.h @@ -12,20 +12,17 @@ namespace QMatrixClient { - // Operations class LeaveRoomJob : public BaseJob { public: - explicit LeaveRoomJob(QString roomId); - + explicit LeaveRoomJob(const QString& roomId); }; + class ForgetRoomJob : public BaseJob { public: - explicit ForgetRoomJob(QString roomId); - + explicit ForgetRoomJob(const QString& roomId); }; - } // namespace QMatrixClient diff --git a/jobs/generated/login.cpp b/jobs/generated/login.cpp index 7bd905ee..892d0c81 100644 --- a/jobs/generated/login.cpp +++ b/jobs/generated/login.cpp @@ -6,6 +6,7 @@ #include "login.h" #include "converters.h" + #include using namespace QMatrixClient; @@ -19,10 +20,9 @@ class LoginJob::Private QString accessToken; QString homeServer; QString deviceId; - }; -LoginJob::LoginJob(QString type, QString user, QString medium, QString address, QString password, QString token, QString deviceId, QString initialDeviceDisplayName) +LoginJob::LoginJob(const QString& type, const QString& user, const QString& medium, const QString& address, const QString& password, const QString& token, const QString& deviceId, const QString& initialDeviceDisplayName) : BaseJob(HttpVerb::Post, "LoginJob", basePath % "/login", Query { }, Data { }, false @@ -75,15 +75,10 @@ const QString& LoginJob::deviceId() const BaseJob::Status LoginJob::parseJson(const QJsonDocument& data) { auto json = data.object(); - d->userId = fromJson(json.value("user_id")); - d->accessToken = fromJson(json.value("access_token")); - d->homeServer = fromJson(json.value("home_server")); - d->deviceId = fromJson(json.value("device_id")); - return Success; } diff --git a/jobs/generated/login.h b/jobs/generated/login.h index 8fcca09a..1c017877 100644 --- a/jobs/generated/login.h +++ b/jobs/generated/login.h @@ -12,14 +12,12 @@ namespace QMatrixClient { - // Operations class LoginJob : public BaseJob { public: - explicit LoginJob(QString type, QString user = {}, QString medium = {}, QString address = {}, QString password = {}, QString token = {}, QString deviceId = {}, QString initialDeviceDisplayName = {}); - + explicit LoginJob(const QString& type, const QString& user = {}, const QString& medium = {}, const QString& address = {}, const QString& password = {}, const QString& token = {}, const QString& deviceId = {}, const QString& initialDeviceDisplayName = {}); ~LoginJob() override; const QString& userId() const; @@ -34,5 +32,4 @@ namespace QMatrixClient class Private; Private* d; }; - } // namespace QMatrixClient diff --git a/jobs/generated/logout.cpp b/jobs/generated/logout.cpp index c2480ff9..c250bddf 100644 --- a/jobs/generated/logout.cpp +++ b/jobs/generated/logout.cpp @@ -6,6 +6,7 @@ #include "logout.h" #include "converters.h" + #include using namespace QMatrixClient; diff --git a/jobs/generated/logout.h b/jobs/generated/logout.h index 28e85d8f..ae9e54b8 100644 --- a/jobs/generated/logout.h +++ b/jobs/generated/logout.h @@ -11,14 +11,11 @@ namespace QMatrixClient { - // Operations class LogoutJob : public BaseJob { public: explicit LogoutJob(); - }; - } // namespace QMatrixClient diff --git a/jobs/generated/profile.cpp b/jobs/generated/profile.cpp index f682ad31..42a2350f 100644 --- a/jobs/generated/profile.cpp +++ b/jobs/generated/profile.cpp @@ -6,13 +6,14 @@ #include "profile.h" #include "converters.h" + #include using namespace QMatrixClient; static const auto basePath = QStringLiteral("/_matrix/client/r0"); -SetDisplayNameJob::SetDisplayNameJob(QString userId, QString displayname) +SetDisplayNameJob::SetDisplayNameJob(const QString& userId, const QString& displayname) : BaseJob(HttpVerb::Put, "SetDisplayNameJob", basePath % "/profile/" % userId % "/displayname", Query { } @@ -28,10 +29,9 @@ class GetDisplayNameJob::Private { public: QString displayname; - }; -GetDisplayNameJob::GetDisplayNameJob(QString userId) +GetDisplayNameJob::GetDisplayNameJob(const QString& userId) : BaseJob(HttpVerb::Get, "GetDisplayNameJob", basePath % "/profile/" % userId % "/displayname", Query { }, Data { }, false @@ -51,13 +51,11 @@ const QString& GetDisplayNameJob::displayname() const BaseJob::Status GetDisplayNameJob::parseJson(const QJsonDocument& data) { auto json = data.object(); - d->displayname = fromJson(json.value("displayname")); - return Success; } -SetAvatarUrlJob::SetAvatarUrlJob(QString userId, QString avatarUrl) +SetAvatarUrlJob::SetAvatarUrlJob(const QString& userId, const QString& avatarUrl) : BaseJob(HttpVerb::Put, "SetAvatarUrlJob", basePath % "/profile/" % userId % "/avatar_url", Query { } @@ -73,10 +71,9 @@ class GetAvatarUrlJob::Private { public: QString avatarUrl; - }; -GetAvatarUrlJob::GetAvatarUrlJob(QString userId) +GetAvatarUrlJob::GetAvatarUrlJob(const QString& userId) : BaseJob(HttpVerb::Get, "GetAvatarUrlJob", basePath % "/profile/" % userId % "/avatar_url", Query { }, Data { }, false @@ -96,9 +93,7 @@ const QString& GetAvatarUrlJob::avatarUrl() const BaseJob::Status GetAvatarUrlJob::parseJson(const QJsonDocument& data) { auto json = data.object(); - d->avatarUrl = fromJson(json.value("avatar_url")); - return Success; } @@ -107,10 +102,9 @@ class GetUserProfileJob::Private public: QString avatarUrl; QString displayname; - }; -GetUserProfileJob::GetUserProfileJob(QString userId) +GetUserProfileJob::GetUserProfileJob(const QString& userId) : BaseJob(HttpVerb::Get, "GetUserProfileJob", basePath % "/profile/" % userId, Query { }, Data { }, false @@ -135,11 +129,8 @@ const QString& GetUserProfileJob::displayname() const BaseJob::Status GetUserProfileJob::parseJson(const QJsonDocument& data) { auto json = data.object(); - d->avatarUrl = fromJson(json.value("avatar_url")); - d->displayname = fromJson(json.value("displayname")); - return Success; } diff --git a/jobs/generated/profile.h b/jobs/generated/profile.h index cd460ac3..30e858de 100644 --- a/jobs/generated/profile.h +++ b/jobs/generated/profile.h @@ -12,20 +12,18 @@ namespace QMatrixClient { - // Operations class SetDisplayNameJob : public BaseJob { public: - explicit SetDisplayNameJob(QString userId, QString displayname = {}); - + explicit SetDisplayNameJob(const QString& userId, const QString& displayname = {}); }; + class GetDisplayNameJob : public BaseJob { public: - explicit GetDisplayNameJob(QString userId); - + explicit GetDisplayNameJob(const QString& userId); ~GetDisplayNameJob() override; const QString& displayname() const; @@ -37,17 +35,17 @@ namespace QMatrixClient class Private; Private* d; }; + class SetAvatarUrlJob : public BaseJob { public: - explicit SetAvatarUrlJob(QString userId, QString avatarUrl = {}); - + explicit SetAvatarUrlJob(const QString& userId, const QString& avatarUrl = {}); }; + class GetAvatarUrlJob : public BaseJob { public: - explicit GetAvatarUrlJob(QString userId); - + explicit GetAvatarUrlJob(const QString& userId); ~GetAvatarUrlJob() override; const QString& avatarUrl() const; @@ -59,11 +57,11 @@ namespace QMatrixClient class Private; Private* d; }; + class GetUserProfileJob : public BaseJob { public: - explicit GetUserProfileJob(QString userId); - + explicit GetUserProfileJob(const QString& userId); ~GetUserProfileJob() override; const QString& avatarUrl() const; @@ -76,5 +74,4 @@ namespace QMatrixClient class Private; Private* d; }; - } // namespace QMatrixClient -- cgit v1.2.3 From 80588a782ce702384802e3e0cb469f71e5640ef4 Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Wed, 6 Dec 2017 21:21:27 +0900 Subject: Make BaseJob::Data consume QByteArray as well, not only QJsonObject This is needed to support cases of content-repo, where the request/response bodies are not JSON. --- jobs/basejob.h | 33 ++++++++++++++++++--------------- jobs/generated/banning.cpp | 4 ++-- jobs/generated/inviting.cpp | 2 +- jobs/generated/kicking.cpp | 2 +- jobs/generated/login.cpp | 2 +- jobs/generated/profile.cpp | 4 ++-- 6 files changed, 25 insertions(+), 22 deletions(-) (limited to 'jobs') diff --git a/jobs/basejob.h b/jobs/basejob.h index f8b367c6..66812774 100644 --- a/jobs/basejob.h +++ b/jobs/basejob.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -69,29 +70,31 @@ namespace QMatrixClient } }; /** - * A simple wrapper around QJsonObject that represents a JSON data - * section of an HTTP request to a Matrix server. Facilitates - * creation from a list of key-value string pairs and dumping of - * a resulting JSON to a QByteArray. + * A simple wrapper that represents the request body. + * Provides a unified interface to dump an unstructured byte stream + * as well as JSON (and possibly other structures in the future) to + * a QByteArray consumed by QNetworkAccessManager request methods. */ - class Data : public QJsonObject + class Data { public: - using QJsonObject::QJsonObject; Data() = default; - explicit Data(const QJsonObject& o) : QJsonObject(o) { } -#if (QT_VERSION < QT_VERSION_CHECK(5, 4, 0)) - // This method exists in QJsonObject of newer Qt versions - Data(const std::initializer_list< QPair >& l) + Data(const QByteArray& a) : _payload(a) { } + Data(const QJsonObject& jo) + : _payload(fromJson(QJsonDocument(jo))) { } + Data(const QJsonArray& ja) + : _payload(fromJson(QJsonDocument(ja))) { } + QByteArray serialize() const { - for (auto i: l) - insert(i.first, i.second); + return _payload; } -#endif - QByteArray serialize() const + + private: + static QByteArray fromJson(const QJsonDocument& jd) { - return QJsonDocument(*this).toJson(); + return jd.toJson(QJsonDocument::Compact); } + QByteArray _payload; }; /** diff --git a/jobs/generated/banning.cpp b/jobs/generated/banning.cpp index 61677da6..96f80ea8 100644 --- a/jobs/generated/banning.cpp +++ b/jobs/generated/banning.cpp @@ -19,7 +19,7 @@ BanJob::BanJob(const QString& roomId, const QString& userId, const QString& reas Query { } ) { - Data _data; + QJsonObject _data; _data.insert("user_id", toJson(userId)); if (!reason.isEmpty()) _data.insert("reason", toJson(reason)); @@ -32,7 +32,7 @@ UnbanJob::UnbanJob(const QString& roomId, const QString& userId) Query { } ) { - Data _data; + QJsonObject _data; _data.insert("user_id", toJson(userId)); setRequestData(_data); } diff --git a/jobs/generated/inviting.cpp b/jobs/generated/inviting.cpp index 78c9a2f6..5f89adf7 100644 --- a/jobs/generated/inviting.cpp +++ b/jobs/generated/inviting.cpp @@ -19,7 +19,7 @@ InviteUserJob::InviteUserJob(const QString& roomId, const QString& userId) Query { } ) { - Data _data; + QJsonObject _data; _data.insert("user_id", toJson(userId)); setRequestData(_data); } diff --git a/jobs/generated/kicking.cpp b/jobs/generated/kicking.cpp index 5d6f1a64..86dde629 100644 --- a/jobs/generated/kicking.cpp +++ b/jobs/generated/kicking.cpp @@ -19,7 +19,7 @@ KickJob::KickJob(const QString& roomId, const QString& userId, const QString& re Query { } ) { - Data _data; + QJsonObject _data; _data.insert("user_id", toJson(userId)); if (!reason.isEmpty()) _data.insert("reason", toJson(reason)); diff --git a/jobs/generated/login.cpp b/jobs/generated/login.cpp index 892d0c81..4c159517 100644 --- a/jobs/generated/login.cpp +++ b/jobs/generated/login.cpp @@ -28,7 +28,7 @@ LoginJob::LoginJob(const QString& type, const QString& user, const QString& medi Query { }, Data { }, false ), d(new Private) { - Data _data; + QJsonObject _data; _data.insert("type", toJson(type)); if (!user.isEmpty()) _data.insert("user", toJson(user)); diff --git a/jobs/generated/profile.cpp b/jobs/generated/profile.cpp index 42a2350f..6ec566f7 100644 --- a/jobs/generated/profile.cpp +++ b/jobs/generated/profile.cpp @@ -19,7 +19,7 @@ SetDisplayNameJob::SetDisplayNameJob(const QString& userId, const QString& displ Query { } ) { - Data _data; + QJsonObject _data; if (!displayname.isEmpty()) _data.insert("displayname", toJson(displayname)); setRequestData(_data); @@ -61,7 +61,7 @@ SetAvatarUrlJob::SetAvatarUrlJob(const QString& userId, const QString& avatarUrl Query { } ) { - Data _data; + QJsonObject _data; if (!avatarUrl.isEmpty()) _data.insert("avatar_url", toJson(avatarUrl)); setRequestData(_data); -- cgit v1.2.3 From 879e0bd17abedcc93d005eb7b66f6e9aa762200a Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Thu, 7 Dec 2017 11:40:46 +0900 Subject: New generated jobs for: room directory, 3PIDs, redactions, typing notifications and others Closes #128 (the issue has the full list of jobs arriving herewith). --- jobs/generated/administrative_contact.cpp | 119 ++++++++++++++ jobs/generated/administrative_contact.h | 70 +++++++++ jobs/generated/directory.cpp | 71 +++++++++ jobs/generated/directory.h | 46 ++++++ jobs/generated/list_public_rooms.cpp | 253 ++++++++++++++++++++++++++++++ jobs/generated/list_public_rooms.h | 101 ++++++++++++ jobs/generated/receipts.cpp | 24 +++ jobs/generated/receipts.h | 23 +++ jobs/generated/redaction.cpp | 50 ++++++ jobs/generated/redaction.h | 32 ++++ jobs/generated/third_party_membership.cpp | 28 ++++ jobs/generated/third_party_membership.h | 22 +++ jobs/generated/typing.cpp | 27 ++++ jobs/generated/typing.h | 22 +++ jobs/generated/versions.cpp | 45 ++++++ jobs/generated/versions.h | 33 ++++ jobs/generated/whoami.cpp | 48 ++++++ jobs/generated/whoami.h | 32 ++++ 18 files changed, 1046 insertions(+) create mode 100644 jobs/generated/administrative_contact.cpp create mode 100644 jobs/generated/administrative_contact.h create mode 100644 jobs/generated/directory.cpp create mode 100644 jobs/generated/directory.h create mode 100644 jobs/generated/list_public_rooms.cpp create mode 100644 jobs/generated/list_public_rooms.h create mode 100644 jobs/generated/receipts.cpp create mode 100644 jobs/generated/receipts.h create mode 100644 jobs/generated/redaction.cpp create mode 100644 jobs/generated/redaction.h create mode 100644 jobs/generated/third_party_membership.cpp create mode 100644 jobs/generated/third_party_membership.h create mode 100644 jobs/generated/typing.cpp create mode 100644 jobs/generated/typing.h create mode 100644 jobs/generated/versions.cpp create mode 100644 jobs/generated/versions.h create mode 100644 jobs/generated/whoami.cpp create mode 100644 jobs/generated/whoami.h (limited to 'jobs') diff --git a/jobs/generated/administrative_contact.cpp b/jobs/generated/administrative_contact.cpp new file mode 100644 index 00000000..705c5d54 --- /dev/null +++ b/jobs/generated/administrative_contact.cpp @@ -0,0 +1,119 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#include "administrative_contact.h" + +#include "converters.h" + +#include + +using namespace QMatrixClient; + +static const auto basePath = QStringLiteral("/_matrix/client/r0"); + +GetAccount3PIDsJob::ThirdPartyIdentifier::operator QJsonObject() const +{ + QJsonObject o; + o.insert("medium", toJson(medium)); + o.insert("address", toJson(address)); + + return o; +} +namespace QMatrixClient +{ + template <> struct FromJson + { + GetAccount3PIDsJob::ThirdPartyIdentifier operator()(QJsonValue jv) + { + QJsonObject o = jv.toObject(); + GetAccount3PIDsJob::ThirdPartyIdentifier result; + result.medium = + fromJson(o.value("medium")); + result.address = + fromJson(o.value("address")); + + return result; + } + }; +} // namespace QMatrixClient + +class GetAccount3PIDsJob::Private +{ + public: + QVector threepids; +}; + +GetAccount3PIDsJob::GetAccount3PIDsJob() + : BaseJob(HttpVerb::Get, "GetAccount3PIDsJob", + basePath % "/account/3pid", + Query { } + ), d(new Private) +{ } + +GetAccount3PIDsJob::~GetAccount3PIDsJob() +{ + delete d; +} + +const QVector& GetAccount3PIDsJob::threepids() const +{ + return d->threepids; +} + +BaseJob::Status GetAccount3PIDsJob::parseJson(const QJsonDocument& data) +{ + auto json = data.object(); + d->threepids = fromJson>(json.value("threepids")); + return Success; +} + +Post3PIDsJob::ThreePidCredentials::operator QJsonObject() const +{ + QJsonObject o; + o.insert("client_secret", toJson(clientSecret)); + o.insert("id_server", toJson(idServer)); + o.insert("sid", toJson(sid)); + + return o; +} +namespace QMatrixClient +{ + template <> struct FromJson + { + Post3PIDsJob::ThreePidCredentials operator()(QJsonValue jv) + { + QJsonObject o = jv.toObject(); + Post3PIDsJob::ThreePidCredentials result; + result.clientSecret = + fromJson(o.value("client_secret")); + result.idServer = + fromJson(o.value("id_server")); + result.sid = + fromJson(o.value("sid")); + + return result; + } + }; +} // namespace QMatrixClient + +Post3PIDsJob::Post3PIDsJob(const ThreePidCredentials& threePidCreds, bool bind) + : BaseJob(HttpVerb::Post, "Post3PIDsJob", + basePath % "/account/3pid", + Query { } + ) +{ + QJsonObject _data; + _data.insert("three_pid_creds", toJson(threePidCreds)); + _data.insert("bind", toJson(bind)); + setRequestData(_data); +} + +RequestTokenTo3PIDJob::RequestTokenTo3PIDJob() + : BaseJob(HttpVerb::Post, "RequestTokenTo3PIDJob", + basePath % "/account/3pid/email/requestToken", + Query { }, Data { }, false + ) +{ } + diff --git a/jobs/generated/administrative_contact.h b/jobs/generated/administrative_contact.h new file mode 100644 index 00000000..fa6beba9 --- /dev/null +++ b/jobs/generated/administrative_contact.h @@ -0,0 +1,70 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#pragma once + +#include "../basejob.h" + +#include + +#include "converters.h" + +namespace QMatrixClient +{ + // Operations + + class GetAccount3PIDsJob : public BaseJob + { + public: + // Inner data structures + + struct ThirdPartyIdentifier + { + QString medium; + QString address; + + operator QJsonObject() const; + }; + + // End of inner data structures + + explicit GetAccount3PIDsJob(); + ~GetAccount3PIDsJob() override; + + const QVector& threepids() const; + + protected: + Status parseJson(const QJsonDocument& data) override; + + private: + class Private; + Private* d; + }; + + class Post3PIDsJob : public BaseJob + { + public: + // Inner data structures + + struct ThreePidCredentials + { + QString clientSecret; + QString idServer; + QString sid; + + operator QJsonObject() const; + }; + + // End of inner data structures + + explicit Post3PIDsJob(const ThreePidCredentials& threePidCreds, bool bind = {}); + }; + + class RequestTokenTo3PIDJob : public BaseJob + { + public: + explicit RequestTokenTo3PIDJob(); + }; +} // namespace QMatrixClient diff --git a/jobs/generated/directory.cpp b/jobs/generated/directory.cpp new file mode 100644 index 00000000..dcec75ac --- /dev/null +++ b/jobs/generated/directory.cpp @@ -0,0 +1,71 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#include "directory.h" + +#include "converters.h" + +#include + +using namespace QMatrixClient; + +static const auto basePath = QStringLiteral("/_matrix/client/r0/directory"); + +SetRoomAliasJob::SetRoomAliasJob(const QString& roomAlias, const QString& roomId) + : BaseJob(HttpVerb::Put, "SetRoomAliasJob", + basePath % "/room/" % roomAlias, + Query { } + ) +{ + QJsonObject _data; + if (!roomId.isEmpty()) + _data.insert("room_id", toJson(roomId)); + setRequestData(_data); +} + +class GetRoomIdByAliasJob::Private +{ + public: + QString roomId; + QVector servers; +}; + +GetRoomIdByAliasJob::GetRoomIdByAliasJob(const QString& roomAlias) + : BaseJob(HttpVerb::Get, "GetRoomIdByAliasJob", + basePath % "/room/" % roomAlias, + Query { }, Data { }, false + ), d(new Private) +{ } + +GetRoomIdByAliasJob::~GetRoomIdByAliasJob() +{ + delete d; +} + +const QString& GetRoomIdByAliasJob::roomId() const +{ + return d->roomId; +} + +const QVector& GetRoomIdByAliasJob::servers() const +{ + return d->servers; +} + +BaseJob::Status GetRoomIdByAliasJob::parseJson(const QJsonDocument& data) +{ + auto json = data.object(); + d->roomId = fromJson(json.value("room_id")); + d->servers = fromJson>(json.value("servers")); + return Success; +} + +DeleteRoomAliasJob::DeleteRoomAliasJob(const QString& roomAlias) + : BaseJob(HttpVerb::Delete, "DeleteRoomAliasJob", + basePath % "/room/" % roomAlias, + Query { } + ) +{ } + diff --git a/jobs/generated/directory.h b/jobs/generated/directory.h new file mode 100644 index 00000000..1dd4e7ed --- /dev/null +++ b/jobs/generated/directory.h @@ -0,0 +1,46 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#pragma once + +#include "../basejob.h" + +#include +#include + + +namespace QMatrixClient +{ + // Operations + + class SetRoomAliasJob : public BaseJob + { + public: + explicit SetRoomAliasJob(const QString& roomAlias, const QString& roomId = {}); + }; + + class GetRoomIdByAliasJob : public BaseJob + { + public: + explicit GetRoomIdByAliasJob(const QString& roomAlias); + ~GetRoomIdByAliasJob() override; + + const QString& roomId() const; + const QVector& servers() const; + + protected: + Status parseJson(const QJsonDocument& data) override; + + private: + class Private; + Private* d; + }; + + class DeleteRoomAliasJob : public BaseJob + { + public: + explicit DeleteRoomAliasJob(const QString& roomAlias); + }; +} // namespace QMatrixClient diff --git a/jobs/generated/list_public_rooms.cpp b/jobs/generated/list_public_rooms.cpp new file mode 100644 index 00000000..8a96966f --- /dev/null +++ b/jobs/generated/list_public_rooms.cpp @@ -0,0 +1,253 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#include "list_public_rooms.h" + +#include "converters.h" + +#include + +using namespace QMatrixClient; + +static const auto basePath = QStringLiteral("/_matrix/client/r0"); + +GetPublicRoomsJob::PublicRoomsChunk::operator QJsonObject() const +{ + QJsonObject o; + o.insert("aliases", toJson(aliases)); + o.insert("canonical_alias", toJson(canonicalAlias)); + o.insert("name", toJson(name)); + o.insert("num_joined_members", toJson(numJoinedMembers)); + o.insert("room_id", toJson(roomId)); + o.insert("topic", toJson(topic)); + o.insert("world_readable", toJson(worldReadable)); + o.insert("guest_can_join", toJson(guestCanJoin)); + o.insert("avatar_url", toJson(avatarUrl)); + + return o; +} +namespace QMatrixClient +{ + template <> struct FromJson + { + GetPublicRoomsJob::PublicRoomsChunk operator()(QJsonValue jv) + { + QJsonObject o = jv.toObject(); + GetPublicRoomsJob::PublicRoomsChunk result; + result.aliases = + fromJson>(o.value("aliases")); + result.canonicalAlias = + fromJson(o.value("canonical_alias")); + result.name = + fromJson(o.value("name")); + result.numJoinedMembers = + fromJson(o.value("num_joined_members")); + result.roomId = + fromJson(o.value("room_id")); + result.topic = + fromJson(o.value("topic")); + result.worldReadable = + fromJson(o.value("world_readable")); + result.guestCanJoin = + fromJson(o.value("guest_can_join")); + result.avatarUrl = + fromJson(o.value("avatar_url")); + + return result; + } + }; +} // namespace QMatrixClient + +class GetPublicRoomsJob::Private +{ + public: + QVector chunk; + QString nextBatch; + QString prevBatch; + double totalRoomCountEstimate; +}; + +GetPublicRoomsJob::GetPublicRoomsJob(double limit, const QString& since, const QString& server) + : BaseJob(HttpVerb::Get, "GetPublicRoomsJob", + basePath % "/publicRooms", + Query { + { "limit", toJson(limit).toString() }, + { "since", toJson(since).toString() }, + { "server", toJson(server).toString() } + }, Data { }, false + ), d(new Private) +{ } + +GetPublicRoomsJob::~GetPublicRoomsJob() +{ + delete d; +} + +const QVector& GetPublicRoomsJob::chunk() const +{ + return d->chunk; +} + +const QString& GetPublicRoomsJob::nextBatch() const +{ + return d->nextBatch; +} + +const QString& GetPublicRoomsJob::prevBatch() const +{ + return d->prevBatch; +} + +double GetPublicRoomsJob::totalRoomCountEstimate() const +{ + return d->totalRoomCountEstimate; +} + +BaseJob::Status GetPublicRoomsJob::parseJson(const QJsonDocument& data) +{ + auto json = data.object(); + if (!json.contains("chunk")) + return { JsonParseError, + "The key 'chunk' not found in the response" }; + d->chunk = fromJson>(json.value("chunk")); + d->nextBatch = fromJson(json.value("next_batch")); + d->prevBatch = fromJson(json.value("prev_batch")); + d->totalRoomCountEstimate = fromJson(json.value("total_room_count_estimate")); + return Success; +} + +QueryPublicRoomsJob::Filter::operator QJsonObject() const +{ + QJsonObject o; + o.insert("generic_search_term", toJson(genericSearchTerm)); + + return o; +} +namespace QMatrixClient +{ + template <> struct FromJson + { + QueryPublicRoomsJob::Filter operator()(QJsonValue jv) + { + QJsonObject o = jv.toObject(); + QueryPublicRoomsJob::Filter result; + result.genericSearchTerm = + fromJson(o.value("generic_search_term")); + + return result; + } + }; +} // namespace QMatrixClient + +QueryPublicRoomsJob::PublicRoomsChunk::operator QJsonObject() const +{ + QJsonObject o; + o.insert("aliases", toJson(aliases)); + o.insert("canonical_alias", toJson(canonicalAlias)); + o.insert("name", toJson(name)); + o.insert("num_joined_members", toJson(numJoinedMembers)); + o.insert("room_id", toJson(roomId)); + o.insert("topic", toJson(topic)); + o.insert("world_readable", toJson(worldReadable)); + o.insert("guest_can_join", toJson(guestCanJoin)); + o.insert("avatar_url", toJson(avatarUrl)); + + return o; +} +namespace QMatrixClient +{ + template <> struct FromJson + { + QueryPublicRoomsJob::PublicRoomsChunk operator()(QJsonValue jv) + { + QJsonObject o = jv.toObject(); + QueryPublicRoomsJob::PublicRoomsChunk result; + result.aliases = + fromJson>(o.value("aliases")); + result.canonicalAlias = + fromJson(o.value("canonical_alias")); + result.name = + fromJson(o.value("name")); + result.numJoinedMembers = + fromJson(o.value("num_joined_members")); + result.roomId = + fromJson(o.value("room_id")); + result.topic = + fromJson(o.value("topic")); + result.worldReadable = + fromJson(o.value("world_readable")); + result.guestCanJoin = + fromJson(o.value("guest_can_join")); + result.avatarUrl = + fromJson(o.value("avatar_url")); + + return result; + } + }; +} // namespace QMatrixClient + +class QueryPublicRoomsJob::Private +{ + public: + QVector chunk; + QString nextBatch; + QString prevBatch; + double totalRoomCountEstimate; +}; + +QueryPublicRoomsJob::QueryPublicRoomsJob(const QString& server, double limit, const QString& since, const Filter& filter) + : BaseJob(HttpVerb::Post, "QueryPublicRoomsJob", + basePath % "/publicRooms", + Query { + { "server", toJson(server).toString() } + } + ), d(new Private) +{ + QJsonObject _data; + _data.insert("limit", toJson(limit)); + if (!since.isEmpty()) + _data.insert("since", toJson(since)); + _data.insert("filter", toJson(filter)); + setRequestData(_data); +} + +QueryPublicRoomsJob::~QueryPublicRoomsJob() +{ + delete d; +} + +const QVector& QueryPublicRoomsJob::chunk() const +{ + return d->chunk; +} + +const QString& QueryPublicRoomsJob::nextBatch() const +{ + return d->nextBatch; +} + +const QString& QueryPublicRoomsJob::prevBatch() const +{ + return d->prevBatch; +} + +double QueryPublicRoomsJob::totalRoomCountEstimate() const +{ + return d->totalRoomCountEstimate; +} + +BaseJob::Status QueryPublicRoomsJob::parseJson(const QJsonDocument& data) +{ + auto json = data.object(); + if (!json.contains("chunk")) + return { JsonParseError, + "The key 'chunk' not found in the response" }; + d->chunk = fromJson>(json.value("chunk")); + d->nextBatch = fromJson(json.value("next_batch")); + d->prevBatch = fromJson(json.value("prev_batch")); + d->totalRoomCountEstimate = fromJson(json.value("total_room_count_estimate")); + return Success; +} + diff --git a/jobs/generated/list_public_rooms.h b/jobs/generated/list_public_rooms.h new file mode 100644 index 00000000..74dd8626 --- /dev/null +++ b/jobs/generated/list_public_rooms.h @@ -0,0 +1,101 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#pragma once + +#include "../basejob.h" + +#include +#include + +#include "converters.h" + +namespace QMatrixClient +{ + // Operations + + class GetPublicRoomsJob : public BaseJob + { + public: + // Inner data structures + + struct PublicRoomsChunk + { + QVector aliases; + QString canonicalAlias; + QString name; + double numJoinedMembers; + QString roomId; + QString topic; + bool worldReadable; + bool guestCanJoin; + QString avatarUrl; + + operator QJsonObject() const; + }; + + // End of inner data structures + + explicit GetPublicRoomsJob(double limit = {}, const QString& since = {}, const QString& server = {}); + ~GetPublicRoomsJob() override; + + const QVector& chunk() const; + const QString& nextBatch() const; + const QString& prevBatch() const; + double totalRoomCountEstimate() const; + + protected: + Status parseJson(const QJsonDocument& data) override; + + private: + class Private; + Private* d; + }; + + class QueryPublicRoomsJob : public BaseJob + { + public: + // Inner data structures + + struct Filter + { + QString genericSearchTerm; + + operator QJsonObject() const; + }; + + struct PublicRoomsChunk + { + QVector aliases; + QString canonicalAlias; + QString name; + double numJoinedMembers; + QString roomId; + QString topic; + bool worldReadable; + bool guestCanJoin; + QString avatarUrl; + + operator QJsonObject() const; + }; + + // End of inner data structures + + explicit QueryPublicRoomsJob(const QString& server = {}, double limit = {}, const QString& since = {}, const Filter& filter = {}); + ~QueryPublicRoomsJob() override; + + const QVector& chunk() const; + const QString& nextBatch() const; + const QString& prevBatch() const; + double totalRoomCountEstimate() const; + + protected: + Status parseJson(const QJsonDocument& data) override; + + private: + class Private; + Private* d; + }; +} // namespace QMatrixClient diff --git a/jobs/generated/receipts.cpp b/jobs/generated/receipts.cpp new file mode 100644 index 00000000..2820b583 --- /dev/null +++ b/jobs/generated/receipts.cpp @@ -0,0 +1,24 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#include "receipts.h" + +#include "converters.h" + +#include + +using namespace QMatrixClient; + +static const auto basePath = QStringLiteral("/_matrix/client/r0"); + +PostReceiptJob::PostReceiptJob(const QString& roomId, const QString& receiptType, const QString& eventId, const QJsonObject& receipt) + : BaseJob(HttpVerb::Post, "PostReceiptJob", + basePath % "/rooms/" % roomId % "/receipt/" % receiptType % "/" % eventId, + Query { } + ) +{ + setRequestData(Data(receipt)); +} + diff --git a/jobs/generated/receipts.h b/jobs/generated/receipts.h new file mode 100644 index 00000000..6f36d7fc --- /dev/null +++ b/jobs/generated/receipts.h @@ -0,0 +1,23 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#pragma once + +#include "../basejob.h" + +#include +#include + + +namespace QMatrixClient +{ + // Operations + + class PostReceiptJob : public BaseJob + { + public: + explicit PostReceiptJob(const QString& roomId, const QString& receiptType, const QString& eventId, const QJsonObject& receipt = {}); + }; +} // namespace QMatrixClient diff --git a/jobs/generated/redaction.cpp b/jobs/generated/redaction.cpp new file mode 100644 index 00000000..a9b8ed7e --- /dev/null +++ b/jobs/generated/redaction.cpp @@ -0,0 +1,50 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#include "redaction.h" + +#include "converters.h" + +#include + +using namespace QMatrixClient; + +static const auto basePath = QStringLiteral("/_matrix/client/r0"); + +class RedactEventJob::Private +{ + public: + QString eventId; +}; + +RedactEventJob::RedactEventJob(const QString& roomId, const QString& eventId, const QString& txnId, const QString& reason) + : BaseJob(HttpVerb::Put, "RedactEventJob", + basePath % "/rooms/" % roomId % "/redact/" % eventId % "/" % txnId, + Query { } + ), d(new Private) +{ + QJsonObject _data; + if (!reason.isEmpty()) + _data.insert("reason", toJson(reason)); + setRequestData(_data); +} + +RedactEventJob::~RedactEventJob() +{ + delete d; +} + +const QString& RedactEventJob::eventId() const +{ + return d->eventId; +} + +BaseJob::Status RedactEventJob::parseJson(const QJsonDocument& data) +{ + auto json = data.object(); + d->eventId = fromJson(json.value("event_id")); + return Success; +} + diff --git a/jobs/generated/redaction.h b/jobs/generated/redaction.h new file mode 100644 index 00000000..600e0daa --- /dev/null +++ b/jobs/generated/redaction.h @@ -0,0 +1,32 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#pragma once + +#include "../basejob.h" + +#include + + +namespace QMatrixClient +{ + // Operations + + class RedactEventJob : public BaseJob + { + public: + explicit RedactEventJob(const QString& roomId, const QString& eventId, const QString& txnId, const QString& reason = {}); + ~RedactEventJob() override; + + const QString& eventId() const; + + protected: + Status parseJson(const QJsonDocument& data) override; + + private: + class Private; + Private* d; + }; +} // namespace QMatrixClient diff --git a/jobs/generated/third_party_membership.cpp b/jobs/generated/third_party_membership.cpp new file mode 100644 index 00000000..7a2aa4f4 --- /dev/null +++ b/jobs/generated/third_party_membership.cpp @@ -0,0 +1,28 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#include "third_party_membership.h" + +#include "converters.h" + +#include + +using namespace QMatrixClient; + +static const auto basePath = QStringLiteral("/_matrix/client/r0"); + +InviteBy3PIDJob::InviteBy3PIDJob(const QString& roomId, const QString& idServer, const QString& medium, const QString& address) + : BaseJob(HttpVerb::Post, "InviteBy3PIDJob", + basePath % "/rooms/" % roomId % "/invite", + Query { } + ) +{ + QJsonObject _data; + _data.insert("id_server", toJson(idServer)); + _data.insert("medium", toJson(medium)); + _data.insert("address", toJson(address)); + setRequestData(_data); +} + diff --git a/jobs/generated/third_party_membership.h b/jobs/generated/third_party_membership.h new file mode 100644 index 00000000..6c1193ed --- /dev/null +++ b/jobs/generated/third_party_membership.h @@ -0,0 +1,22 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#pragma once + +#include "../basejob.h" + +#include + + +namespace QMatrixClient +{ + // Operations + + class InviteBy3PIDJob : public BaseJob + { + public: + explicit InviteBy3PIDJob(const QString& roomId, const QString& idServer, const QString& medium, const QString& address); + }; +} // namespace QMatrixClient diff --git a/jobs/generated/typing.cpp b/jobs/generated/typing.cpp new file mode 100644 index 00000000..44bbb131 --- /dev/null +++ b/jobs/generated/typing.cpp @@ -0,0 +1,27 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#include "typing.h" + +#include "converters.h" + +#include + +using namespace QMatrixClient; + +static const auto basePath = QStringLiteral("/_matrix/client/r0"); + +SetTypingJob::SetTypingJob(const QString& userId, const QString& roomId, bool typing, int timeout) + : BaseJob(HttpVerb::Put, "SetTypingJob", + basePath % "/rooms/" % roomId % "/typing/" % userId, + Query { } + ) +{ + QJsonObject _data; + _data.insert("typing", toJson(typing)); + _data.insert("timeout", toJson(timeout)); + setRequestData(_data); +} + diff --git a/jobs/generated/typing.h b/jobs/generated/typing.h new file mode 100644 index 00000000..e20bca1a --- /dev/null +++ b/jobs/generated/typing.h @@ -0,0 +1,22 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#pragma once + +#include "../basejob.h" + +#include + + +namespace QMatrixClient +{ + // Operations + + class SetTypingJob : public BaseJob + { + public: + explicit SetTypingJob(const QString& userId, const QString& roomId, bool typing, int timeout = {}); + }; +} // namespace QMatrixClient diff --git a/jobs/generated/versions.cpp b/jobs/generated/versions.cpp new file mode 100644 index 00000000..66b31290 --- /dev/null +++ b/jobs/generated/versions.cpp @@ -0,0 +1,45 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#include "versions.h" + +#include "converters.h" + +#include + +using namespace QMatrixClient; + +static const auto basePath = QStringLiteral("/_matrix/client"); + +class GetVersionsJob::Private +{ + public: + QVector versions; +}; + +GetVersionsJob::GetVersionsJob() + : BaseJob(HttpVerb::Get, "GetVersionsJob", + basePath % "/versions", + Query { }, Data { }, false + ), d(new Private) +{ } + +GetVersionsJob::~GetVersionsJob() +{ + delete d; +} + +const QVector& GetVersionsJob::versions() const +{ + return d->versions; +} + +BaseJob::Status GetVersionsJob::parseJson(const QJsonDocument& data) +{ + auto json = data.object(); + d->versions = fromJson>(json.value("versions")); + return Success; +} + diff --git a/jobs/generated/versions.h b/jobs/generated/versions.h new file mode 100644 index 00000000..eab8cf9e --- /dev/null +++ b/jobs/generated/versions.h @@ -0,0 +1,33 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#pragma once + +#include "../basejob.h" + +#include +#include + + +namespace QMatrixClient +{ + // Operations + + class GetVersionsJob : public BaseJob + { + public: + explicit GetVersionsJob(); + ~GetVersionsJob() override; + + const QVector& versions() const; + + protected: + Status parseJson(const QJsonDocument& data) override; + + private: + class Private; + Private* d; + }; +} // namespace QMatrixClient diff --git a/jobs/generated/whoami.cpp b/jobs/generated/whoami.cpp new file mode 100644 index 00000000..dce091ec --- /dev/null +++ b/jobs/generated/whoami.cpp @@ -0,0 +1,48 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#include "whoami.h" + +#include "converters.h" + +#include + +using namespace QMatrixClient; + +static const auto basePath = QStringLiteral("/_matrix/client/r0"); + +class GetTokenOwnerJob::Private +{ + public: + QString userId; +}; + +GetTokenOwnerJob::GetTokenOwnerJob() + : BaseJob(HttpVerb::Get, "GetTokenOwnerJob", + basePath % "/account/whoami", + Query { } + ), d(new Private) +{ } + +GetTokenOwnerJob::~GetTokenOwnerJob() +{ + delete d; +} + +const QString& GetTokenOwnerJob::userId() const +{ + return d->userId; +} + +BaseJob::Status GetTokenOwnerJob::parseJson(const QJsonDocument& data) +{ + auto json = data.object(); + if (!json.contains("user_id")) + return { JsonParseError, + "The key 'user_id' not found in the response" }; + d->userId = fromJson(json.value("user_id")); + return Success; +} + diff --git a/jobs/generated/whoami.h b/jobs/generated/whoami.h new file mode 100644 index 00000000..1b04f337 --- /dev/null +++ b/jobs/generated/whoami.h @@ -0,0 +1,32 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#pragma once + +#include "../basejob.h" + +#include + + +namespace QMatrixClient +{ + // Operations + + class GetTokenOwnerJob : public BaseJob + { + public: + explicit GetTokenOwnerJob(); + ~GetTokenOwnerJob() override; + + const QString& userId() const; + + protected: + Status parseJson(const QJsonDocument& data) override; + + private: + class Private; + Private* d; + }; +} // namespace QMatrixClient -- cgit v1.2.3 From 6453ab3ea9a2781940d60e49bc28c38db0fbac79 Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Thu, 7 Dec 2017 17:55:25 +0900 Subject: PasswordLogin: Fix the legacy job class to compile with new BaseJob::Data --- jobs/passwordlogin.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) (limited to 'jobs') diff --git a/jobs/passwordlogin.cpp b/jobs/passwordlogin.cpp index 9af025e6..8abfe66a 100644 --- a/jobs/passwordlogin.cpp +++ b/jobs/passwordlogin.cpp @@ -29,18 +29,15 @@ class PasswordLogin::Private }; PasswordLogin::PasswordLogin(QString user, QString password) - : BaseJob(HttpVerb::Post, "PasswordLogin" - , "_matrix/client/r0/login" - , Query() - , Data( - { { "type", QStringLiteral("m.login.password") } - , { "user", user } - , { "password", password } - }) - , false - ) + : BaseJob(HttpVerb::Post, "PasswordLogin", + "_matrix/client/r0/login", Query(), Data(), false) , d(new Private) { + QJsonObject _data; + _data.insert("type", QStringLiteral("m.login.password")); + _data.insert("user", user); + _data.insert("password", password); + setRequestData(_data); } PasswordLogin::~PasswordLogin() -- cgit v1.2.3 From c5f480355c7d4c000a4ee73fd7f8107a9a9340c2 Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Thu, 14 Dec 2017 18:41:55 +0900 Subject: Move all internal event pointers to std::unique_ptr<> This causes the following changes along the way: - Owning<> template is decommissioned. - event.h has been rearranged, and Event/RoomEvent::fromJson static methods have been replaced with an external makeEvent<> function template. A side effect of that is that one cannot use a factory with a type other than the one it's defined for (i.e. you cannot call makeEvent) but that feature has been out of use for long anyway. - Room::doAddNewMessageEvents() and Room::doAddHistoricalMessageEvents() have been removed, giving place to Room::onAddNewTimelineEvents() and Room::onAddHistoricalTimelineEvents(). The most important difference is that all code that must be executed now resides in addNewMessageEvents() (it moved from Room to Room::Private) and classes inheriting from Room are not obliged to call the overridden function from the overriding function (they can do it but those functions have empty bodies in Room). This was a long overdue change, and owning pointers simply mandated it. Room::onAddNewTimelineEvents/onAddHistoricalTimelineEvents should not do anything with the passed range in terms of ownership, it's just a way to allow the derived class to update his data in due course. - Room::Private::dropDuplicateEvents() and Room::Private::insertEvents(), notably, have been updated to work with owning pointers. insertEvents() move()s pointers to the timeline, while dropDuplicateEvents uses remove_if instead of stable_partition and doesn't explicitly delete event objects. Also, a bugfix: Event accidentally had not virtual destructor for quite a long time. According to the standard, deleting an object through a pointer to a base class without a virtual destructor leads to UB. So the fact that libqmatrixclient clients even worked all these months is mere coincidence and compiler authors good will :-D --- events/event.cpp | 23 +++-- events/event.h | 54 +++++++---- examples/qmc-example.cpp | 12 +-- jobs/roommessagesjob.cpp | 6 +- jobs/roommessagesjob.h | 2 +- jobs/syncjob.h | 2 +- room.cpp | 244 +++++++++++++++++++++++++---------------------- room.h | 36 +++---- util.h | 47 --------- 9 files changed, 205 insertions(+), 221 deletions(-) (limited to 'jobs') diff --git a/events/event.cpp b/events/event.cpp index 1e2d89f2..01f473ce 100644 --- a/events/event.cpp +++ b/events/event.cpp @@ -42,6 +42,8 @@ Event::Event(Type type, const QJsonObject& rep) } } +Event::~Event() = default; + QByteArray Event::originalJson() const { return QJsonDocument(_originalJson).toJson(); @@ -72,14 +74,15 @@ inline BaseEventT* makeIfMatches(const QJsonObject& o, const QString& selector) return makeIfMatches(o, selector); } -Event* Event::fromJson(const QJsonObject& obj) +template <> +EventPtr QMatrixClient::makeEvent(const QJsonObject& obj) { // Check more specific event types first - if (auto e = RoomEvent::fromJson(obj)) - return e; + if (auto e = makeEvent(obj)) + return EventPtr(move(e)); - return makeIfMatches(obj, obj["type"].toString()); + return EventPtr { makeIfMatches(obj, obj["type"].toString()) }; } RoomEvent::RoomEvent(Event::Type type) : Event(type) { } @@ -119,8 +122,7 @@ RoomEvent::RoomEvent(Type type, const QJsonObject& rep) qCDebug(EVENTS) << "Event transactionId:" << _txnId; } -RoomEvent::~RoomEvent() -{ /* Let QScopedPointer do its job */ } +RoomEvent::~RoomEvent() = default; // Let the smart pointer do its job QString RoomEvent::redactionReason() const { @@ -133,11 +135,12 @@ void RoomEvent::addId(const QString& id) _id = id; } -RoomEvent* RoomEvent::fromJson(const QJsonObject& obj) +template <> +RoomEventPtr QMatrixClient::makeEvent(const QJsonObject& obj) { - return makeIfMatches - (obj, obj["type"].toString()); + (obj, obj["type"].toString()) }; } diff --git a/events/event.h b/events/event.h index bd33bb50..2b18bb46 100644 --- a/events/event.h +++ b/events/event.h @@ -25,8 +25,21 @@ #include "util.h" +#include + namespace QMatrixClient { + template + using event_ptr_tt = std::unique_ptr; + + /** Create an event with proper type from a JSON object + * Use this factory template to detect the type from the JSON object + * contents (the detected event type should derive from the template + * parameter type) and create an event object of that type. + */ + template + event_ptr_tt makeEvent(const QJsonObject& obj); + class Event { Q_GADGET @@ -64,12 +77,6 @@ namespace QMatrixClient // (and in most cases it will be a combination of other fields // instead of "content" field). - /** Create an event with proper type from a JSON object - * Use this factory to detect the type from the JSON object contents - * and create an event object of that type. - */ - static Event* fromJson(const QJsonObject& obj); - protected: const QJsonObject contentJson() const; @@ -82,6 +89,10 @@ namespace QMatrixClient Q_PROPERTY(QJsonObject contentJson READ contentJson CONSTANT) }; using EventType = Event::Type; + using EventPtr = event_ptr_tt; + + template <> + EventPtr makeEvent(const QJsonObject& obj); /** * \brief A vector of pointers to events with deserialisation capabilities @@ -94,7 +105,7 @@ namespace QMatrixClient * \tparam EventT base type of all events in the vector */ template - class EventsBatch : public std::vector + class EventsBatch : public std::vector> { public: /** @@ -120,8 +131,10 @@ namespace QMatrixClient for (auto objValue: objs) { const auto o = objValue.toObject(); - auto e = EventT::fromJson(o); - this->push_back(e ? e : new EventT(EventType::Unknown, o)); + auto e { makeEvent(o) }; + if (!e) + e.reset(new EventT(EventType::Unknown, o)); + this->emplace_back(std::move(e)); } } }; @@ -151,10 +164,10 @@ namespace QMatrixClient const QDateTime& timestamp() const { return _serverTimestamp; } const QString& roomId() const { return _roomId; } const QString& senderId() const { return _senderId; } - bool isRedacted() const { return redactedBecause(); } - RedactionEvent* redactedBecause() const + bool isRedacted() const { return bool(_redactedBecause); } + const RedactionEvent* redactedBecause() const { - return _redactedBecause.data(); + return _redactedBecause.get(); } QString redactionReason() const; const QString& transactionId() const { return _txnId; } @@ -180,18 +193,19 @@ namespace QMatrixClient */ void addId(const QString& id); - // "Static override" of the one in Event - static RoomEvent* fromJson(const QJsonObject& obj); - private: QString _id; QString _roomId; QString _senderId; QDateTime _serverTimestamp; - QScopedPointer _redactedBecause; + event_ptr_tt _redactedBecause; QString _txnId; }; using RoomEvents = EventsBatch; + using RoomEventPtr = event_ptr_tt; + + template <> + RoomEventPtr makeEvent(const QJsonObject& obj); /** * Conceptually similar to QStringView (but much more primitive), it's a @@ -199,10 +213,10 @@ namespace QMatrixClient * referring to the beginning and the end of a range in a RoomEvents * container. */ - struct RoomEventsView + struct RoomEventsRange { - RoomEvents::const_iterator from; - RoomEvents::const_iterator to; + RoomEvents::iterator from; + RoomEvents::iterator to; RoomEvents::size_type size() const { @@ -212,6 +226,8 @@ namespace QMatrixClient bool empty() const { return from == to; } RoomEvents::const_iterator begin() const { return from; } RoomEvents::const_iterator end() const { return to; } + RoomEvents::iterator begin() { return from; } + RoomEvents::iterator end() { return to; } }; template diff --git a/examples/qmc-example.cpp b/examples/qmc-example.cpp index ff7944ce..dbb9912b 100644 --- a/examples/qmc-example.cpp +++ b/examples/qmc-example.cpp @@ -20,16 +20,16 @@ void onNewRoom(Room* r) << " Canonical alias: " << r->canonicalAlias().toStdString() << endl << endl; }); - QObject::connect(r, &Room::aboutToAddNewMessages, [=] (RoomEventsView events) { - cout << events.size() << " new event(s) in room " + QObject::connect(r, &Room::aboutToAddNewMessages, [=] (RoomEventsRange timeline) { + cout << timeline.size() << " new event(s) in room " << r->id().toStdString() << ":" << endl; - for (auto e: events) + for (const auto& item: timeline) { cout << "From: " - << r->roomMembername(e->senderId()).toStdString() + << r->roomMembername(item->senderId()).toStdString() << endl << "Timestamp:" - << e->timestamp().toString().toStdString() << endl - << "JSON:" << endl << string(e->originalJson()) << endl; + << item->timestamp().toString().toStdString() << endl + << "JSON:" << endl << string(item->originalJson()) << endl; } }); } diff --git a/jobs/roommessagesjob.cpp b/jobs/roommessagesjob.cpp index 9af1b3a6..e5568f17 100644 --- a/jobs/roommessagesjob.cpp +++ b/jobs/roommessagesjob.cpp @@ -23,7 +23,7 @@ using namespace QMatrixClient; class RoomMessagesJob::Private { public: - Owning events; + RoomEvents events; QString end; }; @@ -46,9 +46,9 @@ RoomMessagesJob::~RoomMessagesJob() delete d; } -RoomEvents RoomMessagesJob::releaseEvents() +RoomEvents&& RoomMessagesJob::releaseEvents() { - return d->events.release(); + return move(d->events); } QString RoomMessagesJob::end() const diff --git a/jobs/roommessagesjob.h b/jobs/roommessagesjob.h index 9680d52c..7b3fd9c9 100644 --- a/jobs/roommessagesjob.h +++ b/jobs/roommessagesjob.h @@ -34,7 +34,7 @@ namespace QMatrixClient FetchDirection dir = FetchDirection::Backward); virtual ~RoomMessagesJob(); - RoomEvents releaseEvents(); + RoomEvents&& releaseEvents(); QString end() const; protected: diff --git a/jobs/syncjob.h b/jobs/syncjob.h index 08bd773e..e9288486 100644 --- a/jobs/syncjob.h +++ b/jobs/syncjob.h @@ -30,7 +30,7 @@ namespace QMatrixClient { public: template - class Batch : public Owning> + class Batch : public EventsBatch { public: explicit Batch(QString k) : jsonKey(std::move(k)) { } diff --git a/room.cpp b/room.cpp index 1234c343..6c426de2 100644 --- a/room.cpp +++ b/room.cpp @@ -44,6 +44,7 @@ #include using namespace QMatrixClient; +using namespace std::placeholders; enum EventsPlacement : int { Older = -1, Newer = 1 }; @@ -101,20 +102,34 @@ class Room::Private void getPreviousContent(int limit = 10); - bool isEventNotable(const RoomEvent* e) const + bool isEventNotable(const TimelineItem& ti) const { - return !e->isRedacted() && - e->senderId() != connection->userId() && - e->type() == EventType::RoomMessage; + return !ti->isRedacted() && + ti->senderId() != connection->userId() && + ti->type() == EventType::RoomMessage; } - void insertEvents(RoomEventsView events, EventsPlacement placement); + void addNewMessageEvents(RoomEvents&& events); + void addHistoricalMessageEvents(RoomEvents&& events); + + /** + * @brief Move events into the timeline + * + * Insert events into the timeline, either new or historical. + * Pointers in the original container become empty, the ownership + * is passed to the timeline container. + * @param events - the range of events to be inserted + * @param placement - position and direction of insertion: Older for + * historical messages, Newer for new ones + */ + Timeline::size_type insertEvents(RoomEventsRange&& events, + EventsPlacement placement); /** * Removes events from the passed container that are already in the timeline */ void dropDuplicateEvents(RoomEvents* events) const; - void checkUnreadMessages(RoomEventsView events); + void checkUnreadMessages(timeline_iter_t from); void setLastReadEvent(User* u, const QString& eventId); rev_iter_pair_t promoteReadMarker(User* u, rev_iter_t newMarker, @@ -122,7 +137,13 @@ class Room::Private void markMessagesAsRead(rev_iter_t upToMarker); - void processRedaction(const RedactionEvent* redaction); + /** + * @brief Apply redaction to the timeline + * + * Tries to find an event in the timeline and redact it; deletes the + * redaction event whether the redacted event was found or not. + */ + void processRedaction(RoomEventPtr redactionEvent); QJsonObject toJson() const; @@ -250,9 +271,8 @@ Room::Private::promoteReadMarker(User* u, Room::rev_iter_t newMarker, setLastReadEvent(u, (*(eagerMarker - 1))->id()); if (isLocalUser(u) && unreadMessages) { - auto stillUnreadMessagesCount = - count_if(eagerMarker, timeline.cend(), - [=](const TimelineItem& ti) { return isEventNotable(ti.event()); }); + auto stillUnreadMessagesCount = count_if(eagerMarker, timeline.cend(), + bind(&Room::Private::isEventNotable, this, _1)); if (stillUnreadMessagesCount == 0) { @@ -437,12 +457,13 @@ void Room::Private::removeMemberFromMap(const QString& username, User* u) emit q->memberRenamed(formerNamesakes[0]); } -inline QByteArray makeErrorStr(const Event* e, QByteArray msg) +inline QByteArray makeErrorStr(const Event& e, QByteArray msg) { - return msg.append("; event dump follows:\n").append(e->originalJson()); + return msg.append("; event dump follows:\n").append(e.originalJson()); } -void Room::Private::insertEvents(RoomEventsView events, EventsPlacement placement) +Room::Timeline::size_type Room::Private::insertEvents(RoomEventsRange&& events, + EventsPlacement placement) { // Historical messages arrive in newest-to-oldest order, so the process for // them is symmetric to the one for new messages. @@ -450,22 +471,26 @@ void Room::Private::insertEvents(RoomEventsView events, EventsPlacement placemen placement == Older ? timeline.front().index() : timeline.back().index(); auto baseIndex = index; - for (const auto e: events) + for (auto&& e: events) { + const auto eId = e->id(); Q_ASSERT_X(e, __FUNCTION__, "Attempt to add nullptr to timeline"); - Q_ASSERT_X(!e->id().isEmpty(), __FUNCTION__, - makeErrorStr(e, "Event with empty id cannot be in the timeline")); - Q_ASSERT_X(!eventsIndex.contains(e->id()), __FUNCTION__, - makeErrorStr(e, "Event is already in the timeline; " + Q_ASSERT_X(!eId.isEmpty(), __FUNCTION__, + makeErrorStr(*e, + "Event with empty id cannot be in the timeline")); + Q_ASSERT_X(!eventsIndex.contains(eId), __FUNCTION__, + makeErrorStr(*e, "Event is already in the timeline; " "incoming events were not properly deduplicated")); if (placement == Older) - timeline.emplace_front(e, --index); + timeline.emplace_front(move(e), --index); else - timeline.emplace_back(e, ++index); - eventsIndex.insert(e->id(), index); - Q_ASSERT(q->findInTimeline(e->id())->event() == e); + timeline.emplace_back(move(e), ++index); + eventsIndex.insert(eId, index); + Q_ASSERT(q->findInTimeline(eId)->event()->id() == eId); } + // Pointers in "events" are empty now, but events.size() didn't change Q_ASSERT(int(events.size()) == (index - baseIndex) * int(placement)); + return events.size(); } void Room::Private::addMember(User *u) @@ -578,15 +603,15 @@ void Room::updateData(SyncRoomData&& data) << et.elapsed() << "ms," << data.timeline.size() << "events"; et.restart(); - addNewMessageEvents(data.timeline.release()); + d->addNewMessageEvents(move(data.timeline)); qCDebug(PROFILER) << "*** Room::addNewMessageEvents():" << et.elapsed() << "ms"; } if (!data.ephemeral.empty()) { et.restart(); - for( auto ephemeralEvent: data.ephemeral ) - processEphemeralEvent(ephemeralEvent); + for( auto&& ephemeralEvent: data.ephemeral ) + processEphemeralEvent(move(ephemeralEvent)); qCDebug(PROFILER) << "*** Room::processEphemeralEvents():" << et.elapsed() << "ms"; } @@ -638,7 +663,7 @@ void Room::Private::getPreviousContent(int limit) connect( roomMessagesJob, &RoomMessagesJob::result, [=]() { if( !roomMessagesJob->error() ) { - q->addHistoricalMessageEvents(roomMessagesJob->releaseEvents()); + addHistoricalMessageEvents(roomMessagesJob->releaseEvents()); prevBatch = roomMessagesJob->end(); } roomMessagesJob = nullptr; @@ -682,35 +707,35 @@ void Room::Private::dropDuplicateEvents(RoomEvents* events) const if (events->empty()) return; - // Collect all duplicate events at the end of the container - auto dupsBegin = - std::stable_partition(events->begin(), events->end(), - [&] (RoomEvent* e) { return !eventsIndex.contains(e->id()); }); - - if (dupsBegin != events->begin()) - { - // Check the batch itself for dups - auto eIt = events->begin(); - for (auto baseId = (*eIt)->id(); ++eIt < dupsBegin; baseId = (*eIt)->id()) - { - dupsBegin = - std::stable_partition(eIt, dupsBegin, - [&] (const RoomEvent* e) { return e->id() != baseId; }); - } - } + // Multiple-remove (by different criteria), single-erase + // 1. Check for duplicates against the timeline. + auto dupsBegin = remove_if(events->begin(), events->end(), + [&] (const RoomEventPtr& e) + { return eventsIndex.contains(e->id()); }); + + // 2. Check for duplicates within the batch if there are still events. + for (auto eIt = events->begin(); distance(eIt, dupsBegin) > 1; ++eIt) + dupsBegin = remove_if(eIt + 1, dupsBegin, + [&] (const RoomEventPtr& e) + { return e->id() == (*eIt)->id(); }); if (dupsBegin == events->end()) return; qCDebug(EVENTS) << "Dropping" << distance(dupsBegin, events->end()) << "duplicate event(s)"; - // Dispose of those dups - std::for_each(dupsBegin, events->end(), [] (Event* e) { delete e; }); events->erase(dupsBegin, events->end()); } -void Room::Private::processRedaction(const RedactionEvent* redaction) +inline bool isRedaction(const RoomEventPtr& e) { - Q_ASSERT(redaction && redaction->type() == EventType::Redaction); + return e->type() == EventType::Redaction; +} + +void Room::Private::processRedaction(RoomEventPtr redactionEvent) +{ + Q_ASSERT(redactionEvent && isRedaction(redactionEvent)); + const auto& redaction = + static_cast(redactionEvent.get()); const auto pIdx = eventsIndex.find(redaction->redactedEvent()); if (pIdx == eventsIndex.end()) @@ -778,11 +803,10 @@ void Room::Private::processRedaction(const RedactionEvent* redaction) // Make a new event from the redacted JSON, exchange events, // notify everyone and delete the old event - auto oldEvent = ti.replaceEvent(RoomEvent::fromJson(originalJson)); - q->onRedaction(oldEvent, ti); + auto oldEvent { ti.replaceEvent(makeEvent(originalJson)) }; + q->onRedaction(oldEvent.get(), ti.event()); qCDebug(MAIN) << "Redacted" << oldEvent->id() << "with" << redaction->id(); - emit q->replacedEvent(oldEvent, ti.event()); - delete oldEvent; + emit q->replacedEvent(ti.event(), oldEvent.get()); } Connection* Room::connection() const @@ -796,62 +820,55 @@ User* Room::localUser() const return connection()->user(); } -inline bool isRedaction(Event* e) +void Room::Private::addNewMessageEvents(RoomEvents&& events) { - return e->type() == EventType::Redaction; -} - -void Room::addNewMessageEvents(RoomEvents events) -{ - auto timelineSize = d->timeline.size(); + auto timelineSize = timeline.size(); - d->dropDuplicateEvents(&events); + dropDuplicateEvents(&events); // We want to process redactions in the order of arrival (covering the // case of one redaction superseding another one), hence stable partition. const auto normalsBegin = - std::stable_partition(events.begin(), events.end(), isRedaction); - RoomEventsView redactions { events.begin(), normalsBegin }, + stable_partition(events.begin(), events.end(), isRedaction); + RoomEventsRange redactions { events.begin(), normalsBegin }, normalEvents { normalsBegin, events.end() }; + if (!normalEvents.empty()) + emit q->aboutToAddNewMessages(normalEvents); + const auto insertedSize = insertEvents(std::move(normalEvents), Newer); + if (insertedSize > 0) { - emit aboutToAddNewMessages(normalEvents); - doAddNewMessageEvents(normalEvents); + qCDebug(MAIN) + << "Room" << displayname << "received" << insertedSize + << "new events; the last event is now" << timeline.back(); + q->onAddNewTimelineEvents(timeline.cend() - insertedSize); } - for (auto* r: redactions) - d->processRedaction(static_cast(r)); - if (!normalEvents.empty()) + for (auto&& r: redactions) + processRedaction(move(r)); + if (insertedSize > 0) { - d->checkUnreadMessages(normalEvents); - emit addedMessages(); + checkUnreadMessages(timeline.cend() - insertedSize); + emit q->addedMessages(); } - Q_ASSERT(d->timeline.size() == timelineSize + normalEvents.size()); -} - -void Room::doAddNewMessageEvents(RoomEventsView events) -{ - Q_ASSERT(!events.empty()); - d->insertEvents(events, Newer); - qCDebug(MAIN) - << "Room" << displayName() << "received" << events.size() - << "new events; the last event is now" << d->timeline.back(); + Q_ASSERT(timeline.size() == timelineSize + insertedSize); } -void Room::Private::checkUnreadMessages(RoomEventsView events) +void Room::Private::checkUnreadMessages(timeline_iter_t from) { - auto newUnreadMessages = - count_if(events.from, events.to, - [=] (const RoomEvent* e) { return isEventNotable(e); }); + Q_ASSERT(from < timeline.cend()); + const auto newUnreadMessages = count_if(from, timeline.cend(), + bind(&Room::Private::isEventNotable, this, _1)); - // The first event in the batch defines whose read marker can possibly be - // promoted any further over the same author's events newly arrived. - // Others will need explicit read receipts from the server (or, for - // the local user, markMessagesAsRead() invocation) to promote their - // read markers over the new message events. - User* firstWriter = connection->user((*events.from)->senderId()); + // The first event in the just-added batch (referred to by upTo.base()) + // defines whose read marker can possibly be promoted any further over + // the same author's events newly arrived. Others will need explicit + // read receipts from the server (or, for the local user, + // markMessagesAsRead() invocation) to promote their read markers over + // the new message events. + auto firstWriter = connection->user((*from)->senderId()); if (q->readMarker(firstWriter) != timeline.crend()) { - promoteReadMarker(firstWriter, q->findInTimeline((*events.from)->id())); + promoteReadMarker(firstWriter, q->findInTimeline((*from)->id())); qCDebug(MAIN) << "Auto-promoted read marker for" << firstWriter->id() << "to" << *q->readMarker(firstWriter); } @@ -864,50 +881,45 @@ void Room::Private::checkUnreadMessages(RoomEventsView events) } } -void Room::addHistoricalMessageEvents(RoomEvents events) +void Room::Private::addHistoricalMessageEvents(RoomEvents&& events) { - auto timelineSize = d->timeline.size(); + const auto timelineSize = timeline.size(); - d->dropDuplicateEvents(&events); - auto redactionsBegin = - std::remove_if(events.begin(), events.end(), isRedaction); - RoomEventsView normalEvents { events.begin(), redactionsBegin }; + dropDuplicateEvents(&events); + const auto redactionsBegin = + remove_if(events.begin(), events.end(), isRedaction); + RoomEventsRange normalEvents { events.begin(), redactionsBegin }; if (normalEvents.empty()) return; - emit aboutToAddHistoricalMessages(normalEvents); - doAddHistoricalMessageEvents(normalEvents); - emit addedMessages(); - - Q_ASSERT(d->timeline.size() == timelineSize + normalEvents.size()); -} - -void Room::doAddHistoricalMessageEvents(RoomEventsView events) -{ - Q_ASSERT(!events.empty()); - - const bool thereWasNoReadMarker = readMarker() == timelineEdge(); - d->insertEvents(events, Older); + emit q->aboutToAddHistoricalMessages(normalEvents); + const bool thereWasNoReadMarker = q->readMarker() == timeline.crend(); + const auto insertedSize = insertEvents(std::move(normalEvents), Older); // Catch a special case when the last read event id refers to an event // that was outside the loaded timeline and has just arrived. Depending on // other messages next to the last read one, we might need to promote // the read marker and update unreadMessages flag. - const auto curReadMarker = readMarker(); - if (thereWasNoReadMarker && curReadMarker != timelineEdge()) + const auto curReadMarker = q->readMarker(); + if (thereWasNoReadMarker && curReadMarker != timeline.crend()) { qCDebug(MAIN) << "Discovered last read event in a historical batch"; - d->promoteReadMarker(localUser(), curReadMarker, true); + promoteReadMarker(q->localUser(), curReadMarker, true); } - qCDebug(MAIN) << "Room" << displayName() << "received" << events.size() - << "past events; the oldest event is now" << d->timeline.front(); + qCDebug(MAIN) << "Room" << displayname << "received" << insertedSize + << "past events; the oldest event is now" << timeline.front(); + q->onAddHistoricalTimelineEvents(timeline.crend() - insertedSize); + emit q->addedMessages(); + + Q_ASSERT(timeline.size() == timelineSize + insertedSize); } void Room::processStateEvents(const RoomEvents& events) { bool emitNamesChanged = false; - for (auto event: events) + for (const auto& e: events) { + auto* event = e.get(); switch (event->type()) { case EventType::RoomName: { @@ -973,12 +985,12 @@ void Room::processStateEvents(const RoomEvents& events) d->updateDisplayname(); } -void Room::processEphemeralEvent(Event* event) +void Room::processEphemeralEvent(EventPtr event) { switch (event->type()) { case EventType::Typing: { - auto typingEvent = static_cast(event); + auto typingEvent = static_cast(event.get()); d->usersTyping.clear(); for( const QString& userId: typingEvent->users() ) { @@ -989,7 +1001,7 @@ void Room::processEphemeralEvent(Event* event) break; } case EventType::Receipt: { - auto receiptEvent = static_cast(event); + auto receiptEvent = static_cast(event.get()); for( const auto &p: receiptEvent->eventsWithReceipts() ) { { diff --git a/room.h b/room.h index c0e041f6..08327917 100644 --- a/room.h +++ b/room.h @@ -45,25 +45,25 @@ namespace QMatrixClient { public: // For compatibility with Qt containers, even though we use - // a std:: container now + // a std:: container now for the room timeline using index_t = int; - TimelineItem(RoomEvent* e, index_t number) : evt(e), idx(number) { } + TimelineItem(RoomEventPtr&& e, index_t number) + : evt(move(e)), idx(number) { } RoomEvent* event() const { return evt.get(); } - RoomEvent* operator->() const { return event(); } //< Synonym for event()-> + RoomEvent* operator->() const { return evt.operator->(); } index_t index() const { return idx; } // Used for event redaction - RoomEvent* replaceEvent(RoomEvent* other) + RoomEventPtr replaceEvent(RoomEventPtr&& other) { - auto* old = evt.release(); - evt.reset(other); - return old; + evt.swap(other); + return move(other); } private: - std::unique_ptr evt; + RoomEventPtr evt; index_t idx; }; inline QDebug& operator<<(QDebug& d, const TimelineItem& ti) @@ -88,6 +88,7 @@ namespace QMatrixClient public: using Timeline = std::deque; using rev_iter_t = Timeline::const_reverse_iterator; + using timeline_iter_t = Timeline::const_iterator; Room(Connection* connection, QString id, JoinState initialJoinState); ~Room() override; @@ -188,8 +189,8 @@ namespace QMatrixClient void markAllMessagesAsRead(); signals: - void aboutToAddHistoricalMessages(RoomEventsView events); - void aboutToAddNewMessages(RoomEventsView events); + void aboutToAddHistoricalMessages(RoomEventsRange events); + void aboutToAddNewMessages(RoomEventsRange events); void addedMessages(); /** @@ -212,21 +213,20 @@ namespace QMatrixClient void lastReadEventChanged(User* user); void readMarkerMoved(); void unreadMessagesChanged(Room* room); - void replacedEvent(RoomEvent* before, RoomEvent* after); + void replacedEvent(const RoomEvent* newEvent, + const RoomEvent* oldEvent); protected: - virtual void doAddNewMessageEvents(RoomEventsView events); - virtual void doAddHistoricalMessageEvents(RoomEventsView events); virtual void processStateEvents(const RoomEvents& events); - virtual void processEphemeralEvent(Event* event); - virtual void onRedaction(RoomEvent*, TimelineItem&) { } + virtual void processEphemeralEvent(EventPtr event); + virtual void onAddNewTimelineEvents(timeline_iter_t from) { } + virtual void onAddHistoricalTimelineEvents(rev_iter_t from) { } + virtual void onRedaction(const RoomEvent* prevEvent, + const RoomEvent* after) { } private: class Private; Private* d; - - void addNewMessageEvents(RoomEvents events); - void addHistoricalMessageEvents(RoomEvents events); }; class MemberSorter diff --git a/util.h b/util.h index 09c58087..65de0610 100644 --- a/util.h +++ b/util.h @@ -25,53 +25,6 @@ namespace QMatrixClient { - /** - * @brief A crude wrapper around a container of pointers that owns pointers - * to contained objects - * - * Similar to vector>, upon deletion, this wrapper - * will delete all events contained in it. This wrapper can be used - * over Qt containers, which are incompatible with unique_ptr and even - * with QScopedPointer (which is the reason of its creation). - */ - template - class Owning : public ContainerT - { - public: - Owning() = default; - Owning(const Owning&) = delete; - Owning(Owning&&) = default; - Owning& operator=(Owning&& other) - { - assign(other.release()); - return *this; - } - - ~Owning() { cleanup(); } - - void assign(ContainerT&& other) - { - if (&other == this) - return; - cleanup(); - ContainerT::operator=(other); - } - - /** - * @brief returns the underlying container and releases the ownership - * - * Acts similar to unique_ptr::release. - */ - ContainerT release() - { - ContainerT c; - ContainerT::swap(c); - return c; - } - private: - void cleanup() { for (auto e: *this) delete e; } - }; - /** * @brief Lookup a value by a key in a varargs list * -- cgit v1.2.3 From cca9a575e64e2824d36680d67de84c5cb1653165 Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Thu, 14 Dec 2017 19:38:19 +0900 Subject: Declare SyncRoomData as C++-movable This fixes compilation with older compilers that try to instantiate a copy constructor (and fail because unique_ptr) but actually is more proper in general. Also: do not advertise the class as Q_MOVABLE_TYPE: this was useful for QList/QVector when SyncRoomData was copyable; now it isn't, and Qt containers can't deal with non-copyable classes at all. --- jobs/syncjob.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'jobs') diff --git a/jobs/syncjob.h b/jobs/syncjob.h index e9288486..aed36e0b 100644 --- a/jobs/syncjob.h +++ b/jobs/syncjob.h @@ -58,12 +58,9 @@ namespace QMatrixClient SyncRoomData(const QString& roomId, JoinState joinState_, const QJsonObject& room_); + SyncRoomData(SyncRoomData&&) = default; + SyncRoomData& operator=(SyncRoomData&&) = default; }; -} // namespace QMatrixClient -Q_DECLARE_TYPEINFO(QMatrixClient::SyncRoomData, Q_MOVABLE_TYPE); - -namespace QMatrixClient -{ // QVector cannot work with non-copiable objects, std::vector can. using SyncDataList = std::vector; -- cgit v1.2.3