378 lines
7.3 KiB
Plaintext
378 lines
7.3 KiB
Plaintext
/*
|
|
|
|
NSIS Uninstaller Data
|
|
Copyright 2014 Aleksandr Ivankiv
|
|
|
|
Modified by the Betaflight Team project to let it be used out of the uninstall section
|
|
*/
|
|
|
|
;--------------------------------
|
|
|
|
!ifndef UNINST_INCLUDED
|
|
!define UNINST_INCLUDED
|
|
|
|
!verbose push
|
|
!verbose 3
|
|
|
|
!ifndef UNINST_VERBOSE
|
|
!define UNINST_VERBOSE 3
|
|
!endif
|
|
|
|
!verbose ${UNINST_VERBOSE}
|
|
|
|
;--------------------------------
|
|
;Header files required by Uninstaller Data
|
|
|
|
!include "FileFunc.nsh"
|
|
!include "TextFunc.nsh"
|
|
|
|
;--------------------------------
|
|
;Variables
|
|
|
|
Var List
|
|
Var Log
|
|
Var Tmp
|
|
Var UNINST_DAT
|
|
Var UNINST_EXE
|
|
Var UNINST_DEL_FILE
|
|
|
|
;--------------------------------
|
|
;Default language strings
|
|
|
|
!define UNINST_EXCLUDE_ERROR_DEFAULT "Error creating an exclusion list."
|
|
!define UNINST_DATA_ERROR_DEFAULT "Error creating the uninstaller data: $\r$\nCannot find an exclusion list."
|
|
!define UNINST_DAT_NOT_FOUND_DEFAULT "$UNINST_DAT not found, unable to perform uninstall. Manually delete files."
|
|
!define UNINST_DAT_MISSING_DEFAULT "$UNINST_DAT is missing, some elements could not be removed. These can be removed manually."
|
|
!define UNINST_DEL_FILE_DEFAULT "Delete File"
|
|
|
|
;--------------------------------
|
|
;Language strings macro
|
|
|
|
!macro SETSTRING NAME
|
|
|
|
!ifndef "${NAME}"
|
|
!ifdef UNINST_LOCALIZE
|
|
!define "${NAME}" "$(${NAME})"
|
|
!else
|
|
!define "${NAME}" "${${NAME}_DEFAULT}"
|
|
!endif
|
|
!endif
|
|
|
|
!macroend
|
|
|
|
;--------------------------------
|
|
;Initialization macro
|
|
|
|
!macro UNINST_INIT
|
|
|
|
;Default settings
|
|
!ifndef UninstName
|
|
!define UninstName "Uninstall"
|
|
!endif
|
|
!ifndef UninstHeader
|
|
!define UninstHeader "=========== Uninstaller Data please do not edit this file ==========="
|
|
!endif
|
|
!insertmacro SETSTRING "UNINST_EXCLUDE_ERROR"
|
|
!insertmacro SETSTRING "UNINST_DATA_ERROR"
|
|
!insertmacro SETSTRING "UNINST_DAT_NOT_FOUND"
|
|
!insertmacro SETSTRING "UNINST_DAT_MISSING"
|
|
!insertmacro SETSTRING "UNINST_DEL_FILE"
|
|
StrCpy $UNINST_DEL_FILE "${UNINST_DEL_FILE}"
|
|
StrCpy $UNINST_DAT "$OUTDIR\${UninstName}.dat"
|
|
StrCpy $UNINST_EXE "$OUTDIR\${UninstName}.exe"
|
|
|
|
!macroend
|
|
|
|
;--------------------------------
|
|
;Change name of file
|
|
|
|
!macro UNINST_NAME Name
|
|
|
|
!ifdef UninstName
|
|
!undef UninstName
|
|
!define UninstName "${Name}"
|
|
!else
|
|
!define UninstName "${Name}"
|
|
!endif
|
|
!insertmacro UNINST_INIT
|
|
|
|
!macroend
|
|
|
|
;--------------------------------
|
|
;Create an exclusion list
|
|
|
|
!macro UNINSTALLER_DATA_BEGIN
|
|
|
|
!insertmacro UNINST_EXCLUDE
|
|
|
|
!macroend
|
|
|
|
!macro UNINST_EXCLUDE
|
|
|
|
!verbose push
|
|
!verbose ${UNINST_VERBOSE}
|
|
|
|
!insertmacro UNINST_INIT
|
|
|
|
StrCmp "$PLUGINSDIR" "" 0 +2
|
|
InitPluginsDir
|
|
|
|
GetTempFileName $Tmp $PLUGINSDIR
|
|
|
|
IfErrors 0 UninstExclude
|
|
!ifndef UNINST_ERROR
|
|
!define UNINST_ERROR
|
|
MessageBox MB_OK|MB_ICONEXCLAMATION "${UNINST_EXCLUDE_ERROR}" /SD IDOK
|
|
Goto +3
|
|
!endif
|
|
|
|
UninstExclude:
|
|
FileOpen $List "$Tmp" w
|
|
${Locate} "$OUTDIR" "/L=FD" "${ExcludeList_Func_CallBack}"
|
|
FileClose $List
|
|
|
|
!verbose pop
|
|
|
|
!macroend
|
|
|
|
!macro UNINST_FUNCTION_EXCLUDELIST
|
|
|
|
Function ExcludeList
|
|
|
|
FileWrite $List "$R9$\r$\n"
|
|
Push $0
|
|
|
|
FunctionEnd
|
|
|
|
!macroend
|
|
|
|
!ifndef ExcludeList_Func_CallBack
|
|
!insertmacro UNINST_FUNCTION_EXCLUDELIST
|
|
!define ExcludeList_Func_CallBack "ExcludeList"
|
|
!endif
|
|
|
|
;----------------------------------------------------------------
|
|
;Write Uninstaller Data
|
|
|
|
!macro UNINSTALLER_DATA_END
|
|
|
|
!insertmacro UNINST_DATA
|
|
|
|
!macroend
|
|
|
|
!macro UNINST_DATA
|
|
|
|
!verbose push
|
|
!verbose ${UNINST_VERBOSE}
|
|
|
|
!insertmacro UNINST_INIT
|
|
|
|
IfFileExists "$Tmp" UninstData
|
|
!ifndef UNINST_ERROR
|
|
!define UNINST_ERROR
|
|
${GetFileName} "$UNINST_DAT" $R0
|
|
MessageBox MB_OK|MB_ICONEXCLAMATION "${UNINST_DATA_ERROR}" /SD IDOK
|
|
!endif
|
|
Goto DoneUninstData
|
|
|
|
UninstData:
|
|
FileOpen $Log "$UNINST_DAT" a
|
|
FileOpen $List "$Tmp" r
|
|
|
|
FileRead $Log $1
|
|
IfErrors 0 +2
|
|
FileWrite $Log "${UninstHeader}$\r$\n"
|
|
|
|
${Locate} "$OUTDIR" "/L=FD" "${UninstallData_Func_CallBack}"
|
|
|
|
FileClose $List
|
|
FileClose $Log
|
|
|
|
DoneUninstData:
|
|
StrCpy $Tmp ""
|
|
|
|
!verbose pop
|
|
|
|
!macroend
|
|
|
|
!macro UNINST_FUNCTION_UNINSTDATA
|
|
|
|
Function UninstallData
|
|
|
|
StrCmp $R9 $UNINST_DAT Done
|
|
|
|
FileSeek $List 0 SET
|
|
|
|
LoopReadList:
|
|
FileRead $List $1 ${NSIS_MAX_STRLEN}
|
|
IfErrors DoneReadList
|
|
|
|
${TrimNewLines} $1 $R0
|
|
StrCmp $R0 $R9 Done
|
|
|
|
Goto LoopReadList
|
|
|
|
DoneReadList:
|
|
FileSeek $Log 0 SET
|
|
|
|
LoopReadLog:
|
|
FileRead $Log $1 ${NSIS_MAX_STRLEN}
|
|
IfErrors DoneReadLog
|
|
|
|
${TrimNewLines} $1 $R0
|
|
StrCmp $R0 $R9 Done
|
|
|
|
Goto LoopReadLog
|
|
|
|
DoneReadLog:
|
|
FileSeek $Log 0 END
|
|
FileWrite $Log "$R9$\r$\n"
|
|
|
|
Done:
|
|
Push $0
|
|
|
|
FunctionEnd
|
|
|
|
!macroend
|
|
|
|
!ifndef UninstallData_Func_CallBack
|
|
!insertmacro UNINST_FUNCTION_UNINSTDATA
|
|
!define UninstallData_Func_CallBack "UninstallData"
|
|
!endif
|
|
|
|
;----------------------------------------------------------------
|
|
;Uninstall Files
|
|
|
|
!macro INST_DELETE Path Name
|
|
!insertmacro UNINST_DELETE_MULTIPLE ${Path} ${Name} ""
|
|
!macroend
|
|
|
|
!macro UNINST_DELETE Path Name
|
|
!insertmacro UNINST_DELETE_MULTIPLE ${Path} ${Name} "un."
|
|
!macroend
|
|
|
|
!macro UNINST_DELETE_MULTIPLE Path Name un
|
|
|
|
!verbose push
|
|
!verbose ${UNINST_VERBOSE}
|
|
|
|
!if "${Path}" == ""
|
|
StrCpy $OUTDIR "$INSTDIR"
|
|
!else
|
|
StrCpy $OUTDIR "${Path}"
|
|
!endif
|
|
!if "${Name}" == ""
|
|
!insertmacro UNINST_NAME "Uninstall"
|
|
!else
|
|
!insertmacro UNINST_NAME "${Name}"
|
|
!endif
|
|
|
|
!insertmacro UNINST_INIT
|
|
|
|
IfFileExists "$UNINST_DAT" +3
|
|
!ifdef UNINST_TERMINATE
|
|
MessageBox MB_OK|MB_ICONSTOP "${UNINST_DAT_NOT_FOUND}" /SD IDOK
|
|
Quit
|
|
!else
|
|
MessageBox MB_OK|MB_ICONEXCLAMATION "${UNINST_DAT_MISSING}" /SD IDOK
|
|
StrCpy $0 "error"
|
|
!endif
|
|
|
|
${If} $0 != "error"
|
|
|
|
FileOpen $Log "$UNINST_DAT" r
|
|
Call ${un}DeleteList
|
|
FileClose $Log
|
|
|
|
Delete "$UNINST_DAT"
|
|
|
|
!ifdef UNINST_INTERACTIVE
|
|
${Locate} "$OUTDIR" "/L=F" "${un.InterActive_Func_CallBack}"
|
|
${Locate} "$OUTDIR" "/L=DE" "${un.InterActive_Func_CallBack}"
|
|
!else
|
|
Call ${un}InterActive
|
|
!endif
|
|
|
|
${Else}
|
|
StrCpy $0 ""
|
|
${EndIf}
|
|
|
|
Delete "$UNINST_EXE"
|
|
RMDir $OUTDIR
|
|
ClearErrors
|
|
|
|
!verbose pop
|
|
|
|
!macroend
|
|
|
|
!macro UNINST_FUNCTION_DELETE un
|
|
|
|
Function ${un}DeleteList
|
|
|
|
LoopReadFile:
|
|
FileRead $Log $1 ${NSIS_MAX_STRLEN}
|
|
IfErrors DoneReadFile
|
|
|
|
${TrimNewLines} $1 $R0
|
|
|
|
IfFileExists $R0\*.* +3
|
|
IfFileExists $R0 0 +2
|
|
Delete $R0
|
|
|
|
Goto LoopReadFile
|
|
|
|
DoneReadFile:
|
|
FileSeek $Log 0 SET
|
|
|
|
LoopReadDIR:
|
|
FileRead $Log $1 ${NSIS_MAX_STRLEN}
|
|
IfErrors DoneReadDIR
|
|
|
|
${TrimNewLines} $1 $R0
|
|
|
|
IfFileExists $R0\*.* 0 +3
|
|
RMDir $R0
|
|
ClearErrors
|
|
|
|
Goto LoopReadDIR
|
|
|
|
DoneReadDIR:
|
|
|
|
FunctionEnd
|
|
|
|
!macroend
|
|
|
|
!insertmacro UNINST_FUNCTION_DELETE ""
|
|
!insertmacro UNINST_FUNCTION_DELETE "un."
|
|
|
|
!macro UNINST_FUNCTION_INTERACTIVE un
|
|
|
|
Function ${un}InterActive
|
|
|
|
StrCmp $R9 "" +8
|
|
IfFileExists $R9\*.* 0 +3
|
|
RMDir $R9
|
|
Goto +4
|
|
StrCmp $R9 $UNINST_EXE +3
|
|
MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "$UNINST_DEL_FILE '$R9'?" /SD IDNO IDNO +2
|
|
Delete $R9
|
|
Push $0
|
|
|
|
FunctionEnd
|
|
|
|
!macroend
|
|
|
|
!ifndef un.InterActive_Func_CallBack
|
|
!insertmacro UNINST_FUNCTION_INTERACTIVE "un."
|
|
!define un.InterActive_Func_CallBack "un.InterActive"
|
|
!endif
|
|
|
|
!ifndef InterActive_Func_CallBack
|
|
!insertmacro UNINST_FUNCTION_INTERACTIVE ""
|
|
!define InterActive_Func_CallBack "InterActive"
|
|
!endif
|
|
|
|
!verbose pop
|
|
|
|
!endif
|