diff --git a/Quotient/connection.cpp b/Quotient/connection.cpp index 1474ddc38..bcb965a0e 100644 --- a/Quotient/connection.cpp +++ b/Quotient/connection.cpp @@ -17,7 +17,6 @@ #include "user.h" #include "csapi/account-data.h" -#include "csapi/capabilities.h" #include "csapi/joining.h" #include "csapi/leaving.h" #include "csapi/logout.h" @@ -194,37 +193,49 @@ void Connection::assumeIdentity(const QString& mxId, const QString& accessToken) }); } -void Connection::reloadCapabilities() +JobHandle Connection::loadVersions() { - d->capabilitiesJob = callApi(BackgroundRequest); - connect(d->capabilitiesJob, &BaseJob::success, this, [this] { - d->capabilities = d->capabilitiesJob->capabilities(); - - if (d->capabilities.roomVersions) { - qCDebug(MAIN) << "Room versions:" << defaultRoomVersion() - << "is default, full list:" << availableRoomVersions(); - emit capabilitiesLoaded(); - for (auto* r: std::as_const(d->roomMap)) - r->checkVersion(); - } else - qCWarning(MAIN) - << "The server returned an empty set of supported versions;" - " disabling version upgrade recommendations to reduce noise"; - }); - connect(d->capabilitiesJob, &BaseJob::failure, this, [this] { - if (d->capabilitiesJob->error() == BaseJob::IncorrectRequest) - qCDebug(MAIN) << "Server doesn't support /capabilities;" - " version upgrade recommendations won't be issued"; + return callApi(BackgroundRequest).then([this](GetVersionsJob::Response r) { + d->data->setSupportedSpecVersions(std::move(r.versions)); }); } -bool Connection::loadingCapabilities() const +JobHandle Connection::loadCapabilities() +{ + return callApi(BackgroundRequest) + .then( + [this](GetCapabilitiesJob::Capabilities response) { + d->capabilities = std::move(response); + if (d->capabilities.roomVersions) { + qCInfo(MAIN) << "Room versions:" << defaultRoomVersion() + << "is default, full list:" << availableRoomVersions(); + emit capabilitiesLoaded(); + for (auto* r : std::as_const(d->roomMap)) + r->checkVersion(); + } else + qCWarning(MAIN) << "The server hasn't reported room versions it supports;" + " version upgrade recommendations won't be issued"; + }, + [](const GetCapabilitiesJob* job) { + if (job->error() == BaseJob::IncorrectRequest) + qCDebug(MAIN) << "The server doesn't support /capabilities;" + " version upgrade recommendations won't be issued"; + }); +} + +void Connection::reloadCapabilities() { loadCapabilities(); } + +bool Connection::loadingCapabilities() const { return !capabilitiesReady(); } + +bool Connection::capabilitiesReady() const { // (Ab)use the fact that room versions cannot be omitted after // the capabilities have been loaded (see reloadCapabilities() above). - return !d->capabilities.roomVersions; + return d->capabilities.roomVersions.has_value(); } +QStringList Connection::supportedMatrixSpecVersions() const { return d->apiVersions.versions; } + void Connection::Private::saveAccessTokenToKeychain() const { qCDebug(MAIN) << "Saving access token to keychain for" << q->userId(); @@ -296,14 +307,18 @@ void Connection::Private::loginToServer(LoginArgTs&&... loginArgs) void Connection::Private::completeSetup(const QString& mxId, bool mock) { data->setUserId(mxId); - if (!mock) - q->user()->load(); // Load the local user's profile q->setObjectName(data->userId() % u'/' % data->deviceId()); qCDebug(MAIN) << "Using server" << data->baseUrl().toDisplayString() << "by user" << data->userId() << "from device" << data->deviceId(); connect(qApp, &QCoreApplication::aboutToQuit, q, &Connection::saveState); + if (!mock) { + q->loadVersions(); + q->loadCapabilities(); + q->user()->load(); // Load the local user's profile + } + if (useEncryption) { if (auto&& maybeEncryptionData = _impl::ConnectionEncryptionData::setup(q, mock)) { @@ -318,8 +333,6 @@ void Connection::Private::completeSetup(const QString& mxId, bool mock) emit q->stateChanged(); emit q->connected(); - if (!mock) - q->reloadCapabilities(); } QFuture Connection::Private::ensureHomeserver(const QString& userId, @@ -741,15 +754,15 @@ JobHandle Connection::uploadFile(const QString& fileName, overrideContentType); } -GetContentJob* Connection::getContent(const QString& mediaId) +BaseJob* Connection::getContent(const QString& mediaId) { auto idParts = splitMediaId(mediaId); - return callApi(idParts.front(), idParts.back()); + return callApi(idParts.front(), idParts.back()); } -GetContentJob* Connection::getContent(const QUrl& url) +BaseJob* Connection::getContent(const QUrl& url) { - return getContent(url.authority() + url.path()); + QT_IGNORE_DEPRECATIONS(return getContent(url.authority() + url.path());) } DownloadFileJob* Connection::downloadFile(const QUrl& url, const QString& localFilename) @@ -1294,6 +1307,8 @@ const ConnectionData* Connection::connectionData() const return d->data.get(); } +HomeserverData Connection::homeserverData() const { return d->data->homeserverData(); } + Room* Connection::provideRoom(const QString& id, std::optional joinState) { // TODO: This whole function is a strong case for a RoomManager class. diff --git a/Quotient/connection.h b/Quotient/connection.h index f38c165f7..f8d3955e9 100644 --- a/Quotient/connection.h +++ b/Quotient/connection.h @@ -12,18 +12,17 @@ #include "csapi/create_room.h" #include "csapi/login.h" +#include "csapi/content-repo.h" #include "e2ee/qolmoutboundsession.h" #include "events/accountdataevents.h" - #include "jobs/jobhandle.h" #include #include #include #include -#include #include @@ -39,6 +38,8 @@ class User; class ConnectionData; class RoomEvent; +class GetVersionsJob; +class GetCapabilitiesJob; class SyncJob; class SyncData; class RoomMessagesJob; @@ -46,8 +47,6 @@ class PostReceiptJob; class ForgetRoomJob; class MediaThumbnailJob; class JoinRoomJob; -class UploadContentJob; -class GetContentJob; class DownloadFileJob; class SendToDeviceJob; class SendMessageJob; @@ -395,9 +394,15 @@ class QUOTIENT_API Connection : public QObject { } }; - //! Find out if capabilites are still loading from the server + //! Find out if homeserver capabilites have been loaded + Q_INVOKABLE bool capabilitiesReady() const; + + [[deprecated("Use capabilitiesReady() instead; don't forget to negate the returned value")]] Q_INVOKABLE bool loadingCapabilities() const; + //! Get the list of Matrix CS API spec versions supported by the homeserver + QStringList supportedMatrixSpecVersions() const; + //! \brief Get the room version recommended by the server //! //! Only works after server capabilities have been loaded. @@ -523,8 +528,7 @@ class QUOTIENT_API Connection : public QObject { template QUrl getUrlForApi(JobArgTs&&... jobArgs) const { - return JobT::makeRequestUrl(homeserver(), - std::forward(jobArgs)...); + return JobT::makeRequestUrl(homeserverData(), std::forward(jobArgs)...); } //! \brief Start a local HTTP server and generate a single sign-on URL @@ -652,8 +656,15 @@ public Q_SLOTS: //! \since 0.7.2 void assumeIdentity(const QString& mxId, const QString& accessToken); - //! Explicitly request capabilities from the server - void reloadCapabilities(); + //! \brief Request supported spec versions from the homeserver + //! + //! This call does not obtain room versions - use loadCapabilities() for that. + JobHandle loadVersions(); + + //! Request capabilities and room versions from the server + JobHandle loadCapabilities(); + + [[deprecated("Use loadCapabilities() instead")]] void reloadCapabilities(); QFuture logout(); @@ -676,8 +687,9 @@ public Q_SLOTS: const QString& overrideContentType = {}); JobHandle uploadFile(const QString& fileName, const QString& overrideContentType = {}); - GetContentJob* getContent(const QString& mediaId); - GetContentJob* getContent(const QUrl& url); + [[deprecated("Use downloadFile() instead")]] BaseJob* getContent(const QString& mediaId); + [[deprecated("Use downloadFile() instead")]] BaseJob* getContent(const QUrl& url); + // If localFilename is empty, a temporary file will be created DownloadFileJob* downloadFile(const QUrl& url, const QString& localFilename = {}); @@ -910,6 +922,9 @@ public Q_SLOTS: //! Access the underlying ConnectionData class const ConnectionData* connectionData() const; + //! Get the homeserver data necessary to construct network requests + HomeserverData homeserverData() const; + //! \brief Get a Room object for the given id in the given state //! //! Use this method when you need a Room object in the local list diff --git a/Quotient/connection_p.h b/Quotient/connection_p.h index 7b6809bc0..2c58b4b90 100644 --- a/Quotient/connection_p.h +++ b/Quotient/connection_p.h @@ -11,12 +11,12 @@ #include "settings.h" #include "syncdata.h" +#include "csapi/account-data.h" #include "csapi/capabilities.h" #include "csapi/logout.h" +#include "csapi/versions.h" #include "csapi/wellknown.h" -#include "csapi/account-data.h" - #include namespace Quotient { @@ -51,8 +51,8 @@ class Q_DECL_HIDDEN Quotient::Connection::Private { QMetaObject::Connection syncLoopConnection {}; int syncTimeout = -1; - GetCapabilitiesJob* capabilitiesJob = nullptr; - GetCapabilitiesJob::Capabilities capabilities; + GetVersionsJob::Response apiVersions{}; + GetCapabilitiesJob::Capabilities capabilities{}; QVector loginFlows; diff --git a/Quotient/connectiondata.cpp b/Quotient/connectiondata.cpp index 1dbe8ff55..e47b36570 100644 --- a/Quotient/connectiondata.cpp +++ b/Quotient/connectiondata.cpp @@ -29,6 +29,7 @@ class ConnectionData::Private { QString lastEvent; QString userId; QString deviceId; + QStringList supportedSpecVersions; std::vector needToken; mutable unsigned int txnCounter = 0; @@ -102,6 +103,11 @@ QByteArray ConnectionData::accessToken() const { return d->accessToken; } QUrl ConnectionData::baseUrl() const { return d->baseUrl; } +HomeserverData ConnectionData::homeserverData() const +{ + return { d->baseUrl, d->supportedSpecVersions }; +} + NetworkAccessManager* ConnectionData::nam() const { return NetworkAccessManager::instance(); @@ -111,8 +117,12 @@ void ConnectionData::setBaseUrl(QUrl baseUrl) { d->baseUrl = std::move(baseUrl); qCDebug(MAIN) << "updated baseUrl to" << d->baseUrl; - if (!d->userId.isEmpty() && d->baseUrl.isValid()) - NetworkAccessManager::addBaseUrl(d->userId, d->baseUrl); + if (!d->userId.isEmpty()) { + if (d->baseUrl.isValid()) + NetworkAccessManager::addAccount(d->userId, d->baseUrl); + else + NetworkAccessManager::dropAccount(d->userId); + } } void ConnectionData::setToken(QByteArray token) @@ -139,9 +149,9 @@ void ConnectionData::setUserId(const QString& userId) { if (d->baseUrl.isValid()) { if (d->userId != userId) - NetworkAccessManager::dropBaseUrl(d->userId); + NetworkAccessManager::dropAccount(d->userId); if (!userId.isEmpty()) - NetworkAccessManager::addBaseUrl(userId, d->baseUrl); + NetworkAccessManager::addAccount(userId, d->baseUrl); } d->userId = userId; } @@ -151,6 +161,14 @@ void ConnectionData::setNeedsToken(const QString& requestName) d->needToken.push_back(requestName); } +void ConnectionData::setSupportedSpecVersions(QStringList versions) +{ + qCInfo(MAIN).noquote() << "CS API versions:" << versions.join(u' '); + d->supportedSpecVersions = std::move(versions); + if (!ALARM(d->userId.isEmpty()) && !ALARM(!d->baseUrl.isValid())) + NetworkAccessManager::updateAccountSpecVersions(d->userId, d->supportedSpecVersions); +} + QString ConnectionData::lastEvent() const { return d->lastEvent; } void ConnectionData::setLastEvent(QString identifier) diff --git a/Quotient/connectiondata.h b/Quotient/connectiondata.h index 60ca1a702..645bbde10 100644 --- a/Quotient/connectiondata.h +++ b/Quotient/connectiondata.h @@ -29,6 +29,7 @@ class QUOTIENT_API ConnectionData { const QString& deviceId() const; const QString& userId() const; bool needsToken(const QString& requestName) const; + HomeserverData homeserverData() const; Quotient::NetworkAccessManager *nam() const; void setBaseUrl(QUrl baseUrl); @@ -36,6 +37,7 @@ class QUOTIENT_API ConnectionData { void setDeviceId(const QString& deviceId); void setUserId(const QString& userId); void setNeedsToken(const QString& requestName); + void setSupportedSpecVersions(QStringList versions); QString lastEvent() const; void setLastEvent(QString identifier); diff --git a/Quotient/csapi/account-data.cpp b/Quotient/csapi/account-data.cpp index 9c033aabe..210b9c6c3 100644 --- a/Quotient/csapi/account-data.cpp +++ b/Quotient/csapi/account-data.cpp @@ -12,10 +12,11 @@ SetAccountDataJob::SetAccountDataJob(const QString& userId, const QString& type, setRequestData({ toJson(content) }); } -QUrl GetAccountDataJob::makeRequestUrl(QUrl baseUrl, const QString& userId, const QString& type) +QUrl GetAccountDataJob::makeRequestUrl(const HomeserverData& hsData, const QString& userId, + const QString& type) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix/client/v3", "/user/", - userId, "/account_data/", type)); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/user/", userId, + "/account_data/", type)); } GetAccountDataJob::GetAccountDataJob(const QString& userId, const QString& type) @@ -32,12 +33,11 @@ SetAccountDataPerRoomJob::SetAccountDataPerRoomJob(const QString& userId, const setRequestData({ toJson(content) }); } -QUrl GetAccountDataPerRoomJob::makeRequestUrl(QUrl baseUrl, const QString& userId, +QUrl GetAccountDataPerRoomJob::makeRequestUrl(const HomeserverData& hsData, const QString& userId, const QString& roomId, const QString& type) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/user/", userId, "/rooms/", - roomId, "/account_data/", type)); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/user/", userId, + "/rooms/", roomId, "/account_data/", type)); } GetAccountDataPerRoomJob::GetAccountDataPerRoomJob(const QString& userId, const QString& roomId, diff --git a/Quotient/csapi/account-data.h b/Quotient/csapi/account-data.h index 58b6c7d59..7dc5bc2ef 100644 --- a/Quotient/csapi/account-data.h +++ b/Quotient/csapi/account-data.h @@ -47,7 +47,8 @@ class QUOTIENT_API GetAccountDataJob : public BaseJob { //! //! This function can be used when a URL for GetAccountDataJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& userId, const QString& type); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& userId, + const QString& type); // Result properties @@ -104,8 +105,8 @@ class QUOTIENT_API GetAccountDataPerRoomJob : public BaseJob { //! //! This function can be used when a URL for GetAccountDataPerRoomJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& userId, const QString& roomId, - const QString& type); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& userId, + const QString& roomId, const QString& type); // Result properties diff --git a/Quotient/csapi/admin.cpp b/Quotient/csapi/admin.cpp index 1d47fb542..b0023f97a 100644 --- a/Quotient/csapi/admin.cpp +++ b/Quotient/csapi/admin.cpp @@ -4,10 +4,9 @@ using namespace Quotient; -QUrl GetWhoIsJob::makeRequestUrl(QUrl baseUrl, const QString& userId) +QUrl GetWhoIsJob::makeRequestUrl(const HomeserverData& hsData, const QString& userId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/admin/whois/", userId)); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/admin/whois/", userId)); } GetWhoIsJob::GetWhoIsJob(const QString& userId) diff --git a/Quotient/csapi/admin.h b/Quotient/csapi/admin.h index b2718fa53..330e731dd 100644 --- a/Quotient/csapi/admin.h +++ b/Quotient/csapi/admin.h @@ -48,7 +48,7 @@ class QUOTIENT_API GetWhoIsJob : public BaseJob { //! //! This function can be used when a URL for GetWhoIsJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& userId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& userId); // Result properties diff --git a/Quotient/csapi/administrative_contact.cpp b/Quotient/csapi/administrative_contact.cpp index dffb2f3af..37eb0e8b2 100644 --- a/Quotient/csapi/administrative_contact.cpp +++ b/Quotient/csapi/administrative_contact.cpp @@ -4,10 +4,9 @@ using namespace Quotient; -QUrl GetAccount3PIDsJob::makeRequestUrl(QUrl baseUrl) +QUrl GetAccount3PIDsJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/account/3pid")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/account/3pid")); } GetAccount3PIDsJob::GetAccount3PIDsJob() diff --git a/Quotient/csapi/administrative_contact.h b/Quotient/csapi/administrative_contact.h index ec544d734..8b331ee89 100644 --- a/Quotient/csapi/administrative_contact.h +++ b/Quotient/csapi/administrative_contact.h @@ -49,7 +49,7 @@ class QUOTIENT_API GetAccount3PIDsJob : public BaseJob { //! //! This function can be used when a URL for GetAccount3PIDsJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); // Result properties diff --git a/Quotient/csapi/authed-content-repo.cpp b/Quotient/csapi/authed-content-repo.cpp index f10d435c3..3bd6cc705 100644 --- a/Quotient/csapi/authed-content-repo.cpp +++ b/Quotient/csapi/authed-content-repo.cpp @@ -11,10 +11,10 @@ auto queryToGetContentAuthed(qint64 timeoutMs) return _q; } -QUrl GetContentAuthedJob::makeRequestUrl(QUrl baseUrl, const QString& serverName, +QUrl GetContentAuthedJob::makeRequestUrl(const HomeserverData& hsData, const QString& serverName, const QString& mediaId, qint64 timeoutMs) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v1", "/media/download/", serverName, "/", mediaId), queryToGetContentAuthed(timeoutMs)); @@ -36,11 +36,12 @@ auto queryToGetContentOverrideNameAuthed(qint64 timeoutMs) return _q; } -QUrl GetContentOverrideNameAuthedJob::makeRequestUrl(QUrl baseUrl, const QString& serverName, +QUrl GetContentOverrideNameAuthedJob::makeRequestUrl(const HomeserverData& hsData, + const QString& serverName, const QString& mediaId, const QString& fileName, qint64 timeoutMs) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v1", "/media/download/", serverName, "/", mediaId, "/", fileName), queryToGetContentOverrideNameAuthed(timeoutMs)); @@ -70,14 +71,13 @@ auto queryToGetContentThumbnailAuthed(int width, int height, const QString& meth return _q; } -QUrl GetContentThumbnailAuthedJob::makeRequestUrl(QUrl baseUrl, const QString& serverName, - const QString& mediaId, int width, int height, - const QString& method, qint64 timeoutMs, - std::optional animated) +QUrl GetContentThumbnailAuthedJob::makeRequestUrl(const HomeserverData& hsData, + const QString& serverName, const QString& mediaId, + int width, int height, const QString& method, + qint64 timeoutMs, std::optional animated) { return BaseJob::makeRequestUrl( - std::move(baseUrl), - makePath("/_matrix/client/v1", "/media/thumbnail/", serverName, "/", mediaId), + hsData, makePath("/_matrix/client/v1", "/media/thumbnail/", serverName, "/", mediaId), queryToGetContentThumbnailAuthed(width, height, method, timeoutMs, animated)); } @@ -101,10 +101,10 @@ auto queryToGetUrlPreviewAuthed(const QUrl& url, std::optional ts) return _q; } -QUrl GetUrlPreviewAuthedJob::makeRequestUrl(QUrl baseUrl, const QUrl& url, std::optional ts) +QUrl GetUrlPreviewAuthedJob::makeRequestUrl(const HomeserverData& hsData, const QUrl& url, + std::optional ts) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v1", "/media/preview_url"), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v1", "/media/preview_url"), queryToGetUrlPreviewAuthed(url, ts)); } @@ -114,10 +114,9 @@ GetUrlPreviewAuthedJob::GetUrlPreviewAuthedJob(const QUrl& url, std::optional animated = std::nullopt); // Result properties @@ -218,7 +219,7 @@ class QUOTIENT_API GetUrlPreviewAuthedJob : public BaseJob { //! //! This function can be used when a URL for GetUrlPreviewAuthedJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QUrl& url, + static QUrl makeRequestUrl(const HomeserverData& hsData, const QUrl& url, std::optional ts = std::nullopt); // Result properties @@ -269,7 +270,7 @@ class QUOTIENT_API GetConfigAuthedJob : public BaseJob { //! //! This function can be used when a URL for GetConfigAuthedJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); // Result properties diff --git a/Quotient/csapi/capabilities.cpp b/Quotient/csapi/capabilities.cpp index bfd3fbf6b..6676baa2a 100644 --- a/Quotient/csapi/capabilities.cpp +++ b/Quotient/csapi/capabilities.cpp @@ -4,10 +4,9 @@ using namespace Quotient; -QUrl GetCapabilitiesJob::makeRequestUrl(QUrl baseUrl) +QUrl GetCapabilitiesJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/capabilities")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/capabilities")); } GetCapabilitiesJob::GetCapabilitiesJob() diff --git a/Quotient/csapi/capabilities.h b/Quotient/csapi/capabilities.h index 5bf0fb87c..fd35a82ac 100644 --- a/Quotient/csapi/capabilities.h +++ b/Quotient/csapi/capabilities.h @@ -49,7 +49,7 @@ class QUOTIENT_API GetCapabilitiesJob : public BaseJob { //! //! This function can be used when a URL for GetCapabilitiesJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); // Result properties diff --git a/Quotient/csapi/content-repo.cpp b/Quotient/csapi/content-repo.cpp index 23484d7e2..cc0a3d130 100644 --- a/Quotient/csapi/content-repo.cpp +++ b/Quotient/csapi/content-repo.cpp @@ -39,9 +39,9 @@ UploadContentToMXCJob::UploadContentToMXCJob(const QString& serverName, const QS setRequestData({ content }); } -QUrl CreateContentJob::makeRequestUrl(QUrl baseUrl) +QUrl CreateContentJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix", "/media/v1/create")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix", "/media/v1/create")); } CreateContentJob::CreateContentJob() @@ -60,10 +60,11 @@ auto queryToGetContent(bool allowRemote, qint64 timeoutMs, bool allowRedirect) return _q; } -QUrl GetContentJob::makeRequestUrl(QUrl baseUrl, const QString& serverName, const QString& mediaId, - bool allowRemote, qint64 timeoutMs, bool allowRedirect) +QUrl GetContentJob::makeRequestUrl(const HomeserverData& hsData, const QString& serverName, + const QString& mediaId, bool allowRemote, qint64 timeoutMs, + bool allowRedirect) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix", "/media/v3/download/", serverName, "/", mediaId), queryToGetContent(allowRemote, timeoutMs, allowRedirect)); @@ -87,14 +88,13 @@ auto queryToGetContentOverrideName(bool allowRemote, qint64 timeoutMs, bool allo return _q; } -QUrl GetContentOverrideNameJob::makeRequestUrl(QUrl baseUrl, const QString& serverName, - const QString& mediaId, const QString& fileName, - bool allowRemote, qint64 timeoutMs, - bool allowRedirect) +QUrl GetContentOverrideNameJob::makeRequestUrl(const HomeserverData& hsData, + const QString& serverName, const QString& mediaId, + const QString& fileName, bool allowRemote, + qint64 timeoutMs, bool allowRedirect) { return BaseJob::makeRequestUrl( - std::move(baseUrl), - makePath("/_matrix", "/media/v3/download/", serverName, "/", mediaId, "/", fileName), + hsData, makePath("/_matrix", "/media/v3/download/", serverName, "/", mediaId, "/", fileName), queryToGetContentOverrideName(allowRemote, timeoutMs, allowRedirect)); } @@ -123,13 +123,13 @@ auto queryToGetContentThumbnail(int width, int height, const QString& method, bo return _q; } -QUrl GetContentThumbnailJob::makeRequestUrl(QUrl baseUrl, const QString& serverName, +QUrl GetContentThumbnailJob::makeRequestUrl(const HomeserverData& hsData, const QString& serverName, const QString& mediaId, int width, int height, const QString& method, bool allowRemote, qint64 timeoutMs, bool allowRedirect, std::optional animated) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix", "/media/v3/thumbnail/", serverName, "/", mediaId), queryToGetContentThumbnail(width, height, method, allowRemote, @@ -157,9 +157,10 @@ auto queryToGetUrlPreview(const QUrl& url, std::optional ts) return _q; } -QUrl GetUrlPreviewJob::makeRequestUrl(QUrl baseUrl, const QUrl& url, std::optional ts) +QUrl GetUrlPreviewJob::makeRequestUrl(const HomeserverData& hsData, const QUrl& url, + std::optional ts) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix", "/media/v3/preview_url"), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix", "/media/v3/preview_url"), queryToGetUrlPreview(url, ts)); } @@ -168,9 +169,9 @@ GetUrlPreviewJob::GetUrlPreviewJob(const QUrl& url, std::optional ts) makePath("/_matrix", "/media/v3/preview_url"), queryToGetUrlPreview(url, ts)) {} -QUrl GetConfigJob::makeRequestUrl(QUrl baseUrl) +QUrl GetConfigJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix", "/media/v3/config")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix", "/media/v3/config")); } GetConfigJob::GetConfigJob() diff --git a/Quotient/csapi/content-repo.h b/Quotient/csapi/content-repo.h index 1769999df..26412e28e 100644 --- a/Quotient/csapi/content-repo.h +++ b/Quotient/csapi/content-repo.h @@ -82,7 +82,7 @@ class QUOTIENT_API CreateContentJob : public BaseJob { //! //! This function can be used when a URL for CreateContentJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); // Result properties @@ -159,9 +159,9 @@ class [[deprecated("Check the documentation for details")]] QUOTIENT_API GetCont //! //! This function can be used when a URL for GetContentJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& serverName, const QString& mediaId, - bool allowRemote = true, qint64 timeoutMs = 20000, - bool allowRedirect = false); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& serverName, + const QString& mediaId, bool allowRemote = true, + qint64 timeoutMs = 20000, bool allowRedirect = false); // Result properties @@ -232,9 +232,10 @@ class [[deprecated("Check the documentation for details")]] QUOTIENT_API GetCont //! //! This function can be used when a URL for GetContentOverrideNameJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& serverName, const QString& mediaId, - const QString& fileName, bool allowRemote = true, - qint64 timeoutMs = 20000, bool allowRedirect = false); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& serverName, + const QString& mediaId, const QString& fileName, + bool allowRemote = true, qint64 timeoutMs = 20000, + bool allowRedirect = false); // Result properties @@ -331,10 +332,10 @@ class [[deprecated("Check the documentation for details")]] QUOTIENT_API GetCont //! //! This function can be used when a URL for GetContentThumbnailJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& serverName, const QString& mediaId, - int width, int height, const QString& method = {}, - bool allowRemote = true, qint64 timeoutMs = 20000, - bool allowRedirect = false, + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& serverName, + const QString& mediaId, int width, int height, + const QString& method = {}, bool allowRemote = true, + qint64 timeoutMs = 20000, bool allowRedirect = false, std::optional animated = std::nullopt); // Result properties @@ -376,7 +377,7 @@ class [[deprecated("Check the documentation for details")]] QUOTIENT_API GetUrlP //! //! This function can be used when a URL for GetUrlPreviewJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QUrl& url, + static QUrl makeRequestUrl(const HomeserverData& hsData, const QUrl& url, std::optional ts = std::nullopt); // Result properties @@ -433,7 +434,7 @@ class [[deprecated("Check the documentation for details")]] QUOTIENT_API GetConf //! //! This function can be used when a URL for GetConfigJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); // Result properties diff --git a/Quotient/csapi/device_management.cpp b/Quotient/csapi/device_management.cpp index ed9bde901..39aa4e90d 100644 --- a/Quotient/csapi/device_management.cpp +++ b/Quotient/csapi/device_management.cpp @@ -4,9 +4,9 @@ using namespace Quotient; -QUrl GetDevicesJob::makeRequestUrl(QUrl baseUrl) +QUrl GetDevicesJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix/client/v3", "/devices")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/devices")); } GetDevicesJob::GetDevicesJob() @@ -14,10 +14,9 @@ GetDevicesJob::GetDevicesJob() makePath("/_matrix/client/v3", "/devices")) {} -QUrl GetDeviceJob::makeRequestUrl(QUrl baseUrl, const QString& deviceId) +QUrl GetDeviceJob::makeRequestUrl(const HomeserverData& hsData, const QString& deviceId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/devices/", deviceId)); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/devices/", deviceId)); } GetDeviceJob::GetDeviceJob(const QString& deviceId) diff --git a/Quotient/csapi/device_management.h b/Quotient/csapi/device_management.h index 25215ff8f..ae8f23380 100644 --- a/Quotient/csapi/device_management.h +++ b/Quotient/csapi/device_management.h @@ -20,7 +20,7 @@ class QUOTIENT_API GetDevicesJob : public BaseJob { //! //! This function can be used when a URL for GetDevicesJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); // Result properties @@ -43,7 +43,7 @@ class QUOTIENT_API GetDeviceJob : public BaseJob { //! //! This function can be used when a URL for GetDeviceJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& deviceId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& deviceId); // Result properties diff --git a/Quotient/csapi/directory.cpp b/Quotient/csapi/directory.cpp index b90373107..fb61836b7 100644 --- a/Quotient/csapi/directory.cpp +++ b/Quotient/csapi/directory.cpp @@ -13,9 +13,9 @@ SetRoomAliasJob::SetRoomAliasJob(const QString& roomAlias, const QString& roomId setRequestData({ _dataJson }); } -QUrl GetRoomIdByAliasJob::makeRequestUrl(QUrl baseUrl, const QString& roomAlias) +QUrl GetRoomIdByAliasJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomAlias) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/directory/room/", roomAlias)); } @@ -24,9 +24,9 @@ GetRoomIdByAliasJob::GetRoomIdByAliasJob(const QString& roomAlias) makePath("/_matrix/client/v3", "/directory/room/", roomAlias), false) {} -QUrl DeleteRoomAliasJob::makeRequestUrl(QUrl baseUrl, const QString& roomAlias) +QUrl DeleteRoomAliasJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomAlias) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/directory/room/", roomAlias)); } @@ -35,9 +35,9 @@ DeleteRoomAliasJob::DeleteRoomAliasJob(const QString& roomAlias) makePath("/_matrix/client/v3", "/directory/room/", roomAlias)) {} -QUrl GetLocalAliasesJob::makeRequestUrl(QUrl baseUrl, const QString& roomId) +QUrl GetLocalAliasesJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/rooms/", roomId, "/aliases")); } diff --git a/Quotient/csapi/directory.h b/Quotient/csapi/directory.h index 72fce2e7c..84f0aab98 100644 --- a/Quotient/csapi/directory.h +++ b/Quotient/csapi/directory.h @@ -36,7 +36,7 @@ class QUOTIENT_API GetRoomIdByAliasJob : public BaseJob { //! //! This function can be used when a URL for GetRoomIdByAliasJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomAlias); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomAlias); // Result properties @@ -83,7 +83,7 @@ class QUOTIENT_API DeleteRoomAliasJob : public BaseJob { //! //! This function can be used when a URL for DeleteRoomAliasJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomAlias); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomAlias); }; //! \brief Get a list of local aliases on a given room. @@ -114,7 +114,7 @@ class QUOTIENT_API GetLocalAliasesJob : public BaseJob { //! //! This function can be used when a URL for GetLocalAliasesJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId); // Result properties diff --git a/Quotient/csapi/event_context.cpp b/Quotient/csapi/event_context.cpp index 47b53132b..031af3e89 100644 --- a/Quotient/csapi/event_context.cpp +++ b/Quotient/csapi/event_context.cpp @@ -12,10 +12,11 @@ auto queryToGetEventContext(std::optional limit, const QString& filter) return _q; } -QUrl GetEventContextJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& eventId, - std::optional limit, const QString& filter) +QUrl GetEventContextJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& eventId, std::optional limit, + const QString& filter) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/rooms/", roomId, "/context/", eventId), queryToGetEventContext(limit, filter)); diff --git a/Quotient/csapi/event_context.h b/Quotient/csapi/event_context.h index 41dd87c9d..ab2e2791c 100644 --- a/Quotient/csapi/event_context.h +++ b/Quotient/csapi/event_context.h @@ -45,8 +45,9 @@ class QUOTIENT_API GetEventContextJob : public BaseJob { //! //! This function can be used when a URL for GetEventContextJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& eventId, - std::optional limit = std::nullopt, const QString& filter = {}); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& eventId, std::optional limit = std::nullopt, + const QString& filter = {}); // Result properties diff --git a/Quotient/csapi/filter.cpp b/Quotient/csapi/filter.cpp index de5390937..35277a99e 100644 --- a/Quotient/csapi/filter.cpp +++ b/Quotient/csapi/filter.cpp @@ -12,10 +12,11 @@ DefineFilterJob::DefineFilterJob(const QString& userId, const Filter& filter) addExpectedKey("filter_id"); } -QUrl GetFilterJob::makeRequestUrl(QUrl baseUrl, const QString& userId, const QString& filterId) +QUrl GetFilterJob::makeRequestUrl(const HomeserverData& hsData, const QString& userId, + const QString& filterId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix/client/v3", "/user/", - userId, "/filter/", filterId)); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/user/", userId, + "/filter/", filterId)); } GetFilterJob::GetFilterJob(const QString& userId, const QString& filterId) diff --git a/Quotient/csapi/filter.h b/Quotient/csapi/filter.h index f4c9f4187..3c1afe303 100644 --- a/Quotient/csapi/filter.h +++ b/Quotient/csapi/filter.h @@ -48,7 +48,8 @@ class QUOTIENT_API GetFilterJob : public BaseJob { //! //! This function can be used when a URL for GetFilterJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& userId, const QString& filterId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& userId, + const QString& filterId); // Result properties diff --git a/Quotient/csapi/key_backup.cpp b/Quotient/csapi/key_backup.cpp index 0b3aae863..28d287f23 100644 --- a/Quotient/csapi/key_backup.cpp +++ b/Quotient/csapi/key_backup.cpp @@ -15,10 +15,9 @@ PostRoomKeysVersionJob::PostRoomKeysVersionJob(const QString& algorithm, const Q addExpectedKey("version"); } -QUrl GetRoomKeysVersionCurrentJob::makeRequestUrl(QUrl baseUrl) +QUrl GetRoomKeysVersionCurrentJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/room_keys/version")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/room_keys/version")); } GetRoomKeysVersionCurrentJob::GetRoomKeysVersionCurrentJob() @@ -32,9 +31,9 @@ GetRoomKeysVersionCurrentJob::GetRoomKeysVersionCurrentJob() addExpectedKey("version"); } -QUrl GetRoomKeysVersionJob::makeRequestUrl(QUrl baseUrl, const QString& version) +QUrl GetRoomKeysVersionJob::makeRequestUrl(const HomeserverData& hsData, const QString& version) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/room_keys/version/", version)); } @@ -60,9 +59,9 @@ PutRoomKeysVersionJob::PutRoomKeysVersionJob(const QString& version, const QStri setRequestData({ _dataJson }); } -QUrl DeleteRoomKeysVersionJob::makeRequestUrl(QUrl baseUrl, const QString& version) +QUrl DeleteRoomKeysVersionJob::makeRequestUrl(const HomeserverData& hsData, const QString& version) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/room_keys/version/", version)); } @@ -96,10 +95,10 @@ auto queryToGetRoomKeyBySessionId(const QString& version) return _q; } -QUrl GetRoomKeyBySessionIdJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, +QUrl GetRoomKeyBySessionIdJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomId, const QString& sessionId, const QString& version) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/room_keys/keys/", roomId, "/", sessionId), queryToGetRoomKeyBySessionId(version)); @@ -119,10 +118,10 @@ auto queryToDeleteRoomKeyBySessionId(const QString& version) return _q; } -QUrl DeleteRoomKeyBySessionIdJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, +QUrl DeleteRoomKeyBySessionIdJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomId, const QString& sessionId, const QString& version) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/room_keys/keys/", roomId, "/", sessionId), queryToDeleteRoomKeyBySessionId(version)); @@ -164,10 +163,10 @@ auto queryToGetRoomKeysByRoomId(const QString& version) return _q; } -QUrl GetRoomKeysByRoomIdJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, +QUrl GetRoomKeysByRoomIdJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomId, const QString& version) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/room_keys/keys/", roomId), queryToGetRoomKeysByRoomId(version)); } @@ -185,10 +184,10 @@ auto queryToDeleteRoomKeysByRoomId(const QString& version) return _q; } -QUrl DeleteRoomKeysByRoomIdJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, +QUrl DeleteRoomKeysByRoomIdJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomId, const QString& version) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/room_keys/keys/", roomId), queryToDeleteRoomKeysByRoomId(version)); } @@ -227,10 +226,9 @@ auto queryToGetRoomKeys(const QString& version) return _q; } -QUrl GetRoomKeysJob::makeRequestUrl(QUrl baseUrl, const QString& version) +QUrl GetRoomKeysJob::makeRequestUrl(const HomeserverData& hsData, const QString& version) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/room_keys/keys"), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/room_keys/keys"), queryToGetRoomKeys(version)); } @@ -248,10 +246,9 @@ auto queryToDeleteRoomKeys(const QString& version) return _q; } -QUrl DeleteRoomKeysJob::makeRequestUrl(QUrl baseUrl, const QString& version) +QUrl DeleteRoomKeysJob::makeRequestUrl(const HomeserverData& hsData, const QString& version) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/room_keys/keys"), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/room_keys/keys"), queryToDeleteRoomKeys(version)); } diff --git a/Quotient/csapi/key_backup.h b/Quotient/csapi/key_backup.h index ba543d217..022b40787 100644 --- a/Quotient/csapi/key_backup.h +++ b/Quotient/csapi/key_backup.h @@ -42,7 +42,7 @@ class QUOTIENT_API GetRoomKeysVersionCurrentJob : public BaseJob { //! //! This function can be used when a URL for GetRoomKeysVersionCurrentJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); // Result properties @@ -112,7 +112,7 @@ class QUOTIENT_API GetRoomKeysVersionJob : public BaseJob { //! //! This function can be used when a URL for GetRoomKeysVersionJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& version); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& version); // Result properties @@ -208,7 +208,7 @@ class QUOTIENT_API DeleteRoomKeysVersionJob : public BaseJob { //! //! This function can be used when a URL for DeleteRoomKeysVersionJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& version); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& version); }; //! \brief Store a key in the backup. @@ -273,8 +273,8 @@ class QUOTIENT_API GetRoomKeyBySessionIdJob : public BaseJob { //! //! This function can be used when a URL for GetRoomKeyBySessionIdJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& sessionId, - const QString& version); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& sessionId, const QString& version); // Result properties @@ -304,8 +304,8 @@ class QUOTIENT_API DeleteRoomKeyBySessionIdJob : public BaseJob { //! //! This function can be used when a URL for DeleteRoomKeyBySessionIdJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& sessionId, - const QString& version); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& sessionId, const QString& version); // Result properties @@ -385,7 +385,8 @@ class QUOTIENT_API GetRoomKeysByRoomIdJob : public BaseJob { //! //! This function can be used when a URL for GetRoomKeysByRoomIdJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& version); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& version); // Result properties @@ -412,7 +413,8 @@ class QUOTIENT_API DeleteRoomKeysByRoomIdJob : public BaseJob { //! //! This function can be used when a URL for DeleteRoomKeysByRoomIdJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& version); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& version); // Result properties @@ -485,7 +487,7 @@ class QUOTIENT_API GetRoomKeysJob : public BaseJob { //! //! This function can be used when a URL for GetRoomKeysJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& version); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& version); // Result properties @@ -511,7 +513,7 @@ class QUOTIENT_API DeleteRoomKeysJob : public BaseJob { //! //! This function can be used when a URL for DeleteRoomKeysJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& version); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& version); // Result properties diff --git a/Quotient/csapi/keys.cpp b/Quotient/csapi/keys.cpp index 07b0f508e..1cf671dcc 100644 --- a/Quotient/csapi/keys.cpp +++ b/Quotient/csapi/keys.cpp @@ -47,10 +47,10 @@ auto queryToGetKeysChanges(const QString& from, const QString& to) return _q; } -QUrl GetKeysChangesJob::makeRequestUrl(QUrl baseUrl, const QString& from, const QString& to) +QUrl GetKeysChangesJob::makeRequestUrl(const HomeserverData& hsData, const QString& from, + const QString& to) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/keys/changes"), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/keys/changes"), queryToGetKeysChanges(from, to)); } diff --git a/Quotient/csapi/keys.h b/Quotient/csapi/keys.h index bcdb267ed..fde799a84 100644 --- a/Quotient/csapi/keys.h +++ b/Quotient/csapi/keys.h @@ -311,7 +311,7 @@ class QUOTIENT_API GetKeysChangesJob : public BaseJob { //! //! This function can be used when a URL for GetKeysChangesJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& from, const QString& to); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& from, const QString& to); // Result properties diff --git a/Quotient/csapi/leaving.cpp b/Quotient/csapi/leaving.cpp index d2b46b1b8..203ee4854 100644 --- a/Quotient/csapi/leaving.cpp +++ b/Quotient/csapi/leaving.cpp @@ -13,9 +13,9 @@ LeaveRoomJob::LeaveRoomJob(const QString& roomId, const QString& reason) setRequestData({ _dataJson }); } -QUrl ForgetRoomJob::makeRequestUrl(QUrl baseUrl, const QString& roomId) +QUrl ForgetRoomJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/rooms/", roomId, "/forget")); } diff --git a/Quotient/csapi/leaving.h b/Quotient/csapi/leaving.h index 0784a9dee..08bc06889 100644 --- a/Quotient/csapi/leaving.h +++ b/Quotient/csapi/leaving.h @@ -51,7 +51,7 @@ class QUOTIENT_API ForgetRoomJob : public BaseJob { //! //! This function can be used when a URL for ForgetRoomJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId); }; } // namespace Quotient diff --git a/Quotient/csapi/list_joined_rooms.cpp b/Quotient/csapi/list_joined_rooms.cpp index 6b9430ded..a9537ac0f 100644 --- a/Quotient/csapi/list_joined_rooms.cpp +++ b/Quotient/csapi/list_joined_rooms.cpp @@ -4,10 +4,9 @@ using namespace Quotient; -QUrl GetJoinedRoomsJob::makeRequestUrl(QUrl baseUrl) +QUrl GetJoinedRoomsJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/joined_rooms")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/joined_rooms")); } GetJoinedRoomsJob::GetJoinedRoomsJob() diff --git a/Quotient/csapi/list_joined_rooms.h b/Quotient/csapi/list_joined_rooms.h index 41eb54331..a8bd875ae 100644 --- a/Quotient/csapi/list_joined_rooms.h +++ b/Quotient/csapi/list_joined_rooms.h @@ -17,7 +17,7 @@ class QUOTIENT_API GetJoinedRoomsJob : public BaseJob { //! //! This function can be used when a URL for GetJoinedRoomsJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); // Result properties diff --git a/Quotient/csapi/list_public_rooms.cpp b/Quotient/csapi/list_public_rooms.cpp index 4f08af3a4..9c517f291 100644 --- a/Quotient/csapi/list_public_rooms.cpp +++ b/Quotient/csapi/list_public_rooms.cpp @@ -4,9 +4,10 @@ using namespace Quotient; -QUrl GetRoomVisibilityOnDirectoryJob::makeRequestUrl(QUrl baseUrl, const QString& roomId) +QUrl GetRoomVisibilityOnDirectoryJob::makeRequestUrl(const HomeserverData& hsData, + const QString& roomId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/directory/list/room/", roomId)); } @@ -34,11 +35,10 @@ auto queryToGetPublicRooms(std::optional limit, const QString& since, const return _q; } -QUrl GetPublicRoomsJob::makeRequestUrl(QUrl baseUrl, std::optional limit, const QString& since, - const QString& server) +QUrl GetPublicRoomsJob::makeRequestUrl(const HomeserverData& hsData, std::optional limit, + const QString& since, const QString& server) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/publicRooms"), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/publicRooms"), queryToGetPublicRooms(limit, since, server)); } diff --git a/Quotient/csapi/list_public_rooms.h b/Quotient/csapi/list_public_rooms.h index deec9bd9f..378e11297 100644 --- a/Quotient/csapi/list_public_rooms.h +++ b/Quotient/csapi/list_public_rooms.h @@ -21,7 +21,7 @@ class QUOTIENT_API GetRoomVisibilityOnDirectoryJob : public BaseJob { //! //! This function can be used when a URL for GetRoomVisibilityOnDirectoryJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId); // Result properties @@ -80,7 +80,7 @@ class QUOTIENT_API GetPublicRoomsJob : public BaseJob { //! //! This function can be used when a URL for GetPublicRoomsJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, std::optional limit = std::nullopt, + static QUrl makeRequestUrl(const HomeserverData& hsData, std::optional limit = std::nullopt, const QString& since = {}, const QString& server = {}); // Result properties diff --git a/Quotient/csapi/login.cpp b/Quotient/csapi/login.cpp index cd028adae..365819b91 100644 --- a/Quotient/csapi/login.cpp +++ b/Quotient/csapi/login.cpp @@ -4,9 +4,9 @@ using namespace Quotient; -QUrl GetLoginFlowsJob::makeRequestUrl(QUrl baseUrl) +QUrl GetLoginFlowsJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix/client/v3", "/login")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/login")); } GetLoginFlowsJob::GetLoginFlowsJob() diff --git a/Quotient/csapi/login.h b/Quotient/csapi/login.h index cc5940892..d7c9ed1b9 100644 --- a/Quotient/csapi/login.h +++ b/Quotient/csapi/login.h @@ -39,7 +39,7 @@ class QUOTIENT_API GetLoginFlowsJob : public BaseJob { //! //! This function can be used when a URL for GetLoginFlowsJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); // Result properties diff --git a/Quotient/csapi/logout.cpp b/Quotient/csapi/logout.cpp index a1fbf84e9..ed2d9b230 100644 --- a/Quotient/csapi/logout.cpp +++ b/Quotient/csapi/logout.cpp @@ -4,19 +4,18 @@ using namespace Quotient; -QUrl LogoutJob::makeRequestUrl(QUrl baseUrl) +QUrl LogoutJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix/client/v3", "/logout")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/logout")); } LogoutJob::LogoutJob() : BaseJob(HttpVerb::Post, QStringLiteral("LogoutJob"), makePath("/_matrix/client/v3", "/logout")) {} -QUrl LogoutAllJob::makeRequestUrl(QUrl baseUrl) +QUrl LogoutAllJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/logout/all")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/logout/all")); } LogoutAllJob::LogoutAllJob() diff --git a/Quotient/csapi/logout.h b/Quotient/csapi/logout.h index 614067b1c..7f3be42fa 100644 --- a/Quotient/csapi/logout.h +++ b/Quotient/csapi/logout.h @@ -19,7 +19,7 @@ class QUOTIENT_API LogoutJob : public BaseJob { //! //! This function can be used when a URL for LogoutJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); }; //! \brief Invalidates all access tokens for a user @@ -43,7 +43,7 @@ class QUOTIENT_API LogoutAllJob : public BaseJob { //! //! This function can be used when a URL for LogoutAllJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); }; } // namespace Quotient diff --git a/Quotient/csapi/message_pagination.cpp b/Quotient/csapi/message_pagination.cpp index 75c5a427e..da83d80b3 100644 --- a/Quotient/csapi/message_pagination.cpp +++ b/Quotient/csapi/message_pagination.cpp @@ -16,11 +16,11 @@ auto queryToGetRoomEvents(const QString& from, const QString& to, const QString& return _q; } -QUrl GetRoomEventsJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& dir, - const QString& from, const QString& to, +QUrl GetRoomEventsJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& dir, const QString& from, const QString& to, std::optional limit, const QString& filter) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/rooms/", roomId, "/messages"), queryToGetRoomEvents(from, to, dir, limit, filter)); } diff --git a/Quotient/csapi/message_pagination.h b/Quotient/csapi/message_pagination.h index cc566ff57..cc78a7a1c 100644 --- a/Quotient/csapi/message_pagination.h +++ b/Quotient/csapi/message_pagination.h @@ -56,8 +56,8 @@ class QUOTIENT_API GetRoomEventsJob : public BaseJob { //! //! This function can be used when a URL for GetRoomEventsJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& dir, - const QString& from = {}, const QString& to = {}, + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& dir, const QString& from = {}, const QString& to = {}, std::optional limit = std::nullopt, const QString& filter = {}); // Result properties diff --git a/Quotient/csapi/notifications.cpp b/Quotient/csapi/notifications.cpp index 9aed4fde6..1c64d0e72 100644 --- a/Quotient/csapi/notifications.cpp +++ b/Quotient/csapi/notifications.cpp @@ -13,11 +13,10 @@ auto queryToGetNotifications(const QString& from, std::optional limit, cons return _q; } -QUrl GetNotificationsJob::makeRequestUrl(QUrl baseUrl, const QString& from, +QUrl GetNotificationsJob::makeRequestUrl(const HomeserverData& hsData, const QString& from, std::optional limit, const QString& only) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/notifications"), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/notifications"), queryToGetNotifications(from, limit, only)); } diff --git a/Quotient/csapi/notifications.h b/Quotient/csapi/notifications.h index 71036135b..05104f0a2 100644 --- a/Quotient/csapi/notifications.h +++ b/Quotient/csapi/notifications.h @@ -58,7 +58,7 @@ class QUOTIENT_API GetNotificationsJob : public BaseJob { //! //! This function can be used when a URL for GetNotificationsJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& from = {}, + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& from = {}, std::optional limit = std::nullopt, const QString& only = {}); // Result properties diff --git a/Quotient/csapi/peeking_events.cpp b/Quotient/csapi/peeking_events.cpp index 636437a37..bc2e6da3d 100644 --- a/Quotient/csapi/peeking_events.cpp +++ b/Quotient/csapi/peeking_events.cpp @@ -13,10 +13,10 @@ auto queryToPeekEvents(const QString& from, std::optional timeout, const QS return _q; } -QUrl PeekEventsJob::makeRequestUrl(QUrl baseUrl, const QString& from, std::optional timeout, - const QString& roomId) +QUrl PeekEventsJob::makeRequestUrl(const HomeserverData& hsData, const QString& from, + std::optional timeout, const QString& roomId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix/client/v3", "/events"), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/events"), queryToPeekEvents(from, timeout, roomId)); } diff --git a/Quotient/csapi/peeking_events.h b/Quotient/csapi/peeking_events.h index e38bc835a..241dbc2f7 100644 --- a/Quotient/csapi/peeking_events.h +++ b/Quotient/csapi/peeking_events.h @@ -37,7 +37,7 @@ class QUOTIENT_API PeekEventsJob : public BaseJob { //! //! This function can be used when a URL for PeekEventsJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& from = {}, + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& from = {}, std::optional timeout = std::nullopt, const QString& roomId = {}); diff --git a/Quotient/csapi/presence.cpp b/Quotient/csapi/presence.cpp index 1c8d3acb8..e2663c659 100644 --- a/Quotient/csapi/presence.cpp +++ b/Quotient/csapi/presence.cpp @@ -15,9 +15,9 @@ SetPresenceJob::SetPresenceJob(const QString& userId, const QString& presence, setRequestData({ _dataJson }); } -QUrl GetPresenceJob::makeRequestUrl(QUrl baseUrl, const QString& userId) +QUrl GetPresenceJob::makeRequestUrl(const HomeserverData& hsData, const QString& userId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/presence/", userId, "/status")); } diff --git a/Quotient/csapi/presence.h b/Quotient/csapi/presence.h index 11a42821d..cffedee4f 100644 --- a/Quotient/csapi/presence.h +++ b/Quotient/csapi/presence.h @@ -39,7 +39,7 @@ class QUOTIENT_API GetPresenceJob : public BaseJob { //! //! This function can be used when a URL for GetPresenceJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& userId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& userId); // Result properties diff --git a/Quotient/csapi/profile.cpp b/Quotient/csapi/profile.cpp index f86554e4f..ef858f308 100644 --- a/Quotient/csapi/profile.cpp +++ b/Quotient/csapi/profile.cpp @@ -13,10 +13,10 @@ SetDisplayNameJob::SetDisplayNameJob(const QString& userId, const QString& displ setRequestData({ _dataJson }); } -QUrl GetDisplayNameJob::makeRequestUrl(QUrl baseUrl, const QString& userId) +QUrl GetDisplayNameJob::makeRequestUrl(const HomeserverData& hsData, const QString& userId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix/client/v3", "/profile/", - userId, "/displayname")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/profile/", userId, + "/displayname")); } GetDisplayNameJob::GetDisplayNameJob(const QString& userId) @@ -33,10 +33,10 @@ SetAvatarUrlJob::SetAvatarUrlJob(const QString& userId, const QUrl& avatarUrl) setRequestData({ _dataJson }); } -QUrl GetAvatarUrlJob::makeRequestUrl(QUrl baseUrl, const QString& userId) +QUrl GetAvatarUrlJob::makeRequestUrl(const HomeserverData& hsData, const QString& userId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix/client/v3", "/profile/", - userId, "/avatar_url")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/profile/", userId, + "/avatar_url")); } GetAvatarUrlJob::GetAvatarUrlJob(const QString& userId) @@ -44,10 +44,9 @@ GetAvatarUrlJob::GetAvatarUrlJob(const QString& userId) makePath("/_matrix/client/v3", "/profile/", userId, "/avatar_url"), false) {} -QUrl GetUserProfileJob::makeRequestUrl(QUrl baseUrl, const QString& userId) +QUrl GetUserProfileJob::makeRequestUrl(const HomeserverData& hsData, const QString& userId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/profile/", userId)); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/profile/", userId)); } GetUserProfileJob::GetUserProfileJob(const QString& userId) diff --git a/Quotient/csapi/profile.h b/Quotient/csapi/profile.h index 7dd31866a..242e9a895 100644 --- a/Quotient/csapi/profile.h +++ b/Quotient/csapi/profile.h @@ -35,7 +35,7 @@ class QUOTIENT_API GetDisplayNameJob : public BaseJob { //! //! This function can be used when a URL for GetDisplayNameJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& userId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& userId); // Result properties @@ -74,7 +74,7 @@ class QUOTIENT_API GetAvatarUrlJob : public BaseJob { //! //! This function can be used when a URL for GetAvatarUrlJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& userId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& userId); // Result properties @@ -100,7 +100,7 @@ class QUOTIENT_API GetUserProfileJob : public BaseJob { //! //! This function can be used when a URL for GetUserProfileJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& userId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& userId); // Result properties diff --git a/Quotient/csapi/pusher.cpp b/Quotient/csapi/pusher.cpp index 822a916c6..f4938e08d 100644 --- a/Quotient/csapi/pusher.cpp +++ b/Quotient/csapi/pusher.cpp @@ -4,9 +4,9 @@ using namespace Quotient; -QUrl GetPushersJob::makeRequestUrl(QUrl baseUrl) +QUrl GetPushersJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix/client/v3", "/pushers")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/pushers")); } GetPushersJob::GetPushersJob() diff --git a/Quotient/csapi/pusher.h b/Quotient/csapi/pusher.h index 81218fa72..3d9e988c8 100644 --- a/Quotient/csapi/pusher.h +++ b/Quotient/csapi/pusher.h @@ -68,7 +68,7 @@ class QUOTIENT_API GetPushersJob : public BaseJob { //! //! This function can be used when a URL for GetPushersJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); // Result properties diff --git a/Quotient/csapi/pushrules.cpp b/Quotient/csapi/pushrules.cpp index 9c0ba1179..76ba19308 100644 --- a/Quotient/csapi/pushrules.cpp +++ b/Quotient/csapi/pushrules.cpp @@ -4,10 +4,9 @@ using namespace Quotient; -QUrl GetPushRulesJob::makeRequestUrl(QUrl baseUrl) +QUrl GetPushRulesJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/pushrules")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/pushrules")); } GetPushRulesJob::GetPushRulesJob() @@ -17,11 +16,11 @@ GetPushRulesJob::GetPushRulesJob() addExpectedKey("global"); } -QUrl GetPushRuleJob::makeRequestUrl(QUrl baseUrl, const QString& scope, const QString& kind, - const QString& ruleId) +QUrl GetPushRuleJob::makeRequestUrl(const HomeserverData& hsData, const QString& scope, + const QString& kind, const QString& ruleId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix/client/v3", "/pushrules/", - scope, "/", kind, "/", ruleId)); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/pushrules/", scope, "/", + kind, "/", ruleId)); } GetPushRuleJob::GetPushRuleJob(const QString& scope, const QString& kind, const QString& ruleId) @@ -29,11 +28,11 @@ GetPushRuleJob::GetPushRuleJob(const QString& scope, const QString& kind, const makePath("/_matrix/client/v3", "/pushrules/", scope, "/", kind, "/", ruleId)) {} -QUrl DeletePushRuleJob::makeRequestUrl(QUrl baseUrl, const QString& scope, const QString& kind, - const QString& ruleId) +QUrl DeletePushRuleJob::makeRequestUrl(const HomeserverData& hsData, const QString& scope, + const QString& kind, const QString& ruleId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix/client/v3", "/pushrules/", - scope, "/", kind, "/", ruleId)); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/pushrules/", scope, "/", + kind, "/", ruleId)); } DeletePushRuleJob::DeletePushRuleJob(const QString& scope, const QString& kind, @@ -65,12 +64,11 @@ SetPushRuleJob::SetPushRuleJob(const QString& scope, const QString& kind, const setRequestData({ _dataJson }); } -QUrl IsPushRuleEnabledJob::makeRequestUrl(QUrl baseUrl, const QString& scope, const QString& kind, - const QString& ruleId) +QUrl IsPushRuleEnabledJob::makeRequestUrl(const HomeserverData& hsData, const QString& scope, + const QString& kind, const QString& ruleId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/pushrules/", scope, "/", kind, - "/", ruleId, "/enabled")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/pushrules/", scope, "/", + kind, "/", ruleId, "/enabled")); } IsPushRuleEnabledJob::IsPushRuleEnabledJob(const QString& scope, const QString& kind, @@ -93,12 +91,11 @@ SetPushRuleEnabledJob::SetPushRuleEnabledJob(const QString& scope, const QString setRequestData({ _dataJson }); } -QUrl GetPushRuleActionsJob::makeRequestUrl(QUrl baseUrl, const QString& scope, const QString& kind, - const QString& ruleId) +QUrl GetPushRuleActionsJob::makeRequestUrl(const HomeserverData& hsData, const QString& scope, + const QString& kind, const QString& ruleId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/pushrules/", scope, "/", kind, - "/", ruleId, "/actions")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/pushrules/", scope, "/", + kind, "/", ruleId, "/actions")); } GetPushRuleActionsJob::GetPushRuleActionsJob(const QString& scope, const QString& kind, diff --git a/Quotient/csapi/pushrules.h b/Quotient/csapi/pushrules.h index bdc7c6768..05294209d 100644 --- a/Quotient/csapi/pushrules.h +++ b/Quotient/csapi/pushrules.h @@ -24,7 +24,7 @@ class QUOTIENT_API GetPushRulesJob : public BaseJob { //! //! This function can be used when a URL for GetPushRulesJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); // Result properties @@ -53,8 +53,8 @@ class QUOTIENT_API GetPushRuleJob : public BaseJob { //! //! This function can be used when a URL for GetPushRuleJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& scope, const QString& kind, - const QString& ruleId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& scope, + const QString& kind, const QString& ruleId); // Result properties @@ -84,8 +84,8 @@ class QUOTIENT_API DeletePushRuleJob : public BaseJob { //! //! This function can be used when a URL for DeletePushRuleJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& scope, const QString& kind, - const QString& ruleId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& scope, + const QString& kind, const QString& ruleId); }; //! \brief Add or change a push rule. @@ -165,8 +165,8 @@ class QUOTIENT_API IsPushRuleEnabledJob : public BaseJob { //! //! This function can be used when a URL for IsPushRuleEnabledJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& scope, const QString& kind, - const QString& ruleId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& scope, + const QString& kind, const QString& ruleId); // Result properties @@ -216,8 +216,8 @@ class QUOTIENT_API GetPushRuleActionsJob : public BaseJob { //! //! This function can be used when a URL for GetPushRuleActionsJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& scope, const QString& kind, - const QString& ruleId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& scope, + const QString& kind, const QString& ruleId); // Result properties diff --git a/Quotient/csapi/registration.cpp b/Quotient/csapi/registration.cpp index 037cc2bb7..59f9f4521 100644 --- a/Quotient/csapi/registration.cpp +++ b/Quotient/csapi/registration.cpp @@ -93,10 +93,10 @@ auto queryToCheckUsernameAvailability(const QString& username) return _q; } -QUrl CheckUsernameAvailabilityJob::makeRequestUrl(QUrl baseUrl, const QString& username) +QUrl CheckUsernameAvailabilityJob::makeRequestUrl(const HomeserverData& hsData, + const QString& username) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/register/available"), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/register/available"), queryToCheckUsernameAvailability(username)); } diff --git a/Quotient/csapi/registration.h b/Quotient/csapi/registration.h index 50455ad41..528a03f58 100644 --- a/Quotient/csapi/registration.h +++ b/Quotient/csapi/registration.h @@ -410,7 +410,7 @@ class QUOTIENT_API CheckUsernameAvailabilityJob : public BaseJob { //! //! This function can be used when a URL for CheckUsernameAvailabilityJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& username); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& username); // Result properties diff --git a/Quotient/csapi/registration_tokens.cpp b/Quotient/csapi/registration_tokens.cpp index aea5ae5dc..cc4dffae4 100644 --- a/Quotient/csapi/registration_tokens.cpp +++ b/Quotient/csapi/registration_tokens.cpp @@ -11,9 +11,9 @@ auto queryToRegistrationTokenValidity(const QString& token) return _q; } -QUrl RegistrationTokenValidityJob::makeRequestUrl(QUrl baseUrl, const QString& token) +QUrl RegistrationTokenValidityJob::makeRequestUrl(const HomeserverData& hsData, const QString& token) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v1", "/register/m.login.registration_token/validity"), queryToRegistrationTokenValidity(token)); diff --git a/Quotient/csapi/registration_tokens.h b/Quotient/csapi/registration_tokens.h index 2de89d9bf..a1b16baf3 100644 --- a/Quotient/csapi/registration_tokens.h +++ b/Quotient/csapi/registration_tokens.h @@ -24,7 +24,7 @@ class QUOTIENT_API RegistrationTokenValidityJob : public BaseJob { //! //! This function can be used when a URL for RegistrationTokenValidityJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& token); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& token); // Result properties diff --git a/Quotient/csapi/relations.cpp b/Quotient/csapi/relations.cpp index 999f93a94..4cb14dfb6 100644 --- a/Quotient/csapi/relations.cpp +++ b/Quotient/csapi/relations.cpp @@ -16,12 +16,12 @@ auto queryToGetRelatingEvents(const QString& from, const QString& to, std::optio return _q; } -QUrl GetRelatingEventsJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, +QUrl GetRelatingEventsJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomId, const QString& eventId, const QString& from, const QString& to, std::optional limit, const QString& dir, std::optional recurse) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v1", "/rooms/", roomId, "/relations/", eventId), queryToGetRelatingEvents(from, to, limit, dir, recurse)); @@ -51,14 +51,14 @@ auto queryToGetRelatingEventsWithRelType(const QString& from, const QString& to, return _q; } -QUrl GetRelatingEventsWithRelTypeJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, - const QString& eventId, const QString& relType, - const QString& from, const QString& to, - std::optional limit, const QString& dir, - std::optional recurse) +QUrl GetRelatingEventsWithRelTypeJob::makeRequestUrl(const HomeserverData& hsData, + const QString& roomId, const QString& eventId, + const QString& relType, const QString& from, + const QString& to, std::optional limit, + const QString& dir, std::optional recurse) { return BaseJob::makeRequestUrl( - std::move(baseUrl), + hsData, makePath("/_matrix/client/v1", "/rooms/", roomId, "/relations/", eventId, "/", relType), queryToGetRelatingEventsWithRelType(from, to, limit, dir, recurse)); } @@ -88,11 +88,11 @@ auto queryToGetRelatingEventsWithRelTypeAndEventType(const QString& from, const } QUrl GetRelatingEventsWithRelTypeAndEventTypeJob::makeRequestUrl( - QUrl baseUrl, const QString& roomId, const QString& eventId, const QString& relType, - const QString& eventType, const QString& from, const QString& to, std::optional limit, - const QString& dir, std::optional recurse) + const HomeserverData& hsData, const QString& roomId, const QString& eventId, + const QString& relType, const QString& eventType, const QString& from, const QString& to, + std::optional limit, const QString& dir, std::optional recurse) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v1", "/rooms/", roomId, "/relations/", eventId, "/", relType, "/", eventType), queryToGetRelatingEventsWithRelTypeAndEventType(from, to, limit, diff --git a/Quotient/csapi/relations.h b/Quotient/csapi/relations.h index e1d95dfab..3725b0fa6 100644 --- a/Quotient/csapi/relations.h +++ b/Quotient/csapi/relations.h @@ -76,10 +76,10 @@ class QUOTIENT_API GetRelatingEventsJob : public BaseJob { //! //! This function can be used when a URL for GetRelatingEventsJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& eventId, - const QString& from = {}, const QString& to = {}, - std::optional limit = std::nullopt, const QString& dir = {}, - std::optional recurse = std::nullopt); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& eventId, const QString& from = {}, + const QString& to = {}, std::optional limit = std::nullopt, + const QString& dir = {}, std::optional recurse = std::nullopt); // Result properties @@ -201,10 +201,11 @@ class QUOTIENT_API GetRelatingEventsWithRelTypeJob : public BaseJob { //! //! This function can be used when a URL for GetRelatingEventsWithRelTypeJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& eventId, - const QString& relType, const QString& from = {}, - const QString& to = {}, std::optional limit = std::nullopt, - const QString& dir = {}, std::optional recurse = std::nullopt); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& eventId, const QString& relType, + const QString& from = {}, const QString& to = {}, + std::optional limit = std::nullopt, const QString& dir = {}, + std::optional recurse = std::nullopt); // Result properties @@ -336,11 +337,11 @@ class QUOTIENT_API GetRelatingEventsWithRelTypeAndEventTypeJob : public BaseJob //! //! This function can be used when a URL for GetRelatingEventsWithRelTypeAndEventTypeJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& eventId, - const QString& relType, const QString& eventType, - const QString& from = {}, const QString& to = {}, - std::optional limit = std::nullopt, const QString& dir = {}, - std::optional recurse = std::nullopt); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& eventId, const QString& relType, + const QString& eventType, const QString& from = {}, + const QString& to = {}, std::optional limit = std::nullopt, + const QString& dir = {}, std::optional recurse = std::nullopt); // Result properties diff --git a/Quotient/csapi/room_event_by_timestamp.cpp b/Quotient/csapi/room_event_by_timestamp.cpp index 7aa76b524..694983838 100644 --- a/Quotient/csapi/room_event_by_timestamp.cpp +++ b/Quotient/csapi/room_event_by_timestamp.cpp @@ -12,10 +12,10 @@ auto queryToGetEventByTimestamp(int ts, const QString& dir) return _q; } -QUrl GetEventByTimestampJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, int ts, - const QString& dir) +QUrl GetEventByTimestampJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + int ts, const QString& dir) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v1", "/rooms/", roomId, "/timestamp_to_event"), queryToGetEventByTimestamp(ts, dir)); diff --git a/Quotient/csapi/room_event_by_timestamp.h b/Quotient/csapi/room_event_by_timestamp.h index 50b02e422..60f636edd 100644 --- a/Quotient/csapi/room_event_by_timestamp.h +++ b/Quotient/csapi/room_event_by_timestamp.h @@ -49,7 +49,8 @@ class QUOTIENT_API GetEventByTimestampJob : public BaseJob { //! //! This function can be used when a URL for GetEventByTimestampJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, int ts, const QString& dir); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId, int ts, + const QString& dir); // Result properties diff --git a/Quotient/csapi/rooms.cpp b/Quotient/csapi/rooms.cpp index 575aaecb8..af655685d 100644 --- a/Quotient/csapi/rooms.cpp +++ b/Quotient/csapi/rooms.cpp @@ -4,10 +4,11 @@ using namespace Quotient; -QUrl GetOneRoomEventJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& eventId) +QUrl GetOneRoomEventJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& eventId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix/client/v3", "/rooms/", - roomId, "/event/", eventId)); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/rooms/", roomId, + "/event/", eventId)); } GetOneRoomEventJob::GetOneRoomEventJob(const QString& roomId, const QString& eventId) @@ -15,12 +16,11 @@ GetOneRoomEventJob::GetOneRoomEventJob(const QString& roomId, const QString& eve makePath("/_matrix/client/v3", "/rooms/", roomId, "/event/", eventId)) {} -QUrl GetRoomStateWithKeyJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, +QUrl GetRoomStateWithKeyJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomId, const QString& eventType, const QString& stateKey) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/rooms/", roomId, "/state/", - eventType, "/", stateKey)); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/rooms/", roomId, + "/state/", eventType, "/", stateKey)); } GetRoomStateWithKeyJob::GetRoomStateWithKeyJob(const QString& roomId, const QString& eventType, @@ -29,9 +29,9 @@ GetRoomStateWithKeyJob::GetRoomStateWithKeyJob(const QString& roomId, const QStr makePath("/_matrix/client/v3", "/rooms/", roomId, "/state/", eventType, "/", stateKey)) {} -QUrl GetRoomStateJob::makeRequestUrl(QUrl baseUrl, const QString& roomId) +QUrl GetRoomStateJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/rooms/", roomId, "/state")); } @@ -50,10 +50,11 @@ auto queryToGetMembersByRoom(const QString& at, const QString& membership, return _q; } -QUrl GetMembersByRoomJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& at, - const QString& membership, const QString& notMembership) +QUrl GetMembersByRoomJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& at, const QString& membership, + const QString& notMembership) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/rooms/", roomId, "/members"), queryToGetMembersByRoom(at, membership, notMembership)); } @@ -65,10 +66,10 @@ GetMembersByRoomJob::GetMembersByRoomJob(const QString& roomId, const QString& a queryToGetMembersByRoom(at, membership, notMembership)) {} -QUrl GetJoinedMembersByRoomJob::makeRequestUrl(QUrl baseUrl, const QString& roomId) +QUrl GetJoinedMembersByRoomJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix/client/v3", "/rooms/", - roomId, "/joined_members")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/rooms/", roomId, + "/joined_members")); } GetJoinedMembersByRoomJob::GetJoinedMembersByRoomJob(const QString& roomId) diff --git a/Quotient/csapi/rooms.h b/Quotient/csapi/rooms.h index ec945df83..c1ffdfb77 100644 --- a/Quotient/csapi/rooms.h +++ b/Quotient/csapi/rooms.h @@ -25,7 +25,8 @@ class QUOTIENT_API GetOneRoomEventJob : public BaseJob { //! //! This function can be used when a URL for GetOneRoomEventJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& eventId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& eventId); // Result properties @@ -59,8 +60,8 @@ class QUOTIENT_API GetRoomStateWithKeyJob : public BaseJob { //! //! This function can be used when a URL for GetRoomStateWithKeyJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& eventType, - const QString& stateKey); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& eventType, const QString& stateKey); // Result properties @@ -83,7 +84,7 @@ class QUOTIENT_API GetRoomStateJob : public BaseJob { //! //! This function can be used when a URL for GetRoomStateJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId); // Result properties @@ -123,8 +124,9 @@ class QUOTIENT_API GetMembersByRoomJob : public BaseJob { //! //! This function can be used when a URL for GetMembersByRoomJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& at = {}, - const QString& membership = {}, const QString& notMembership = {}); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& at = {}, const QString& membership = {}, + const QString& notMembership = {}); // Result properties @@ -162,7 +164,7 @@ class QUOTIENT_API GetJoinedMembersByRoomJob : public BaseJob { //! //! This function can be used when a URL for GetJoinedMembersByRoomJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId); // Result properties diff --git a/Quotient/csapi/space_hierarchy.cpp b/Quotient/csapi/space_hierarchy.cpp index 355688025..ca8d28b43 100644 --- a/Quotient/csapi/space_hierarchy.cpp +++ b/Quotient/csapi/space_hierarchy.cpp @@ -15,12 +15,12 @@ auto queryToGetSpaceHierarchy(std::optional suggestedOnly, std::optional suggestedOnly, std::optional limit, std::optional maxDepth, const QString& from) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v1", "/rooms/", roomId, "/hierarchy"), queryToGetSpaceHierarchy(suggestedOnly, limit, maxDepth, from)); } diff --git a/Quotient/csapi/space_hierarchy.h b/Quotient/csapi/space_hierarchy.h index 710e957f8..069452bec 100644 --- a/Quotient/csapi/space_hierarchy.h +++ b/Quotient/csapi/space_hierarchy.h @@ -99,7 +99,7 @@ class QUOTIENT_API GetSpaceHierarchyJob : public BaseJob { //! //! This function can be used when a URL for GetSpaceHierarchyJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId, std::optional suggestedOnly = std::nullopt, std::optional limit = std::nullopt, std::optional maxDepth = std::nullopt, const QString& from = {}); diff --git a/Quotient/csapi/sso_login_redirect.cpp b/Quotient/csapi/sso_login_redirect.cpp index c32138e92..f6db4109f 100644 --- a/Quotient/csapi/sso_login_redirect.cpp +++ b/Quotient/csapi/sso_login_redirect.cpp @@ -11,10 +11,9 @@ auto queryToRedirectToSSO(const QString& redirectUrl) return _q; } -QUrl RedirectToSSOJob::makeRequestUrl(QUrl baseUrl, const QString& redirectUrl) +QUrl RedirectToSSOJob::makeRequestUrl(const HomeserverData& hsData, const QString& redirectUrl) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/login/sso/redirect"), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/login/sso/redirect"), queryToRedirectToSSO(redirectUrl)); } @@ -31,9 +30,10 @@ auto queryToRedirectToIdP(const QString& redirectUrl) return _q; } -QUrl RedirectToIdPJob::makeRequestUrl(QUrl baseUrl, const QString& idpId, const QString& redirectUrl) +QUrl RedirectToIdPJob::makeRequestUrl(const HomeserverData& hsData, const QString& idpId, + const QString& redirectUrl) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/login/sso/redirect/", idpId), queryToRedirectToIdP(redirectUrl)); } diff --git a/Quotient/csapi/sso_login_redirect.h b/Quotient/csapi/sso_login_redirect.h index ef22cb323..dd2cb64c6 100644 --- a/Quotient/csapi/sso_login_redirect.h +++ b/Quotient/csapi/sso_login_redirect.h @@ -25,7 +25,7 @@ class QUOTIENT_API RedirectToSSOJob : public BaseJob { //! //! This function can be used when a URL for RedirectToSSOJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& redirectUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& redirectUrl); }; //! \brief Redirect the user's browser to the SSO interface for an IdP. @@ -51,7 +51,8 @@ class QUOTIENT_API RedirectToIdPJob : public BaseJob { //! //! This function can be used when a URL for RedirectToIdPJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& idpId, const QString& redirectUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& idpId, + const QString& redirectUrl); }; } // namespace Quotient diff --git a/Quotient/csapi/support.cpp b/Quotient/csapi/support.cpp index 2be3c3e6c..098342288 100644 --- a/Quotient/csapi/support.cpp +++ b/Quotient/csapi/support.cpp @@ -4,9 +4,9 @@ using namespace Quotient; -QUrl GetWellknownSupportJob::makeRequestUrl(QUrl baseUrl) +QUrl GetWellknownSupportJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/.well-known", "/matrix/support")); + return BaseJob::makeRequestUrl(hsData, makePath("/.well-known", "/matrix/support")); } GetWellknownSupportJob::GetWellknownSupportJob() diff --git a/Quotient/csapi/support.h b/Quotient/csapi/support.h index a0db5228f..02c1954aa 100644 --- a/Quotient/csapi/support.h +++ b/Quotient/csapi/support.h @@ -60,7 +60,7 @@ class QUOTIENT_API GetWellknownSupportJob : public BaseJob { //! //! This function can be used when a URL for GetWellknownSupportJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); // Result properties diff --git a/Quotient/csapi/tags.cpp b/Quotient/csapi/tags.cpp index 7c3966abd..0c1be441e 100644 --- a/Quotient/csapi/tags.cpp +++ b/Quotient/csapi/tags.cpp @@ -4,10 +4,11 @@ using namespace Quotient; -QUrl GetRoomTagsJob::makeRequestUrl(QUrl baseUrl, const QString& userId, const QString& roomId) +QUrl GetRoomTagsJob::makeRequestUrl(const HomeserverData& hsData, const QString& userId, + const QString& roomId) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix/client/v3", "/user/", - userId, "/rooms/", roomId, "/tags")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/user/", userId, + "/rooms/", roomId, "/tags")); } GetRoomTagsJob::GetRoomTagsJob(const QString& userId, const QString& roomId) @@ -23,12 +24,11 @@ SetRoomTagJob::SetRoomTagJob(const QString& userId, const QString& roomId, const setRequestData({ toJson(data) }); } -QUrl DeleteRoomTagJob::makeRequestUrl(QUrl baseUrl, const QString& userId, const QString& roomId, - const QString& tag) +QUrl DeleteRoomTagJob::makeRequestUrl(const HomeserverData& hsData, const QString& userId, + const QString& roomId, const QString& tag) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/user/", userId, "/rooms/", - roomId, "/tags/", tag)); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/user/", userId, + "/rooms/", roomId, "/tags/", tag)); } DeleteRoomTagJob::DeleteRoomTagJob(const QString& userId, const QString& roomId, const QString& tag) diff --git a/Quotient/csapi/tags.h b/Quotient/csapi/tags.h index 695fbb14a..af56033cd 100644 --- a/Quotient/csapi/tags.h +++ b/Quotient/csapi/tags.h @@ -25,7 +25,8 @@ class QUOTIENT_API GetRoomTagsJob : public BaseJob { //! //! This function can be used when a URL for GetRoomTagsJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& userId, const QString& roomId); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& userId, + const QString& roomId); // Result properties @@ -75,8 +76,8 @@ class QUOTIENT_API DeleteRoomTagJob : public BaseJob { //! //! This function can be used when a URL for DeleteRoomTagJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& userId, const QString& roomId, - const QString& tag); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& userId, + const QString& roomId, const QString& tag); }; } // namespace Quotient diff --git a/Quotient/csapi/third_party_lookup.cpp b/Quotient/csapi/third_party_lookup.cpp index 1cce0edcd..3c092df7e 100644 --- a/Quotient/csapi/third_party_lookup.cpp +++ b/Quotient/csapi/third_party_lookup.cpp @@ -4,10 +4,9 @@ using namespace Quotient; -QUrl GetProtocolsJob::makeRequestUrl(QUrl baseUrl) +QUrl GetProtocolsJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/thirdparty/protocols")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/thirdparty/protocols")); } GetProtocolsJob::GetProtocolsJob() @@ -15,10 +14,10 @@ GetProtocolsJob::GetProtocolsJob() makePath("/_matrix/client/v3", "/thirdparty/protocols")) {} -QUrl GetProtocolMetadataJob::makeRequestUrl(QUrl baseUrl, const QString& protocol) +QUrl GetProtocolMetadataJob::makeRequestUrl(const HomeserverData& hsData, const QString& protocol) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix/client/v3", - "/thirdparty/protocol/", protocol)); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/thirdparty/protocol/", + protocol)); } GetProtocolMetadataJob::GetProtocolMetadataJob(const QString& protocol) @@ -33,10 +32,10 @@ auto queryToQueryLocationByProtocol(const QString& searchFields) return _q; } -QUrl QueryLocationByProtocolJob::makeRequestUrl(QUrl baseUrl, const QString& protocol, - const QString& searchFields) +QUrl QueryLocationByProtocolJob::makeRequestUrl(const HomeserverData& hsData, + const QString& protocol, const QString& searchFields) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/thirdparty/location/", protocol), queryToQueryLocationByProtocol(searchFields)); } @@ -55,10 +54,10 @@ auto queryToQueryUserByProtocol(const QHash& fields) return _q; } -QUrl QueryUserByProtocolJob::makeRequestUrl(QUrl baseUrl, const QString& protocol, +QUrl QueryUserByProtocolJob::makeRequestUrl(const HomeserverData& hsData, const QString& protocol, const QHash& fields) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/thirdparty/user/", protocol), queryToQueryUserByProtocol(fields)); } @@ -77,10 +76,9 @@ auto queryToQueryLocationByAlias(const QString& alias) return _q; } -QUrl QueryLocationByAliasJob::makeRequestUrl(QUrl baseUrl, const QString& alias) +QUrl QueryLocationByAliasJob::makeRequestUrl(const HomeserverData& hsData, const QString& alias) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/thirdparty/location"), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/thirdparty/location"), queryToQueryLocationByAlias(alias)); } @@ -97,10 +95,9 @@ auto queryToQueryUserByID(const QString& userid) return _q; } -QUrl QueryUserByIDJob::makeRequestUrl(QUrl baseUrl, const QString& userid) +QUrl QueryUserByIDJob::makeRequestUrl(const HomeserverData& hsData, const QString& userid) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/thirdparty/user"), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/thirdparty/user"), queryToQueryUserByID(userid)); } diff --git a/Quotient/csapi/third_party_lookup.h b/Quotient/csapi/third_party_lookup.h index 7820ff519..819da2c3e 100644 --- a/Quotient/csapi/third_party_lookup.h +++ b/Quotient/csapi/third_party_lookup.h @@ -23,7 +23,7 @@ class QUOTIENT_API GetProtocolsJob : public BaseJob { //! //! This function can be used when a URL for GetProtocolsJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); // Result properties @@ -49,7 +49,7 @@ class QUOTIENT_API GetProtocolMetadataJob : public BaseJob { //! //! This function can be used when a URL for GetProtocolMetadataJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& protocol); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& protocol); // Result properties @@ -83,7 +83,7 @@ class QUOTIENT_API QueryLocationByProtocolJob : public BaseJob { //! //! This function can be used when a URL for QueryLocationByProtocolJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& protocol, + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& protocol, const QString& searchFields = {}); // Result properties @@ -115,7 +115,7 @@ class QUOTIENT_API QueryUserByProtocolJob : public BaseJob { //! //! This function can be used when a URL for QueryUserByProtocolJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& protocol, + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& protocol, const QHash& fields = {}); // Result properties @@ -140,7 +140,7 @@ class QUOTIENT_API QueryLocationByAliasJob : public BaseJob { //! //! This function can be used when a URL for QueryLocationByAliasJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& alias); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& alias); // Result properties @@ -166,7 +166,7 @@ class QUOTIENT_API QueryUserByIDJob : public BaseJob { //! //! This function can be used when a URL for QueryUserByIDJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& userid); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& userid); // Result properties diff --git a/Quotient/csapi/threads_list.cpp b/Quotient/csapi/threads_list.cpp index 990d27be6..e7a6db0f7 100644 --- a/Quotient/csapi/threads_list.cpp +++ b/Quotient/csapi/threads_list.cpp @@ -13,10 +13,11 @@ auto queryToGetThreadRoots(const QString& include, std::optional limit, con return _q; } -QUrl GetThreadRootsJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& include, - std::optional limit, const QString& from) +QUrl GetThreadRootsJob::makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& include, std::optional limit, + const QString& from) { - return BaseJob::makeRequestUrl(std::move(baseUrl), + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v1", "/rooms/", roomId, "/threads"), queryToGetThreadRoots(include, limit, from)); } diff --git a/Quotient/csapi/threads_list.h b/Quotient/csapi/threads_list.h index 7a55780f2..53d60a126 100644 --- a/Quotient/csapi/threads_list.h +++ b/Quotient/csapi/threads_list.h @@ -43,8 +43,9 @@ class QUOTIENT_API GetThreadRootsJob : public BaseJob { //! //! This function can be used when a URL for GetThreadRootsJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& include = {}, - std::optional limit = std::nullopt, const QString& from = {}); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& roomId, + const QString& include = {}, std::optional limit = std::nullopt, + const QString& from = {}); // Result properties diff --git a/Quotient/csapi/versions.cpp b/Quotient/csapi/versions.cpp index 16184f94e..e2899a303 100644 --- a/Quotient/csapi/versions.cpp +++ b/Quotient/csapi/versions.cpp @@ -4,9 +4,9 @@ using namespace Quotient; -QUrl GetVersionsJob::makeRequestUrl(QUrl baseUrl) +QUrl GetVersionsJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/_matrix/client", "/versions")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client", "/versions")); } GetVersionsJob::GetVersionsJob() diff --git a/Quotient/csapi/versions.h b/Quotient/csapi/versions.h index 80d5c0cc9..8518bfd18 100644 --- a/Quotient/csapi/versions.h +++ b/Quotient/csapi/versions.h @@ -38,7 +38,7 @@ class QUOTIENT_API GetVersionsJob : public BaseJob { //! //! This function can be used when a URL for GetVersionsJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); // Result properties diff --git a/Quotient/csapi/voip.cpp b/Quotient/csapi/voip.cpp index 2136120b8..d3f0a974e 100644 --- a/Quotient/csapi/voip.cpp +++ b/Quotient/csapi/voip.cpp @@ -4,10 +4,9 @@ using namespace Quotient; -QUrl GetTurnServerJob::makeRequestUrl(QUrl baseUrl) +QUrl GetTurnServerJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/voip/turnServer")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/voip/turnServer")); } GetTurnServerJob::GetTurnServerJob() diff --git a/Quotient/csapi/voip.h b/Quotient/csapi/voip.h index d28901f86..c4eee3b6f 100644 --- a/Quotient/csapi/voip.h +++ b/Quotient/csapi/voip.h @@ -18,7 +18,7 @@ class QUOTIENT_API GetTurnServerJob : public BaseJob { //! //! This function can be used when a URL for GetTurnServerJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); // Result properties diff --git a/Quotient/csapi/wellknown.cpp b/Quotient/csapi/wellknown.cpp index e85a14244..a7d4af5bf 100644 --- a/Quotient/csapi/wellknown.cpp +++ b/Quotient/csapi/wellknown.cpp @@ -4,9 +4,9 @@ using namespace Quotient; -QUrl GetWellknownJob::makeRequestUrl(QUrl baseUrl) +QUrl GetWellknownJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), makePath("/.well-known", "/matrix/client")); + return BaseJob::makeRequestUrl(hsData, makePath("/.well-known", "/matrix/client")); } GetWellknownJob::GetWellknownJob() diff --git a/Quotient/csapi/wellknown.h b/Quotient/csapi/wellknown.h index 79a77b53d..e50dffd89 100644 --- a/Quotient/csapi/wellknown.h +++ b/Quotient/csapi/wellknown.h @@ -26,7 +26,7 @@ class QUOTIENT_API GetWellknownJob : public BaseJob { //! //! This function can be used when a URL for GetWellknownJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); // Result properties diff --git a/Quotient/csapi/whoami.cpp b/Quotient/csapi/whoami.cpp index a069f4ea9..2a46b7a5c 100644 --- a/Quotient/csapi/whoami.cpp +++ b/Quotient/csapi/whoami.cpp @@ -4,10 +4,9 @@ using namespace Quotient; -QUrl GetTokenOwnerJob::makeRequestUrl(QUrl baseUrl) +QUrl GetTokenOwnerJob::makeRequestUrl(const HomeserverData& hsData) { - return BaseJob::makeRequestUrl(std::move(baseUrl), - makePath("/_matrix/client/v3", "/account/whoami")); + return BaseJob::makeRequestUrl(hsData, makePath("/_matrix/client/v3", "/account/whoami")); } GetTokenOwnerJob::GetTokenOwnerJob() diff --git a/Quotient/csapi/whoami.h b/Quotient/csapi/whoami.h index 650b1ab02..c1d78fc58 100644 --- a/Quotient/csapi/whoami.h +++ b/Quotient/csapi/whoami.h @@ -24,7 +24,7 @@ class QUOTIENT_API GetTokenOwnerJob : public BaseJob { //! //! This function can be used when a URL for GetTokenOwnerJob //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl); + static QUrl makeRequestUrl(const HomeserverData& hsData); // Result properties diff --git a/Quotient/jobs/basejob.cpp b/Quotient/jobs/basejob.cpp index 877d6021b..8f998ea20 100644 --- a/Quotient/jobs/basejob.cpp +++ b/Quotient/jobs/basejob.cpp @@ -162,8 +162,7 @@ class Q_DECL_HIDDEN BaseJob::Private { const auto verbWord = verbs.at(size_t(verb)); return verbWord % u' ' % (reply ? reply->url().toString(QUrl::RemoveQuery) - : makeRequestUrl(connection->baseUrl(), apiEndpoint) - .toString()); + : makeRequestUrl(connection->homeserverData(), apiEndpoint).toString()); } }; @@ -217,6 +216,10 @@ QUrl BaseJob::requestUrl() const { return d->reply ? d->reply->url() : QUrl(); } bool BaseJob::isBackground() const { return d->inBackground; } +QByteArray BaseJob::apiEndpoint() const { return d->apiEndpoint; } + +void BaseJob::setApiEndpoint(QByteArray apiEndpoint) { d->apiEndpoint = std::move(apiEndpoint); } + const BaseJob::headers_t& BaseJob::requestHeaders() const { return d->requestHeaders; @@ -275,7 +278,7 @@ const QNetworkReply* BaseJob::reply() const { return d->reply.data(); } QNetworkReply* BaseJob::reply() { return d->reply.data(); } -QUrl BaseJob::makeRequestUrl(QUrl baseUrl, const QByteArray& encodedPath, +QUrl BaseJob::makeRequestUrl(const HomeserverData& hsData, const QByteArray& encodedPath, const QUrlQuery& query) { // Make sure the added path is relative even if it's not (the official @@ -285,15 +288,14 @@ QUrl BaseJob::makeRequestUrl(QUrl baseUrl, const QByteArray& encodedPath, QUrl::StrictMode); Q_ASSERT_X(pathUrl.isValid(), __FUNCTION__, qPrintable(pathUrl.errorString())); - baseUrl = baseUrl.resolved(pathUrl); + auto baseUrl = hsData.baseUrl.resolved(pathUrl); baseUrl.setQuery(query); return baseUrl; } QNetworkRequest BaseJob::Private::prepareRequest() const { - QNetworkRequest req{ makeRequestUrl(connection->baseUrl(), apiEndpoint, - requestQuery) }; + QNetworkRequest req{ makeRequestUrl(connection->homeserverData(), apiEndpoint, requestQuery) }; if (!requestHeaders.contains("Content-Type")) req.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"_ls); if (needsToken) @@ -332,7 +334,7 @@ void BaseJob::Private::sendRequest(const QNetworkRequest& req) } } -void BaseJob::doPrepare() { } +void BaseJob::doPrepare(const ConnectionData* connectionData) { } void BaseJob::onSentRequest(QNetworkReply*) { } @@ -343,7 +345,7 @@ void BaseJob::initiate(ConnectionData* connData, bool inBackground) if (Q_LIKELY(connData && connData->baseUrl().isValid())) { d->inBackground = inBackground; d->connection = connData; - doPrepare(); + doPrepare(connData); if (d->needsToken && d->connection->accessToken().isEmpty()) setStatus(Unauthorised); diff --git a/Quotient/jobs/basejob.h b/Quotient/jobs/basejob.h index 2d07221b4..0f08efcce 100644 --- a/Quotient/jobs/basejob.h +++ b/Quotient/jobs/basejob.h @@ -339,6 +339,8 @@ public Q_SLOTS: protected: using headers_t = QHash; + QByteArray apiEndpoint() const; + void setApiEndpoint(QByteArray apiEndpoint); const headers_t& requestHeaders() const; void setRequestHeader(const headers_t::key_type& headerName, const headers_t::mapped_type& headerValue); @@ -362,7 +364,7 @@ public Q_SLOTS: * The function ensures exactly one '/' between the path component of * \p baseUrl and \p path. The query component of \p baseUrl is ignored. */ - static QUrl makeRequestUrl(QUrl baseUrl, const QByteArray &encodedPath, + static QUrl makeRequestUrl(const HomeserverData& hsData, const QByteArray& encodedPath, const QUrlQuery& query = {}); /*! Prepares the job for execution @@ -371,7 +373,7 @@ public Q_SLOTS: * when it's first scheduled for execution; in particular, it is not called * on retries. */ - virtual void doPrepare(); + virtual void doPrepare(const ConnectionData* connectionData); /*! Postprocessing after the network request has been sent * diff --git a/Quotient/jobs/downloadfilejob.cpp b/Quotient/jobs/downloadfilejob.cpp index 10051d899..a40e90d92 100644 --- a/Quotient/jobs/downloadfilejob.cpp +++ b/Quotient/jobs/downloadfilejob.cpp @@ -3,6 +3,13 @@ #include "downloadfilejob.h" +#include "Quotient/connectiondata.h" + +#include "../csapi/authed-content-repo.h" +#include "../csapi/content-repo.h" + +#include + #include "../logging_categories_p.h" #include @@ -10,50 +17,48 @@ #include #include -#include - - using namespace Quotient; class Q_DECL_HIDDEN DownloadFileJob::Private { public: - Private() : tempFile(new QTemporaryFile()) {} - - explicit Private(const QString& localFilename) - : targetFile(new QFile(localFilename)) - , tempFile(new QFile(targetFile->fileName() + ".qtntdownload"_ls)) + explicit Private(QString serverName, QString mediaId, const QString& localFilename) + : serverName(std::move(serverName)) + , mediaId(std::move(mediaId)) + , targetFile(!localFilename.isEmpty() ? new QFile(localFilename) : nullptr) + , tempFile(!localFilename.isEmpty() ? new QFile(targetFile->fileName() + ".qtntdownload"_ls) + : new QTemporaryFile()) {} + QString serverName; + QString mediaId; QScopedPointer targetFile; QScopedPointer tempFile; std::optional encryptedFileMetadata; }; -QUrl DownloadFileJob::makeRequestUrl(QUrl baseUrl, const QUrl& mxcUri) +QUrl DownloadFileJob::makeRequestUrl(const HomeserverData& hsData, const QUrl& mxcUri) { - return makeRequestUrl(std::move(baseUrl), mxcUri.authority(), - mxcUri.path().mid(1)); + return makeRequestUrl(hsData, mxcUri.authority(), mxcUri.path().mid(1)); } -DownloadFileJob::DownloadFileJob(const QString& serverName, - const QString& mediaId, - const QString& localFilename) - : GetContentJob(serverName, mediaId) - , d(localFilename.isEmpty() ? makeImpl() - : makeImpl(localFilename)) +QUrl DownloadFileJob::makeRequestUrl(const HomeserverData& hsData, const QString& serverName, + const QString& mediaId) { - setObjectName(QStringLiteral("DownloadFileJob")); + QT_IGNORE_DEPRECATIONS( // For GetContentJob + return hsData.checkMatrixSpecVersion(u"1.11") + ? GetContentAuthedJob::makeRequestUrl(hsData, serverName, mediaId) + : GetContentJob::makeRequestUrl(hsData, serverName, mediaId);) } -DownloadFileJob::DownloadFileJob(const QString& serverName, - const QString& mediaId, - const EncryptedFileMetadata& file, - const QString& localFilename) - : GetContentJob(serverName, mediaId) - , d(localFilename.isEmpty() ? makeImpl() - : makeImpl(localFilename)) +DownloadFileJob::DownloadFileJob(QString serverName, QString mediaId, const QString& localFilename) + : BaseJob(HttpVerb::Get, QStringLiteral("DownloadFileJob"), {}) + , d(makeImpl(std::move(serverName), std::move(mediaId), localFilename)) +{} + +DownloadFileJob::DownloadFileJob(QString serverName, QString mediaId, + const EncryptedFileMetadata& file, const QString& localFilename) + : DownloadFileJob(std::move(serverName), std::move(mediaId), localFilename) { - setObjectName(QStringLiteral("DownloadFileJob")); d->encryptedFileMetadata = file; } @@ -62,8 +67,12 @@ QString DownloadFileJob::targetFileName() const return (d->targetFile ? d->targetFile : d->tempFile)->fileName(); } -void DownloadFileJob::doPrepare() +void DownloadFileJob::doPrepare(const ConnectionData* connectionData) { + const auto url = makeRequestUrl(connectionData->homeserverData(), d->serverName, d->mediaId); + setApiEndpoint(url.toEncoded(QUrl::RemoveQuery | QUrl::RemoveFragment | QUrl::FullyEncoded)); + setRequestQuery(QUrlQuery{ url.query() }); + if (d->targetFile && !d->targetFile->isReadable() && !d->targetFile->open(QIODevice::WriteOnly)) { qCWarning(JOBS) << "Couldn't open the file" << d->targetFile->fileName() diff --git a/Quotient/jobs/downloadfilejob.h b/Quotient/jobs/downloadfilejob.h index ab2ad201c..f6f56a7f3 100644 --- a/Quotient/jobs/downloadfilejob.h +++ b/Quotient/jobs/downloadfilejob.h @@ -3,21 +3,20 @@ #pragma once -#include +#include "basejob.h" namespace Quotient { struct EncryptedFileMetadata; -class QUOTIENT_API DownloadFileJob : public GetContentJob { +class QUOTIENT_API DownloadFileJob : public BaseJob { public: - using GetContentJob::makeRequestUrl; - static QUrl makeRequestUrl(QUrl baseUrl, const QUrl& mxcUri); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QUrl& mxcUri); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& serverName, + const QString& mediaId); - DownloadFileJob(const QString& serverName, const QString& mediaId, - const QString& localFilename = {}); + DownloadFileJob(QString serverName, QString mediaId, const QString& localFilename = {}); - DownloadFileJob(const QString& serverName, const QString& mediaId, - const EncryptedFileMetadata& file, + DownloadFileJob(QString serverName, QString mediaId, const EncryptedFileMetadata& file, const QString& localFilename = {}); QString targetFileName() const; @@ -25,7 +24,7 @@ class QUOTIENT_API DownloadFileJob : public GetContentJob { class Private; ImplPtr d; - void doPrepare() override; + void doPrepare(const ConnectionData* connectionData) override; void onSentRequest(QNetworkReply* reply) override; void beforeAbandon() override; Status prepareResult() override; diff --git a/Quotient/jobs/mediathumbnailjob.cpp b/Quotient/jobs/mediathumbnailjob.cpp index 0954b327b..9b822472f 100644 --- a/Quotient/jobs/mediathumbnailjob.cpp +++ b/Quotient/jobs/mediathumbnailjob.cpp @@ -3,45 +3,71 @@ #include "mediathumbnailjob.h" +#include "../csapi/authed-content-repo.h" +#include "../csapi/content-repo.h" + +#include "../connectiondata.h" #include "../logging_categories_p.h" using namespace Quotient; -QUrl MediaThumbnailJob::makeRequestUrl(QUrl baseUrl, const QUrl& mxcUri, - QSize requestedSize) +QUrl MediaThumbnailJob::makeRequestUrl(const HomeserverData& hsData, const QUrl& mxcUri, + QSize requestedSize, std::optional animated) { - return makeRequestUrl(std::move(baseUrl), mxcUri.authority(), - mxcUri.path().mid(1), requestedSize.width(), - requestedSize.height()); + return makeRequestUrl(hsData, mxcUri.authority(), mxcUri.path().mid(1), requestedSize, animated); } -MediaThumbnailJob::MediaThumbnailJob(const QString& serverName, - const QString& mediaId, QSize requestedSize) - : GetContentThumbnailJob(serverName, mediaId, requestedSize.width(), - requestedSize.height(), "scale"_ls) +QUrl MediaThumbnailJob::makeRequestUrl(const HomeserverData& hsData, const QString& serverName, + const QString& mediaId, QSize requestedSize, + std::optional animated) { - setLoggingCategory(THUMBNAILJOB); + QT_IGNORE_DEPRECATIONS( // For GetContentThumbnailJob + return hsData.checkMatrixSpecVersion(u"1.11") + ? GetContentThumbnailAuthedJob::makeRequestUrl(hsData, serverName, mediaId, + requestedSize.width(), + requestedSize.height(), + "scale"_ls, 20'000, animated) + : GetContentThumbnailJob::makeRequestUrl(hsData, serverName, mediaId, + requestedSize.width(), + requestedSize.height(), "scale"_ls, + true, 20'000, false, animated);) } -MediaThumbnailJob::MediaThumbnailJob(const QUrl& mxcUri, QSize requestedSize) - : MediaThumbnailJob(mxcUri.authority(), - mxcUri.path().mid(1), // sans leading '/' - requestedSize) +MediaThumbnailJob::MediaThumbnailJob(QString serverName, QString mediaId, QSize requestedSize, + std::optional animated) + : BaseJob(HttpVerb::Get, QStringLiteral("MediaThumbnailJob"), {}) + , serverName(std::move(serverName)) + , mediaId(std::move(mediaId)) + , requestedSize(std::move(requestedSize)) + , animated(animated) { setLoggingCategory(THUMBNAILJOB); } +MediaThumbnailJob::MediaThumbnailJob(const QUrl& mxcUri, QSize requestedSize, + std::optional animated) + : MediaThumbnailJob(mxcUri.authority(), mxcUri.path().mid(1) /* sans leading '/' */, + requestedSize, animated) +{} + QImage MediaThumbnailJob::thumbnail() const { return _thumbnail; } QImage MediaThumbnailJob::scaledThumbnail(QSize toSize) const { - return _thumbnail.scaled(toSize, Qt::KeepAspectRatio, - Qt::SmoothTransformation); + return _thumbnail.scaled(toSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); +} + +void MediaThumbnailJob::doPrepare(const ConnectionData* connectionData) +{ + const auto url = makeRequestUrl(connectionData->homeserverData(), serverName, mediaId, + requestedSize, animated); + setApiEndpoint(url.toEncoded(QUrl::RemoveQuery | QUrl::RemoveFragment | QUrl::FullyEncoded)); + setRequestQuery(QUrlQuery{ url.query() }); } BaseJob::Status MediaThumbnailJob::prepareResult() { - if (_thumbnail.loadFromData(data()->readAll())) + if (_thumbnail.loadFromData(reply()->readAll())) return Success; return { IncorrectResponse, QStringLiteral("Could not read image data") }; diff --git a/Quotient/jobs/mediathumbnailjob.h b/Quotient/jobs/mediathumbnailjob.h index 957e7e0da..5d38eb429 100644 --- a/Quotient/jobs/mediathumbnailjob.h +++ b/Quotient/jobs/mediathumbnailjob.h @@ -3,30 +3,37 @@ #pragma once -#include +#include "basejob.h" #include namespace Quotient { -class QUOTIENT_API MediaThumbnailJob : public GetContentThumbnailJob { +class QUOTIENT_API MediaThumbnailJob : public BaseJob { public: - using GetContentThumbnailJob::makeRequestUrl; - static QUrl makeRequestUrl(QUrl baseUrl, const QUrl& mxcUri, - QSize requestedSize); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QUrl& mxcUri, + QSize requestedSize, std::optional animated = std::nullopt); + static QUrl makeRequestUrl(const HomeserverData& hsData, const QString& serverName, + const QString& mediaId, QSize requestedSize, + std::optional animated = std::nullopt); - MediaThumbnailJob(const QString& serverName, const QString& mediaId, - QSize requestedSize); - MediaThumbnailJob(const QUrl& mxcUri, QSize requestedSize); + MediaThumbnailJob(QString serverName, QString mediaId, QSize requestedSize, + std::optional animated = std::nullopt); + MediaThumbnailJob(const QUrl& mxcUri, QSize requestedSize, + std::optional animated = std::nullopt); QImage thumbnail() const; [[deprecated("Use thumbnail().scaled() instead")]] QImage scaledThumbnail(QSize toSize) const; -protected: - Status prepareResult() override; - private: + QString serverName; + QString mediaId; + QSize requestedSize; + std::optional animated; QImage _thumbnail; + + void doPrepare(const ConnectionData* connectionData) override; + Status prepareResult() override; }; inline auto collectResponse(const MediaThumbnailJob* j) { return j->thumbnail(); } diff --git a/Quotient/networkaccessmanager.cpp b/Quotient/networkaccessmanager.cpp index f27d796df..89d550d2f 100644 --- a/Quotient/networkaccessmanager.cpp +++ b/Quotient/networkaccessmanager.cpp @@ -3,6 +3,7 @@ #include "networkaccessmanager.h" +#include "connectiondata.h" #include "logging_categories_p.h" #include "mxcreply.h" @@ -21,20 +22,48 @@ using namespace Quotient; namespace { class { public: - void addBaseUrl(const QString& accountId, const QUrl& baseUrl) + struct ConnectionData { + QString accountId; + HomeserverData hsData; + }; + + void addConnection(QString accountId, QUrl baseUrl) + { + if (baseUrl.isEmpty()) + return; + + const QWriteLocker _(&namLock); + if (auto it = std::ranges::find(connectionData, accountId, &ConnectionData::accountId); + it != connectionData.end()) { + it->hsData.baseUrl = std::move(baseUrl); + } else + connectionData.push_back( + { std::move(accountId), HomeserverData{ std::move(baseUrl), {} } }); + } + void addSpecVersions(QStringView accountId, QStringList versions) { + if (versions.isEmpty()) + return; + const QWriteLocker _(&namLock); - baseUrls.insert(accountId, baseUrl); + auto it = std::ranges::find(connectionData, accountId, &ConnectionData::accountId); + if (ALARM_X(it == connectionData.end(), "Quotient::NAM: Trying to save supported spec " + "versions on an inexistent account")) + return; + + it->hsData.supportedSpecVersions = std::move(versions); } - void dropBaseUrl(const QString& accountId) + void dropConnection(QStringView accountId) { const QWriteLocker _(&namLock); - baseUrls.remove(accountId); + std::erase_if(connectionData, + [&accountId](const ConnectionData& cd) { return cd.accountId == accountId; }); } - QUrl getBaseUrl(const QString& accountId) const + HomeserverData getConnection(const QString& accountId) const { const QReadLocker _(&namLock); - return baseUrls.value(accountId); + auto it = std::ranges::find(connectionData, accountId, &ConnectionData::accountId); + return it == connectionData.cend() ? HomeserverData{ } : it->hsData; } void addIgnoredSslError(const QSslError& error) { @@ -54,22 +83,27 @@ class { private: mutable QReadWriteLock namLock{}; - QHash baseUrls{}; + std::vector connectionData{}; QList ignoredSslErrors{}; } d; } // anonymous namespace -void NetworkAccessManager::addBaseUrl(const QString& accountId, - const QUrl& homeserver) +void NetworkAccessManager::addAccount(QString accountId, QUrl homeserver) +{ + Q_ASSERT(!accountId.isEmpty()); + d.addConnection( accountId, std::move(homeserver)); +} + +void NetworkAccessManager::updateAccountSpecVersions(QStringView accountId, QStringList versions) { - Q_ASSERT(!accountId.isEmpty() && homeserver.isValid()); - d.addBaseUrl(accountId, homeserver); + Q_ASSERT(!accountId.isEmpty()); + d.addSpecVersions(accountId, std::move(versions)); } -void NetworkAccessManager::dropBaseUrl(const QString& accountId) +void NetworkAccessManager::dropAccount(QStringView accountId) { - d.dropBaseUrl(accountId); + d.dropConnection(accountId); } QList NetworkAccessManager::ignoredSslErrors() @@ -126,8 +160,8 @@ QNetworkReply* NetworkAccessManager::createRequest( << "No connection specified, cannot convert mxc request"; return new MxcReply(); } - const auto& baseUrl = d.getBaseUrl(accountId); - if (!baseUrl.isValid()) { + const auto& hsData = d.getConnection(accountId); + if (!hsData.baseUrl.isValid()) { // Strictly speaking, it should be an assert... qCCritical(NETWORK) << "Homeserver for" << accountId << "not found, cannot convert mxc request"; @@ -136,7 +170,7 @@ QNetworkReply* NetworkAccessManager::createRequest( // Convert mxc:// URL into normal http(s) for the given homeserver QNetworkRequest rewrittenRequest(request); - rewrittenRequest.setUrl(DownloadFileJob::makeRequestUrl(baseUrl, url)); + rewrittenRequest.setUrl(DownloadFileJob::makeRequestUrl(hsData, url)); auto* implReply = QNetworkAccessManager::createRequest(op, rewrittenRequest); implReply->ignoreSslErrors(d.getIgnoredSslErrors()); diff --git a/Quotient/networkaccessmanager.h b/Quotient/networkaccessmanager.h index 6aafcf33f..de8b35311 100644 --- a/Quotient/networkaccessmanager.h +++ b/Quotient/networkaccessmanager.h @@ -14,8 +14,9 @@ class QUOTIENT_API NetworkAccessManager : public QNetworkAccessManager { public: using QNetworkAccessManager::QNetworkAccessManager; - static void addBaseUrl(const QString& accountId, const QUrl& homeserver); - static void dropBaseUrl(const QString& accountId); + static void addAccount(QString accountId, QUrl homeserver); + static void updateAccountSpecVersions(QStringView accountId, QStringList versions); + static void dropAccount(QStringView accountId); static QList ignoredSslErrors(); static void addIgnoredSslError(const QSslError& error); diff --git a/Quotient/room.cpp b/Quotient/room.cpp index cd2b1b6c9..3a2d4996b 100644 --- a/Quotient/room.cpp +++ b/Quotient/room.cpp @@ -504,7 +504,7 @@ QString Room::version() const bool Room::isUnstable() const { - return !connection()->loadingCapabilities() + return connection()->capabilitiesReady() && !connection()->stableRoomVersions().contains(version()); } diff --git a/Quotient/util.cpp b/Quotient/util.cpp index db0edd0c8..dc3662a1f 100644 --- a/Quotient/util.cpp +++ b/Quotient/util.cpp @@ -126,7 +126,13 @@ int Quotient::minorVersion() return Quotient_VERSION_MINOR; } -int Quotient::patchVersion() +int Quotient::patchVersion() { return Quotient_VERSION_PATCH; } + +bool HomeserverData::checkMatrixSpecVersion(QStringView targetVersion) const { - return Quotient_VERSION_PATCH; + // TODO: Replace this naïve implementation with something smarter that can check things like + // 1.12 > 1.11 and maybe even 1.10 > 1.9 + return std::ranges::any_of(supportedSpecVersions, [targetVersion](const QString& v) { + return v.startsWith(targetVersion); + }); } diff --git a/Quotient/util.h b/Quotient/util.h index b84678897..187aa8e0b 100644 --- a/Quotient/util.h +++ b/Quotient/util.h @@ -6,15 +6,16 @@ #include "quotient_export.h" -#include -#include #include #include +#include +#include +#include #include -#include #include #include +#include #define QUO_IMPLICIT explicit(false) @@ -426,3 +427,10 @@ constexpr inline size_t mergeStruct(StructT& lhs, const StructT& rhs, const auto using UserId = QString; using RoomId = QString; using EventId = QString; + +struct QUOTIENT_API HomeserverData { + QUrl baseUrl; + QStringList supportedSpecVersions; + + bool checkMatrixSpecVersion(QStringView targetVersion) const; +}; diff --git a/gtad/operation.cpp.mustache b/gtad/operation.cpp.mustache index 6e466e6b9..02507d64c 100644 --- a/gtad/operation.cpp.mustache +++ b/gtad/operation.cpp.mustache @@ -19,10 +19,10 @@ auto queryTo{{>titleCaseOperationId}}( {{/queryParams?}} {{^hasBody?}} -QUrl {{>titleCaseOperationId}}Job::makeRequestUrl(QUrl baseUrl{{#allParams?}}, +QUrl {{>titleCaseOperationId}}Job::makeRequestUrl(const HomeserverData& hsData{{#allParams?}}, {{#allParams}}{{>joinedParamDef}}{{/allParams}}{{/allParams?}}) { - return BaseJob::makeRequestUrl(std::move(baseUrl), {{>passPathAndMaybeQuery}}); + return BaseJob::makeRequestUrl(hsData, {{>passPathAndMaybeQuery}}); } {{/hasBody?}} {{>titleCaseOperationId}}Job::{{>titleCaseOperationId}}Job( diff --git a/gtad/operation.h.mustache b/gtad/operation.h.mustache index ca7ff29ab..95d44e11b 100644 --- a/gtad/operation.h.mustache +++ b/gtad/operation.h.mustache @@ -41,7 +41,7 @@ public: //! //! This function can be used when a URL for {{>titleCaseOperationId}}Job //! is necessary but the job itself isn't. - static QUrl makeRequestUrl(QUrl baseUrl{{#allParams?}}, + static QUrl makeRequestUrl(const HomeserverData& hsData{{#allParams?}}, {{#allParams}}{{>joinedParamDecl}}{{/allParams}}{{/allParams?}}); {{/hasBody?}} {{#responses}}{{#normalResponse?}}{{#allProperties?}}