From: Michael Schuster Date: Sat, 18 Jan 2020 14:07:51 +0000 (+0100) Subject: Add support for the directEditing capability X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~222^2^2~412^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=45b39cdbc1efce8a85aeb36c23c2d2712531b0c6;p=nextcloud-desktop.git Add support for the directEditing capability - Fetch in ConnectionValidator::slotCapabilitiesRecieved - Add editors to a list made of the new DirectEditor class TODO: - Add support for re-fetch and continously check for changes (ETag) Signed-off-by: Michael Schuster --- diff --git a/src/gui/connectionvalidator.cpp b/src/gui/connectionvalidator.cpp index b2f04d9b5..36ac177aa 100644 --- a/src/gui/connectionvalidator.cpp +++ b/src/gui/connectionvalidator.cpp @@ -249,6 +249,11 @@ void ConnectionValidator::slotCapabilitiesRecieved(const QJsonDocument &json) return; } + // Check for the directEditing capability + QUrl directEditingURL = QUrl(caps["files"].toObject()["directEditing"].toObject()["url"].toString()); + QString directEditingETag = caps["files"].toObject()["directEditing"].toObject()["etag"].toString(); + _account->fetchDirectEditors(directEditingURL, directEditingETag); + fetchUser(); } diff --git a/src/libsync/account.cpp b/src/libsync/account.cpp index 076fb196d..97ae971a4 100644 --- a/src/libsync/account.cpp +++ b/src/libsync/account.cpp @@ -35,6 +35,9 @@ #include #include #include +#include +#include +#include #include #include "creds/abstractcredentials.h" @@ -600,4 +603,49 @@ void Account::deleteAppPassword(){ job->start(); } +void Account::fetchDirectEditors(const QUrl &directEditingURL, const QString &directEditingETag) +{ + if(directEditingURL.isEmpty() || directEditingETag.isEmpty()) + return; + + // Check for the directEditing capability + if (!directEditingURL.isEmpty() && + (directEditingETag.isEmpty() || directEditingETag != _lastDirectEditingETag)) { + // Fetch the available editors and their mime types + JsonApiJob *job = new JsonApiJob(sharedFromThis(), QLatin1String("ocs/v2.php/apps/files/api/v1/directEditing"), this); + QObject::connect(job, &JsonApiJob::jsonReceived, this, &Account::slotDirectEditingRecieved); + job->start(); + } +} + +void Account::slotDirectEditingRecieved(const QJsonDocument &json) +{ + auto data = json.object().value("ocs").toObject().value("data").toObject(); + auto editors = data.value("editors").toObject(); + + foreach (auto editorKey, editors.keys()) { + auto editor = editors.value(editorKey).toObject(); + + const QString id = editor.value("id").toString(); + const QString name = editor.value("name").toString(); + + if(!id.isEmpty() && !name.isEmpty()) { + auto mimeTypes = editor.value("mimetypes").toArray(); + auto optionalMimeTypes = editor.value("optionalMimetypes").toArray(); + + DirectEditor *directEditor = new DirectEditor(id, name); + + foreach(auto mimeType, mimeTypes) { + directEditor->addMimetype(mimeType.toString().toLatin1()); + } + + foreach(auto optionalMimeType, optionalMimeTypes) { + directEditor->addOptionalMimetype(optionalMimeType.toString().toLatin1()); + } + + _capabilities.addDirectEditor(directEditor); + } + } +} + } // namespace OCC diff --git a/src/libsync/account.h b/src/libsync/account.h index 1caef1991..32b79f463 100644 --- a/src/libsync/account.h +++ b/src/libsync/account.h @@ -246,6 +246,10 @@ public: void writeAppPasswordOnce(QString appPassword); void deleteAppPassword(); + /// Direct Editing + // Check for the directEditing capability + void fetchDirectEditors(const QUrl &directEditingURL, const QString &directEditingETag); + public slots: /// Used when forgetting credentials void clearQNAMCache(); @@ -278,6 +282,7 @@ signals: protected Q_SLOTS: void slotCredentialsFetched(); void slotCredentialsAsked(); + void slotDirectEditingRecieved(const QJsonDocument &json); private: Account(QObject *parent = nullptr); @@ -324,6 +329,9 @@ private: friend class AccountManager; + // Direct Editing + QString _lastDirectEditingETag; + /* IMPORTANT - remove later - FIXME MS@2019-12-07 --> * TODO: For "Log out" & "Remove account": Remove client CA certs and KEY! * diff --git a/src/libsync/capabilities.cpp b/src/libsync/capabilities.cpp index d0c5f727f..ae32176cc 100644 --- a/src/libsync/capabilities.cpp +++ b/src/libsync/capabilities.cpp @@ -176,4 +176,85 @@ bool Capabilities::uploadConflictFiles() const return _capabilities["uploadConflictFiles"].toBool(); } + +/*-------------------------------------------------------------------------------------*/ + +// Direct Editing +void Capabilities::addDirectEditor(DirectEditor* directEditor) +{ + if(directEditor) + _directEditors.append(directEditor); +} + +DirectEditor* Capabilities::getDirectEditorForMimetype(const QMimeType &mimeType) +{ + foreach(DirectEditor* editor, _directEditors) { + if(editor->hasMimetype(mimeType)) + return editor; + } + + return nullptr; +} + +DirectEditor* Capabilities::getDirectEditorForOptionalMimetype(const QMimeType &mimeType) +{ + foreach(DirectEditor* editor, _directEditors) { + if(editor->hasOptionalMimetype(mimeType)) + return editor; + } + + return nullptr; +} + +/*-------------------------------------------------------------------------------------*/ + +DirectEditor::DirectEditor(const QString &id, const QString &name, QObject* parent) + : QObject(parent) + , _id(id) + , _name(name) +{ +} + +QString DirectEditor::id() const +{ + return _id; +} + +QString DirectEditor::name() const +{ + return _name; +} + +void DirectEditor::addMimetype(const QByteArray &mimeType) +{ + _mimeTypes.append(mimeType); +} + +void DirectEditor::addOptionalMimetype(const QByteArray &mimeType) +{ + _optionalMimeTypes.append(mimeType); +} + +QList DirectEditor::mimeTypes() const +{ + return _mimeTypes; +} + +QList DirectEditor::optionalMimeTypes() const +{ + return _optionalMimeTypes; +} + +bool DirectEditor::hasMimetype(const QMimeType &mimeType) +{ + return _mimeTypes.contains(mimeType.name().toLatin1()); +} + +bool DirectEditor::hasOptionalMimetype(const QMimeType &mimeType) +{ + return _optionalMimeTypes.contains(mimeType.name().toLatin1()); +} + +/*-------------------------------------------------------------------------------------*/ + } diff --git a/src/libsync/capabilities.h b/src/libsync/capabilities.h index 8f8fd826a..fa0312b79 100644 --- a/src/libsync/capabilities.h +++ b/src/libsync/capabilities.h @@ -20,9 +20,12 @@ #include #include +#include namespace OCC { +class DirectEditor; + /** * @brief The Capabilities class represents the capabilities of an ownCloud * server @@ -127,9 +130,47 @@ public: */ bool uploadConflictFiles() const; + // Direct Editing + void addDirectEditor(DirectEditor* directEditor); + DirectEditor* getDirectEditorForMimetype(const QMimeType &mimeType); + DirectEditor* getDirectEditorForOptionalMimetype(const QMimeType &mimeType); + private: QVariantMap _capabilities; + + QList _directEditors; }; + +/*-------------------------------------------------------------------------------------*/ + +class OWNCLOUDSYNC_EXPORT DirectEditor : public QObject +{ + Q_OBJECT +public: + DirectEditor(const QString &id, const QString &name, QObject* parent = 0); + + void addMimetype(const QByteArray &mimeType); + void addOptionalMimetype(const QByteArray &mimeType); + + bool hasMimetype(const QMimeType &mimeType); + bool hasOptionalMimetype(const QMimeType &mimeType); + + QString id() const; + QString name() const; + + QList mimeTypes() const; + QList optionalMimeTypes() const; + +private: + QString _id; + QString _name; + + QList _mimeTypes; + QList _optionalMimeTypes; +}; + +/*-------------------------------------------------------------------------------------*/ + } #endif //CAPABILITIES_H