Bug 710895 - Part 2: Remove the old IE migrator
authorMarco Bonardo <mbonardo@mozilla.com>
Tue, 17 Apr 2012 15:35:46 +0200
changeset 91855 2e3090639b46d7319681a6cbaa5a6d91c67c70e1
parent 91854 279264d06d08ba858f52a8e53cedfffd5c8db4eb
child 91856 193999908be8160fea8600ec8cbd51d4020d6c19
push id22480
push useremorley@mozilla.com
push dateWed, 18 Apr 2012 00:48:48 +0000
treeherdermozilla-central@93dfd98900ad [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs710895
milestone14.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 710895 - Part 2: Remove the old IE migrator Original patch by Felipe Gomes<felipc@gmail.com> r=mak r=Mano
browser/components/build/nsBrowserCompsCID.h
browser/components/build/nsModule.cpp
browser/components/migration/src/Makefile.in
browser/components/migration/src/nsBrowserProfileMigratorUtils.cpp
browser/components/migration/src/nsBrowserProfileMigratorUtils.h
browser/components/migration/src/nsIEProfileMigrator.cpp
browser/components/migration/src/nsIEProfileMigrator.h
--- a/browser/components/build/nsBrowserCompsCID.h
+++ b/browser/components/build/nsBrowserCompsCID.h
@@ -31,34 +31,24 @@
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 /////////////////////////////////////////////////////////////////////////////
 
-#define NS_BROWSERPROFILEMIGRATOR_CONTRACTID_PREFIX "@mozilla.org/profile/migrator;1?app=browser&type="
-
 #ifdef XP_WIN
-#define NS_WINIEPROFILEMIGRATOR_CID \
-{ 0xbc15c73d, 0xc05b, 0x497b, { 0xa3, 0x73, 0x4b, 0xae, 0x6c, 0x17, 0x86, 0x31 } }
-
 #define NS_WINIEHISTORYENUMERATOR_CID \
 { 0x93480624, 0x806e, 0x4756, { 0xb7, 0xcb, 0x0f, 0xb7, 0xdd, 0x74, 0x6a, 0x8f } }
 
 #define NS_IEHISTORYENUMERATOR_CONTRACTID \
   "@mozilla.org/profile/migrator/iehistoryenumerator;1"
 #endif
 
-#ifdef XP_MACOSX
-#define NS_SAFARIPROFILEMIGRATOR_CID \
-{ 0x29e3b139, 0xad19, 0x44f3, { 0xb2, 0xc2, 0xe9, 0xf1, 0x3b, 0xa2, 0xbb, 0xc6 } }
-#endif
-
 #define NS_SHELLSERVICE_CID \
 { 0x63c7b9f4, 0xcc8, 0x43f8, { 0xb6, 0x66, 0xa, 0x66, 0x16, 0x55, 0xcb, 0x73 } }
 
 #define NS_SHELLSERVICE_CONTRACTID \
   "@mozilla.org/browser/shell-service;1"
 
 #define NS_RDF_FORWARDPROXY_INFER_DATASOURCE_CID \
 { 0x7a024bcf, 0xedd5, 0x4d9a, { 0x86, 0x14, 0xd4, 0x4b, 0xe1, 0xda, 0xda, 0xd3 } }
--- a/browser/components/build/nsModule.cpp
+++ b/browser/components/build/nsModule.cpp
@@ -45,17 +45,16 @@
 #include "nsWindowsShellService.h"
 #elif defined(XP_MACOSX)
 #include "nsMacShellService.h"
 #elif defined(MOZ_WIDGET_GTK2)
 #include "nsGNOMEShellService.h"
 #endif
 
 #if defined(XP_WIN) && !defined(__MINGW32__)
-#include "nsIEProfileMigrator.h"
 #include "nsIEHistoryEnumerator.h"
 #endif
 
 #include "rdf.h"
 #include "nsFeedSniffer.h"
 #include "AboutRedirector.h"
 #include "nsIAboutModule.h"
 
@@ -71,51 +70,48 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(Directory
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsWindowsShellService)
 #elif defined(XP_MACOSX)
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsMacShellService)
 #elif defined(MOZ_WIDGET_GTK2)
 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGNOMEShellService, Init)
 #endif
 
 #if defined(XP_WIN) && !defined(__MINGW32__)
-NS_GENERIC_FACTORY_CONSTRUCTOR(nsIEProfileMigrator)
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsIEHistoryEnumerator)
 #endif
 
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsFeedSniffer)
 
 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrivateBrowsingServiceWrapper, Init)
 
 NS_DEFINE_NAMED_CID(NS_BROWSERDIRECTORYPROVIDER_CID);
 #if defined(XP_WIN)
 NS_DEFINE_NAMED_CID(NS_SHELLSERVICE_CID);
 #elif defined(MOZ_WIDGET_GTK2)
 NS_DEFINE_NAMED_CID(NS_SHELLSERVICE_CID);
 #endif
 NS_DEFINE_NAMED_CID(NS_FEEDSNIFFER_CID);
 NS_DEFINE_NAMED_CID(NS_BROWSER_ABOUT_REDIRECTOR_CID);
 #if defined(XP_WIN) && !defined(__MINGW32__)
-NS_DEFINE_NAMED_CID(NS_WINIEPROFILEMIGRATOR_CID);
 NS_DEFINE_NAMED_CID(NS_WINIEHISTORYENUMERATOR_CID);
 #elif defined(XP_MACOSX)
 NS_DEFINE_NAMED_CID(NS_SHELLSERVICE_CID);
 #endif
 NS_DEFINE_NAMED_CID(NS_PRIVATE_BROWSING_SERVICE_WRAPPER_CID);
 
 static const mozilla::Module::CIDEntry kBrowserCIDs[] = {
     { &kNS_BROWSERDIRECTORYPROVIDER_CID, false, NULL, DirectoryProviderConstructor },
 #if defined(XP_WIN)
     { &kNS_SHELLSERVICE_CID, false, NULL, nsWindowsShellServiceConstructor },
 #elif defined(MOZ_WIDGET_GTK2)
     { &kNS_SHELLSERVICE_CID, false, NULL, nsGNOMEShellServiceConstructor },
 #endif
     { &kNS_FEEDSNIFFER_CID, false, NULL, nsFeedSnifferConstructor },
     { &kNS_BROWSER_ABOUT_REDIRECTOR_CID, false, NULL, AboutRedirector::Create },
 #if defined(XP_WIN) && !defined(__MINGW32__)
-    { &kNS_WINIEPROFILEMIGRATOR_CID, false, NULL, nsIEProfileMigratorConstructor },
     { &kNS_WINIEHISTORYENUMERATOR_CID, false, NULL, nsIEHistoryEnumeratorConstructor },
 #elif defined(XP_MACOSX)
     { &kNS_SHELLSERVICE_CID, false, NULL, nsMacShellServiceConstructor },
 #endif
     { &kNS_PRIVATE_BROWSING_SERVICE_WRAPPER_CID, false, NULL, nsPrivateBrowsingServiceWrapperConstructor },
     { NULL }
 };
 
@@ -139,17 +135,16 @@ static const mozilla::Module::ContractID
 #ifdef MOZ_SERVICES_SYNC
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "sync-tabs", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "sync-progress", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
 #endif
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "home", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "newtab", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "permissions", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
 #if defined(XP_WIN) && !defined(__MINGW32__)
-    { NS_BROWSERPROFILEMIGRATOR_CONTRACTID_PREFIX "ie", &kNS_WINIEPROFILEMIGRATOR_CID },
     { NS_IEHISTORYENUMERATOR_CONTRACTID, &kNS_WINIEHISTORYENUMERATOR_CID },
 #elif defined(XP_MACOSX)
     { NS_SHELLSERVICE_CONTRACTID, &kNS_SHELLSERVICE_CID },
 #endif
     { NS_PRIVATE_BROWSING_SERVICE_CONTRACTID, &kNS_PRIVATE_BROWSING_SERVICE_WRAPPER_CID },
     { NULL }
 };
 
--- a/browser/components/migration/src/Makefile.in
+++ b/browser/components/migration/src/Makefile.in
@@ -50,20 +50,17 @@ endif
 
 EXTRA_PP_COMPONENTS = \
   ProfileMigrator.js \
   ChromeProfileMigrator.js \
   FirefoxProfileMigrator.js \
   $(NULL)
 
 ifeq ($(OS_ARCH)_$(GNU_CXX),WINNT_)
-CPPSRCS += nsIEProfileMigrator.cpp \
-           nsBrowserProfileMigratorUtils.cpp \
-           nsIEHistoryEnumerator.cpp \
-           $(NULL)
+CPPSRCS += nsIEHistoryEnumerator.cpp
 
 EXTRA_PP_COMPONENTS += SafariProfileMigrator.js \
                        $(NULL)
 endif
 
 ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT))
 EXTRA_PP_COMPONENTS += SafariProfileMigrator.js \
                        $(NULL)
deleted file mode 100644
--- a/browser/components/migration/src/nsBrowserProfileMigratorUtils.cpp
+++ /dev/null
@@ -1,161 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is The Browser Profile Migrator.
- *
- * The Initial Developer of the Original Code is Ben Goodger.
- * Portions created by the Initial Developer are Copyright (C) 2004
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *  Ben Goodger <ben@bengoodger.com>
- *  Asaf Romano <mozilla.mano@sent.com>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#include "nsBrowserProfileMigratorUtils.h"
-#include "nsINavBookmarksService.h"
-#include "nsBrowserCompsCID.h"
-#include "nsToolkitCompsCID.h"
-#include "nsIPlacesImportExportService.h"
-#include "nsIFile.h"
-#include "nsIProperties.h"
-#include "nsIProfileMigrator.h"
-
-#include "nsIURI.h"
-#include "nsNetUtil.h"
-#include "nsISupportsPrimitives.h"
-
-#include "nsAppDirectoryServiceDefs.h"
-#include "nsIRDFService.h"
-#include "nsIStringBundle.h"
-#include "nsXPCOMCID.h"
-
-void SetUnicharPref(const char* aPref, const nsAString& aValue,
-                    nsIPrefBranch* aPrefs)
-{
-  nsCOMPtr<nsISupportsString> supportsString =
-    do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID);    
-  if (supportsString) {
-     supportsString->SetData(aValue); 
-     aPrefs->SetComplexValue(aPref, NS_GET_IID(nsISupportsString),
-                             supportsString);
-  }
-}
-
-void SetProxyPref(const nsAString& aHostPort, const char* aPref, 
-                  const char* aPortPref, nsIPrefBranch* aPrefs) 
-{
-  nsCOMPtr<nsIURI> uri;
-  nsCAutoString host;
-  PRInt32 portValue;
-
-  // try parsing it as a URI first
-  if (NS_SUCCEEDED(NS_NewURI(getter_AddRefs(uri), aHostPort))
-      && NS_SUCCEEDED(uri->GetHost(host))
-      && !host.IsEmpty()
-      && NS_SUCCEEDED(uri->GetPort(&portValue))) {
-    SetUnicharPref(aPref, NS_ConvertUTF8toUTF16(host), aPrefs);
-    aPrefs->SetIntPref(aPortPref, portValue);
-  }
-  else {
-    nsAutoString hostPort(aHostPort);  
-    PRInt32 portDelimOffset = hostPort.RFindChar(':');
-    if (portDelimOffset > 0) {
-      SetUnicharPref(aPref, Substring(hostPort, 0, portDelimOffset), aPrefs);
-      nsAutoString port(Substring(hostPort, portDelimOffset + 1));
-      nsresult stringErr;
-      portValue = port.ToInteger(&stringErr);
-      if (NS_SUCCEEDED(stringErr))
-        aPrefs->SetIntPref(aPortPref, portValue);
-    }
-    else
-      SetUnicharPref(aPref, hostPort, aPrefs); 
-  }
-}
-
-void ParseOverrideServers(const nsAString& aServers, nsIPrefBranch* aBranch)
-{
-  // Windows (and Opera) formats its proxy override list in the form:
-  // server;server;server where server is a server name or ip address, 
-  // or "<local>". Mozilla's format is server,server,server, and <local>
-  // must be translated to "localhost,127.0.0.1"
-  nsAutoString override(aServers);
-  PRInt32 left = 0, right = 0;
-  for (;;) {
-    right = override.FindChar(';', right);
-    const nsAString& host = Substring(override, left, 
-                                      (right < 0 ? override.Length() : right) - left);
-    if (host.EqualsLiteral("<local>"))
-      override.Replace(left, 7, NS_LITERAL_STRING("localhost,127.0.0.1"));
-    if (right < 0)
-      break;
-    left = right + 1;
-    override.Replace(right, 1, NS_LITERAL_STRING(","));
-  }
-  SetUnicharPref("network.proxy.no_proxies_on", override, aBranch); 
-}
-
-void GetMigrateDataFromArray(MigrationData* aDataArray, PRInt32 aDataArrayLength, 
-                             bool aReplace, nsIFile* aSourceProfile, 
-                             PRUint16* aResult)
-{
-  nsCOMPtr<nsIFile> sourceFile; 
-  bool exists;
-  MigrationData* cursor;
-  MigrationData* end = aDataArray + aDataArrayLength;
-  for (cursor = aDataArray; cursor < end && cursor->fileName; ++cursor) {
-    // When in replace mode, all items can be imported. 
-    // When in non-replace mode, only items that do not require file replacement
-    // can be imported.
-    if (aReplace || !cursor->replaceOnly) {
-      aSourceProfile->Clone(getter_AddRefs(sourceFile));
-      sourceFile->Append(nsDependentString(cursor->fileName));
-      sourceFile->Exists(&exists);
-      if (exists)
-        *aResult |= cursor->sourceFlag;
-    }
-    NS_Free(cursor->fileName);
-    cursor->fileName = nsnull;
-  }
-}
-
-void
-GetProfilePath(nsIProfileStartup* aStartup, nsCOMPtr<nsIFile>& aProfileDir)
-{
-  if (aStartup) {
-    aStartup->GetDirectory(getter_AddRefs(aProfileDir));
-  }
-  else {
-    nsCOMPtr<nsIProperties> dirSvc
-      (do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID));
-    if (dirSvc) {
-      dirSvc->Get(NS_APP_USER_PROFILE_50_DIR, NS_GET_IID(nsIFile),
-                  (void**) getter_AddRefs(aProfileDir));
-    }
-  }
-}
-
deleted file mode 100644
--- a/browser/components/migration/src/nsBrowserProfileMigratorUtils.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is The Browser Profile Migrator.
- *
- * The Initial Developer of the Original Code is Ben Goodger.
- * Portions created by the Initial Developer are Copyright (C) 2004
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *  Ben Goodger <ben@bengoodger.com>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef browserprofilemigratorutils___h___
-#define browserprofilemigratorutils___h___
-
-#define MIGRATION_ITEMBEFOREMIGRATE "Migration:ItemBeforeMigrate"
-#define MIGRATION_ITEMMIGRATEERROR  "Migration:ItemError"
-#define MIGRATION_ITEMAFTERMIGRATE  "Migration:ItemAfterMigrate"
-#define MIGRATION_STARTED           "Migration:Started"
-#define MIGRATION_ENDED             "Migration:Ended"
-
-#define NOTIFY_OBSERVERS(message, item) \
-  mObserverService->NotifyObservers(nsnull, message, item)
-
-#define COPY_DATA(func, replace, itemIndex) \
-  if ((aItems & itemIndex || !aItems)) { \
-    nsAutoString index; \
-    index.AppendInt(itemIndex); \
-    NOTIFY_OBSERVERS(MIGRATION_ITEMBEFOREMIGRATE, index.get()); \
-    if (NS_FAILED(func(replace))) \
-      NOTIFY_OBSERVERS(MIGRATION_ITEMMIGRATEERROR, index.get()); \
-    NOTIFY_OBSERVERS(MIGRATION_ITEMAFTERMIGRATE, index.get()); \
-  }
-
-#define NC_URI(property) \
-  NS_LITERAL_CSTRING("http://home.netscape.com/NC-rdf#"#property)
-
-#define BATCH_ACTION_HISTORY 0
-#define BATCH_ACTION_HISTORY_REPLACE 1
-#define BATCH_ACTION_BOOKMARKS 2
-#define BATCH_ACTION_BOOKMARKS_REPLACE 3
-
-#include "nsIPrefBranch.h"
-#include "nsIFile.h"
-#include "nsStringAPI.h"
-#include "nsCOMPtr.h"
-
-class nsIProfileStartup;
-
-
-void SetUnicharPref(const char* aPref, const nsAString& aValue,
-                    nsIPrefBranch* aPrefs);
-
-// Proxy utilities shared by the Opera and IE migrators
-void ParseOverrideServers(const nsAString& aServers, nsIPrefBranch* aBranch);
-void SetProxyPref(const nsAString& aHostPort, const char* aPref, 
-                  const char* aPortPref, nsIPrefBranch* aPrefs);
-
-struct MigrationData { 
-  PRUnichar* fileName; 
-  PRUint32 sourceFlag;
-  bool replaceOnly;
-};
-
-class nsILocalFile;
-void GetMigrateDataFromArray(MigrationData* aDataArray, 
-                             PRInt32 aDataArrayLength,
-                             bool aReplace,
-                             nsIFile* aSourceProfile, 
-                             PRUint16* aResult);
-
-
-// get the base directory of the *target* profile
-// this is already cloned, modify it to your heart's content
-void GetProfilePath(nsIProfileStartup* aStartup, nsCOMPtr<nsIFile>& aProfileDir);
-
-#endif
-
deleted file mode 100644
--- a/browser/components/migration/src/nsIEProfileMigrator.cpp
+++ /dev/null
@@ -1,2209 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 2002
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Daniel Matejka
- *     (Original Author)
- *   Ben Goodger <ben@bengoodger.com> 
- *     (History, Favorites, Passwords, Form Data, some settings)
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#include "mozilla/Util.h"
-
-#include <stdio.h>
-#include <string.h>
-#include <windows.h>
-#include "nsAppDirectoryServiceDefs.h"
-#include "nsBrowserProfileMigratorUtils.h"
-#include "nsCOMPtr.h"
-#include "nsCRTGlue.h"
-#include "nsNetCID.h"
-#include "nsDocShellCID.h"
-#include "nsDebug.h"
-#include "nsDirectoryServiceDefs.h"
-#include "nsDirectoryServiceUtils.h"
-#include "nsStringAPI.h"
-#include "plstr.h"
-#include "prio.h"
-#include "prmem.h"
-#include "prlong.h"
-#include "nsICookieManager2.h"
-#include "nsIEProfileMigrator.h"
-#include "nsIFile.h"
-#include "nsILocalFile.h"
-#include "nsIPrefService.h"
-#include "nsIPrefBranch.h"
-#include "nsISimpleEnumerator.h"
-#include "nsIProfileMigrator.h"
-#include "nsIBrowserProfileMigrator.h"
-#include "nsIObserverService.h"
-#include "nsILocalFileWin.h"
-#include "nsAutoPtr.h"
-
-#include "prnetdb.h"
-
-#include <objbase.h>
-#include <shlguid.h>
-#include <urlhist.h>
-#include <comdef.h>
-#include <shlobj.h>
-#include <intshcut.h>
-
-#include "nsIBrowserHistory.h"
-#include "nsIGlobalHistory.h"
-#include "nsIRDFRemoteDataSource.h"
-#include "nsIURI.h"
-#include "nsILoginManagerIEMigrationHelper.h"
-#include "nsILoginInfo.h"
-#include "nsIFormHistory.h"
-#include "nsIRDFService.h"
-#include "nsIRDFContainer.h"
-#include "nsIURL.h"
-#include "nsINavBookmarksService.h"
-#include "nsBrowserCompsCID.h"
-#include "nsIStringBundle.h"
-#include "nsNetUtil.h"
-#include "nsToolkitCompsCID.h"
-#include "nsUnicharUtils.h"
-#include "nsIWindowsRegKey.h"
-#include "nsISupportsPrimitives.h"
-#include "jsapi.h"
-
-#define kNotFound -1
-
-#define TRIDENTPROFILE_BUNDLE       "chrome://browser/locale/migration/migration.properties"
-
-#define REGISTRY_IE_MAIN_KEY \
-  NS_LITERAL_STRING("Software\\Microsoft\\Internet Explorer\\Main")
-#define REGISTRY_IE_TYPEDURL_KEY \
-  NS_LITERAL_STRING("Software\\Microsoft\\Internet Explorer\\TypedURLs")
-#define REGISTRY_IE_TOOLBAR_KEY \
-  NS_LITERAL_STRING("Software\\Microsoft\\Internet Explorer\\Toolbar")
-#define REGISTRY_IE_SEARCHURL_KEY \
-  NS_LITERAL_STRING("Software\\Microsoft\\Internet Explorer\\SearchUrl")
-
-using namespace mozilla;
-
-const int sInitialCookieBufferSize = 1024; // but it can grow
-const int sUsernameLengthLimit     = 80;
-const int sHostnameLengthLimit     = 255;
-
-//***********************************************************************
-//*** Replacements for comsupp.lib calls used by pstorec.dll
-//***********************************************************************
-void  __stdcall _com_issue_error(HRESULT hr)
-{
-  // XXX - Do nothing for now
-}
-
-//***********************************************************************
-//*** windows registry to mozilla prefs data type translation functions
-//***********************************************************************
-
-typedef void (*regEntryHandler)(nsIWindowsRegKey *, const nsString&,
-                                nsIPrefBranch *, char *);
-
-// yes/no string to T/F boolean
-void
-TranslateYNtoTF(nsIWindowsRegKey *aRegKey, const nsString& aRegValueName,
-                nsIPrefBranch *aPrefs, char *aPrefKeyName) {
-
-  // input type is a string, lowercase "yes" or "no"
-  nsAutoString regValue; 
-  if (NS_SUCCEEDED(aRegKey->ReadStringValue(aRegValueName, regValue)))
-    aPrefs->SetBoolPref(aPrefKeyName, regValue.EqualsLiteral("yes"));
-}
-
-// yes/no string to F/T boolean
-void
-TranslateYNtoFT(nsIWindowsRegKey *aRegKey, const nsString& aRegValueName,
-                nsIPrefBranch *aPrefs, char *aPrefKeyName) {
-
-  // input type is a string, lowercase "yes" or "no"
-  nsAutoString regValue; 
-  if (NS_SUCCEEDED(aRegKey->ReadStringValue(aRegValueName, regValue)))
-    aPrefs->SetBoolPref(aPrefKeyName, !regValue.EqualsLiteral("yes"));
-}
-
-void
-TranslateYNtoImageBehavior(nsIWindowsRegKey *aRegKey,
-                           const nsString& aRegValueName,
-                           nsIPrefBranch *aPrefs, char *aPrefKeyName) {
-  // input type is a string, lowercase "yes" or "no"
-  nsAutoString regValue; 
-  if (NS_SUCCEEDED(aRegKey->ReadStringValue(aRegValueName, regValue)) &&
-      !regValue.IsEmpty()) {
-    if (regValue.EqualsLiteral("yes"))
-      aPrefs->SetIntPref(aPrefKeyName, 1);
-    else
-      aPrefs->SetIntPref(aPrefKeyName, 2);
-  }
-}
-
-void
-TranslateDWORDtoHTTPVersion(nsIWindowsRegKey *aRegKey,
-                            const nsString& aRegValueName,
-                            nsIPrefBranch *aPrefs, char *aPrefKeyName) {
-  PRUint32 val;
-  if (NS_SUCCEEDED(aRegKey->ReadIntValue(aRegValueName, &val))) {
-    if (val & 0x1) 
-      aPrefs->SetCharPref(aPrefKeyName, "1.1");
-    else
-      aPrefs->SetCharPref(aPrefKeyName, "1.0");
-  }
-}
-
-// decimal RGB (1,2,3) to hex RGB (#010203)
-void
-TranslateDRGBtoHRGB(nsIWindowsRegKey *aRegKey, const nsString& aRegValueName,
-                    nsIPrefBranch *aPrefs, char *aPrefKeyName) {
-
-  // clear previous settings with defaults
-  char prefStringValue[10];
-
-  nsAutoString regValue; 
-  if (NS_SUCCEEDED(aRegKey->ReadStringValue(aRegValueName, regValue)) &&
-      !regValue.IsEmpty()) {
-    int red, green, blue;
-    ::swscanf(regValue.get(), L"%d,%d,%d", &red, &green, &blue);
-    ::sprintf(prefStringValue, "#%02X%02X%02X", red, green, blue);
-    aPrefs->SetCharPref(aPrefKeyName, prefStringValue);
-  }
-}
-
-// translate a windows registry DWORD int to a mozilla prefs PRInt32
-void
-TranslateDWORDtoPRInt32(nsIWindowsRegKey *aRegKey,
-                        const nsString& aRegValueName,
-                        nsIPrefBranch *aPrefs, char *aPrefKeyName) {
-
-  // clear previous settings with defaults
-  PRInt32 prefIntValue = 0;
-
-  if (NS_SUCCEEDED(aRegKey->ReadIntValue(aRegValueName, 
-                   reinterpret_cast<PRUint32 *>(&prefIntValue))))
-    aPrefs->SetIntPref(aPrefKeyName, prefIntValue);
-}
-
-// string copy
-void
-TranslateString(nsIWindowsRegKey *aRegKey, const nsString& aRegValueName,
-                nsIPrefBranch *aPrefs, char *aPrefKeyName) {
-  nsAutoString regValue; 
-  if (NS_SUCCEEDED(aRegKey->ReadStringValue(aRegValueName, regValue)) &&
-      !regValue.IsEmpty()) {
-    aPrefs->SetCharPref(aPrefKeyName, NS_ConvertUTF16toUTF8(regValue).get());
-  }
-}
-
-// translate accepted language character set formats
-// (modified string copy)
-void
-TranslateLanglist(nsIWindowsRegKey *aRegKey, const nsString& aRegValueName,
-                  nsIPrefBranch *aPrefs, char *aPrefKeyName) {
-
-  nsAutoString lang;
-  if (NS_FAILED(aRegKey->ReadStringValue(aRegValueName, lang)))
-      return;
-
-  // copy source format like "en-us,ar-kw;q=0.7,ar-om;q=0.3" into
-  // destination format like "en-us, ar-kw, ar-om"
-
-  char prefStringValue[MAX_PATH]; // a convenient size, one hopes
-  NS_LossyConvertUTF16toASCII langCstr(lang);
-  const char   *source = langCstr.get(),
-               *sourceEnd = source + langCstr.Length();
-  char   *dest = prefStringValue,
-         *destEnd = dest + (MAX_PATH-2); // room for " \0"
-  bool    skip = false,
-          comma = false;
-
-  while (source < sourceEnd && *source && dest < destEnd) {
-    if (*source == ',')
-      skip = false;
-    else if (*source == ';')
-      skip = true;
-    if (!skip) {
-      if (comma && *source != ' ')
-        *dest++ = ' ';
-      *dest++ = *source;
-    }
-    comma = *source == ',';
-    ++source;
-  }
-  *dest = 0;
-
-  aPrefs->SetCharPref(aPrefKeyName, prefStringValue);
-}
-
-static int CALLBACK
-fontEnumProc(const LOGFONTW *aLogFont, const TEXTMETRICW *aMetric,
-             DWORD aFontType, LPARAM aClosure) {
-  *((int *) aClosure) = aLogFont->lfPitchAndFamily & FF_ROMAN;
-  return 0;
-}
-void
-TranslatePropFont(nsIWindowsRegKey *aRegKey, const nsString& aRegValueName,
-                  nsIPrefBranch *aPrefs, char *aPrefKeyName) {
-
-  HDC      dc = ::GetDC(0);
-  LOGFONTW lf;
-  int      isSerif = 1;
-
-  // serif or sans-serif font?
-  lf.lfCharSet = DEFAULT_CHARSET;
-  lf.lfPitchAndFamily = 0;
-  nsAutoString font;
-  if (NS_FAILED(aRegKey->ReadStringValue(aRegValueName, font)))
-      return;
-
-  ::wcsncpy(lf.lfFaceName, font.get(), LF_FACESIZE);
-  lf.lfFaceName[LF_FACESIZE - 1] = L'\0';
-  ::EnumFontFamiliesExW(dc, &lf, fontEnumProc, (LPARAM) &isSerif, 0);
-  ::ReleaseDC(0, dc);
-
-  // XXX : For now, only x-western font is translated.
-  // All or Locale-dependent subset of fonts need to be translated.
-  nsDependentCString generic(isSerif ? "serif" : "sans-serif");
-  nsCAutoString prefName("font.name.");
-  prefName.Append(generic);
-  prefName.Append(".x-western");
-  aPrefs->SetCharPref(prefName.get(), NS_ConvertUTF16toUTF8(font).get());
-  aPrefs->SetCharPref("font.default.x-western", generic.get());
-}
-
-//***********************************************************************
-//*** master table of registry-to-gecko-pref translations
-//***********************************************************************
-
-struct regEntry {
-  char            *regKeyName,     // registry key (HKCU\Software ...)
-                  *regValueName;   // registry key leaf
-  char            *prefKeyName;    // pref name ("javascript.enabled" ...)
-  regEntryHandler  entryHandler;   // processing func
-};
-
-const regEntry gRegEntries[] = {
-  { "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\AutoComplete",
-     "AutoSuggest",
-     "browser.urlbar.autocomplete.enabled",
-     TranslateYNtoTF },
-  { "Software\\Microsoft\\Internet Explorer\\International",
-    "AcceptLanguage",
-    "intl.accept_languages",
-    TranslateLanglist },
-  // XXX : For now, only x-western font is translated.
-  // All or Locale-dependent subset of fonts need to be translated.
-  { "Software\\Microsoft\\Internet Explorer\\International\\Scripts\\3",
-    "IEFixedFontName",
-    "font.name.monospace.x-western",
-    TranslateString },
-  { 0, // an optimization: 0 means use the previous key
-    "IEPropFontName",
-    "", // special-cased in the translation function
-    TranslatePropFont },
-  { "Software\\Microsoft\\Internet Explorer\\Main",
-    "Use_DlgBox_Colors",
-    "browser.display.use_system_colors",
-    TranslateYNtoTF },
-  { 0,
-    "Use FormSuggest",
-    "browser.formfill.enable",
-    TranslateYNtoTF },
-  { 0,
-    "FormSuggest Passwords",
-    "signon.rememberSignons",
-    TranslateYNtoTF },
-#if 0
-  // Firefox supplies its own home page.
-  { 0,
-    "Start Page",
-     REG_SZ,
-    "browser.startup.homepage",
-    TranslateString },
-#endif
-  { 0, 
-    "Anchor Underline",
-    "browser.underline_anchors",
-    TranslateYNtoTF },
-  { 0,
-    "Display Inline Images",
-    "permissions.default.image",
-    TranslateYNtoImageBehavior },
-  { 0,
-    "Enable AutoImageResize",
-    "browser.enable_automatic_image_resizing",
-    TranslateYNtoTF },
-  { 0,
-    "Move System Caret",
-    "accessibility.browsewithcaret",
-    TranslateYNtoTF },
-  { 0,
-    "NotifyDownloadComplete",
-    "browser.download.manager.showAlertOnComplete",
-    TranslateYNtoTF },
-  { 0,
-    "SmoothScroll",   // XXX DWORD 
-    "general.smoothScroll",
-    TranslateYNtoTF },
-  { "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",
-    "EnableHttp1_1",
-    "network.http.version",
-    TranslateDWORDtoHTTPVersion },
-  { 0,
-    "ProxyHttp1.1",
-    "network.http.proxy.version",
-    TranslateDWORDtoHTTPVersion },
-// SecureProtocols
-  { "Software\\Microsoft\\Internet Explorer\\Settings",
-    "Always Use My Colors",            // XXX DWORD
-    "browser.display.use_document_colors",
-    TranslateYNtoFT },
-  { 0,
-    "Text Color",
-    "browser.display.foreground_color",
-    TranslateDRGBtoHRGB },
-  { 0,
-    "Background Color",
-    "browser.display.background_color",
-    TranslateDRGBtoHRGB },
-  { 0,
-    "Anchor Color",
-    "browser.anchor_color",
-    TranslateDRGBtoHRGB },
-  { 0,
-    "Anchor Color Visited",
-    "browser.visited_color",
-    TranslateDRGBtoHRGB },
-  { 0,
-    "Always Use My Font Face",    // XXX DWORD
-    "browser.display.use_document_fonts",
-    TranslateYNtoFT }
-};
-
-#if 0
-user_pref("font.size.fixed.x-western", 14);
-user_pref("font.size.variable.x-western", 15);
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-// nsIBrowserProfileMigrator
-NS_IMETHODIMP
-nsIEProfileMigrator::Migrate(PRUint16 aItems, nsIProfileStartup* aStartup, const PRUnichar* aProfile)
-{
-  nsresult rv = NS_OK;
-
-  bool aReplace = false;
-
-  if (aStartup) {
-    aReplace = true;
-    rv = aStartup->DoStartup();
-    NS_ENSURE_SUCCESS(rv, rv);
-  }
-
-  NOTIFY_OBSERVERS(MIGRATION_STARTED, nsnull);
-
-  COPY_DATA(CopyPreferences,  aReplace, nsIBrowserProfileMigrator::SETTINGS);
-  COPY_DATA(CopyCookies,      aReplace, nsIBrowserProfileMigrator::COOKIES);
-  COPY_DATA(CopyHistory,      aReplace, nsIBrowserProfileMigrator::HISTORY);
-  COPY_DATA(CopyFormData,     aReplace, nsIBrowserProfileMigrator::FORMDATA);
-  COPY_DATA(CopyPasswords,    aReplace, nsIBrowserProfileMigrator::PASSWORDS);
-  COPY_DATA(CopyFavorites,    aReplace, nsIBrowserProfileMigrator::BOOKMARKS);
-
-  NOTIFY_OBSERVERS(MIGRATION_ENDED, nsnull);
-
-  return rv;
-}
-
-NS_IMETHODIMP
-nsIEProfileMigrator::GetMigrateData(const PRUnichar* aProfile, 
-                                    bool aReplace,
-                                    PRUint16* aResult)
-{
-  if (TestForIE7()) {
-    // IE7 and up store form data and passwords in an unrecoverable
-    // way, preventing us from importing this data.
-    *aResult = nsIBrowserProfileMigrator::SETTINGS |
-               nsIBrowserProfileMigrator::COOKIES | 
-               nsIBrowserProfileMigrator::HISTORY |
-               nsIBrowserProfileMigrator::BOOKMARKS;
-  }
-  else {
-    *aResult = nsIBrowserProfileMigrator::SETTINGS |
-               nsIBrowserProfileMigrator::COOKIES | 
-               nsIBrowserProfileMigrator::HISTORY |
-               nsIBrowserProfileMigrator::FORMDATA |
-               nsIBrowserProfileMigrator::PASSWORDS |
-               nsIBrowserProfileMigrator::BOOKMARKS;
-  }
-
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-nsIEProfileMigrator::GetSourceExists(bool* aResult)
-{
-  // IE always exists. 
-  *aResult = true;
-
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-nsIEProfileMigrator::GetSourceProfiles(JS::Value* aResult)
-{
-  *aResult = JSVAL_NULL;
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-nsIEProfileMigrator::GetSourceHomePageURL(nsACString& aResult)
-{
-  nsCOMPtr<nsIWindowsRegKey> regKey = 
-    do_CreateInstance("@mozilla.org/windows-registry-key;1");
-  if (!regKey ||
-      NS_FAILED(regKey->Open(nsIWindowsRegKey::ROOT_KEY_CURRENT_USER,
-                             REGISTRY_IE_MAIN_KEY,
-                             nsIWindowsRegKey::ACCESS_READ)))
-    return NS_OK;
-  // Read in the main home page
-  NS_NAMED_LITERAL_STRING(homeURLValName, "Start Page");
-  nsAutoString homeURLVal;
-
-  if (NS_SUCCEEDED(regKey->ReadStringValue(homeURLValName, homeURLVal))) {
-    // Do we need this round-about way to get |homePageURL|? 
-    // Perhaps, we do to have the form of URL under our control 
-    // (cf. network.standard-url.escape-utf8)
-    // Note that Windows stores URLs in IRI in the registry
-    nsCAutoString  homePageURL;
-    nsCOMPtr<nsIURI> homePageURI;
-
-    if (NS_SUCCEEDED(NS_NewURI(getter_AddRefs(homePageURI), homeURLVal))) {
-      if (NS_SUCCEEDED(homePageURI->GetSpec(homePageURL)) && !homePageURL.IsEmpty()) {
-          aResult.Assign(homePageURL);
-      }
-    }
-  }
-
-  // With IE7, The "Start Page" key still exists. Secondary home pages
-  // are located in a string stored in "Secondary Start Pages" which
-  // contains multiple Unicode URI seperated by nulls. (REG_MULTI_SZ)
-  NS_NAMED_LITERAL_STRING(ssRegKeyName, "Secondary Start Pages");
-  nsAutoString secondaryList;
-
-  if (NS_SUCCEEDED(regKey->ReadStringValue(ssRegKeyName, secondaryList)) &&
-      !secondaryList.IsEmpty()) {
-    nsTArray<nsCString> parsedList;
-    if (!ParseString(NS_ConvertUTF16toUTF8(secondaryList), '\0', parsedList))
-      return NS_OK;
-
-    // Split the result up into individual uri
-    for (PRUint32 index = 0; index < parsedList.Length(); ++index) {
-      nsCOMPtr<nsIURI> uri;
-      nsCAutoString homePage;
-      // Append "|uri" to result. This is how we currently handle
-      // storing multiple home pages.
-      if (NS_SUCCEEDED(NS_NewURI(getter_AddRefs(uri), parsedList[index]))) {
-        if (NS_SUCCEEDED(uri->GetSpec(homePage)) && !homePage.IsEmpty()) {
-            aResult.AppendLiteral("|");
-            aResult.Append(homePage);
-        }
-      }
-    }
-  }
-
-  return NS_OK;
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
-// nsIEProfileMigrator
-NS_IMPL_ISUPPORTS2(nsIEProfileMigrator, nsIBrowserProfileMigrator, nsINavHistoryBatchCallback);
-
-nsIEProfileMigrator::nsIEProfileMigrator()
-{
-  mObserverService = do_GetService("@mozilla.org/observer-service;1");
-}
-
-nsIEProfileMigrator::~nsIEProfileMigrator() 
-{
-}
-
-// Test used in detecting Internet Explorer 7 prior to presenting
-// import options.
-bool 
-nsIEProfileMigrator::TestForIE7()
-{
-  nsCOMPtr<nsIWindowsRegKey> regKey =  
-    do_CreateInstance("@mozilla.org/windows-registry-key;1"); 
-  if (!regKey)  
-    return false;  
-
-  NS_NAMED_LITERAL_STRING(key,
-      "Applications\\iexplore.exe\\shell\\open\\command");
-  if (NS_FAILED(regKey->Open(nsIWindowsRegKey::ROOT_KEY_CLASSES_ROOT,
-                             key, nsIWindowsRegKey::ACCESS_QUERY_VALUE)))
-    return false;
-
-  nsAutoString iePath;
-  if (NS_FAILED(regKey->ReadStringValue(EmptyString(), iePath)))
-    return false; 
-
-  // Replace embedded environment variables. 
-  PRUint32 bufLength =  
-    ::ExpandEnvironmentStringsW(iePath.get(), 
-                               L"", 0); 
-  if (bufLength == 0) // Error 
-    return false; 
-
-  nsAutoArrayPtr<PRUnichar> destination(new PRUnichar[bufLength]); 
-  if (!destination) 
-    return false; 
-
-  if (!::ExpandEnvironmentStringsW(iePath.get(), 
-                                   destination, 
-                                   bufLength)) 
-    return false; 
-
-  iePath = destination; 
-
-  // Check if the path is enclosed in quotation marks.
-  if (StringBeginsWith(iePath, NS_LITERAL_STRING("\""))) {
-    iePath.Cut(0,1);
-    PRInt32 index = iePath.FindChar('\"', 0);
-
-    // After removing the opening quoation mark,
-    // remove the closing one and everything after it.
-    if (index > 0)
-      iePath.Cut(index,iePath.Length());
-  }
-
-  nsCOMPtr<nsILocalFile> lf; 
-  NS_NewLocalFile(iePath, true, getter_AddRefs(lf)); 
-
-  nsCOMPtr<nsILocalFileWin> lfw = do_QueryInterface(lf); 
-  if (!lfw)
-   return false;
-   
-  nsAutoString ieVersion;
-  if (NS_FAILED(lfw->GetVersionInfoField("FileVersion", ieVersion)))
-   return false;
-
-  if (ieVersion.Length() > 2) {
-    PRInt32 index = ieVersion.FindChar('.', 0);
-    if (index == kNotFound)
-      return false;
-    ieVersion.Cut(index, ieVersion.Length());
-    PRInt32 ver = wcstol(ieVersion.get(), nsnull, 0);
-    if (ver >= 7) // Found 7 or greater major version
-      return true;
-  }
-
-  return false;
-}
-
-NS_IMETHODIMP
-nsIEProfileMigrator::RunBatched(nsISupports* aUserData)
-{
-  PRUint8 batchAction;
-  nsCOMPtr<nsISupportsPRUint8> strWrapper(do_QueryInterface(aUserData));
-  NS_ASSERTION(strWrapper, "Unable to create nsISupportsPRUint8 wrapper!");
-  nsresult rv = strWrapper->GetData(&batchAction);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  switch (batchAction) {
-    case BATCH_ACTION_HISTORY:
-      rv = CopyHistoryBatched(false);
-      break;
-    case BATCH_ACTION_HISTORY_REPLACE:
-      rv = CopyHistoryBatched(true);
-      break;
-    case BATCH_ACTION_BOOKMARKS:
-      rv = CopyFavoritesBatched(false);
-      break;
-    case BATCH_ACTION_BOOKMARKS_REPLACE:
-      rv = CopyFavoritesBatched(true);
-      break;
-  }
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  return NS_OK;
-}
-
-nsresult
-nsIEProfileMigrator::CopyHistory(bool aReplace)
-{
-  nsresult rv;
-  nsCOMPtr<nsINavHistoryService> history =
-    do_GetService(NS_NAVHISTORYSERVICE_CONTRACTID, &rv);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  PRUint8 batchAction = aReplace ? BATCH_ACTION_HISTORY_REPLACE
-                                 : BATCH_ACTION_HISTORY;
-  nsCOMPtr<nsISupportsPRUint8> supports =
-    do_CreateInstance(NS_SUPPORTS_PRUINT8_CONTRACTID);
-  NS_ENSURE_TRUE(supports, NS_ERROR_OUT_OF_MEMORY);
-  rv = supports->SetData(batchAction);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  rv = history->RunInBatchMode(this, supports);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  return NS_OK;
-}
-
-nsresult
-nsIEProfileMigrator::CopyHistoryBatched(bool aReplace)
-{
-  nsCOMPtr<nsIBrowserHistory> hist(do_GetService(NS_GLOBALHISTORY2_CONTRACTID));
-  nsCOMPtr<nsIIOService> ios(do_GetService(NS_IOSERVICE_CONTRACTID));
-
-  // First, Migrate standard IE History entries...
-  ::CoInitialize(NULL);
-
-  IUrlHistoryStg2* ieHistory;
-  HRESULT hr = ::CoCreateInstance(CLSID_CUrlHistory, 
-                                  NULL,
-                                  CLSCTX_INPROC_SERVER, 
-                                  IID_IUrlHistoryStg2, 
-                                  reinterpret_cast<void**>(&ieHistory));
-  if (SUCCEEDED(hr)) {
-    IEnumSTATURL* enumURLs;
-    hr = ieHistory->EnumUrls(&enumURLs);
-    if (SUCCEEDED(hr)) {
-      STATURL statURL;
-      ULONG fetched;
-      _bstr_t url;
-      nsCAutoString scheme;
-      SYSTEMTIME st;
-      bool validScheme = false;
-      PRUnichar* tempTitle = nsnull;
-
-      for (int count = 0; (hr = enumURLs->Next(1, &statURL, &fetched)) == S_OK; ++count) {
-        if (statURL.pwcsUrl) {
-          // 1 - Page Title
-          tempTitle = statURL.pwcsTitle ? (PRUnichar*)((wchar_t*)(statURL.pwcsTitle)) : nsnull;
-
-          // 2 - Last Visit Date
-          ::FileTimeToSystemTime(&(statURL.ftLastVisited), &st);
-          PRExplodedTime prt;
-          prt.tm_year = st.wYear;
-          prt.tm_month = st.wMonth - 1; // SYSTEMTIME's day-of-month parameter is 1-based, PRExplodedTime's is 0-based.
-          prt.tm_mday = st.wDay;
-          prt.tm_hour = st.wHour;
-          prt.tm_min = st.wMinute;
-          prt.tm_sec = st.wSecond;
-          prt.tm_usec = st.wMilliseconds * 1000;
-          prt.tm_wday = 0;
-          prt.tm_yday = 0;
-          prt.tm_params.tp_gmt_offset = 0;
-          prt.tm_params.tp_dst_offset = 0;
-          PRTime lastVisited = PR_ImplodeTime(&prt);
-
-          // 3 - URL
-          url = statURL.pwcsUrl;
-
-          NS_ConvertUTF16toUTF8 urlStr(url);
-
-          if (NS_FAILED(ios->ExtractScheme(urlStr, scheme))) {
-            ::CoTaskMemFree(statURL.pwcsUrl);    
-            if (statURL.pwcsTitle) 
-              ::CoTaskMemFree(statURL.pwcsTitle);
-            continue;
-          }
-          ToLowerCase(scheme);
-
-          // XXXben - 
-          // MSIE stores some types of URLs in its history that we can't handle, like HTMLHelp
-          // and others. At present Necko isn't clever enough to delegate handling of these types
-          // to the system, so we should just avoid importing them. 
-          const char* schemes[] = { "http", "https", "ftp", "file" };
-          for (int i = 0; i < 4; ++i) {
-            if (validScheme = scheme.Equals(schemes[i]))
-              break;
-          }
-          
-          // 4 - Now add the page
-          if (validScheme) {
-            nsCOMPtr<nsIURI> uri;
-            ios->NewURI(urlStr, nsnull, nsnull, getter_AddRefs(uri));
-            if (uri) {
-              if (tempTitle) 
-                hist->AddPageWithDetails(uri, tempTitle, lastVisited);
-              else
-                hist->AddPageWithDetails(uri, url, lastVisited);
-            }
-          }
-          ::CoTaskMemFree(statURL.pwcsUrl);    
-        }
-        if (statURL.pwcsTitle) 
-          ::CoTaskMemFree(statURL.pwcsTitle);    
-      }
-      nsCOMPtr<nsIRDFRemoteDataSource> ds(do_QueryInterface(hist));
-      if (ds)
-        ds->Flush();
-  
-      enumURLs->Release();
-    }
-
-    ieHistory->Release();
-  }
-  ::CoUninitialize();
-
-  // Now, find out what URLs were typed in by the user
-  nsCOMPtr<nsIWindowsRegKey> regKey = 
-    do_CreateInstance("@mozilla.org/windows-registry-key;1");
-  if (regKey && 
-      NS_SUCCEEDED(regKey->Open(nsIWindowsRegKey::ROOT_KEY_CURRENT_USER,
-                                REGISTRY_IE_TYPEDURL_KEY,
-                                nsIWindowsRegKey::ACCESS_READ))) {
-    int offset = 0;
-
-    while (1) {
-      nsAutoString valueName;
-      if (NS_FAILED(regKey->GetValueName(offset, valueName)))
-        break;
-
-      nsAutoString url; 
-      if (Substring(valueName, 0, 3).EqualsLiteral("url") &&
-          NS_SUCCEEDED(regKey->ReadStringValue(valueName, url))) {
-        nsCOMPtr<nsIURI> uri;
-        ios->NewURI(NS_ConvertUTF16toUTF8(url), nsnull, nsnull,
-                    getter_AddRefs(uri));
-        if (uri)
-          hist->MarkPageAsTyped(uri);
-      }
-      ++offset;
-    }
-  }
-
-  return NS_OK;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// IE PASSWORDS AND FORM DATA - A PROTECTED STORAGE SYSTEM PRIMER
-//
-// Internet Explorer 4.0 and up store sensitive form data (saved through form
-// autocomplete) and saved passwords in a special area of the Registry called
-// the Protected Storage System. The data IE stores in the Protected Storage 
-// System is located under:
-//
-// HKEY_CURRENT_USER\Software\Microsoft\Protected Storage System Provider\
-//   <USER_ID>\Data\<IE_PSS_GUID>\<IE_PSS_GUID>\
-//
-// <USER_ID> is a long string that uniquely identifies the current user
-// <IE_PSS_GUID> is a GUID that identifies a subsection of the Protected Storage
-// System specific to MSIE. This GUID is defined below ("IEPStoreAutocompGUID").
-//
-// Data is stored in the Protected Strage System ("PStore") in the following
-// format:
-// 
-// <IE_PStore_Key> \
-//                  fieldName1:StringData \ ItemData = <REG_BINARY>
-//                  fieldName2:StringData \ ItemData = <REG_BINARY>
-//                  http://foo.com/login.php:StringData \ ItemData = <REG_BINARY>
-//                  ... etc ...
-// 
-// Each key represents either the identifier of a web page text field that 
-// data was saved from (e.g. <input name="fieldName1">), or a URL that a login
-// (username + password) was saved at (e.g. "http://foo.com/login.php")
-//
-// Data is stored for each of these cases in the following format:
-//
-// for both types of data, the Value ItemData is REG_BINARY data format encrypted with 
-// a 3DES cipher. 
-//
-// for FormData: the decrypted data is in the form:
-//                  value1\0value2\0value3\0value4 ...
-// for Signons:  the decrypted data is in the form:
-//                  username\0password
-//
-// We cannot read the PStore directly by using Registry functions because the 
-// keys have limited read access such that only System process can read from them.
-// In order to read from the PStore we need to use Microsoft's undocumented PStore
-// API(*). 
-//
-// (* Sparse documentation became available as of the January 2004 MSDN Library
-//    release)
-//
-// The PStore API lets us read decrypted data from the PStore. Encryption does not
-// appear to be strong.
-// 
-// Details on how each type of data is read from the PStore and migrated appropriately
-// is discussed in more detail below.
-//
-// For more information about the PStore, read:
-//
-// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devnotes/winprog/pstore.asp
-//
-
-
-typedef HRESULT (WINAPI *PStoreCreateInstancePtr)(IPStore**, DWORD, DWORD, DWORD);
-
-// IE PStore Type GUIDs
-// {e161255a-37c3-11d2-bcaa-00c04fd929db} Autocomplete Password & Form Data
-//                                        Subtype has same GUID
-// {5e7e8100-9138-11d1-945a-00c04fc308ff} HTTP/FTP Auth Login Data
-//                                        Subtype has a zero GUID
-static GUID IEPStoreAutocompGUID = { 0xe161255a, 0x37c3, 0x11d2, { 0xbc, 0xaa, 0x00, 0xc0, 0x4f, 0xd9, 0x29, 0xdb } };
-static GUID IEPStoreSiteAuthGUID = { 0x5e7e8100, 0x9138, 0x11d1, { 0x94, 0x5a, 0x00, 0xc0, 0x4f, 0xc3, 0x08, 0xff } };
-
-///////////////////////////////////////////////////////////////////////////////
-// IMPORTING AUTOCOMPLETE PASSWORDS
-//
-// This is tricky, and requires 2 passes through the subkeys in IE's PStore 
-// section.
-//
-// First, we walk IE's PStore section, looking for subkeys that are prefixed
-// with a URI. As mentioned above, we assume all such subkeys are stored 
-// passwords.
-//
-//   http://foo.com/login.php:StringData   username\0password
-//
-// We can't add this item to the Password Manager just yet though. 
-//
-// The password manager requires the uniquifier of the username field (that is,
-// the value of the "name" or "id" attribute) from the webpage so that it can
-// prefill the value automatically. IE doesn't store this information with
-// the password entry, but it DOES store this information independently as a 
-// separate Form Data entry. 
-//
-// In other words, if you go to foo.com above and log in with "username" and
-// "password" as your details in a form where the username field is uniquified
-// as "un" (<input type="text" name="un">), when you login and elect to have IE 
-// save the password for the site, the following TWO entries are created in IE's
-// PStore section:
-//
-//   http://foo.com/login.php:StringData   username\0password
-//   un:StringData                         username
-//
-// Thus to discover the field name for each login we need to first gather up 
-// all the signons (collecting usernames in the process), then walk the list
-// again, looking ONLY at non-URI prefixed subkeys, and searching for each
-// username as a value in each such subkey's value list. If we have a match, 
-// we assume that the subkey (with its uniquifier prefix) is a login field. 
-//
-// With this information, we call Password Manager's "AddLogin" method 
-// providing this detail. We don't need to provide the password field name, 
-// we have no means of retrieving this info from IE, and the Password Manager
-// knows to hunt for a password field near the login field if none is specified.
-//
-// IMPLICATIONS:
-//  1) redundant signon entries for non-login forms might be created, but these
-//     should be benign.
-//  2) if the IE user ever clears his Form AutoComplete cache but doesn't clear
-//     his passwords, we will be hosed, as we have no means of locating the
-//     username field. Maybe someday the Password Manager will become 
-//     artificially intelligent and be able to guess where the login fields are,
-//     but I'm not holding my breath. 
-//
-
-nsresult
-nsIEProfileMigrator::CopyPasswords(bool aReplace)
-{
-  HRESULT hr;
-  nsresult rv;
-  nsTArray<SignonData> signonsFound;
-
-  HMODULE pstoreDLL = ::LoadLibraryW(L"pstorec.dll");
-  if (!pstoreDLL) {
-    // XXXben TODO
-    // Need to figure out what to do here on Windows 98 etc... it may be that the key is universal read
-    // and we can just blunder into the registry and use CryptUnprotect to get the data out. 
-    return NS_ERROR_FAILURE;
-  }
-
-  PStoreCreateInstancePtr PStoreCreateInstance = (PStoreCreateInstancePtr)::GetProcAddress(pstoreDLL, "PStoreCreateInstance");
-  IPStore* PStore;
-  hr = PStoreCreateInstance(&PStore, 0, 0, 0);
-
-  rv = GetSignonsListFromPStore(PStore, &signonsFound);
-  if (NS_SUCCEEDED(rv))
-    ResolveAndMigrateSignons(PStore, &signonsFound);
-
-  MigrateSiteAuthSignons(PStore);
-  return NS_OK;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// IMPORTING SITE AUTHENTICATION PASSWORDS
-//
-// This is simple and straightforward. We iterate through the part of the 
-// PStore that matches the type GUID defined in IEPStoreSiteAuthGUID and
-// a zero subtype GUID. For each item, we check the data for a ':' that
-// separates the username and password parts. If there is no ':', we give up.
-// After that, we check to see if the name of the item starts with "DPAPI:".
-// We bail out if that's the case, because we can't handle those yet.
-// However, if everything is all and well, we convert the itemName to a realm
-// string that the password manager can work with and save this login
-// via AddLogin.
-
-nsresult
-nsIEProfileMigrator::MigrateSiteAuthSignons(IPStore* aPStore)
-{
-  HRESULT hr;
-
-  NS_ENSURE_ARG_POINTER(aPStore);
-
-  nsCOMPtr<nsILoginManagerIEMigrationHelper> pwmgr(
-    do_GetService("@mozilla.org/login-manager/storage/legacy;1"));
-  if (!pwmgr)
-    return NS_OK;
-
-  GUID mtGuid = {0};
-  IEnumPStoreItems* enumItems = NULL;
-  hr = aPStore->EnumItems(0, &IEPStoreSiteAuthGUID, &mtGuid, 0, &enumItems);
-  if (SUCCEEDED(hr) && enumItems != NULL) {
-    LPWSTR itemName = NULL;
-    while ((enumItems->Next(1, &itemName, 0) == S_OK) && itemName) {
-      unsigned long count = 0;
-      unsigned char* data = NULL;
-
-      hr = aPStore->ReadItem(0, &IEPStoreSiteAuthGUID, &mtGuid, itemName,
-                             &count, &data, NULL, 0);
-      if (SUCCEEDED(hr) && data) {
-        unsigned long i;
-        unsigned char* password = NULL;
-        for (i = 0; i < count; i++)
-          if (data[i] == ':') {
-            data[i] = '\0';
-            if (i + 1 < count)
-              password = &data[i + 1];
-            break;
-          }
-
-        nsAutoString host(itemName), realm;
-        if (Substring(host, 0, 6).EqualsLiteral("DPAPI:")) // often FTP logins
-          password = NULL; // We can't handle these yet
-
-        if (password) {
-          int idx;
-          idx = host.FindChar('/');
-          if (idx) {
-            realm.Assign(Substring(host, idx + 1));
-            host.Assign(Substring(host, 0, idx));
-          }
-          // XXX: username and password are always ASCII in IPStore?
-          // If not, are they in UTF-8 or the default codepage? (ref. bug 41489)
-          nsresult rv;
-
-          nsCOMPtr<nsILoginInfo> aLogin (do_CreateInstance(
-                                           NS_LOGININFO_CONTRACTID, &rv));
-          NS_ENSURE_SUCCESS(rv, rv);
-
-          // nsStringAPI doesn't let us create void strings, so we won't
-          // use Init() here.
-          aLogin->SetHostname(host);
-          aLogin->SetHttpRealm(realm);
-          aLogin->SetUsername(NS_ConvertUTF8toUTF16((char *)data));
-          aLogin->SetPassword(NS_ConvertUTF8toUTF16((char *)password));
-          aLogin->SetUsernameField(EmptyString());
-          aLogin->SetPasswordField(EmptyString());
-
-          pwmgr->MigrateAndAddLogin(aLogin);
-        }
-        ::CoTaskMemFree(data);
-      }
-    }
-  }
-  return NS_OK;
-}
-
-nsresult
-nsIEProfileMigrator::GetSignonsListFromPStore(IPStore* aPStore, nsTArray<SignonData>* aSignonsFound)
-{
-  HRESULT hr;
-
-  NS_ENSURE_ARG_POINTER(aPStore);
-
-  IEnumPStoreItems* enumItems = NULL;
-  hr = aPStore->EnumItems(0, &IEPStoreAutocompGUID, &IEPStoreAutocompGUID, 0, &enumItems);
-  if (SUCCEEDED(hr) && enumItems != NULL) {
-    LPWSTR itemName = NULL;
-    while ((enumItems->Next(1, &itemName, 0) == S_OK) && itemName) {
-      unsigned long count = 0;
-      unsigned char* data = NULL;
-
-      // We are responsible for freeing |data| using |CoTaskMemFree|!!
-      // But we don't do it here... 
-      hr = aPStore->ReadItem(0, &IEPStoreAutocompGUID, &IEPStoreAutocompGUID, itemName, &count, &data, NULL, 0);
-      if (SUCCEEDED(hr) && data) {
-        nsAutoString itemNameString(itemName);
-        if (StringTail(itemNameString, 11).
-            LowerCaseEqualsLiteral(":stringdata")) {
-          // :StringData contains the saved data
-          const nsAString& key = Substring(itemNameString, 0, itemNameString.Length() - 11);
-          char* realm = nsnull;
-          if (KeyIsURI(key, &realm)) {
-            // This looks like a URL and could be a password. If it has username and password data, then we'll treat
-            // it as one and add it to the password manager
-            unsigned char* username = NULL;
-            unsigned char* pass = NULL;
-            GetUserNameAndPass(data, count, &username, &pass);
-
-            if (username && pass) {
-              // username and pass are pointers into the data buffer allocated by IPStore's ReadItem
-              // method, and we own that buffer. We don't free it here, since we're going to be using 
-              // it after the password harvesting stage to locate the username field. Only after the second
-              // phase is complete do we free the buffer. 
-              SignonData* d = aSignonsFound->AppendElement();
-              if (!d)
-                return NS_ERROR_OUT_OF_MEMORY;
-              d->user = (PRUnichar*)username;
-              d->pass = (PRUnichar*)pass;
-              d->realm = realm; // freed in ResolveAndMigrateSignons
-            }
-          }
-        }
-      }
-    }
-  }
-  return NS_OK;
-}
-
-bool
-nsIEProfileMigrator::KeyIsURI(const nsAString& aKey, char** aRealm)
-{
-  *aRealm = nsnull;
-
-  nsCOMPtr<nsIURI> uri;
-
-  if (NS_FAILED(NS_NewURI(getter_AddRefs(uri), aKey))) 
-    return false;
-
-  bool validScheme = false;
-  const char* schemes[] = { "http", "https" };
-  for (int i = 0; i < 2; ++i) {
-    uri->SchemeIs(schemes[i], &validScheme);
-    if (validScheme) {
-      nsCAutoString realm;
-      uri->GetScheme(realm);
-      realm.AppendLiteral("://");
-
-      nsCAutoString host;
-      uri->GetHost(host);
-      realm.Append(host);
-
-      *aRealm = ToNewCString(realm);
-      return validScheme;
-    }
-  }
-  return false;
-}
-
-nsresult
-nsIEProfileMigrator::ResolveAndMigrateSignons(IPStore* aPStore, nsTArray<SignonData>* aSignonsFound)
-{
-  HRESULT hr;
-
-  IEnumPStoreItems* enumItems = NULL;
-  hr = aPStore->EnumItems(0, &IEPStoreAutocompGUID, &IEPStoreAutocompGUID, 0, &enumItems);
-  if (SUCCEEDED(hr) && enumItems != NULL) {
-    LPWSTR itemName = NULL;
-    while ((enumItems->Next(1, &itemName, 0) == S_OK) && itemName) {
-      unsigned long count = 0;
-      unsigned char* data = NULL;
-
-      hr = aPStore->ReadItem(0, &IEPStoreAutocompGUID, &IEPStoreAutocompGUID, itemName, &count, &data, NULL, 0);
-      if (SUCCEEDED(hr) && data) {
-        nsAutoString itemNameString(itemName);
-        if (StringTail(itemNameString, 11).
-            LowerCaseEqualsLiteral(":stringdata")) {
-          // :StringData contains the saved data
-          const nsAString& key = Substring(itemNameString, 0, itemNameString.Length() - 11);
-          
-          // Assume all keys that are valid URIs are signons, not saved form data, and that 
-          // all keys that aren't valid URIs are form field names (containing form data).
-          nsCString realm;
-          if (!KeyIsURI(key, getter_Copies(realm))) {
-            // Search the data for a username that matches one of the found signons. 
-            EnumerateUsernames(key, (PRUnichar*)data, (count/sizeof(PRUnichar)), aSignonsFound);
-          }
-        }
-
-        ::CoTaskMemFree(data);
-      }
-    }
-    // Now that we've done resolving signons, we need to walk the signons list, freeing the data buffers 
-    // for each SignonData entry, since these buffers were allocated by the system back in |GetSignonListFromPStore|
-    // but never freed. 
-    PRUint32 signonCount = aSignonsFound->Length();
-    for (PRUint32 i = 0; i < signonCount; ++i) {
-      SignonData &sd = aSignonsFound->ElementAt(i);
-      ::CoTaskMemFree(sd.user);  // |sd->user| is a pointer to the start of a buffer that also contains sd->pass
-      NS_Free(sd.realm);
-    }
-    aSignonsFound->Clear();
-  }
-  return NS_OK;
-}
-
-void
-nsIEProfileMigrator::EnumerateUsernames(const nsAString& aKey, PRUnichar* aData, unsigned long aCount, nsTArray<SignonData>* aSignonsFound)
-{
-  nsCOMPtr<nsILoginManagerIEMigrationHelper> pwmgr(
-    do_GetService("@mozilla.org/login-manager/storage/legacy;1"));
-  if (!pwmgr)
-    return;
-
-  PRUnichar* cursor = aData;
-  PRUint32 offset = 0;
-  PRUint32 signonCount = aSignonsFound->Length();
-
-  while (offset < aCount) {
-    nsAutoString curr; curr = cursor;
-
-    // Compare the value at the current cursor position with the collected list of signons
-    for (PRUint32 i = 0; i < signonCount; ++i) {
-      SignonData &sd = aSignonsFound->ElementAt(i);
-      if (curr.Equals(sd.user)) {
-        // Bingo! Found a username in the saved data for this item. Now, add a Signon.
-        nsDependentString usernameStr(sd.user), passStr(sd.pass);
-        nsAutoString realm(NS_ConvertUTF8toUTF16(sd.realm));
-
-        nsresult rv;
-
-        nsCOMPtr<nsILoginInfo> aLogin (do_CreateInstance(NS_LOGININFO_CONTRACTID, &rv));
-        NS_ENSURE_SUCCESS(rv, /* */);
-
-        // nsStringAPI doesn't let us create void strings, so we won't
-        // use Init() here.
-        // IE doesn't have the form submit URL, so set to empty-string,
-        // which the login manager uses as a wildcard value.
-        // IE doesn't store the password field name either, so just set it
-        // to an empty string.
-        aLogin->SetHostname(realm);
-        aLogin->SetFormSubmitURL(EmptyString());
-        aLogin->SetUsername(usernameStr);
-        aLogin->SetPassword(passStr);
-        aLogin->SetUsernameField(aKey);
-        aLogin->SetPasswordField(EmptyString());
-
-        pwmgr->MigrateAndAddLogin(aLogin);
-      }
-    }
-
-    // Advance the cursor
-    PRInt32 advance = curr.Length() + 1;
-    cursor += advance; // Advance to next string (length of curr string + 1 PRUnichar for null separator)
-    offset += advance;
-  } 
-}
-
-void 
-nsIEProfileMigrator::GetUserNameAndPass(unsigned char* data, unsigned long len, unsigned char** username, unsigned char** pass)
-{
-  *username = data;
-  *pass = NULL;
-
-  unsigned char* temp = data; 
-
-  for (unsigned int i = 0; i < len; i += 2, temp += 2*sizeof(unsigned char)) {
-    if (*temp == '\0') {
-      *pass = temp + 2*sizeof(unsigned char);
-      break;
-    }
-  }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// IMPORTING FORM DATA
-//
-// This is a much simpler task as all we need is the field name and that's part
-// of the key used to identify each data set in the PStore. The algorithm here
-// is as follows:
-//
-//   fieldName1:StringData    value1\0value2\0value3\0
-//   fieldName2:StringData    value1\0value2\0value3\0
-//   fieldName3:StringData    value1\0value2\0value3\0
-//
-// Walk each non-URI prefixed key in IE's PStore section, split the value provided
-// into chunks (\0 delimited) and use nsIFormHistory2's |addEntry| method to add
-// an entry for the fieldName prefix and each value. 
-//
-// "Quite Easily Done". ;-)
-// 
-nsresult
-nsIEProfileMigrator::CopyFormData(bool aReplace)
-{
-  HRESULT hr;
-
-  HMODULE pstoreDLL = ::LoadLibraryW(L"pstorec.dll");
-  if (!pstoreDLL) {
-    // XXXben TODO
-    // Need to figure out what to do here on Windows 98 etc... it may be that the key is universal read
-    // and we can just blunder into the registry and use CryptUnprotect to get the data out. 
-    return NS_ERROR_FAILURE;
-  }
-
-  PStoreCreateInstancePtr PStoreCreateInstance = (PStoreCreateInstancePtr)::GetProcAddress(pstoreDLL, "PStoreCreateInstance");
-  IPStore* PStore = NULL;
-  hr = PStoreCreateInstance(&PStore, 0, 0, 0);
-  if (FAILED(hr) || PStore == NULL)
-    return NS_OK;
-
-  IEnumPStoreItems* enumItems = NULL;
-  hr = PStore->EnumItems(0, &IEPStoreAutocompGUID, &IEPStoreAutocompGUID, 0, &enumItems);
-  if (SUCCEEDED(hr) && enumItems != NULL) {
-    LPWSTR itemName = NULL;
-    while ((enumItems->Next(1, &itemName, 0) == S_OK) && itemName) {
-      unsigned long count = 0;
-      unsigned char* data = NULL;
-
-      // We are responsible for freeing |data| using |CoTaskMemFree|!!
-      hr = PStore->ReadItem(0, &IEPStoreAutocompGUID, &IEPStoreAutocompGUID, itemName, &count, &data, NULL, 0);
-      if (SUCCEEDED(hr) && data) {
-        nsAutoString itemNameString(itemName);
-        if (StringTail(itemNameString, 11).
-            LowerCaseEqualsLiteral(":stringdata")) {
-          // :StringData contains the saved data
-          const nsAString& key = Substring(itemNameString, 0, itemNameString.Length() - 11);
-          nsCString realm;
-          if (!KeyIsURI(key, getter_Copies(realm))) {
-            nsresult rv = AddDataToFormHistory(key, (PRUnichar*)data, (count/sizeof(PRUnichar)));
-            if (NS_FAILED(rv)) return rv;
-          }
-        }
-      }
-    }
-  }
-  return NS_OK;
-}
-
-nsresult
-nsIEProfileMigrator::AddDataToFormHistory(const nsAString& aKey, PRUnichar* aData, unsigned long aCount)
-{
-  nsCOMPtr<nsIFormHistory2> formHistory(do_GetService("@mozilla.org/satchel/form-history;1"));
-  if (!formHistory)
-    return NS_ERROR_OUT_OF_MEMORY;
-
-  PRUnichar* cursor = aData;
-  PRUint32 offset = 0;
-
-  while (offset < aCount) {
-    nsAutoString curr; curr = cursor;
-
-    formHistory->AddEntry(aKey, curr);
-
-    // Advance the cursor
-    PRInt32 advance = curr.Length() + 1;
-    cursor += advance; // Advance to next string (length of curr string + 1 PRUnichar for null separator)
-    offset += advance;
-  } 
-
-  return NS_OK;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//
-// favorites
-// search keywords
-//
-nsresult
-nsIEProfileMigrator::CopyFavorites(bool aReplace)
-{
-  nsresult rv;
-  nsCOMPtr<nsINavBookmarksService> bookmarks =
-    do_GetService(NS_NAVBOOKMARKSSERVICE_CONTRACTID, &rv);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  PRUint8 batchAction = aReplace ? BATCH_ACTION_BOOKMARKS_REPLACE
-                                 : BATCH_ACTION_BOOKMARKS;
-  nsCOMPtr<nsISupportsPRUint8> supports =
-    do_CreateInstance(NS_SUPPORTS_PRUINT8_CONTRACTID);
-  NS_ENSURE_TRUE(supports, NS_ERROR_OUT_OF_MEMORY);
-  rv = supports->SetData(batchAction);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  rv = bookmarks->RunInBatchMode(this, supports);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  return NS_OK;
-}
-
-nsresult
-nsIEProfileMigrator::CopyFavoritesBatched(bool aReplace)
-{
-  // If "aReplace" is true, merge into the root level of bookmarks. Otherwise,
-  // create a folder called "Imported IE Favorites" and place all the Bookmarks
-  // there.
-  nsresult rv;
-
-  nsCOMPtr<nsINavBookmarksService> bms =
-    do_GetService(NS_NAVBOOKMARKSSERVICE_CONTRACTID, &rv);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  PRInt64 bookmarksMenuFolderId;
-  rv = bms->GetBookmarksMenuFolder(&bookmarksMenuFolderId);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  nsAutoString personalToolbarFolderName;
-  PRInt64 folder;
-  if (!aReplace) {
-    nsCOMPtr<nsIStringBundleService> bundleService =
-      do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv);
-    NS_ENSURE_SUCCESS(rv, rv);
-    nsCOMPtr<nsIStringBundle> bundle;
-    rv = bundleService->CreateBundle(TRIDENTPROFILE_BUNDLE,
-                                     getter_AddRefs(bundle));
-    NS_ENSURE_SUCCESS(rv, rv);
-
-    nsString sourceNameIE;
-    rv = bundle->GetStringFromName(NS_LITERAL_STRING("sourceNameIE").get(),
-                                   getter_Copies(sourceNameIE));
-    NS_ENSURE_SUCCESS(rv, rv);
-
-    const PRUnichar* sourceNameStrings[] = { sourceNameIE.get() };
-    nsString importedIEFavsTitle;
-    rv = bundle->FormatStringFromName(NS_LITERAL_STRING("importedBookmarksFolder").get(),
-                                      sourceNameStrings, 1,
-                                      getter_Copies(importedIEFavsTitle));
-    NS_ENSURE_SUCCESS(rv, rv);
-
-    rv = bms->CreateFolder(bookmarksMenuFolderId,
-                           NS_ConvertUTF16toUTF8(importedIEFavsTitle),
-                           nsINavBookmarksService::DEFAULT_INDEX,
-                           &folder);
-    NS_ENSURE_SUCCESS(rv, rv);
-  }
-  else {
-    // Locate the Links toolbar folder, we want to replace the Personal Toolbar
-    // content with Favorites in this folder.
-    // On versions minor or equal to IE6 the folder name is stored in the
-    // LinksFolderName registry key, but in newer versions it may be just a
-    // Links subfolder inside the default Favorites folder.
-    nsCOMPtr<nsIWindowsRegKey> regKey =
-      do_CreateInstance("@mozilla.org/windows-registry-key;1");
-    if (regKey &&
-        NS_SUCCEEDED(regKey->Open(nsIWindowsRegKey::ROOT_KEY_CURRENT_USER,
-                                  REGISTRY_IE_TOOLBAR_KEY,
-                                  nsIWindowsRegKey::ACCESS_READ))) {
-      nsAutoString linksFolderName;
-      if (NS_SUCCEEDED(regKey->ReadStringValue(
-                         NS_LITERAL_STRING("LinksFolderName"),
-                         linksFolderName))) {
-        personalToolbarFolderName = linksFolderName;
-      }
-      else {
-        personalToolbarFolderName.AssignLiteral("Links");
-      }
-    }
-
-    folder = bookmarksMenuFolderId;
-  }
-
-  nsCOMPtr<nsIProperties> fileLocator =
-    do_GetService("@mozilla.org/file/directory_service;1", &rv);
-  NS_ENSURE_SUCCESS(rv, rv);
-  nsCOMPtr<nsIFile> favoritesDirectory;
-  (void)fileLocator->Get(NS_WIN_FAVORITES_DIR, NS_GET_IID(nsIFile),
-                         getter_AddRefs(favoritesDirectory));
-
-  // If |favoritesDirectory| is null, it means that we're on a Windows
-  // platform that does not have a Favorites folder, e.g. Windows 95
-  // (early SRs, before IE integrated with the shell).
-  // Only try to read Favorites folder if it exists on the machine.
-  if (favoritesDirectory) {
-    rv = ParseFavoritesFolder(favoritesDirectory, folder, bms,
-                              personalToolbarFolderName, true);
-    NS_ENSURE_SUCCESS(rv, rv);
-  }
-
-  return CopySmartKeywords(bms, bookmarksMenuFolderId);
-}
-
-nsresult
-nsIEProfileMigrator::CopySmartKeywords(nsINavBookmarksService* aBMS,
-                                       PRInt64 aParentFolder)
-{ 
-  nsresult rv;
-
-  nsCOMPtr<nsIWindowsRegKey> regKey =
-    do_CreateInstance("@mozilla.org/windows-registry-key;1");
-  if (regKey && 
-      NS_SUCCEEDED(regKey->Open(nsIWindowsRegKey::ROOT_KEY_CURRENT_USER,
-                                REGISTRY_IE_SEARCHURL_KEY,
-                                nsIWindowsRegKey::ACCESS_READ))) {
-
-    nsCOMPtr<nsIStringBundleService> bundleService =
-      do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv);
-    NS_ENSURE_SUCCESS(rv, rv);
-    nsCOMPtr<nsIStringBundle> bundle;
-    rv = bundleService->CreateBundle(TRIDENTPROFILE_BUNDLE,
-                                     getter_AddRefs(bundle));
-    NS_ENSURE_SUCCESS(rv, rv);
-
-    PRInt64 keywordsFolder = 0;
-    int offset = 0;
-    while (1) {
-      nsAutoString keyName;
-      if (NS_FAILED(regKey->GetChildName(offset, keyName)))
-        break;
-
-      if (!keywordsFolder) {
-        nsString sourceNameIE;
-        rv = bundle->GetStringFromName(NS_LITERAL_STRING("sourceNameIE").get(),
-                                       getter_Copies(sourceNameIE));
-        NS_ENSURE_SUCCESS(rv, rv);
-
-        const PRUnichar* sourceNameStrings[] = { sourceNameIE.get() };
-        nsString importedIESearchUrlsTitle;
-        rv = bundle->FormatStringFromName(NS_LITERAL_STRING("importedSearchURLsFolder").get(),
-                                          sourceNameStrings, 1,
-                                          getter_Copies(importedIESearchUrlsTitle));
-        NS_ENSURE_SUCCESS(rv, rv);
-        rv = aBMS->CreateFolder(aParentFolder,
-                                NS_ConvertUTF16toUTF8(importedIESearchUrlsTitle),
-                                nsINavBookmarksService::DEFAULT_INDEX,
-                                &keywordsFolder);
-        NS_ENSURE_SUCCESS(rv, rv);
-      }
-
-      nsCOMPtr<nsIWindowsRegKey> childKey; 
-      if (NS_SUCCEEDED(regKey->OpenChild(keyName,
-                       nsIWindowsRegKey::ACCESS_READ,
-                       getter_AddRefs(childKey)))) {
-        nsAutoString url; 
-        if (NS_SUCCEEDED(childKey->ReadStringValue(EmptyString(), url))) {
-          nsCOMPtr<nsIURI> uri;
-          if (NS_FAILED(NS_NewURI(getter_AddRefs(uri), url))) {
-            NS_WARNING("Invalid url while importing smart keywords of MS IE");
-            ++offset;
-            childKey->Close();
-            continue;
-          }
-          PRInt64 id;
-          rv = aBMS->InsertBookmark(keywordsFolder, uri,
-                                    nsINavBookmarksService::DEFAULT_INDEX,
-                                    NS_ConvertUTF16toUTF8(keyName),
-                                    &id);
-          NS_ENSURE_SUCCESS(rv, rv);
-        }
-        childKey->Close();
-      }
-
-      ++offset;
-    }
-  }
-
-  return NS_OK;
-}
-
-void 
-nsIEProfileMigrator::ResolveShortcut(const nsString &aFileName, char** aOutURL) 
-{
-  HRESULT result;
-
-  IUniformResourceLocatorW* urlLink = nsnull;
-  result = ::CoCreateInstance(CLSID_InternetShortcut, NULL, CLSCTX_INPROC_SERVER,
-                              IID_IUniformResourceLocatorW, (void**)&urlLink);
-  if (SUCCEEDED(result) && urlLink) {
-    IPersistFile* urlFile = nsnull;
-    result = urlLink->QueryInterface(IID_IPersistFile, (void**)&urlFile);
-    if (SUCCEEDED(result) && urlFile) {
-      result = urlFile->Load(aFileName.get(), STGM_READ);
-      if (SUCCEEDED(result) ) {
-        LPWSTR lpTemp = nsnull;
-        result = urlLink->GetURL(&lpTemp);
-        if (SUCCEEDED(result) && lpTemp) {
-          *aOutURL = (char*)ToNewUTF8String(nsDependentString(lpTemp));
-          // free the string that GetURL alloc'd
-          ::CoTaskMemFree(lpTemp);
-        }
-      }
-      urlFile->Release();
-    }
-    urlLink->Release();
-  }
-}
-
-nsresult
-nsIEProfileMigrator::ParseFavoritesFolder(nsIFile* aDirectory, 
-                                          PRInt64 aParentFolder,
-                                          nsINavBookmarksService* aBMS,
-                                          const nsAString& aPersonalToolbarFolderName,
-                                          bool aIsAtRootLevel)
-{
-  nsresult rv;
-
-  nsCOMPtr<nsISimpleEnumerator> entries;
-  rv = aDirectory->GetDirectoryEntries(getter_AddRefs(entries));
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  do {
-    bool hasMore = false;
-    rv = entries->HasMoreElements(&hasMore);
-    if (NS_FAILED(rv) || !hasMore) break;
-
-    nsCOMPtr<nsISupports> supp;
-    rv = entries->GetNext(getter_AddRefs(supp));
-    if (NS_FAILED(rv)) break;
-
-    nsCOMPtr<nsIFile> currFile(do_QueryInterface(supp));
-
-    nsCOMPtr<nsIURI> uri;
-    rv = NS_NewFileURI(getter_AddRefs(uri), currFile);
-    if (NS_FAILED(rv)) break;
-
-    nsAutoString bookmarkName;
-    currFile->GetLeafName(bookmarkName);
-
-    bool isSymlink = false;
-    bool isDir = false;
-
-    currFile->IsSymlink(&isSymlink);
-    currFile->IsDirectory(&isDir);
-
-    if (isSymlink) {
-      // It's a .lnk file.  Get the path and check to see if it's
-      // a dir.  If so, create a bookmark for the dir.  If not, then
-      // simply do nothing and continue.
-
-      // Get the path that the .lnk file is pointing to.
-      nsAutoString path;
-      rv = currFile->GetTarget(path);
-      if (NS_FAILED(rv)) continue;
-
-      nsCOMPtr<nsILocalFile> localFile;
-      rv = NS_NewLocalFile(path, true, getter_AddRefs(localFile));
-      if (NS_FAILED(rv)) continue;
-
-      // Check for dir here.  If path is not a dir, just continue with
-      // next import.
-      rv = localFile->IsDirectory(&isDir);
-      NS_ENSURE_SUCCESS(rv, rv);
-      if (!isDir) continue;
-
-      // Look for and strip out the .lnk extension.
-      NS_NAMED_LITERAL_STRING(lnkExt, ".lnk");
-      PRInt32 lnkExtStart = bookmarkName.Length() - lnkExt.Length();
-      if (StringEndsWith(bookmarkName, lnkExt,
-                         CaseInsensitiveCompare))
-        bookmarkName.SetLength(lnkExtStart);
-
-      nsCOMPtr<nsIURI> bookmarkURI;
-      rv = NS_NewFileURI(getter_AddRefs(bookmarkURI), localFile);
-      if (NS_FAILED(rv)) continue;
-      PRInt64 id;
-      rv = aBMS->InsertBookmark(aParentFolder, bookmarkURI,
-                                nsINavBookmarksService::DEFAULT_INDEX,
-                                NS_ConvertUTF16toUTF8(bookmarkName),
-                                &id);
-      if (NS_FAILED(rv)) continue;
-    }
-    else if (isDir) {
-      PRInt64 folderId;
-      if (bookmarkName.Equals(aPersonalToolbarFolderName)) {
-        rv = aBMS->GetToolbarFolder(&folderId);
-        if (NS_FAILED(rv)) break;
-      }
-      else {
-        rv = aBMS->CreateFolder(aParentFolder,
-                                NS_ConvertUTF16toUTF8(bookmarkName),
-                                nsINavBookmarksService::DEFAULT_INDEX,
-                                &folderId);
-        if (NS_FAILED(rv)) continue;
-      }
-
-      rv = ParseFavoritesFolder(currFile, folderId,
-                                aBMS, aPersonalToolbarFolderName,
-                                false);
-      if (NS_FAILED(rv)) continue;
-    }
-    else {
-      nsCOMPtr<nsIURL> url(do_QueryInterface(uri));
-      nsCAutoString extension;
-
-      url->GetFileExtension(extension);
-      if (!extension.Equals("url", CaseInsensitiveCompare))
-        continue;
-
-      nsAutoString name(Substring(bookmarkName, 0, 
-                                  bookmarkName.Length() - extension.Length() - 1));
-
-      nsAutoString path;
-      currFile->GetPath(path);
-
-      nsCString resolvedURL;
-      ResolveShortcut(path, getter_Copies(resolvedURL));
-
-      nsCOMPtr<nsIURI> resolvedURI;
-      rv = NS_NewURI(getter_AddRefs(resolvedURI), resolvedURL);
-      if (NS_FAILED(rv)) continue;
-      PRInt64 id;
-      rv = aBMS->InsertBookmark(aParentFolder, resolvedURI,
-                                nsINavBookmarksService::DEFAULT_INDEX,
-                                NS_ConvertUTF16toUTF8(name), &id);
-      if (NS_FAILED(rv)) continue;
-    }
-  }
-  while (1);
-
-  return rv;
-}
-
-nsresult
-nsIEProfileMigrator::CopyPreferences(bool aReplace) 
-{
-  bool            regKeyOpen = false;
-  const regEntry  *entry,
-                  *endEntry = ArrayEnd(gRegEntries);
-                              
-
-  nsCOMPtr<nsIPrefBranch> prefs;
-
-  { // scope pserve why not
-    nsCOMPtr<nsIPrefService> pserve(do_GetService(NS_PREFSERVICE_CONTRACTID));
-    if (pserve)
-      pserve->GetBranch("", getter_AddRefs(prefs));
-  }
-  if (!prefs)
-    return NS_ERROR_FAILURE;
-
-  nsCOMPtr<nsIWindowsRegKey> regKey = 
-    do_CreateInstance("@mozilla.org/windows-registry-key;1");
-  if (!regKey)
-    return NS_ERROR_UNEXPECTED;
-  
-  // step through gRegEntries table
-  for (entry = gRegEntries; entry < endEntry; ++entry) {
-
-    // a new keyname? close any previous one and open the new one
-    if (entry->regKeyName) {
-      if (regKeyOpen) {
-        regKey->Close();
-        regKeyOpen = false;
-      }
-      regKeyOpen = NS_SUCCEEDED(regKey->
-                                Open(nsIWindowsRegKey::ROOT_KEY_CURRENT_USER,
-                                NS_ConvertASCIItoUTF16(
-                                  nsDependentCString(entry->regKeyName)),
-                                nsIWindowsRegKey::ACCESS_READ));
-    }
-
-    if (regKeyOpen) 
-      // read registry data
-      entry->entryHandler(regKey,
-                          NS_ConvertASCIItoUTF16(
-                            nsDependentCString(entry->regValueName)),
-                          prefs, entry->prefKeyName);
-  }
-
-  nsresult rv = CopySecurityPrefs(prefs);
-  if (NS_FAILED(rv)) return rv;
-
-  rv = CopyProxyPreferences(prefs);
-  if (NS_FAILED(rv)) return rv;
-
-  return CopyStyleSheet(aReplace);
-}
-
-/* Fetch and translate the current user's cookies.
-   Return true if successful. */
-nsresult
-nsIEProfileMigrator::CopyCookies(bool aReplace) 
-{
-  // IE cookies are stored in files named <username>@domain[n].txt
-  // (in <username>'s Cookies folder. isn't the naming redundant?)
-  nsresult rv = NS_OK;
-
-  nsCOMPtr<nsIFile> cookiesDir;
-  nsCOMPtr<nsISimpleEnumerator> cookieFiles;
-
-  nsCOMPtr<nsICookieManager2> cookieManager(do_GetService(NS_COOKIEMANAGER_CONTRACTID));
-  if (!cookieManager)
-    return NS_ERROR_FAILURE;
-
-  // find the cookies directory
-  NS_GetSpecialDirectory(NS_WIN_COOKIES_DIR, getter_AddRefs(cookiesDir));
-  if (!cookiesDir)
-    return NS_ERROR_FAILURE;
-
-  // Check for Vista's UAC, if so, tack on a "Low" sub dir
-  nsCOMPtr<nsIWindowsRegKey> regKey =
-    do_CreateInstance("@mozilla.org/windows-registry-key;1");
-  if (regKey) {
-    NS_NAMED_LITERAL_STRING(regPath,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System");
-    if (NS_SUCCEEDED(regKey->Open(nsIWindowsRegKey::ROOT_KEY_LOCAL_MACHINE,
-                                  regPath,
-                                  nsIWindowsRegKey::ACCESS_QUERY_VALUE))) {
-      PRUint32 value;
-      if (NS_SUCCEEDED(regKey->ReadIntValue(NS_LITERAL_STRING("EnableLUA"),
-                                    &value)) &&
-          value == 1) {
-          nsAutoString dir;
-          // For cases where we are running under protected mode, check
-          // cookiesDir for the Low sub directory. (Simpler than using
-          // process token calls to check our Vista integrity level.)
-          cookiesDir->GetLeafName(dir);
-          if (!dir.EqualsLiteral("Low"))
-            cookiesDir->Append(NS_LITERAL_STRING("Low"));
-      }
-    }
-  }
-
-  cookiesDir->GetDirectoryEntries(getter_AddRefs(cookieFiles));
-  if (!cookieFiles)
-    return NS_ERROR_FAILURE;
-
-  // fetch the current user's name from the environment
-  PRUnichar username[sUsernameLengthLimit+2];
-  ::GetEnvironmentVariableW(L"USERNAME", username,
-                            sizeof(username)/sizeof(PRUnichar));
-  username[sUsernameLengthLimit] = L'\0';
-  wcscat(username, L"@");
-  int usernameLength = wcslen(username);
-
-  // allocate a buffer into which to read each cookie file
-  char *fileContents = (char *) PR_Malloc(sInitialCookieBufferSize);
-  if (!fileContents)
-    return NS_ERROR_OUT_OF_MEMORY;
-  PRUint32 fileContentsSize = sInitialCookieBufferSize;
-
-  do { // for each file in the cookies directory
-    // get the next file
-    bool moreFiles = false;
-    if (NS_FAILED(cookieFiles->HasMoreElements(&moreFiles)) || !moreFiles)
-      break;
-
-    nsCOMPtr<nsISupports> supFile;
-    cookieFiles->GetNext(getter_AddRefs(supFile));
-    nsCOMPtr<nsIFile> cookieFile(do_QueryInterface(supFile));
-    if (!cookieFile) {
-      rv = NS_ERROR_FAILURE;
-      break; // unexpected! punt!
-    }
-
-    // is it a cookie file for the current user?
-    nsAutoString fileName;
-    cookieFile->GetLeafName(fileName);
-    const nsAString &fileOwner = Substring(fileName, 0, usernameLength);
-    if (!fileOwner.Equals(username, CaseInsensitiveCompare))
-      continue;
-
-    // ensure the contents buffer is large enough to hold the entire file
-    // plus one byte (see DelimitField())
-    PRInt64 llFileSize;
-    if (NS_FAILED(cookieFile->GetFileSize(&llFileSize)))
-      continue;
-
-    PRUint32 fileSize, readSize;
-    LL_L2UI(fileSize, llFileSize);
-    if (fileSize >= fileContentsSize) {
-      PR_Free(fileContents);
-      fileContents = (char *) PR_Malloc(fileSize+1);
-      if (!fileContents) {
-        rv = NS_ERROR_FAILURE;
-        break; // fatal error
-      }
-      fileContentsSize = fileSize;
-    }
-
-    // read the entire cookie file
-    PRFileDesc *fd;
-    nsCOMPtr<nsILocalFile> localCookieFile(do_QueryInterface(cookieFile));
-    if (localCookieFile &&
-        NS_SUCCEEDED(localCookieFile->OpenNSPRFileDesc(PR_RDONLY, 0444, &fd))) {
-
-      readSize = PR_Read(fd, fileContents, fileSize);
-      PR_Close(fd);
-
-      if (fileSize == readSize) { // translate this file's cookies
-        nsresult onerv;
-        onerv = CopyCookiesFromBuffer(fileContents, readSize, cookieManager);
-        if (NS_FAILED(onerv))
-          rv = onerv;
-      }
-    }
-  } while(1);
-
-  if (fileContents)
-    PR_Free(fileContents);
-  return rv;
-}
-
-/* Fetch cookies from a single IE cookie file.
-   Return true if successful. */
-nsresult
-nsIEProfileMigrator::CopyCookiesFromBuffer(char *aBuffer,
-                                           PRUint32 aBufferLength,
-                                           nsICookieManager2 *aCookieManager) 
-{
-  nsresult  rv = NS_OK;
-
-  const char *bufferEnd = aBuffer + aBufferLength;
-  // cookie fields:
-  char    *name,
-          *value,
-          *host,
-          *path,
-          *flags,
-          *expirationDate1, *expirationDate2,
-          *creationDate1, *creationDate2,
-          *terminator;
-  int      flagsValue;
-  time_t   expirationDate,
-           creationDate;
-  char     hostCopy[sHostnameLengthLimit+1],
-          *hostCopyConstructor,
-          *hostCopyEnd = hostCopy + sHostnameLengthLimit;
-
-  do { // for each cookie in the buffer
-    DelimitField(&aBuffer, bufferEnd, &name);
-    DelimitField(&aBuffer, bufferEnd, &value);
-    DelimitField(&aBuffer, bufferEnd, &host);
-    DelimitField(&aBuffer, bufferEnd, &flags);
-    DelimitField(&aBuffer, bufferEnd, &expirationDate1);
-    DelimitField(&aBuffer, bufferEnd, &expirationDate2);
-    DelimitField(&aBuffer, bufferEnd, &creationDate1);
-    DelimitField(&aBuffer, bufferEnd, &creationDate2);
-    DelimitField(&aBuffer, bufferEnd, &terminator);
-
-    // it's a cookie if we got one of each
-    if (terminator >= bufferEnd)
-      break;
-
-    // IE stores deleted cookies with a zero-length value
-    if (*value == '\0')
-      continue;
-
-    // convert flags to an int, date numbers to useable dates
-    ::sscanf(flags, "%d", &flagsValue);
-    expirationDate = FileTimeToTimeT(expirationDate1, expirationDate2);
-    creationDate = FileTimeToTimeT(creationDate1, creationDate2);
-
-    // munge host, and separate host from path
-
-    hostCopyConstructor = hostCopy;
-
-    // first, with a non-null domain, assume it's what Mozilla considers
-    // a domain cookie. see bug 222343.
-    if (*host && *host != '.' && *host != '/')
-      *hostCopyConstructor++ = '.';
-
-    // copy the host part and leave path pointing to the path part
-    for (path = host; *path && *path != '/'; ++path)
-      ;
-    int hostLength = path - host;
-    if (hostLength > hostCopyEnd - hostCopyConstructor)
-      hostLength = hostCopyEnd - hostCopyConstructor;
-    PL_strncpy(hostCopyConstructor, host, hostLength);
-    hostCopyConstructor += hostLength;
-
-    *hostCopyConstructor = '\0';
-
-    nsDependentCString stringName(name),
-                       stringPath(path);
-
-    // delete any possible extant matching host cookie and
-    // check if we're dealing with an IPv4/IPv6 hostname.
-    bool isIPAddress = false;
-    if (hostCopy[0] == '.') {
-      aCookieManager->Remove(nsDependentCString(hostCopy+1),
-                             stringName, stringPath, false);
-      PRNetAddr addr;
-      if (PR_StringToNetAddr(hostCopy+1, &addr) == PR_SUCCESS)
-        isIPAddress = true;
-    }
-
-    nsresult onerv;
-    // Add() makes a new domain cookie
-    onerv = aCookieManager->Add(nsDependentCString(hostCopy + (isIPAddress ? 1 : 0)),
-                                stringPath,
-                                stringName,
-                                nsDependentCString(value),
-                                flagsValue & 0x1, // isSecure
-                                false, // isHttpOnly
-                                false, // isSession
-                                PRInt64(expirationDate));
-    if (NS_FAILED(onerv)) {
-      rv = onerv;
-      break;
-    }
-
-  } while(aBuffer < bufferEnd);
-
-  return rv;
-}
-
-/* Delimit the next field in the IE cookie buffer.
-   when called:
-    aBuffer: at the beginning of the next field or preceding whitespace
-    aBufferEnd: one past the last valid character in the buffer
-   on return:
-    aField: at the beginning of the next field, which is null delimited
-    aBuffer: after the null at the end of the field
-
-   the character at which aBufferEnd points must be part of the buffer
-   so we can set it to \0.
-*/
-void
-nsIEProfileMigrator::DelimitField(char **aBuffer,
-                                  const char *aBufferEnd,
-                                  char **aField) 
-{
-  char *scan = *aBuffer;
-  *aField = scan;
-  while (scan < aBufferEnd && (*scan != '\r' && *scan != '\n'))
-    ++scan;
-  if (scan+1 < aBufferEnd && (*(scan+1) == '\r' || *(scan+1) == '\n') &&
-                             *scan != *(scan+1)) {
-    *scan = '\0';
-    scan += 2;
-  } else {
-    if (scan <= aBufferEnd) // (1 byte past bufferEnd is guaranteed allocated)
-      *scan = '\0';
-    ++scan;
-  }
-  *aBuffer = scan;
-}
-
-// conversion routine. returns 0 (epoch date) if the input is out of range
-time_t
-nsIEProfileMigrator::FileTimeToTimeT(const char *aLowDateIntString,
-                                     const char *aHighDateIntString) 
-{
-  FILETIME   fileTime;
-  SYSTEMTIME systemTime;
-  tm         tTime;
-  time_t     rv;
-
-  ::sscanf(aLowDateIntString, "%ld", &fileTime.dwLowDateTime);
-  ::sscanf(aHighDateIntString, "%ld", &fileTime.dwHighDateTime);
-  ::FileTimeToSystemTime(&fileTime, &systemTime);
-  tTime.tm_year = systemTime.wYear - 1900;
-  tTime.tm_mon = systemTime.wMonth-1;
-  tTime.tm_mday = systemTime.wDay;
-  tTime.tm_hour = systemTime.wHour;
-  tTime.tm_min = systemTime.wMinute;
-  tTime.tm_sec = systemTime.wSecond;
-  tTime.tm_isdst = -1;
-  rv = ::mktime(&tTime);
-  return rv < 0 ? 0 : rv;
-}
-
-/* Find the accessibility stylesheet if it exists and replace Mozilla's
-   with it. Return true if we found and copied a stylesheet. */
-nsresult
-nsIEProfileMigrator::CopyStyleSheet(bool aReplace) 
-{
-  nsresult rv = NS_OK; // return failure only if filecopy fails
-
-  // is there a trident user stylesheet?
-  nsCOMPtr<nsIWindowsRegKey> regKey = 
-    do_CreateInstance("@mozilla.org/windows-registry-key;1");
-  if (!regKey)
-    return NS_ERROR_UNEXPECTED;
-
-  NS_NAMED_LITERAL_STRING(styleKey,
-                          "Software\\Microsoft\\Internet Explorer\\Styles");
-  if (NS_FAILED(regKey->Open(nsIWindowsRegKey::ROOT_KEY_CURRENT_USER,
-                             styleKey, nsIWindowsRegKey::ACCESS_READ)))
-    return NS_OK;
-
-  NS_NAMED_LITERAL_STRING(myStyleValName, "Use My StyleSheet");
-  PRUint32 type, useMyStyle; 
-  if (NS_SUCCEEDED(regKey->GetValueType(myStyleValName, &type)) &&
-      type == nsIWindowsRegKey::TYPE_INT &&
-      NS_SUCCEEDED(regKey->ReadIntValue(myStyleValName, &useMyStyle)) &&
-      useMyStyle == 1) {
-
-    nsAutoString tridentFilename;
-    if (NS_SUCCEEDED(regKey->ReadStringValue(
-                     NS_LITERAL_STRING("User Stylesheet"), tridentFilename))) {
-
-      // tridentFilename is a native path to the specified stylesheet file
-      // point an nsIFile at it
-      nsCOMPtr<nsILocalFile> tridentFile(do_CreateInstance(NS_LOCAL_FILE_CONTRACTID));
-      if (tridentFile) {
-        bool exists;
-
-        tridentFile->InitWithPath(tridentFilename);
-        tridentFile->Exists(&exists);
-        if (exists) {
-          // now establish our file (userContent.css in the profile/chrome dir)
-          nsCOMPtr<nsIFile> chromeDir;
-          NS_GetSpecialDirectory(NS_APP_USER_CHROME_DIR,
-                                 getter_AddRefs(chromeDir));
-          if (chromeDir)
-            rv = tridentFile->CopyTo(chromeDir,
-                              NS_LITERAL_STRING("userContent.css"));
-        }
-      }
-    }
-  }
-  return rv;
-}
-
-void
-nsIEProfileMigrator::GetUserStyleSheetFile(nsIFile **aUserFile) 
-{
-  nsCOMPtr<nsIFile> userChrome;
-
-  *aUserFile = 0;
-
-  // establish the chrome directory
-  NS_GetSpecialDirectory(NS_APP_USER_CHROME_DIR, getter_AddRefs(userChrome));
-
-  if (userChrome) {
-    bool exists;
-    userChrome->Exists(&exists);
-    if (!exists &&
-        NS_FAILED(userChrome->Create(nsIFile::DIRECTORY_TYPE, 0755)))
-      return;
-
-    // establish the user content stylesheet file
-    userChrome->Append(NS_LITERAL_STRING("userContent.css"));
-    *aUserFile = userChrome;
-    NS_ADDREF(*aUserFile);
-  }
-}
-
-nsresult
-nsIEProfileMigrator::CopySecurityPrefs(nsIPrefBranch* aPrefs)
-{
-  nsCOMPtr<nsIWindowsRegKey> regKey = 
-    do_CreateInstance("@mozilla.org/windows-registry-key;1");
-  NS_NAMED_LITERAL_STRING(key,
-      "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings");
-  if (regKey && 
-      NS_SUCCEEDED(regKey->Open(nsIWindowsRegKey::ROOT_KEY_CURRENT_USER,
-                                key, nsIWindowsRegKey::ACCESS_READ))) {
-    
-    PRUint32 value;
-    if (NS_SUCCEEDED(regKey->ReadIntValue(NS_LITERAL_STRING("SecureProtocols"),
-                                          &value))) { 
-      aPrefs->SetBoolPref("security.enable_ssl3", (value >> 5) & true);
-      aPrefs->SetBoolPref("security.enable_tls",  (value >> 7) & true);
-    }
-  }
-
-  return NS_OK;
-}
-
-struct ProxyData {
-  char*   prefix;
-  PRInt32 prefixLength;
-  bool    proxyConfigured;
-  char*   hostPref;
-  char*   portPref;
-};
-
-nsresult
-nsIEProfileMigrator::CopyProxyPreferences(nsIPrefBranch* aPrefs)
-{
-  nsCOMPtr<nsIWindowsRegKey> regKey =
-    do_CreateInstance("@mozilla.org/windows-registry-key;1");
-  NS_NAMED_LITERAL_STRING(key,
-    "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings");
-  if (regKey && 
-      NS_SUCCEEDED(regKey->Open(nsIWindowsRegKey::ROOT_KEY_CURRENT_USER,
-                                key, nsIWindowsRegKey::ACCESS_READ))) {
-    nsAutoString buf; 
-
-    PRUint32 proxyType = 0;
-    // If there's an autoconfig URL specified in the registry at all, 
-    // it is being used. 
-    if (NS_SUCCEEDED(regKey->
-                     ReadStringValue(NS_LITERAL_STRING("AutoConfigURL"), buf))) {
-      // make this future-proof (MS IE will support IDN eventually and
-      // 'URL' will contain more than ASCII characters)
-      SetUnicharPref("network.proxy.autoconfig_url", buf, aPrefs);
-      proxyType = 2;
-    }
-
-    // ProxyEnable
-    PRUint32 enabled;
-    if (NS_SUCCEEDED(regKey->
-                     ReadIntValue(NS_LITERAL_STRING("ProxyEnable"), &enabled))) {
-      if (enabled & 0x1)
-        proxyType = 1;
-    }
-    
-    aPrefs->SetIntPref("network.proxy.type", proxyType); 
-    
-    if (NS_SUCCEEDED(regKey->
-                     ReadStringValue(NS_LITERAL_STRING("ProxyOverride"), buf)))
-      ParseOverrideServers(buf, aPrefs);
-
-    if (NS_SUCCEEDED(regKey->
-                     ReadStringValue(NS_LITERAL_STRING("ProxyServer"), buf))) {
-
-      ProxyData data[] = {
-        { "ftp=",     4, false, "network.proxy.ftp",
-          "network.proxy.ftp_port"    },
-        { "http=",    5, false, "network.proxy.http",
-          "network.proxy.http_port"   },
-        { "https=",   6, false, "network.proxy.ssl",
-          "network.proxy.ssl_port"    },
-        { "socks=",   6, false, "network.proxy.socks",
-          "network.proxy.socks_port"  },
-      };
-
-      PRInt32 startIndex = 0, count = 0;
-      bool foundSpecificProxy = false;
-      for (PRUint32 i = 0; i < ArrayLength(data); ++i) {
-        PRInt32 offset = buf.Find(NS_ConvertASCIItoUTF16(data[i].prefix));
-        if (offset >= 0) {
-          foundSpecificProxy = true;
-
-          data[i].proxyConfigured = true;
-
-          startIndex = offset + data[i].prefixLength;
-
-          PRInt32 terminal = buf.FindChar(';', offset);
-          count = terminal > startIndex ? terminal - startIndex : 
-                                          buf.Length() - startIndex;
-
-          // hostPort now contains host:port
-          SetProxyPref(Substring(buf, startIndex, count), data[i].hostPref,
-                       data[i].portPref, aPrefs);
-        }
-      }
-
-      if (!foundSpecificProxy) {
-        // No proxy config for any specific type was found, assume 
-        // the ProxyServer value is of the form host:port and that 
-        // it applies to all protocols.
-        for (PRUint32 i = 0; i < ArrayLength(data); ++i)
-          SetProxyPref(buf, data[i].hostPref, data[i].portPref, aPrefs);
-        aPrefs->SetBoolPref("network.proxy.share_proxy_settings", true);
-      }
-    }
-
-  }
-
-  return NS_OK;
-}
-
deleted file mode 100644
--- a/browser/components/migration/src/nsIEProfileMigrator.h
+++ /dev/null
@@ -1,208 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 2002
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-/* Private header describing the class to migrate preferences from
-   Windows Trident to Gecko. This is a virtual class. */
-
-#ifndef ieprofilemigrator___h___
-#define ieprofilemigrator___h___
-
-#include <time.h>
-#include <windows.h>
-#include <ole2.h>
-#include "nsIBrowserProfileMigrator.h"
-#include "nsIObserverService.h"
-#include "nsTArray.h"
-#include "nsINavHistoryService.h"
-
-class nsIFile;
-class nsICookieManager2;
-class nsIRDFResource;
-class nsINavBookmarksService;
-class nsIPrefBranch;
-
-struct SignonData {
-  PRUnichar* user;
-  PRUnichar* pass;
-  char*      realm;
-};
-
-// VC11 doesn't ship with pstore.h, so we go ahead and define the stuff that
-// we need from that file here.
-class IEnumPStoreItems : public IUnknown {
-public:
-  virtual HRESULT STDMETHODCALLTYPE Next(DWORD celt, LPWSTR* rgelt,
-                                         DWORD* pceltFetched) = 0;
-  virtual HRESULT STDMETHODCALLTYPE Skip(DWORD celt) = 0;
-  virtual HRESULT STDMETHODCALLTYPE Reset() = 0;
-  virtual HRESULT STDMETHODCALLTYPE Clone(IEnumPStoreItems** ppenum) = 0;
-};
-
-class IEnumPStoreTypes; // not used
-struct PST_PROVIDERINFO; // not used
-struct PST_TYPEINFO; // not used
-struct PST_PROMPTINFO; // not used
-struct PST_ACCESSRULESET; // not used
-typedef DWORD PST_KEY;
-typedef DWORD PST_ACCESSMODE;
-
-class IPStore : public IUnknown {
-public:
-  virtual HRESULT STDMETHODCALLTYPE GetInfo(PST_PROVIDERINFO** ppProperties) = 0;
-  virtual HRESULT STDMETHODCALLTYPE GetProvParam(DWORD dwParam, DWORD* pcbData,
-                                                 BYTE** ppbData, DWORD dwFlags) = 0;
-  virtual HRESULT STDMETHODCALLTYPE SetProvParam(DWORD dwParam, DWORD cbData,
-                                                 BYTE* pbData, DWORD dwFlags) = 0;
-  virtual HRESULT STDMETHODCALLTYPE CreateType(PST_KEY Key, const GUID* pType,
-                                               PST_TYPEINFO* pInfo, DWORD dwFlags) = 0;
-  virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(PST_KEY Key, const GUID* pType,
-                                                PST_TYPEINFO** ppInfo, DWORD dwFlags) = 0;
-  virtual HRESULT STDMETHODCALLTYPE DeleteType(PST_KEY Key, const GUID* pType,
-                                               DWORD dwFlags) = 0;
-  virtual HRESULT STDMETHODCALLTYPE CreateSubtype(PST_KEY Key, const GUID* pType,
-                                                  const GUID* pSubtype, PST_TYPEINFO* pInfo,
-                                                  PST_ACCESSRULESET* pRules, DWORD dwFlags) = 0;
-  virtual HRESULT STDMETHODCALLTYPE GetSubtypeInfo(PST_KEY Key, const GUID* pType,
-                                                   const GUID* pSubtype, PST_TYPEINFO** ppInfo,
-                                                   DWORD dwFlags) = 0;
-  virtual HRESULT STDMETHODCALLTYPE DeleteSubtype(PST_KEY Key, const GUID* pType,
-                                                  const GUID* pSubtype, DWORD dwFlags) = 0;
-  virtual HRESULT STDMETHODCALLTYPE ReadAccessRuleset(PST_KEY Key, const GUID* pType,
-                                                      const GUID* pSubtype, PST_ACCESSRULESET** ppRules,
-                                                      DWORD dwFlags) = 0;
-  virtual HRESULT STDMETHODCALLTYPE WriteAccessRuleset(PST_KEY Key, const GUID* pType,
-                                                       const GUID* pSubtype, PST_ACCESSRULESET* pRules,
-                                                       DWORD dwFlags) = 0;
-  virtual HRESULT STDMETHODCALLTYPE EnumTypes(PST_KEY Key, DWORD dwFlags, IEnumPStoreTypes** ppenum) = 0;
-  virtual HRESULT STDMETHODCALLTYPE EnumSubtypes(PST_KEY Key, const GUID* pType,
-                                                 DWORD dwFlags, IEnumPStoreTypes** ppenum) = 0;
-  virtual HRESULT STDMETHODCALLTYPE DeleteItem(PST_KEY Key, const GUID* pItemType,
-                                               const GUID* pItemSubtype, LPCWSTR szItemName,
-                                               PST_PROMPTINFO* pPromptInfo, DWORD dwFlags) = 0;
-  virtual HRESULT STDMETHODCALLTYPE ReadItem(PST_KEY Key, const GUID* pItemType,
-                                             const GUID* pItemSubtype, LPCWSTR szItemName,
-                                             DWORD* pcbData, BYTE** ppbData,
-                                             PST_PROMPTINFO* pPromptInfo, DWORD dwFlags) = 0;
-  virtual HRESULT STDMETHODCALLTYPE WriteItem(PST_KEY Key, const GUID* pItemType,
-                                              const GUID* pItemSubtype, LPCWSTR szItemName,
-                                              DWORD cbData, BYTE* pbData,
-                                              PST_PROMPTINFO* pPromptInfo, DWORD dwFlags) = 0;
-  virtual HRESULT STDMETHODCALLTYPE OpenItem(PST_KEY Key, const GUID* pItemType,
-                                             const GUID* pItemSubtype, LPCWSTR szItemName,
-                                             PST_ACCESSMODE ModeFlags, PST_PROMPTINFO* pPromptInfo,
-                                             DWORD dwFlags) = 0;
-  virtual HRESULT STDMETHODCALLTYPE CloseItem(PST_KEY Key, const GUID* pItemType,
-                                              const GUID* pItemSubtype, LPCWSTR szItemName,
-                                              DWORD dwFlags) = 0;
-  virtual HRESULT STDMETHODCALLTYPE EnumItems(PST_KEY Key, const GUID* pItemType,
-                                              const GUID* pItemSubtype, DWORD dwFlags,
-                                              IEnumPStoreItems** ppenum) = 0;
-};
-
-
-class nsIEProfileMigrator : public nsIBrowserProfileMigrator,
-                            public nsINavHistoryBatchCallback {
-public:
-  NS_DECL_NSIBROWSERPROFILEMIGRATOR
-  NS_DECL_NSINAVHISTORYBATCHCALLBACK
-  NS_DECL_ISUPPORTS
-
-  nsIEProfileMigrator();
-  virtual ~nsIEProfileMigrator();
-
-protected:
-  nsresult CopyPreferences(bool aReplace);
-  nsresult CopyStyleSheet(bool aReplace);
-  nsresult CopyCookies(bool aReplace);
-  nsresult CopyProxyPreferences(nsIPrefBranch* aPrefs);
-  nsresult CopySecurityPrefs(nsIPrefBranch* aPrefs);
-  /**
-   * Migrate history to Places.
-   * This will end up calling CopyHistoryBatched helper, that provides batch
-   * support.  Batching allows for better performances and integrity.
-   *
-   * @param aReplace
-   *        Indicates if we should replace current history or append to it.
-   */
-  nsresult CopyHistory(bool aReplace);
-  nsresult CopyHistoryBatched(bool aReplace);
-
-  bool     KeyIsURI(const nsAString& aKey, char** aRealm);
-
-  nsresult CopyPasswords(bool aReplace);
-  nsresult MigrateSiteAuthSignons(IPStore* aPStore);
-  nsresult GetSignonsListFromPStore(IPStore* aPStore, nsTArray<SignonData>* aSignonsFound);
-  nsresult ResolveAndMigrateSignons(IPStore* aPStore, nsTArray<SignonData>* aSignonsFound);
-  void     EnumerateUsernames(const nsAString& aKey, PRUnichar* aData, unsigned long aCount, nsTArray<SignonData>* aSignonsFound);
-  void     GetUserNameAndPass(unsigned char* data, unsigned long len, unsigned char** username, unsigned char** pass);
-
-  nsresult CopyFormData(bool aReplace);
-  nsresult AddDataToFormHistory(const nsAString& aKey, PRUnichar* data, unsigned long len);
-  /**
-   * Migrate bookmarks to Places.
-   * This will end up calling CopyFavoritesBatched helper, that provides batch
-   * support.  Batching allows for better performances and integrity.
-   *
-   * @param aReplace
-   *        Indicates if we should replace current bookmarks or append to them.
-   *        When appending we will usually default to bookmarks menu.
-   */
-  nsresult CopyFavorites(bool aReplace);
-  nsresult CopyFavoritesBatched(bool aReplace);
-  void     ResolveShortcut(const nsString &aFileName, char** aOutURL);
-  nsresult ParseFavoritesFolder(nsIFile* aDirectory, 
-                                PRInt64 aParentFolder,
-                                nsINavBookmarksService* aBookmarksService,
-                                const nsAString& aPersonalToolbarFolderName,
-                                bool aIsAtRootLevel);
-  nsresult CopySmartKeywords(nsINavBookmarksService* aBMS,
-                             PRInt64 aParentFolder);
-
-  nsresult CopyCookiesFromBuffer(char *aBuffer, PRUint32 aBufferLength,
-                                 nsICookieManager2 *aCookieManager);
-  void     DelimitField(char **aBuffer, const char *aBufferEnd, char **aField);
-  time_t   FileTimeToTimeT(const char *aLowDateIntString,
-                           const char *aHighDateIntString);
-  void     GetUserStyleSheetFile(nsIFile **aUserFile);
-  bool     TestForIE7();
-
-private:
-  nsCOMPtr<nsIObserverService> mObserverService;
-};
-
-#endif
-