betaflight-configurator/assets/windows/UnInst.nsh

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