/* assumes registries are open (only use after vr_Init() returns OK). * For UNIX look first in the global, then in the local if not found * -- returns both hreg and key of the named node (if found) */ static REGERR vr_FindKey(char *component_path, HREG *hreg, RKEY *key) { REGERR err = REGERR_NOFIND; RKEY rootkey; #if !defined(STANDALONE_REGISTRY) && defined(XP_UNIX) && !defined(XP_MACOSX) if (unixreg != NULL) { *hreg = unixreg; rootkey = UNIX_ROOT(component_path); if (rootkey) err = NR_RegGetKey( *hreg, rootkey, component_path, key ); else err = REGERR_NOFIND; } if (unixreg == NULL || err == REGERR_NOFIND ) #endif { *hreg = vreg; rootkey = PATH_ROOT(component_path); if (rootkey) err = NR_RegGetKey( *hreg, rootkey, component_path, key ); else err = REGERR_NOFIND; } return err; }
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 */
VR_INTERFACE(REGERR) VR_GetRefCount(char *component_path, int *result) { REGERR err; RKEY rootkey; RKEY key; char buf[MAXREGNAMELEN]; *result = -1; err = vr_Init(); if (err != REGERR_OK) return err; /* "Uninstall" only happens in the writable registry, so no * need to search the shared one on Unix using vr_FindKey() */ rootkey = PATH_ROOT(component_path); err = NR_RegGetKey( vreg, rootkey, component_path, &key ); if (err != REGERR_OK) return err; err = NR_RegGetEntryString( vreg, key, REFCSTR, buf, sizeof(buf) ); if (err != REGERR_OK) return err; *result = atoi( buf ); return REGERR_OK; } /* GetRefCount */
void nsDogbertProfileMigrator::GetSourceProfile(const PRUnichar* aProfile) { nsresult rv; nsCOMPtr<nsIFile> regFile; rv = NS_GetSpecialDirectory(OLDREG_DIR, getter_AddRefs(regFile)); if (NS_FAILED(rv)) return; regFile->AppendNative(NS_LITERAL_CSTRING(OLDREG_NAME)); nsCAutoString path; rv = regFile->GetNativePath(path); if (NS_FAILED(rv)) return; if (NR_StartupRegistry()) return; HREG reg = nsnull; RKEY profile = nsnull; if (NR_RegOpen(path.get(), ®)) goto cleanup; { // on macos, registry entries are UTF8 encoded NS_ConvertUTF16toUTF8 profileName(aProfile); if (NR_RegGetKey(reg, ROOTKEY_USERS, profileName.get(), &profile)) goto cleanup; } char profilePath[MAXPATHLEN]; if (NR_RegGetEntryString(reg, profile, "ProfileLocation", profilePath, MAXPATHLEN)) goto cleanup; mSourceProfile = do_CreateInstance("@mozilla.org/file/local;1"); if (!mSourceProfile) goto cleanup; { // the string is UTF8 encoded, which forces us to do some strange string-do rv = mSourceProfile->InitWithPath(NS_ConvertUTF8toUTF16(profilePath)); } if (NS_FAILED(rv)) mSourceProfile = nsnull; cleanup: if (reg) NR_RegClose(reg); NR_ShutdownRegistry(); }
VR_INTERFACE(REGERR) VR_UninstallFileExistsInList(char *regPackageName, char *vrName) { REGERR err; RKEY key = 0; char *regbuf; char sharedfilesstr[MAXREGNAMELEN]; uint32 regbuflen = 0; uint32 curregbuflen = 0; uint32 len = 0; err = vr_Init(); if (err != REGERR_OK) return err; if ( regPackageName == NULL ) err = REGERR_PARAM; if ( vrName == NULL ) err = REGERR_PARAM; regbuflen = 256 + XP_STRLEN(regPackageName); regbuf = (char*)XP_ALLOC( regbuflen ); if (regbuf != NULL ) { err = vr_GetUninstallItemPath(regPackageName, regbuf, regbuflen); if (err == REGERR_OK) { curregbuflen = XP_STRLEN(regbuf); len = XP_STRLEN(SHAREDFILESSTR); if (len < (regbuflen - curregbuflen)) { XP_STRCAT(regbuf, SHAREDFILESSTR); err = NR_RegGetKey( vreg, ROOTKEY_PRIVATE, regbuf, &key ); } else err = REGERR_BUFTOOSMALL; } XP_FREEIF(regbuf); } else { err = REGERR_MEMORY; } if (err == REGERR_OK) err = NR_RegGetEntryString( vreg, key, vrName, sharedfilesstr, sizeof(sharedfilesstr) ); return err; } /* UninstallFileExistsInList */
VR_INTERFACE(REGERR) VR_Install(char *component_path, char *filepath, char *version, int bDirectory) { REGERR err; RKEY rootKey; RKEY key; /* Initialize the registry in case this is first call */ err = vr_Init(); if (err != REGERR_OK) return err; /* Use curver if path is relative */ rootKey = PATH_ROOT(component_path); /* Make sure path components (keys) exist by calling Add */ /* (special "" component must always exist, and Add fails) */ if ( component_path != NULL && *component_path == '\0' ) { err = NR_RegGetKey( vreg, rootKey, component_path, &key ); } else { err = NR_RegAddKey( vreg, rootKey, component_path, &key ); } if (err != REGERR_OK) return err; if ( version != NULL && *version != '\0' ) { /* Add "Version" entry with values like "4.0.0.0" */ err = NR_RegSetEntryString( vreg, key, VERSTR, version ); if (err != REGERR_OK) goto abort; } if ( filepath != NULL && *filepath != '\0' ) { /* add "Path" entry */ err = vr_SetPathname( vreg, key, (bDirectory)?DIRSTR:PATHSTR, filepath ); if (err != REGERR_OK) goto abort; } return REGERR_OK; abort: NR_RegDeleteKey( vreg, rootKey, component_path ); return err; } /* Install */
VR_INTERFACE(REGERR) VR_GetUninstallUserName(char *regPackageName, char *outbuf, uint32 buflen) { REGERR err; RKEY key = 0; char *regbuf = NULL; char *convertedName = NULL; uint32 convertedDataLength = 0; uint32 regbuflen = 0; err = vr_Init(); if (err != REGERR_OK) return err; if ( regPackageName == NULL || *regPackageName == '\0' || outbuf == NULL ) return REGERR_PARAM; convertedDataLength = 2 * XP_STRLEN(regPackageName) + 1; convertedName = (char*)XP_ALLOC(convertedDataLength); if (convertedName == NULL ) { err = REGERR_MEMORY; return err; } err = vr_convertPackageName(regPackageName, convertedName, convertedDataLength); if (err != REGERR_OK) { XP_FREE(convertedName); return err; } regbuflen = 256 + XP_STRLEN(convertedName); regbuf = (char*)XP_ALLOC( regbuflen ); if (regbuf == NULL ) { err = REGERR_MEMORY; } else { err = vr_GetUninstallItemPath(convertedName, regbuf, regbuflen); if (err == REGERR_OK) { err = NR_RegGetKey( vreg, ROOTKEY_PRIVATE, regbuf, &key ); } XP_FREE(regbuf); } if (err == REGERR_OK) err = NR_RegGetEntryString( vreg, key, PACKAGENAMESTR, outbuf, buflen ); XP_FREE(convertedName); return err; } /* GetUninstallName */
VR_INTERFACE(REGERR) VR_SetDefaultDirectory(char *component_path, char *directory) { REGERR err; RKEY rootkey; RKEY key; err = vr_Init(); if (err != REGERR_OK) return err; rootkey = PATH_ROOT(component_path); err = NR_RegGetKey( vreg, rootkey, component_path, &key ); if (err != REGERR_OK) return err; err = vr_SetPathname( vreg, key, DIRSTR, directory ); return err; }
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; }
NS_IMETHODIMP nsComm4xProfile::GetMailDir(const PRUnichar *aProfile, PRUnichar **_retval) { NS_ENSURE_ARG_POINTER(_retval); *_retval = nsnull; #if defined(XP_WIN) || defined(XP_OS2) || defined(XP_MACOSX) nsresult rv; nsCOMPtr <nsILocalFile> resolvedLocation = do_CreateInstance("@mozilla.org/file/local;1"); // on macos, registry entries are UTF8 encoded NS_ConvertUTF16toUTF8 profileName(aProfile); nsCOMPtr<nsIFile> regFile; rv = NS_GetSpecialDirectory(OLDREG_DIR, getter_AddRefs(regFile)); if (NS_FAILED(rv)) return rv; regFile->AppendNative(NS_LITERAL_CSTRING(OLDREG_NAME)); nsCAutoString path; rv = regFile->GetNativePath(path); if (NS_FAILED(rv)) return rv; if (NR_StartupRegistry()) return NS_ERROR_FAILURE; HREG reg = nsnull; RKEY profile = nsnull; if (NR_RegOpen(path.get(), ®)) goto cleanup; if (NR_RegGetKey(reg, ROOTKEY_USERS, profileName.get(), &profile)) goto cleanup; char profilePath[MAXPATHLEN]; if (NR_RegGetEntryString(reg, profile, "ProfileLocation", profilePath, MAXPATHLEN)) goto cleanup; resolvedLocation->InitWithPath(NS_ConvertUTF8toUTF16(profilePath)); if (resolvedLocation) { nsCOMPtr <nsIFile> file; rv = resolvedLocation->Clone(getter_AddRefs(file)); if (NS_FAILED(rv)) return rv; nsCOMPtr <nsILocalFile> profileLocation; profileLocation = do_QueryInterface(file); rv = profileLocation->AppendNative(NS_LITERAL_CSTRING(PREF_FILE_NAME_IN_4x)); if (NS_FAILED(rv)) return rv; bool exists = false; rv = profileLocation->Exists(&exists); if (NS_FAILED(rv)) return rv; if (exists) { nsString prefValue; rv = GetPrefValue(profileLocation, PREF_NAME, PREF_END, getter_Copies(prefValue)); if (NS_FAILED(rv)) return rv; if (!prefValue.IsEmpty()) { #ifdef XP_MACOSX rv = profileLocation->SetPersistentDescriptor(NS_ConvertUTF16toUTF8(prefValue)); if (NS_FAILED(rv)) return rv; nsAutoString path; rv = profileLocation->GetPath(path); if (NS_FAILED(rv)) return rv; *_retval = ToNewUnicode(path); #else *_retval = ToNewUnicode(prefValue); #endif } #if defined(XP_WIN) || defined(XP_OS2) || defined(XP_MACOSX) else { nsCOMPtr <nsIFile> mailLocation; rv = resolvedLocation->Clone(getter_AddRefs(mailLocation)); if (NS_FAILED(rv)) return rv; rv = mailLocation->AppendNative(NS_LITERAL_CSTRING("Mail")); if (NS_FAILED(rv)) return rv; nsAutoString path; rv = mailLocation->GetPath(path); if (NS_FAILED(rv)) return rv; *_retval = ToNewUnicode(path); } #endif } } cleanup: if (reg) NR_RegClose(reg); NR_ShutdownRegistry(); return rv; #else return NS_ERROR_FAILURE; #endif }
/* 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 */
static REGERR vr_Init(void) { REGERR err = REGERR_OK; char *regname = vr_findVerRegName(); #if defined(XP_UNIX) && !defined(XP_MACOSX) || defined(STANDALONE_REGISTRY) char curstr[MAXREGNAMELEN]; RKEY navKey; #endif #if defined(XP_UNIX) && !defined(XP_MACOSX) char *regbuf = NULL; #endif #ifndef STANDALONE_REGISTRY if (vr_lock == NULL) return REGERR_FAIL; #endif PR_Lock(vr_lock); if (!isInited) { #if defined(XP_UNIX) && !defined(XP_MACOSX) /* need browser directory to find the correct registry */ if (app_dir != NULL) { regbuf = (char*)XP_ALLOC( 10 + XP_STRLEN(app_dir) ); if (regbuf != NULL ) { XP_STRCPY( regbuf, app_dir ); XP_STRCAT( regbuf, "/registry" ); } else { err = REGERR_MEMORY; } } if ( err != REGERR_OK ) goto done; if (bGlobalRegistry) regname = regbuf; #endif /* Open version registry */ err = NR_RegOpen( regname, &vreg ); #ifndef STANDALONE_REGISTRY if (err == REGERR_OK) { /* find/set the current nav node */ err = vr_SetCurrentNav( VERSION_NAME, app_dir, NULL ); if ( REGERR_OK != err ) { /* couldn't find or set current nav -- big problems! */ NR_RegClose( vreg ); goto done; } } #if defined(XP_UNIX) && !defined(XP_MACOSX) /* try to open shared Unix registry, but not an error if you can't */ unixreg = NULL; if (!bGlobalRegistry && err == REGERR_OK ) { unixver = 0; if (NR_RegOpen( regbuf, &unixreg ) == REGERR_OK) { if (NR_RegGetKey( unixreg, ROOTKEY_VERSIONS, NAVIGATOR_NODE, &navKey) == REGERR_OK) { if (NR_RegGetEntryString( unixreg, navKey, CURRENT_VER, curstr, sizeof(curstr)) == REGERR_OK ) { NR_RegGetKey( unixreg, navKey, curstr, &unixver ); } } } } #endif if (err == REGERR_OK) { /* successfully opened! */ isInited = 1; } goto done; #else if (err != REGERR_OK) goto done; /* Determine 'curver' key and ensure correct structure by adding */ /* ...find top-level "Navigator" node (add if missing) */ 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, curstr, sizeof(curstr) ); if ( err == REGERR_NOFIND ) { /* If not found create one with the built-in version */ err = NR_RegSetEntryString( vreg, navKey, CURRENT_VER, VERSION_NAME ); XP_STRCPY( curstr, VERSION_NAME ); } if ( err != REGERR_OK ) goto done; /* ...look for "curstr" child key of the navigator node */ err = NR_RegAddKey( vreg, navKey, curstr, &curver ); if (err == REGERR_OK) { /* successfully opened! */ isInited = 1; } #endif } done: PR_Unlock(vr_lock); #if defined(XP_UNIX) && !defined(XP_MACOSX) && !defined(STANDALONE_REGISTRY) XP_FREEIF(regbuf); #endif return err; } /* Init */
VR_INTERFACE(REGERR) VR_UninstallDeleteFileFromList(char *component_path, char *vrName) { REGERR err; RKEY key = 0; char *regbuf; char *converted_component_path; uint32 convertedDataLength = 0; uint32 regbuflen = 0; uint32 curregbuflen = 0; uint32 len = 0; err = vr_Init(); if (err != REGERR_OK) return err; if ( component_path == NULL ) err = REGERR_PARAM; if ( vrName == NULL ) err = REGERR_PARAM; convertedDataLength = 2 * XP_STRLEN(component_path) + 1; converted_component_path = (char*)XP_ALLOC(convertedDataLength); if (converted_component_path == NULL ) { err = REGERR_MEMORY; return err; } err = vr_convertPackageName(component_path, converted_component_path, convertedDataLength); if (err != REGERR_OK) { XP_FREEIF(converted_component_path); return err; } regbuflen = 256 + XP_STRLEN(converted_component_path); regbuf = (char*)XP_ALLOC( regbuflen ); if (regbuf != NULL ) { err = vr_GetUninstallItemPath(converted_component_path, regbuf, regbuflen); if (err == REGERR_OK) { curregbuflen = XP_STRLEN(regbuf); len = XP_STRLEN(SHAREDFILESSTR); if (len < (regbuflen - curregbuflen)) { XP_STRCAT(regbuf, SHAREDFILESSTR); err = NR_RegGetKey( vreg, ROOTKEY_PRIVATE, regbuf, &key ); } else err = REGERR_BUFTOOSMALL; } XP_FREE(regbuf); } else { err = REGERR_MEMORY; } XP_FREE(converted_component_path); if (err == REGERR_OK) err = NR_RegDeleteEntry( vreg, key, vrName); return err; } /* UninstallDeleteFileFromList */
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; }