diff options
author | Kitsune Ral <Kitsune-Ral@users.sf.net> | 2018-06-08 17:07:33 +0900 |
---|---|---|
committer | Kitsune Ral <Kitsune-Ral@users.sf.net> | 2018-06-08 17:07:33 +0900 |
commit | c5ebff775e71b5d32a3b2af8f666e3f13f8970c2 (patch) | |
tree | f9eb65490277da58e5aab367ca4af35220d24f72 | |
parent | b28e2d697842f58e2994ead62635b31f48162cdc (diff) | |
download | libquotient-c5ebff775e71b5d32a3b2af8f666e3f13f8970c2.tar.gz libquotient-c5ebff775e71b5d32a3b2af8f666e3f13f8970c2.zip |
csapi: add jobs for keys management
This concludes the Great Income of Jobs to libQMatrixClient - all CS API calls
are now covered with job classes, yay!
-rw-r--r-- | lib/csapi/definitions/device_keys.cpp | 37 | ||||
-rw-r--r-- | lib/csapi/definitions/device_keys.h | 32 | ||||
-rw-r--r-- | lib/csapi/keys.cpp | 206 | ||||
-rw-r--r-- | lib/csapi/keys.h | 115 |
4 files changed, 390 insertions, 0 deletions
diff --git a/lib/csapi/definitions/device_keys.cpp b/lib/csapi/definitions/device_keys.cpp new file mode 100644 index 00000000..24357993 --- /dev/null +++ b/lib/csapi/definitions/device_keys.cpp @@ -0,0 +1,37 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + +#include "device_keys.h" + +using namespace QMatrixClient; + +QJsonObject QMatrixClient::toJson(const DeviceKeys& pod) +{ + QJsonObject _json; + addToJson<>(_json, "user_id", pod.userId); + addToJson<>(_json, "device_id", pod.deviceId); + addToJson<>(_json, "algorithms", pod.algorithms); + addToJson<>(_json, "keys", pod.keys); + addToJson<>(_json, "signatures", pod.signatures); + return _json; +} + +DeviceKeys FromJson<DeviceKeys>::operator()(const QJsonValue& jv) +{ + const auto& _json = jv.toObject(); + DeviceKeys result; + result.userId = + fromJson<QString>(_json.value("user_id")); + result.deviceId = + fromJson<QString>(_json.value("device_id")); + result.algorithms = + fromJson<QStringList>(_json.value("algorithms")); + result.keys = + fromJson<QHash<QString, QString>>(_json.value("keys")); + result.signatures = + fromJson<QHash<QString, QHash<QString, QString>>>(_json.value("signatures")); + + return result; +} + diff --git a/lib/csapi/definitions/device_keys.h b/lib/csapi/definitions/device_keys.h new file mode 100644 index 00000000..895700c1 --- /dev/null +++ b/lib/csapi/definitions/device_keys.h @@ -0,0 +1,32 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + +#pragma once + + +#include <QtCore/QHash> + +#include "converters.h" + +namespace QMatrixClient +{ + // Data structures + + struct DeviceKeys + { + QString userId; + QString deviceId; + QStringList algorithms; + QHash<QString, QString> keys; + QHash<QString, QHash<QString, QString>> signatures; + }; + + QJsonObject toJson(const DeviceKeys& pod); + + template <> struct FromJson<DeviceKeys> + { + DeviceKeys operator()(const QJsonValue& jv); + }; + +} // namespace QMatrixClient diff --git a/lib/csapi/keys.cpp b/lib/csapi/keys.cpp new file mode 100644 index 00000000..2d6885dd --- /dev/null +++ b/lib/csapi/keys.cpp @@ -0,0 +1,206 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + +#include "keys.h" + +#include "converters.h" + +#include <QtCore/QStringBuilder> + +using namespace QMatrixClient; + +static const auto basePath = QStringLiteral("/_matrix/client/r0"); + +class UploadKeysJob::Private +{ + public: + QHash<QString, int> oneTimeKeyCounts; +}; + +UploadKeysJob::UploadKeysJob(const Omittable<DeviceKeys>& deviceKeys, const QHash<QString, QVariant>& oneTimeKeys) + : BaseJob(HttpVerb::Post, "UploadKeysJob", + basePath % "/keys/upload") + , d(new Private) +{ + QJsonObject _data; + addToJson<IfNotEmpty>(_data, "device_keys", deviceKeys); + addToJson<IfNotEmpty>(_data, "one_time_keys", oneTimeKeys); + setRequestData(_data); +} + +UploadKeysJob::~UploadKeysJob() = default; + +const QHash<QString, int>& UploadKeysJob::oneTimeKeyCounts() const +{ + return d->oneTimeKeyCounts; +} + +BaseJob::Status UploadKeysJob::parseJson(const QJsonDocument& data) +{ + auto json = data.object(); + if (!json.contains("one_time_key_counts")) + return { JsonParseError, + "The key 'one_time_key_counts' not found in the response" }; + d->oneTimeKeyCounts = fromJson<QHash<QString, int>>(json.value("one_time_key_counts")); + return Success; +} + +namespace QMatrixClient +{ + // Converters + + template <> struct FromJson<QueryKeysJob::UnsignedDeviceInfo> + { + QueryKeysJob::UnsignedDeviceInfo operator()(const QJsonValue& jv) + { + const auto& _json = jv.toObject(); + QueryKeysJob::UnsignedDeviceInfo result; + result.deviceDisplayName = + fromJson<QString>(_json.value("device_display_name")); + + return result; + } + }; + + template <> struct FromJson<QueryKeysJob::DeviceInformation> + { + QueryKeysJob::DeviceInformation operator()(const QJsonValue& jv) + { + const auto& _json = jv.toObject(); + QueryKeysJob::DeviceInformation result; + result.unsignedData = + fromJson<QueryKeysJob::UnsignedDeviceInfo>(_json.value("unsigned")); + + return result; + } + }; +} // namespace QMatrixClient + +class QueryKeysJob::Private +{ + public: + QHash<QString, QJsonObject> failures; + QHash<QString, QHash<QString, DeviceInformation>> deviceKeys; +}; + +QueryKeysJob::QueryKeysJob(const QHash<QString, QStringList>& deviceKeys, Omittable<int> timeout, const QString& token) + : BaseJob(HttpVerb::Post, "QueryKeysJob", + basePath % "/keys/query") + , d(new Private) +{ + QJsonObject _data; + addToJson<IfNotEmpty>(_data, "timeout", timeout); + addToJson<>(_data, "device_keys", deviceKeys); + addToJson<IfNotEmpty>(_data, "token", token); + setRequestData(_data); +} + +QueryKeysJob::~QueryKeysJob() = default; + +const QHash<QString, QJsonObject>& QueryKeysJob::failures() const +{ + return d->failures; +} + +const QHash<QString, QHash<QString, QueryKeysJob::DeviceInformation>>& QueryKeysJob::deviceKeys() const +{ + return d->deviceKeys; +} + +BaseJob::Status QueryKeysJob::parseJson(const QJsonDocument& data) +{ + auto json = data.object(); + d->failures = fromJson<QHash<QString, QJsonObject>>(json.value("failures")); + d->deviceKeys = fromJson<QHash<QString, QHash<QString, DeviceInformation>>>(json.value("device_keys")); + return Success; +} + +class ClaimKeysJob::Private +{ + public: + QHash<QString, QJsonObject> failures; + QHash<QString, QHash<QString, QVariant>> oneTimeKeys; +}; + +ClaimKeysJob::ClaimKeysJob(const QHash<QString, QHash<QString, QString>>& oneTimeKeys, Omittable<int> timeout) + : BaseJob(HttpVerb::Post, "ClaimKeysJob", + basePath % "/keys/claim") + , d(new Private) +{ + QJsonObject _data; + addToJson<IfNotEmpty>(_data, "timeout", timeout); + addToJson<>(_data, "one_time_keys", oneTimeKeys); + setRequestData(_data); +} + +ClaimKeysJob::~ClaimKeysJob() = default; + +const QHash<QString, QJsonObject>& ClaimKeysJob::failures() const +{ + return d->failures; +} + +const QHash<QString, QHash<QString, QVariant>>& ClaimKeysJob::oneTimeKeys() const +{ + return d->oneTimeKeys; +} + +BaseJob::Status ClaimKeysJob::parseJson(const QJsonDocument& data) +{ + auto json = data.object(); + d->failures = fromJson<QHash<QString, QJsonObject>>(json.value("failures")); + d->oneTimeKeys = fromJson<QHash<QString, QHash<QString, QVariant>>>(json.value("one_time_keys")); + return Success; +} + +class GetKeysChangesJob::Private +{ + public: + QStringList changed; + QStringList left; +}; + +BaseJob::Query queryToGetKeysChanges(const QString& from, const QString& to) +{ + BaseJob::Query _q; + _q.addQueryItem("from", from); + _q.addQueryItem("to", to); + return _q; +} + +QUrl GetKeysChangesJob::makeRequestUrl(QUrl baseUrl, const QString& from, const QString& to) +{ + return BaseJob::makeRequestUrl(std::move(baseUrl), + basePath % "/keys/changes", + queryToGetKeysChanges(from, to)); +} + +GetKeysChangesJob::GetKeysChangesJob(const QString& from, const QString& to) + : BaseJob(HttpVerb::Get, "GetKeysChangesJob", + basePath % "/keys/changes", + queryToGetKeysChanges(from, to)) + , d(new Private) +{ +} + +GetKeysChangesJob::~GetKeysChangesJob() = default; + +const QStringList& GetKeysChangesJob::changed() const +{ + return d->changed; +} + +const QStringList& GetKeysChangesJob::left() const +{ + return d->left; +} + +BaseJob::Status GetKeysChangesJob::parseJson(const QJsonDocument& data) +{ + auto json = data.object(); + d->changed = fromJson<QStringList>(json.value("changed")); + d->left = fromJson<QStringList>(json.value("left")); + return Success; +} + diff --git a/lib/csapi/keys.h b/lib/csapi/keys.h new file mode 100644 index 00000000..d4b0f62f --- /dev/null +++ b/lib/csapi/keys.h @@ -0,0 +1,115 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + +#pragma once + +#include "jobs/basejob.h" + +#include "csapi/definitions/device_keys.h" +#include <QtCore/QHash> +#include "converters.h" +#include <QtCore/QVariant> +#include <QtCore/QJsonObject> + +namespace QMatrixClient +{ + // Operations + + class UploadKeysJob : public BaseJob + { + public: + explicit UploadKeysJob(const Omittable<DeviceKeys>& deviceKeys = none, const QHash<QString, QVariant>& oneTimeKeys = {}); + ~UploadKeysJob() override; + + // Result properties + + const QHash<QString, int>& oneTimeKeyCounts() const; + + protected: + Status parseJson(const QJsonDocument& data) override; + + private: + class Private; + QScopedPointer<Private> d; + }; + + class QueryKeysJob : public BaseJob + { + public: + // Inner data structures + + struct UnsignedDeviceInfo + { + QString deviceDisplayName; + }; + + struct DeviceInformation : DeviceKeys + { + Omittable<UnsignedDeviceInfo> unsignedData; + }; + + // Construction/destruction + + explicit QueryKeysJob(const QHash<QString, QStringList>& deviceKeys, Omittable<int> timeout = none, const QString& token = {}); + ~QueryKeysJob() override; + + // Result properties + + const QHash<QString, QJsonObject>& failures() const; + const QHash<QString, QHash<QString, DeviceInformation>>& deviceKeys() const; + + protected: + Status parseJson(const QJsonDocument& data) override; + + private: + class Private; + QScopedPointer<Private> d; + }; + + class ClaimKeysJob : public BaseJob + { + public: + explicit ClaimKeysJob(const QHash<QString, QHash<QString, QString>>& oneTimeKeys, Omittable<int> timeout = none); + ~ClaimKeysJob() override; + + // Result properties + + const QHash<QString, QJsonObject>& failures() const; + const QHash<QString, QHash<QString, QVariant>>& oneTimeKeys() const; + + protected: + Status parseJson(const QJsonDocument& data) override; + + private: + class Private; + QScopedPointer<Private> d; + }; + + class GetKeysChangesJob : public BaseJob + { + public: + explicit GetKeysChangesJob(const QString& from, const QString& to); + + /** Construct a URL out of baseUrl and usual parameters passed to + * GetKeysChangesJob. 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); + + ~GetKeysChangesJob() override; + + // Result properties + + const QStringList& changed() const; + const QStringList& left() const; + + protected: + Status parseJson(const QJsonDocument& data) override; + + private: + class Private; + QScopedPointer<Private> d; + }; +} // namespace QMatrixClient |