|
|
/* * * 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 argscheck = require('cordova/argscheck'), exec = require('cordova/exec'), FileError = require('./FileError'), Metadata = require('./Metadata');
/** * Represents a file or directory on the local file system. * * @param isFile * {boolean} true if Entry is a file (readonly) * @param isDirectory * {boolean} true if Entry is a directory (readonly) * @param name * {DOMString} name of the file or directory, excluding the path * leading to it (readonly) * @param fullPath * {DOMString} the absolute full path to the file or directory * (readonly) * @param fileSystem * {FileSystem} the filesystem on which this entry resides * (readonly) * @param nativeURL * {DOMString} an alternate URL which can be used by native * webview controls, for example media players. * (optional, readonly) */ function Entry(isFile, isDirectory, name, fullPath, fileSystem, nativeURL) { this.isFile = !!isFile; this.isDirectory = !!isDirectory; this.name = name || ''; this.fullPath = fullPath || ''; this.filesystem = fileSystem || null; this.nativeURL = nativeURL || null; }
/** * Look up the metadata of the entry. * * @param successCallback * {Function} is called with a Metadata object * @param errorCallback * {Function} is called with a FileError */ Entry.prototype.getMetadata = function(successCallback, errorCallback) { argscheck.checkArgs('FF', 'Entry.getMetadata', arguments); var success = successCallback && function(entryMetadata) { var metadata = new Metadata({ size: entryMetadata.size, modificationTime: entryMetadata.lastModifiedDate }); successCallback(metadata); }; var fail = errorCallback && function(code) { errorCallback(new FileError(code)); }; exec(success, fail, "File", "getFileMetadata", [this.toInternalURL()]); };
/** * Set the metadata of the entry. * * @param successCallback * {Function} is called with a Metadata object * @param errorCallback * {Function} is called with a FileError * @param metadataObject * {Object} keys and values to set */ Entry.prototype.setMetadata = function(successCallback, errorCallback, metadataObject) { argscheck.checkArgs('FFO', 'Entry.setMetadata', arguments); exec(successCallback, errorCallback, "File", "setMetadata", [this.toInternalURL(), metadataObject]); };
/** * Move a file or directory to a new location. * * @param parent * {DirectoryEntry} the directory to which to move this entry * @param newName * {DOMString} new name of the entry, defaults to the current name * @param successCallback * {Function} called with the new DirectoryEntry object * @param errorCallback * {Function} called with a FileError */ Entry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) { argscheck.checkArgs('oSFF', 'Entry.moveTo', arguments); var fail = errorCallback && function(code) { errorCallback(new FileError(code)); }; var srcURL = this.toInternalURL(), // entry name
name = newName || this.name, success = function(entry) { if (entry) { if (successCallback) { // create appropriate Entry object
var newFSName = entry.filesystemName || (entry.filesystem && entry.filesystem.name); var fs = newFSName ? new FileSystem(newFSName, { name: "", fullPath: "/" }) : new FileSystem(parent.filesystem.name, { name: "", fullPath: "/" }); var result = (entry.isDirectory) ? new (require('./DirectoryEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL) : new (require('cordova-plugin-file.FileEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL); successCallback(result); } } else { // no Entry object returned
if (fail) { fail(FileError.NOT_FOUND_ERR); } } };
// copy
exec(success, fail, "File", "moveTo", [srcURL, parent.toInternalURL(), name]); };
/** * Copy a directory to a different location. * * @param parent * {DirectoryEntry} the directory to which to copy the entry * @param newName * {DOMString} new name of the entry, defaults to the current name * @param successCallback * {Function} called with the new Entry object * @param errorCallback * {Function} called with a FileError */ Entry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) { argscheck.checkArgs('oSFF', 'Entry.copyTo', arguments); var fail = errorCallback && function(code) { errorCallback(new FileError(code)); }; var srcURL = this.toInternalURL(), // entry name
name = newName || this.name, // success callback
success = function(entry) { if (entry) { if (successCallback) { // create appropriate Entry object
var newFSName = entry.filesystemName || (entry.filesystem && entry.filesystem.name); var fs = newFSName ? new FileSystem(newFSName, { name: "", fullPath: "/" }) : new FileSystem(parent.filesystem.name, { name: "", fullPath: "/" }); var result = (entry.isDirectory) ? new (require('./DirectoryEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL) : new (require('cordova-plugin-file.FileEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL); successCallback(result); } } else { // no Entry object returned
if (fail) { fail(FileError.NOT_FOUND_ERR); } } };
// copy
exec(success, fail, "File", "copyTo", [srcURL, parent.toInternalURL(), name]); };
/** * Return a URL that can be passed across the bridge to identify this entry. */ Entry.prototype.toInternalURL = function() { if (this.filesystem && this.filesystem.__format__) { return this.filesystem.__format__(this.fullPath, this.nativeURL); } };
/** * Return a URL that can be used to identify this entry. * Use a URL that can be used to as the src attribute of a <video> or * <audio> tag. If that is not possible, construct a cdvfile:// URL.
*/ Entry.prototype.toURL = function() { if (this.nativeURL) { return this.nativeURL; } // fullPath attribute may contain the full URL in the case that
// toInternalURL fails.
return this.toInternalURL() || "file://localhost" + this.fullPath; };
/** * Backwards-compatibility: In v1.0.0 - 1.0.2, .toURL would only return a * cdvfile:// URL, and this method was necessary to obtain URLs usable by the
* webview. * See CB-6051, CB-6106, CB-6117, CB-6152, CB-6199, CB-6201, CB-6243, CB-6249, * and CB-6300. */ Entry.prototype.toNativeURL = function() { console.log("DEPRECATED: Update your code to use 'toURL'"); return this.toURL(); };
/** * Returns a URI that can be used to identify this entry. * * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI. * @return uri */ Entry.prototype.toURI = function(mimeType) { console.log("DEPRECATED: Update your code to use 'toURL'"); return this.toURL(); };
/** * Remove a file or directory. It is an error to attempt to delete a * directory that is not empty. It is an error to attempt to delete a * root directory of a file system. * * @param successCallback {Function} called with no parameters * @param errorCallback {Function} called with a FileError */ Entry.prototype.remove = function(successCallback, errorCallback) { argscheck.checkArgs('FF', 'Entry.remove', arguments); var fail = errorCallback && function(code) { errorCallback(new FileError(code)); }; exec(successCallback, fail, "File", "remove", [this.toInternalURL()]); };
/** * Look up the parent DirectoryEntry of this entry. * * @param successCallback {Function} called with the parent DirectoryEntry object * @param errorCallback {Function} called with a FileError */ Entry.prototype.getParent = function(successCallback, errorCallback) { argscheck.checkArgs('FF', 'Entry.getParent', arguments); var fs = this.filesystem; var win = successCallback && function(result) { var DirectoryEntry = require('./DirectoryEntry'); var entry = new DirectoryEntry(result.name, result.fullPath, fs, result.nativeURL); successCallback(entry); }; var fail = errorCallback && function(code) { errorCallback(new FileError(code)); }; exec(win, fail, "File", "getParent", [this.toInternalURL()]); };
module.exports = Entry;
|