Files
ca-archive/content/db.js
2017-11-10 01:02:39 +02:00

84 líneas
2.8 KiB
JavaScript

"use strict";
let EXPORTED_SYMBOLS = ["DB"];
var Cc = Components.classes, Ci = Components.interfaces, Cu = Components.utils;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/NetUtil.jsm");
Cu.import("resource://gre/modules/FileUtils.jsm");
function copyDataURLToFile(document, url, file, callback) {
NetUtil.asyncFetch(url, function(istream) {
let ostream = Cc["@mozilla.org/network/file-output-stream;1"].
createInstance(Ci.nsIFileOutputStream);
ostream.init(file, -1, -1, Ci.nsIFileOutputStream.DEFER_OPEN);
NetUtil.asyncCopy(istream, ostream, function(result) {
callback && callback(file, result, document);
});
});
}
function showMessage(document, msg, style) {
let div = document.createElement("div");
div.className = style;
div.appendChild(document.createTextNode(msg));
let page = document.getElementById("page");
page.appendChild(div);
}
let DB = {
db: null,
openDB: function(dbname, document) {
let dir = Services.dirsvc.get("ProfD", Ci.nsIFile); dir.append("ca-archive");
try {
let storageService = Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
let dbFile = dir.clone(); dbFile.append(dbname);
if (dbFile.exists() && dbFile.fileSize > 0) {
this.db = storageService.openDatabase(dbFile);
} else {
if (!dir.exists()) {
showMessage(document, "Performing initial database provisioning ...", "db-warning ok");
throw "Init";
} else {
throw "CA Archive database has jast been updated, not ready or corrupted!";
}
}
return true;
} catch (e) {
if (e != "Init") {
Cu.reportError(e);
showMessage(document, e, "db-warning");
showMessage(document, "Trying to (re)provision database, please wait ...", "db-warning");
}
let tmpFile = FileUtils.getFile("TmpD", ["ca-archive.tmp"]);
tmpFile.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, FileUtils.PERMS_FILE);
let src = Services.io.newURI("chrome://ca-archive/content/db/" + dbname, null, null);
copyDataURLToFile(document, src, tmpFile, function(file, result, document) {
try {
if (result == 0 && file.exists()) {
if (dir.exists()) {
dir.remove(true);
}
dir.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
tmpFile.moveTo(dir, dbname);
showMessage(document, "Database has been processed successfully!", "db-warning ok");
showMessage(document, "Please reload the page.", "db-warning ok");
} else {
throw "CA Archive database Fatal Error!";
}
} catch (e) {
Cu.reportError(e);
showMessage(document, e, "db-warning bad");
showMessage(document, "Try to reinstall CA Archive.", "db-warning bad");
}
});
return false;
}
},
closeDB: function() {
this.db.close();
}
};