NS_IMETHODIMP nsComm4xProfile::GetProfileList(PRUint32 *length, PRUnichar ***profileNames) { // on win/mac/os2, NS4x uses a registry to determine profile locations #if defined(XP_WIN) || defined(XP_MACOSX) || defined(XP_OS2) nsresult rv; nsCOMPtr<nsIFile> regFile; rv = NS_GetSpecialDirectory(OLDREG_DIR, getter_AddRefs(regFile)); NS_ENSURE_SUCCESS(rv, rv); regFile->AppendNative(NS_LITERAL_CSTRING(OLDREG_NAME)); nsCAutoString path; rv = regFile->GetNativePath(path); NS_ENSURE_SUCCESS(rv, rv); if (NR_StartupRegistry()) return NS_ERROR_FAILURE; HREG reg = nsnull; if (NR_RegOpen(path.get(), ®)) { NR_ShutdownRegistry(); return NS_ERROR_FAILURE; } PRInt32 numProfileEntries = 0; REGENUM enumstate = 0; PRInt32 localLength = 0; char profileName[MAXREGNAMELEN]; while (!NR_RegEnumSubkeys(reg, ROOTKEY_USERS, &enumstate, profileName, MAXREGNAMELEN, REGENUM_CHILDREN)) numProfileEntries++; // reset our enumerator enumstate = 0; PRUnichar **outArray, **next; next = outArray = (PRUnichar **)nsMemory::Alloc(numProfileEntries * sizeof(PRUnichar *)); if (!outArray) return NS_ERROR_OUT_OF_MEMORY; while (!NR_RegEnumSubkeys(reg, ROOTKEY_USERS, &enumstate, profileName, MAXREGNAMELEN, REGENUM_CHILDREN)) { *next = ToNewUnicode(NS_ConvertUTF8toUTF16(profileName)); next++; localLength++; } *profileNames = outArray; *length = localLength; return NS_OK; #else return NS_ERROR_FAILURE; #endif }
VR_INTERFACE(REGERR) VR_Enum(char *component_path, REGENUM *state, char *buffer, uint32 buflen) { REGERR err; RKEY rootkey; RKEY key; err = vr_Init(); if (err != REGERR_OK) return err; if ( component_path == NULL ) rootkey = ROOTKEY_VERSIONS; else rootkey = PATH_ROOT(component_path); err = NR_RegGetKey( vreg, rootkey, component_path, &key ); if (err != REGERR_OK) return err; err = NR_RegEnumSubkeys( vreg, key, state, buffer, buflen, REGENUM_DEPTH_FIRST); return err; } /* Enum */
NS_IMETHODIMP nsDogbertProfileMigrator::GetSourceProfiles(nsISupportsArray** aResult) { if (!mProfiles) { nsresult rv; mProfiles = do_CreateInstance(NS_SUPPORTSARRAY_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIFile> regFile; rv = NS_GetSpecialDirectory(OLDREG_DIR, getter_AddRefs(regFile)); NS_ENSURE_SUCCESS(rv, rv); regFile->AppendNative(NS_LITERAL_CSTRING(OLDREG_NAME)); nsCAutoString path; rv = regFile->GetNativePath(path); NS_ENSURE_SUCCESS(rv, rv); if (NR_StartupRegistry()) return NS_ERROR_FAILURE; HREG reg = nsnull; REGENUM enumstate = 0; if (NR_RegOpen(path.get(), ®)) { NR_ShutdownRegistry(); return NS_ERROR_FAILURE; } char profileName[MAXREGNAMELEN]; while (!NR_RegEnumSubkeys(reg, ROOTKEY_USERS, &enumstate, profileName, MAXREGNAMELEN, REGENUM_CHILDREN)) { nsCOMPtr<nsISupportsString> nameString (do_CreateInstance("@mozilla.org/supports-string;1")); if (nameString) { nameString->SetData(NS_ConvertUTF8toUTF16(profileName)); mProfiles->AppendElement(nameString); } } } NS_IF_ADDREF(*aResult = mProfiles); return NS_OK; }
PRBool nsProfileMigrator::ImportRegistryProfiles(const nsACString& aAppName) { nsresult rv; nsCOMPtr<nsIToolkitProfileService> profileSvc (do_GetService(NS_PROFILESERVICE_CONTRACTID)); NS_ENSURE_TRUE(profileSvc, NS_ERROR_FAILURE); nsCOMPtr<nsIProperties> dirService (do_GetService("@mozilla.org/file/directory_service;1")); NS_ENSURE_TRUE(dirService, NS_ERROR_FAILURE); nsCOMPtr<nsILocalFile> regFile; #ifdef XP_WIN rv = dirService->Get(NS_WIN_APPDATA_DIR, NS_GET_IID(nsILocalFile), getter_AddRefs(regFile)); NS_ENSURE_SUCCESS(rv, PR_FALSE); regFile->AppendNative(aAppName); regFile->AppendNative(NS_LITERAL_CSTRING("registry.dat")); #elif defined(XP_MACOSX) rv = dirService->Get(NS_MAC_USER_LIB_DIR, NS_GET_IID(nsILocalFile), getter_AddRefs(regFile)); NS_ENSURE_SUCCESS(rv, PR_FALSE); regFile->AppendNative(aAppName); regFile->AppendNative(NS_LITERAL_CSTRING("Application Registry")); #elif defined(XP_OS2) rv = dirService->Get(NS_OS2_HOME_DIR, NS_GET_IID(nsILocalFile), getter_AddRefs(regFile)); NS_ENSURE_SUCCESS(rv, PR_FALSE); regFile->AppendNative(aAppName); regFile->AppendNative(NS_LITERAL_CSTRING("registry.dat")); #elif defined(XP_BEOS) rv = dirService->Get(NS_BEOS_SETTINGS_DIR, NS_GET_IID(nsILocalFile), getter_AddRefs(regFile)); NS_ENSURE_SUCCESS(rv, PR_FALSE); regFile->AppendNative(aAppName); regFile->AppendNative(NS_LITERAL_CSTRING("appreg")); #else rv = dirService->Get(NS_UNIX_HOME_DIR, NS_GET_IID(nsILocalFile), getter_AddRefs(regFile)); NS_ENSURE_SUCCESS(rv, PR_FALSE); nsCAutoString dotAppName; ToLowerCase(aAppName, dotAppName); dotAppName.Insert('.', 0); regFile->AppendNative(dotAppName); regFile->AppendNative(NS_LITERAL_CSTRING("appreg")); #endif nsCAutoString path; rv = regFile->GetNativePath(path); NS_ENSURE_SUCCESS(rv, PR_FALSE); if (NR_StartupRegistry()) return PR_FALSE; PRBool migrated = PR_FALSE; HREG reg = nsnull; RKEY profiles = 0; REGENUM enumstate = 0; char profileName[MAXREGNAMELEN]; if (NR_RegOpen(path.get(), ®)) goto cleanup; if (NR_RegGetKey(reg, ROOTKEY_COMMON, "Profiles", &profiles)) goto cleanup; while (!NR_RegEnumSubkeys(reg, profiles, &enumstate, profileName, MAXREGNAMELEN, REGENUM_CHILDREN)) { #ifdef DEBUG_bsmedberg printf("Found profile %s.\n", profileName); #endif RKEY profile = 0; if (NR_RegGetKey(reg, profiles, profileName, &profile)) { NS_ERROR("Could not get the key that was enumerated."); continue; } char profilePath[MAXPATHLEN]; if (NR_RegGetEntryString(reg, profile, "directory", profilePath, MAXPATHLEN)) continue; nsCOMPtr<nsILocalFile> profileFile (do_CreateInstance("@mozilla.org/file/local;1")); if (!profileFile) continue; #if defined (XP_MACOSX) rv = profileFile->SetPersistentDescriptor(nsDependentCString(profilePath)); #else NS_ConvertUTF8toUTF16 widePath(profilePath); rv = profileFile->InitWithPath(widePath); #endif if (NS_FAILED(rv)) continue; nsCOMPtr<nsIToolkitProfile> tprofile; profileSvc->CreateProfile(profileFile, nsnull, nsDependentCString(profileName), getter_AddRefs(tprofile)); migrated = PR_TRUE; } cleanup: if (reg) NR_RegClose(reg); NR_ShutdownRegistry(); return migrated; }
/* set Current to the installation string */ static REGERR vr_SetCurrentNav( char *installation, char *programPath, char *versionStr) { REGERR err; REGENUM state; RKEY navKey; int bFound; int nCopy; char regname[MAXREGNAMELEN]; char dirbuf[MAXREGNAMELEN]; XP_ASSERT( installation ); /* required */ XP_ASSERT( programPath ); /* required */ if ( !installation || !programPath ) return REGERR_PARAM; err = NR_RegAddKey( vreg, ROOTKEY_VERSIONS, NAVIGATOR_NODE, &navKey ); if (err != REGERR_OK) goto done; /* ...look for "Current Version" entry */ err = NR_RegGetEntryString( vreg, navKey, CURRENT_VER, gCurstr, sizeof(gCurstr)); if ( err == REGERR_NOFIND ) { /* No current installation, we can simply add a new one */ err = NR_RegAddKey( vreg, navKey, installation, &curver ); /* ... add Path and Version properties */ if ( err == REGERR_OK ) { err = vr_SetPathname( vreg, curver, NAVHOME, programPath ); if ( REGERR_OK == err && versionStr != NULL && *versionStr != '\0') { err = NR_RegSetEntryString( vreg, curver, VERSTR, versionStr ); } } if ( REGERR_OK == err ) { /* successfully added, make it the current version */ err = NR_RegSetEntryString(vreg, navKey, CURRENT_VER, installation); } if (err != REGERR_OK) goto done; } else if ( REGERR_OK == err ) { /* found one: if we're lucky we got the right one */ bFound = FALSE; err = NR_RegGetKey( vreg, navKey, gCurstr, &curver ); if ( REGERR_OK == err ) { err = vr_GetPathname( vreg, curver, NAVHOME, dirbuf, sizeof(dirbuf) ); if ( REGERR_OK == err ) { bFound = vr_CompareDirs(dirbuf, programPath); } else if ( REGERR_NOFIND == err ) { /* assume this is the right one since it's 'Current' */ err = vr_SetPathname( vreg, curver, NAVHOME, programPath ); bFound = TRUE; } } /* Look for an existing installation if not found */ state = 0; while (!bFound && ((err == REGERR_OK) || (err == REGERR_NOFILE)) ) { err = NR_RegEnumSubkeys( vreg, navKey, &state, gCurstr, sizeof(gCurstr), REGENUM_NORMAL ); if (REGERR_OK == err ) { err = vr_GetPathname( vreg, state, NAVHOME, dirbuf, sizeof(dirbuf) ); if (REGERR_OK == err ) { if (vr_CompareDirs( dirbuf, programPath )) { bFound = TRUE; curver = (RKEY)state; } } else if ( err == REGERR_NOFIND ) { /* wasn't a navigator node */ err = REGERR_OK; } } } /* found the right one, make it current */ if (bFound) { err = NR_RegSetEntryString( vreg, navKey, CURRENT_VER, gCurstr ); /* update version (curver already set) */ if ( REGERR_OK == err && versionStr != NULL && *versionStr != '\0' ) { err = NR_RegSetEntryString( vreg, curver, VERSTR, versionStr ); } } /* otherwise if no current installation matches */ else if ( err == REGERR_NOMORE ) { /* look for an empty slot to put new installation */ nCopy = 1; XP_STRCPY( regname, installation ); do { err = NR_RegGetKey( vreg, navKey, regname, &curver ); if (err == REGERR_OK) { nCopy++; sprintf( regname, "%s #%d", installation, nCopy ); } } while (err==REGERR_OK); if (err != REGERR_NOFIND) goto done; /* real error, bail */ /* found an unused name -- add it */ err = NR_RegAddKey( vreg, navKey, regname, &curver ); if ( err != REGERR_OK ) goto done; /* add path and version properties */ err = vr_SetPathname( vreg, curver, NAVHOME, programPath ); if ( REGERR_OK == err && versionStr != NULL && *versionStr != '\0' ) { err = NR_RegSetEntryString( vreg, curver, VERSTR, versionStr ); } if ( REGERR_OK == err ) { /* everything's OK, make it current */ err = NR_RegSetEntryString(vreg,navKey,CURRENT_VER,regname); } } } done: return err; }
VR_INTERFACE(REGERR) VR_EnumUninstall(REGENUM *state, char* userPackageName, int32 len1, char*regPackageName, int32 len2, XP_Bool bSharedList) { REGERR err; RKEY key; RKEY key1; char regbuf[MAXREGPATHLEN+1] = {0}; char temp[MAXREGPATHLEN+1] = {0}; err = vr_Init(); if (err != REGERR_OK) return err; XP_STRCPY( regbuf, REG_UNINSTALL_DIR ); if (bSharedList) { XP_STRCAT( regbuf, SHAREDSTR ); } else { XP_STRCAT( regbuf, gCurstr ); } err = NR_RegGetKey( vreg, ROOTKEY_PRIVATE, regbuf, &key ); if (err != REGERR_OK) return err; *regbuf = '\0'; *userPackageName = '\0'; err = NR_RegEnumSubkeys( vreg, key, state, regbuf, sizeof(regbuf), REGENUM_CHILDREN); if (err == REGERR_OK && !bSharedList ) { if (XP_STRCMP(regbuf, UNINSTALL_NAV_STR) == 0) { /* skip Communicator package, get the next one instead */ err = NR_RegEnumSubkeys( vreg, key, state, regbuf, sizeof(regbuf), REGENUM_CHILDREN); } } if (err != REGERR_OK) return err; err = NR_RegGetKey( vreg, key, regbuf, &key1 ); if (err != REGERR_OK) return err; err = NR_RegGetEntryString( vreg, key1, PACKAGENAMESTR, userPackageName, len1); if (err != REGERR_OK) { *userPackageName = '\0'; return err; } if (len2 <= (int32)XP_STRLEN(regbuf)) { err = REGERR_BUFTOOSMALL; *userPackageName = '\0'; return err; } *regPackageName = '\0'; if (bSharedList) { XP_STRCPY(temp, "/"); XP_STRCAT(temp, regbuf); *regbuf = '\0'; XP_STRCPY(regbuf, temp); } err = vr_unmanglePackageName(regbuf, regPackageName, len2); return err; } /* EnumUninstall */
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; }