Caret/js/file.js

99 lines
2.5 KiB
JavaScript
Raw Normal View History

2013-08-20 00:53:03 +00:00
define(function() {
/*
Unfortunately, mimicking Node isn't really feasible given the Chrome OS security model, but we still don't want to deal with the annoying Chrome filesystem APIs. This module wraps those in a more usable File object.
2013-08-20 00:53:03 +00:00
*/
var File = function() {
this.entry = null;
};
File.prototype = {
open: function(mode, c) {
var self = this;
if (typeof mode == "function") {
c = mode;
mode = "open";
}
//mode is "open" or "save"
var modes = {
"open": "openWritableFile",
"save": "saveFile"
};
chrome.fileSystem.chooseEntry({
type: modes[mode]
}, function(entry) {
//cancelling acts like an error, but isn't.
if (!entry) return;
2013-08-20 00:53:03 +00:00
self.entry = entry;
c(null, self)
2013-08-20 00:53:03 +00:00
});
},
read: function(c) {
if (!this.entry) {
console.error(this);
c("File not opened", null);
}
2013-08-20 00:53:03 +00:00
var reader = new FileReader();
reader.onload = function() {
2013-08-20 00:53:03 +00:00
c(null, reader.result);
};
reader.onerror = function() {
console.error("File read error!");
2013-08-20 00:53:03 +00:00
c(err, null);
};
this.entry.file(function(f) {
reader.readAsText(f);
});
},
2013-08-22 06:35:14 +00:00
write: function(data, c) {
2013-08-20 00:53:03 +00:00
var self = this;
2013-08-22 06:35:14 +00:00
c = c || function() {};
2013-08-20 00:53:03 +00:00
this.entry.createWriter(function(writer) {
writer.onerror = function(err) {
2013-08-22 06:35:14 +00:00
console.error(err);
2013-08-20 00:53:03 +00:00
c(err, self);
}
writer.onwriteend = function() {
//after truncation, actually write the file
writer.onwriteend = function() {
c(null, self);
}
2013-08-22 06:35:14 +00:00
var blob = new Blob([data]);
2013-08-20 00:53:03 +00:00
writer.write(blob);
};
2013-08-22 06:35:14 +00:00
writer.truncate(0);
2013-08-20 00:53:03 +00:00
});
},
stat: function(c) {
if (this.entry) {
return this.entry.file(function(f) {
c(null, f);
});
}
return c("No entry");
},
retain: function() {
return chrome.fileSystem.retainEntry(this.entry);
},
restore: function(id, c) {
var self = this;
chrome.fileSystem.isRestorable(id, function(is) {
if (is) {
chrome.fileSystem.restoreEntry(id, function(entry) {
if (!entry) return c("Could not restore file", null);
2013-08-20 00:53:03 +00:00
self.entry = entry;
c(null, self);
});
} else {
c("Could not restore file", null);
2013-08-20 00:53:03 +00:00
}
});
}
};
return File;
});