carcass fixes
[guerillascript.git] / main / prefsengine.js
blobc79993f887f46621ba0cb974ba3e10e5dd198ce5
1 /* coded by Ketmar // Invisible Vector (psyc://ketmar.no-ip.org/~Ketmar)
2  * Understanding is not required. Only obedience.
3  *
4  * This program is free software. It comes without any warranty, to
5  * the extent permitted by applicable law. You can redistribute it
6  * and/or modify it under the terms of the Do What The Fuck You Want
7  * To Public License, Version 2, as published by Sam Hocevar. See
8  * http://www.wtfpl.net/txt/copying/ for more details.
9  */
10 ////////////////////////////////////////////////////////////////////////////////
11 // user code should define `PREFS_BRANCH`, `PREFS` and `PREFS_DIR_NAMES`
14 ////////////////////////////////////////////////////////////////////////////////
15 function setDefaultPrefs () {
16   let branch = Services.prefs.getDefaultBranch(PREFS_BRANCH);
17   for (let [key, val] in Iterator(PREFS)) {
18     switch (typeof(val)) {
19       case "boolean": branch.setBoolPref(key, val); break;
20       case "number": branch.setIntPref(key, val); break;
21       case "string": branch.setCharPref(key, val); break;
22     }
23   }
27 ////////////////////////////////////////////////////////////////////////////////
28 let knownDirs = {};
30 function getUserXXDir (name, createit) {
31   let res = knownDirs[name];
32   if (res) {
33     // cached
34     res = res.clone();
35   } else {
36     if (!(name in PREFS_DIR_NAMES)) throw new Error("unknown 'known' dir: '"+name+"'");
37     //logError("getting dir '"+name+"'");
38     // new, cache it
39     let dn = "";
40     try { dn = Services.prefs.getCharPref(PREFS_BRANCH+name); } catch (e) {}
41     if (dn.length && dn[0] == '/') {
42       res = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
43       res.initWithPath(dn);
44     } else {
45       res = getProfileDir();
46       if (dn.length) {
47         for (let d of dn.split("/")) if (d.length) res.append(d);
48       }
49     }
50     //logError("dir ["+name+"] = ["+res.path+"]");
51     knownDirs[name] = res.clone();
52   }
53   if (createit && !res.exists()) res.create(res.DIRECTORY_TYPE, 0700);
54   return res;
57 exportsGlobal.resetUserDirCache = function () { knownDirs = {}; };
60 // build dir getters
61 if ("PREFS_DIR_NAMES" in this) {
62   let userdirs = {};
63   for (let [iname, oname] in Iterator(PREFS_DIR_NAMES)) {
64     let getter = tieto(this, getUserXXDir, iname, true);
65     exportsGlobal["getUser"+oname] = getter;
66     Object.defineProperty(userdirs, oname, {get: function () getter});
67   }
69 exportsGlobal.userdirs = userdirs;
72 ////////////////////////////////////////////////////////////////////////////////
73 function getAddonPref (name) {
74   if (typeof(name) == "string" && (name in PREFS)) {
75     try {
76       switch (typeof(PREFS[name])) {
77         case "boolean": return Services.prefs.getBoolPref(PREFS_BRANCH+name);
78         case "number": return Services.prefs.getIntPref(PREFS_BRANCH+name);
79         case "string": return Services.prefs.getCharPref(PREFS_BRANCH+name);
80       }
81     } catch (e) {}
82     return PREFS[name];
83   }
84   logError("k8extcarcass: invalid preference request for '"+name+"'");
85   return null;
89 ////////////////////////////////////////////////////////////////////////////////
90 function setAddonPref (name, val) {
91   if (typeof(name) == "string" && (name in PREFS)) {
92     try {
93       switch (typeof(PREFS[name])) {
94         case "boolean": val = !!val; Services.prefs.setBoolPref(PREFS_BRANCH+name, val); break;
95         case "number": val = parseInt(val); Services.prefs.setIntPref(PREFS_BRANCH+name, val); break;
96         case "string": val = ""+val; Services.prefs.setCharPref(PREFS_BRANCH+name, val); break;
97       }
98       return val;
99     } catch (e) {}
100   }
101   logError("k8extcarcass: invalid preference set request for '"+name+"'");
102   return null;
106 ////////////////////////////////////////////////////////////////////////////////
107 let addonOptions = {
108   _cache: {},
109   _resetCache: function () { addonOptions._cache = {}; },
110   _getOpt: function (name) {
111     if (!(name in addonOptions._cache)) addonOptions._cache[name] = getAddonPref(name);
112     return addonOptions._cache[name];
113   },
114   _setOpt: function (name, val) {
115     addonOptions._cache[name] = val;
116     return setAddonPref(name, val);
117   },
118   //TODO: make this generic instead of pasta!
119   get debugMode () addonOptions._getOpt("debugMode"),
120   set debugMode (val) addonOptions._setOpt("debugMode", !!val),
121   get debugCache () addonOptions._getOpt("debugCache"),
122   set debugCache (val) addonOptions._setOpt("debugCache", !!val),
123   get logEnabled () addonOptions._getOpt("logEnabled"),
124   set logEnabled (val) addonOptions._setOpt("logEnabled", !!val),
125   get openConsole () addonOptions._getOpt("openErrorConsoleOnStartup"),
126   set openConsole (val) addonOptions._setOpt("openErrorConsoleOnStartup", !!val),
127   get active () addonOptions._getOpt("active"),
128   set active (val) addonOptions._setOpt("active", !!val),
130 exportsGlobal.addonOptions = addonOptions;
133 ////////////////////////////////////////////////////////////////////////////////
134 let prefObserver = {
135   observe: function (aSubject, aTopic, aData) {
136     //conlog("data: ["+aData+"]; subj="+aSubject+"; topic="+aTopic);
137     //let name = aData.substr(PREFS_BRANCH.length);
138     //conlog("name: ["+name+"]");
139     //let prf = Services.prefs;
140     //if (name == "openErrorConsoleOnStartup") addonOptions.openConsole = prf.getBoolPref(aData);
141     if (aData.indexOf("dir") > 0) {
142       resetUserDirCache();
143     } else {
144       addonOptions._resetCache();
145     }
146   },
150 ////////////////////////////////////////////////////////////////////////////////
151 registerStartupHook("preferences", function () {
152   setDefaultPrefs(); // always set the default prefs as they disappear on restart
153   Services.prefs.addObserver(PREFS_BRANCH, prefObserver, false);
157 registerShutdownHook("preferences", function () {
158   Services.prefs.removeObserver(PREFS_BRANCH, prefObserver);