nsresult nsNetscapeProfileMigratorBase::GetProfileDataFromProfilesIni(nsILocalFile* aDataDir, nsIMutableArray* aProfileNames, nsIMutableArray* aProfileLocations) { nsCOMPtr<nsIFile> dataDir; nsresult rv = aDataDir->Clone(getter_AddRefs(dataDir)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsILocalFile> profileIni(do_QueryInterface(dataDir, &rv)); NS_ENSURE_SUCCESS(rv, rv); profileIni->Append(NS_LITERAL_STRING("profiles.ini")); // Does it exist? bool profileFileExists = false; rv = profileIni->Exists(&profileFileExists); NS_ENSURE_SUCCESS(rv, rv); if (!profileFileExists) return NS_ERROR_FILE_NOT_FOUND; nsINIParser parser; rv = parser.Init(profileIni); NS_ENSURE_SUCCESS(rv, rv); nsCAutoString buffer, filePath; bool isRelative; // This is an infinite loop that is broken when we no longer find profiles // for profileID with IsRelative option. for (unsigned int c = 0; true; ++c) { nsCAutoString profileID("Profile"); profileID.AppendInt(c); if (NS_FAILED(parser.GetString(profileID.get(), "IsRelative", buffer))) break; isRelative = buffer.EqualsLiteral("1"); rv = parser.GetString(profileID.get(), "Path", filePath); if (NS_FAILED(rv)) { NS_ERROR("Malformed profiles.ini: Path= not found"); continue; } rv = parser.GetString(profileID.get(), "Name", buffer); if (NS_FAILED(rv)) { NS_ERROR("Malformed profiles.ini: Name= not found"); continue; } nsCOMPtr<nsILocalFile> rootDir; rv = NS_NewNativeLocalFile(EmptyCString(), true, getter_AddRefs(rootDir)); NS_ENSURE_SUCCESS(rv, rv); rv = isRelative ? rootDir->SetRelativeDescriptor(aDataDir, filePath) : rootDir->SetPersistentDescriptor(filePath); if (NS_FAILED(rv)) continue; bool exists = false; rootDir->Exists(&exists); if (exists) { aProfileLocations->AppendElement(rootDir, false); nsCOMPtr<nsISupportsString> profileNameString( do_CreateInstance("@mozilla.org/supports-string;1")); profileNameString->SetData(NS_ConvertUTF8toUTF16(buffer)); aProfileNames->AppendElement(profileNameString, false); } } return NS_OK; }
nsresult nsNetscapeProfileMigratorBase::GetProfileDataFromRegistry(nsILocalFile* aRegistryFile, nsISupportsArray* aProfileNames, nsISupportsArray* aProfileLocations) { nsresult rv; REGERR errCode; // Ensure aRegistryFile exists before open it PRBool regFileExists = PR_FALSE; rv = aRegistryFile->Exists(®FileExists); NS_ENSURE_SUCCESS(rv, rv); if (!regFileExists) return NS_ERROR_FILE_NOT_FOUND; // Open It nsCAutoString regPath; rv = aRegistryFile->GetNativePath(regPath); NS_ENSURE_SUCCESS(rv, rv); if ((errCode = NR_StartupRegistry())) return regerr2nsresult(errCode); HREG reg; if ((errCode = NR_RegOpen(regPath.get(), ®))) { NR_ShutdownRegistry(); return regerr2nsresult(errCode); } RKEY profilesTree; if ((errCode = NR_RegGetKey(reg, ROOTKEY_COMMON, "Profiles", &profilesTree))) { NR_RegClose(reg); NR_ShutdownRegistry(); return regerr2nsresult(errCode); } char profileStr[MAXREGPATHLEN]; REGENUM enumState = nsnull; while (!NR_RegEnumSubkeys(reg, profilesTree, &enumState, profileStr, sizeof(profileStr), REGENUM_CHILDREN)) { RKEY profileKey; if (NR_RegGetKey(reg, profilesTree, profileStr, &profileKey)) continue; // "migrated" is "yes" for all valid Seamonkey profiles. It is only "no" // for 4.x profiles. char migratedStr[3]; errCode = NR_RegGetEntryString(reg, profileKey, (char *)"migrated", migratedStr, sizeof(migratedStr)); if ((errCode != REGERR_OK && errCode != REGERR_BUFTOOSMALL) || strcmp(migratedStr, "no") == 0) continue; // Get the profile location and add it to the locations array REGINFO regInfo; regInfo.size = sizeof(REGINFO); if (NR_RegGetEntryInfo(reg, profileKey, (char *)"directory", ®Info)) continue; nsCAutoString dirStr; dirStr.SetLength(regInfo.entryLength); errCode = NR_RegGetEntryString(reg, profileKey, (char *)"directory", dirStr.BeginWriting(), regInfo.entryLength); // Remove trailing \0 dirStr.SetLength(regInfo.entryLength-1); nsCOMPtr<nsILocalFile> dir; #ifdef XP_MACOSX rv = NS_NewNativeLocalFile(EmptyCString(), PR_TRUE, getter_AddRefs(dir)); if (NS_FAILED(rv)) break; dir->SetPersistentDescriptor(dirStr); #else rv = NS_NewLocalFile(NS_ConvertUTF8toUTF16(dirStr), PR_TRUE, getter_AddRefs(dir)); if (NS_FAILED(rv)) break; #endif PRBool exists; dir->Exists(&exists); if (exists) { aProfileLocations->AppendElement(dir); // Get the profile name and add it to the names array nsString profileName; CopyUTF8toUTF16(nsDependentCString(profileStr), profileName); nsCOMPtr<nsISupportsString> profileNameString( do_CreateInstance("@mozilla.org/supports-string;1")); profileNameString->SetData(profileName); aProfileNames->AppendElement(profileNameString); } } NR_RegClose(reg); NR_ShutdownRegistry(); return rv; }