aboutsummaryrefslogtreecommitdiff
path: root/lib/jobs
diff options
context:
space:
mode:
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;
};