NS_IMETHODIMP
nsSeamonkeyProfileMigrator::GetMigrateData(const PRUnichar* aProfile, 
                                           PRBool aReplace, 
                                           PRUint16* aResult)
{
  *aResult = 0;

  if (!mSourceProfile) {
    GetSourceProfile(aProfile);
    if (!mSourceProfile)
      return NS_ERROR_FILE_NOT_FOUND;
  }

  MigrationData data[] = { { ToNewUnicode(FILE_NAME_PREFS),
                             nsIBrowserProfileMigrator::SETTINGS,
                             PR_TRUE },
                           { ToNewUnicode(FILE_NAME_USER_PREFS),
                             nsIBrowserProfileMigrator::SETTINGS,
                             PR_TRUE },
                           { ToNewUnicode(FILE_NAME_COOKIES),
                             nsIBrowserProfileMigrator::COOKIES,
                             PR_FALSE },
                           { ToNewUnicode(FILE_NAME_HISTORY),
                             nsIBrowserProfileMigrator::HISTORY,
                             PR_TRUE },
                           { ToNewUnicode(FILE_NAME_BOOKMARKS),
                             nsIBrowserProfileMigrator::BOOKMARKS,
                             PR_FALSE },
                           { ToNewUnicode(FILE_NAME_DOWNLOADS),
                             nsIBrowserProfileMigrator::OTHERDATA,
                             PR_TRUE },
                           { ToNewUnicode(FILE_NAME_MIMETYPES),
                             nsIBrowserProfileMigrator::OTHERDATA,
                             PR_TRUE } };
                                                                  
  // Frees file name strings allocated above.
  GetMigrateDataFromArray(data, sizeof(data)/sizeof(MigrationData), 
                          aReplace, mSourceProfile, aResult);

  // Now locate passwords
  nsCString signonsFileName;
  GetSignonFileName(aReplace, getter_Copies(signonsFileName));

  if (!signonsFileName.IsEmpty()) {
    NS_ConvertASCIItoUTF16 fileName(signonsFileName);
    nsCOMPtr<nsIFile> sourcePasswordsFile;
    mSourceProfile->Clone(getter_AddRefs(sourcePasswordsFile));
    sourcePasswordsFile->Append(fileName);
    
    PRBool exists;
    sourcePasswordsFile->Exists(&exists);
    if (exists)
      *aResult |= nsIBrowserProfileMigrator::PASSWORDS;
  }

  return NS_OK;
}
nsresult
nsSeamonkeyProfileMigrator::CopyPasswords(PRBool aReplace)
{
  nsresult rv;

  nsCString signonsFileName;
  GetSignonFileName(aReplace, getter_Copies(signonsFileName));

  if (signonsFileName.IsEmpty())
    return NS_ERROR_FILE_NOT_FOUND;

  NS_ConvertASCIItoUTF16 fileName(signonsFileName);
  if (aReplace)
    rv = CopyFile(fileName, fileName);
  else {
    // Get the password manager, which is the destination for the passwords
    // being migrated. Also create a new instance of the legacy password
    // storage component, which we'll use to slurp in the signons from
    // Seamonkey's signons.txt.
    nsCOMPtr<nsILoginManager> pwmgr(
        do_GetService("@mozilla.org/login-manager;1"));
    nsCOMPtr<nsILoginManagerStorage> importer(
        do_CreateInstance("@mozilla.org/login-manager/storage/legacy;1"));

    nsCOMPtr<nsIFile> signonsFile;
    mSourceProfile->Clone(getter_AddRefs(signonsFile));
    signonsFile->Append(fileName);

    importer->InitWithFile(signonsFile, nsnull);

    PRUint32 count;
    nsILoginInfo **logins;

    rv = importer->GetAllLogins(&count, &logins);
    NS_ENSURE_SUCCESS(rv, rv);
    for (PRUint32 i = 0; i < count; i++) {
        pwmgr->AddLogin(logins[i]);
    }
    NS_FREE_XPCOM_ISUPPORTS_POINTER_ARRAY(count, logins);

    PRUnichar **hostnames;
    rv = importer->GetAllDisabledHosts(&count, &hostnames);
    NS_ENSURE_SUCCESS(rv, rv);
    for (PRUint32 i = 0; i < count; i++) {
        pwmgr->SetLoginSavingEnabled(nsDependentString(hostnames[i]),
                                     PR_FALSE);
    }
    NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(count, hostnames);
  }
  return rv;
}
nsresult
nsSeamonkeyProfileMigrator::CopyPasswords(PRBool aReplace)
{
  nsresult rv;

  nsXPIDLCString signonsFileName;
  GetSignonFileName(aReplace, getter_Copies(signonsFileName));

  if (signonsFileName.IsEmpty())
    return NS_ERROR_FILE_NOT_FOUND;

  nsAutoString fileName; fileName.AssignWithConversion(signonsFileName);
  if (aReplace)
    rv = CopyFile(fileName, fileName);
  else {
    nsCOMPtr<nsIFile> seamonkeyPasswordsFile;
    mSourceProfile->Clone(getter_AddRefs(seamonkeyPasswordsFile));
    seamonkeyPasswordsFile->Append(fileName);

    nsCOMPtr<nsIPasswordManagerInternal> pmi(do_GetService("@mozilla.org/passwordmanager;1"));
    rv = pmi->ReadPasswords(seamonkeyPasswordsFile);
  }
  return rv;
}
NS_IMETHODIMP
nsThunderbirdProfileMigrator::GetMigrateData(const PRUnichar* 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_COOKIES,
                             nsISuiteProfileMigrator::COOKIES,
                             false },
                           { FILE_NAME_HISTORY,
                             nsISuiteProfileMigrator::HISTORY,
                             true },
                           { FILE_NAME_DOWNLOADS,
                             nsISuiteProfileMigrator::OTHERDATA,
                             true },
                           { FILE_NAME_MIMETYPES,
                             nsISuiteProfileMigrator::OTHERDATA,
                             true },
                           { FILE_NAME_JUNKTRAINING,
                             nsISuiteProfileMigrator::JUNKTRAINING,
                             true } };
                                                                  
  GetMigrateDataFromArray(data, sizeof(data)/sizeof(MigrationData),
                          aReplace, mSourceProfile, aResult);

  // Now locate passwords
  nsCString signonsFileName;
  GetSignonFileName(aReplace, getter_Copies(signonsFileName));

  if (!signonsFileName.IsEmpty()) {
    nsAutoString fileName;
    fileName.Assign(NS_ConvertUTF8toUTF16(signonsFileName));
    nsCOMPtr<nsIFile> sourcePasswordsFile;
    mSourceProfile->Clone(getter_AddRefs(sourcePasswordsFile));
    sourcePasswordsFile->Append(fileName);
    
    bool exists;
    sourcePasswordsFile->Exists(&exists);
    if (exists)
      *aResult |= nsISuiteProfileMigrator::PASSWORDS;
  }

  return NS_OK;
}
NS_IMETHODIMP
nsSeamonkeyProfileMigrator::GetMigrateData(const PRUnichar* aProfile,
        bool aReplace,
        PRUint16* 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,
            PR_TRUE
        },
        {   FILE_NAME_USER_PREFS,
            nsISuiteProfileMigrator::SETTINGS,
            PR_TRUE
        },
        {   FILE_NAME_COOKIES,
            nsISuiteProfileMigrator::COOKIES,
            PR_FALSE
        },
        {   FILE_NAME_HISTORY,
            nsISuiteProfileMigrator::HISTORY,
            PR_TRUE
        },
        {   FILE_NAME_BOOKMARKS,
            nsISuiteProfileMigrator::BOOKMARKS,
            PR_FALSE
        },
        {   FILE_NAME_DOWNLOADS,
            nsISuiteProfileMigrator::OTHERDATA,
            PR_TRUE
        },
        {   FILE_NAME_MIMETYPES,
            nsISuiteProfileMigrator::OTHERDATA,
            PR_TRUE
        },
        {   FILE_NAME_JUNKTRAINING,
            nsISuiteProfileMigrator::JUNKTRAINING,
            PR_TRUE
        }
    };

    GetMigrateDataFromArray(data, sizeof(data)/sizeof(MigrationData),
                            aReplace, mSourceProfile, aResult);

    // Now locate passwords
    nsCString signonsFileName;
    GetSignonFileName(aReplace, getter_Copies(signonsFileName));

    if (!signonsFileName.IsEmpty()) {
        nsCOMPtr<nsIFile> sourcePasswordsFile;
        mSourceProfile->Clone(getter_AddRefs(sourcePasswordsFile));
        sourcePasswordsFile->AppendNative(signonsFileName);

        bool exists;
        sourcePasswordsFile->Exists(&exists);
        if (exists)
            *aResult |= nsISuiteProfileMigrator::PASSWORDS;
    }

    // Now see if the homepages have anything to migrate.
    if (GetSourceHasHomePageURL())
        *aResult |= nsISuiteProfileMigrator::HOMEPAGEDATA;

    return NS_OK;
}