Repository: cordova-plugin-file-transfer Updated Branches: refs/heads/master ef0853dbe -> c5d5c9e2b
ubuntu: support 'cdvfile' URI Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer/commit/c5d5c9e2 Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer/tree/c5d5c9e2 Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer/diff/c5d5c9e2 Branch: refs/heads/master Commit: c5d5c9e2bff15270af0f8b150b9462a09cde9b73 Parents: ef0853d Author: Maxim Ermilov <[email protected]> Authored: Fri May 2 21:25:56 2014 +0400 Committer: Maxim Ermilov <[email protected]> Committed: Tue Jun 3 20:26:59 2014 +0400 ---------------------------------------------------------------------- src/ubuntu/file-transfer.cpp | 80 ++++++++++++++++++++++++--------------- src/ubuntu/file-transfer.h | 14 +++++-- 2 files changed, 59 insertions(+), 35 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer/blob/c5d5c9e2/src/ubuntu/file-transfer.cpp ---------------------------------------------------------------------- diff --git a/src/ubuntu/file-transfer.cpp b/src/ubuntu/file-transfer.cpp index 192ba98..9c553eb 100644 --- a/src/ubuntu/file-transfer.cpp +++ b/src/ubuntu/file-transfer.cpp @@ -18,9 +18,26 @@ */ #include "file-transfer.h" +#include <plugins/org.apache.cordova.file/file.h> #include <cassert> -void FileTransfer::download(int scId, int ecId, const QString& url, const QString &target, bool /*trustAllHost*/, int id, const QVariantMap &/*headers*/) { +static void SetHeaders(QNetworkRequest &request, const QVariantMap &headers) { + for (const QString &key: headers.keys()) { + QVariant val = *headers.find(key); + QString value = val.toString(); + if (val.userType() == QMetaType::QVariantList || val.userType() == QMetaType::QStringList) { + QList<QVariant> list = val.toList(); + for (QVariant v: list) { + if (value.size()) + value += ", "; + value += v.toString(); + } + } + request.setRawHeader(key.toUtf8(), value.toUtf8()); + } +} + +void FileTransfer::download(int scId, int ecId, const QString& url, const QString &target, bool /*trustAllHost*/, int id, const QVariantMap &headers) { QSharedPointer<FileTransferRequest> request(new FileTransferRequest(_manager, scId, ecId, id, this)); assert(_id2request.find(id) == _id2request.end()); @@ -37,11 +54,11 @@ void FileTransfer::download(int scId, int ecId, const QString& url, const QStrin it++; } }); - request->download(url, target); + request->download(url, target, headers); } -void FileTransfer::upload(int scId, int ecId, const QString &filePath, const QString& url, const QString& fileKey, const QString& fileName, const QString& mimeType, - const QVariantMap & params, bool /*trustAllHosts*/, bool /*chunkedMode*/, const QVariantMap &headers, int id, const QString &httpMethod) { +void FileTransfer::upload(int scId, int ecId, const QString &fileURI, const QString& url, const QString& fileKey, const QString& fileName, const QString& mimeType, + const QVariantMap & params, bool /*trustAllHosts*/, bool /*chunkedMode*/, const QVariantMap &headers, int id, const QString &/*httpMethod*/) { QSharedPointer<FileTransferRequest> request(new FileTransferRequest(_manager, scId, ecId, id, this)); assert(_id2request.find(id) == _id2request.end()); @@ -58,7 +75,7 @@ void FileTransfer::upload(int scId, int ecId, const QString &filePath, const QSt it++; } }); - request->upload(url, filePath, fileKey, fileName, mimeType, params, headers); + request->upload(url, fileURI, fileKey, fileName, mimeType, params, headers); } void FileTransfer::abort(int scId, int ecId, int id) { @@ -72,15 +89,20 @@ void FileTransfer::abort(int scId, int ecId, int id) { } } -void FileTransferRequest::download(const QString& uri, const QString &target) { +void FileTransferRequest::download(const QString& uri, const QString &targetURI, const QVariantMap &headers) { QUrl url(uri); QNetworkRequest request; + QSharedPointer<CPlugin> filePlugin(_plugin->cordova()->getPlugin<File>()); + + if (!filePlugin.data()) + return; + if (!url.isValid()) { QVariantMap map; map.insert("code", INVALID_URL_ERR); map.insert("source", uri); - map.insert("target", target); + map.insert("target", targetURI); _plugin->cb(_ecId, map); emit done(); return; @@ -91,33 +113,28 @@ void FileTransferRequest::download(const QString& uri, const QString &target) { QString headerData = "Basic " + (url.userName() + ":" + url.password()).toLocal8Bit().toBase64(); request.setRawHeader("Authorization", headerData.toLocal8Bit()); } + SetHeaders(request, headers); _reply = QSharedPointer<QNetworkReply>(_manager.get(request)); - _reply->connect(_reply.data(), &QNetworkReply::finished, [this, target, uri]() { + _reply->connect(_reply.data(), &QNetworkReply::finished, [this, targetURI, uri, filePlugin]() { if (!_scId || _reply->error() != QNetworkReply::NoError) return; - QFile res(target); - qCritical() << target; - if (target[0] != '/' || !res.open(QIODevice::WriteOnly)) { + QPair<bool, QFileInfo> f1(dynamic_cast<File*>(filePlugin.data())->resolveURI(targetURI)); + + QFile res(f1.second.absoluteFilePath()); + if (!f1.first || !res.open(QIODevice::WriteOnly)) { QVariantMap map; map.insert("code", INVALID_URL_ERR); map.insert("source", uri); - map.insert("target", target); + map.insert("target", targetURI); _plugin->cb(_ecId, map); emit done(); return; } res.write(_reply->readAll()); - QFileInfo info(target); - QVariantMap map; - map.insert("isFile", true); - map.insert("isDirectory", false); - map.insert("name", info.fileName()); - map.insert("fullPath", info.absoluteFilePath()); - - _plugin->cb(_scId, map); + _plugin->cb(_scId, dynamic_cast<File*>(filePlugin.data())->file2map(f1.second)); emit done(); }); @@ -125,25 +142,31 @@ void FileTransferRequest::download(const QString& uri, const QString &target) { _reply->connect(_reply.data(), SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(progress(qint64, qint64))); } -void FileTransferRequest::upload(const QString& _url, const QString& filePath, QString fileKey, QString fileName, QString mimeType, const QVariantMap ¶ms, const QVariantMap &headers) { +void FileTransferRequest::upload(const QString& _url, const QString& fileURI, QString fileKey, QString fileName, QString mimeType, const QVariantMap ¶ms, const QVariantMap &headers) { QUrl url(_url); QNetworkRequest request; + QSharedPointer<CPlugin> filePlugin(_plugin->cordova()->getPlugin<File>()); + + if (!filePlugin.data()) + return; + if (!url.isValid()) { QVariantMap map; map.insert("code", INVALID_URL_ERR); - map.insert("source", filePath); + map.insert("source", fileURI); map.insert("target", _url); _plugin->cb(_ecId, map); emit done(); return; } - QFile file(filePath); - if (filePath[0] != '/' || !file.open(QIODevice::ReadOnly)) { + QPair<bool, QFileInfo> f1(dynamic_cast<File*>(filePlugin.data())->resolveURI(fileURI)); + QFile file(f1.second.absoluteFilePath()); + if (!f1.first || !file.open(QIODevice::ReadOnly)) { QVariantMap map; map.insert("code", FILE_NOT_FOUND_ERR); - map.insert("source", filePath); + map.insert("source", fileURI); map.insert("target", _url); _plugin->cb(_ecId, map); emit done(); @@ -156,11 +179,7 @@ void FileTransferRequest::upload(const QString& _url, const QString& filePath, Q QString headerData = "Basic " + (url.userName() + ":" + url.password()).toLocal8Bit().toBase64(); request.setRawHeader("Authorization", headerData.toLocal8Bit()); } - - for (const QString &key: headers.keys()) { - const QString &value = headers.find(key)->toString(); - request.setRawHeader(key.toUtf8(), value.toUtf8()); - } + SetHeaders(request, headers); QString boundary = QString("CORDOVA-QT-%1A").arg(qrand()); while (content.contains(boundary)) { @@ -223,7 +242,6 @@ void FileTransferRequest::error(QNetworkReply::NetworkError code) { int status = 404; QVariant statusCode = _reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); - if (statusCode.isValid()) { status = statusCode.toInt(); } http://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer/blob/c5d5c9e2/src/ubuntu/file-transfer.h ---------------------------------------------------------------------- diff --git a/src/ubuntu/file-transfer.h b/src/ubuntu/file-transfer.h index b30a99f..75822cb 100644 --- a/src/ubuntu/file-transfer.h +++ b/src/ubuntu/file-transfer.h @@ -25,6 +25,8 @@ #include <cplugin.h> +class FileTransfer; + class FileTransferRequest: public QObject { Q_OBJECT @@ -41,7 +43,7 @@ class FileTransferRequest: public QObject { }; public: - FileTransferRequest(QNetworkAccessManager &manager, int scId, int ecId, int id, CPlugin *plugin): + FileTransferRequest(QNetworkAccessManager &manager, int scId, int ecId, int id, FileTransfer *plugin): _manager(manager), _scId(scId), _ecId(ecId), @@ -49,8 +51,8 @@ public: _plugin(plugin) { } - void download(const QString& url, const QString &target); - void upload(const QString& _url, const QString& filePath, QString fileKey, QString fileName, QString mimeType, const QVariantMap ¶ms, const QVariantMap &headers); + void download(const QString& url, const QString &targetURI, const QVariantMap &headers); + void upload(const QString& _url, const QString& fileURI, QString fileKey, QString fileName, QString mimeType, const QVariantMap ¶ms, const QVariantMap &headers); void abort(); signals: @@ -60,7 +62,7 @@ private slots: void progress(qint64 bytesReceived, qint64 bytesTotal); void error(QNetworkReply::NetworkError code); private: - CPlugin *_plugin; + FileTransfer *_plugin; Q_DISABLE_COPY(FileTransferRequest); }; @@ -70,6 +72,10 @@ public: explicit FileTransfer(Cordova *cordova): CPlugin(cordova) { } + Cordova* cordova() { + return m_cordova; + } + virtual const QString fullName() override { return FileTransfer::fullID(); }
