nsresult
nsSeamonkeyProfileMigrator::CopyPreferences(PRBool aReplace)
{
  nsresult rv = NS_OK;
  if (!aReplace)
    return rv;

  rv |= TransformPreferences(FILE_NAME_PREFS, FILE_NAME_PREFS);
  rv |= CopyFile(FILE_NAME_USER_PREFS, FILE_NAME_USER_PREFS);

  // Security Stuff
  rv |= CopyFile(FILE_NAME_CERT8DB, FILE_NAME_CERT8DB);
  rv |= CopyFile(FILE_NAME_KEY3DB, FILE_NAME_KEY3DB);
  rv |= CopyFile(FILE_NAME_SECMODDB, FILE_NAME_SECMODDB);

  // User MIME Type overrides
  rv |= CopyFile(FILE_NAME_MIMETYPES, FILE_NAME_MIMETYPES);

  rv |= CopyUserContentSheet();
  return rv;
}
nsresult
nsOperaProfileMigrator::CopyPreferences(PRBool aReplace)
{
    nsresult rv;

    nsCOMPtr<nsIFile> operaPrefs;
    mOperaProfile->Clone(getter_AddRefs(operaPrefs));
    operaPrefs->Append(OPERA_PREFERENCES_FILE_NAME);

    nsCOMPtr<nsILocalFile> lf(do_QueryInterface(operaPrefs));
    NS_ENSURE_TRUE(lf, NS_ERROR_UNEXPECTED);

    nsINIParser parser;
    rv = parser.Init(lf);
    NS_ENSURE_SUCCESS(rv, rv);

    nsCOMPtr<nsIPrefBranch> branch(do_GetService(NS_PREFSERVICE_CONTRACTID));

    // Traverse the standard transforms
    PrefTransform* transform;
    PrefTransform* end = gTransforms + sizeof(gTransforms)/sizeof(PrefTransform);

    const char* lastSectionName = nsnull;
    for (transform = gTransforms; transform < end; ++transform) {
        if (transform->sectionName)
            lastSectionName = transform->sectionName;

        if (transform->type == _OPM(COLOR)) {
            char* colorString = nsnull;
            nsresult rv = ParseColor(parser, lastSectionName, &colorString);
            if (NS_SUCCEEDED(rv)) {
                transform->stringValue = colorString;

                transform->prefHasValue = PR_TRUE;
                transform->prefSetterFunc(transform, branch);
            }
            if (colorString)
                free(colorString);
        }
        else {
            nsCAutoString val;
            rv = parser.GetString(lastSectionName,
                                  transform->keyName,
                                  val);
            if (NS_SUCCEEDED(rv)) {
                nsresult strerr;
                switch (transform->type) {
                case _OPM(STRING):
                    transform->stringValue = ToNewCString(val);
                    break;
                case _OPM(INT): {
                    transform->intValue = val.ToInteger(&strerr);
                }
                break;
                case _OPM(BOOL): {
                    transform->boolValue = val.ToInteger(&strerr) != 0;
                }
                break;
                default:
                    break;
                }
                transform->prefHasValue = PR_TRUE;
                transform->prefSetterFunc(transform, branch);
                if (transform->type == _OPM(STRING) && transform->stringValue) {
                    NS_Free(transform->stringValue);
                    transform->stringValue = nsnull;
                }
            }
        }
    }

    // Copy Proxy Settings
    CopyProxySettings(parser, branch);

    // Copy User Content Sheet
    if (aReplace)
        CopyUserContentSheet(parser);

    return NS_OK;
}