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 &params, 
const QVariantMap &headers) {
+void FileTransferRequest::upload(const QString& _url, const QString& fileURI, 
QString fileKey, QString fileName, QString mimeType, const QVariantMap &params, 
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 &params, 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 &params, 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();
     }

Reply via email to