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
 | 
