summaryrefslogtreecommitdiffstats
path: root/comm/suite/components/migration/src/nsThunderbirdProfileMigrator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'comm/suite/components/migration/src/nsThunderbirdProfileMigrator.cpp')
-rw-r--r--comm/suite/components/migration/src/nsThunderbirdProfileMigrator.cpp571
1 files changed, 571 insertions, 0 deletions
diff --git a/comm/suite/components/migration/src/nsThunderbirdProfileMigrator.cpp b/comm/suite/components/migration/src/nsThunderbirdProfileMigrator.cpp
new file mode 100644
index 0000000000..3f5365f12a
--- /dev/null
+++ b/comm/suite/components/migration/src/nsThunderbirdProfileMigrator.cpp
@@ -0,0 +1,571 @@
+/* -*- 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 "nsSuiteProfileMigratorUtils.h"
+#include "mozilla/ArrayUtils.h"
+#include "nsCRT.h"
+#include "nsDirectoryServiceDefs.h"
+#include "nsIObserverService.h"
+#include "nsIPrefLocalizedString.h"
+#include "nsIPrefService.h"
+#include "nsIServiceManager.h"
+#include "nsISupportsPrimitives.h"
+#include "nsNetCID.h"
+#include "nsNetUtil.h"
+#include "nsIProperties.h"
+#include "nsServiceManagerUtils.h"
+#include "nsThunderbirdProfileMigrator.h"
+#include "prprf.h"
+
+///////////////////////////////////////////////////////////////////////////////
+// nsThunderbirdProfileMigrator
+
+#define FILE_NAME_SITEPERM_OLD "cookperm.txt"
+#define FILE_NAME_SITEPERM_NEW "hostperm.1"
+#define FILE_NAME_CERT8DB "cert8.db"
+#define FILE_NAME_KEY3DB "key3.db"
+#define FILE_NAME_SECMODDB "secmod.db"
+#define FILE_NAME_HISTORY "history.dat"
+#define FILE_NAME_SIGNONS "signons.sqlite"
+#define FILE_NAME_MIMETYPES "mimeTypes.rdf"
+#define FILE_NAME_USER_PREFS "user.js"
+#define FILE_NAME_PERSONALDICTIONARY "persdict.dat"
+#define FILE_NAME_MAILVIEWS "mailViews.dat"
+
+NS_IMPL_ISUPPORTS(nsThunderbirdProfileMigrator, nsISuiteProfileMigrator,
+ nsITimerCallback)
+
+nsThunderbirdProfileMigrator::nsThunderbirdProfileMigrator()
+{
+}
+
+nsThunderbirdProfileMigrator::~nsThunderbirdProfileMigrator()
+{
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// nsISuiteProfileMigrator
+
+NS_IMETHODIMP
+nsThunderbirdProfileMigrator::Migrate(uint16_t aItems,
+ nsIProfileStartup* aStartup,
+ const char16_t* aProfile)
+{
+ nsresult rv = NS_OK;
+ bool aReplace = aStartup ? true : false;
+
+ if (!mTargetProfile) {
+ GetProfilePath(aStartup, getter_AddRefs(mTargetProfile));
+ if (!mTargetProfile)
+ return NS_ERROR_FILE_NOT_FOUND;
+ }
+ if (!mSourceProfile) {
+ GetSourceProfile(aProfile);
+ if (!mSourceProfile)
+ return NS_ERROR_FILE_NOT_FOUND;
+ }
+
+ NOTIFY_OBSERVERS(MIGRATION_STARTED, nullptr);
+
+ COPY_DATA(CopyPreferences, aReplace, nsISuiteProfileMigrator::SETTINGS);
+ COPY_DATA(CopyHistory, aReplace, nsISuiteProfileMigrator::HISTORY);
+ COPY_DATA(CopyPasswords, aReplace, nsISuiteProfileMigrator::PASSWORDS);
+
+ // fake notifications for things we've already imported as part of
+ // CopyPreferences
+ nsAutoString index;
+ index.AppendInt(nsISuiteProfileMigrator::ACCOUNT_SETTINGS);
+ NOTIFY_OBSERVERS(MIGRATION_ITEMBEFOREMIGRATE, index.get());
+ NOTIFY_OBSERVERS(MIGRATION_ITEMAFTERMIGRATE, index.get());
+
+ index.Truncate();
+ index.AppendInt(nsISuiteProfileMigrator::NEWSDATA);
+ NOTIFY_OBSERVERS(MIGRATION_ITEMBEFOREMIGRATE, index.get());
+ NOTIFY_OBSERVERS(MIGRATION_ITEMAFTERMIGRATE, index.get());
+
+ // copy junk mail training file
+ COPY_DATA(CopyJunkTraining, aReplace, nsISuiteProfileMigrator::JUNKTRAINING);
+
+ if (aReplace &&
+ (aItems & nsISuiteProfileMigrator::SETTINGS ||
+ aItems & nsISuiteProfileMigrator::PASSWORDS ||
+ !aItems)) {
+ // Permissions (Images)
+ if (NS_SUCCEEDED(rv))
+ rv = CopyFile(FILE_NAME_SITEPERM_NEW, FILE_NAME_SITEPERM_NEW);
+ if (NS_SUCCEEDED(rv))
+ rv = CopyFile(FILE_NAME_SITEPERM_OLD, FILE_NAME_SITEPERM_OLD);
+ }
+
+ // the last thing to do is to actually copy over any mail folders
+ // we have marked for copying we want to do this last and it will be
+ // asynchronous so the UI doesn't freeze up while we perform
+ // this potentially very long operation.
+ CopyMailFolders();
+
+ return rv;
+}
+
+NS_IMETHODIMP
+nsThunderbirdProfileMigrator::GetMigrateData(const char16_t* aProfile,
+ bool aReplace,
+ uint16_t* aResult)
+{
+ *aResult = 0;
+
+ if (!mSourceProfile) {
+ GetSourceProfile(aProfile);
+ if (!mSourceProfile)
+ return NS_ERROR_FILE_NOT_FOUND;
+ }
+
+ // migration fields for things we always migrate
+ *aResult =
+ nsISuiteProfileMigrator::ACCOUNT_SETTINGS |
+ nsISuiteProfileMigrator::MAILDATA |
+ nsISuiteProfileMigrator::NEWSDATA |
+ nsISuiteProfileMigrator::ADDRESSBOOK_DATA;
+
+ MigrationData data[] = { { FILE_NAME_PREFS,
+ nsISuiteProfileMigrator::SETTINGS,
+ true },
+ { FILE_NAME_USER_PREFS,
+ nsISuiteProfileMigrator::SETTINGS,
+ true },
+ { FILE_NAME_HISTORY,
+ nsISuiteProfileMigrator::HISTORY,
+ true },
+ { FILE_NAME_SIGNONS,
+ nsISuiteProfileMigrator::PASSWORDS,
+ true },
+ { FILE_NAME_JUNKTRAINING,
+ nsISuiteProfileMigrator::JUNKTRAINING,
+ true } };
+
+ GetMigrateDataFromArray(data, sizeof(data)/sizeof(MigrationData),
+ aReplace, mSourceProfile, aResult);
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsThunderbirdProfileMigrator::GetSupportedItems(uint16_t *aSupportedItems)
+{
+ NS_ENSURE_ARG_POINTER(aSupportedItems);
+
+ *aSupportedItems = nsISuiteProfileMigrator::SETTINGS |
+ nsISuiteProfileMigrator::HISTORY |
+ nsISuiteProfileMigrator::JUNKTRAINING |
+ nsISuiteProfileMigrator::PASSWORDS |
+ nsISuiteProfileMigrator::ACCOUNT_SETTINGS |
+ nsISuiteProfileMigrator::MAILDATA |
+ nsISuiteProfileMigrator::NEWSDATA |
+ nsISuiteProfileMigrator::ADDRESSBOOK_DATA;
+
+ return NS_OK;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// nsThunderbirdProfileMigrator
+
+nsresult
+nsThunderbirdProfileMigrator::FillProfileDataFromRegistry()
+{
+ // Find the Thunderbird Registry
+ nsCOMPtr<nsIProperties> fileLocator(
+ do_GetService("@mozilla.org/file/directory_service;1"));
+ nsCOMPtr<nsIFile> thunderbirdData;
+#ifdef XP_WIN
+ fileLocator->Get(NS_WIN_APPDATA_DIR, NS_GET_IID(nsIFile),
+ getter_AddRefs(thunderbirdData));
+
+ thunderbirdData->Append(u"Thunderbird"_ns);
+
+#elif defined(XP_MACOSX)
+ fileLocator->Get(NS_MAC_USER_LIB_DIR, NS_GET_IID(nsIFile),
+ getter_AddRefs(thunderbirdData));
+
+ thunderbirdData->Append(u"Thunderbird"_ns);
+
+#elif defined(XP_UNIX)
+ fileLocator->Get(NS_UNIX_HOME_DIR, NS_GET_IID(nsIFile),
+ getter_AddRefs(thunderbirdData));
+
+ thunderbirdData->Append(u".thunderbird"_ns);
+
+#else
+ // On other OS just abort
+ return NS_ERROR_FILE_NOT_FOUND;
+#endif
+
+ // Try profiles.ini first
+ return GetProfileDataFromProfilesIni(thunderbirdData,
+ mProfileNames,
+ mProfileLocations);
+}
+
+static
+nsThunderbirdProfileMigrator::PrefTransform gTransforms[] = {
+ MAKESAMETYPEPREFTRANSFORM("accessibility.typeaheadfind.autostart", Bool),
+ MAKESAMETYPEPREFTRANSFORM("accessibility.typeaheadfind.linksonly", Bool),
+
+ MAKESAMETYPEPREFTRANSFORM("browser.anchor_color", String),
+ MAKESAMETYPEPREFTRANSFORM("browser.active_color", String),
+ MAKESAMETYPEPREFTRANSFORM("browser.display.background_color", String),
+ MAKESAMETYPEPREFTRANSFORM("browser.display.foreground_color", String),
+ MAKESAMETYPEPREFTRANSFORM("browser.display.use_system_colors", Bool),
+ MAKESAMETYPEPREFTRANSFORM("browser.display.document_color_use", Int),
+ MAKESAMETYPEPREFTRANSFORM("browser.display.use_document_fonts", Bool),
+ MAKESAMETYPEPREFTRANSFORM("browser.enable_automatic_image_resizing", Bool),
+ MAKESAMETYPEPREFTRANSFORM("browser.tabs.autoHide", Bool),
+ MAKESAMETYPEPREFTRANSFORM("browser.tabs.loadInBackground", Bool),
+ MAKESAMETYPEPREFTRANSFORM("browser.underline_anchors", Bool),
+ MAKESAMETYPEPREFTRANSFORM("browser.visited_color", String),
+
+ MAKESAMETYPEPREFTRANSFORM("dom.disable_open_during_load", Bool),
+ MAKESAMETYPEPREFTRANSFORM("dom.disable_window_move_resize", Bool),
+ MAKESAMETYPEPREFTRANSFORM("dom.disable_window_flip", Bool),
+ MAKESAMETYPEPREFTRANSFORM("dom.disable_window_open_feature.status", Bool),
+ MAKESAMETYPEPREFTRANSFORM("dom.disable_window_status_change", Bool),
+
+ MAKESAMETYPEPREFTRANSFORM("extensions.spellcheck.inline.max-misspellings",Int),
+
+ MAKESAMETYPEPREFTRANSFORM("general.warnOnAboutConfig", Bool),
+
+ MAKESAMETYPEPREFTRANSFORM("intl.accept_charsets", String),
+ MAKESAMETYPEPREFTRANSFORM("intl.accept_languages", String),
+ MAKESAMETYPEPREFTRANSFORM("intl.charset.fallback.override", String),
+
+ MAKESAMETYPEPREFTRANSFORM("javascript.enabled", Bool),
+ MAKESAMETYPEPREFTRANSFORM("javascript.options.relimit", Bool),
+ MAKESAMETYPEPREFTRANSFORM("javascript.options.showInConsole", Bool),
+ MAKESAMETYPEPREFTRANSFORM("javascript.options.strict", Bool),
+
+ MAKESAMETYPEPREFTRANSFORM("layout.spellcheckDefault", Int),
+
+ MAKESAMETYPEPREFTRANSFORM("mail.accountmanager.accounts", String),
+ MAKESAMETYPEPREFTRANSFORM("mail.accountmanager.defaultaccount", String),
+ MAKESAMETYPEPREFTRANSFORM("mail.accountmanager.localfoldersserver", String),
+ MAKESAMETYPEPREFTRANSFORM("mail.accountwizard.deferstorage", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.adaptivefilters.junk_threshold", Int),
+ MAKESAMETYPEPREFTRANSFORM("mail.autoComplete.highlightNonMatches", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.biff.animate_doc_icon", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.biff.play_sound", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.biff.play_sound.type", Int),
+ MAKESAMETYPEPREFTRANSFORM("mail.biff.play_sound.url", String),
+ MAKESAMETYPEPREFTRANSFORM("mail.biff.show_alert", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.biff.show_tray_icon", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.check_all_imap_folders_for_new", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.citation_color", String),
+ MAKESAMETYPEPREFTRANSFORM("mail.collect_addressbook", String),
+ MAKESAMETYPEPREFTRANSFORM("mail.collect_email_address_incoming", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.collect_email_address_newsgroup", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.collect_email_address_outgoing", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.compose.add_undisclosed_recipients", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.compose.autosave", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.compose.autosaveinterval", Int),
+ MAKESAMETYPEPREFTRANSFORM("mail.compose.dontWarnMail2Newsgroup", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.compose.other.header", String),
+ MAKESAMETYPEPREFTRANSFORM("mail.content_disposition_type", Int),
+
+ MAKESAMETYPEPREFTRANSFORM("mail.default_html_action", Int),
+ MAKESAMETYPEPREFTRANSFORM("mail.default_sendlater_uri", String),
+ MAKESAMETYPEPREFTRANSFORM("mail.delete_matches_sort_order", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.display_glyph", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.display_struct", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.enable_autocomplete", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.fcc_folder", String),
+ MAKESAMETYPEPREFTRANSFORM("mail.file_attach_binary", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.fixed_width_messages", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.forward_message_mode", Int),
+
+ MAKESAMETYPEPREFTRANSFORM("mail.incorporate.return_receipt", Int),
+ MAKESAMETYPEPREFTRANSFORM("mail.inline_attachments", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.label_ascii_only_mail_as_us_ascii", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.notification.sound", String),
+
+ MAKESAMETYPEPREFTRANSFORM("mail.pane_config.dynamic", Int),
+ MAKESAMETYPEPREFTRANSFORM("mail.password_protect_local_cache", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.phishing.detection.enabled", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.pop3.deleteFromServerOnMove", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.prompt_purge_threshhold", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.purge_threshhold", Int),
+ MAKESAMETYPEPREFTRANSFORM("mail.purge.ask", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.purge.min_delay", Int),
+ MAKESAMETYPEPREFTRANSFORM("mail.purge.timer_interval", Int),
+
+ MAKESAMETYPEPREFTRANSFORM("mail.quoteasblock", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.quoted_graphical", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.quoted_size", Int),
+ MAKESAMETYPEPREFTRANSFORM("mail.quoted_style", Int),
+
+ MAKESAMETYPEPREFTRANSFORM("mail.receipt.request_header_type", Int),
+ MAKESAMETYPEPREFTRANSFORM("mail.receipt.request_return_receipt_on", Bool),
+
+ MAKESAMETYPEPREFTRANSFORM("mail.send_struct", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.show_headers", Int),
+ MAKESAMETYPEPREFTRANSFORM("mail.smtp.useMatchingDomainServer", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.smtp.useMatchingHostNameServer", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.smtp.defaultserver", String),
+ MAKESAMETYPEPREFTRANSFORM("mail.smtpservers", String),
+ MAKESAMETYPEPREFTRANSFORM("mail.spellcheck.inline", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.SpellCheckBeforeSend", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.startup.enabledMailCheckOnce", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.strict_threading", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.strictly_mime", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.strictly_mime_headers", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.strictly_mime.parm_folding", Bool),
+
+ MAKESAMETYPEPREFTRANSFORM("mail.thread_without_re", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.trusteddomains", String),
+ MAKESAMETYPEPREFTRANSFORM("mail.warn_on_send_accel_key", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.warn_filter_changed", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mail.wrap_long_lines", Bool),
+
+ MAKESAMETYPEPREFTRANSFORM("mailnews.account_central_page.url", String),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.confirm.moveFoldersToTrash", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.customDBHeaders", String),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.customHeaders", String),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.default_sort_order", Int),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.default_sort_type", Int),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.default_news_sort_order", Int),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.default_news_sort_type", Int),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.display.disable_format_flowed_support", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.display.disallow_mime_handlers", Int),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.display.html_as", Int),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.display_html_sanitzer.allowed_tags", String),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.display.original_date", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.display.prefer_plaintext", Bool),
+
+ MAKESAMETYPEPREFTRANSFORM("mailnews.force_ascii_search", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.force_charset_override", Bool),
+
+ MAKESAMETYPEPREFTRANSFORM("mailnews.headers.showOrganization", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.headers.showUserAgent", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.headers.extraExpandedHeaders", String),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.html_domains", String),
+
+ MAKESAMETYPEPREFTRANSFORM("mailnews.mark_message_read.delay", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.mark_message_read.delay.interval", Int),
+
+ MAKESAMETYPEPREFTRANSFORM("mailnews.message_display.disable_remote_image", Bool),
+
+ MAKESAMETYPEPREFTRANSFORM("mailnews.nav_crosses_folders", Int),
+
+ MAKESAMETYPEPREFTRANSFORM("mailnews.offline_sync_mail", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.offline_sych_news", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.offline_sync_send_unsent", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.offline_sync_work_offline", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.open_window_warning", Int),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.plaintext_domains", String),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.remember_selected_message", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.reply_in_default_charset", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.reuse_message_window", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.scroll_to_new_message", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.search_date_format", String),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.search_date_leading_zeros", String),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.search_date_separator", String),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.send_default_charset", String),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.send_plaintext_flowed", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.show_send_progress", String),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.start_page.enabled", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.start_page.url", String),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.tcptimeout", Int),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.thread_pane_column_unthreads", Bool),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.view_default_charset", String),
+ MAKESAMETYPEPREFTRANSFORM("mailnews.wraplength", Int),
+
+ MAKESAMETYPEPREFTRANSFORM("messenger.save.dir", String),
+
+ MAKESAMETYPEPREFTRANSFORM("msgcompose.background_color", String),
+ MAKESAMETYPEPREFTRANSFORM("msgcompose.font_face", String),
+ MAKESAMETYPEPREFTRANSFORM("msgcompose.font_size", String),
+ MAKESAMETYPEPREFTRANSFORM("msgcompose.text_color", String),
+
+ MAKESAMETYPEPREFTRANSFORM("news.get_messages_on_select", Bool),
+ MAKESAMETYPEPREFTRANSFORM("news.show_size_in_lines", Bool),
+ MAKESAMETYPEPREFTRANSFORM("news.update_unread_on_expand", Bool),
+
+ // pdi is the new preference, but nii is the old one - so do nii first, and
+ // then do pdi to account for both situations
+ MAKEPREFTRANSFORM("network.image.imageBehavior", 0, Int, Image),
+ MAKESAMETYPEPREFTRANSFORM("permissions.default.image", Int),
+
+ MAKESAMETYPEPREFTRANSFORM("network.proxy.autoconfig_url", String),
+ MAKESAMETYPEPREFTRANSFORM("network.proxy.ftp", String),
+ MAKESAMETYPEPREFTRANSFORM("network.proxy.ftp_port", Int),
+ MAKESAMETYPEPREFTRANSFORM("network.proxy.http", String),
+ MAKESAMETYPEPREFTRANSFORM("network.proxy.http_port", Int),
+ MAKESAMETYPEPREFTRANSFORM("network.proxy.no_proxies_on", String),
+ MAKESAMETYPEPREFTRANSFORM("network.proxy.socks", String),
+ MAKESAMETYPEPREFTRANSFORM("network.proxy.socks_port", Int),
+ MAKESAMETYPEPREFTRANSFORM("network.proxy.ssl", String),
+ MAKESAMETYPEPREFTRANSFORM("network.proxy.ssl_port", Int),
+ MAKESAMETYPEPREFTRANSFORM("network.proxy.type", Int),
+
+ MAKESAMETYPEPREFTRANSFORM("offline.autodetect", Bool),
+ MAKESAMETYPEPREFTRANSFORM("offline.download.download_messages", Int),
+ MAKESAMETYPEPREFTRANSFORM("offline.send.unsent_messages", Int),
+ MAKESAMETYPEPREFTRANSFORM("offline.startup_state", Int),
+ MAKESAMETYPEPREFTRANSFORM("security.default_personal_cert", String),
+ MAKESAMETYPEPREFTRANSFORM("security.password_lifetime", Int),
+ MAKESAMETYPEPREFTRANSFORM("security.tls.version.min", Int),
+ MAKESAMETYPEPREFTRANSFORM("security.tls.version.max", Int),
+ MAKESAMETYPEPREFTRANSFORM("security.warn_entering_secure", Bool),
+ MAKESAMETYPEPREFTRANSFORM("security.warn_leaving_secure", Bool),
+ MAKESAMETYPEPREFTRANSFORM("security.warn_submit_insecure", Bool),
+ MAKESAMETYPEPREFTRANSFORM("security.warn_viewing_mixed", Bool),
+
+ MAKESAMETYPEPREFTRANSFORM("signon.rememberSignons", Bool),
+
+ MAKESAMETYPEPREFTRANSFORM("slider.snapMultiplier", Int),
+ MAKESAMETYPEPREFTRANSFORM("startup.homepage_override_url", String),
+
+#ifdef XP_UNIX
+ MAKESAMETYPEPREFTRANSFORM("ui.allow_platform_file_picker", Bool),
+#endif
+ MAKESAMETYPEPREFTRANSFORM("ui.click_hold_context_menus", Bool)
+};
+
+nsresult
+nsThunderbirdProfileMigrator::TransformPreferences(
+ const char* aSourcePrefFileName,
+ const char* aTargetPrefFileName)
+{
+ PrefTransform* transform;
+ PrefTransform* end = gTransforms + sizeof(gTransforms)/sizeof(PrefTransform);
+
+ // Load the source pref file
+ nsCOMPtr<nsIPrefService> psvc(do_GetService(NS_PREFSERVICE_CONTRACTID));
+ psvc->ResetPrefs();
+
+ nsCOMPtr<nsIFile> sourcePrefsFile;
+ mSourceProfile->Clone(getter_AddRefs(sourcePrefsFile));
+ sourcePrefsFile->AppendNative(nsDependentCString(aSourcePrefFileName));
+ psvc->ReadUserPrefsFromFile(sourcePrefsFile);
+
+ nsCOMPtr<nsIPrefBranch> branch(do_QueryInterface(psvc));
+ for (transform = gTransforms; transform < end; ++transform)
+ transform->prefGetterFunc(transform, branch);
+
+ // read in the various pref branch trees for accounts, identities, servers,
+ // etc.
+ static const char* branchNames[] =
+ {
+ // Keep the three below first, or change the indexes below
+ "mail.identity.",
+ "mail.server.",
+ "ldap_2.",
+ "accessibility.",
+ "applications.",
+ "bidi.",
+ "dom.",
+ "editor.",
+ "font.",
+ "helpers.",
+ "mail.account.",
+ "mail.addr_book.",
+ "mail.imap.",
+ "mail.mdn.",
+ "mail.smtpserver.",
+ "mail.spam.",
+ "mail.toolbars.",
+ "mailnews.labels.",
+ "mailnews.reply_",
+ "mailnews.tags.",
+ "middlemouse.",
+ "mousewheel.",
+ "network.http.",
+ "print.",
+ "privacy.",
+ "security.OSCP.",
+ "security.crl.",
+ "ui.key.",
+ "wallet."
+ };
+
+ PBStructArray branches[MOZ_ARRAY_LENGTH(branchNames)];
+ uint32_t i;
+ for (i = 0; i < MOZ_ARRAY_LENGTH(branchNames); ++i)
+ ReadBranch(branchNames[i], psvc, branches[i]);
+
+ // the signature file prefs may be paths to files in the thunderbird profile
+ // path so we need to copy them over and fix these paths up before we write
+ // them out to the new prefs.js
+ CopySignatureFiles(branches[0], psvc);
+
+ // certain mail prefs may actually be absolute paths instead of profile
+ // relative paths we need to fix these paths up before we write them out to
+ // the new prefs.js
+ CopyMailFolderPrefs(branches[1], psvc);
+
+ CopyAddressBookDirectories(branches[2], psvc);
+
+ // Now that we have all the pref data in memory, load the target pref file,
+ // and write it back out
+ psvc->ResetPrefs();
+
+ nsCOMPtr<nsIFile> targetPrefsFile;
+ mTargetProfile->Clone(getter_AddRefs(targetPrefsFile));
+ targetPrefsFile->AppendNative(nsDependentCString(aTargetPrefFileName));
+
+ // Don't use nullptr here as we're too early in the cycle for the prefs
+ // service to get its default file (because the NS_GetDirectoryService items
+ // aren't fully set up yet).
+ psvc->ReadUserPrefsFromFile(targetPrefsFile);
+
+ for (transform = gTransforms; transform < end; ++transform)
+ transform->prefSetterFunc(transform, branch);
+
+ for (i = 0; i < MOZ_ARRAY_LENGTH(branchNames); ++i)
+ WriteBranch(branchNames[i], psvc, branches[i]);
+
+ psvc->SavePrefFile(targetPrefsFile);
+
+ return NS_OK;
+}
+
+nsresult
+nsThunderbirdProfileMigrator::CopyPreferences(bool aReplace)
+{
+ nsresult rv = NS_OK;
+ if (!aReplace)
+ return rv;
+
+ if (NS_SUCCEEDED(rv))
+ rv = TransformPreferences(FILE_NAME_PREFS, FILE_NAME_PREFS);
+ if (NS_SUCCEEDED(rv))
+ rv = CopyFile(FILE_NAME_USER_PREFS, FILE_NAME_USER_PREFS);
+
+ // Security Stuff
+ if (NS_SUCCEEDED(rv))
+ rv = CopyFile(FILE_NAME_CERT8DB, FILE_NAME_CERT8DB);
+ if (NS_SUCCEEDED(rv))
+ rv = CopyFile(FILE_NAME_KEY3DB, FILE_NAME_KEY3DB);
+ if (NS_SUCCEEDED(rv))
+ rv = CopyFile(FILE_NAME_SECMODDB, FILE_NAME_SECMODDB);
+
+ // User MIME Type overrides
+ if (NS_SUCCEEDED(rv))
+ rv = CopyFile(FILE_NAME_MIMETYPES, FILE_NAME_MIMETYPES);
+ if (NS_SUCCEEDED(rv))
+ rv = CopyFile(FILE_NAME_PERSONALDICTIONARY, FILE_NAME_PERSONALDICTIONARY);
+ if (NS_SUCCEEDED(rv))
+ rv = CopyFile(FILE_NAME_MAILVIEWS, FILE_NAME_MAILVIEWS);
+
+ return rv;
+}
+
+nsresult
+nsThunderbirdProfileMigrator::CopyHistory(bool aReplace)
+{
+ return aReplace ? CopyFile(FILE_NAME_HISTORY, FILE_NAME_HISTORY) : NS_OK;
+}
+
+nsresult
+nsThunderbirdProfileMigrator::CopyPasswords(bool aReplace)
+{
+ return aReplace ? CopyFile(FILE_NAME_SIGNONS, FILE_NAME_SIGNONS) : NS_OK;
+}