diff --git a/mozilla/xpinstall/cleanup/InstallCleanup.cpp b/mozilla/xpinstall/cleanup/InstallCleanup.cpp new file mode 100644 index 00000000000..186cc7f0cd8 --- /dev/null +++ b/mozilla/xpinstall/cleanup/InstallCleanup.cpp @@ -0,0 +1,140 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla Navigator. + * + * The Initial Developer of the Original Code is Netscape Communications + * Corp. Portions created by Netscape Communications Corp. are + * Copyright (C) 1998, 1999, 2000, 2001 Netscape Communications Corp. All + * Rights Reserved. + * + * Contributor(s): + * Don Bragg + */ +#include "InstallCleanup.h" + +int PerformScheduledTasks(HREG reg) +{ + int deleteComplete = DONE; + int replaceComplete = DONE; + + deleteComplete = DeleteScheduledFiles( reg ); + replaceComplete = ReplaceScheduledFiles( reg ); + if ((deleteComplete == DONE) && (replaceComplete == DONE)) + return DONE; + else + return TRY_LATER; +} + + +//---------------------------------------------------------------------------- +// ReplaceScheduledFiles +//---------------------------------------------------------------------------- +int ReplaceScheduledFiles( HREG reg ) +{ + RKEY key; + int rv = DONE; + + /* replace files if any listed */ + if (REGERR_OK == NR_RegGetKey(reg,ROOTKEY_PRIVATE,REG_REPLACE_LIST_KEY,&key)) + { + char keyname[MAXREGNAMELEN]; + char doomedFile[MAXREGPATHLEN]; + char srcFile[MAXREGPATHLEN]; + + uint32 bufsize; + REGENUM state = 0; + while (REGERR_OK == NR_RegEnumSubkeys( reg, key, &state, + keyname, sizeof(keyname), REGENUM_CHILDREN)) + { + bufsize = sizeof(srcFile); + REGERR err1 = NR_RegGetEntry( reg, (RKEY)state, + REG_REPLACE_SRCFILE, &srcFile, &bufsize); + + bufsize = sizeof(doomedFile); + REGERR err2 = NR_RegGetEntry( reg, (RKEY)state, + REG_REPLACE_DESTFILE, &doomedFile, &bufsize); + + if ( err1 == REGERR_OK && err2 == REGERR_OK ) + { + int result = NativeReplaceFile( srcFile, doomedFile ); + if (result == DONE) + { + // This one is done + NR_RegDeleteKey( reg, key, keyname ); + } + } + } + + /* delete list node if empty */ + state = 0; + if (REGERR_NOMORE == NR_RegEnumSubkeys( reg, key, &state, keyname, + sizeof(keyname), REGENUM_CHILDREN )) + { + NR_RegDeleteKey(reg, ROOTKEY_PRIVATE, REG_REPLACE_LIST_KEY); + rv = DONE; + } + else + { + rv = TRY_LATER; + } + } + return rv; +} + +//---------------------------------------------------------------------------- +// DeleteScheduledFiles +//---------------------------------------------------------------------------- +int DeleteScheduledFiles( HREG reg ) +{ + REGERR err; + RKEY key; + REGENUM state = 0; + int rv = DONE; + + /* perform scheduled file deletions */ + if (REGERR_OK == NR_RegGetKey(reg,ROOTKEY_PRIVATE,REG_DELETE_LIST_KEY,&key)) + { + // the delete key exists, so we loop through its children + // and try to delete all the listed files + + char namebuf[MAXREGNAMELEN]; + char valbuf[MAXREGPATHLEN]; + + while (REGERR_OK == NR_RegEnumEntries( reg, key, &state, namebuf, + sizeof(namebuf), 0 ) ) + { + uint32 bufsize = sizeof(valbuf); // gets changed, must reset + err = NR_RegGetEntry( reg, key, namebuf, valbuf, &bufsize ); + if ( err == REGERR_OK ) + { + rv = NativeDeleteFile(valbuf); + if (rv == DONE) + NR_RegDeleteEntry( reg, key, namebuf); + } + } + + /* delete list node if empty */ + state = 0; + err = NR_RegEnumEntries(reg, key, &state, namebuf, sizeof(namebuf), 0); + if ( err == REGERR_NOMORE ) + { + NR_RegDeleteKey(reg, ROOTKEY_PRIVATE, REG_DELETE_LIST_KEY); + rv = DONE; + } + else + { + rv = TRY_LATER; + } + } + return rv; +} + diff --git a/mozilla/xpinstall/cleanup/InstallCleanup.h b/mozilla/xpinstall/cleanup/InstallCleanup.h new file mode 100644 index 00000000000..4bdf61a4354 --- /dev/null +++ b/mozilla/xpinstall/cleanup/InstallCleanup.h @@ -0,0 +1,41 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla Navigator. + * + * The Initial Developer of the Original Code is Netscape Communications + * Corp. Portions created by Netscape Communications Corp. are + * Copyright (C) 1998, 1999, 2000, 2001 Netscape Communications Corp. All + * Rights Reserved. + * + * Contributor(s): + * Don Bragg + */ +#ifndef INSTALL_CLEANUP_H +#define INSTALL_CLEANUP_H + +#include +#include + +#include "prtypes.h" +#include "VerReg.h" + +#define DONE 0 +#define TRY_LATER -1 + +int PerformScheduledTasks(HREG); +int DeleteScheduledFiles(HREG); +int ReplaceScheduledFiles(HREG); +int NativeReplaceFile(const char* replacementFile, const char* doomedFile ); +int NativeDeleteFile(const char* aFileToDelete); + +#endif //INSTALL_CLEANUP_H + diff --git a/mozilla/xpinstall/cleanup/InstallCleanupWin.cpp b/mozilla/xpinstall/cleanup/InstallCleanupWin.cpp new file mode 100644 index 00000000000..5a9a6d9ec19 --- /dev/null +++ b/mozilla/xpinstall/cleanup/InstallCleanupWin.cpp @@ -0,0 +1,125 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla Navigator. + * + * The Initial Developer of the Original Code is Netscape Communications + * Corp. Portions created by Netscape Communications Corp. are + * Copyright (C) 1998, 1999, 2000, 2001 Netscape Communications Corp. All + * Rights Reserved. + * + * Contributor(s): + * Don Bragg + */ + +#include "InstallCleanup.h" +#include + +//---------------------------------------------------------------------------- +// Native Windows file deletion function +//---------------------------------------------------------------------------- +int NativeDeleteFile(const char* aFileToDelete) +{ + if (GetFileAttributes(aFileToDelete) == 0xFFFFFFFF) + { + return DONE;// No file to delete, do nothing. + } + else + { + if(!DeleteFile(aFileToDelete)) + return TRY_LATER; + } + return DONE; +} + +//---------------------------------------------------------------------------- +// Native Windows file replacement function +//---------------------------------------------------------------------------- +int NativeReplaceFile(const char* replacementFile, const char* doomedFile ) +{ + // replacement file must exist, doomed file doesn't have to + if (GetFileAttributes(replacementFile) == 0xFFFFFFFF) + return DONE; + + // don't have to do anything if the files are the same + if (CompareString(LOCALE_SYSTEM_DEFAULT, + NORM_IGNORECASE | SORT_STRINGSORT, + replacementFile, -1, + doomedFile, -1) == CSTR_EQUAL) + return DONE; + + if (!DeleteFile(doomedFile)) + { + if (GetFileAttributes(doomedFile) != 0xFFFFFFFF) // file exists + return TRY_LATER; + } + + // doomedFile is gone move new file into place + if (!MoveFile(replacementFile, doomedFile)) + return TRY_LATER; // this shouldn't happen + + return DONE; +} + + +int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR args, int) +{ + HREG reg; + HKEY hkRunOnceHandle; + DWORD dwDisp; + + int status = DONE; + + if ( REGERR_OK == NR_StartupRegistry()) + { + if ( REGERR_OK == NR_RegOpen("", ®) ) + { + LPTSTR cwd = new char[_MAX_PATH]; + if (cwd) + { + GetCurrentDirectory(_MAX_PATH, cwd); + strcat(cwd, "\\xpicleanup.exe"); + + RegCreateKeyEx(HKEY_CURRENT_USER, + "Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_WRITE, + NULL, + &hkRunOnceHandle, + &dwDisp); + + LPCTSTR cleanupKeyName = "mozilla_cleanup"; + + RegSetValueEx(hkRunOnceHandle, + cleanupKeyName, + 0, + REG_SZ, + (const unsigned char*)cwd, + strlen(cwd)); + + do + { + status = PerformScheduledTasks(reg); + if (status != DONE) + Sleep(15000); // Sleep for 15 seconds + } while (status == TRY_LATER); + + RegDeleteValue(hkRunOnceHandle, cleanupKeyName); + delete[] cwd; + } + } + NR_ShutdownRegistry(); + } + return(0); +} + diff --git a/mozilla/xpinstall/cleanup/makefile.win b/mozilla/xpinstall/cleanup/makefile.win new file mode 100644 index 00000000000..2cde3fc7049 --- /dev/null +++ b/mozilla/xpinstall/cleanup/makefile.win @@ -0,0 +1,71 @@ +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is Mozilla Navigator. +# +# The Initial Developer of the Original Code is Netscape Communications +# Corp. Portions created by Netscape Communications Corp. are +# Copyright (C) 1998, 1999, 2000, 2001 Netscape Communications Corp. All +# Rights Reserved. +# +# Contributor(s): +# Don Bragg # + +DEPTH=..\.. + +DEFINES=-DWIN32_LEAN_AND_MEAN + +MAKE_OBJ_TYPE = EXE +USE_NON_MT_LIBS = 1 + +MODULE = xpicleanup +PROGRAM = .\$(OBJDIR)\$(MODULE).exe + +OBJS = \ + .\$(OBJDIR)\InstallCleanup.obj \ + .\$(OBJDIR)\InstallCleanupWin.obj \ + $(NULL) + +#//------------------------------------------------------------------------ +#// +#// Define any local options for the make tools +#// (ie. LCFLAGS, LLFLAGS, LLIBS, LINCS) +#// +#//------------------------------------------------------------------------ + +LCFLAGS = $(LCFLAGS) -DSTANDALONE_REGISTRY -DWIN32_LEAN_AND_MEAN + +MOZ_WINCONSOLE=0 + +LFLAGS= $(LFLAGS) /subsystem:windows + +LLIBS= \ + $(DIST)\lib\nsreg_s.lib \ + $(NULL) + +WIN_LIBS= \ + shell32.lib \ + version.lib \ + $(NULL) + + + +#//------------------------------------------------------------------------ +#// +#// Include the common makefile rules +#// +#//------------------------------------------------------------------------ +include <$(DEPTH)/config/rules.mak> +install:: $(PROGRAM) + $(MAKE_INSTALL) $(PROGRAM) $(DIST)\bin + +clobber_all:: + $(RM) $(DIST)\install\$(MODULE).exe +