1
0
Fork 0
mirror of https://github.com/futurepress/epub.js.git synced 2025-10-03 14:59:18 +02:00
epub.js/fpjs/render/workers/loader_filesystem.js
2013-02-11 21:16:33 -08:00

117 lines
2.4 KiB
JavaScript

importScripts('core.js');
var _requestFileSystem = self.requestFileSystem || self.webkitRequestFileSystem;
const DBSIZE = 5*1024*1024;
const DBTYPE = TEMPORARY;
self.onmessage = function(event){
var path = event.data;
self.request(path, function(file){
self.save(path, file, function(){
self.postMessage(path);
});
});
};
self.openFs = function(callback){
if(self._fs){
if(callback) callback(self._fs);
return;
}
_requestFileSystem(DBTYPE, DBSIZE, function(fs){
self._fs = fs;
if(callback) callback(fs);
}, self.failure);
}
self.request = function(path, callback) {
var xhr = new FP.core.loadFile(path);
xhr.succeeded = function(file) {
if(callback) callback(file);
}
xhr.failed = function(err){
self.postMessage("failed: " +err.toString());
};
xhr.start();
}
self.save = function(path, file, callback) {
self.openFs(function(fs){
var base = path.split('/').slice(0,-1);
self.createDir(fs.root, base);
fs.root.getFile(path, {create: true},
function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.onwriteend = function(e) {
callback(e);
};
fileWriter.onerror = function(e){
self.postMessage("write error:" + self.errorHandler(err) + " path="+path);
};
fileWriter.write(file);
});
}, self.failure );
});
}
self.createDir = function(rootDirEntry, folders) {
// Throw out './' or '/' and move on to prevent something like '/foo/.//bar'.
if (folders[0] == '.' || folders[0] == '') {
folders = folders.slice(1);
}
rootDirEntry.getDirectory(folders[0], {create: true}, function(dirEntry) {
// Recursively add the new subfolder (if we still have another to create).
if (folders.length) {
createDir(dirEntry, folders.slice(1));
}
}, self.failure);
};
self.failure = function(err){
self.postMessage("failed: " + self.errorHandler(err));
}
self.errorHandler = function(e) {
switch (e.code) {
case FileError.QUOTA_EXCEEDED_ERR:
return 'QUOTA_EXCEEDED_ERR';
break;
case FileError.NOT_FOUND_ERR:
return 'NOT_FOUND_ERR';
break;
case FileError.SECURITY_ERR:
return 'SECURITY_ERR';
break;
case FileError.INVALID_MODIFICATION_ERR:
return 'INVALID_MODIFICATION_ERR';
break;
case FileError.INVALID_STATE_ERR:
return 'INVALID_STATE_ERR';
break;
default:
return 'Unknown Error';
break;
}
}
self.openFs();