diff options
| author | PliablePixels <pliablepixels@gmail.com> | 2015-06-27 09:52:06 -0400 |
|---|---|---|
| committer | PliablePixels <pliablepixels@gmail.com> | 2015-06-27 09:52:06 -0400 |
| commit | 319d4cb6670729708c19ad50b0146d1bcb7b4719 (patch) | |
| tree | c61e9723a1fd217b1816c987bba66e470e73bf02 /plugins/cordova-plugin-file/www | |
| parent | fdc42fae48db0fef5fbdc9ef51a27d219aea3a72 (diff) | |
Added ability to log key events to file and email (useful for release debugging)
Diffstat (limited to 'plugins/cordova-plugin-file/www')
54 files changed, 4180 insertions, 0 deletions
diff --git a/plugins/cordova-plugin-file/www/DirectoryEntry.js b/plugins/cordova-plugin-file/www/DirectoryEntry.js new file mode 100644 index 00000000..62f468ab --- /dev/null +++ b/plugins/cordova-plugin-file/www/DirectoryEntry.js @@ -0,0 +1,117 @@ +/* + * + * 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'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + Entry = require('./Entry'), + FileError = require('./FileError'), + DirectoryReader = require('./DirectoryReader'); + +/** + * An interface representing a directory on the file system. + * + * {boolean} isFile always false (readonly) + * {boolean} isDirectory always true (readonly) + * {DOMString} name of the directory, excluding the path leading to it (readonly) + * {DOMString} fullPath the absolute full path to the directory (readonly) + * {FileSystem} filesystem on which the directory resides (readonly) + */ +var DirectoryEntry = function(name, fullPath, fileSystem, nativeURL) { + + // add trailing slash if it is missing + if ((fullPath) && !/\/$/.test(fullPath)) { + fullPath += "/"; + } + // add trailing slash if it is missing + if (nativeURL && !/\/$/.test(nativeURL)) { + nativeURL += "/"; + } + DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath, fileSystem, nativeURL); +}; + +utils.extend(DirectoryEntry, Entry); + +/** + * Creates a new DirectoryReader to read entries from this directory + */ +DirectoryEntry.prototype.createReader = function() { + return new DirectoryReader(this.toInternalURL()); +}; + +/** + * Creates or looks up a directory + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory + * @param {Flags} options to create or exclusively create the directory + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments); + var fs = this.filesystem; + var win = successCallback && function(result) { + 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", "getDirectory", [this.toInternalURL(), path, options]); +}; + +/** + * Deletes a directory and all of it's contents + * + * @param {Function} successCallback is called with no parameters + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) { + argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments); + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(successCallback, fail, "File", "removeRecursively", [this.toInternalURL()]); +}; + +/** + * Creates or looks up a file + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file + * @param {Flags} options to create or exclusively create the file + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments); + var fs = this.filesystem; + var win = successCallback && function(result) { + var FileEntry = require('./FileEntry'); + var entry = new FileEntry(result.name, result.fullPath, fs, result.nativeURL); + successCallback(entry); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getFile", [this.toInternalURL(), path, options]); +}; + +module.exports = DirectoryEntry; diff --git a/plugins/cordova-plugin-file/www/DirectoryReader.js b/plugins/cordova-plugin-file/www/DirectoryReader.js new file mode 100644 index 00000000..2894c9a3 --- /dev/null +++ b/plugins/cordova-plugin-file/www/DirectoryReader.js @@ -0,0 +1,73 @@ +/* + * + * 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 exec = require('cordova/exec'), + FileError = require('./FileError') ; + +/** + * An interface that lists the files and directories in a directory. + */ +function DirectoryReader(localURL) { + this.localURL = localURL || null; + this.hasReadEntries = false; +} + +/** + * Returns a list of entries from a directory. + * + * @param {Function} successCallback is called with a list of entries + * @param {Function} errorCallback is called with a FileError + */ +DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) { + // If we've already read and passed on this directory's entries, return an empty list. + if (this.hasReadEntries) { + successCallback([]); + return; + } + var reader = this; + var win = typeof successCallback !== 'function' ? null : function(result) { + var retVal = []; + for (var i=0; i<result.length; i++) { + var entry = null; + if (result[i].isDirectory) { + entry = new (require('./DirectoryEntry'))(); + } + else if (result[i].isFile) { + entry = new (require('./FileEntry'))(); + } + entry.isDirectory = result[i].isDirectory; + entry.isFile = result[i].isFile; + entry.name = result[i].name; + entry.fullPath = result[i].fullPath; + entry.filesystem = new (require('./FileSystem'))(result[i].filesystemName); + entry.nativeURL = result[i].nativeURL; + retVal.push(entry); + } + reader.hasReadEntries = true; + successCallback(retVal); + }; + var fail = typeof errorCallback !== 'function' ? null : function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "readEntries", [this.localURL]); +}; + +module.exports = DirectoryReader; diff --git a/plugins/cordova-plugin-file/www/Entry.js b/plugins/cordova-plugin-file/www/Entry.js new file mode 100644 index 00000000..9cdc8774 --- /dev/null +++ b/plugins/cordova-plugin-file/www/Entry.js @@ -0,0 +1,260 @@ +/* + * + * 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 filesystem = this.filesystem, + 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 + 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 filesystem = this.filesystem, + 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 + 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; diff --git a/plugins/cordova-plugin-file/www/File.js b/plugins/cordova-plugin-file/www/File.js new file mode 100644 index 00000000..82ff7a78 --- /dev/null +++ b/plugins/cordova-plugin-file/www/File.js @@ -0,0 +1,79 @@ +/* + * + * 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. + * +*/ + +/** + * Constructor. + * name {DOMString} name of the file, without path information + * fullPath {DOMString} the full path of the file, including the name + * type {DOMString} mime type + * lastModifiedDate {Date} last modified date + * size {Number} size of the file in bytes + */ + +var File = function(name, localURL, type, lastModifiedDate, size){ + this.name = name || ''; + this.localURL = localURL || null; + this.type = type || null; + this.lastModified = lastModifiedDate || null; + // For backwards compatibility, store the timestamp in lastModifiedDate as well + this.lastModifiedDate = lastModifiedDate || null; + this.size = size || 0; + + // These store the absolute start and end for slicing the file. + this.start = 0; + this.end = this.size; +}; + +/** + * Returns a "slice" of the file. Since Cordova Files don't contain the actual + * content, this really returns a File with adjusted start and end. + * Slices of slices are supported. + * start {Number} The index at which to start the slice (inclusive). + * end {Number} The index at which to end the slice (exclusive). + */ +File.prototype.slice = function(start, end) { + var size = this.end - this.start; + var newStart = 0; + var newEnd = size; + if (arguments.length) { + if (start < 0) { + newStart = Math.max(size + start, 0); + } else { + newStart = Math.min(size, start); + } + } + + if (arguments.length >= 2) { + if (end < 0) { + newEnd = Math.max(size + end, 0); + } else { + newEnd = Math.min(end, size); + } + } + + var newFile = new File(this.name, this.localURL, this.type, this.lastModified, this.size); + newFile.start = this.start + newStart; + newFile.end = this.start + newEnd; + return newFile; +}; + + +module.exports = File; diff --git a/plugins/cordova-plugin-file/www/FileEntry.js b/plugins/cordova-plugin-file/www/FileEntry.js new file mode 100644 index 00000000..59a9dc37 --- /dev/null +++ b/plugins/cordova-plugin-file/www/FileEntry.js @@ -0,0 +1,81 @@ +/* + * + * 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 utils = require('cordova/utils'), + exec = require('cordova/exec'), + Entry = require('./Entry'), + FileWriter = require('./FileWriter'), + File = require('./File'), + FileError = require('./FileError'); + +/** + * An interface representing a file on the file system. + * + * {boolean} isFile always true (readonly) + * {boolean} isDirectory always false (readonly) + * {DOMString} name of the file, excluding the path leading to it (readonly) + * {DOMString} fullPath the absolute full path to the file (readonly) + * {FileSystem} filesystem on which the file resides (readonly) + */ +var FileEntry = function(name, fullPath, fileSystem, nativeURL) { + FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath, fileSystem, nativeURL]); +}; + +utils.extend(FileEntry, Entry); + +/** + * Creates a new FileWriter associated with the file that this FileEntry represents. + * + * @param {Function} successCallback is called with the new FileWriter + * @param {Function} errorCallback is called with a FileError + */ +FileEntry.prototype.createWriter = function(successCallback, errorCallback) { + this.file(function(filePointer) { + var writer = new FileWriter(filePointer); + + if (writer.localURL === null || writer.localURL === "") { + errorCallback && errorCallback(new FileError(FileError.INVALID_STATE_ERR)); + } else { + successCallback && successCallback(writer); + } + }, errorCallback); +}; + +/** + * Returns a File that represents the current state of the file that this FileEntry represents. + * + * @param {Function} successCallback is called with the new File object + * @param {Function} errorCallback is called with a FileError + */ +FileEntry.prototype.file = function(successCallback, errorCallback) { + var localURL = this.toInternalURL(); + var win = successCallback && function(f) { + var file = new File(f.name, localURL, f.type, f.lastModifiedDate, f.size); + successCallback(file); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getFileMetadata", [localURL]); +}; + + +module.exports = FileEntry; diff --git a/plugins/cordova-plugin-file/www/FileError.js b/plugins/cordova-plugin-file/www/FileError.js new file mode 100644 index 00000000..6507921f --- /dev/null +++ b/plugins/cordova-plugin-file/www/FileError.js @@ -0,0 +1,46 @@ +/* + * + * 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. + * +*/ + +/** + * FileError + */ +function FileError(error) { + this.code = error || null; +} + +// File error codes +// Found in DOMException +FileError.NOT_FOUND_ERR = 1; +FileError.SECURITY_ERR = 2; +FileError.ABORT_ERR = 3; + +// Added by File API specification +FileError.NOT_READABLE_ERR = 4; +FileError.ENCODING_ERR = 5; +FileError.NO_MODIFICATION_ALLOWED_ERR = 6; +FileError.INVALID_STATE_ERR = 7; +FileError.SYNTAX_ERR = 8; +FileError.INVALID_MODIFICATION_ERR = 9; +FileError.QUOTA_EXCEEDED_ERR = 10; +FileError.TYPE_MISMATCH_ERR = 11; +FileError.PATH_EXISTS_ERR = 12; + +module.exports = FileError; diff --git a/plugins/cordova-plugin-file/www/FileReader.js b/plugins/cordova-plugin-file/www/FileReader.js new file mode 100644 index 00000000..5c523aa9 --- /dev/null +++ b/plugins/cordova-plugin-file/www/FileReader.js @@ -0,0 +1,390 @@ +/* + * + * 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 exec = require('cordova/exec'), + modulemapper = require('cordova/modulemapper'), + utils = require('cordova/utils'), + File = require('./File'), + FileError = require('./FileError'), + ProgressEvent = require('./ProgressEvent'), + origFileReader = modulemapper.getOriginalSymbol(window, 'FileReader'); + +/** + * This class reads the mobile device file system. + * + * For Android: + * The root directory is the root of the file system. + * To read from the SD card, the file name is "sdcard/my_file.txt" + * @constructor + */ +var FileReader = function() { + this._readyState = 0; + this._error = null; + this._result = null; + this._localURL = ''; + this._realReader = origFileReader ? new origFileReader() : {}; +}; + +// States +FileReader.EMPTY = 0; +FileReader.LOADING = 1; +FileReader.DONE = 2; + +utils.defineGetter(FileReader.prototype, 'readyState', function() { + return this._localURL ? this._readyState : this._realReader.readyState; +}); + +utils.defineGetter(FileReader.prototype, 'error', function() { + return this._localURL ? this._error: this._realReader.error; +}); + +utils.defineGetter(FileReader.prototype, 'result', function() { + return this._localURL ? this._result: this._realReader.result; +}); + +function defineEvent(eventName) { + utils.defineGetterSetter(FileReader.prototype, eventName, function() { + return this._realReader[eventName] || null; + }, function(value) { + this._realReader[eventName] = value; + }); +} +defineEvent('onloadstart'); // When the read starts. +defineEvent('onprogress'); // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total) +defineEvent('onload'); // When the read has successfully completed. +defineEvent('onerror'); // When the read has failed (see errors). +defineEvent('onloadend'); // When the request has completed (either in success or failure). +defineEvent('onabort'); // When the read has been aborted. For instance, by invoking the abort() method. + +function initRead(reader, file) { + // Already loading something + if (reader.readyState == FileReader.LOADING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + reader._result = null; + reader._error = null; + reader._readyState = FileReader.LOADING; + + if (typeof file.localURL == 'string') { + reader._localURL = file.localURL; + } else { + reader._localURL = ''; + return true; + } + + reader.onloadstart && reader.onloadstart(new ProgressEvent("loadstart", {target:reader})); +} + +/** + * Abort reading file. + */ +FileReader.prototype.abort = function() { + if (origFileReader && !this._localURL) { + return this._realReader.abort(); + } + this._result = null; + + if (this._readyState == FileReader.DONE || this._readyState == FileReader.EMPTY) { + return; + } + + this._readyState = FileReader.DONE; + + // If abort callback + if (typeof this.onabort === 'function') { + this.onabort(new ProgressEvent('abort', {target:this})); + } + // If load end callback + if (typeof this.onloadend === 'function') { + this.onloadend(new ProgressEvent('loadend', {target:this})); + } +}; + +/** + * Read text file. + * + * @param file {File} File object containing file properties + * @param encoding [Optional] (see http://www.iana.org/assignments/character-sets) + */ +FileReader.prototype.readAsText = function(file, encoding) { + if (initRead(this, file)) { + return this._realReader.readAsText(file, encoding); + } + + // Default encoding is UTF-8 + var enc = encoding ? encoding : "UTF-8"; + var me = this; + var execArgs = [this._localURL, enc, file.start, file.end]; + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + // Save result + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + // null result + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsText", execArgs); +}; + + +/** + * Read file and return data as a base64 encoded data url. + * A data url is of the form: + * data:[<mediatype>][;base64],<data> + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsDataURL = function(file) { + if (initRead(this, file)) { + return this._realReader.readAsDataURL(file); + } + + var me = this; + var execArgs = [this._localURL, file.start, file.end]; + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + // Save result + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsDataURL", execArgs); +}; + +/** + * Read file and return data as a binary data. + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsBinaryString = function(file) { + if (initRead(this, file)) { + return this._realReader.readAsBinaryString(file); + } + + var me = this; + var execArgs = [this._localURL, file.start, file.end]; + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsBinaryString", execArgs); +}; + +/** + * Read file and return data as a binary data. + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsArrayBuffer = function(file) { + if (initRead(this, file)) { + return this._realReader.readAsArrayBuffer(file); + } + + var me = this; + var execArgs = [this._localURL, file.start, file.end]; + + // Read file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + if (r instanceof Array) { + r = new Uint8Array(r).buffer; + } + me._result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload(new ProgressEvent("load", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me._readyState === FileReader.DONE) { + return; + } + + // DONE state + me._readyState = FileReader.DONE; + + me._result = null; + + // Save error + me._error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {target:me})); + } + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend(new ProgressEvent("loadend", {target:me})); + } + }, "File", "readAsArrayBuffer", execArgs); +}; + +module.exports = FileReader; diff --git a/plugins/cordova-plugin-file/www/FileSystem.js b/plugins/cordova-plugin-file/www/FileSystem.js new file mode 100644 index 00000000..36bffbb0 --- /dev/null +++ b/plugins/cordova-plugin-file/www/FileSystem.js @@ -0,0 +1,48 @@ +/* + * + * 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 DirectoryEntry = require('./DirectoryEntry'); + +/** + * An interface representing a file system + * + * @constructor + * {DOMString} name the unique name of the file system (readonly) + * {DirectoryEntry} root directory of the file system (readonly) + */ +var FileSystem = function(name, root) { + this.name = name; + if (root) { + this.root = new DirectoryEntry(root.name, root.fullPath, this, root.nativeURL); + } else { + this.root = new DirectoryEntry(this.name, '/', this); + } +}; + +FileSystem.prototype.__format__ = function(fullPath, nativeUrl) { + return fullPath; +}; + +FileSystem.prototype.toJSON = function() { + return "<FileSystem: " + this.name + ">"; +}; + +module.exports = FileSystem; diff --git a/plugins/cordova-plugin-file/www/FileUploadOptions.js b/plugins/cordova-plugin-file/www/FileUploadOptions.js new file mode 100644 index 00000000..b2977de7 --- /dev/null +++ b/plugins/cordova-plugin-file/www/FileUploadOptions.js @@ -0,0 +1,41 @@ +/* + * + * 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. + * +*/ + +/** + * Options to customize the HTTP request used to upload files. + * @constructor + * @param fileKey {String} Name of file request parameter. + * @param fileName {String} Filename to be used by the server. Defaults to image.jpg. + * @param mimeType {String} Mimetype of the uploaded file. Defaults to image/jpeg. + * @param params {Object} Object with key: value params to send to the server. + * @param headers {Object} Keys are header names, values are header values. Multiple + * headers of the same name are not supported. + */ +var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers, httpMethod) { + this.fileKey = fileKey || null; + this.fileName = fileName || null; + this.mimeType = mimeType || null; + this.params = params || null; + this.headers = headers || null; + this.httpMethod = httpMethod || null; +}; + +module.exports = FileUploadOptions; diff --git a/plugins/cordova-plugin-file/www/FileUploadResult.js b/plugins/cordova-plugin-file/www/FileUploadResult.js new file mode 100644 index 00000000..6d74bf23 --- /dev/null +++ b/plugins/cordova-plugin-file/www/FileUploadResult.js @@ -0,0 +1,30 @@ +/* + * + * 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. + * +*/ + +/** + * FileUploadResult + * @constructor + */ +module.exports = function FileUploadResult(size, code, content) { + this.bytesSent = size; + this.responseCode = code; + this.response = content; + }; diff --git a/plugins/cordova-plugin-file/www/FileWriter.js b/plugins/cordova-plugin-file/www/FileWriter.js new file mode 100644 index 00000000..f5e0f564 --- /dev/null +++ b/plugins/cordova-plugin-file/www/FileWriter.js @@ -0,0 +1,302 @@ +/* + * + * 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 exec = require('cordova/exec'), + FileError = require('./FileError'), + ProgressEvent = require('./ProgressEvent'); + +/** + * This class writes to the mobile device file system. + * + * For Android: + * The root directory is the root of the file system. + * To write to the SD card, the file name is "sdcard/my_file.txt" + * + * @constructor + * @param file {File} File object containing file properties + * @param append if true write to the end of the file, otherwise overwrite the file + */ +var FileWriter = function(file) { + this.fileName = ""; + this.length = 0; + if (file) { + this.localURL = file.localURL || file; + this.length = file.size || 0; + } + // default is to write at the beginning of the file + this.position = 0; + + this.readyState = 0; // EMPTY + + this.result = null; + + // Error + this.error = null; + + // Event handlers + this.onwritestart = null; // When writing starts + this.onprogress = null; // While writing the file, and reporting partial file data + this.onwrite = null; // When the write has successfully completed. + this.onwriteend = null; // When the request has completed (either in success or failure). + this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method. + this.onerror = null; // When the write has failed (see errors). +}; + +// States +FileWriter.INIT = 0; +FileWriter.WRITING = 1; +FileWriter.DONE = 2; + +/** + * Abort writing file. + */ +FileWriter.prototype.abort = function() { + // check for invalid state + if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + // set error + this.error = new FileError(FileError.ABORT_ERR); + + this.readyState = FileWriter.DONE; + + // If abort callback + if (typeof this.onabort === "function") { + this.onabort(new ProgressEvent("abort", {"target":this})); + } + + // If write end callback + if (typeof this.onwriteend === "function") { + this.onwriteend(new ProgressEvent("writeend", {"target":this})); + } +}; + +/** + * Writes data to the file + * + * @param data text or blob to be written + */ +FileWriter.prototype.write = function(data) { + + var that=this; + var supportsBinary = (typeof window.Blob !== 'undefined' && typeof window.ArrayBuffer !== 'undefined'); + var isProxySupportBlobNatively = (cordova.platformId === "windows8" || cordova.platformId === "windows"); + var isBinary; + + // Check to see if the incoming data is a blob + if (data instanceof File || (!isProxySupportBlobNatively && supportsBinary && data instanceof Blob)) { + var fileReader = new FileReader(); + fileReader.onload = function() { + // Call this method again, with the arraybuffer as argument + FileWriter.prototype.write.call(that, this.result); + }; + if (supportsBinary) { + fileReader.readAsArrayBuffer(data); + } else { + fileReader.readAsText(data); + } + return; + } + + // Mark data type for safer transport over the binary bridge + isBinary = supportsBinary && (data instanceof ArrayBuffer); + if (isBinary && cordova.platformId === "windowsphone") { + // create a plain array, using the keys from the Uint8Array view so that we can serialize it + data = Array.apply(null, new Uint8Array(data)); + } + + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + me.onwritestart(new ProgressEvent("writestart", {"target":me})); + } + + // Write file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // position always increases by bytes written because file would be extended + me.position += r; + // The length of the file is now where we are done writing. + + me.length = me.position; + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwrite callback + if (typeof me.onwrite === "function") { + me.onwrite(new ProgressEvent("write", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // DONE state + me.readyState = FileWriter.DONE; + + // Save error + me.error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, "File", "write", [this.localURL, data, this.position, isBinary]); +}; + +/** + * Moves the file pointer to the location specified. + * + * If the offset is a negative number the position of the file + * pointer is rewound. If the offset is greater than the file + * size the position is set to the end of the file. + * + * @param offset is the location to move the file pointer to. + */ +FileWriter.prototype.seek = function(offset) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + if (!offset && offset !== 0) { + return; + } + + // See back from end of file. + if (offset < 0) { + this.position = Math.max(offset + this.length, 0); + } + // Offset is bigger than file size so set position + // to the end of the file. + else if (offset > this.length) { + this.position = this.length; + } + // Offset is between 0 and file size so set the position + // to start writing. + else { + this.position = offset; + } +}; + +/** + * Truncates the file to the size specified. + * + * @param size to chop the file at. + */ +FileWriter.prototype.truncate = function(size) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + me.onwritestart(new ProgressEvent("writestart", {"target":this})); + } + + // Write file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // DONE state + me.readyState = FileWriter.DONE; + + // Update the length of the file + me.length = r; + me.position = Math.min(me.position, r); + + // If onwrite callback + if (typeof me.onwrite === "function") { + me.onwrite(new ProgressEvent("write", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // DONE state + me.readyState = FileWriter.DONE; + + // Save error + me.error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, "File", "truncate", [this.localURL, size]); +}; + +module.exports = FileWriter; diff --git a/plugins/cordova-plugin-file/www/Flags.js b/plugins/cordova-plugin-file/www/Flags.js new file mode 100644 index 00000000..a9ae6da3 --- /dev/null +++ b/plugins/cordova-plugin-file/www/Flags.js @@ -0,0 +1,36 @@ +/* + * + * 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. + * +*/ + +/** + * Supplies arguments to methods that lookup or create files and directories. + * + * @param create + * {boolean} file or directory if it doesn't exist + * @param exclusive + * {boolean} used with create; if true the command will fail if + * target path exists + */ +function Flags(create, exclusive) { + this.create = create || false; + this.exclusive = exclusive || false; +} + +module.exports = Flags; diff --git a/plugins/cordova-plugin-file/www/LocalFileSystem.js b/plugins/cordova-plugin-file/www/LocalFileSystem.js new file mode 100644 index 00000000..1e8f2eeb --- /dev/null +++ b/plugins/cordova-plugin-file/www/LocalFileSystem.js @@ -0,0 +1,23 @@ +/* + * + * 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. + * +*/ + +exports.TEMPORARY = 0; +exports.PERSISTENT = 1; diff --git a/plugins/cordova-plugin-file/www/Metadata.js b/plugins/cordova-plugin-file/www/Metadata.js new file mode 100644 index 00000000..f95c44c7 --- /dev/null +++ b/plugins/cordova-plugin-file/www/Metadata.js @@ -0,0 +1,40 @@ +/* + * + * 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. + * +*/ + +/** + * Information about the state of the file or directory + * + * {Date} modificationTime (readonly) + */ +var Metadata = function(metadata) { + if (typeof metadata == "object") { + this.modificationTime = new Date(metadata.modificationTime); + this.size = metadata.size || 0; + } else if (typeof metadata == "undefined") { + this.modificationTime = null; + this.size = 0; + } else { + /* Backwards compatiblity with platforms that only return a timestamp */ + this.modificationTime = new Date(metadata); + } +}; + +module.exports = Metadata; diff --git a/plugins/cordova-plugin-file/www/ProgressEvent.js b/plugins/cordova-plugin-file/www/ProgressEvent.js new file mode 100644 index 00000000..f176f808 --- /dev/null +++ b/plugins/cordova-plugin-file/www/ProgressEvent.js @@ -0,0 +1,67 @@ +/* + * + * 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. + * +*/ + +// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill +// Feature test: See if we can instantiate a native ProgressEvent; +// if so, use that approach, +// otherwise fill-in with our own implementation. +// +// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview. +var ProgressEvent = (function() { + /* + var createEvent = function(data) { + var event = document.createEvent('Events'); + event.initEvent('ProgressEvent', false, false); + if (data) { + for (var i in data) { + if (data.hasOwnProperty(i)) { + event[i] = data[i]; + } + } + if (data.target) { + // TODO: cannot call <some_custom_object>.dispatchEvent + // need to first figure out how to implement EventTarget + } + } + return event; + }; + try { + var ev = createEvent({type:"abort",target:document}); + return function ProgressEvent(type, data) { + data.type = type; + return createEvent(data); + }; + } catch(e){ + */ + return function ProgressEvent(type, dict) { + this.type = type; + this.bubbles = false; + this.cancelBubble = false; + this.cancelable = false; + this.lengthComputable = false; + this.loaded = dict && dict.loaded ? dict.loaded : 0; + this.total = dict && dict.total ? dict.total : 0; + this.target = dict && dict.target ? dict.target : null; + }; + //} +})(); + +module.exports = ProgressEvent; diff --git a/plugins/cordova-plugin-file/www/android/FileSystem.js b/plugins/cordova-plugin-file/www/android/FileSystem.js new file mode 100644 index 00000000..518e4c42 --- /dev/null +++ b/plugins/cordova-plugin-file/www/android/FileSystem.js @@ -0,0 +1,36 @@ +/* + * + * 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. + * +*/ + +FILESYSTEM_PROTOCOL = "cdvfile"; + +module.exports = { + __format__: function(fullPath, nativeUrl) { + var path = '/' + this.name + '/' + encodeURI(fullPath); + path = path.replace('//','/'); + var ret = FILESYSTEM_PROTOCOL + '://localhost' + path; + var m = /\?.*/.exec(nativeUrl); + if (m) { + ret += m[0]; + } + return ret; + } +}; + diff --git a/plugins/cordova-plugin-file/www/blackberry10/FileProxy.js b/plugins/cordova-plugin-file/www/blackberry10/FileProxy.js new file mode 100644 index 00000000..bd286cb9 --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/FileProxy.js @@ -0,0 +1,51 @@ +/* + * + * 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. + * +*/ + +/* + * FileProxy + * + * Register all File exec calls to be handled by proxy + */ + +module.exports = { + copyTo: require('cordova-plugin-file.copyToProxy'), + getDirectory: require('cordova-plugin-file.getDirectoryProxy'), + getFile: require('cordova-plugin-file.getFileProxy'), + getFileMetadata: require('cordova-plugin-file.getFileMetadataProxy'), + getMetadata: require('cordova-plugin-file.getMetadataProxy'), + getParent: require('cordova-plugin-file.getParentProxy'), + moveTo: require('cordova-plugin-file.moveToProxy'), + readAsArrayBuffer: require('cordova-plugin-file.readAsArrayBufferProxy'), + readAsBinaryString: require('cordova-plugin-file.readAsBinaryStringProxy'), + readAsDataURL: require('cordova-plugin-file.readAsDataURLProxy'), + readAsText: require('cordova-plugin-file.readAsTextProxy'), + readEntries: require('cordova-plugin-file.readEntriesProxy'), + remove: require('cordova-plugin-file.removeProxy'), + removeRecursively: require('cordova-plugin-file.removeRecursivelyProxy'), + resolveLocalFileSystemURI: require('cordova-plugin-file.resolveLocalFileSystemURIProxy'), + requestAllFileSystems: require('cordova-plugin-file.requestAllFileSystemsProxy'), + requestFileSystem: require('cordova-plugin-file.requestFileSystemProxy'), + setMetadata: require('cordova-plugin-file.setMetadataProxy'), + truncate: require('cordova-plugin-file.truncateProxy'), + write: require('cordova-plugin-file.writeProxy') +}; + +require('cordova/exec/proxy').add('File', module.exports); diff --git a/plugins/cordova-plugin-file/www/blackberry10/FileSystem.js b/plugins/cordova-plugin-file/www/blackberry10/FileSystem.js new file mode 100644 index 00000000..59a1fac8 --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/FileSystem.js @@ -0,0 +1,46 @@ +/* + * + * 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. + * +*/ + +/* + * FileSystem + * + * Translate temporary / persistent / root file paths + */ + +var info = require("cordova-plugin-file.bb10FileSystemInfo"); + +module.exports = { + __format__: function(fullPath) { + switch (this.name) { + case 'temporary': + path = info.temporaryPath + fullPath; + break; + case 'persistent': + path = info.persistentPath + fullPath; + break; + case 'root': + path = 'file://' + fullPath; + break; + } + return window.encodeURI(path); + } +}; + diff --git a/plugins/cordova-plugin-file/www/blackberry10/copyTo.js b/plugins/cordova-plugin-file/www/blackberry10/copyTo.js new file mode 100644 index 00000000..f27bf54e --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/copyTo.js @@ -0,0 +1,141 @@ +/* + * + * 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, + onSuccess = function () { + resolve( + function (entry) { + if (typeof(success) === 'function') { + success(entry); + } + }, + onFail, + [destination + copiedEntry.name] + ); + }, + onFail = function (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); + } + } + }, + writeFile = function (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); + }, + copyFile = function (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); + } + }, + copyDirectory = function (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]); + } +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/createEntryFromNative.js b/plugins/cordova-plugin-file/www/blackberry10/createEntryFromNative.js new file mode 100644 index 00000000..e1e042ac --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/createEntryFromNative.js @@ -0,0 +1,77 @@ +/* + * + * 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. + * +*/ + +/* + * createEntryFromNative + * + * IN + * native - webkit Entry + * OUT + * returns Cordova entry + */ + +var info = require('cordova-plugin-file.bb10FileSystemInfo'), + fileSystems = require('cordova-plugin-file.fileSystems'); + +module.exports = function (native) { + var entry = { + nativeEntry: native, + isDirectory: !!native.isDirectory, + isFile: !!native.isFile, + name: native.name, + fullPath: native.fullPath, + filesystemName: native.filesystem.name, + nativeURL: native.toURL() + }, + persistentPath = info.persistentPath.substring(7), + temporaryPath = info.temporaryPath.substring(7); + //fix bb10 webkit incorrect nativeURL + if (native.filesystem.name === 'root') { + entry.nativeURL = 'file:///' + native.fullPath; + } else if (entry.nativeURL.indexOf('filesystem:local:///persistent/') === 0) { + entry.nativeURL = info.persistentPath + native.fullPath; + } else if (entry.nativeURL.indexOf('filesystem:local:///temporary') === 0) { + entry.nativeURL = info.temporaryPath + native.fullPath; + } + //translate file system name from bb10 webkit + if (entry.filesystemName === 'local__0:Persistent' || entry.fullPath.indexOf(persistentPath) !== -1) { + entry.filesystemName = 'persistent'; + } else if (entry.filesystemName === 'local__0:Temporary' || entry.fullPath.indexOf(temporaryPath) !== -1) { + entry.filesystemName = 'temporary'; + } + //add file system property (will be called sync) + fileSystems.getFs(entry.filesystemName, function (fs) { + entry.filesystem = fs; + }); + //set root on fullPath for persistent / temporary locations + entry.fullPath = entry.fullPath.replace(persistentPath, ""); + entry.fullPath = entry.fullPath.replace(temporaryPath, ""); + //set trailing slash on directory + if (entry.isDirectory && entry.fullPath.substring(entry.fullPath.length - 1) !== '/') { + entry.fullPath += '/'; + } + if (entry.isDirectory && entry.nativeURL.substring(entry.nativeURL.length - 1) !== '/') { + entry.nativeURL += '/'; + } + //encode URL + entry.nativeURL = window.encodeURI(entry.nativeURL); + return entry; +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/getDirectory.js b/plugins/cordova-plugin-file/www/blackberry10/getDirectory.js new file mode 100644 index 00000000..95c84c7a --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/getDirectory.js @@ -0,0 +1,72 @@ +/* + * + * 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. + * +*/ + +/* + * getDirectory + * + * IN: + * args + * 0 - local filesytem URI for the base directory to search + * 1 - directory to be created/returned; may be absolute path or relative path + * 2 - options object + * OUT: + * success - DirectoryEntry + * fail - FileError code + */ + +var resolve = cordova.require('cordova-plugin-file.resolveLocalFileSystemURIProxy'), + requestAnimationFrame = cordova.require('cordova-plugin-file.bb10RequestAnimationFrame'); + +module.exports = function (success, fail, args) { + var uri = args[0] === "/" ? "" : args[0], + dir = args[1], + options = args[2], + onSuccess = function (entry) { + if (typeof(success) === 'function') { + success(entry); + } + }, + onFail = function (error) { + if (typeof(fail) === 'function') { + if (error && error.code) { + //set error codes expected by mobile-spec tests + if (error.code === FileError.INVALID_MODIFICATION_ERR && options.exclusive) { + fail(FileError.PATH_EXISTS_ERR); + } else if ( error.code === FileError.NOT_FOUND_ERR && dir.indexOf(':') > 0) { + fail(FileError.ENCODING_ERR); + } else { + fail(error.code); + } + } else { + fail(error); + } + } + }; + resolve(function (entry) { + requestAnimationFrame(function () { + entry.nativeEntry.getDirectory(dir, options, function (nativeEntry) { + resolve(function (entry) { + onSuccess(entry); + }, onFail, [uri + "/" + dir]); + }, onFail); + }); + }, onFail, [uri]); +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/getFile.js b/plugins/cordova-plugin-file/www/blackberry10/getFile.js new file mode 100644 index 00000000..1a730ae7 --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/getFile.js @@ -0,0 +1,57 @@ +/* + * + * 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. + * +*/ + +/* + * getFile + * + * IN: + * args + * 0 - local filesytem URI for the base directory to search + * 1 - file to be created/returned; may be absolute path or relative path + * 2 - options object + * OUT: + * success - FileEntry + * fail - FileError code + */ + +var resolve = cordova.require('cordova-plugin-file.resolveLocalFileSystemURIProxy'); + +module.exports = function (success, fail, args) { + var uri = args[0] === "/" ? "" : args[0] + "/" + args[1], + options = args[2], + onSuccess = function (entry) { + if (typeof(success) === 'function') { + success(entry); + } + }, + onFail = function (code) { + if (typeof(fail) === 'function') { + fail(code); + } + }; + resolve(function (entry) { + if (!entry.isFile) { + onFail(FileError.TYPE_MISMATCH_ERR); + } else { + onSuccess(entry); + } + }, onFail, [uri, options]); +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/getFileMetadata.js b/plugins/cordova-plugin-file/www/blackberry10/getFileMetadata.js new file mode 100644 index 00000000..3383e035 --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/getFileMetadata.js @@ -0,0 +1,65 @@ +/* + * + * 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. + * +*/ + +/* + * getFileMetadata + * + * IN: + * args + * 0 - local filesytem URI + * OUT: + * success - file + * - name + * - type + * - lastModifiedDate + * - size + * fail - FileError code + */ + +var resolve = cordova.require('cordova-plugin-file.resolveLocalFileSystemURIProxy'), + requestAnimationFrame = cordova.require('cordova-plugin-file.bb10RequestAnimationFrame'); + +module.exports = function (success, fail, args) { + var uri = args[0], + onSuccess = function (entry) { + if (typeof(success) === 'function') { + success(entry); + } + }, + onFail = function (error) { + if (typeof(fail) === 'function') { + if (error.code) { + fail(error.code); + } else { + fail(error); + } + } + }; + resolve(function (entry) { + requestAnimationFrame(function () { + if (entry.nativeEntry.file) { + entry.nativeEntry.file(onSuccess, onFail); + } else { + entry.nativeEntry.getMetadata(onSuccess, onFail); + } + }); + }, onFail, [uri]); +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/getMetadata.js b/plugins/cordova-plugin-file/www/blackberry10/getMetadata.js new file mode 100644 index 00000000..3dd5c02c --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/getMetadata.js @@ -0,0 +1,54 @@ +/* + * + * 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. + * +*/ + +/* + * getMetadata + * + * IN: + * args + * 0 - local filesytem URI + * OUT: + * success - metadata + * fail - FileError code + */ + +var resolve = cordova.require('cordova-plugin-file.resolveLocalFileSystemURIProxy'); + +module.exports = function (success, fail, args) { + var uri = args[0], + onSuccess = function (entry) { + if (typeof(success) === 'function') { + success(entry); + } + }, + onFail = function (error) { + if (typeof(fail) === 'function') { + if (error.code) { + fail(error.code); + } else { + fail(error); + } + } + }; + resolve(function (entry) { + entry.nativeEntry.getMetadata(onSuccess, onFail); + }, onFail, [uri]); +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/getParent.js b/plugins/cordova-plugin-file/www/blackberry10/getParent.js new file mode 100644 index 00000000..dd5e3547 --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/getParent.js @@ -0,0 +1,57 @@ +/* + * + * 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. + * +*/ + +/* + * getParent + * + * IN: + * args + * 0 - local filesytem URI + * OUT: + * success - DirectoryEntry of parent + * fail - FileError code + */ + +var resolve = cordova.require('cordova-plugin-file.resolveLocalFileSystemURIProxy'), + requestAnimationFrame = cordova.require('cordova-plugin-file.bb10RequestAnimationFrame'); + +module.exports = function (success, fail, args) { + var uri = args[0], + onSuccess = function (entry) { + if (typeof(success) === 'function') { + success(entry); + } + }, + onFail = function (error) { + if (typeof(fail) === 'function') { + if (error && error.code) { + fail(error.code); + } else { + fail(error); + } + } + }; + resolve(function (entry) { + requestAnimationFrame(function () { + entry.nativeEntry.getParent(onSuccess, onFail); + }); + }, onFail, [uri]); +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/info.js b/plugins/cordova-plugin-file/www/blackberry10/info.js new file mode 100644 index 00000000..feaccd91 --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/info.js @@ -0,0 +1,52 @@ +/* + * + * 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. + * +*/ + +/* + * info + * + * persistentPath - full path to app sandboxed persistent storage + * temporaryPath - full path to app sandboxed temporary storage + * localPath - full path to app source (www dir) + * MAX_SIZE - maximum size for filesystem request + */ + +var info = { + persistentPath: "", + temporaryPath: "", + localPath: "", + MAX_SIZE: 64 * 1024 * 1024 * 1024 +}; + +cordova.exec( + function (path) { + info.persistentPath = 'file://' + path + '/webviews/webfs/persistent/local__0'; + info.temporaryPath = 'file://' + path + '/webviews/webfs/temporary/local__0'; + info.localPath = path.replace('/data', '/app/native'); + }, + function () { + console.error('Unable to determine local storage file path'); + }, + 'File', + 'getHomePath', + false +); + +module.exports = info; diff --git a/plugins/cordova-plugin-file/www/blackberry10/moveTo.js b/plugins/cordova-plugin-file/www/blackberry10/moveTo.js new file mode 100644 index 00000000..f6560e8a --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/moveTo.js @@ -0,0 +1,39 @@ +/* + * + * 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. + * +*/ + +/* + * moveTo + * + * IN: + * args + * 0 - URL of entry to move + * 1 - URL of the directory into which to move the entry + * 2 - the new name of the entry, defaults to the current name + * OUT: + * success - entry for the copied file or directory + * fail - FileError + */ + +var copy = cordova.require('cordova-plugin-file.copyToProxy'); + +module.exports = function (success, fail, args) { + copy(success, fail, args, true); +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/readAsArrayBuffer.js b/plugins/cordova-plugin-file/www/blackberry10/readAsArrayBuffer.js new file mode 100644 index 00000000..41c677a2 --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/readAsArrayBuffer.js @@ -0,0 +1,68 @@ +/* + * + * 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. + * +*/ + +/* + * readAsArrayBuffer + * + * IN: + * args + * 0 - URL of file to read + * 1 - start position + * 2 - end position + * OUT: + * success - ArrayBuffer of file + * fail - FileError + */ + +var resolve = cordova.require('cordova-plugin-file.resolveLocalFileSystemURIProxy'), + requestAnimationFrame = cordova.require('cordova-plugin-file.bb10RequestAnimationFrame'); + +module.exports = function (success, fail, args) { + var uri = args[0], + start = args[1], + end = args[2], + onSuccess = function (data) { + if (typeof success === 'function') { + success(data); + } + }, + onFail = function (error) { + if (typeof fail === 'function') { + if (error && error.code) { + fail(error.code); + } else { + fail(error); + } + } + }; + resolve(function (fs) { + requestAnimationFrame(function () { + fs.nativeEntry.file(function (file) { + var reader = new FileReader()._realReader; + reader.onloadend = function () { + onSuccess(this.result.slice(start, end)); + }; + reader.onerror = onFail; + reader.readAsArrayBuffer(file); + }, onFail); + }); + }, fail, [uri]); +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/readAsBinaryString.js b/plugins/cordova-plugin-file/www/blackberry10/readAsBinaryString.js new file mode 100644 index 00000000..6a70f1a2 --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/readAsBinaryString.js @@ -0,0 +1,68 @@ +/* + * + * 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. + * +*/ + +/* + * readAsBinaryString + * + * IN: + * args + * 0 - URL of file to read + * 1 - start position + * 2 - end position + * OUT: + * success - BinaryString contents of file + * fail - FileError + */ + +var resolve = cordova.require('cordova-plugin-file.resolveLocalFileSystemURIProxy'), + requestAnimationFrame = cordova.require('cordova-plugin-file.bb10RequestAnimationFrame'); + +module.exports = function (success, fail, args) { + var uri = args[0], + start = args[1], + end = args[2], + onSuccess = function (data) { + if (typeof success === 'function') { + success(data); + } + }, + onFail = function (error) { + if (typeof fail === 'function') { + if (error && error.code) { + fail(error.code); + } else { + fail(error); + } + } + }; + resolve(function (fs) { + requestAnimationFrame(function () { + fs.nativeEntry.file(function (file) { + var reader = new FileReader()._realReader; + reader.onloadend = function () { + onSuccess(this.result.substring(start, end)); + }; + reader.onerror = onFail; + reader.readAsBinaryString(file); + }, onFail); + }); + }, fail, [uri]); +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/readAsDataURL.js b/plugins/cordova-plugin-file/www/blackberry10/readAsDataURL.js new file mode 100644 index 00000000..0256c5ec --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/readAsDataURL.js @@ -0,0 +1,65 @@ +/* + * + * 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. + * +*/ + +/* + * readAsDataURL + * + * IN: + * args + * 0 - URL of file to read + * OUT: + * success - DataURL representation of file contents + * fail - FileError + */ + + +var resolve = cordova.require('cordova-plugin-file.resolveLocalFileSystemURIProxy'), + requestAnimationFrame = cordova.require('cordova-plugin-file.bb10RequestAnimationFrame'); + +module.exports = function (success, fail, args) { + var uri = args[0], + onSuccess = function (data) { + if (typeof success === 'function') { + success(data); + } + }, + onFail = function (error) { + if (typeof fail === 'function') { + if (error && error.code) { + fail(error.code); + } else { + fail(error); + } + } + }; + resolve(function (fs) { + requestAnimationFrame(function () { + fs.nativeEntry.file(function (file) { + var reader = new FileReader()._realReader; + reader.onloadend = function () { + onSuccess(this.result); + }; + reader.onerror = onFail; + reader.readAsDataURL(file); + }, onFail); + }); + }, fail, [uri]); +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/readAsText.js b/plugins/cordova-plugin-file/www/blackberry10/readAsText.js new file mode 100644 index 00000000..7809a908 --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/readAsText.js @@ -0,0 +1,77 @@ +/* + * + * 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. + * +*/ + +/* + * readAsText + * + * IN: + * args + * 0 - URL of file to read + * 1 - encoding + * 2 - start position + * 3 - end position + * OUT: + * success - text contents of file + * fail - FileError + */ + + +var resolve = cordova.require('cordova-plugin-file.resolveLocalFileSystemURIProxy'), + requestAnimationFrame = cordova.require('cordova-plugin-file.bb10RequestAnimationFrame'); + +module.exports = function (success, fail, args) { + var uri = args[0], + start = args[2], + end = args[3], + onSuccess = function (data) { + if (typeof success === 'function') { + success(data); + } + }, + onFail = function (error) { + if (typeof fail === 'function') { + if (error && error.code) { + fail(error.code); + } else { + fail(error); + } + } + }; + resolve(function (fs) { + requestAnimationFrame(function () { + fs.nativeEntry.file(function (file) { + var reader = new FileReader()._realReader; + reader.onloadend = function () { + var contents = new Uint8Array(this.result).subarray(start, end), + blob = new Blob([contents]), + textReader = new FileReader()._realReader; + textReader.onloadend = function () { + onSuccess(this.result); + }; + textReader.onerror = onFail; + textReader.readAsText(blob); + }; + reader.onerror = onFail; + reader.readAsArrayBuffer(file); + }, onFail); + }); + }, fail, [uri]); +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/readEntries.js b/plugins/cordova-plugin-file/www/blackberry10/readEntries.js new file mode 100644 index 00000000..5284d77b --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/readEntries.js @@ -0,0 +1,71 @@ +/* + * + * 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. + * +*/ + +/* + * readEntries + * + * IN: + * args + * 0 - URL of directory to list + * OUT: + * success - Array of Entry objects + * fail - FileError + */ + +var resolve = cordova.require('cordova-plugin-file.resolveLocalFileSystemURIProxy'), + info = require('cordova-plugin-file.bb10FileSystemInfo'), + requestAnimationFrame = cordova.require('cordova-plugin-file.bb10RequestAnimationFrame'), + createEntryFromNative = cordova.require('cordova-plugin-file.bb10CreateEntryFromNative'); + +module.exports = function (success, fail, args) { + var uri = args[0], + onSuccess = function (data) { + if (typeof success === 'function') { + success(data); + } + }, + onFail = function (error) { + if (typeof fail === 'function') { + if (error.code) { + fail(error.code); + } else { + fail(error); + } + } + }; + resolve(function (fs) { + requestAnimationFrame(function () { + var reader = fs.nativeEntry.createReader(), + entries = [], + readEntries = function() { + reader.readEntries(function (results) { + if (!results.length) { + onSuccess(entries.sort().map(createEntryFromNative)); + } else { + entries = entries.concat(Array.prototype.slice.call(results || [], 0)); + readEntries(); + } + }, onFail); + }; + readEntries(); + }); + }, fail, [uri]); +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/remove.js b/plugins/cordova-plugin-file/www/blackberry10/remove.js new file mode 100644 index 00000000..f57973ae --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/remove.js @@ -0,0 +1,61 @@ +/* + * + * 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. + * +*/ + +/* + * remove + * + * IN: + * args + * 0 - URL of Entry to remove + * OUT: + * success - (no args) + * fail - FileError + */ + +var resolve = cordova.require('cordova-plugin-file.resolveLocalFileSystemURIProxy'), + requestAnimationFrame = cordova.require('cordova-plugin-file.bb10RequestAnimationFrame'); + +module.exports = function (success, fail, args) { + var uri = args[0], + onSuccess = function (data) { + if (typeof success === 'function') { + success(data); + } + }, + onFail = function (error) { + if (typeof fail === 'function') { + if (error && error.code) { + fail(error.code); + } else { + fail(error); + } + } + }; + resolve(function (fs) { + requestAnimationFrame(function () { + if (fs.fullPath === '/') { + onFail(FileError.NO_MODIFICATION_ALLOWED_ERR); + } else { + fs.nativeEntry.remove(onSuccess, onFail); + } + }); + }, fail, [uri]); +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/removeRecursively.js b/plugins/cordova-plugin-file/www/blackberry10/removeRecursively.js new file mode 100644 index 00000000..93b559bd --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/removeRecursively.js @@ -0,0 +1,62 @@ +/* + * + * 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. + * +*/ + +/* + * removeRecursively + * + * IN: + * args + * 0 - URL of DirectoryEntry to remove recursively + * OUT: + * success - (no args) + * fail - FileError + */ + +var resolve = cordova.require('cordova-plugin-file.resolveLocalFileSystemURIProxy'), + requestAnimationFrame = cordova.require('cordova-plugin-file.bb10RequestAnimationFrame'); + +module.exports = function (success, fail, args) { + var uri = args[0], + onSuccess = function (data) { + if (typeof success === 'function') { + success(data); + } + }, + onFail = function (error) { + if (typeof fail === 'function') { + if (error.code) { + if (error.code === FileError.INVALID_MODIFICATION_ERR) { + //mobile-spec expects this error code + fail(FileError.NO_MODIFICATION_ALLOWED_ERR); + } else { + fail(error.code); + } + } else { + fail(error); + } + } + }; + resolve(function (fs) { + requestAnimationFrame(function () { + fs.nativeEntry.removeRecursively(onSuccess, onFail); + }); + }, fail, [uri]); +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/requestAllFileSystems.js b/plugins/cordova-plugin-file/www/blackberry10/requestAllFileSystems.js new file mode 100644 index 00000000..8354ab1c --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/requestAllFileSystems.js @@ -0,0 +1,42 @@ +/* + * + * 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. + * +*/ + +/* + * requestAllFileSystems + * + * IN - no arguments + * OUT + * success - Array of FileSystems + * - filesystemName + * - fullPath + * - name + * - nativeURL + */ + +var info = require('cordova-plugin-file.bb10FileSystemInfo'); + +module.exports = function (success, fail, args) { + success([ + { filesystemName: 'persistent', name: 'persistent', fullPath: '/', nativeURL: info.persistentPath + '/' }, + { filesystemName: 'temporary', name: 'temporary', fullPath: '/', nativeURL: info.temporaryPath + '/' }, + { filesystemName: 'root', name: 'root', fullPath: '/', nativeURL: 'file:///' } + ]); +} diff --git a/plugins/cordova-plugin-file/www/blackberry10/requestAnimationFrame.js b/plugins/cordova-plugin-file/www/blackberry10/requestAnimationFrame.js new file mode 100644 index 00000000..6c3288cc --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/requestAnimationFrame.js @@ -0,0 +1,38 @@ +/* + * + * 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. + * +*/ + +/* + * requestAnimationFrame + * + * This is used throughout the BB10 File implementation to wrap + * native webkit calls. There is a bug in the webkit implementation + * which causes callbacks to never return when multiple file system + * APIs are called in sequence. This should also make the UI more + * responsive during file operations. + * + * Supported on BB10 OS > 10.1 + */ + +var requestAnimationFrame = window.requestAnimationFrame; +if (typeof(requestAnimationFrame) !== 'function') { + requestAnimationFrame = function (cb) { cb(); }; +} +module.exports = requestAnimationFrame; diff --git a/plugins/cordova-plugin-file/www/blackberry10/requestFileSystem.js b/plugins/cordova-plugin-file/www/blackberry10/requestFileSystem.js new file mode 100644 index 00000000..f02edbf5 --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/requestFileSystem.js @@ -0,0 +1,53 @@ +/* + * + * 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. + * +*/ + +/* + * requestFileSystem + * + * IN: + * args + * 0 - type (TEMPORARY = 0, PERSISTENT = 1) + * 1 - size + * OUT: + * success - FileSystem object + * - name - the human readable directory name + * - root - DirectoryEntry object + * - isDirectory + * - isFile + * - name + * - fullPath + * fail - FileError code + */ + +var resolve = cordova.require('cordova-plugin-file.resolveLocalFileSystemURIProxy'); + +module.exports = function (success, fail, args) { + var fsType = args[0] === 0 ? 'temporary' : 'persistent', + size = args[1], + onSuccess = function (fs) { + var directory = { + name: fsType, + root: fs + }; + success(directory); + }; + resolve(onSuccess, fail, ['cdvfile://localhost/' + fsType + '/', undefined, size]); +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/resolveLocalFileSystemURI.js b/plugins/cordova-plugin-file/www/blackberry10/resolveLocalFileSystemURI.js new file mode 100644 index 00000000..0fc9c070 --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/resolveLocalFileSystemURI.js @@ -0,0 +1,172 @@ +/* + * + * 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. + * +*/ + +/* + * resolveLocalFileSystemURI + * + * IN + * args + * 0 - escaped local filesystem URI + * 1 - options (standard HTML5 file system options) + * 2 - size + * OUT + * success - Entry object + * - isDirectory + * - isFile + * - name + * - fullPath + * - nativeURL + * - fileSystemName + * fail - FileError code + */ + +var info = require('cordova-plugin-file.bb10FileSystemInfo'), + requestAnimationFrame = cordova.require('cordova-plugin-file.bb10RequestAnimationFrame'), + createEntryFromNative = require('cordova-plugin-file.bb10CreateEntryFromNative'), + SANDBOXED = true, + UNSANDBOXED = false; + +module.exports = function (success, fail, args) { + var request = args[0], + options = args[1], + size = args[2]; + if (request) { + request = decodeURIComponent(request); + if (request.indexOf('?') > -1) { + //bb10 does not support params; strip them off + request = request.substring(0, request.indexOf('?')); + } + if (request.indexOf('file://localhost/') === 0) { + //remove localhost prefix + request = request.replace('file://localhost/', 'file:///'); + } + //requests to sandboxed locations should use cdvfile + request = request.replace(info.persistentPath, 'cdvfile://localhost/persistent'); + request = request.replace(info.temporaryPath, 'cdvfile://localhost/temporary'); + //pick appropriate handler + if (request.indexOf('file:///') === 0) { + resolveFile(success, fail, request, options); + } else if (request.indexOf('cdvfile://localhost/') === 0) { + resolveCdvFile(success, fail, request, options, size); + } else if (request.indexOf('local:///') === 0) { + resolveLocal(success, fail, request, options); + } else { + fail(FileError.ENCODING_ERR); + } + } else { + fail(FileError.NOT_FOUND_ERR); + } +}; + +//resolve file:/// +function resolveFile(success, fail, request, options) { + var path = request.substring(7); + resolve(success, fail, path, window.PERSISTENT, UNSANDBOXED, options); +} + +//resolve cdvfile://localhost/filesystemname/ +function resolveCdvFile(success, fail, request, options, size) { + var components = /cdvfile:\/\/localhost\/([^\/]+)\/(.*)/.exec(request), + fsType = components[1], + path = components[2]; + if (fsType === 'persistent') { + resolve(success, fail, path, window.PERSISTENT, SANDBOXED, options, size); + } + else if (fsType === 'temporary') { + resolve(success, fail, path, window.TEMPORARY, SANDBOXED, options, size); + } + else if (fsType === 'root') { + resolve(success, fail, path, window.PERSISTENT, UNSANDBOXED, options); + } + else { + fail(FileError.NOT_FOUND_ERR); + } +} + +//resolve local:/// +function resolveLocal(success, fail, request, options) { + var path = localPath + request.substring(8); + resolve(success, fail, path, window.PERSISTENT, UNSANDBOXED, options); +} + +//validate parameters and set sandbox +function resolve(success, fail, path, fsType, sandbox, options, size) { + options = options || { create: false }; + size = size || info.MAX_SIZE; + if (size > info.MAX_SIZE) { + //bb10 does not respect quota; fail at unreasonably large size + fail(FileError.QUOTA_EXCEEDED_ERR); + } else if (path.indexOf(':') > -1) { + //files with : character are not valid in Cordova apps + fail(FileError.ENCODING_ERR); + } else { + requestAnimationFrame(function () { + cordova.exec(function () { + requestAnimationFrame(function () { + resolveNative(success, fail, path, fsType, options, size); + }); + }, fail, 'File', 'setSandbox', [sandbox], false); + }); + } +} + +//find path using webkit file system +function resolveNative(success, fail, path, fsType, options, size) { + window.webkitRequestFileSystem( + fsType, + size, + function (fs) { + if (path === '') { + //no path provided, call success with root file system + success(createEntryFromNative(fs.root)); + } else { + //otherwise attempt to resolve as file + fs.root.getFile( + path, + options, + function (entry) { + success(createEntryFromNative(entry)); + }, + function (fileError) { + //file not found, attempt to resolve as directory + fs.root.getDirectory( + path, + options, + function (entry) { + success(createEntryFromNative(entry)); + }, + function (dirError) { + //path cannot be resolved + if (fileError.code === FileError.INVALID_MODIFICATION_ERR && + options.exclusive) { + //mobile-spec expects this error code + fail(FileError.PATH_EXISTS_ERR); + } else { + fail(FileError.NOT_FOUND_ERR); + } + } + ); + } + ); + } + } + ); +} diff --git a/plugins/cordova-plugin-file/www/blackberry10/setMetadata.js b/plugins/cordova-plugin-file/www/blackberry10/setMetadata.js new file mode 100644 index 00000000..5254e868 --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/setMetadata.js @@ -0,0 +1,33 @@ +/* + * + * 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. + * +*/ + +/* + * setMetadata + * + * BB10 OS does not support setting file metadata via HTML5 File System + */ + +module.exports = function (success, fail, args) { + console.error("setMetadata not supported on BB10", arguments); + if (typeof(fail) === 'function') { + fail(); + } +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/truncate.js b/plugins/cordova-plugin-file/www/blackberry10/truncate.js new file mode 100644 index 00000000..ba7f77f1 --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/truncate.js @@ -0,0 +1,74 @@ +/* + * + * 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. + * +*/ + +/* + * truncate + * + * IN: + * args + * 0 - URL of file to truncate + * 1 - start position + * OUT: + * success - new length of file + * fail - FileError + */ + +var resolve = cordova.require('cordova-plugin-file.resolveLocalFileSystemURIProxy'), + requestAnimationFrame = cordova.require('cordova-plugin-file.bb10RequestAnimationFrame'); + +module.exports = function (success, fail, args) { + var uri = args[0], + length = args[1], + onSuccess = function (data) { + if (typeof success === 'function') { + success(data.loaded); + } + }, + onFail = function (error) { + if (typeof fail === 'function') { + if (error && error.code) { + fail(error.code); + } else { + fail(error); + } + } + }; + resolve(function (fs) { + requestAnimationFrame(function () { + fs.nativeEntry.file(function (file) { + var reader = new FileReader()._realReader; + reader.onloadend = function () { + var contents = new Uint8Array(this.result).subarray(0, length); + blob = new Blob([contents]); + window.requestAnimationFrame(function () { + fs.nativeEntry.createWriter(function (fileWriter) { + fileWriter.onwriteend = onSuccess; + fileWriter.onerror = onFail; + fileWriter.write(blob); + }, onFail); + }); + }; + reader.onerror = onFail; + reader.readAsArrayBuffer(file); + }, onFail); + }); + }, onFail, [uri]); +}; diff --git a/plugins/cordova-plugin-file/www/blackberry10/write.js b/plugins/cordova-plugin-file/www/blackberry10/write.js new file mode 100644 index 00000000..386ec670 --- /dev/null +++ b/plugins/cordova-plugin-file/www/blackberry10/write.js @@ -0,0 +1,73 @@ +/* + * + * 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. + * +*/ + +/* + * write + * + * IN: + * args + * 0 - URL of file to write + * 1 - data to write + * 2 - offset + * 3 - isBinary + * OUT: + * success - bytes written + * fail - FileError + */ + +var resolve = cordova.require('cordova-plugin-file.resolveLocalFileSystemURIProxy'), + requestAnimationFrame = cordova.require('cordova-plugin-file.bb10RequestAnimationFrame'); + +module.exports = function (success, fail, args) { + var uri = args[0], + data = args[1], + offset = args[2], + isBinary = args[3], + onSuccess = function (data) { + if (typeof success === 'function') { + success(data.loaded); + } + }, + onFail = function (error) { + if (typeof fail === 'function') { + if (error && error.code) { + fail(error.code); + } else if (error && error.target && error.target.code) { + fail(error.target.code); + } else { + fail(error); + } + } + }; + resolve(function (fs) { + requestAnimationFrame(function () { + fs.nativeEntry.createWriter(function (writer) { + var blob = new Blob([data]); + if (offset) { + writer.seek(offset); + } + writer.onwriteend = onSuccess; + writer.onerror = onFail; + writer.write(blob); + }, onFail); + }); + }, fail, [uri, { create: true }]); +}; diff --git a/plugins/cordova-plugin-file/www/browser/FileSystem.js b/plugins/cordova-plugin-file/www/browser/FileSystem.js new file mode 100644 index 00000000..27373d11 --- /dev/null +++ b/plugins/cordova-plugin-file/www/browser/FileSystem.js @@ -0,0 +1,31 @@ +/* + * + * 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. + * +*/ + +/*global FILESYSTEM_PREFIX: true, module*/ + +FILESYSTEM_PREFIX = "file:///"; + +module.exports = { + __format__: function(fullPath) { + return (FILESYSTEM_PREFIX + this.name + (fullPath[0] === '/' ? '' : '/') + encodeURI(fullPath)); + } +}; + diff --git a/plugins/cordova-plugin-file/www/browser/Preparing.js b/plugins/cordova-plugin-file/www/browser/Preparing.js new file mode 100644 index 00000000..13957e02 --- /dev/null +++ b/plugins/cordova-plugin-file/www/browser/Preparing.js @@ -0,0 +1,187 @@ +/* + * + * 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. + * +*/ + +/*global require*/ + +//Only Chrome uses this file. +var isChrome = window.webkitRequestFileSystem && window.webkitResolveLocalFileSystemURL; +if (!isChrome) { + return; +} + +var channel = require('cordova/channel'); +var FileError = require('./FileError'); +var PERSISTENT_FS_QUOTA = 5 * 1024 * 1024; +var filePluginIsReadyEvent = new Event('filePluginIsReady'); + +var entryFunctionsCreated = false; +var quotaWasRequested = false; +var eventWasThrown = false; + +if (!window.requestFileSystem) { + window.requestFileSystem = function(type, size, win, fail) { + if (fail) { + fail("Not supported"); + } + }; +} else { + window.requestFileSystem(window.TEMPORARY, 1, createFileEntryFunctions, function() {}); +} + +if (!window.resolveLocalFileSystemURL) { + window.resolveLocalFileSystemURL = function(url, win, fail) { + if(fail) { + fail("Not supported"); + } + }; +} + +// Resolves a filesystem entry by its path - which is passed either in standard (filesystem:file://) or +// Cordova-specific (cdvfile://) universal way. +// Aligns with specification: http://www.w3.org/TR/2011/WD-file-system-api-20110419/#widl-LocalFileSystem-resolveLocalFileSystemURL +var nativeResolveLocalFileSystemURL = window.resolveLocalFileSystemURL || window.webkitResolveLocalFileSystemURL; +window.resolveLocalFileSystemURL = function(url, win, fail) { + /* If url starts with `cdvfile` then we need convert it to Chrome real url first: + cdvfile://localhost/persistent/path/to/file -> filesystem:file://persistent/path/to/file */ + if (url.trim().substr(0,7) === "cdvfile") { + /* Quirk: + Plugin supports cdvfile://localhost (local resources) only. + I.e. external resources are not supported via cdvfile. */ + if (url.indexOf("cdvfile://localhost") !== -1) { + // Browser supports temporary and persistent only + var indexPersistent = url.indexOf('persistent'); + var indexTemporary = url.indexOf('temporary'); + + /* Chrome urls start with 'filesystem:' prefix. See quirk: + toURL function in Chrome returns filesystem:-prefixed path depending on application host. + For example, filesystem:file:///persistent/somefile.txt, + filesystem:http://localhost:8080/persistent/somefile.txt. */ + var prefix = 'filesystem:file:///'; + if (location.protocol !== 'file:') { + prefix = 'filesystem:' + location.origin + '/'; + } + + var result; + if (indexPersistent !== -1) { + // cdvfile://localhost/persistent/path/to/file -> filesystem:file://persistent/path/to/file + // or filesystem:http://localhost:8080/persistent/path/to/file + result = prefix + 'persistent' + url.substr(indexPersistent + 10); + nativeResolveLocalFileSystemURL(result, win, fail); + return; + } + + if (indexTemporary !== -1) { + // cdvfile://localhost/temporary/path/to/file -> filesystem:file://temporary/path/to/file + // or filesystem:http://localhost:8080/temporary/path/to/file + result = prefix + 'temporary' + url.substr(indexTemporary + 9); + nativeResolveLocalFileSystemURL(result, win, fail); + return; + } + } + + // cdvfile other than local file resource is not supported + fail && fail(new FileError(FileError.ENCODING_ERR)); + } else { + nativeResolveLocalFileSystemURL(url, win, fail); + } +}; + +function createFileEntryFunctions(fs) { + fs.root.getFile('todelete_658674_833_4_cdv', {create: true}, function(fileEntry) { + var fileEntryType = Object.getPrototypeOf(fileEntry); + var entryType = Object.getPrototypeOf(fileEntryType); + + // Save the original method + var origToURL = entryType.toURL; + entryType.toURL = function () { + var origURL = origToURL.call(this); + if (this.isDirectory && origURL.substr(-1) !== '/') { + return origURL + '/'; + } + return origURL; + }; + + entryType.toNativeURL = function () { + console.warn("DEPRECATED: Update your code to use 'toURL'"); + return this.toURL(); + }; + + entryType.toInternalURL = function() { + if (this.toURL().indexOf("persistent") > -1) { + return "cdvfile://localhost/persistent" + this.fullPath; + } + + if (this.toURL().indexOf("temporary") > -1) { + return "cdvfile://localhost/temporary" + this.fullPath; + } + }; + + entryType.setMetadata = function(win, fail /*, metadata*/) { + fail && fail("Not supported"); + }; + + fileEntry.createWriter(function(writer) { + var originalWrite = writer.write; + var writerProto = Object.getPrototypeOf(writer); + writerProto.write = function(blob) { + if(blob instanceof Blob) { + originalWrite.apply(this, [blob]); + } else { + var realBlob = new Blob([blob]); + originalWrite.apply(this, [realBlob]); + } + }; + + fileEntry.remove(function(){ entryFunctionsCreated = true; }, function(){ /* empty callback */ }); + }); + }); +} + +window.initPersistentFileSystem = function(size, win, fail) { + if (navigator.webkitPersistentStorage) { + navigator.webkitPersistentStorage.requestQuota(size, win, fail); + return; + } + + fail("This browser does not support this function"); +}; + +window.isFilePluginReadyRaised = function () { return eventWasThrown; }; + +window.initPersistentFileSystem(PERSISTENT_FS_QUOTA, function() { + console.log('Persistent fs quota granted'); + quotaWasRequested = true; +}, function(e){ + console.log('Error occured while trying to request Persistent fs quota: ' + JSON.stringify(e)); +}); + +channel.onCordovaReady.subscribe(function () { + function dispatchEventIfReady() { + if (entryFunctionsCreated && quotaWasRequested) { + window.dispatchEvent(filePluginIsReadyEvent); + eventWasThrown = true; + } else { + setTimeout(dispatchEventIfReady, 100); + } + } + + dispatchEventIfReady(); +}, false); diff --git a/plugins/cordova-plugin-file/www/fileSystemPaths.js b/plugins/cordova-plugin-file/www/fileSystemPaths.js new file mode 100644 index 00000000..c332f481 --- /dev/null +++ b/plugins/cordova-plugin-file/www/fileSystemPaths.js @@ -0,0 +1,63 @@ +/* + * + * 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 exec = require('cordova/exec'); +var channel = require('cordova/channel'); + +exports.file = { + // Read-only directory where the application is installed. + applicationDirectory: null, + // Root of app's private writable storage + applicationStorageDirectory: null, + // Where to put app-specific data files. + dataDirectory: null, + // Cached files that should survive app restarts. + // Apps should not rely on the OS to delete files in here. + cacheDirectory: null, + // Android: the application space on external storage. + externalApplicationStorageDirectory: null, + // Android: Where to put app-specific data files on external storage. + externalDataDirectory: null, + // Android: the application cache on external storage. + externalCacheDirectory: null, + // Android: the external storage (SD card) root. + externalRootDirectory: null, + // iOS: Temp directory that the OS can clear at will. + tempDirectory: null, + // iOS: Holds app-specific files that should be synced (e.g. to iCloud). + syncedDataDirectory: null, + // iOS: Files private to the app, but that are meaningful to other applciations (e.g. Office files) + documentsDirectory: null, + // BlackBerry10: Files globally available to all apps + sharedDirectory: null +}; + +channel.waitForInitialization('onFileSystemPathsReady'); +channel.onCordovaReady.subscribe(function() { + function after(paths) { + for (var k in paths) { + exports.file[k] = paths[k]; + } + channel.initializationComplete('onFileSystemPathsReady'); + } + exec(after, null, 'File', 'requestAllPaths', []); +}); + diff --git a/plugins/cordova-plugin-file/www/fileSystems-roots.js b/plugins/cordova-plugin-file/www/fileSystems-roots.js new file mode 100644 index 00000000..ff77d944 --- /dev/null +++ b/plugins/cordova-plugin-file/www/fileSystems-roots.js @@ -0,0 +1,44 @@ +/* + * + * 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. + * +*/ + +// Map of fsName -> FileSystem. +var fsMap = null; +var FileSystem = require('./FileSystem'); +var exec = require('cordova/exec'); + +// Overridden by Android, BlackBerry 10 and iOS to populate fsMap. +require('./fileSystems').getFs = function(name, callback) { + if (fsMap) { + callback(fsMap[name]); + } else { + exec(success, null, "File", "requestAllFileSystems", []); + function success(response) { + fsMap = {}; + for (var i = 0; i < response.length; ++i) { + var fsRoot = response[i]; + var fs = new FileSystem(fsRoot.filesystemName, fsRoot); + fsMap[fs.name] = fs; + } + callback(fsMap[name]); + } + } +}; + diff --git a/plugins/cordova-plugin-file/www/fileSystems.js b/plugins/cordova-plugin-file/www/fileSystems.js new file mode 100644 index 00000000..8ecdec3e --- /dev/null +++ b/plugins/cordova-plugin-file/www/fileSystems.js @@ -0,0 +1,25 @@ +/* + * + * 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. + * +*/ + +// Overridden by Android, BlackBerry 10 and iOS to populate fsMap. +module.exports.getFs = function(name, callback) { + callback(null); +}; diff --git a/plugins/cordova-plugin-file/www/firefoxos/FileSystem.js b/plugins/cordova-plugin-file/www/firefoxos/FileSystem.js new file mode 100644 index 00000000..8ff0ec4b --- /dev/null +++ b/plugins/cordova-plugin-file/www/firefoxos/FileSystem.js @@ -0,0 +1,29 @@ +/* + * + * 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. + * +*/ + +FILESYSTEM_PREFIX = "file:///"; + +module.exports = { + __format__: function(fullPath) { + return (FILESYSTEM_PREFIX + this.name + (fullPath[0] === '/' ? '' : '/') + encodeURI(fullPath)); + } +}; + diff --git a/plugins/cordova-plugin-file/www/ios/FileSystem.js b/plugins/cordova-plugin-file/www/ios/FileSystem.js new file mode 100644 index 00000000..b11d58f3 --- /dev/null +++ b/plugins/cordova-plugin-file/www/ios/FileSystem.js @@ -0,0 +1,30 @@ +/* + * + * 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. + * +*/ + +FILESYSTEM_PROTOCOL = "cdvfile"; + +module.exports = { + __format__: function(fullPath) { + var path = ('/'+this.name+(fullPath[0]==='/'?'':'/')+encodeURI(fullPath)).replace('//','/'); + return FILESYSTEM_PROTOCOL + '://localhost' + path; + } +}; + diff --git a/plugins/cordova-plugin-file/www/requestFileSystem.js b/plugins/cordova-plugin-file/www/requestFileSystem.js new file mode 100644 index 00000000..84715fa7 --- /dev/null +++ b/plugins/cordova-plugin-file/www/requestFileSystem.js @@ -0,0 +1,76 @@ +/* + * + * 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. + * +*/ + +//For browser platform: not all browsers use this file. +function checkBrowser() { + if (cordova.platformId === "browser" && navigator.userAgent.search(/Chrome/) > 0) { + var requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; + module.exports = requestFileSystem; + return; + } +} +checkBrowser(); + +var argscheck = require('cordova/argscheck'), + FileError = require('./FileError'), + FileSystem = require('./FileSystem'), + exec = require('cordova/exec'); +var fileSystems = require('./fileSystems'); + +/** + * Request a file system in which to store application data. + * @param type local file system type + * @param size indicates how much storage space, in bytes, the application expects to need + * @param successCallback invoked with a FileSystem object + * @param errorCallback invoked if error occurs retrieving file system + */ +var requestFileSystem = function(type, size, successCallback, errorCallback) { + argscheck.checkArgs('nnFF', 'requestFileSystem', arguments); + var fail = function(code) { + errorCallback && errorCallback(new FileError(code)); + }; + + if (type < 0) { + fail(FileError.SYNTAX_ERR); + } else { + // if successful, return a FileSystem object + var success = function(file_system) { + if (file_system) { + if (successCallback) { + fileSystems.getFs(file_system.name, function(fs) { + // This should happen only on platforms that haven't implemented requestAllFileSystems (windows) + if (!fs) { + fs = new FileSystem(file_system.name, file_system.root); + } + successCallback(fs); + }); + } + } + else { + // no FileSystem object returned + fail(FileError.NOT_FOUND_ERR); + } + }; + exec(success, fail, "File", "requestFileSystem", [type, size]); + } +}; + +module.exports = requestFileSystem; diff --git a/plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js b/plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js new file mode 100644 index 00000000..dd6f90cc --- /dev/null +++ b/plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js @@ -0,0 +1,87 @@ +/* + * + * 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. + * +*/ + +//For browser platform: not all browsers use overrided `resolveLocalFileSystemURL`. +function checkBrowser() { + if (cordova.platformId === "browser" && navigator.userAgent.search(/Chrome/) > 0) { + var requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; + module.exports = requestFileSystem; + return; + } +} +checkBrowser(); + +var argscheck = require('cordova/argscheck'), + DirectoryEntry = require('./DirectoryEntry'), + FileEntry = require('./FileEntry'), + FileError = require('./FileError'), + exec = require('cordova/exec'); +var fileSystems = require('./fileSystems'); + +/** + * Look up file system Entry referred to by local URI. + * @param {DOMString} uri URI referring to a local file or directory + * @param successCallback invoked with Entry object corresponding to URI + * @param errorCallback invoked if error occurs retrieving file system entry + */ +module.exports.resolveLocalFileSystemURL = function(uri, successCallback, errorCallback) { + argscheck.checkArgs('sFF', 'resolveLocalFileSystemURI', arguments); + // error callback + var fail = function(error) { + errorCallback && errorCallback(new FileError(error)); + }; + // sanity check for 'not:valid:filename' or '/not:valid:filename' + // file.spec.12 window.resolveLocalFileSystemURI should error (ENCODING_ERR) when resolving invalid URI with leading /. + if(!uri || uri.split(":").length > 2) { + setTimeout( function() { + fail(FileError.ENCODING_ERR); + },0); + return; + } + // if successful, return either a file or directory entry + var success = function(entry) { + if (entry) { + if (successCallback) { + // create appropriate Entry object + var fsName = entry.filesystemName || (entry.filesystem && entry.filesystem.name) || (entry.filesystem == window.PERSISTENT ? 'persistent' : 'temporary'); + fileSystems.getFs(fsName, function(fs) { + // This should happen only on platforms that haven't implemented requestAllFileSystems (windows) + if (!fs) { + fs = new FileSystem(fsName, {name:"", fullPath:"/"}); + } + var result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath, fs, entry.nativeURL) : new FileEntry(entry.name, entry.fullPath, fs, entry.nativeURL); + successCallback(result); + }); + } + } + else { + // no Entry object returned + fail(FileError.NOT_FOUND_ERR); + } + }; + + exec(success, fail, "File", "resolveLocalFileSystemURI", [uri]); +}; + +module.exports.resolveLocalFileSystemURI = function() { + console.log("resolveLocalFileSystemURI is deprecated. Please call resolveLocalFileSystemURL instead."); + module.exports.resolveLocalFileSystemURL.apply(this, arguments); +}; diff --git a/plugins/cordova-plugin-file/www/ubuntu/FileSystem.js b/plugins/cordova-plugin-file/www/ubuntu/FileSystem.js new file mode 100644 index 00000000..c43da824 --- /dev/null +++ b/plugins/cordova-plugin-file/www/ubuntu/FileSystem.js @@ -0,0 +1,34 @@ +/* + * + * 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. + * +*/ + +FILESYSTEM_PROTOCOL = "cdvfile"; + +module.exports = { + __format__: function(fullPath) { + if (this.name === 'content') { + return 'content:/' + fullPath; + } + var path = ('/' + this.name + (fullPath[0] === '/' ? '' : '/') + encodeURI(fullPath)).replace('//','/'); + + return FILESYSTEM_PROTOCOL + '://localhost' + path; + } +}; + diff --git a/plugins/cordova-plugin-file/www/ubuntu/FileWriter.js b/plugins/cordova-plugin-file/www/ubuntu/FileWriter.js new file mode 100644 index 00000000..a75506b7 --- /dev/null +++ b/plugins/cordova-plugin-file/www/ubuntu/FileWriter.js @@ -0,0 +1,135 @@ +/* + * + * 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 exec = require('cordova/exec'), + FileError = require('./FileError'), + ProgressEvent = require('./ProgressEvent'); + +function write(data) { + var that=this; + var supportsBinary = (typeof window.Blob !== 'undefined' && typeof window.ArrayBuffer !== 'undefined'); + var isBinary; + + // Check to see if the incoming data is a blob + if (data instanceof File || (supportsBinary && data instanceof Blob)) { + var fileReader = new FileReader(); + fileReader.onload = function() { + // Call this method again, with the arraybuffer as argument + FileWriter.prototype.write.call(that, this.result); + }; + if (supportsBinary) { + fileReader.readAsArrayBuffer(data); + } else { + fileReader.readAsText(data); + } + return; + } + + // Mark data type for safer transport over the binary bridge + isBinary = supportsBinary && (data instanceof ArrayBuffer); + + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw new FileError(FileError.INVALID_STATE_ERR); + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + me.onwritestart(new ProgressEvent("writestart", {"target":me})); + } + + if (data instanceof ArrayBuffer || data.buffer instanceof ArrayBuffer) { + data = new Uint8Array(data); + var binary = ""; + for (var i = 0; i < data.byteLength; i++) { + binary += String.fromCharCode(data[i]); + } + data = binary; + } + + var prefix = "file://localhost"; + var path = this.localURL; + if (path.substr(0, prefix.length) == prefix) { + path = path.substr(prefix.length); + } + // Write file + exec( + // Success callback + function(r) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // position always increases by bytes written because file would be extended + me.position += r; + // The length of the file is now where we are done writing. + + me.length = me.position; + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwrite callback + if (typeof me.onwrite === "function") { + me.onwrite(new ProgressEvent("write", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, + // Error callback + function(e) { + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // DONE state + me.readyState = FileWriter.DONE; + + // Save error + me.error = new FileError(e); + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror(new ProgressEvent("error", {"target":me})); + } + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend(new ProgressEvent("writeend", {"target":me})); + } + }, "File", "write", [path, data, this.position, isBinary]); +}; + +module.exports = { + write: write +}; + +require("cordova/exec/proxy").add("FileWriter", module.exports); diff --git a/plugins/cordova-plugin-file/www/ubuntu/fileSystems-roots.js b/plugins/cordova-plugin-file/www/ubuntu/fileSystems-roots.js new file mode 100644 index 00000000..e132a959 --- /dev/null +++ b/plugins/cordova-plugin-file/www/ubuntu/fileSystems-roots.js @@ -0,0 +1,53 @@ +/* + * + * 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 fsMap = null; +var FileSystem = require('./FileSystem'); +var LocalFileSystem = require('./LocalFileSystem'); +var exec = require('cordova/exec'); + +var requestFileSystem = function(type, size, successCallback) { + var success = function(file_system) { + if (file_system) { + if (successCallback) { + fs = new FileSystem(file_system.name, file_system.root); + successCallback(fs); + } + } + }; + exec(success, null, "File", "requestFileSystem", [type, size]); +}; + +require('./fileSystems').getFs = function(name, callback) { + if (fsMap) { + callback(fsMap[name]); + } else { + requestFileSystem(LocalFileSystem.PERSISTENT, 1, function(fs) { + requestFileSystem(LocalFileSystem.TEMPORARY, 1, function(tmp) { + fsMap = {}; + fsMap[tmp.name] = tmp; + fsMap[fs.name] = fs; + callback(fsMap[name]); + }); + }); + } +}; + diff --git a/plugins/cordova-plugin-file/www/wp/FileUploadOptions.js b/plugins/cordova-plugin-file/www/wp/FileUploadOptions.js new file mode 100644 index 00000000..696573ab --- /dev/null +++ b/plugins/cordova-plugin-file/www/wp/FileUploadOptions.js @@ -0,0 +1,49 @@ +/* + * + * 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. + * +*/ + +/** + * Options to customize the HTTP request used to upload files. + * @constructor + * @param fileKey {String} Name of file request parameter. + * @param fileName {String} Filename to be used by the server. Defaults to image.jpg. + * @param mimeType {String} Mimetype of the uploaded file. Defaults to image/jpeg. + * @param params {Object} Object with key: value params to send to the server. + */ +var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers, httpMethod) { + this.fileKey = fileKey || null; + this.fileName = fileName || null; + this.mimeType = mimeType || null; + this.headers = headers || null; + this.httpMethod = httpMethod || null; + + if(params && typeof params != typeof "") { + var arrParams = []; + for(var v in params) { + arrParams.push(v + "=" + params[v]); + } + this.params = encodeURIComponent(arrParams.join("&")); + } + else { + this.params = params || null; + } +}; + +module.exports = FileUploadOptions; |
