From 76438ba95d16c7d007fc16ffc194889f937a19f7 Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Thu, 19 Oct 2017 19:36:10 +0900 Subject: Introduce device_id and initial_device_name support; switch to generated LoginJob This is _almost_ a backwards-compatible change, except that connect*() and other relevant methods in Connection are no more virtual (that wasn't much useful anyway). Otherwise it's a matter of passing initial_device_name to connectToServer(), saving device_id (along with access_token) from the result of LoginJob and then passing device_id (along with access_token, again) to connectWithToken() upon the next run. --- jobs/generated/login.cpp | 89 ++++++++++++++++++++++++++++++++++++++++++++++++ jobs/generated/login.h | 38 +++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 jobs/generated/login.cpp create mode 100644 jobs/generated/login.h (limited to 'jobs') diff --git a/jobs/generated/login.cpp b/jobs/generated/login.cpp new file mode 100644 index 00000000..6e8294e7 --- /dev/null +++ b/jobs/generated/login.cpp @@ -0,0 +1,89 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#include "login.h" + +#include "jobs/converters.h" +#include + +using namespace QMatrixClient; + +static const auto basePath = QStringLiteral("/_matrix/client/r0"); + +class LoginJob::Private +{ + public: + QString user_id; + QString access_token; + QString home_server; + QString device_id; + +}; + +LoginJob::LoginJob(QString type, QString user, QString medium, QString address, QString password, QString token, QString device_id, QString initial_device_display_name) + : BaseJob(HttpVerb::Post, "LoginJob", + basePath % "/login", + Query { }, Data { }, false + ), d(new Private) +{ + Data _data; + _data.insert("type", toJson(type)); + if (!user.isEmpty()) + _data.insert("user", toJson(user)); + if (!medium.isEmpty()) + _data.insert("medium", toJson(medium)); + if (!address.isEmpty()) + _data.insert("address", toJson(address)); + if (!password.isEmpty()) + _data.insert("password", toJson(password)); + if (!token.isEmpty()) + _data.insert("token", toJson(token)); + if (!device_id.isEmpty()) + _data.insert("device_id", toJson(device_id)); + if (!initial_device_display_name.isEmpty()) + _data.insert("initial_device_display_name", toJson(initial_device_display_name)); + setRequestData(_data); +} + +LoginJob::~LoginJob() +{ + delete d; +} + +const QString& LoginJob::user_id() const +{ + return d->user_id; +} + +const QString& LoginJob::access_token() const +{ + return d->access_token; +} + +const QString& LoginJob::home_server() const +{ + return d->home_server; +} + +const QString& LoginJob::device_id() const +{ + return d->device_id; +} + +BaseJob::Status LoginJob::parseJson(const QJsonDocument& data) +{ + auto json = data.object(); + + d->user_id = fromJson(json.value("user_id")); + + d->access_token = fromJson(json.value("access_token")); + + d->home_server = fromJson(json.value("home_server")); + + d->device_id = fromJson(json.value("device_id")); + + return Success; +} + diff --git a/jobs/generated/login.h b/jobs/generated/login.h new file mode 100644 index 00000000..dc89206d --- /dev/null +++ b/jobs/generated/login.h @@ -0,0 +1,38 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#pragma once + +#include "../basejob.h" + +#include + + +namespace QMatrixClient +{ + + // Operations + + class LoginJob : public BaseJob + { + public: + explicit LoginJob(QString type, QString user = {}, QString medium = {}, QString address = {}, QString password = {}, QString token = {}, QString device_id = {}, QString initial_device_display_name = {}); + + ~LoginJob() override; + + const QString& user_id() const; + const QString& access_token() const; + const QString& home_server() const; + const QString& device_id() const; + + protected: + Status parseJson(const QJsonDocument& data) override; + + private: + class Private; + Private* d; + }; + +} // namespace QMatrixClient -- cgit v1.2.3 From 6600905fb0704e0d22eb776167750f341e7f3d98 Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Wed, 25 Oct 2017 15:55:29 +0900 Subject: Fixed a typo in the logs --- jobs/basejob.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'jobs') diff --git a/jobs/basejob.cpp b/jobs/basejob.cpp index eb78dec8..aa47f63c 100644 --- a/jobs/basejob.cpp +++ b/jobs/basejob.cpp @@ -84,7 +84,7 @@ QDebug QMatrixClient::operator<<(QDebug dbg, const BaseJob::Status& s) { QRegularExpression filter { "(access_token)=[-_A-Za-z0-9]+" }; return dbg << s.code << ':' - << QString(s.message).replace(filter, "\1=HIDDEN"); + << QString(s.message).replace(filter, "\\1=HIDDEN"); } BaseJob::BaseJob(HttpVerb verb, const QString& name, const QString& endpoint, -- cgit v1.2.3 From a7f158d1cfdc5c572a62af5a6945e4a6b88e8253 Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Fri, 27 Oct 2017 21:22:04 +0300 Subject: Put access token to headers instead of query --- connection.cpp | 2 +- connectiondata.cpp | 6 +++--- connectiondata.h | 4 ++-- jobs/basejob.cpp | 11 +++++------ 4 files changed, 11 insertions(+), 12 deletions(-) (limited to 'jobs') diff --git a/connection.cpp b/connection.cpp index 427118c9..fdcfa680 100644 --- a/connection.cpp +++ b/connection.cpp @@ -131,7 +131,7 @@ void Connection::connectWithToken(const QString& userId, const QString& accessToken, const QString& deviceId) { d->userId = userId; - d->data->setToken(accessToken); + d->data->setToken(accessToken.toLatin1()); d->data->setDeviceId(deviceId); qCDebug(MAIN) << "Using server" << d->data->baseUrl() << "by user" << userId << "from device" << deviceId; diff --git a/connectiondata.cpp b/connectiondata.cpp index 9b9b6e04..6ef293cd 100644 --- a/connectiondata.cpp +++ b/connectiondata.cpp @@ -33,7 +33,7 @@ QNetworkAccessManager* getNam() struct ConnectionData::Private { QUrl baseUrl; - QString accessToken; + QByteArray accessToken; QString lastEvent; QString deviceId; @@ -52,7 +52,7 @@ ConnectionData::~ConnectionData() delete d; } -QString ConnectionData::accessToken() const +QByteArray ConnectionData::accessToken() const { return d->accessToken; } @@ -67,7 +67,7 @@ QNetworkAccessManager* ConnectionData::nam() const return getNam(); } -void ConnectionData::setToken(QString token) +void ConnectionData::setToken(QByteArray token) { d->accessToken = token; } diff --git a/connectiondata.h b/connectiondata.h index 52a7461c..933219ea 100644 --- a/connectiondata.h +++ b/connectiondata.h @@ -30,12 +30,12 @@ namespace QMatrixClient explicit ConnectionData(QUrl baseUrl); virtual ~ConnectionData(); - QString accessToken() const; + QByteArray accessToken() const; QUrl baseUrl() const; const QString& deviceId() const; QNetworkAccessManager* nam() const; - void setToken( QString accessToken ); + void setToken(QByteArray accessToken); void setHost( QString host ); void setPort( int port ); void setDeviceId(const QString& deviceId); diff --git a/jobs/basejob.cpp b/jobs/basejob.cpp index aa47f63c..20fb68f6 100644 --- a/jobs/basejob.cpp +++ b/jobs/basejob.cpp @@ -82,9 +82,9 @@ inline QDebug operator<<(QDebug dbg, const BaseJob* j) QDebug QMatrixClient::operator<<(QDebug dbg, const BaseJob::Status& s) { - QRegularExpression filter { "(access_token)=[-_A-Za-z0-9]+" }; + QRegularExpression filter { "(access_token)(=|: )[-_A-Za-z0-9]+" }; return dbg << s.code << ':' - << QString(s.message).replace(filter, "\\1=HIDDEN"); + << QString(s.message).replace(filter, "\\1 HIDDEN"); } BaseJob::BaseJob(HttpVerb verb, const QString& name, const QString& endpoint, @@ -138,13 +138,12 @@ void BaseJob::Private::sendRequest() { QUrl url = connection->baseUrl(); url.setPath( url.path() + "/" + apiEndpoint ); - QUrlQuery q = requestQuery; - if (needsToken) - q.addQueryItem("access_token", connection->accessToken()); - url.setQuery(q); + url.setQuery(requestQuery); QNetworkRequest req {url}; req.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + req.setRawHeader(QByteArray("Authorization"), + QByteArray("Bearer ") + connection->accessToken()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); req.setMaximumRedirectsAllowed(10); -- cgit v1.2.3 From 1cc5d08159936e87f7c1dc791d6ab3c0e46e7035 Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Wed, 1 Nov 2017 08:38:59 +0300 Subject: Move converters.h out of jobs/ Because they are applicable beyond jobs. --- converters.h | 121 ++++++++++++++++++++++++++++++++++++++++++++ jobs/converters.h | 121 -------------------------------------------- jobs/generated/banning.cpp | 2 +- jobs/generated/inviting.cpp | 2 +- jobs/generated/kicking.cpp | 2 +- jobs/generated/leaving.cpp | 2 +- jobs/generated/login.cpp | 2 +- jobs/generated/logout.cpp | 2 +- jobs/generated/profile.cpp | 2 +- 9 files changed, 128 insertions(+), 128 deletions(-) create mode 100644 converters.h delete mode 100644 jobs/converters.h (limited to 'jobs') diff --git a/converters.h b/converters.h new file mode 100644 index 00000000..f6e850c6 --- /dev/null +++ b/converters.h @@ -0,0 +1,121 @@ +/****************************************************************************** +* Copyright (C) 2017 Kitsune Ral +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#pragma once + +#include +#include // Includes +#include + +namespace QMatrixClient +{ + template + inline QJsonValue toJson(T val) + { + return QJsonValue(val); + } + + template + inline QJsonValue toJson(const QVector& vals) + { + QJsonArray ar; + for (const auto& v: vals) + ar.push_back(toJson(v)); + return ar; + } + + inline QJsonValue toJson(const QStringList& strings) + { + return QJsonArray::fromStringList(strings); + } + + template + struct FromJson + { + T operator()(QJsonValue jv) const { return static_cast(jv); } + }; + + template + inline T fromJson(const QJsonValue& jv) + { + return FromJson()(jv); + } + + template <> struct FromJson + { + bool operator()(QJsonValue jv) const { return jv.toBool(); } + }; + + template <> struct FromJson + { + int operator()(QJsonValue jv) const { return jv.toInt(); } + }; + + template <> struct FromJson + { + double operator()(QJsonValue jv) const { return jv.toDouble(); } + }; + + template <> struct FromJson + { + qint64 operator()(QJsonValue jv) const { return qint64(jv.toDouble()); } + }; + + template <> struct FromJson + { + QString operator()(QJsonValue jv) const { return jv.toString(); } + }; + + template <> struct FromJson + { + QDateTime operator()(QJsonValue jv) const + { + return QDateTime::fromMSecsSinceEpoch(fromJson(jv), Qt::UTC); + } + }; + + template <> struct FromJson + { + QDate operator()(QJsonValue jv) const + { + return fromJson(jv).date(); + } + }; + + template <> struct FromJson + { + QJsonObject operator()(QJsonValue jv) const { return jv.toObject(); } + }; + + template <> struct FromJson + { + QJsonArray operator()(QJsonValue jv) const { return jv.toArray(); } + }; + + template struct FromJson> + { + QVector operator()(QJsonValue jv) const + { + const auto jsonArray = jv.toArray(); + QVector vect; vect.resize(jsonArray.size()); + std::transform(jsonArray.begin(), jsonArray.end(), + vect.begin(), FromJson()); + return vect; + } + }; +} // namespace QMatrixClient diff --git a/jobs/converters.h b/jobs/converters.h deleted file mode 100644 index f6e850c6..00000000 --- a/jobs/converters.h +++ /dev/null @@ -1,121 +0,0 @@ -/****************************************************************************** -* Copyright (C) 2017 Kitsune Ral -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; either -* version 2.1 of the License, or (at your option) any later version. -* -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this library; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#pragma once - -#include -#include // Includes -#include - -namespace QMatrixClient -{ - template - inline QJsonValue toJson(T val) - { - return QJsonValue(val); - } - - template - inline QJsonValue toJson(const QVector& vals) - { - QJsonArray ar; - for (const auto& v: vals) - ar.push_back(toJson(v)); - return ar; - } - - inline QJsonValue toJson(const QStringList& strings) - { - return QJsonArray::fromStringList(strings); - } - - template - struct FromJson - { - T operator()(QJsonValue jv) const { return static_cast(jv); } - }; - - template - inline T fromJson(const QJsonValue& jv) - { - return FromJson()(jv); - } - - template <> struct FromJson - { - bool operator()(QJsonValue jv) const { return jv.toBool(); } - }; - - template <> struct FromJson - { - int operator()(QJsonValue jv) const { return jv.toInt(); } - }; - - template <> struct FromJson - { - double operator()(QJsonValue jv) const { return jv.toDouble(); } - }; - - template <> struct FromJson - { - qint64 operator()(QJsonValue jv) const { return qint64(jv.toDouble()); } - }; - - template <> struct FromJson - { - QString operator()(QJsonValue jv) const { return jv.toString(); } - }; - - template <> struct FromJson - { - QDateTime operator()(QJsonValue jv) const - { - return QDateTime::fromMSecsSinceEpoch(fromJson(jv), Qt::UTC); - } - }; - - template <> struct FromJson - { - QDate operator()(QJsonValue jv) const - { - return fromJson(jv).date(); - } - }; - - template <> struct FromJson - { - QJsonObject operator()(QJsonValue jv) const { return jv.toObject(); } - }; - - template <> struct FromJson - { - QJsonArray operator()(QJsonValue jv) const { return jv.toArray(); } - }; - - template struct FromJson> - { - QVector operator()(QJsonValue jv) const - { - const auto jsonArray = jv.toArray(); - QVector vect; vect.resize(jsonArray.size()); - std::transform(jsonArray.begin(), jsonArray.end(), - vect.begin(), FromJson()); - return vect; - } - }; -} // namespace QMatrixClient diff --git a/jobs/generated/banning.cpp b/jobs/generated/banning.cpp index 9fc5810a..c47d3419 100644 --- a/jobs/generated/banning.cpp +++ b/jobs/generated/banning.cpp @@ -5,7 +5,7 @@ #include "banning.h" -#include "jobs/converters.h" +#include "converters.h" #include using namespace QMatrixClient; diff --git a/jobs/generated/inviting.cpp b/jobs/generated/inviting.cpp index 95ba658d..11384c5e 100644 --- a/jobs/generated/inviting.cpp +++ b/jobs/generated/inviting.cpp @@ -5,7 +5,7 @@ #include "inviting.h" -#include "jobs/converters.h" +#include "converters.h" #include using namespace QMatrixClient; diff --git a/jobs/generated/kicking.cpp b/jobs/generated/kicking.cpp index 2e6797d6..e75b900a 100644 --- a/jobs/generated/kicking.cpp +++ b/jobs/generated/kicking.cpp @@ -5,7 +5,7 @@ #include "kicking.h" -#include "jobs/converters.h" +#include "converters.h" #include using namespace QMatrixClient; diff --git a/jobs/generated/leaving.cpp b/jobs/generated/leaving.cpp index 7fed347b..e443612e 100644 --- a/jobs/generated/leaving.cpp +++ b/jobs/generated/leaving.cpp @@ -5,7 +5,7 @@ #include "leaving.h" -#include "jobs/converters.h" +#include "converters.h" #include using namespace QMatrixClient; diff --git a/jobs/generated/login.cpp b/jobs/generated/login.cpp index 6e8294e7..0c57c684 100644 --- a/jobs/generated/login.cpp +++ b/jobs/generated/login.cpp @@ -5,7 +5,7 @@ #include "login.h" -#include "jobs/converters.h" +#include "converters.h" #include using namespace QMatrixClient; diff --git a/jobs/generated/logout.cpp b/jobs/generated/logout.cpp index b750efe2..a5848e7c 100644 --- a/jobs/generated/logout.cpp +++ b/jobs/generated/logout.cpp @@ -5,7 +5,7 @@ #include "logout.h" -#include "jobs/converters.h" +#include "converters.h" #include using namespace QMatrixClient; diff --git a/jobs/generated/profile.cpp b/jobs/generated/profile.cpp index 9d20a480..201bca79 100644 --- a/jobs/generated/profile.cpp +++ b/jobs/generated/profile.cpp @@ -5,7 +5,7 @@ #include "profile.h" -#include "jobs/converters.h" +#include "converters.h" #include using namespace QMatrixClient; -- cgit v1.2.3 From 491e392af73be3ebfd928e80efc0514fd43b8e87 Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Thu, 16 Nov 2017 14:10:08 +0900 Subject: Simplify code that loads events from JSON arrays --- events/event.h | 41 +++++++++++++++++++++++------------------ jobs/roommessagesjob.cpp | 4 ++-- jobs/syncjob.h | 5 ++--- 3 files changed, 27 insertions(+), 23 deletions(-) (limited to 'jobs') diff --git a/events/event.h b/events/event.h index c0c1b603..cc99b57b 100644 --- a/events/event.h +++ b/events/event.h @@ -63,6 +63,10 @@ namespace QMatrixClient // (and in most cases it will be a combination of other fields // instead of "content" field). + /** Create an event with proper type from a JSON object + * Use this factory to detect the type from the JSON object contents + * and create an event object of that type. + */ static Event* fromJson(const QJsonObject& obj); protected: @@ -77,26 +81,27 @@ namespace QMatrixClient Q_PROPERTY(QJsonObject contentJson READ contentJson CONSTANT) }; using EventType = Event::Type; - template - using EventsBatch = std::vector; - using Events = EventsBatch; - template > - inline BatchT makeEvents(const QJsonArray& objs) + template + class EventsBatch : public std::vector { - BatchT evs; - // The below line accommodates the difference in size types of - // STL and Qt containers. - evs.reserve(static_cast(objs.size())); - for (auto objValue: objs) - { - const auto o = objValue.toObject(); - auto e = BaseEventT::fromJson(o); - evs.push_back(e ? e : new BaseEventT(EventType::Unknown, o)); - } - return evs; - } + public: + void fromJson(const QJsonObject& container, const QString& node) + { + const auto objs = container.value(node).toArray(); + using size_type = typename std::vector::size_type; + // The below line accommodates the difference in size types of + // STL and Qt containers. + this->reserve(static_cast(objs.size())); + for (auto objValue: objs) + { + const auto o = objValue.toObject(); + auto e = EventT::fromJson(o); + this->push_back(e ? e : new EventT(EventType::Unknown, o)); + } + } + }; + using Events = EventsBatch; /** This class corresponds to m.room.* events */ class RoomEvent : public Event diff --git a/jobs/roommessagesjob.cpp b/jobs/roommessagesjob.cpp index 078c692a..c527cc71 100644 --- a/jobs/roommessagesjob.cpp +++ b/jobs/roommessagesjob.cpp @@ -58,8 +58,8 @@ QString RoomMessagesJob::end() const BaseJob::Status RoomMessagesJob::parseJson(const QJsonDocument& data) { - QJsonObject obj = data.object(); - d->events.assign(makeEvents(obj.value("chunk").toArray())); + const auto obj = data.object(); + d->events.fromJson(obj, "chunk"); d->end = obj.value("end").toString(); return Success; } diff --git a/jobs/syncjob.h b/jobs/syncjob.h index b1db914d..08bd773e 100644 --- a/jobs/syncjob.h +++ b/jobs/syncjob.h @@ -36,11 +36,10 @@ namespace QMatrixClient explicit Batch(QString k) : jsonKey(std::move(k)) { } void fromJson(const QJsonObject& roomContents) { - this->assign(makeEvents( - roomContents[jsonKey].toObject()["events"].toArray())); + EventsBatch::fromJson( + roomContents[jsonKey].toObject(), "events"); } - private: QString jsonKey; }; -- cgit v1.2.3 From fed4b4fe965a9e2788055b602c7217cb298f5fce Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Tue, 21 Nov 2017 16:54:39 +0900 Subject: Mitigate the mess with slashes between base URL and endpoint string Closes #125 --- jobs/basejob.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'jobs') diff --git a/jobs/basejob.cpp b/jobs/basejob.cpp index 20fb68f6..9d5c5ed6 100644 --- a/jobs/basejob.cpp +++ b/jobs/basejob.cpp @@ -137,7 +137,11 @@ void BaseJob::setRequestData(const BaseJob::Data& data) void BaseJob::Private::sendRequest() { QUrl url = connection->baseUrl(); - url.setPath( url.path() + "/" + apiEndpoint ); + QString path = url.path(); + if (!path.endsWith('/') && !apiEndpoint.startsWith('/')) + path.push_back('/'); + + url.setPath( path + apiEndpoint ); url.setQuery(requestQuery); QNetworkRequest req {url}; @@ -207,6 +211,7 @@ void BaseJob::gotReply() BaseJob::Status BaseJob::checkReply(QNetworkReply* reply) const { + qCDebug(d->logCat) << this << "returned from" << reply->url().toDisplayString(); if (reply->error() != QNetworkReply::NoError) qCDebug(d->logCat) << this << "returned" << reply->error(); switch( reply->error() ) -- cgit v1.2.3 From 128b7259a7f6cc39545711323a074103ea9520f7 Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Tue, 21 Nov 2017 17:33:26 +0900 Subject: Use QStringLiteral instead of bare QString constructors for string constants For job endpoints, we should eventually move to QLatin1String or QByteArray instead. Maybe later. --- jobs/joinroomjob.cpp | 2 +- jobs/roommessagesjob.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'jobs') diff --git a/jobs/joinroomjob.cpp b/jobs/joinroomjob.cpp index d465dd42..66a75089 100644 --- a/jobs/joinroomjob.cpp +++ b/jobs/joinroomjob.cpp @@ -29,7 +29,7 @@ class JoinRoomJob::Private JoinRoomJob::JoinRoomJob(const QString& roomAlias) : BaseJob(HttpVerb::Post, "JoinRoomJob", - QString("_matrix/client/r0/join/%1").arg(roomAlias)) + QStringLiteral("_matrix/client/r0/join/%1").arg(roomAlias)) , d(new Private) { } diff --git a/jobs/roommessagesjob.cpp b/jobs/roommessagesjob.cpp index c527cc71..9af1b3a6 100644 --- a/jobs/roommessagesjob.cpp +++ b/jobs/roommessagesjob.cpp @@ -30,7 +30,7 @@ class RoomMessagesJob::Private RoomMessagesJob::RoomMessagesJob(const QString& roomId, const QString& from, int limit, FetchDirection dir) : BaseJob(HttpVerb::Get, "RoomMessagesJob", - QString("/_matrix/client/r0/rooms/%1/messages").arg(roomId), + QStringLiteral("/_matrix/client/r0/rooms/%1/messages").arg(roomId), Query( { { "from", from } , { "dir", dir == FetchDirection::Backward ? "b" : "f" } -- cgit v1.2.3