REGERR su_UninstallProcessItem(char *component_path) { int refcount; int err; char filepath[MAXREGPATHLEN]; nsCOMPtr<nsILocalFile> nsLFPath; nsCOMPtr<nsIFile> nsFPath; err = VR_GetPath(component_path, sizeof(filepath), filepath); if ( err == REGERR_OK ) { NS_NewNativeLocalFile(nsDependentCString(filepath), PR_TRUE, getter_AddRefs(nsLFPath)); nsFPath = nsLFPath; err = VR_GetRefCount(component_path, &refcount); if ( err == REGERR_OK ) { --refcount; if (refcount > 0) err = VR_SetRefCount(component_path, refcount); else { err = VR_Remove(component_path); DeleteFileNowOrSchedule(nsFPath); } } else { /* delete node and file */ err = VR_Remove(component_path); DeleteFileNowOrSchedule(nsFPath); } } return err; }
extern "C" NS_EXPORT PRInt32 SU_Uninstall(char *regPackageName) { REGERR status = REGERR_FAIL; char pathbuf[MAXREGPATHLEN+1] = {0}; char sharedfilebuf[MAXREGPATHLEN+1] = {0}; REGENUM state = 0; int32 length; int32 err; if (regPackageName == NULL) return REGERR_PARAM; if (pathbuf == NULL) return REGERR_PARAM; /* Get next path from Registry */ status = VR_Enum( regPackageName, &state, pathbuf, MAXREGPATHLEN ); /* if we got a good path */ while (status == REGERR_OK) { char component_path[2*MAXREGPATHLEN+1] = {0}; strcat(component_path, regPackageName); length = strlen(regPackageName); if (component_path[length - 1] != '/') strcat(component_path, "/"); strcat(component_path, pathbuf); err = su_UninstallProcessItem(component_path); status = VR_Enum( regPackageName, &state, pathbuf, MAXREGPATHLEN ); } err = VR_Remove(regPackageName); // there is a problem here. It looks like if the file is refcounted, we still blow away the reg key // FIX! state = 0; status = VR_UninstallEnumSharedFiles( regPackageName, &state, sharedfilebuf, MAXREGPATHLEN ); while (status == REGERR_OK) { err = su_UninstallProcessItem(sharedfilebuf); err = VR_UninstallDeleteFileFromList(regPackageName, sharedfilebuf); status = VR_UninstallEnumSharedFiles( regPackageName, &state, sharedfilebuf, MAXREGPATHLEN ); } err = VR_UninstallDeleteSharedFilesKey(regPackageName); err = VR_UninstallDestroy(regPackageName); return err; }
void vRemove(char *cmd) { error("VR_Remove", VR_Remove(cmd)); } // vRemove
void interp(void) { char line[256]; char *p; while(1) { putchar('>'); putchar(' '); fflush(stdin); fflush(stdout); fflush(stderr); gets(line); /* p points to next word after verb on command line */ p = line; while (*p && *p!=' ') p++; if (!*p) p = 0; else { while(*p && *p==' ') p++; } switch(toupper(line[0])) { case 'N': vCreate(p); break; case 'A': error("VR_SetRegDirectory", VR_SetRegDirectory(p)); break; case 'C': error("VR_Close", VR_Close()); break; case 'I': vInstall(p); break; case 'R': error("VR_Remove", VR_Remove(p)); break; case 'X': error("VR_InRegistry", VR_InRegistry(p)); break; case 'T': error("VR_ValidateComponent", VR_ValidateComponent(p)); break; #if LATER case 'E': vEnum(p); break; case 'V': vVersion(p); break; case 'P': vPath(p); break; case 'F': vGetRefCount(p); break; case 'D': vGetDir(p); break; case 'S': puts("--Unsupported--"); #endif case 'H': default: vHelp(line); break; case 'Q': return; } /* switch */ } /* while */ assert(0); return; /* shouldn't get here */ } /* interp */