summaryrefslogtreecommitdiffstats
path: root/comm/suite/components/migration/SuiteProfileMigrator.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/suite/components/migration/SuiteProfileMigrator.js')
-rw-r--r--comm/suite/components/migration/SuiteProfileMigrator.js149
1 files changed, 149 insertions, 0 deletions
diff --git a/comm/suite/components/migration/SuiteProfileMigrator.js b/comm/suite/components/migration/SuiteProfileMigrator.js
new file mode 100644
index 0000000000..0ad4dfcca3
--- /dev/null
+++ b/comm/suite/components/migration/SuiteProfileMigrator.js
@@ -0,0 +1,149 @@
+/* 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/. */
+
+"use strict";
+
+var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+var { XPCOMUtils } =
+ ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+const { FileUtils } =
+ ChromeUtils.import("resource://gre/modules/FileUtils.jsm");
+const { AppConstants } =
+ ChromeUtils.import('resource://gre/modules/AppConstants.jsm');
+
+ChromeUtils.defineModuleGetter(this, "FileUtils",
+ "resource://gre/modules/FileUtils.jsm");
+
+function ProfileMigrator() {
+}
+
+ProfileMigrator.prototype = {
+ migrate: function PM_migrate(aStartup) {
+ // By opening the wizard with a supplied migrator, it will automatically
+ // migrate from it.
+ let [key, migrator] = this._getDefaultMigrator();
+ if (!key)
+ return;
+
+ let params = Cc["@mozilla.org/array;1"]
+ .createInstance(Ci.nsIMutableArray);
+ params.appendElement(this._toString(key));
+ params.appendElement(migrator);
+ params.appendElement(aStartup);
+
+ Services.ww.openWindow(null,
+ "chrome://communicator/content/migration/migration.xul",
+ "_blank",
+ "chrome,dialog,modal,centerscreen,titlebar",
+ params);
+ },
+
+ _toString: function PM__toString(aStr) {
+ let str = Cc["@mozilla.org/supports-string;1"]
+ .createInstance(Ci.nsISupportsString);
+ str.data = aStr;
+ return str;
+ },
+
+ _getMigratorIfSourceExists: function PM__getMigratorIfSourceExists(aKey) {
+ let cid = "@mozilla.org/profile/migrator;1?app=suite&type=" + aKey;
+ let migrator = Cc[cid].createInstance(Ci.nsISuiteProfileMigrator);
+ if (migrator.sourceExists)
+ return migrator;
+ return null;
+ },
+
+ // We don't yet support checking for the default browser on all platforms,
+ // needless to say we don't have migrators for all browsers. Thus, for each
+ // platform, there's a fallback list of migrators used in these cases.
+ _PLATFORM_FALLBACK_LIST:
+ ["thunderbird"],
+
+ _getDefaultMigrator: function PM__getDefaultMigrator() {
+
+ let migratorsOrdered = Array.from(this._PLATFORM_FALLBACK_LIST);
+
+ // FIXME This is all so not working currently.
+ // There are currently no migrators for browsers available.
+ // See Bug 739056.
+ if (false) {
+ let defaultBrowser = "";
+
+ if (AppConstants.platform == "win") {
+ try {
+ const REG_KEY = "SOFTWARE\\Classes\\HTTP\\shell\\open\\command";
+ let regKey = Cc["@mozilla.org/windows-registry-key;1"]
+ .createInstance(Ci.nsIWindowsRegKey);
+ regKey.open(regKey.ROOT_KEY_LOCAL_MACHINE, REG_KEY,
+ regKey.ACCESS_READ);
+ let value = regKey.readStringValue("").toLowerCase();
+ let pathMatches = value.match(/^"?(.+?\.exe)"?/);
+ if (!pathMatches) {
+ throw new Error("Could not extract path from " +
+ REG_KEY + "(" + value + ")");
+ }
+
+ // We want to find out what the default browser is but the path in and of
+ // itself isn't enough. Why? Because sometimes on Windows paths get
+ // truncated like so: C:\PROGRA~1\MOZILL~2\MOZILL~1.EXE. How do we know
+ // what product that is? Mozilla's file objects do nothing to 'normalize'
+ // the path so we need to attain an actual product descriptor from the
+ // file somehow, and in this case it means getting the "InternalName"
+ // field of the file's VERSIONINFO resource.
+ //
+ // In the file's resource segment there is a VERSIONINFO section that is
+ // laid out like this:
+ //
+ // VERSIONINFO
+ // StringFileInfo
+ // <TranslationID>
+ // InternalName "iexplore"
+ // VarFileInfo
+ // Translation <TranslationID>
+ //
+ // By Querying the VERSIONINFO section for its Tranlations, we can find
+ // out where the InternalName lives (A file can have more than one
+ // translation of its VERSIONINFO segment, but we just assume the first
+ // one).
+ let file = FileUtils.File(pathMatches[1])
+ .QueryInterface(Ci.nsILocalFileWin);
+ switch (file.getVersionInfoField("InternalName").toLowerCase()) {
+ case "iexplore":
+ defaultBrowser = "ie";
+ break;
+ case "chrome":
+ defaultBrowser = "chrome";
+ break;
+ }
+ }
+ catch (ex) {
+ Cu.reportError("Could not retrieve default browser: " + ex);
+ }
+ }
+
+ // If we found the default browser and we have support for that browser,
+ // make sure to check it before any other browser, by moving it to the head
+ // of the array.
+ if (defaultBrowser) {
+ migratorsOrdered.sort((a, b) => b == defaultBrowser ? 1 : 0);
+ }
+ }
+
+ for (let key of migratorsOrdered) {
+ let migrator = this._getMigratorIfSourceExists(key);
+ if (migrator) {
+ return [key, migrator];
+ }
+ }
+
+ return ["", null];
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIProfileMigrator]),
+ classDescription: "Profile Migrator",
+ contractID: "@mozilla.org/toolkit/profile-migrator;1",
+ classID: Components.ID("{d5148b7c-ba4e-4f7a-a80b-1ae48b90b910}"),
+};
+
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([ProfileMigrator]);