You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ag...@apache.org on 2013/01/11 20:59:39 UTC
[2/2] js commit: [all] Make FileReader able to read native Blob
objects.
Updated Branches:
refs/heads/master f9bcabb68 -> d41650bec
[all] Make FileReader able to read native Blob objects.
https://issues.apache.org/jira/browse/CB-2206
Project: http://git-wip-us.apache.org/repos/asf/cordova-js/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-js/commit/d41650be
Tree: http://git-wip-us.apache.org/repos/asf/cordova-js/tree/d41650be
Diff: http://git-wip-us.apache.org/repos/asf/cordova-js/diff/d41650be
Branch: refs/heads/master
Commit: d41650becbeee9d61860db06f7537898c0768987
Parents: 1f34979
Author: Andrew Grieve <ag...@chromium.org>
Authored: Fri Jan 11 14:05:14 2013 -0500
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Fri Jan 11 14:05:14 2013 -0500
----------------------------------------------------------------------
lib/common/plugin/FileReader.js | 170 ++++++++++++++++++---------------
1 files changed, 93 insertions(+), 77 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-js/blob/d41650be/lib/common/plugin/FileReader.js
----------------------------------------------------------------------
diff --git a/lib/common/plugin/FileReader.js b/lib/common/plugin/FileReader.js
index 2169b79..fc021b1 100644
--- a/lib/common/plugin/FileReader.js
+++ b/lib/common/plugin/FileReader.js
@@ -20,8 +20,11 @@
*/
var exec = require('cordova/exec'),
+ utils = require('cordova/utils'),
+ File = require('cordova/plugin/File'),
FileError = require('cordova/plugin/FileError'),
- ProgressEvent = require('cordova/plugin/ProgressEvent');
+ ProgressEvent = require('cordova/plugin/ProgressEvent'),
+ origFileReader = this.FileReader;
/**
* This class reads the mobile device file system.
@@ -32,23 +35,11 @@ var exec = require('cordova/exec'),
* @constructor
*/
var FileReader = function() {
- this.fileName = "";
-
- this.readyState = 0; // FileReader.EMPTY
-
- // File data
- this.result = null;
-
- // Error
- this.error = null;
-
- // Event handlers
- this.onloadstart = null; // When the read starts.
- this.onprogress = null; // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total)
- this.onload = null; // When the read has successfully completed.
- this.onerror = null; // When the read has failed (see errors).
- this.onloadend = null; // When the request has completed (either in success or failure).
- this.onabort = null; // When the read has been aborted. For instance, by invoking the abort() method.
+ this._readyState = 0;
+ this._error = null;
+ this._result = null;
+ this._fileName = '';
+ this._realReader = origFileReader ? new origFileReader() : {};
};
// States
@@ -56,17 +47,70 @@ FileReader.EMPTY = 0;
FileReader.LOADING = 1;
FileReader.DONE = 2;
+utils.defineGetter(FileReader.prototype, 'readyState', function() {
+ return this._fileName ? this._readyState : this._realReader.readyState;
+});
+
+utils.defineGetter(FileReader.prototype, 'error', function() {
+ return this._fileName ? this._error: this._realReader.error;
+});
+
+utils.defineGetter(FileReader.prototype, 'result', function() {
+ return this._fileName ? 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 == 'string') {
+ // Deprecated in Cordova 2.4.
+ console.warning('Using a string argument with FileReader.readAs functions is deprecated.');
+ reader._fileName = file;
+ } else if (typeof file.fullPath == 'string') {
+ reader._fileName = file.fullPath;
+ } else {
+ reader._fileName = '';
+ return true;
+ }
+
+ reader.onloadstart && reader.onloadstart(new ProgressEvent("loadstart", {target:reader}));
+}
+
/**
* Abort reading file.
*/
FileReader.prototype.abort = function() {
- this.result = null;
+ if (origFileReader && !this._fileName) {
+ return this._realReader.abort();
+ }
+ this._result = null;
- if (this.readyState == FileReader.DONE || this.readyState == FileReader.EMPTY) {
+ if (this._readyState == FileReader.DONE || this._readyState == FileReader.EMPTY) {
return;
}
- this.readyState = FileReader.DONE;
+ this._readyState = FileReader.DONE;
// If abort callback
if (typeof this.onabort === 'function') {
@@ -85,33 +129,14 @@ FileReader.prototype.abort = function() {
* @param encoding [Optional] (see http://www.iana.org/assignments/character-sets)
*/
FileReader.prototype.readAsText = function(file, encoding) {
- // Figure out pathing
- this.fileName = '';
- if (typeof file.fullPath === 'undefined') {
- this.fileName = file;
- } else {
- this.fileName = file.fullPath;
- }
-
- // Already loading something
- if (this.readyState == FileReader.LOADING) {
- throw new FileError(FileError.INVALID_STATE_ERR);
- }
-
- // LOADING state
- this.readyState = FileReader.LOADING;
-
- // If loadstart callback
- if (typeof this.onloadstart === "function") {
- this.onloadstart(new ProgressEvent("loadstart", {target:this}));
+ 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.fileName, enc];
+ var execArgs = [this._fileName, enc];
// Maybe add slice parameters.
if (file.end < file.size) {
@@ -125,12 +150,12 @@ FileReader.prototype.readAsText = function(file, encoding) {
// Success callback
function(r) {
// If DONE (cancelled), then don't do anything
- if (me.readyState === FileReader.DONE) {
+ if (me._readyState === FileReader.DONE) {
return;
}
// Save result
- me.result = r;
+ me._result = r;
// If onload callback
if (typeof me.onload === "function") {
@@ -138,7 +163,7 @@ FileReader.prototype.readAsText = function(file, encoding) {
}
// DONE state
- me.readyState = FileReader.DONE;
+ me._readyState = FileReader.DONE;
// If onloadend callback
if (typeof me.onloadend === "function") {
@@ -148,18 +173,18 @@ FileReader.prototype.readAsText = function(file, encoding) {
// Error callback
function(e) {
// If DONE (cancelled), then don't do anything
- if (me.readyState === FileReader.DONE) {
+ if (me._readyState === FileReader.DONE) {
return;
}
// DONE state
- me.readyState = FileReader.DONE;
+ me._readyState = FileReader.DONE;
// null result
- me.result = null;
+ me._result = null;
// Save error
- me.error = new FileError(e);
+ me._error = new FileError(e);
// If onerror callback
if (typeof me.onerror === "function") {
@@ -182,29 +207,12 @@ FileReader.prototype.readAsText = function(file, encoding) {
* @param file {File} File object containing file properties
*/
FileReader.prototype.readAsDataURL = function(file) {
- this.fileName = "";
- if (typeof file.fullPath === "undefined") {
- this.fileName = file;
- } else {
- this.fileName = file.fullPath;
- }
-
- // Already loading something
- if (this.readyState == FileReader.LOADING) {
- throw new FileError(FileError.INVALID_STATE_ERR);
- }
-
- // LOADING state
- this.readyState = FileReader.LOADING;
-
- // If loadstart callback
- if (typeof this.onloadstart === "function") {
- this.onloadstart(new ProgressEvent("loadstart", {target:this}));
+ if (initRead(this, file)) {
+ return this._realReader.readAsDataURL(file);
}
var me = this;
-
- var execArgs = [this.fileName];
+ var execArgs = [this._fileName];
// Maybe add slice parameters.
if (file.end < file.size) {
@@ -218,15 +226,15 @@ FileReader.prototype.readAsDataURL = function(file) {
// Success callback
function(r) {
// If DONE (cancelled), then don't do anything
- if (me.readyState === FileReader.DONE) {
+ if (me._readyState === FileReader.DONE) {
return;
}
// DONE state
- me.readyState = FileReader.DONE;
+ me._readyState = FileReader.DONE;
// Save result
- me.result = r;
+ me._result = r;
// If onload callback
if (typeof me.onload === "function") {
@@ -241,17 +249,17 @@ FileReader.prototype.readAsDataURL = function(file) {
// Error callback
function(e) {
// If DONE (cancelled), then don't do anything
- if (me.readyState === FileReader.DONE) {
+ if (me._readyState === FileReader.DONE) {
return;
}
// DONE state
- me.readyState = FileReader.DONE;
+ me._readyState = FileReader.DONE;
- me.result = null;
+ me._result = null;
// Save error
- me.error = new FileError(e);
+ me._error = new FileError(e);
// If onerror callback
if (typeof me.onerror === "function") {
@@ -271,8 +279,12 @@ FileReader.prototype.readAsDataURL = function(file) {
* @param file {File} File object containing file properties
*/
FileReader.prototype.readAsBinaryString = function(file) {
+ if (initRead(this, file)) {
+ return this._realReader.readAsBinaryString(file);
+ }
// TODO - Can't return binary data to browser.
console.log('method "readAsBinaryString" is not supported at this time.');
+ this.abort();
};
/**
@@ -281,8 +293,12 @@ FileReader.prototype.readAsBinaryString = function(file) {
* @param file {File} File object containing file properties
*/
FileReader.prototype.readAsArrayBuffer = function(file) {
+ if (initRead(this, file)) {
+ return this._realReader.readAsArrayBuffer(file);
+ }
// TODO - Can't return binary data to browser.
console.log('This method is not supported at this time.');
+ this.abort();
};
module.exports = FileReader;