/*
|
|
*
|
|
* 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);
|