/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "nsMailProfileMigratorUtils.h" #include "nsISupportsPrimitives.h" #include "nsProfileMigratorBase.h" #include "nsIMailProfileMigrator.h" #include "nsIImportSettings.h" #include "nsIImportFilters.h" #include "nsComponentManagerUtils.h" #include "nsServiceManagerUtils.h" #define kPersonalAddressbookUri "jsaddrbook://abook.sqlite" nsProfileMigratorBase::nsProfileMigratorBase() { mObserverService = do_GetService("@mozilla.org/observer-service;1"); mProcessingMailFolders = false; } nsProfileMigratorBase::~nsProfileMigratorBase() { if (mFileIOTimer) mFileIOTimer->Cancel(); } nsresult nsProfileMigratorBase::ImportSettings(nsIImportModule* aImportModule) { nsresult rv; nsAutoString index; index.AppendInt(nsIMailProfileMigrator::ACCOUNT_SETTINGS); NOTIFY_OBSERVERS(MIGRATION_ITEMBEFOREMIGRATE, index.get()); nsCOMPtr supports; rv = aImportModule->GetImportInterface(NS_IMPORT_SETTINGS_STR, getter_AddRefs(supports)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr importSettings = do_QueryInterface(supports); NS_ENSURE_SUCCESS(rv, rv); bool importedSettings = false; rv = importSettings->Import(getter_AddRefs(mLocalFolderAccount), &importedSettings); NOTIFY_OBSERVERS(MIGRATION_ITEMAFTERMIGRATE, index.get()); return rv; } nsresult nsProfileMigratorBase::ImportAddressBook( nsIImportModule* aImportModule) { nsresult rv; nsAutoString index; index.AppendInt(nsIMailProfileMigrator::ADDRESSBOOK_DATA); NOTIFY_OBSERVERS(MIGRATION_ITEMBEFOREMIGRATE, index.get()); nsCOMPtr supports; rv = aImportModule->GetImportInterface(NS_IMPORT_ADDRESS_STR, getter_AddRefs(supports)); NS_ENSURE_SUCCESS(rv, rv); mGenericImporter = do_QueryInterface(supports); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr pabString = do_CreateInstance(NS_SUPPORTS_CSTRING_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); // We want to migrate the Outlook addressbook into our personal address book. pabString->SetData(nsDependentCString(kPersonalAddressbookUri)); mGenericImporter->SetData("addressDestination", pabString); bool importResult; bool wantsProgress; mGenericImporter->WantsProgress(&wantsProgress); rv = mGenericImporter->BeginImport(nullptr, nullptr, &importResult); if (wantsProgress) ContinueImport(); else FinishCopyingAddressBookData(); return rv; } nsresult nsProfileMigratorBase::FinishCopyingAddressBookData() { nsAutoString index; index.AppendInt(nsIMailProfileMigrator::ADDRESSBOOK_DATA); NOTIFY_OBSERVERS(MIGRATION_ITEMAFTERMIGRATE, index.get()); // now kick off the mail migration code ImportMailData(mImportModule); return NS_OK; } nsresult nsProfileMigratorBase::ImportMailData(nsIImportModule* aImportModule) { nsresult rv; nsAutoString index; index.AppendInt(nsIMailProfileMigrator::MAILDATA); NOTIFY_OBSERVERS(MIGRATION_ITEMBEFOREMIGRATE, index.get()); nsCOMPtr supports; rv = aImportModule->GetImportInterface(NS_IMPORT_MAIL_STR, getter_AddRefs(supports)); NS_ENSURE_SUCCESS(rv, rv); mGenericImporter = do_QueryInterface(supports); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr migrating = do_CreateInstance(NS_SUPPORTS_PRBOOL_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); // by setting the migration flag, we force the import utility to install local // folders from OE directly into Local Folders and not as a subfolder migrating->SetData(true); mGenericImporter->SetData("migration", migrating); bool importResult; bool wantsProgress; mGenericImporter->WantsProgress(&wantsProgress); rv = mGenericImporter->BeginImport(nullptr, nullptr, &importResult); mProcessingMailFolders = true; if (wantsProgress) ContinueImport(); else FinishCopyingMailFolders(); return rv; } nsresult nsProfileMigratorBase::FinishCopyingMailFolders() { nsAutoString index; index.AppendInt(nsIMailProfileMigrator::MAILDATA); NOTIFY_OBSERVERS(MIGRATION_ITEMAFTERMIGRATE, index.get()); // now kick off the filters migration code return ImportFilters(mImportModule); } nsresult nsProfileMigratorBase::ImportFilters(nsIImportModule* aImportModule) { nsresult rv = NS_OK; nsCOMPtr supports; nsresult rv2 = aImportModule->GetImportInterface(NS_IMPORT_FILTERS_STR, getter_AddRefs(supports)); nsCOMPtr importFilters = do_QueryInterface(supports); if (NS_SUCCEEDED(rv2) && importFilters) { nsAutoString index; index.AppendInt(nsIMailProfileMigrator::FILTERS); NOTIFY_OBSERVERS(MIGRATION_ITEMBEFOREMIGRATE, index.get()); bool importedFilters = false; char16_t* error; rv = importFilters->Import(&error, &importedFilters); NOTIFY_OBSERVERS(MIGRATION_ITEMAFTERMIGRATE, index.get()); } // migration is now done...notify the UI. NOTIFY_OBSERVERS(MIGRATION_ENDED, nullptr); return rv; }