aboutsummaryrefslogtreecommitdiff
path: root/jobs
diff options
context:
space:
mode:
Diffstat (limited to 'jobs')
-rw-r--r--jobs/basejob.cpp35
-rw-r--r--jobs/converters.h6
-rw-r--r--jobs/mediathumbnailjob.cpp17
-rw-r--r--jobs/mediathumbnailjob.h5
-rw-r--r--jobs/setroomstatejob.cpp32
-rw-r--r--jobs/setroomstatejob.h65
-rw-r--r--jobs/syncjob.cpp41
-rw-r--r--jobs/syncjob.h20
8 files changed, 162 insertions, 59 deletions
diff --git a/jobs/basejob.cpp b/jobs/basejob.cpp
index 26ceb268..ea1a7158 100644
--- a/jobs/basejob.cpp
+++ b/jobs/basejob.cpp
@@ -24,6 +24,7 @@
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QtCore/QTimer>
+#include <QtCore/QStringBuilder>
#include <array>
@@ -76,7 +77,7 @@ class BaseJob::Private
inline QDebug operator<<(QDebug dbg, const BaseJob* j)
{
- return dbg << "Job" << j->objectName();
+ return dbg << j->objectName();
}
BaseJob::BaseJob(const ConnectionData* connection, HttpVerb verb,
@@ -89,7 +90,6 @@ BaseJob::BaseJob(const ConnectionData* connection, HttpVerb verb,
connect (&d->timer, &QTimer::timeout, this, &BaseJob::timeout);
d->retryTimer.setSingleShot(true);
connect (&d->retryTimer, &QTimer::timeout, this, &BaseJob::start);
- qCDebug(d->logCat) << this << "created";
}
BaseJob::~BaseJob()
@@ -159,11 +159,20 @@ void BaseJob::start()
{
emit aboutToStart();
d->retryTimer.stop(); // In case we were counting down at the moment
+ qCDebug(d->logCat) << this << "sending request to" << d->apiEndpoint;
+ if (!d->requestQuery.isEmpty())
+ qCDebug(d->logCat) << " query:" << d->requestQuery.toString();
d->sendRequest();
connect( d->reply.data(), &QNetworkReply::sslErrors, this, &BaseJob::sslErrors );
connect( d->reply.data(), &QNetworkReply::finished, this, &BaseJob::gotReply );
- d->timer.start(getCurrentTimeout());
- emit started();
+ if (d->reply->isRunning())
+ {
+ d->timer.start(getCurrentTimeout());
+ qCDebug(d->logCat) << this << "request has been sent";
+ emit started();
+ }
+ else
+ qCWarning(d->logCat) << this << "request could not start";
}
void BaseJob::gotReply()
@@ -219,16 +228,17 @@ BaseJob::Status BaseJob::parseJson(const QJsonDocument&)
void BaseJob::stop()
{
d->timer.stop();
- if (!d->reply)
- {
- qCWarning(d->logCat) << this << "stopped with empty network reply";
- }
- else if (d->reply->isRunning())
+ if (d->reply)
{
- qCWarning(d->logCat) << this << "stopped without ready network reply";
d->reply->disconnect(this); // Ignore whatever comes from the reply
- d->reply->abort();
+ if (d->reply->isRunning())
+ {
+ qCWarning(d->logCat) << this << "stopped without ready network reply";
+ d->reply->abort();
+ }
}
+ else
+ qCWarning(d->logCat) << this << "stopped with empty network reply";
}
void BaseJob::finishJob()
@@ -320,6 +330,9 @@ void BaseJob::setStatus(int code, QString message)
void BaseJob::abandon()
{
+ this->disconnect();
+ if (d->reply)
+ d->reply->disconnect(this);
deleteLater();
}
diff --git a/jobs/converters.h b/jobs/converters.h
index 376dfeab..f9ab0269 100644
--- a/jobs/converters.h
+++ b/jobs/converters.h
@@ -21,6 +21,7 @@
#include <QtCore/QJsonValue>
#include <QtCore/QJsonArray>
#include <QtCore/QDate>
+#include <QtCore/QVariant>
namespace QMatrixClient
{
@@ -83,7 +84,6 @@ namespace QMatrixClient
template <>
inline QDate fromJson<QDate>(const QJsonValue& jv)
{
- return QDateTime::fromMSecsSinceEpoch(
- fromJson<qint64>(jv), Qt::UTC).date();
+ return fromJson<QDateTime>(jv).date();
}
-} // namespace QMatrixClient \ No newline at end of file
+} // namespace QMatrixClient
diff --git a/jobs/mediathumbnailjob.cpp b/jobs/mediathumbnailjob.cpp
index 9bb731b9..9579f6b2 100644
--- a/jobs/mediathumbnailjob.cpp
+++ b/jobs/mediathumbnailjob.cpp
@@ -23,12 +23,6 @@
using namespace QMatrixClient;
-class MediaThumbnailJob::Private
-{
- public:
- QPixmap thumbnail;
-};
-
MediaThumbnailJob::MediaThumbnailJob(const ConnectionData* data, QUrl url, QSize requestedSize,
ThumbnailType thumbnailType)
: BaseJob(data, HttpVerb::Get, "MediaThumbnailJob",
@@ -39,22 +33,21 @@ MediaThumbnailJob::MediaThumbnailJob(const ConnectionData* data, QUrl url, QSize
, { "method",
thumbnailType == ThumbnailType::Scale ? "scale" : "crop" }
}))
- , d(new Private)
{ }
-MediaThumbnailJob::~MediaThumbnailJob()
+QPixmap MediaThumbnailJob::thumbnail()
{
- delete d;
+ return pixmap;
}
-QPixmap MediaThumbnailJob::thumbnail()
+QPixmap MediaThumbnailJob::scaledThumbnail(QSize toSize)
{
- return d->thumbnail;
+ return pixmap.scaled(toSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
}
BaseJob::Status MediaThumbnailJob::parseReply(QByteArray data)
{
- if( !d->thumbnail.loadFromData(data) )
+ if( !pixmap.loadFromData(data) )
{
qCDebug(JOBS) << "MediaThumbnailJob: could not read image data";
}
diff --git a/jobs/mediathumbnailjob.h b/jobs/mediathumbnailjob.h
index 307d0a99..186da829 100644
--- a/jobs/mediathumbnailjob.h
+++ b/jobs/mediathumbnailjob.h
@@ -31,15 +31,14 @@ namespace QMatrixClient
public:
MediaThumbnailJob(const ConnectionData* data, QUrl url, QSize requestedSize,
ThumbnailType thumbnailType=ThumbnailType::Scale);
- virtual ~MediaThumbnailJob();
QPixmap thumbnail();
+ QPixmap scaledThumbnail(QSize toSize);
protected:
Status parseReply(QByteArray data) override;
private:
- class Private;
- Private* d;
+ QPixmap pixmap;
};
}
diff --git a/jobs/setroomstatejob.cpp b/jobs/setroomstatejob.cpp
new file mode 100644
index 00000000..c2beb87b
--- /dev/null
+++ b/jobs/setroomstatejob.cpp
@@ -0,0 +1,32 @@
+/******************************************************************************
+ * Copyright (C) 2015 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 "setroomstatejob.h"
+
+using namespace QMatrixClient;
+
+BaseJob::Status SetRoomStateJob::parseJson(const QJsonDocument& data)
+{
+ _eventId = data.object().value("event_id").toString();
+ if (!_eventId.isEmpty())
+ return Success;
+
+ qCDebug(JOBS) << data;
+ return { UserDefinedError, "No event_id in the JSON response" };
+}
+
diff --git a/jobs/setroomstatejob.h b/jobs/setroomstatejob.h
new file mode 100644
index 00000000..1c72f31c
--- /dev/null
+++ b/jobs/setroomstatejob.h
@@ -0,0 +1,65 @@
+/******************************************************************************
+ * Copyright (C) 2015 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 "connectiondata.h"
+
+namespace QMatrixClient
+{
+ class SetRoomStateJob: public BaseJob
+ {
+ public:
+ /**
+ * Constructs a job that sets a state using an arbitrary room event
+ * with a state key.
+ */
+ template <typename EvT>
+ SetRoomStateJob(const ConnectionData* connection, const QString& roomId,
+ const EvT* event, const QString& stateKey)
+ : BaseJob(connection, HttpVerb::Put, "SetRoomStateJob",
+ QStringLiteral("_matrix/client/r0/rooms/%1/state/%2/%3")
+ .arg(roomId, EvT::TypeId, stateKey),
+ Query(),
+ Data(event->toJson()))
+ { }
+ /**
+ * Constructs a job that sets a state using an arbitrary room event
+ * without a state key.
+ */
+ template <typename EvT>
+ SetRoomStateJob(const ConnectionData* connection, const QString& roomId,
+ const EvT* event)
+ : BaseJob(connection, HttpVerb::Put, "SetRoomStateJob",
+ QStringLiteral("_matrix/client/r0/rooms/%1/state/%2")
+ .arg(roomId, EvT::TypeId),
+ Query(),
+ Data(event->toJson()))
+ { }
+
+ QString eventId() const { return _eventId; }
+
+ protected:
+ Status parseJson(const QJsonDocument& data) override;
+
+ private:
+ QString _eventId;
+ };
+} // namespace QMatrixClient
diff --git a/jobs/syncjob.cpp b/jobs/syncjob.cpp
index 38cfcb2a..f679e6f4 100644
--- a/jobs/syncjob.cpp
+++ b/jobs/syncjob.cpp
@@ -22,20 +22,12 @@
using namespace QMatrixClient;
-class SyncJob::Private
-{
- public:
- QString nextBatch;
- SyncData roomData;
-};
-
static size_t jobId = 0;
SyncJob::SyncJob(const ConnectionData* connection, const QString& since,
const QString& filter, int timeout, const QString& presence)
: BaseJob(connection, HttpVerb::Get, QString("SyncJob-%1").arg(++jobId),
"_matrix/client/r0/sync")
- , d(new Private)
{
setLoggingCategory(SYNCJOB);
QUrlQuery query;
@@ -52,47 +44,48 @@ SyncJob::SyncJob(const ConnectionData* connection, const QString& since,
setMaxRetries(std::numeric_limits<int>::max());
}
-SyncJob::~SyncJob()
+QString SyncData::nextBatch() const
{
- delete d;
+ return nextBatch_;
}
-QString SyncJob::nextBatch() const
+SyncDataList&& SyncData::takeRoomData()
{
- return d->nextBatch;
+ return std::move(roomData);
}
-SyncData&& SyncJob::takeRoomData()
+BaseJob::Status SyncJob::parseJson(const QJsonDocument& data)
{
- return std::move(d->roomData);
+ return d.parseJson(data);
}
-BaseJob::Status SyncJob::parseJson(const QJsonDocument& data)
+BaseJob::Status SyncData::parseJson(const QJsonDocument &data)
{
QElapsedTimer et; et.start();
+
QJsonObject json = data.object();
- d->nextBatch = json.value("next_batch").toString();
+ nextBatch_ = json.value("next_batch").toString();
// TODO: presence
// TODO: account_data
QJsonObject rooms = json.value("rooms").toObject();
- const struct { QString jsonKey; JoinState enumVal; } roomStates[]
+ static const struct { QString jsonKey; JoinState enumVal; } roomStates[]
{
{ "join", JoinState::Join },
{ "invite", JoinState::Invite },
{ "leave", JoinState::Leave }
};
- for (auto roomState: roomStates)
+ for (const auto& roomState: roomStates)
{
const QJsonObject rs = rooms.value(roomState.jsonKey).toObject();
// We have a Qt container on the right and an STL one on the left
- d->roomData.reserve(static_cast<size_t>(rs.size()));
- for( auto rkey: rs.keys() )
- d->roomData.emplace_back(rkey, roomState.enumVal, rs[rkey].toObject());
+ roomData.reserve(static_cast<size_t>(rs.size()));
+ for(auto roomIt = rs.begin(); roomIt != rs.end(); ++roomIt)
+ roomData.emplace_back(roomIt.key(), roomState.enumVal,
+ roomIt.value().toObject());
}
- qCDebug(PROFILER) << "*** SyncJob::parseJson():" << et.elapsed() << "ms";
-
- return Success;
+ qCDebug(PROFILER) << "*** SyncData::parseJson():" << et.elapsed() << "ms";
+ return BaseJob::Success;
}
SyncRoomData::SyncRoomData(const QString& roomId_, JoinState joinState_,
diff --git a/jobs/syncjob.h b/jobs/syncjob.h
index 57a87c9f..6697a265 100644
--- a/jobs/syncjob.h
+++ b/jobs/syncjob.h
@@ -66,7 +66,18 @@ Q_DECLARE_TYPEINFO(QMatrixClient::SyncRoomData, Q_MOVABLE_TYPE);
namespace QMatrixClient
{
// QVector cannot work with non-copiable objects, std::vector can.
- using SyncData = std::vector<SyncRoomData>;
+ using SyncDataList = std::vector<SyncRoomData>;
+
+ class SyncData {
+ public:
+ BaseJob::Status parseJson(const QJsonDocument &data);
+ SyncDataList&& takeRoomData();
+ QString nextBatch() const;
+
+ private:
+ QString nextBatch_;
+ SyncDataList roomData;
+ };
class SyncJob: public BaseJob
{
@@ -74,16 +85,13 @@ namespace QMatrixClient
explicit SyncJob(const ConnectionData* connection, const QString& since = {},
const QString& filter = {},
int timeout = -1, const QString& presence = {});
- virtual ~SyncJob();
- SyncData&& takeRoomData();
- QString nextBatch() const;
+ SyncData &&takeData() { return std::move(d); }
protected:
Status parseJson(const QJsonDocument& data) override;
private:
- class Private;
- Private* d;
+ SyncData d;
};
} // namespace QMatrixClient