diff options
Diffstat (limited to 'comm/mail/modules/TBDistCustomizer.jsm')
-rw-r--r-- | comm/mail/modules/TBDistCustomizer.jsm | 162 |
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; +} |