Added VR_DeleteMissingFileNodes which will scan the Version Registry searching

for missing files and directory.  When they are found, they will be delete.

Also move some of the uninstall code that was in /modules/smartupdt java/C++
code in.

Lastly added some error checking to some of the parameters that where passed in.


git-svn-id: svn://10.0.0.236/branches/MozillaSourceClassic_19981026_BRANCH@15987 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
dougt%netscape.com
1998-12-08 19:59:32 +00:00
parent 8f351e6fee
commit 4ea1a94090
3 changed files with 188 additions and 38 deletions

View File

@@ -32,6 +32,7 @@ typedef struct _version
int32 check;
} VERSION;
#define MAXREGVERLEN 32 /* Version=12345.12345.12345.12345 */
/* CreateRegistry flags */
#define CR_NEWREGISTRY 1
@@ -74,6 +75,8 @@ VR_INTERFACE(REGERR) VR_EnumUninstall(REGENUM *state, char* userPackageName,
int32 len1, char*regPackageName, int32 len2, Bool bSharedList);
VR_INTERFACE(REGERR) VR_GetUninstallUserName(char *regPackageName, char *outbuf, uint32 buflen);
VR_INTERFACE(REGERR) VR_DeleteMissingFileNodes( void );
XP_END_PROTOS
#endif /* _VERREG_H_ */

View File

@@ -52,7 +52,6 @@
/* -------- local defines ---------------
*/
#define MAXREGVERLEN 32 /* Version=12345.12345.12345.12345 */
#define VERSTR "Version"
#define CHKSTR "Check"
@@ -120,8 +119,8 @@ static REGERR vr_GetPathname(HREG reg, RKEY key, char *entry, char *buf, uint32
static REGERR vr_FindKey(char *name, HREG *hreg, RKEY *key);
static REGERR vr_GetUninstallItemPath(char *regPackageName, char *regbuf, uint32 regbuflen);
static REGERR vr_convertPackageName(char *regPackageName, char *convertedPackageName, uint32 convertedDataLength);
static REGERR vr_unmanglePackageName(char *mangledPackageName, char *regPackageName, uint32 regPackageLength);
static REGERR vr_EncodePackageName(char *regPackageName, char *convertedPackageName, uint32 convertedDataLength);
static REGERR vr_DecodePackageName(char *mangledPackageName, char *regPackageName, uint32 regPackageLength);
#ifdef XP_MAC
static void vr_MacAliasFromPath(const char * fileName, void ** alias, int32 * length);
@@ -532,7 +531,7 @@ static REGERR vr_SetCurrentNav( char *installation, char *programPath, char *ver
bFound = TRUE;
}
}
err = 0; /* ??? */
/* Look for an existing installation if not found */
state = 0;
while (!bFound && ((err == REGERR_OK) || (err == REGERR_NOFILE)) ) {
@@ -631,6 +630,8 @@ static REGERR vr_FindKey(char *component_path, HREG *hreg, RKEY *key)
/* ---------------------------------------------------------------------
* Interface
* ---------------------------------------------------------------------
@@ -650,6 +651,10 @@ VR_INTERFACE(REGERR) VR_PackRegistry(void *userData, nr_RegPackCallbackFunc fn)
if (err != REGERR_OK)
return err;
err = VR_DeleteMissingFileNodes();
if (err != REGERR_OK)
return err;
err = NR_RegPack( vreg, userData, fn );
return err;
@@ -803,6 +808,11 @@ VR_INTERFACE(REGERR) VR_GetPath(char *component_path, uint32 sizebuf, char *buf)
RKEY key;
HREG hreg;
if ( component_path == NULL )
{
return REGERR_PARAM;
}
err = vr_Init();
if (err != REGERR_OK)
return err;
@@ -883,7 +893,7 @@ VR_INTERFACE(REGERR) VR_Install(char *component_path, char *filepath, char *vers
REGERR err;
RKEY rootKey;
RKEY key;
/* Initialize the registry in case this is first call */
err = vr_Init();
if (err != REGERR_OK)
@@ -933,6 +943,11 @@ VR_INTERFACE(REGERR) VR_Remove(char *component_path)
REGERR err;
RKEY rootkey;
if ( component_path == NULL )
{
return REGERR_PARAM;
}
err = vr_Init();
if (err != REGERR_OK)
return err;
@@ -955,13 +970,13 @@ VR_INTERFACE(REGERR) VR_Enum(char *component_path, REGENUM *state,
return err;
if ( component_path == NULL )
rootkey = ROOTKEY_VERSIONS;
else
key = ROOTKEY_VERSIONS;
else {
rootkey = PATH_ROOT(component_path);
err = NR_RegGetKey( vreg, rootkey, component_path, &key );
if (err != REGERR_OK)
return err;
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);
@@ -975,6 +990,11 @@ VR_INTERFACE(REGERR) VR_InRegistry(char *component_path)
RKEY rootkey;
RKEY key;
HREG hreg;
if ( component_path == NULL )
{
return REGERR_PARAM;
}
err = vr_Init();
if (err != REGERR_OK)
@@ -1124,6 +1144,11 @@ VR_INTERFACE(REGERR) VR_GetRefCount(char *component_path, int *result)
char buf[MAXREGNAMELEN];
*result = -1;
if ( component_path == NULL )
{
return REGERR_PARAM;
}
err = vr_Init();
if (err != REGERR_OK)
@@ -1224,7 +1249,7 @@ static REGERR vr_GetUninstallItemPath(char *regPackageName, char *regbuf, uint32
* Replaces all '/' with '_',in the given string.If an '_' already exists in the
* given string, it is escaped by adding another '_' to it.
*/
static REGERR vr_convertPackageName(char *regPackageName, char *convertedPackageName, uint32 convertedDataLength)
static REGERR vr_EncodePackageName(char *regPackageName, char *convertedPackageName, uint32 convertedDataLength)
{
int32 length = 0;
int i;
@@ -1284,7 +1309,7 @@ static REGERR vr_convertPackageName(char *regPackageName, char *convertedPackage
return REGERR_OK;
}
static REGERR vr_unmanglePackageName(char *mangledPackageName, char *regPackageName, uint32 regPackageLength)
static REGERR vr_DecodePackageName(char *mangledPackageName, char *regPackageName, uint32 regPackageLength)
{
int32 length = 0;
int i = 0;
@@ -1337,24 +1362,39 @@ VR_INTERFACE(REGERR) VR_UninstallCreateNode(char *regPackageName, char *userPack
RKEY key;
char *regbuf;
uint32 regbuflen = 0;
char *convertedName = NULL;
uint32 convertedDataLength = 0;
err = vr_Init();
if (err != REGERR_OK)
return err;
if ( regPackageName == NULL )
err = REGERR_PARAM;
if ( userPackageName == NULL)
err = REGERR_PARAM;
if ( regPackageName == NULL || userPackageName == NULL)
return REGERR_PARAM;
regbuflen = 256 + XP_STRLEN(regPackageName);
convertedDataLength = 2 * XP_STRLEN(regPackageName) + 1;
convertedName = (char*)XP_ALLOC(convertedDataLength);
if (convertedName == NULL ) {
err = REGERR_MEMORY;
return err;
}
err = vr_EncodePackageName(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 = vr_GetUninstallItemPath(regPackageName, regbuf, regbuflen);
err = vr_GetUninstallItemPath(convertedName, regbuf, regbuflen);
if (err != REGERR_OK)
{
XP_FREEIF(convertedName);
XP_FREE(regbuf);
return err;
}
@@ -1369,6 +1409,8 @@ VR_INTERFACE(REGERR) VR_UninstallCreateNode(char *regPackageName, char *userPack
if (err == REGERR_OK)
err = NR_RegSetEntryString( vreg, key, PACKAGENAMESTR, userPackageName );
XP_FREEIF(convertedName);
return err;
} /* UninstallCreateNode */
@@ -1396,7 +1438,7 @@ VR_INTERFACE(REGERR) VR_GetUninstallUserName(char *regPackageName, char *outbuf,
return err;
}
err = vr_convertPackageName(regPackageName, convertedName, convertedDataLength);
err = vr_EncodePackageName(regPackageName, convertedName, convertedDataLength);
if (err != REGERR_OK) {
XP_FREE(convertedName);
return err;
@@ -1429,22 +1471,36 @@ VR_INTERFACE(REGERR) VR_UninstallAddFileToList(char *regPackageName, char *vrNam
uint32 regbuflen = 0;
uint32 curregbuflen = 0;
uint32 len = 0;
char *convertedName = NULL;
uint32 convertedDataLength = 0;
err = vr_Init();
if (err != REGERR_OK)
return err;
if ( regPackageName == NULL )
if ( regPackageName == NULL || vrName == NULL )
err = REGERR_PARAM;
if ( vrName == NULL )
err = REGERR_PARAM;
regbuflen = 256 + XP_STRLEN(regPackageName);
convertedDataLength = 2 * XP_STRLEN(regPackageName) + 1;
convertedName = (char*)XP_ALLOC(convertedDataLength);
if (convertedName == NULL ) {
err = REGERR_MEMORY;
return err;
}
err = vr_EncodePackageName(regPackageName, convertedName, convertedDataLength);
if (err != REGERR_OK) {
XP_FREEIF(convertedName);
return err;
}
regbuflen = 256 + XP_STRLEN(convertedName);
regbuf = (char*)XP_ALLOC( regbuflen );
if (regbuf != NULL )
{
err = vr_GetUninstallItemPath(regPackageName, regbuf, regbuflen);
err = vr_GetUninstallItemPath(convertedName, regbuf, regbuflen);
if (err == REGERR_OK)
{
curregbuflen = XP_STRLEN(regbuf);
@@ -1458,6 +1514,7 @@ VR_INTERFACE(REGERR) VR_UninstallAddFileToList(char *regPackageName, char *vrNam
err = REGERR_BUFTOOSMALL;
}
XP_FREEIF(regbuf);
}
else
{
@@ -1471,6 +1528,8 @@ VR_INTERFACE(REGERR) VR_UninstallAddFileToList(char *regPackageName, char *vrNam
err = NR_RegSetEntryString( vreg, key, vrName, "");
XP_FREEIF(convertedName);
return err;
} /* UninstallAddFileToList */
@@ -1485,6 +1544,10 @@ VR_INTERFACE(REGERR) VR_UninstallFileExistsInList(char *regPackageName, char *vr
uint32 curregbuflen = 0;
uint32 len = 0;
char *convertedName = NULL;
uint32 convertedDataLength = 0;
err = vr_Init();
if (err != REGERR_OK)
return err;
@@ -1495,11 +1558,24 @@ VR_INTERFACE(REGERR) VR_UninstallFileExistsInList(char *regPackageName, char *vr
if ( vrName == NULL )
err = REGERR_PARAM;
regbuflen = 256 + XP_STRLEN(regPackageName);
convertedDataLength = 2 * XP_STRLEN(regPackageName) + 1;
convertedName = (char*)XP_ALLOC(convertedDataLength);
if (convertedName == NULL ) {
err = REGERR_MEMORY;
return err;
}
err = vr_EncodePackageName(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 = vr_GetUninstallItemPath(regPackageName, regbuf, regbuflen);
err = vr_GetUninstallItemPath(convertedName, regbuf, regbuflen);
if (err == REGERR_OK)
{
curregbuflen = XP_STRLEN(regbuf);
@@ -1526,6 +1602,9 @@ VR_INTERFACE(REGERR) VR_UninstallFileExistsInList(char *regPackageName, char *vr
err = NR_RegGetEntryString( vreg, key, vrName, sharedfilesstr,
sizeof(sharedfilesstr) );
XP_FREEIF(convertedName);
return err;
} /* UninstallFileExistsInList */
@@ -1555,7 +1634,7 @@ VR_INTERFACE(REGERR) VR_UninstallEnumSharedFiles(char *component_path, REGENUM *
err = REGERR_MEMORY;
return err;
}
err = vr_convertPackageName(component_path, converted_component_path, convertedDataLength);
err = vr_EncodePackageName(component_path, converted_component_path, convertedDataLength);
if (err != REGERR_OK)
{
XP_FREEIF(converted_component_path);
@@ -1624,7 +1703,7 @@ VR_INTERFACE(REGERR) VR_UninstallDeleteFileFromList(char *component_path, char *
err = REGERR_MEMORY;
return err;
}
err = vr_convertPackageName(component_path, converted_component_path, convertedDataLength);
err = vr_EncodePackageName(component_path, converted_component_path, convertedDataLength);
if (err != REGERR_OK)
{
XP_FREEIF(converted_component_path);
@@ -1690,7 +1769,7 @@ VR_INTERFACE(REGERR) VR_UninstallDeleteSharedFilesKey(char *component_path)
err = REGERR_MEMORY;
return err;
}
err = vr_convertPackageName(component_path, converted_component_path, convertedDataLength);
err = vr_EncodePackageName(component_path, converted_component_path, convertedDataLength);
if (err != REGERR_OK)
{
XP_FREEIF(converted_component_path);
@@ -1747,7 +1826,7 @@ VR_INTERFACE(REGERR) VR_UninstallDestroy(char *component_path)
err = REGERR_MEMORY;
return err;
}
err = vr_convertPackageName(component_path, converted_component_path, convertedDataLength);
err = vr_EncodePackageName(component_path, converted_component_path, convertedDataLength);
if (err != REGERR_OK)
{
XP_FREEIF(converted_component_path);
@@ -1849,11 +1928,68 @@ VR_INTERFACE(REGERR) VR_EnumUninstall(REGENUM *state, char* userPackageName,
XP_STRCPY(regbuf, temp);
}
err = vr_unmanglePackageName(regbuf, regPackageName, len2);
err = vr_DecodePackageName(regbuf, regPackageName, len2);
return err;
} /* EnumUninstall */
VR_INTERFACE(REGERR) VR_DeleteMissingFileNodes( void )
{
char dirname[MAXREGPATHLEN+1] = {0};
char buffer[MAXREGPATHLEN+1] = {0};
REGENUM state = 0;
int err = REGERR_OK;
RKEY key;
XP_StatStruct st;
err = vr_Init();
if (err != REGERR_OK)
return err;
buffer[0] = '/';
while (err == REGERR_OK)
{
err = VR_Enum(NULL, &state, &buffer[1], MAXREGPATHLEN );
if ( err != REGERR_OK )
break;
err = VR_ValidateComponent(buffer);
if ( err == REGERR_NOFILE )
{
VR_Remove(buffer);
err = REGERR_OK;
}
else if ( err == REGERR_NOPATH )
{
/* This really isn't an err */
/* Check to see if there's a directory entry, and stat that */
err = VR_GetDefaultDirectory(buffer, MAXREGPATHLEN, dirname);
if ( err == REGERR_OK )
{
if ( stat ( dirname, &st ) != 0 )
{
VR_Remove(buffer);
}
}
else if (err == REGERR_NOFIND)
{
/* not a real error */
err = REGERR_OK;
}
}
}
if ( err == REGERR_NOMORE )
err = REGERR_OK;
return err;
}
#ifdef XP_MAC
#pragma export reset
#endif

View File

@@ -51,6 +51,7 @@
#include "reg.h"
#include "NSReg.h"
#include "VerReg.h"
#if defined(XP_UNIX)
#ifndef MAX_PATH
@@ -2166,6 +2167,7 @@ bail:
PR_ExitMonitor(reglist_monitor);
#endif
return status;
} /* NR_RegOpen */
@@ -3266,12 +3268,15 @@ VR_INTERFACE(REGERR) NR_RegEnumSubkeys( HREG hReg, RKEY key, REGENUM *state,
{
/* get last position */
err = nr_ReadDesc( reg, *state, &desc );
if ( REGERR_OK != err && REGERR_DELETED != err )
if ( REGERR_OK != err )
{
/* it is OK for the state node to be deleted
* (the *next* node MUST be "live", though).
* bail out on any other error */
break;
if ( REGERR_DELETED == err )
err = REGERR_OK;
else
break;
}
if ( desc.down != 0 ) {
@@ -3326,12 +3331,15 @@ VR_INTERFACE(REGERR) NR_RegEnumSubkeys( HREG hReg, RKEY key, REGENUM *state,
{
/* get last position */
err = nr_ReadDesc( reg, *state, &desc );
if ( REGERR_OK != err && REGERR_DELETED != err )
if ( REGERR_OK != err )
{
/* it is OK for the state node to be deleted
* (the *next* node MUST be "live", though).
* bail out on any other error */
break;
if ( REGERR_DELETED == err )
err = REGERR_OK;
else
break;
}
if ( desc.left != 0 )
@@ -3511,6 +3519,9 @@ VR_INTERFACE(void) NR_StartupRegistry(void)
/* check to see that we have a valid registry */
if (REGERR_OK == NR_RegOpen("", &reg))
{
/* XXX think about leaving this open the whole time. gecko and the
profile manager open and close the registry many times at start-up,
and each results in a physical file open if we don't */
NR_RegClose(reg);
}
else {