1057 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			1057 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|  | ; CPack install script designed for a nmake build | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ; You must define these values | ||
|  | 
 | ||
|  |   !define VERSION "@CPACK_PACKAGE_VERSION@" | ||
|  |   !define PATCH  "@CPACK_PACKAGE_VERSION_PATCH@" | ||
|  |   !define INST_DIR "@CPACK_TEMPORARY_DIRECTORY@" | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ;Variables | ||
|  | 
 | ||
|  |   Var MUI_TEMP | ||
|  |   Var STARTMENU_FOLDER | ||
|  |   Var SV_ALLUSERS | ||
|  |   Var START_MENU | ||
|  |   Var RB_DO_NOT_ADD_TO_PATH | ||
|  |   Var DO_NOT_ADD_TO_PATH | ||
|  |   Var RB_ADD_TO_PATH_ALL_USERS | ||
|  |   Var ADD_TO_PATH_ALL_USERS | ||
|  |   Var RB_ADD_TO_PATH_CURRENT_USER | ||
|  |   Var ADD_TO_PATH_CURRENT_USER | ||
|  |   Var CB_INSTALL_DESKTOP | ||
|  |   Var INSTALL_DESKTOP | ||
|  |   Var IS_DEFAULT_INSTALLDIR | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ;Include Modern UI | ||
|  | 
 | ||
|  |   !include "MUI2.nsh" | ||
|  |   !include "nsDialogs.nsh" | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ;Include Logic Lib and add a DirExists command | ||
|  | 
 | ||
|  |   !include "LogicLib.nsh" | ||
|  | ;FileExists is already part of LogicLib, but returns true for directories as well as files | ||
|  |   !macro _FileExists2 _a _b _t _f | ||
|  | 	!insertmacro _LOGICLIB_TEMP | ||
|  | 	StrCpy $_LOGICLIB_TEMP '0' | ||
|  | 	StrCmp `${_b}` `` +4 0 ;if path is not blank, continue to next check | ||
|  | 	IfFileExists `${_b}` `0` +3 ;if path exists, continue to next check (IfFileExists returns true if this is a directory) | ||
|  | 	IfFileExists `${_b}\*.*` +2 0 ;if path is not a directory, continue to confirm exists | ||
|  | 	StrCpy $_LOGICLIB_TEMP '1' ;file exists | ||
|  | 	;now we have a definitive value - the file exists or it does not | ||
|  | 	StrCmp $_LOGICLIB_TEMP '1' `${_t}` `${_f}` | ||
|  |   !macroend | ||
|  |   !undef FileExists | ||
|  |   !define FileExists `'' FileExists2` | ||
|  |   !macro _DirExists _a _b _t _f | ||
|  | 	!insertmacro _LOGICLIB_TEMP | ||
|  | 	StrCpy $_LOGICLIB_TEMP '0'	 | ||
|  | 	StrCmp `${_b}` `` +3 0 ;if path is not blank, continue to next check | ||
|  | 	IfFileExists `${_b}\*.*` 0 +2 ;if directory exists, continue to confirm exists | ||
|  | 	StrCpy $_LOGICLIB_TEMP '1' | ||
|  | 	StrCmp $_LOGICLIB_TEMP '1' `${_t}` `${_f}` | ||
|  |   !macroend | ||
|  |   !define DirExists `'' DirExists` | ||
|  | 
 | ||
|  |   ;Default installation folder | ||
|  |   InstallDir "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ;General | ||
|  | 
 | ||
|  |   ;Name and file | ||
|  |   Name "@CPACK_NSIS_PACKAGE_NAME@" | ||
|  |   OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@" | ||
|  | 
 | ||
|  |   ;Set compression | ||
|  |   SetCompressor @CPACK_NSIS_COMPRESSOR@ | ||
|  | 
 | ||
|  |   ;Require administrator access | ||
|  |   RequestExecutionLevel admin | ||
|  | 
 | ||
|  | @CPACK_NSIS_DEFINES@ | ||
|  | @CPACK_NSIS_EXTRA_DEFINES@ | ||
|  | 
 | ||
|  |   !include Sections.nsh | ||
|  | 
 | ||
|  | ;--- Component support macros: --- | ||
|  | ; The code for the add/remove functionality is from: | ||
|  | ;   http://nsis.sourceforge.net/Add/Remove_Functionality | ||
|  | ; It has been modified slightly and extended to provide | ||
|  | ; inter-component dependencies. | ||
|  | Var AR_SecFlags | ||
|  | Var AR_RegFlags | ||
|  | @CPACK_NSIS_SECTION_SELECTED_VARS@ | ||
|  | 
 | ||
|  | ; Loads the "selected" flag for the section named SecName into the | ||
|  | ; variable VarName. | ||
|  | !macro LoadSectionSelectedIntoVar SecName VarName | ||
|  |  SectionGetFlags ${${SecName}} $${VarName} | ||
|  |  IntOp $${VarName} $${VarName} & ${SF_SELECTED}  ;Turn off all other bits | ||
|  | !macroend | ||
|  | 
 | ||
|  | ; Loads the value of a variable... can we get around this? | ||
|  | !macro LoadVar VarName | ||
|  |   IntOp $R0 0 + $${VarName} | ||
|  | !macroend | ||
|  | 
 | ||
|  | ; Sets the value of a variable | ||
|  | !macro StoreVar VarName IntValue | ||
|  |   IntOp $${VarName} 0 + ${IntValue} | ||
|  | !macroend | ||
|  | 
 | ||
|  | !macro InitSection SecName | ||
|  |   ;  This macro reads component installed flag from the registry and | ||
|  |   ;changes checked state of the section on the components page. | ||
|  |   ;Input: section index constant name specified in Section command. | ||
|  | 
 | ||
|  |   ClearErrors | ||
|  |   ;Reading component status from registry | ||
|  |   ReadRegDWORD $AR_RegFlags HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" "Installed" | ||
|  |   IfErrors "default_${SecName}" | ||
|  |     ;Status will stay default if registry value not found | ||
|  |     ;(component was never installed) | ||
|  |   IntOp $AR_RegFlags $AR_RegFlags & ${SF_SELECTED} ;Turn off all other bits | ||
|  |   SectionGetFlags ${${SecName}} $AR_SecFlags  ;Reading default section flags | ||
|  |   IntOp $AR_SecFlags $AR_SecFlags & 0xFFFE  ;Turn lowest (enabled) bit off | ||
|  |   IntOp $AR_SecFlags $AR_RegFlags | $AR_SecFlags      ;Change lowest bit | ||
|  | 
 | ||
|  |   ; Note whether this component was installed before | ||
|  |   !insertmacro StoreVar ${SecName}_was_installed $AR_RegFlags | ||
|  |   IntOp $R0 $AR_RegFlags & $AR_RegFlags | ||
|  | 
 | ||
|  |   ;Writing modified flags | ||
|  |   SectionSetFlags ${${SecName}} $AR_SecFlags | ||
|  | 
 | ||
|  |  "default_${SecName}:" | ||
|  |  !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected | ||
|  | !macroend | ||
|  | 
 | ||
|  | !macro FinishSection SecName | ||
|  |   ;  This macro reads section flag set by user and removes the section | ||
|  |   ;if it is not selected. | ||
|  |   ;Then it writes component installed flag to registry | ||
|  |   ;Input: section index constant name specified in Section command. | ||
|  | 
 | ||
|  |   SectionGetFlags ${${SecName}} $AR_SecFlags  ;Reading section flags | ||
|  |   ;Checking lowest bit: | ||
|  |   IntOp $AR_SecFlags $AR_SecFlags & ${SF_SELECTED} | ||
|  |   IntCmp $AR_SecFlags 1 "leave_${SecName}" | ||
|  |     ;Section is not selected: | ||
|  |     ;Calling Section uninstall macro and writing zero installed flag | ||
|  |     !insertmacro "Remove_${${SecName}}" | ||
|  |     WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \ | ||
|  |   "Installed" 0 | ||
|  |     Goto "exit_${SecName}" | ||
|  | 
 | ||
|  |  "leave_${SecName}:" | ||
|  |     ;Section is selected: | ||
|  |     WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \ | ||
|  |   "Installed" 1 | ||
|  | 
 | ||
|  |  "exit_${SecName}:" | ||
|  | !macroend | ||
|  | 
 | ||
|  | !macro RemoveSection_CPack SecName | ||
|  |   ;  This macro is used to call section's Remove_... macro | ||
|  |   ;from the uninstaller. | ||
|  |   ;Input: section index constant name specified in Section command. | ||
|  | 
 | ||
|  |   !insertmacro "Remove_${${SecName}}" | ||
|  | !macroend | ||
|  | 
 | ||
|  | ; Determine whether the selection of SecName changed | ||
|  | !macro MaybeSelectionChanged SecName | ||
|  |   !insertmacro LoadVar ${SecName}_selected | ||
|  |   SectionGetFlags ${${SecName}} $R1 | ||
|  |   IntOp $R1 $R1 & ${SF_SELECTED} ;Turn off all other bits | ||
|  | 
 | ||
|  |   ; See if the status has changed: | ||
|  |   IntCmp $R0 $R1 "${SecName}_unchanged" | ||
|  |   !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected | ||
|  | 
 | ||
|  |   IntCmp $R1 ${SF_SELECTED} "${SecName}_was_selected" | ||
|  |   !insertmacro "Deselect_required_by_${SecName}" | ||
|  |   goto "${SecName}_unchanged" | ||
|  | 
 | ||
|  |   "${SecName}_was_selected:" | ||
|  |   !insertmacro "Select_${SecName}_depends" | ||
|  | 
 | ||
|  |   "${SecName}_unchanged:" | ||
|  | !macroend | ||
|  | ;--- End of Add/Remove macros --- | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ;Interface Settings | ||
|  | 
 | ||
|  |   !define MUI_HEADERIMAGE | ||
|  |   !define MUI_ABORTWARNING | ||
|  |   !define MUI_FINISHPAGE_NOAUTOCLOSE | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ; path functions | ||
|  | 
 | ||
|  | !verbose 3 | ||
|  | !include "WinMessages.NSH" | ||
|  | !verbose 4 | ||
|  | 
 | ||
|  | ;---------------------------------------- | ||
|  | ; based upon a script of "Written by KiCHiK 2003-01-18 05:57:02" | ||
|  | ;---------------------------------------- | ||
|  | !verbose 3 | ||
|  | !include "WinMessages.NSH" | ||
|  | !verbose 4 | ||
|  | ;==================================================== | ||
|  | ; get_NT_environment | ||
|  | ;     Returns: the selected environment | ||
|  | ;     Output : head of the stack | ||
|  | ;==================================================== | ||
|  | !macro select_NT_profile UN | ||
|  | Function ${UN}select_NT_profile | ||
|  |    ${If} $ADD_TO_PATH_ALL_USERS = ${BST_CHECKED} | ||
|  |       DetailPrint "Selected environment for all users" | ||
|  |       Push "all" | ||
|  |    ${Else} | ||
|  |       DetailPrint "Selected environment for current user only." | ||
|  |       Push "current" | ||
|  |    ${EndIf} | ||
|  | FunctionEnd | ||
|  | !macroend | ||
|  | !insertmacro select_NT_profile "" | ||
|  | !insertmacro select_NT_profile "un." | ||
|  | ;---------------------------------------------------- | ||
|  | !define NT_current_env 'HKCU "Environment"' | ||
|  | !define NT_all_env     'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' | ||
|  | 
 | ||
|  | !ifndef WriteEnvStr_RegKey | ||
|  |   !ifdef ALL_USERS | ||
|  |     !define WriteEnvStr_RegKey \ | ||
|  |        'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' | ||
|  |   !else | ||
|  |     !define WriteEnvStr_RegKey 'HKCU "Environment"' | ||
|  |   !endif | ||
|  | !endif | ||
|  | 
 | ||
|  | ; AddToPath - Adds the given dir to the search path. | ||
|  | ;        Input - head of the stack | ||
|  | ;        Note - Win9x systems requires reboot | ||
|  | 
 | ||
|  | Function AddToPath | ||
|  |   Exch $0 | ||
|  |   Push $1 | ||
|  |   Push $2 | ||
|  |   Push $3 | ||
|  | 
 | ||
|  |   # don't add if the path doesn't exist | ||
|  |   IfFileExists "$0\*.*" "" AddToPath_done | ||
|  | 
 | ||
|  |   ReadEnvStr $1 PATH | ||
|  |   ; if the path is too long for a NSIS variable NSIS will return a 0 | ||
|  |   ; length string.  If we find that, then warn and skip any path | ||
|  |   ; modification as it will trash the existing path. | ||
|  |   StrLen $2 $1 | ||
|  |   IntCmp $2 0 CheckPathLength_ShowPathWarning CheckPathLength_Done CheckPathLength_Done | ||
|  |     CheckPathLength_ShowPathWarning: | ||
|  |     Messagebox MB_OK|MB_ICONEXCLAMATION "Warning! PATH too long installer unable to modify PATH!" | ||
|  |     Goto AddToPath_done | ||
|  |   CheckPathLength_Done: | ||
|  |   Push "$1;" | ||
|  |   Push "$0;" | ||
|  |   Call StrStr | ||
|  |   Pop $2 | ||
|  |   StrCmp $2 "" "" AddToPath_done | ||
|  |   Push "$1;" | ||
|  |   Push "$0\;" | ||
|  |   Call StrStr | ||
|  |   Pop $2 | ||
|  |   StrCmp $2 "" "" AddToPath_done | ||
|  |   GetFullPathName /SHORT $3 $0 | ||
|  |   Push "$1;" | ||
|  |   Push "$3;" | ||
|  |   Call StrStr | ||
|  |   Pop $2 | ||
|  |   StrCmp $2 "" "" AddToPath_done | ||
|  |   Push "$1;" | ||
|  |   Push "$3\;" | ||
|  |   Call StrStr | ||
|  |   Pop $2 | ||
|  |   StrCmp $2 "" "" AddToPath_done | ||
|  | 
 | ||
|  |   Call IsNT | ||
|  |   Pop $1 | ||
|  |   StrCmp $1 1 AddToPath_NT | ||
|  |     ; Not on NT | ||
|  |     StrCpy $1 $WINDIR 2 | ||
|  |     FileOpen $1 "$1\autoexec.bat" a | ||
|  |     FileSeek $1 -1 END | ||
|  |     FileReadByte $1 $2 | ||
|  |     IntCmp $2 26 0 +2 +2 # DOS EOF | ||
|  |       FileSeek $1 -1 END # write over EOF | ||
|  |     FileWrite $1 "$\r$\nSET PATH=%PATH%;$3$\r$\n" | ||
|  |     FileClose $1 | ||
|  |     SetRebootFlag true | ||
|  |     Goto AddToPath_done | ||
|  | 
 | ||
|  |   AddToPath_NT: | ||
|  |     ${If} $ADD_TO_PATH_ALL_USERS = ${BST_CHECKED} | ||
|  |       ReadRegStr $1 ${NT_all_env} "PATH" | ||
|  |     ${Else} | ||
|  |       ReadRegStr $1 ${NT_current_env} "PATH" | ||
|  |     ${EndIf} | ||
|  |     StrCmp $1 "" AddToPath_NTdoIt | ||
|  |       Push $1 | ||
|  |       Call Trim | ||
|  |       Pop $1 | ||
|  |       StrCpy $0 "$1;$0" | ||
|  |     AddToPath_NTdoIt: | ||
|  |       ${If} $ADD_TO_PATH_ALL_USERS = ${BST_CHECKED} | ||
|  |         WriteRegExpandStr ${NT_all_env} "PATH" $0 | ||
|  |       ${Else} | ||
|  |         WriteRegExpandStr ${NT_current_env} "PATH" $0 | ||
|  |       ${EndIf} | ||
|  |       SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 | ||
|  | 
 | ||
|  |   AddToPath_done: | ||
|  |     Pop $3 | ||
|  |     Pop $2 | ||
|  |     Pop $1 | ||
|  |     Pop $0 | ||
|  | FunctionEnd | ||
|  | 
 | ||
|  | 
 | ||
|  | ; RemoveFromPath - Remove a given dir from the path | ||
|  | ;     Input: head of the stack | ||
|  | 
 | ||
|  | Function un.RemoveFromPath | ||
|  |   Exch $0 | ||
|  |   Push $1 | ||
|  |   Push $2 | ||
|  |   Push $3 | ||
|  |   Push $4 | ||
|  |   Push $5 | ||
|  |   Push $6 | ||
|  | 
 | ||
|  |   IntFmt $6 "%c" 26 # DOS EOF | ||
|  | 
 | ||
|  |   Call un.IsNT | ||
|  |   Pop $1 | ||
|  |   StrCmp $1 1 unRemoveFromPath_NT | ||
|  |     ; Not on NT | ||
|  |     StrCpy $1 $WINDIR 2 | ||
|  |     FileOpen $1 "$1\autoexec.bat" r | ||
|  |     GetTempFileName $4 | ||
|  |     FileOpen $2 $4 w | ||
|  |     GetFullPathName /SHORT $0 $0 | ||
|  |     StrCpy $0 "SET PATH=%PATH%;$0" | ||
|  |     Goto unRemoveFromPath_dosLoop | ||
|  | 
 | ||
|  |     unRemoveFromPath_dosLoop: | ||
|  |       FileRead $1 $3 | ||
|  |       StrCpy $5 $3 1 -1 # read last char | ||
|  |       StrCmp $5 $6 0 +2 # if DOS EOF | ||
|  |         StrCpy $3 $3 -1 # remove DOS EOF so we can compare | ||
|  |       StrCmp $3 "$0$\r$\n" unRemoveFromPath_dosLoopRemoveLine | ||
|  |       StrCmp $3 "$0$\n" unRemoveFromPath_dosLoopRemoveLine | ||
|  |       StrCmp $3 "$0" unRemoveFromPath_dosLoopRemoveLine | ||
|  |       StrCmp $3 "" unRemoveFromPath_dosLoopEnd | ||
|  |       FileWrite $2 $3 | ||
|  |       Goto unRemoveFromPath_dosLoop | ||
|  |       unRemoveFromPath_dosLoopRemoveLine: | ||
|  |         SetRebootFlag true | ||
|  |         Goto unRemoveFromPath_dosLoop | ||
|  | 
 | ||
|  |     unRemoveFromPath_dosLoopEnd: | ||
|  |       FileClose $2 | ||
|  |       FileClose $1 | ||
|  |       StrCpy $1 $WINDIR 2 | ||
|  |       Delete "$1\autoexec.bat" | ||
|  |       CopyFiles /SILENT $4 "$1\autoexec.bat" | ||
|  |       Delete $4 | ||
|  |       Goto unRemoveFromPath_done | ||
|  | 
 | ||
|  |   unRemoveFromPath_NT: | ||
|  |     ${If} $ADD_TO_PATH_ALL_USERS = ${BST_CHECKED} | ||
|  |       ReadRegStr $1 ${NT_all_env} "PATH" | ||
|  |     ${Else} | ||
|  |       ReadRegStr $1 ${NT_current_env} "PATH" | ||
|  |     ${EndIf} | ||
|  |     StrCpy $5 $1 1 -1 # copy last char | ||
|  |     StrCmp $5 ";" +2 # if last char != ; | ||
|  |       StrCpy $1 "$1;" # append ; | ||
|  |     Push $1 | ||
|  |     Push "$0;" | ||
|  |     Call un.StrStr ; Find `$0;` in $1 | ||
|  |     Pop $2 ; pos of our dir | ||
|  |     StrCmp $2 "" unRemoveFromPath_done | ||
|  |       ; else, it is in path | ||
|  |       # $0 - path to add | ||
|  |       # $1 - path var | ||
|  |       StrLen $3 "$0;" | ||
|  |       StrLen $4 $2 | ||
|  |       StrCpy $5 $1 -$4 # $5 is now the part before the path to remove | ||
|  |       StrCpy $6 $2 "" $3 # $6 is now the part after the path to remove | ||
|  |       StrCpy $3 $5$6 | ||
|  | 
 | ||
|  |       StrCpy $5 $3 1 -1 # copy last char | ||
|  |       StrCmp $5 ";" 0 +2 # if last char == ; | ||
|  |         StrCpy $3 $3 -1 # remove last char | ||
|  | 
 | ||
|  |       ${If} $ADD_TO_PATH_ALL_USERS = ${BST_CHECKED} | ||
|  |         WriteRegExpandStr ${NT_all_env} "PATH" $3 | ||
|  |       ${Else} | ||
|  |         WriteRegExpandStr ${NT_current_env} "PATH" $3 | ||
|  |       ${EndIf} | ||
|  |       SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 | ||
|  | 
 | ||
|  |   unRemoveFromPath_done: | ||
|  |     Pop $6 | ||
|  |     Pop $5 | ||
|  |     Pop $4 | ||
|  |     Pop $3 | ||
|  |     Pop $2 | ||
|  |     Pop $1 | ||
|  |     Pop $0 | ||
|  | FunctionEnd | ||
|  | 
 | ||
|  | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
|  | ; Uninstall sutff | ||
|  | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
|  | 
 | ||
|  | ########################################### | ||
|  | #            Utility Functions            # | ||
|  | ########################################### | ||
|  | 
 | ||
|  | ;==================================================== | ||
|  | ; IsNT - Returns 1 if the current system is NT, 0 | ||
|  | ;        otherwise. | ||
|  | ;     Output: head of the stack | ||
|  | ;==================================================== | ||
|  | ; IsNT | ||
|  | ; no input | ||
|  | ; output, top of the stack = 1 if NT or 0 if not | ||
|  | ; | ||
|  | ; Usage: | ||
|  | ;   Call IsNT | ||
|  | ;   Pop $R0 | ||
|  | ;  ($R0 at this point is 1 or 0) | ||
|  | 
 | ||
|  | !macro IsNT un | ||
|  | Function ${un}IsNT | ||
|  |   Push $0 | ||
|  |   ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion | ||
|  |   StrCmp $0 "" 0 IsNT_yes | ||
|  |   ; we are not NT. | ||
|  |   Pop $0 | ||
|  |   Push 0 | ||
|  |   Return | ||
|  | 
 | ||
|  |   IsNT_yes: | ||
|  |     ; NT!!! | ||
|  |     Pop $0 | ||
|  |     Push 1 | ||
|  | FunctionEnd | ||
|  | !macroend | ||
|  | !insertmacro IsNT "" | ||
|  | !insertmacro IsNT "un." | ||
|  | 
 | ||
|  | ; StrStr | ||
|  | ; input, top of stack = string to search for | ||
|  | ;        top of stack-1 = string to search in | ||
|  | ; output, top of stack (replaces with the portion of the string remaining) | ||
|  | ; modifies no other variables. | ||
|  | ; | ||
|  | ; Usage: | ||
|  | ;   Push "this is a long ass string" | ||
|  | ;   Push "ass" | ||
|  | ;   Call StrStr | ||
|  | ;   Pop $R0 | ||
|  | ;  ($R0 at this point is "ass string") | ||
|  | 
 | ||
|  | !macro StrStr un | ||
|  | Function ${un}StrStr | ||
|  | Exch $R1 ; st=haystack,old$R1, $R1=needle | ||
|  |   Exch    ; st=old$R1,haystack | ||
|  |   Exch $R2 ; st=old$R1,old$R2, $R2=haystack | ||
|  |   Push $R3 | ||
|  |   Push $R4 | ||
|  |   Push $R5 | ||
|  |   StrLen $R3 $R1 | ||
|  |   StrCpy $R4 0 | ||
|  |   ; $R1=needle | ||
|  |   ; $R2=haystack | ||
|  |   ; $R3=len(needle) | ||
|  |   ; $R4=cnt | ||
|  |   ; $R5=tmp | ||
|  |   loop: | ||
|  |     StrCpy $R5 $R2 $R3 $R4 | ||
|  |     StrCmp $R5 $R1 done | ||
|  |     StrCmp $R5 "" done | ||
|  |     IntOp $R4 $R4 + 1 | ||
|  |     Goto loop | ||
|  | done: | ||
|  |   StrCpy $R1 $R2 "" $R4 | ||
|  |   Pop $R5 | ||
|  |   Pop $R4 | ||
|  |   Pop $R3 | ||
|  |   Pop $R2 | ||
|  |   Exch $R1 | ||
|  | FunctionEnd | ||
|  | !macroend | ||
|  | !insertmacro StrStr "" | ||
|  | !insertmacro StrStr "un." | ||
|  | 
 | ||
|  | Function Trim ; Added by Pelaca | ||
|  | 	Exch $R1 | ||
|  | 	Push $R2 | ||
|  | Loop: | ||
|  | 	StrCpy $R2 "$R1" 1 -1 | ||
|  | 	StrCmp "$R2" " " RTrim | ||
|  | 	StrCmp "$R2" "$\n" RTrim | ||
|  | 	StrCmp "$R2" "$\r" RTrim | ||
|  | 	StrCmp "$R2" ";" RTrim | ||
|  | 	GoTo Done | ||
|  | RTrim: | ||
|  | 	StrCpy $R1 "$R1" -1 | ||
|  | 	Goto Loop | ||
|  | Done: | ||
|  | 	Pop $R2 | ||
|  | 	Exch $R1 | ||
|  | FunctionEnd | ||
|  | 
 | ||
|  | Function ConditionalAddToRegisty | ||
|  |   Pop $0 | ||
|  |   Pop $1 | ||
|  |   StrCmp "$0" "" ConditionalAddToRegisty_EmptyString | ||
|  |     WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" \ | ||
|  |     "$1" "$0" | ||
|  |     ;MessageBox MB_OK "Set Registry: '$1' to '$0'" | ||
|  |     DetailPrint "Set install registry entry: '$1' to '$0'" | ||
|  |   ConditionalAddToRegisty_EmptyString: | ||
|  | FunctionEnd | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | 
 | ||
|  | !ifdef CPACK_USES_DOWNLOAD | ||
|  | Function DownloadFile | ||
|  |     IfFileExists $INSTDIR\* +2 | ||
|  |     CreateDirectory $INSTDIR | ||
|  |     Pop $0 | ||
|  | 
 | ||
|  |     ; Skip if already downloaded | ||
|  |     IfFileExists $INSTDIR\$0 0 +2 | ||
|  |     Return | ||
|  | 
 | ||
|  |     StrCpy $1 "@CPACK_DOWNLOAD_SITE@" | ||
|  | 
 | ||
|  |   try_again: | ||
|  |     NSISdl::download "$1/$0" "$INSTDIR\$0" | ||
|  | 
 | ||
|  |     Pop $1 | ||
|  |     StrCmp $1 "success" success | ||
|  |     StrCmp $1 "Cancelled" cancel | ||
|  |     MessageBox MB_OK "Download failed: $1" | ||
|  |   cancel: | ||
|  |     Return | ||
|  |   success: | ||
|  | FunctionEnd | ||
|  | !endif | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ; Installation types | ||
|  | @CPACK_NSIS_INSTALLATION_TYPES@ | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ; Component sections | ||
|  | @CPACK_NSIS_COMPONENT_SECTIONS@ | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ; Define some macro setting for the gui | ||
|  | @CPACK_NSIS_INSTALLER_MUI_ICON_CODE@ | ||
|  | @CPACK_NSIS_INSTALLER_ICON_CODE@ | ||
|  | @CPACK_NSIS_INSTALLER_MUI_COMPONENTS_DESC@ | ||
|  | @CPACK_NSIS_INSTALLER_MUI_FINISHPAGE_RUN_CODE@ | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ;Pages | ||
|  |   !insertmacro MUI_PAGE_WELCOME | ||
|  | 
 | ||
|  |   !insertmacro MUI_PAGE_LICENSE "@CPACK_RESOURCE_FILE_LICENSE@" | ||
|  |   Page custom InstallOptionsPage InstallOptionsPageLeave | ||
|  |   !insertmacro MUI_PAGE_DIRECTORY | ||
|  | 
 | ||
|  |   ;Start Menu Folder Page Configuration | ||
|  |   !define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX" | ||
|  |   !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" | ||
|  |   !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" | ||
|  |   !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER | ||
|  | 
 | ||
|  |   @CPACK_NSIS_PAGE_COMPONENTS@ | ||
|  | 
 | ||
|  |   @CPACK_NSIS_EXTRA_PAGES@ | ||
|  | 
 | ||
|  |   !insertmacro MUI_PAGE_INSTFILES | ||
|  |   !insertmacro MUI_PAGE_FINISH | ||
|  | 
 | ||
|  |   !insertmacro MUI_UNPAGE_CONFIRM | ||
|  |   !insertmacro MUI_UNPAGE_INSTFILES | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ;Languages | ||
|  | 
 | ||
|  |   !insertmacro MUI_LANGUAGE "English" ;first language is the default language | ||
|  |   !insertmacro MUI_LANGUAGE "Albanian" | ||
|  |   !insertmacro MUI_LANGUAGE "Arabic" | ||
|  |   !insertmacro MUI_LANGUAGE "Basque" | ||
|  |   !insertmacro MUI_LANGUAGE "Belarusian" | ||
|  |   !insertmacro MUI_LANGUAGE "Bosnian" | ||
|  |   !insertmacro MUI_LANGUAGE "Breton" | ||
|  |   !insertmacro MUI_LANGUAGE "Bulgarian" | ||
|  |   !insertmacro MUI_LANGUAGE "Croatian" | ||
|  |   !insertmacro MUI_LANGUAGE "Czech" | ||
|  |   !insertmacro MUI_LANGUAGE "Danish" | ||
|  |   !insertmacro MUI_LANGUAGE "Dutch" | ||
|  |   !insertmacro MUI_LANGUAGE "Estonian" | ||
|  |   !insertmacro MUI_LANGUAGE "Farsi" | ||
|  |   !insertmacro MUI_LANGUAGE "Finnish" | ||
|  |   !insertmacro MUI_LANGUAGE "French" | ||
|  |   !insertmacro MUI_LANGUAGE "German" | ||
|  |   !insertmacro MUI_LANGUAGE "Greek" | ||
|  |   !insertmacro MUI_LANGUAGE "Hebrew" | ||
|  |   !insertmacro MUI_LANGUAGE "Hungarian" | ||
|  |   !insertmacro MUI_LANGUAGE "Icelandic" | ||
|  |   !insertmacro MUI_LANGUAGE "Indonesian" | ||
|  |   !insertmacro MUI_LANGUAGE "Irish" | ||
|  |   !insertmacro MUI_LANGUAGE "Italian" | ||
|  |   !insertmacro MUI_LANGUAGE "Japanese" | ||
|  |   !insertmacro MUI_LANGUAGE "Korean" | ||
|  |   !insertmacro MUI_LANGUAGE "Kurdish" | ||
|  |   !insertmacro MUI_LANGUAGE "Latvian" | ||
|  |   !insertmacro MUI_LANGUAGE "Lithuanian" | ||
|  |   !insertmacro MUI_LANGUAGE "Luxembourgish" | ||
|  |   !insertmacro MUI_LANGUAGE "Macedonian" | ||
|  |   !insertmacro MUI_LANGUAGE "Malay" | ||
|  |   !insertmacro MUI_LANGUAGE "Mongolian" | ||
|  |   !insertmacro MUI_LANGUAGE "Norwegian" | ||
|  |   !insertmacro MUI_LANGUAGE "Polish" | ||
|  |   !insertmacro MUI_LANGUAGE "Portuguese" | ||
|  |   !insertmacro MUI_LANGUAGE "PortugueseBR" | ||
|  |   !insertmacro MUI_LANGUAGE "Romanian" | ||
|  |   !insertmacro MUI_LANGUAGE "Russian" | ||
|  |   !insertmacro MUI_LANGUAGE "Serbian" | ||
|  |   !insertmacro MUI_LANGUAGE "SerbianLatin" | ||
|  |   !insertmacro MUI_LANGUAGE "SimpChinese" | ||
|  |   !insertmacro MUI_LANGUAGE "Slovak" | ||
|  |   !insertmacro MUI_LANGUAGE "Slovenian" | ||
|  |   !insertmacro MUI_LANGUAGE "Spanish" | ||
|  |   !insertmacro MUI_LANGUAGE "Swedish" | ||
|  |   !insertmacro MUI_LANGUAGE "Thai" | ||
|  |   !insertmacro MUI_LANGUAGE "TradChinese" | ||
|  |   !insertmacro MUI_LANGUAGE "Turkish" | ||
|  |   !insertmacro MUI_LANGUAGE "Ukrainian" | ||
|  |   !insertmacro MUI_LANGUAGE "Welsh" | ||
|  | 
 | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ;Reserve Files | ||
|  | 
 | ||
|  |   ;These files should be inserted before other files in the data block | ||
|  |   ;Keep these lines before any File command | ||
|  |   ;Only for solid compression (by default, solid compression is enabled for BZIP2 and LZMA) | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ;Installer Sections | ||
|  | 
 | ||
|  | Section "-Core installation" | ||
|  |   ;Use the entire tree produced by the INSTALL target.  Keep the | ||
|  |   ;list of directories here in sync with the RMDir commands below. | ||
|  |   SetOutPath "$INSTDIR" | ||
|  |   @CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS@ | ||
|  |   @CPACK_NSIS_FULL_INSTALL@ | ||
|  | 
 | ||
|  |   ;Store installation folder | ||
|  |   WriteRegStr SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "" $INSTDIR | ||
|  | 
 | ||
|  |   ;Create uninstaller | ||
|  |   WriteUninstaller "$INSTDIR\Uninstall.exe" | ||
|  |   Push "DisplayName" | ||
|  |   Push "@CPACK_NSIS_DISPLAY_NAME@" | ||
|  |   Call ConditionalAddToRegisty | ||
|  |   Push "DisplayVersion" | ||
|  |   Push "@CPACK_PACKAGE_VERSION@" | ||
|  |   Call ConditionalAddToRegisty | ||
|  |   Push "Publisher" | ||
|  |   Push "@CPACK_PACKAGE_VENDOR@" | ||
|  |   Call ConditionalAddToRegisty | ||
|  |   Push "UninstallString" | ||
|  |   Push "$INSTDIR\Uninstall.exe" | ||
|  |   Call ConditionalAddToRegisty | ||
|  |   Push "NoRepair" | ||
|  |   Push "1" | ||
|  |   Call ConditionalAddToRegisty | ||
|  | 
 | ||
|  |   !ifdef CPACK_NSIS_ADD_REMOVE | ||
|  |   ;Create add/remove functionality | ||
|  |   Push "ModifyPath" | ||
|  |   Push "$INSTDIR\AddRemove.exe" | ||
|  |   Call ConditionalAddToRegisty | ||
|  |   !else | ||
|  |   Push "NoModify" | ||
|  |   Push "1" | ||
|  |   Call ConditionalAddToRegisty | ||
|  |   !endif | ||
|  | 
 | ||
|  |   ; Optional registration | ||
|  |   Push "DisplayIcon" | ||
|  |   Push "$INSTDIR\@CPACK_NSIS_INSTALLED_ICON_NAME@" | ||
|  |   Call ConditionalAddToRegisty | ||
|  |   Push "HelpLink" | ||
|  |   Push "@CPACK_NSIS_HELP_LINK@" | ||
|  |   Call ConditionalAddToRegisty | ||
|  |   Push "URLInfoAbout" | ||
|  |   Push "@CPACK_NSIS_URL_INFO_ABOUT@" | ||
|  |   Call ConditionalAddToRegisty | ||
|  |   Push "Contact" | ||
|  |   Push "@CPACK_NSIS_CONTACT@" | ||
|  |   Call ConditionalAddToRegisty | ||
|  |   !insertmacro MUI_STARTMENU_WRITE_BEGIN Application | ||
|  | 
 | ||
|  |   ;Create shortcuts | ||
|  |   CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER" | ||
|  | @CPACK_NSIS_CREATE_ICONS@ | ||
|  | @CPACK_NSIS_CREATE_ICONS_EXTRA@ | ||
|  |   CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe" | ||
|  | 
 | ||
|  |   ; Write special uninstall registry entries | ||
|  |   Push "StartMenu" | ||
|  |   Push "$STARTMENU_FOLDER" | ||
|  |   Call ConditionalAddToRegisty | ||
|  |   WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" \ | ||
|  |     "DoNotAddToPath" $DO_NOT_ADD_TO_PATH | ||
|  |   WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" \ | ||
|  |     "AddToPathAllUsers" $ADD_TO_PATH_ALL_USERS | ||
|  |   WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" \ | ||
|  |     "AddToPathCurrentUser" $ADD_TO_PATH_CURRENT_USER | ||
|  |   WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" \ | ||
|  |     "InstallToDesktop" $INSTALL_DESKTOP | ||
|  | 
 | ||
|  |   !insertmacro MUI_STARTMENU_WRITE_END | ||
|  | 
 | ||
|  | @CPACK_NSIS_EXTRA_INSTALL_COMMANDS@ | ||
|  | 
 | ||
|  | SectionEnd | ||
|  | 
 | ||
|  | Section "-Add to path" | ||
|  |   Push $INSTDIR\bin | ||
|  |   ${If} "@CPACK_NSIS_MODIFY_PATH@" == "ON" | ||
|  |     ${If} $DO_NOT_ADD_TO_PATH = ${BST_UNCHECKED} | ||
|  |       Call AddToPath | ||
|  |     ${EndIf} | ||
|  |   ${EndIf} | ||
|  | SectionEnd | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ; Create custom pages | ||
|  | Function InstallOptionsPage | ||
|  |   Push $R0 | ||
|  |   Push $0 | ||
|  | 
 | ||
|  |   !insertmacro MUI_HEADER_TEXT "Install Options" "Choose options for installing @CPACK_NSIS_PACKAGE_NAME@" | ||
|  | 
 | ||
|  |   nsDialogs::Create 1018 | ||
|  |   Pop $R0 | ||
|  |   ${If} $R0 == error | ||
|  |     Abort | ||
|  |   ${EndIf} | ||
|  | 
 | ||
|  |   ${NSD_CreateLabel} 0u 0u 100% 20u 'By default @CPACK_PACKAGE_INSTALL_DIRECTORY@ does not add its directory to the system PATH.' | ||
|  |   Pop $0 | ||
|  | 
 | ||
|  |   ${NSD_CreateRadioButton} 0u 30u 100% 10u 'Do not add @CPACK_PACKAGE_NAME@ to the system PATH' | ||
|  |   Pop $RB_DO_NOT_ADD_TO_PATH | ||
|  |   ${NSD_SetState} $RB_DO_NOT_ADD_TO_PATH $DO_NOT_ADD_TO_PATH | ||
|  | 
 | ||
|  |   ${NSD_CreateRadioButton} 0u 40u 100% 10u 'Add @CPACK_PACKAGE_NAME@ to the system PATH for all users' | ||
|  |   Pop $RB_ADD_TO_PATH_ALL_USERS | ||
|  |   ${NSD_SetState} $RB_ADD_TO_PATH_ALL_USERS $ADD_TO_PATH_ALL_USERS | ||
|  | 
 | ||
|  |   ${NSD_CreateRadioButton} 0u 50u 100% 10u 'Add @CPACK_PACKAGE_NAME@ to the system PATH for the current user' | ||
|  |   Pop $RB_ADD_TO_PATH_CURRENT_USER | ||
|  |   ${NSD_SetState} $RB_ADD_TO_PATH_CURRENT_USER $ADD_TO_PATH_CURRENT_USER | ||
|  | 
 | ||
|  |   ${NSD_CreateCheckBox} 0u 80u 100% 10u 'Create @CPACK_PACKAGE_NAME@ Desktop Icon' | ||
|  |   Pop $CB_INSTALL_DESKTOP | ||
|  |   ${NSD_SetState} $CB_INSTALL_DESKTOP $INSTALL_DESKTOP | ||
|  | 
 | ||
|  |   @CPACK_NSIS_EXTRA_INSTALL_OPTIONS@ | ||
|  | 
 | ||
|  |   nsDialogs::Show | ||
|  | 
 | ||
|  |   Pop $0 | ||
|  |   Pop $R0 | ||
|  | FunctionEnd | ||
|  | 
 | ||
|  | Function InstallOptionsPageLeave | ||
|  |   ${NSD_GetState} $RB_DO_NOT_ADD_TO_PATH $DO_NOT_ADD_TO_PATH | ||
|  |   ${NSD_GetState} $RB_ADD_TO_PATH_ALL_USERS $ADD_TO_PATH_ALL_USERS | ||
|  |   ${NSD_GetState} $RB_ADD_TO_PATH_CURRENT_USER $ADD_TO_PATH_CURRENT_USER | ||
|  | 
 | ||
|  |   ${NSD_GetState} $CB_INSTALL_DESKTOP $INSTALL_DESKTOP | ||
|  | 
 | ||
|  |   @CPACK_NSIS_EXTRA_INSTALL_OPTIONS_READ@ | ||
|  | FunctionEnd | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ; determine admin versus local install | ||
|  | Function un.onInit | ||
|  |   Push $0 | ||
|  |   Push $1 | ||
|  | 
 | ||
|  |   ClearErrors | ||
|  |   UserInfo::GetName | ||
|  |   IfErrors noLM | ||
|  |   Pop $0 | ||
|  |   UserInfo::GetAccountType | ||
|  |   Pop $1 | ||
|  |   StrCmp $1 "Admin" 0 +3 | ||
|  |     SetShellVarContext all | ||
|  |     ;MessageBox MB_OK 'User "$0" is in the Admin group' | ||
|  |     Goto done | ||
|  |   StrCmp $1 "Power" 0 +3 | ||
|  |     SetShellVarContext all | ||
|  |     ;MessageBox MB_OK 'User "$0" is in the Power Users group' | ||
|  |     Goto done | ||
|  | 
 | ||
|  |   noLM: | ||
|  |     ;Get installation folder from registry if available | ||
|  | 
 | ||
|  |   done: | ||
|  | 
 | ||
|  |   Pop $1 | ||
|  |   Pop $0 | ||
|  | FunctionEnd | ||
|  | 
 | ||
|  | ;--- Add/Remove callback functions: --- | ||
|  | !macro SectionList MacroName | ||
|  |   ;This macro used to perform operation on multiple sections. | ||
|  |   ;List all of your components in following manner here. | ||
|  | @CPACK_NSIS_COMPONENT_SECTION_LIST@ | ||
|  | !macroend | ||
|  | 
 | ||
|  | Section -FinishComponents | ||
|  |   ;Removes unselected components and writes component status to registry | ||
|  |   !insertmacro SectionList "FinishSection" | ||
|  | 
 | ||
|  | !ifdef CPACK_NSIS_ADD_REMOVE | ||
|  |   ; Get the name of the installer executable | ||
|  |   System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1' | ||
|  |   StrCpy $R3 $R0 | ||
|  | 
 | ||
|  |   ; Strip off the last 13 characters, to see if we have AddRemove.exe | ||
|  |   StrLen $R1 $R0 | ||
|  |   IntOp $R1 $R0 - 13 | ||
|  |   StrCpy $R2 $R0 13 $R1 | ||
|  |   StrCmp $R2 "AddRemove.exe" addremove_installed | ||
|  | 
 | ||
|  |   ; We're not running AddRemove.exe, so install it | ||
|  |   CopyFiles $R3 $INSTDIR\AddRemove.exe | ||
|  | 
 | ||
|  |   addremove_installed: | ||
|  | !endif | ||
|  | SectionEnd | ||
|  | ;--- End of Add/Remove callback functions --- | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ; Component dependencies | ||
|  | Function .onSelChange | ||
|  |   !insertmacro SectionList MaybeSelectionChanged | ||
|  | FunctionEnd | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ;Uninstaller Section | ||
|  | 
 | ||
|  | Section "Uninstall" | ||
|  |   ReadRegStr $START_MENU SHCTX \ | ||
|  |    "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "StartMenu" | ||
|  |   ;MessageBox MB_OK "Start menu is in: $START_MENU" | ||
|  |   ReadRegDWORD $DO_NOT_ADD_TO_PATH SHCTX \ | ||
|  |     "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "DoNotAddToPath" | ||
|  |   ReadRegDWORD $ADD_TO_PATH_ALL_USERS SHCTX \ | ||
|  |     "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathAllUsers" | ||
|  |   ReadRegDWORD $ADD_TO_PATH_CURRENT_USER SHCTX \ | ||
|  |     "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathCurrentUser" | ||
|  |   ;MessageBox MB_OK "Add to path: $DO_NOT_ADD_TO_PATH all users: $ADD_TO_PATH_ALL_USERS" | ||
|  |   ReadRegDWORD $INSTALL_DESKTOP SHCTX \ | ||
|  |     "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "InstallToDesktop" | ||
|  |   ;MessageBox MB_OK "Install to desktop: $INSTALL_DESKTOP " | ||
|  | 
 | ||
|  | @CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS@ | ||
|  | 
 | ||
|  |   ;Remove files we installed. | ||
|  |   ;Keep the list of directories here in sync with the File commands above. | ||
|  | @CPACK_NSIS_DELETE_FILES@ | ||
|  | @CPACK_NSIS_DELETE_DIRECTORIES@ | ||
|  | 
 | ||
|  | !ifdef CPACK_NSIS_ADD_REMOVE | ||
|  |   ;Remove the add/remove program | ||
|  |   Delete "$INSTDIR\AddRemove.exe" | ||
|  | !endif | ||
|  | 
 | ||
|  |   ;Remove the uninstaller itself. | ||
|  |   Delete "$INSTDIR\Uninstall.exe" | ||
|  |   DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" | ||
|  | 
 | ||
|  |   ;Remove the installation directory if it is empty. | ||
|  |   RMDir "$INSTDIR" | ||
|  | 
 | ||
|  |   ; Remove the registry entries. | ||
|  |   DeleteRegKey SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" | ||
|  | 
 | ||
|  |   ; Removes all optional components | ||
|  |   !insertmacro SectionList "RemoveSection_CPack" | ||
|  | 
 | ||
|  |   !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP | ||
|  | 
 | ||
|  |   Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk" | ||
|  | @CPACK_NSIS_DELETE_ICONS@ | ||
|  | @CPACK_NSIS_DELETE_ICONS_EXTRA@ | ||
|  | 
 | ||
|  |   ;Delete empty start menu parent diretories | ||
|  |   StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP" | ||
|  | 
 | ||
|  |   startMenuDeleteLoop: | ||
|  |     ClearErrors | ||
|  |     RMDir $MUI_TEMP | ||
|  |     GetFullPathName $MUI_TEMP "$MUI_TEMP\.." | ||
|  | 
 | ||
|  |     IfErrors startMenuDeleteLoopDone | ||
|  | 
 | ||
|  |     StrCmp "$MUI_TEMP" "$SMPROGRAMS" startMenuDeleteLoopDone startMenuDeleteLoop | ||
|  |   startMenuDeleteLoopDone: | ||
|  | 
 | ||
|  |   ; If the user changed the shortcut, then untinstall may not work. This should | ||
|  |   ; try to fix it. | ||
|  |   StrCpy $MUI_TEMP "$START_MENU" | ||
|  |   Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk" | ||
|  | @CPACK_NSIS_DELETE_ICONS_EXTRA@ | ||
|  | 
 | ||
|  |   ;Delete empty start menu parent diretories | ||
|  |   StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP" | ||
|  | 
 | ||
|  |   secondStartMenuDeleteLoop: | ||
|  |     ClearErrors | ||
|  |     RMDir $MUI_TEMP | ||
|  |     GetFullPathName $MUI_TEMP "$MUI_TEMP\.." | ||
|  | 
 | ||
|  |     IfErrors secondStartMenuDeleteLoopDone | ||
|  | 
 | ||
|  |     StrCmp "$MUI_TEMP" "$SMPROGRAMS" secondStartMenuDeleteLoopDone secondStartMenuDeleteLoop | ||
|  |   secondStartMenuDeleteLoopDone: | ||
|  | 
 | ||
|  |   DeleteRegKey /ifempty SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" | ||
|  | 
 | ||
|  |   Push $INSTDIR\bin | ||
|  |   ${Unless} $DO_NOT_ADD_TO_PATH = ${BST_CHECKED} | ||
|  |     Call un.RemoveFromPath | ||
|  |   ${EndUnless} | ||
|  | SectionEnd | ||
|  | 
 | ||
|  | ;-------------------------------- | ||
|  | ; determine admin versus local install | ||
|  | ; Is install for "AllUsers" or "JustMe"? | ||
|  | ; Default to "JustMe" - set to "AllUsers" if admin or on Win9x | ||
|  | ; This function is used for the very first "custom page" of the installer. | ||
|  | ; This custom page does not show up visibly, but it executes prior to the | ||
|  | ; first visible page and sets up $INSTDIR properly... | ||
|  | ; Choose different default installation folder based on SV_ALLUSERS... | ||
|  | ; "Program Files" for AllUsers, "My Documents" for JustMe... | ||
|  | 
 | ||
|  | Function .onInit | ||
|  |   Push $0 | ||
|  |   Push $1 | ||
|  |   Push $2 | ||
|  |   Push $3 | ||
|  | 
 | ||
|  |   StrCmp "@CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL@" "ON" 0 inst | ||
|  | 
 | ||
|  |   ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "UninstallString" | ||
|  |   StrCmp $0 "" inst | ||
|  | 
 | ||
|  |   MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \ | ||
|  |   "@CPACK_NSIS_PACKAGE_NAME@ is already installed. $\n$\nDo you want to uninstall the old version before installing the new one?" \ | ||
|  |   IDYES uninst IDNO inst | ||
|  |   Abort | ||
|  | 
 | ||
|  | ;Run the uninstaller | ||
|  | uninst: | ||
|  |   ClearErrors | ||
|  |   StrLen $2 "\Uninstall.exe" | ||
|  |   StrCpy $3 $0 -$2 # remove "\Uninstall.exe" from UninstallString to get path | ||
|  |   ExecWait '$0 _?=$3' ;Do not copy the uninstaller to a temp file | ||
|  | 
 | ||
|  |   IfErrors uninst_failed inst | ||
|  | uninst_failed: | ||
|  |   MessageBox MB_OK|MB_ICONSTOP "Uninstall failed." | ||
|  |   Abort | ||
|  | 
 | ||
|  | 
 | ||
|  | inst: | ||
|  |   ; Reads components status for registry | ||
|  |   !insertmacro SectionList "InitSection" | ||
|  | 
 | ||
|  |   ; check to see if /D has been used to change | ||
|  |   ; the install directory by comparing it to the | ||
|  |   ; install directory that is expected to be the | ||
|  |   ; default | ||
|  |   StrCpy $IS_DEFAULT_INSTALLDIR 0 | ||
|  |   StrCmp "$INSTDIR" "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" 0 +2 | ||
|  |     StrCpy $IS_DEFAULT_INSTALLDIR 1 | ||
|  | 
 | ||
|  |   StrCpy $SV_ALLUSERS "JustMe" | ||
|  |   ; if default install dir then change the default | ||
|  |   ; if it is installed for JustMe | ||
|  |   StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2 | ||
|  |     StrCpy $INSTDIR "$DOCUMENTS\@CPACK_PACKAGE_INSTALL_DIRECTORY@" | ||
|  | 
 | ||
|  |   ClearErrors | ||
|  |   UserInfo::GetName | ||
|  |   IfErrors noLM | ||
|  |   Pop $0 | ||
|  |   UserInfo::GetAccountType | ||
|  |   Pop $1 | ||
|  |   StrCmp $1 "Admin" 0 +4 | ||
|  |     SetShellVarContext all | ||
|  |     ;MessageBox MB_OK 'User "$0" is in the Admin group' | ||
|  |     StrCpy $SV_ALLUSERS "AllUsers" | ||
|  |     Goto done | ||
|  |   StrCmp $1 "Power" 0 +4 | ||
|  |     SetShellVarContext all | ||
|  |     ;MessageBox MB_OK 'User "$0" is in the Power Users group' | ||
|  |     StrCpy $SV_ALLUSERS "AllUsers" | ||
|  |     Goto done | ||
|  | 
 | ||
|  |   noLM: | ||
|  |     StrCpy $SV_ALLUSERS "AllUsers" | ||
|  |     ;Get installation folder from registry if available | ||
|  | 
 | ||
|  |   done: | ||
|  |   StrCmp $SV_ALLUSERS "AllUsers" 0 +3 | ||
|  |     StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2 | ||
|  |       StrCpy $INSTDIR "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" | ||
|  | 
 | ||
|  |   IntOp $DO_NOT_ADD_TO_PATH 0 + ${BST_CHECKED} ; set to checked | ||
|  |   IntOp $ADD_TO_PATH_ALL_USERS 0 + ${BST_UNCHECKED} ; set to unchecked | ||
|  |   IntOp $ADD_TO_PATH_CURRENT_USER 0 + ${BST_UNCHECKED} ; ditto | ||
|  |   IntOp $INSTALL_DESKTOP 0 + ${BST_UNCHECKED} ; set to unchecked | ||
|  | 
 | ||
|  |   @CPACK_NSIS_EXTRA_INIT_COMMANDS@ | ||
|  | 
 | ||
|  |   Pop $3 | ||
|  |   Pop $2 | ||
|  |   Pop $1 | ||
|  |   Pop $0 | ||
|  | FunctionEnd |