| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 | /* * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements.  See the NOTICE file * distributed with this work for additional information * regarding copyright ownership.  The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License.  You may obtain a copy of the License at * *   http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied.  See the License for the * specific language governing permissions and limitations * under the License. **/var FileTransferError = require('./FileTransferError'),    xhr = {};function getParentPath(filePath) {    var pos = filePath.lastIndexOf('/');    return filePath.substring(0, pos + 1);}function getFileName(filePath) {    var pos = filePath.lastIndexOf('/');    return filePath.substring(pos + 1);}module.exports = {    abort: function (successCallback, errorCallback, args) {        var id = args[0];        if (xhr[id]) {            xhr[id].abort();            if (typeof(successCallback) === 'function') {                successCallback();            }        } else if (typeof(errorCallback) === 'function') {            errorCallback();        }    },    upload: function(successCallback, errorCallback, args) {        var filePath = args[0],            server = args[1],            fileKey = args[2],            fileName = args[3],            mimeType = args[4],            params = args[5],            /*trustAllHosts = args[6],*/            /*chunkedMode = args[7],*/            headers = args[8];        xhr[fileKey] = new XMLHttpRequest({mozSystem: true});        xhr[fileKey].onabort = function() {            onFail(new FileTransferError(FileTransferError.ABORT_ERR, server, filePath, this.status, xhr[fileKey].response));        };        window.resolveLocalFileSystemURL(filePath, function(entry) {            entry.file(function(file) {                var reader = new FileReader();                reader.onloadend = function() {                    var blob = new Blob([this.result], {type: mimeType});                    var fd = new FormData();                    fd.append(fileKey, blob, fileName);                    for (var prop in params) {                        if (params.hasOwnProperty(prop)) {                            fd.append(prop, params[prop]);                        }                    }                    xhr[fileKey].open("POST", server);                    xhr[fileKey].onload = function(evt) {                        if (xhr[fileKey].status === 200) {                            var result = new FileUploadResult();                            result.bytesSent = blob.size;                            result.responseCode = xhr[fileKey].status;                            result.response = xhr[fileKey].response;                            delete xhr[fileKey];                            onSuccess(result);                        } else if (xhr[fileKey].status === 404) {                            onFail(new FileTransferError(FileTransferError.INVALID_URL_ERR, server, filePath, xhr[fileKey].status, xhr[fileKey].response));                        } else {                            onFail(new FileTransferError(FileTransferError.CONNECTION_ERR, server, filePath, xhr[fileKey].status, xhr[fileKey].response));                        }                    };                    xhr[fileKey].ontimeout = function() {                        onFail(new FileTransferError(FileTransferError.CONNECTION_ERR, server, filePath, xhr[fileKey].status, xhr[fileKey].response));                    };                    xhr[fileKey].onerror = function() {                        onFail(new FileTransferError(FileTransferError.CONNECTION_ERR, server, filePath, this.status, xhr[fileKey].response));                    };                    for (var header in headers) {                        if (headers.hasOwnProperty(header)) {                            xhr[fileKey].setRequestHeader(header, headers[header]);                        }                    }                    xhr[fileKey].send(fd);                };                reader.readAsArrayBuffer(file);            }, function() {                onFail(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR, server, filePath));            });        }, function() {            onFail(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR, server, filePath));        });        function onSuccess(data) {            if (typeof(successCallback) === 'function') {                successCallback(data);            }        }        function onFail(code) {            delete xhr[fileKey];            if (typeof(errorCallback) === 'function') {                errorCallback(code);            }        }    },    download: function (successCallback, errorCallback, args) {        var source = args[0],            target = args[1],            id = args[3],            headers = args[4];        xhr[id] = new XMLHttpRequest({mozSystem: true});        xhr[id].onload = function () {            if (xhr[id].readyState === xhr[id].DONE) {                if (xhr[id].status === 200 && xhr[id].response) {                    window.resolveLocalFileSystemURL(getParentPath(target), function (dir) {                        dir.getFile(getFileName(target), {create: true}, writeFile, function (error) {                            onFail(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR, source, target, xhr[id].status, xhr[id].response));                        });                    }, function () {                        onFail(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR, source, target, xhr[id].status, xhr[id].response));                    });                } else if (xhr[id].status === 404) {                    onFail(new FileTransferError(FileTransferError.INVALID_URL_ERR, source, target, xhr[id].status, xhr[id].response));                } else {                    onFail(new FileTransferError(FileTransferError.CONNECTION_ERR, source, target, xhr[id].status, xhr[id].response));                }            }        };        function writeFile(entry) {            entry.createWriter(function (fileWriter) {                fileWriter.onwriteend = function (evt) {                    if (!evt.target.error) {                        entry.filesystemName = entry.filesystem.name;                        delete xhr[id];                        onSuccess(entry);                    } else {                        onFail(evt.target.error);                    }                };                fileWriter.onerror = function (evt) {                    onFail(evt.target.error);                };                fileWriter.write(new Blob([xhr[id].response]));            }, function (error) {                onFail(error);            });        }        xhr[id].onerror = function (e) {            onFail(new FileTransferError(FileTransferError.CONNECTION_ERR, source, target, xhr[id].status, xhr[id].response));        };        xhr[id].onabort = function (e) {            onFail(new FileTransferError(FileTransferError.ABORT_ERR, source, target, xhr[id].status, xhr[id].response));        };        xhr[id].open("GET", source, true);        for (var header in headers) {            if (headers.hasOwnProperty(header)) {                xhr[id].setRequestHeader(header, headers[header]);            }        }        xhr[id].responseType = "blob";        setTimeout(function () {            if (xhr[id]) {                xhr[id].send();            }        }, 0);        function onSuccess(entry) {            if (typeof(successCallback) === 'function') {                successCallback(entry);            }        }        function onFail(error) {            delete xhr[id];            if (typeof(errorCallback) === 'function') {                errorCallback(error);            }        }    }};require('cordova/exec/proxy').add('FileTransfer', module.exports);
 |