| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 | /* * * 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. **//*  * copyTo *  * IN: *  args *   0 - URL of entry to copy *   1 - URL of the directory into which to copy/move the entry *   2 - the new name of the entry, defaults to the current name *  move - if true, delete the entry which was copied * OUT: *  success - entry for the copied file or directory *  fail - FileError */var resolve = cordova.require('cordova-plugin-file.resolveLocalFileSystemURIProxy'),    requestAnimationFrame = cordova.require('cordova-plugin-file.bb10RequestAnimationFrame');module.exports = function (success, fail, args, move) {    var uri = args[0],        destination = args[1],        fileName = args[2],        copiedEntry;    function onSuccess() {        resolve(            function (entry) {                if (typeof(success) === 'function') {                    success(entry);                }            },            onFail,            [destination + copiedEntry.name]        );    }    function onFail(error) {        if (typeof(fail) === 'function') {            if (error && error.code) {                //set error codes expected by mobile spec                if (uri === destination) {                    fail(FileError.INVALID_MODIFICATION_ERR);                } else if (error.code === FileError.SECURITY_ERR) {                    fail(FileError.INVALID_MODIFICATION_ERR);                } else {                    fail(error.code);                }            } else {                fail(error);            }        }    }    function writeFile(fileEntry, blob, entry) {        copiedEntry = fileEntry;        fileEntry.createWriter(function (fileWriter) {            fileWriter.onwriteend = function () {                if (move) {                    entry.nativeEntry.remove(onSuccess, function () {                        console.error("Move operation failed. Files may exist at both source and destination");                    });                } else {                    onSuccess();                }            };            fileWriter.onerror = onFail;            fileWriter.write(blob);        }, onFail);    }    function copyFile(entry) {        if (entry.nativeEntry.file) {            entry.nativeEntry.file(function (file) {                var reader = new FileReader()._realReader;                reader.onloadend = function (e) {                    var contents = new Uint8Array(this.result),                        blob = new Blob([contents]);                    resolve(function (destEntry) {                        requestAnimationFrame(function () {                            destEntry.nativeEntry.getFile(fileName, {create: true}, function (fileEntry) {                                writeFile(fileEntry, blob, entry);                            }, onFail);                        });                    }, onFail, [destination]);                   };                reader.onerror = onFail;                reader.readAsArrayBuffer(file);            }, onFail);        } else {            onFail(FileError.INVALID_MODIFICATION_ERR);        }    }    function copyDirectory(entry) {        resolve(function (destEntry) {            if (entry.filesystemName !== destEntry.filesystemName) {                console.error("Copying directories between filesystems is not supported on BB10");                onFail(FileError.INVALID_MODIFICATION_ERR);            } else {                entry.nativeEntry.copyTo(destEntry.nativeEntry, fileName, function () {                    resolve(function (copiedDir) {                        copiedEntry = copiedDir;                        if (move) {                            entry.nativeEntry.removeRecursively(onSuccess, onFail);                        } else {                            onSuccess();                        }                    }, onFail, [destination + fileName]);                }, onFail);            }        }, onFail, [destination]);     }    if (destination + fileName === uri) {        onFail(FileError.INVALID_MODIFICATION_ERR);    } else if (fileName.indexOf(':') > -1) {        onFail(FileError.ENCODING_ERR);    } else {        resolve(function (entry) {            if (entry.isDirectory) {                copyDirectory(entry);            } else {                copyFile(entry);            }        }, onFail, [uri]);    }};
 |