aboutsummaryrefslogtreecommitdiff
path: root/lib/jobs
diff options
context:
space:
mode:
authorKitsune Ral <Kitsune-Ral@users.sf.net>2018-05-03 21:23:28 +0900
committerKitsune Ral <Kitsune-Ral@users.sf.net>2018-05-03 22:47:43 +0900
commit564d518c086f2aeab0f0466b7cd1915e20edc7da (patch)
treef7e704855739b80728e51eb8187a932b3df78b73 /lib/jobs
parentd304c1b9ac7a86096899b459eba8e36ed310b6ce (diff)
downloadlibquotient-564d518c086f2aeab0f0466b7cd1915e20edc7da.tar.gz
libquotient-564d518c086f2aeab0f0466b7cd1915e20edc7da.zip
GetRoomEventsJob (replaces RoomMessagesJob) + refactoring
1. Updates in this commit (see further) allow to generate and build GetRoomEventsJob from message_pagination.yaml; this job completely preempts RoomMessagesJob. 2. EventsBatch<> is no more a thing; there's EventsArray<> to replace it but it's loaded from a JSON array rather than an event batch (a JSON array inside another JSON object). SyncJob that used it extensively has been moved to "conventional" containers (Events, RoomEvents and the newly introduced StateEvents). RoomMessagesJob that also used EventsBatch<> is decommissioned (see above). 3. RoomEventsRange is now an alias for Range<RoomEvents>, defined in util.h (otherwise almost the same). 4. Connection::getMessages() is no more. Use Room::getPreviousContent() and Connection::callApi<GetRooMEventsJob>() instead. 5. Moving things around in Room, since SyncJob now supplies state events in more specific StateEvents, rather than RoomEvents.
Diffstat (limited to 'lib/jobs')
-rw-r--r--lib/jobs/generated/message_pagination.cpp76
-rw-r--r--lib/jobs/generated/message_pagination.h40
-rw-r--r--lib/jobs/roommessagesjob.cpp65
-rw-r--r--lib/jobs/roommessagesjob.h47
-rw-r--r--lib/jobs/syncjob.cpp43
-rw-r--r--lib/jobs/syncjob.h27
6 files changed, 143 insertions, 155 deletions
diff --git a/lib/jobs/generated/message_pagination.cpp b/lib/jobs/generated/message_pagination.cpp
new file mode 100644
index 00000000..f89ccd03
--- /dev/null
+++ b/lib/jobs/generated/message_pagination.cpp
@@ -0,0 +1,76 @@
+/******************************************************************************
+ * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN
+ */
+
+#include "message_pagination.h"
+
+#include "converters.h"
+
+#include <QtCore/QStringBuilder>
+
+using namespace QMatrixClient;
+
+static const auto basePath = QStringLiteral("/_matrix/client/r0");
+
+class GetRoomEventsJob::Private
+{
+ public:
+ QString begin;
+ QString end;
+ RoomEvents chunk;
+};
+
+BaseJob::Query queryToGetRoomEvents(const QString& from, const QString& to, const QString& dir, int limit, const QString& filter)
+{
+ BaseJob::Query _q;
+ _q.addQueryItem("from", from);
+ if (!to.isEmpty())
+ _q.addQueryItem("to", to);
+ _q.addQueryItem("dir", dir);
+ _q.addQueryItem("limit", QString("%1").arg(limit));
+ if (!filter.isEmpty())
+ _q.addQueryItem("filter", filter);
+ return _q;
+}
+
+QUrl GetRoomEventsJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& from, const QString& dir, const QString& to, int limit, const QString& filter)
+{
+ return BaseJob::makeRequestUrl(std::move(baseUrl),
+ basePath % "/rooms/" % roomId % "/messages",
+ queryToGetRoomEvents(from, to, dir, limit, filter));
+}
+
+GetRoomEventsJob::GetRoomEventsJob(const QString& roomId, const QString& from, const QString& dir, const QString& to, int limit, const QString& filter)
+ : BaseJob(HttpVerb::Get, "GetRoomEventsJob",
+ basePath % "/rooms/" % roomId % "/messages",
+ queryToGetRoomEvents(from, to, dir, limit, filter))
+ , d(new Private)
+{
+}
+
+GetRoomEventsJob::~GetRoomEventsJob() = default;
+
+const QString& GetRoomEventsJob::begin() const
+{
+ return d->begin;
+}
+
+const QString& GetRoomEventsJob::end() const
+{
+ return d->end;
+}
+
+RoomEvents&& GetRoomEventsJob::chunk()
+{
+ return std::move(d->chunk);
+}
+
+BaseJob::Status GetRoomEventsJob::parseJson(const QJsonDocument& data)
+{
+ auto json = data.object();
+ d->begin = fromJson<QString>(json.value("start"));
+ d->end = fromJson<QString>(json.value("end"));
+ d->chunk = fromJson<RoomEvents>(json.value("chunk"));
+ return Success;
+}
+
diff --git a/lib/jobs/generated/message_pagination.h b/lib/jobs/generated/message_pagination.h
new file mode 100644
index 00000000..b8588ad1
--- /dev/null
+++ b/lib/jobs/generated/message_pagination.h
@@ -0,0 +1,40 @@
+/******************************************************************************
+ * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN
+ */
+
+#pragma once
+
+#include "../basejob.h"
+
+#include "events/event.h"
+
+
+namespace QMatrixClient
+{
+ // Operations
+
+ class GetRoomEventsJob : public BaseJob
+ {
+ public:
+ /** Construct a URL out of baseUrl and usual parameters passed to
+ * GetRoomEventsJob. 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& from, const QString& dir, const QString& to = {}, int limit = {}, const QString& filter = {});
+
+ explicit GetRoomEventsJob(const QString& roomId, const QString& from, const QString& dir, const QString& to = {}, int limit = {}, const QString& filter = {});
+ ~GetRoomEventsJob() override;
+
+ const QString& begin() const;
+ const QString& end() const;
+ RoomEvents&& chunk();
+
+ protected:
+ Status parseJson(const QJsonDocument& data) override;
+
+ private:
+ class Private;
+ QScopedPointer<Private> d;
+ };
+} // namespace QMatrixClient
diff --git a/lib/jobs/roommessagesjob.cpp b/lib/jobs/roommessagesjob.cpp
deleted file mode 100644
index e5568f17..00000000
--- a/lib/jobs/roommessagesjob.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2016 Felix Rohrbach <kde@fxrh.de>
- *
- * 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
- */
-
-#include "roommessagesjob.h"
-
-using namespace QMatrixClient;
-
-class RoomMessagesJob::Private
-{
- public:
- RoomEvents events;
- QString end;
-};
-
-RoomMessagesJob::RoomMessagesJob(const QString& roomId, const QString& from,
- int limit, FetchDirection dir)
- : BaseJob(HttpVerb::Get, "RoomMessagesJob",
- QStringLiteral("/_matrix/client/r0/rooms/%1/messages").arg(roomId),
- Query(
- { { "from", from }
- , { "dir", dir == FetchDirection::Backward ? "b" : "f" }
- , { "limit", QString::number(limit) }
- }))
- , d(new Private)
-{
- qCDebug(JOBS) << "Room messages query:" << query().toString(QUrl::PrettyDecoded);
-}
-
-RoomMessagesJob::~RoomMessagesJob()
-{
- delete d;
-}
-
-RoomEvents&& RoomMessagesJob::releaseEvents()
-{
- return move(d->events);
-}
-
-QString RoomMessagesJob::end() const
-{
- return d->end;
-}
-
-BaseJob::Status RoomMessagesJob::parseJson(const QJsonDocument& data)
-{
- const auto obj = data.object();
- d->events.fromJson(obj, "chunk");
- d->end = obj.value("end").toString();
- return Success;
-}
diff --git a/lib/jobs/roommessagesjob.h b/lib/jobs/roommessagesjob.h
deleted file mode 100644
index 7b3fd9c9..00000000
--- a/lib/jobs/roommessagesjob.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2016 Felix Rohrbach <kde@fxrh.de>
- *
- * 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 "basejob.h"
-
-#include "../events/event.h"
-
-namespace QMatrixClient
-{
- enum class FetchDirection { Backward, Forward };
-
- class RoomMessagesJob: public BaseJob
- {
- public:
- RoomMessagesJob(const QString& roomId, const QString& from,
- int limit = 10,
- FetchDirection dir = FetchDirection::Backward);
- virtual ~RoomMessagesJob();
-
- RoomEvents&& releaseEvents();
- QString end() const;
-
- protected:
- Status parseJson(const QJsonDocument& data) override;
-
- private:
- class Private;
- Private* d;
- };
-} // namespace QMatrixClient
diff --git a/lib/jobs/syncjob.cpp b/lib/jobs/syncjob.cpp
index 435dfd0e..a739ea0d 100644
--- a/lib/jobs/syncjob.cpp
+++ b/lib/jobs/syncjob.cpp
@@ -54,11 +54,17 @@ SyncDataList&& SyncData::takeRoomData()
return std::move(roomData);
}
-SyncBatch<Event>&& SyncData::takeAccountData()
+Events&& SyncData::takeAccountData()
{
return std::move(accountData);
}
+template <typename EventsArrayT, typename StrT>
+inline EventsArrayT load(const QJsonObject& batches, StrT keyName)
+{
+ return fromJson<EventsArrayT>(batches[keyName].toObject().value("events"));
+}
+
BaseJob::Status SyncJob::parseJson(const QJsonDocument& data)
{
return d.parseJson(data);
@@ -71,7 +77,7 @@ BaseJob::Status SyncData::parseJson(const QJsonDocument &data)
auto json = data.object();
nextBatch_ = json.value("next_batch").toString();
// TODO: presence
- accountData.fromJson(json);
+ accountData = load<Events>(json, "account_data");
QJsonObject rooms = json.value("rooms").toObject();
JoinStates::Int ii = 1; // ii is used to make a JoinState value
@@ -96,33 +102,26 @@ SyncRoomData::SyncRoomData(const QString& roomId_, JoinState joinState_,
const QJsonObject& room_)
: roomId(roomId_)
, joinState(joinState_)
- , state(joinState == JoinState::Invite ? "invite_state" : "state")
- , timeline("timeline")
- , ephemeral("ephemeral")
- , accountData("account_data")
+ , state(load<StateEvents>(room_,
+ joinState == JoinState::Invite ? "invite_state" : "state"))
{
switch (joinState) {
- case JoinState::Invite:
- state.fromJson(room_);
- break;
case JoinState::Join:
- state.fromJson(room_);
- timeline.fromJson(room_);
- ephemeral.fromJson(room_);
- accountData.fromJson(room_);
- break;
+ ephemeral = load<Events>(room_, "ephemeral");
+ accountData = load<Events>(room_, "account_data");
+ // [[fallthrough]]
case JoinState::Leave:
- state.fromJson(room_);
- timeline.fromJson(room_);
+ {
+ timeline = load<RoomEvents>(room_, "timeline");
+ auto timelineJson = room_.value("timeline").toObject();
+ timelineLimited = timelineJson.value("limited").toBool();
+ timelinePrevBatch = timelineJson.value("prev_batch").toString();
+
break;
- default:
- qCWarning(SYNCJOB) << "SyncRoomData: Unknown JoinState value, ignoring:" << int(joinState);
+ }
+ default: /* nothing on top of state */;
}
- auto timelineJson = room_.value("timeline").toObject();
- timelineLimited = timelineJson.value("limited").toBool();
- timelinePrevBatch = timelineJson.value("prev_batch").toString();
-
auto unreadJson = room_.value("unread_notifications").toObject();
unreadCount = unreadJson.value(UnreadCountKey).toInt(-2);
highlightCount = unreadJson.value("highlight_count").toInt();
diff --git a/lib/jobs/syncjob.h b/lib/jobs/syncjob.h
index 919060be..b12f9fff 100644
--- a/lib/jobs/syncjob.h
+++ b/lib/jobs/syncjob.h
@@ -26,30 +26,15 @@
namespace QMatrixClient
{
- template <typename EventT>
- class SyncBatch : public EventsBatch<EventT>
- {
- public:
- explicit SyncBatch(QString k) : jsonKey(std::move(k)) { }
- void fromJson(const QJsonObject& roomContents)
- {
- EventsBatch<EventT>::fromJson(
- roomContents[jsonKey].toObject(), "events");
- }
-
- private:
- QString jsonKey;
- };
-
class SyncRoomData
{
public:
QString roomId;
JoinState joinState;
- SyncBatch<RoomEvent> state;
- SyncBatch<RoomEvent> timeline;
- SyncBatch<Event> ephemeral;
- SyncBatch<Event> accountData;
+ StateEvents state;
+ RoomEvents timeline;
+ Events ephemeral;
+ Events accountData;
bool timelineLimited;
QString timelinePrevBatch;
@@ -71,13 +56,13 @@ namespace QMatrixClient
{
public:
BaseJob::Status parseJson(const QJsonDocument &data);
- SyncBatch<Event>&& takeAccountData();
+ Events&& takeAccountData();
SyncDataList&& takeRoomData();
QString nextBatch() const;
private:
QString nextBatch_;
- SyncBatch<Event> accountData { "account_data" };
+ Events accountData;
SyncDataList roomData;
};