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();
}
#include <QSslKey>
#include <QAuthenticator>
#include <QStandardPaths>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QJsonArray>
#include <keychain.h>
#include "creds/abstractcredentials.h"
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
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();
protected Q_SLOTS:
void slotCredentialsFetched();
void slotCredentialsAsked();
+ void slotDirectEditingRecieved(const QJsonDocument &json);
private:
Account(QObject *parent = nullptr);
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!
*
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<QByteArray> DirectEditor::mimeTypes() const
+{
+ return _mimeTypes;
+}
+
+QList<QByteArray> 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());
+}
+
+/*-------------------------------------------------------------------------------------*/
+
}
#include <QVariantMap>
#include <QStringList>
+#include <QMimeDatabase>
namespace OCC {
+class DirectEditor;
+
/**
* @brief The Capabilities class represents the capabilities of an ownCloud
* server
*/
bool uploadConflictFiles() const;
+ // Direct Editing
+ void addDirectEditor(DirectEditor* directEditor);
+ DirectEditor* getDirectEditorForMimetype(const QMimeType &mimeType);
+ DirectEditor* getDirectEditorForOptionalMimetype(const QMimeType &mimeType);
+
private:
QVariantMap _capabilities;
+
+ QList<DirectEditor*> _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<QByteArray> mimeTypes() const;
+ QList<QByteArray> optionalMimeTypes() const;
+
+private:
+ QString _id;
+ QString _name;
+
+ QList<QByteArray> _mimeTypes;
+ QList<QByteArray> _optionalMimeTypes;
+};
+
+/*-------------------------------------------------------------------------------------*/
+
}
#endif //CAPABILITIES_H