;_____________________________ HEADER FILE BEGIN ____________________________ | |
# Advanced Uninstall Log NSIS header | |
# Version 1.0 2007-01-31 | |
# By Red Wine (http://nsis.sf.net/User:Red_Wine) | |
# Usage: See included examples Uninstall_Log_Default_UI.nsi - Uninstall_Log_Modern_UI.nsi | |
!verbose push | |
!verbose 3 | |
!ifndef ADVANCED_UNINSTALL.LOG_NSH | |
!define ADVANCED_UNINSTALL.LOG_NSH | |
!ifndef INSTDIR_REG_ROOT | INSTDIR_REG_KEY | |
!error "You must properly define both INSTDIR_REG_ROOT and INSTDIR_REG_KEY" | |
!endif | |
!ifndef UNINSTALL_LOG | |
!define UNINSTALL_LOG "Uninstall" | |
!endif | |
!ifndef UNINST_LOG_VERBOSE | |
!define UNINST_LOG_VERBOSE "3" | |
!endif | |
!verbose pop | |
!echo "Advanced Uninstall Log NSIS header v1.0 2007-01-31 by Red Wine (http://nsis.sf.net/User:Red_Wine)" | |
!verbose push | |
!verbose ${UNINST_LOG_VERBOSE} | |
!define UNINST_EXE "$INSTDIR\${UNINSTALL_LOG}.exe" | |
!define UNINST_DAT "$INSTDIR\${UNINSTALL_LOG}.dat" | |
!define UNLOG_PART "$PLUGINSDIR\part." | |
!define UNLOG_TEMP "$PLUGINSDIR\unlog.tmp" | |
!define EXCLU_LIST "$PLUGINSDIR\exclude.tmp" | |
!define UNLOG_HEAD "=========== Uninstaller Log please do not edit this file ===========" | |
var unlog_tmp_0 | |
var unlog_tmp_1 | |
var unlog_tmp_2 | |
var unlog_tmp_3 | |
var unlog_error | |
!include FileFunc.nsh | |
!include TextFunc.nsh | |
!insertmacro Locate | |
!insertmacro un.Locate | |
!insertmacro DirState | |
!insertmacro un.DirState | |
!insertmacro FileJoin | |
!insertmacro TrimNewLines | |
!insertmacro un.TrimNewLines | |
;.............................. Uninstaller Macros .............................. | |
!macro UNINSTALL.LOG_BEGIN_UNINSTALL | |
!verbose push | |
!verbose ${UNINST_LOG_VERBOSE} | |
IfFileExists "${UNINST_DAT}" +3 | |
MessageBox MB_ICONSTOP|MB_OK "${UNINST_DAT} not found, unable to perform uninstall." /SD IDOK | |
Quit | |
StrCmp "$PLUGINSDIR" "" 0 +2 | |
InitPluginsDir | |
CopyFiles "${UNINST_DAT}" "${UNLOG_TEMP}" | |
FileOpen $unlog_tmp_2 "${UNLOG_TEMP}" r | |
!verbose pop | |
!macroend | |
!macro UNINSTALL.LOG_END_UNINSTALL | |
!verbose push | |
!verbose ${UNINST_LOG_VERBOSE} | |
FileClose $unlog_tmp_2 | |
DeleteRegValue ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}.dat" | |
DeleteRegValue ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}Directory" | |
!verbose pop | |
!macroend | |
!macro UNINSTALL.LOG_UNINSTALL TargetDir | |
!verbose push | |
!verbose ${UNINST_LOG_VERBOSE} | |
!ifndef INTERACTIVE_UNINSTALL & UNATTENDED_UNINSTALL | |
!error "You must insert either Interactive or Unattended Uninstall neither both, neither none." | |
!endif | |
!ifdef INTERACTIVE_UNINSTALL | |
GetTempFileName $unlog_tmp_5 "$PLUGINSDIR" | |
FileOpen $unlog_tmp_4 "$unlog_tmp_5" a | |
!endif | |
${PerfomUninstall} "${TargetDir}" "${UnLog_Uninstall_CallBackFunc}" | |
!ifdef INTERACTIVE_UNINSTALL | |
FileClose $unlog_tmp_4 | |
!endif | |
!verbose pop | |
!macroend | |
!define PerfomUninstall "!insertmacro PERFORMUNINSTALL" | |
!macro PERFORMUNINSTALL TargetDir UninstCallBackFunc | |
!verbose push | |
!verbose ${UNINST_LOG_VERBOSE} | |
!define ID ${__LINE__} | |
${un.Locate} "${TargetDir}" "/L=F" "${UninstCallBackFunc}" | |
loop_${ID}: | |
StrCpy $unlog_tmp_1 0 | |
${un.Locate} "${TargetDir}" "/L=DE" "${UninstCallBackFunc}" | |
StrCmp $unlog_tmp_1 "0" 0 loop_${ID} | |
${un.DirState} "${TargetDir}" $unlog_tmp_0 | |
StrCmp "$unlog_tmp_0" "0" 0 +2 | |
RmDir "${TargetDir}" | |
IfErrors 0 +2 | |
MessageBox MB_ICONEXCLAMATION|MB_OK "${UNINSTALL_LOG} Log error" /SD IDOK | |
!undef ID | |
!verbose pop | |
!macroend | |
!macro INTERACTIVE_UNINSTALL | |
!verbose push | |
!verbose ${UNINST_LOG_VERBOSE} | |
!ifdef INTERACTIVE_UNINSTALL | |
!error "INTERACTIVE_UNINSTALL is already defined" | |
!endif | |
var unlog_tmp_4 | |
var unlog_tmp_5 | |
!define INTERACTIVE_UNINSTALL | |
!ifdef INTERACTIVE_UNINSTALL & UNATTENDED_UNINSTALL | |
!error "You must insert either Interactive or Unattended Uninstall neither both, neither none." | |
!endif | |
!ifdef UnLog_Uninstall_CallBackFunc | |
!undef UnLog_Uninstall_CallBackFunc | |
!endif | |
!ifndef UnLog_Uninstall_CallBackFunc | |
!insertmacro UNINSTALL.LOG_UNINSTALL_INTERACTIVE | |
!define UnLog_Uninstall_CallBackFunc "un._LocateCallBack_Function_Interactive" | |
!endif | |
!verbose pop | |
!macroend | |
!macro UNATTENDED_UNINSTALL | |
!verbose push | |
!verbose ${UNINST_LOG_VERBOSE} | |
!ifdef UNATTENDED_UNINSTALL | |
!error "UNATTENDED_UNINSTALL is already defined" | |
!endif | |
!define UNATTENDED_UNINSTALL | |
!ifdef INTERACTIVE_UNINSTALL & UNATTENDED_UNINSTALL | |
!error "You must insert either Interactive or Unattended Uninstall neither both, neither none." | |
!endif | |
!ifdef UnLog_Uninstall_CallBackFunc | |
!undef UnLog_Uninstall_CallBackFunc | |
!endif | |
!ifndef UnLog_Uninstall_CallBackFunc | |
!insertmacro UNINSTALL.LOG_UNINSTALL_UNATTENDED | |
!define UnLog_Uninstall_CallBackFunc "un._LocateCallBack_Function_Unattended" | |
!endif | |
!verbose pop | |
!macroend | |
!macro UNINSTALL.LOG_UNINSTALL_UNATTENDED | |
Function un._LocateCallBack_Function_Unattended | |
start: | |
FileRead $unlog_tmp_2 "$unlog_tmp_3" ${NSIS_MAX_STRLEN} | |
${un.TrimNewLines} "$unlog_tmp_3" "$unlog_tmp_3" | |
StrCmp "$unlog_tmp_3" "$R9" islog | |
IfErrors nolog | |
goto start | |
islog: | |
IfFileExists "$R9\*.*" isdir | |
isfile: | |
Delete "$R9" | |
goto end | |
isdir: | |
RmDir "$R9" | |
IntOp $unlog_tmp_1 $unlog_tmp_1 + 1 | |
goto end | |
nolog: | |
ClearErrors | |
StrCmp "$R9" "${UNINST_EXE}" isfile | |
StrCmp "$R9" "${UNINST_DAT}" isfile | |
end: | |
FileSeek $unlog_tmp_2 0 SET | |
Push $unlog_tmp_0 | |
FunctionEnd | |
!macroend | |
!macro UNINSTALL.LOG_UNINSTALL_INTERACTIVE | |
Function un._LocateCallBack_Function_Interactive | |
start: | |
FileRead $unlog_tmp_2 "$unlog_tmp_3" ${NSIS_MAX_STRLEN} | |
${un.TrimNewLines} "$unlog_tmp_3" "$unlog_tmp_3" | |
StrCmp "$unlog_tmp_3" "$R9" islog | |
IfErrors nolog | |
goto start | |
islog: | |
IfFileExists "$R9\*.*" isdir | |
isfile: | |
Delete "$R9" | |
goto end | |
isdir: | |
RmDir "$R9" | |
IntOp $unlog_tmp_1 $unlog_tmp_1 + 1 | |
goto end | |
nolog: | |
ClearErrors | |
FileSeek $unlog_tmp_4 0 SET | |
read: | |
FileRead $unlog_tmp_4 "$unlog_tmp_3" | |
${un.TrimNewLines} "$unlog_tmp_3" "$unlog_tmp_3" | |
StrCmp "$unlog_tmp_3" "$R9" end | |
IfErrors +2 | |
goto read | |
ClearErrors | |
StrCmp "$R9" "${UNINST_EXE}" isfile | |
StrCmp "$R9" "${UNINST_DAT}" isfile | |
IfFileExists "$R9\*.*" msgdir | |
MessageBox MB_ICONQUESTION|MB_YESNO \ | |
'Delete File "$R9"?' /SD IDNO IDYES isfile IDNO nodel | |
msgdir: | |
MessageBox MB_ICONQUESTION|MB_YESNO \ | |
'Delete Directory "$R9"?' /SD IDNO IDYES isdir IDNO nodel | |
nodel: | |
FileSeek $unlog_tmp_4 0 END | |
FileWrite $unlog_tmp_4 "$R9$\r$\n" | |
end: | |
FileSeek $unlog_tmp_2 0 SET | |
Push $unlog_tmp_0 | |
FunctionEnd | |
!macroend | |
;................................. Installer Macros ................................. | |
!macro UNINSTALL.LOG_INSTALL_UNATTENDED | |
Function _LocateCallBack_Function_Install | |
loop: | |
FileRead $unlog_tmp_2 "$unlog_tmp_3" ${NSIS_MAX_STRLEN} | |
${TrimNewLines} "$unlog_tmp_3" "$unlog_tmp_3" | |
IfErrors 0 +4 | |
ClearErrors | |
FileSeek $unlog_tmp_2 0 SET | |
goto next | |
StrCmp "$R9" "$unlog_tmp_3" end | |
goto loop | |
next: | |
FileWrite $unlog_tmp_1 "$R9$\r$\n" | |
end: | |
Push $unlog_tmp_0 | |
FunctionEnd | |
!macroend | |
!ifdef UnLog_Install_Func_CallBack | |
!undef UnLog_Install_Func_CallBack | |
!endif | |
!ifndef UnLog_Install_Func_CallBack | |
!insertmacro UNINSTALL.LOG_INSTALL_UNATTENDED | |
!define UnLog_Install_Func_CallBack "_LocateCallBack_Function_Install" | |
!endif | |
!macro UNINSTALL.LOG_PREPARE_INSTALL | |
!verbose push | |
!verbose ${UNINST_LOG_VERBOSE} | |
Push $0 | |
Push $1 | |
ClearErrors | |
ReadRegStr "$0" ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}Directory" | |
IfErrors next | |
${DirState} "$0" $1 | |
StrCmp "$1" "-1" next | |
StrCmp "$1" "0" next | |
IfFileExists "$0\${UNINSTALL_LOG}.dat" next | |
MessageBox MB_ICONEXCLAMATION|MB_OK \ | |
"Previous installation detected at $0.$\n\ | |
Required file ${UNINSTALL_LOG}.dat is missing.$\n$\nIt is highly recommended \ | |
to select an empty directory and perform a fresh installation." /SD IDOK | |
StrCpy $unlog_error "error" | |
next: | |
ClearErrors | |
StrCmp "$PLUGINSDIR" "" 0 +2 | |
InitPluginsDir | |
GetTempFileName "$1" | |
FileOpen $0 "$1" w | |
FileWrite $0 "${UNLOG_HEAD}$\r$\n" | |
FileClose $0 | |
Rename "$1" "${UNLOG_TEMP}" | |
Pop $1 | |
Pop $0 | |
!verbose pop | |
!macroend | |
!macro UNINSTALL.LOG_UPDATE_INSTALL | |
!verbose push | |
!verbose ${UNINST_LOG_VERBOSE} | |
Delete "${UNINST_DAT}" | |
Rename "${UNLOG_TEMP}" "${UNINST_DAT}" | |
WriteUninstaller "${UNINST_EXE}" | |
WriteRegStr ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}.dat" "${UNINST_DAT}" | |
WriteRegStr ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}Directory" "$INSTDIR" | |
!verbose pop | |
!macroend | |
!define uninstall.log_install "!insertmacro UNINSTALL.LOG_INSTALL" | |
!macro UNINSTALL.LOG_INSTALL FileOpenWrite FileOpenRead TargetDir | |
!verbose push | |
!verbose ${UNINST_LOG_VERBOSE} | |
FileOpen $unlog_tmp_1 "${FileOpenWrite}" w | |
FileOpen $unlog_tmp_2 "${FileOpenRead}" r | |
${Locate} "${TargetDir}" "/L=FD" "${UnLog_Install_Func_CallBack}" | |
StrCmp $unlog_error "error" 0 +2 | |
ClearErrors | |
IfErrors 0 +2 | |
MessageBox MB_ICONEXCLAMATION|MB_OK "Error creating ${UNINSTALL_LOG} Log." /SD IDOK | |
FileClose $unlog_tmp_1 | |
FileClose $unlog_tmp_2 | |
!verbose pop | |
!macroend | |
!define uninstall.log_mergeID "!insertmacro UNINSTALL.LOG_MERGE" | |
!macro UNINSTALL.LOG_MERGE UnlogPart | |
!verbose push | |
!verbose ${UNINST_LOG_VERBOSE} | |
${FileJoin} "${UNLOG_TEMP}" "${UnlogPart}" "${UNLOG_TEMP}" | |
!verbose pop | |
!macroend | |
!macro UNINSTALL.LOG_OPEN_INSTALL | |
!verbose push | |
!verbose ${UNINST_LOG_VERBOSE} | |
StrCmp $unlog_error "error" +2 | |
${uninstall.log_install} "${EXCLU_LIST}" "${UNINST_DAT}" "$OUTDIR" | |
!verbose pop | |
!macroend | |
!macro UNINSTALL.LOG_CLOSE_INSTALL | |
!verbose push | |
!verbose ${UNINST_LOG_VERBOSE} | |
!define ID ${__LINE__} | |
${uninstall.log_install} "${UNLOG_PART}${ID}" "${EXCLU_LIST}" "$OUTDIR" | |
${uninstall.log_mergeID} "${UNLOG_PART}${ID}" | |
!undef ID ${__LINE__} | |
!verbose pop | |
!macroend | |
!endif | |
!verbose pop | |
;_____________________________ HEADER FILE END ____________________________ | |