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
 |