summaryrefslogtreecommitdiffstats
path: root/comm/mail/modules/TBDistCustomizer.jsm
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/modules/TBDistCustomizer.jsm')
-rw-r--r--comm/mail/modules/TBDistCustomizer.jsm162
1 files changed, 162 insertions, 0 deletions
diff --git a/comm/mail/modules/TBDistCustomizer.jsm b/comm/mail/modules/TBDistCustomizer.jsm
new file mode 100644
index 0000000000..0de0c3ceb3
--- /dev/null
+++ b/comm/mail/modules/TBDistCustomizer.jsm
@@ -0,0 +1,162 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const EXPORTED_SYMBOLS = ["TBDistCustomizer"];
+
+const { XPCOMUtils } = ChromeUtils.importESModule(
+ "resource://gre/modules/XPCOMUtils.sys.mjs"
+);
+
+var TBDistCustomizer = {
+ applyPrefDefaults() {
+ this._prefDefaultsApplied = true;
+ if (!this._ini) {
+ return;
+ }
+ // Grab the sections of the ini file
+ let sections = enumToObject(this._ini.getSections());
+
+ // The global section, and several of its fields, is required
+ // Function exits if this section and its fields are not present
+ if (!sections.Global) {
+ return;
+ }
+
+ // Get the keys in the "Global" section of the ini file
+ let globalPrefs = enumToObject(this._ini.getKeys("Global"));
+ if (!(globalPrefs.id && globalPrefs.version && globalPrefs.about)) {
+ return;
+ }
+
+ // Get the entire preferences tree (defaults is an instance of nsIPrefBranch)
+ let defaults = Services.prefs.getDefaultBranch(null);
+
+ // Set the following user prefs
+ defaults.setCharPref(
+ "distribution.id",
+ this._ini.getString("Global", "id")
+ );
+ defaults.setCharPref(
+ "distribution.version",
+ this._ini.getString("Global", "version")
+ );
+ let partnerAbout;
+ if (globalPrefs["about." + this._locale]) {
+ partnerAbout = this._ini.getString("Global", "about." + this._locale);
+ } else {
+ partnerAbout = this._ini.getString("Global", "about");
+ }
+ defaults.setStringPref("distribution.about", partnerAbout);
+
+ if (sections.Preferences) {
+ let keys = this._ini.getKeys("Preferences");
+ for (let key of keys) {
+ try {
+ // Get the string value of the key
+ let value = this.parseValue(this._ini.getString("Preferences", key));
+ // After determining what type it is, set the pref
+ switch (typeof value) {
+ case "boolean":
+ defaults.setBoolPref(key, value);
+ break;
+ case "number":
+ defaults.setIntPref(key, value);
+ break;
+ case "string":
+ defaults.setCharPref(key, value);
+ break;
+ case "undefined":
+ // In case of custom pref created by partner
+ defaults.setCharPref(key, value);
+ break;
+ }
+ } catch (e) {
+ console.error(e);
+ }
+ }
+ }
+
+ // Set the prefs in the other sections
+ let localizedStr = Cc["@mozilla.org/pref-localizedstring;1"].createInstance(
+ Ci.nsIPrefLocalizedString
+ );
+
+ if (sections.LocalizablePreferences) {
+ let keys = this._ini.getKeys("LocalizablePreferences");
+ for (let key of keys) {
+ try {
+ let value = this.parseValue(
+ this._ini.getString("LocalizablePreferences", key)
+ );
+ value = value.replace(/%LOCALE%/g, this._locale);
+ localizedStr.data = "data:text/plain," + key + "=" + value;
+ defaults.setComplexValue(
+ key,
+ Ci.nsIPrefLocalizedString,
+ localizedStr
+ );
+ } catch (e) {
+ console.error(e);
+ }
+ }
+ }
+
+ if (sections["LocalizablePreferences-" + this._locale]) {
+ let keys = this._ini.getKeys("LocalizablePreferences-" + this._locale);
+ for (let key of keys) {
+ try {
+ let value = this.parseValue(
+ this._ini.getString("LocalizablePreferences-" + this._locale, key)
+ );
+ localizedStr.data = "data:text/plain," + key + "=" + value;
+ defaults.setComplexValue(
+ key,
+ Ci.nsIPrefLocalizedString,
+ localizedStr
+ );
+ } catch (e) {
+ console.error(e);
+ }
+ }
+ }
+ },
+
+ parseValue(value) {
+ try {
+ value = JSON.parse(value);
+ } catch (e) {
+ // JSON.parse catches numbers and booleans.
+ // Anything else, we assume is a string.
+ // Remove the quotes that aren't needed anymore.
+ value = value.replace(/^"/, "");
+ value = value.replace(/"$/, "");
+ }
+ return value;
+ },
+};
+
+XPCOMUtils.defineLazyGetter(TBDistCustomizer, "_ini", function () {
+ let ini = null;
+ let iniFile = Services.dirsvc.get("XCurProcD", Ci.nsIFile);
+ iniFile.append("distribution");
+ iniFile.append("distribution.ini");
+ if (iniFile.exists()) {
+ ini = Cc["@mozilla.org/xpcom/ini-parser-factory;1"]
+ .getService(Ci.nsIINIParserFactory)
+ .createINIParser(iniFile);
+ }
+ return ini;
+});
+
+XPCOMUtils.defineLazyGetter(TBDistCustomizer, "_locale", function () {
+ return Services.locale.requestedLocale;
+});
+
+function enumToObject(UTF8Enumerator) {
+ let ret = {};
+ for (let UTF8Obj of UTF8Enumerator) {
+ ret[UTF8Obj] = 1;
+ }
+ return ret;
+}