sbsv2/raptor/util/install-windows/raptorinstallerscript.nsi
changeset 0 044383f39525
child 3 e1eecf4d390d
child 590 360bd6b35136
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/util/install-windows/raptorinstallerscript.nsi	Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,486 @@
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+# Raptor installer/uninstaller script
+
+# Standard NSIS Library includes 
+!include "MUI2.nsh"
+!include "LogicLib.nsh"
+!include "WinMessages.nsh"
+
+# Extra plugin includes
+!include "nsDialogs.nsh"
+!include "Registry.nsh"
+!include "NSISpcre.nsh"
+!include "Time.nsh"
+
+# Define functions from NSISpcre.nsh 
+!insertmacro REMatches
+!insertmacro un.REMatches
+!insertmacro REQuoteMeta
+
+# Variables
+Var DIALOG
+Var RESULT # Generic variable to obtain results, and immediately thrown away after
+Var RESULT2 # Generic variable to obtain results, and immediately thrown away after
+Var SBS_HOME
+Var USERONLYINSTALL_HWND # HWND of radio button control for user-only installation
+Var ALLUSERSINSTALL_HWND # HWND of radio button control for system installation
+Var NOENVCHANGES_HWND    # HWND of radio button control for file-only installation
+Var USERONLYINSTALL_STATE # State of user-only radio button
+Var ALLUSERSINSTALL_STATE # State of system radio button
+Var NOENVCHANGES_STATE # State of file-only installation radio button
+Var INSTALL_TYPE # Type of installer ("USR" or "SYS")
+
+# Custom includes (depend on above variables so much be here)
+!include "raptorinstallerutils.nsh" # Functions and macros for handling environment variables
+!include "raptorversion.nsh" # Define the RAPTOR_VERSION variable
+
+# Defines
+# !define /date DATE_STAMP "%Y-%m-%d-%H-%M-%S"
+!define INSTALLER_NAME "Raptor v${RAPTOR_VERSION}"
+!define RAPTOR "sbs"
+!define INSTALLER_FILENAME "${RAPTOR}-${RAPTOR_VERSION}.exe"
+!define UNINSTALLER_FILENAME "${RAPTOR}-${RAPTOR_VERSION}-uninstaller.exe"
+
+########################## Attributes ###########################
+# Name of installer executable to create!
+OutFile ${INSTALLER_FILENAME}
+# Name for the installer caption
+Name "Raptor v${RAPTOR_VERSION}"
+
+####################### Generic Behaviour #######################
+# Vista support; use admin in case user decides to install Raptor for all users
+RequestExecutionLevel admin
+# Set XPStyle on
+XPStyle on
+
+###################### Installer Behaviour ######################
+# Warn on Cancel
+!define MUI_ABORTWARNING
+# Abort warning text
+!define MUI_ABORTWARNING_TEXT "Are you sure you want to quit the ${INSTALLER_NAME} installer?"
+# Cancel is default button on cancel dialogue boxes.
+!define MUI_ABORTWARNING_CANCEL_DEFAULT
+# Don't just to final page
+!define MUI_FINISHPAGE_NOAUTOCLOSE
+# Show installer details
+ShowInstDetails show
+
+##################### Pages in the installer #####################
+!insertmacro MUI_PAGE_WELCOME
+# Temporarily useing RELEASE-NOTES.txt as there is not license.txt
+!insertmacro MUI_PAGE_LICENSE ${RAPTOR_LOCATION}\RELEASE-NOTES.txt
+!define MUI_PAGE_HEADER_TEXT "Installation type"
+Page custom UserOrSysInstall UserOrSysInstallLeave
+!define MUI_PAGE_CUSTOMFUNCTION_LEAVE DirLeave # Directory page exit function - disallow spaces in $INSTDIR
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_INSTFILES
+!insertmacro MUI_PAGE_FINISH
+
+######################## .onInit function ########################
+Function .onInit
+    StrCpy $INSTDIR "C:\Apps\Raptor"
+FunctionEnd
+
+#################### Sections in the installer ####################
+# "Sections" - i.e. components to install. This installer
+# only has Raptor, so there is no point giving options 
+# to the user.
+Section "Install Raptor" INSTALLRAPTOR
+	
+    StrCpy $SBS_HOME "SBS_HOME"
+	
+    # Install Raptor
+    SetOutPath "$INSTDIR\bin"
+    File /r ${RAPTOR_LOCATION}\bin\*.* 
+    SetOutPath "$INSTDIR\examples"
+    File /r ${RAPTOR_LOCATION}\examples\*.*
+    SetOutPath "$INSTDIR\lib"
+    File /r ${RAPTOR_LOCATION}\lib\*.*
+    SetOutPath "$INSTDIR\python"
+    File /r ${RAPTOR_LOCATION}\python\*.*
+    SetOutPath "$INSTDIR\schema"
+    File /r ${RAPTOR_LOCATION}\schema\*.*
+    SetOutPath "$INSTDIR\win32"
+    File /r ${RAPTOR_LOCATION}\win32\*.*
+    
+    SetOutPath "$INSTDIR"
+    File ${RAPTOR_LOCATION}\RELEASE-NOTES.txt
+    
+    
+    ${Unless} $INSTALL_TYPE == "NO_ENV"
+        # Back up system and user environments before changing them.
+        !insertmacro DefineDateStamp
+        !define SYS_REG_BACKUP_FILE "$INSTDIR\SysEnvBackUpPreInstall-${DATE_STAMP}.reg"
+        !define USR_REG_BACKUP_FILE "$INSTDIR\UsrEnvBackUpPreInstall-${DATE_STAMP}.reg"
+        
+        # Save System Environment just in case.
+        ${registry::SaveKey} "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "${SYS_REG_BACKUP_FILE}" "" "$RESULT"
+        
+        ${If} $RESULT == 0
+            DetailPrint "Successfully backed up system environment in ${SYS_REG_BACKUP_FILE}."
+        ${Else}
+            DetailPrint "Failed to back up system environment due to an unknown error."
+        ${EndIf}
+        
+        # Save user Environment just in case.
+        ${registry::SaveKey} "HKCU\Environment" "${USR_REG_BACKUP_FILE}" "" "$RESULT"
+        
+        ${If} $RESULT == 0
+            DetailPrint "Successfully backed up user environment in ${USR_REG_BACKUP_FILE}."
+        ${Else}
+            DetailPrint "Failed to back up user environment due to an unknown error."
+        ${EndIf}
+    	
+    	# Reset error flag
+    	ClearErrors
+    	
+    	# Write SBS_HOME variable; if it exists, the user will be asked if they want it to be overwritten.
+    	# Read the env var from the appropriate place
+    	!insertmacro ReadEnvVar $SBS_HOME $RESULT
+    	
+    	${Unless} ${Errors} # No errors, so $SBS_HOME exists
+    		DetailPrint "Env Var $SBS_HOME exists with value $RESULT"
+    		# Ask user if they want it replaced. If yes, write it, if no don't write it.
+    		MessageBox MB_YESNO|MB_ICONQUESTION "The ${INSTALLER_NAME} installer has detected that you already have the SBS_HOME environment variable set with value $RESULT. Would you like the installer to overwrite it with the value $INSTDIR? Click yes to over write with value $INSTDIR, and no to leave it as $RESULT." IDYES write_env_var_yes IDNO write_env_var_no
+    	${Else} # No env var named $SBS_HOME
+    		DetailPrint "Env Var $SBS_HOME does not exist!"
+    	${EndUnless}
+    	
+write_env_var_yes:
+    	# Write SBS_HOME to registry
+    	Push "SBS_HOME" # Third on stack
+    	Push "$INSTDIR" # Second on stack
+    	Push "" # First on stack
+    	
+    	# Needs env var name, env var value, then "" on the stack
+    	call WriteEnvVar
+    	
+    	# Prepend PATH with %SBS_HOME%\bin
+    	Push "%SBS_HOME%\bin" # First on stack
+    	call PrependToPath
+    	goto end
+        
+write_env_var_no:
+    	DetailPrint "Not writing the environment variable $SBS_HOME."
+        
+end:
+    ${EndUnless} 
+	
+	# Generate batch file to set environment variables for Raptor
+	StrCpy $RESULT "@REM Environment variables for ${INSTALLER_NAME}$\r$\nset SBS_HOME=$INSTDIR$\r$\nset PATH=%SBS_HOME%\bin;%PATH%$\r$\n"
+	!insertmacro WriteFile "RaptorEnv.bat" "$RESULT"
+SectionEnd
+
+# Finishing up installation.
+Section
+    ${Unless} $INSTALL_TYPE == "NO_ENV"
+    	# Refresh environment to get changes for SBS_HOME and PATH
+        !insertmacro RefreshEnv
+    ${EndUnless}
+	
+	# Write the uninstaller
+	# WriteUninstaller "$INSTDIR\${UNINSTALLER_FILENAME}"
+	WriteUninstaller "$INSTDIR\${UNINSTALLER_FILENAME}"
+	# Unload registry plug in
+	${registry::Unload}
+SectionEnd
+
+# Custom install page to select install type
+Function UserOrSysInstall
+    !insertmacro MUI_HEADER_TEXT "Choose Installation Type" "Choose the type of installation \
+    you would like for your computer."
+    
+	nsDialogs::Create 1018
+	Pop $DIALOG
+	
+	# Exit is unable to create dialog
+	${If} $DIALOG == error
+		Abort
+	${EndIf}
+	
+	# Create second radio button for system install
+	#${NSD_CreateRadioButton} 0 10u 100% 33% "Install Raptor for all users on this computer. \
+    #(Recommended).$\nThis option modifies system wide environment variables."
+	#Pop $ALLUSERSINSTALL_HWND
+    
+    # Create first radio button for user install
+    #${NSD_CreateRadioButton} 0 45u 100% 67% "Install Raptor just for me on this computer.\
+    #$\nThis option modifies only user environment variables."
+    #Pop $USERONLYINSTALL_HWND
+	
+	# Create first radio button for system install
+	${NSD_CreateRadioButton} 0 0% 100% 30% "Install Raptor for all users on this computer. \
+    (Recommended).$\nThis option modifies system wide environment variables."
+	Pop $ALLUSERSINSTALL_HWND
+    
+    # Create second radio button for user install
+    ${NSD_CreateRadioButton} 0 25% 100% 30% "Install Raptor just for me on this computer.\
+    $\nThis option modifies only user environment variables."
+    Pop $USERONLYINSTALL_HWND
+    
+    # Create third radio button for file-only install
+    ${NSD_CreateRadioButton} 0 50% 100% 40% "Install, but do not modify the environment.\
+    $\nThis option only unpacks Raptor's files. A batch file in the installation \ 
+    folder (RaptorEnv.bat) can be used to set Raptor's environment variables in a command prompt."
+    Pop $NOENVCHANGES_HWND
+	
+	# Update page control with previous state, if set.
+	# Initially these will be blank, so set system install to be on by default.
+	${If} $USERONLYINSTALL_STATE == ""
+	${AndIf} $ALLUSERSINSTALL_STATE == ""
+    ${AndIf} $NOENVCHANGES_STATE == ""
+		${NSD_SetState} $ALLUSERSINSTALL_HWND ${BST_CHECKED}
+	${Else} # Previously set, user has returned to this page using "Back" button
+		${If} $USERONLYINSTALL_STATE == ${BST_CHECKED}
+			${NSD_SetState} $USERONLYINSTALL_HWND ${BST_CHECKED}
+		${ElseIf} $NOENVCHANGES_STATE == ${BST_CHECKED}
+            ${NSD_SetState} $NOENVCHANGES_HWND ${BST_CHECKED}
+        ${Else}
+			${NSD_SetState} $ALLUSERSINSTALL_HWND ${BST_CHECKED}
+		${EndIf}
+	${EndIf}
+	
+	nsDialogs::Show
+FunctionEnd
+
+# Store the states of the radio buttons once the user has left the page.
+Function UserOrSysInstallLeave
+	${NSD_GetState} $USERONLYINSTALL_HWND $USERONLYINSTALL_STATE
+	${NSD_GetState} $ALLUSERSINSTALL_HWND $ALLUSERSINSTALL_STATE
+    ${NSD_GetState} $NOENVCHANGES_HWND $NOENVCHANGES_STATE
+    
+    # Set the ${INSTALL_TYPE} variable
+    ${If} $USERONLYINSTALL_STATE == ${BST_CHECKED}
+        StrCpy $INSTALL_TYPE "USR"
+    ${EndIf}
+    
+    ${If} $ALLUSERSINSTALL_STATE == ${BST_CHECKED}
+        StrCpy $INSTALL_TYPE "SYS"
+    ${EndIf}
+    
+    ${If} $NOENVCHANGES_STATE == ${BST_CHECKED}
+        StrCpy $INSTALL_TYPE "NO_ENV"
+    ${EndIf}
+    
+    ${Unless} $INSTALL_TYPE == "USR"
+    ${AndUnless} $INSTALL_TYPE == "SYS"
+    ${AndUnless} $INSTALL_TYPE == "NO_ENV"
+        Abort "Failed to determine installation type.\n\
+        $$INSTALL_TYPE = $\"$INSTALL_TYPE$\"."
+    ${EndUnless} 
+FunctionEnd
+
+Function DirLeave
+	StrCpy $0 " "
+	${REQuoteMeta} $9 $0 # $9 now contains the meta-quoted version of $0
+	${If} $INSTDIR =~ $9
+		MessageBox MB_OK|MB_ICONSTOP "Please choose a directory without a space in it."
+		Abort
+	${EndIf}
+FunctionEnd
+
+########################### Uninstaller #########################
+######################## .onInit function ########################
+Function un.onInit
+	!undef DATE_STAMP
+	!insertmacro DefineDateStamp
+FunctionEnd
+########################### Behaviour ###########################
+# Warn on Cancel
+!define MUI_UNABORTWARNING
+# Abort warning text
+!undef MUI_UNABORTWARNING_TEXT
+!define MUI_UNABORTWARNING_TEXT "Are you sure you want to quit the ${INSTALLER_NAME} uninstaller?"
+# Cancel is default button on cancel dialogue boxes.
+!define MUI_UNABORTWARNING_CANCEL_DEFAULT
+# Don't just to final page
+!define MUI_UNFINISHPAGE_NOAUTOCLOSE
+# Show uninstaller details
+ShowUninstDetails show
+
+#################### Pages in the uninstaller ####################
+!insertmacro MUI_UNPAGE_WELCOME
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+!insertmacro MUI_UNPAGE_FINISH
+
+################## Sections in the uninstaller ##################
+# There is only one section in the uninstaller.
+Section "Uninstall"
+    # Delete Raptor
+    RmDir /r $INSTDIR\bin
+    RmDir /r $INSTDIR\examples
+    RmDir /r $INSTDIR\lib
+    RmDir /r $INSTDIR\python
+    RmDir /r $INSTDIR\schema
+    RmDir /r $INSTDIR\win32
+    Delete $INSTDIR\RELEASE-NOTES.txt
+    Delete $INSTDIR\RaptorEnv.bat
+    Delete $INSTDIR\${UNINSTALLER_FILENAME}
+    
+    !undef SYS_REG_BACKUP_FILE
+    !undef USR_REG_BACKUP_FILE
+    !define SYS_REG_BACKUP_FILE "$INSTDIR\SysEnvBackUpPreUninstall-${DATE_STAMP}.reg"
+    !define USR_REG_BACKUP_FILE "$INSTDIR\UsrEnvBackUpPreUninstall-${DATE_STAMP}.reg"
+    
+    # Save System Environment just in case.
+    ${registry::SaveKey} "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "${SYS_REG_BACKUP_FILE}" "" "$RESULT"
+    
+    ${If} $RESULT == 0
+        DetailPrint "Successfully backed up system environment in ${SYS_REG_BACKUP_FILE}."
+    ${Else}
+        DetailPrint "Failed to back up system environment due to an unknown error."
+    ${EndIf}
+    
+    # Save user Environment just in case.
+    ${registry::SaveKey} "HKCU\Environment" "${USR_REG_BACKUP_FILE}" "" "$RESULT"
+    
+    ${If} $RESULT == 0
+        DetailPrint "Successfully backed up user environment in ${USR_REG_BACKUP_FILE}."
+    ${Else}
+        DetailPrint "Failed to back up user environment due to an unknown error."
+    ${EndIf}
+	
+	# Reset error flag
+	ClearErrors
+	
+	# Read user SBS_HOME
+	!insertmacro ReadUsrEnvVar "SBS_HOME" $RESULT
+	
+	${Unless} ${Errors} # No errors, so user %SBS_HOME% exists
+		DetailPrint "Removing user environment variable SBS_HOME ($RESULT)"
+		
+		# Reset error flag
+		ClearErrors
+		!insertmacro RmUsrEnvVar "SBS_HOME"
+		
+		${If} ${Errors}
+			DetailPrint "ERROR: The ${INSTALLER_NAME} uninstaller could not remove the user environment variable SBS_HOME."
+			DetailPrint "Please remove it manually."
+		${EndIf}
+		
+	${Else} # No env var named $SBS_HOME
+		DetailPrint "Note: Unable to find user environment variable SBS_HOME."
+		DetailPrint "If required, this variable may need to be removed manually."
+	${EndUnless}
+	
+	# Reset error flag
+	ClearErrors
+	
+	# Read system SBS_HOME
+	!insertmacro ReadSysEnvVar "SBS_HOME" $RESULT
+	
+	${Unless} ${Errors} # No errors, so system $SBS_HOME exists
+		DetailPrint "Removing system environment variable SBS_HOME ($RESULT)"
+		
+		# Reset error flag
+		ClearErrors
+		!insertmacro RmSysEnvVar "SBS_HOME"
+		
+		${If} ${Errors}
+			DetailPrint "ERROR: The ${INSTALLER_NAME} uninstaller could not remove the \
+            System environment variable SBS_HOME."
+			DetailPrint "Please remove it manually."
+		${EndIf}
+		
+	${Else} # No env var named $SBS_HOME
+		DetailPrint "Note: Unable to find system environment variable SBS_HOME."
+		DetailPrint "If required, this variable may need to be removed manually."
+	${EndUnless}
+	
+	################################# Clean up the path env vars #################################
+	# Reset error flag
+	ClearErrors
+	
+	# Read user path
+	!insertmacro ReadUsrPath $RESULT
+    DetailPrint "Read user Path: $RESULT"
+	
+	${Unless} ${Errors} # No errors, so user $SBS_HOME exists
+		${If} $RESULT == "" # If it came back empty.
+			DetailPrint "No user Path available - nothing to do."
+		${Else}
+            ${If} $RESULT un.=~ "%SBS_HOME%\\bin;" # Only need to act if %SBS_HOME%\bin; is in the Path
+    			DetailPrint "Removing %SBS_HOME%\bin; from user path"
+    			
+    			# Reset error flag and clean user Path
+    			ClearErrors
+    			!insertmacro RemoveFromPathString $RESULT "%SBS_HOME%\bin;"
+    			
+    			DetailPrint "DEBUG: User path $$RESULT = "
+    	        DetailPrint "DEBUG: User path  $RESULT"
+    			
+    			${If} $RESULT == ""
+    				!insertmacro RmUsrEnvVar "Path"
+    			${Else}
+    				# Write cleaned Path to registry
+    	            !insertmacro WriteUsrEnvVarExp "Path" $RESULT
+    			${EndIf}
+    			
+    			${If} ${Errors}
+    				DetailPrint "ERROR: The ${INSTALLER_NAME} uninstaller could not clean the user Path. Please clean it manually."
+    			${EndIf}
+            ${Else}
+                DetailPrint "Nothing to remove from user path."
+            ${EndIf}
+		${EndIf}
+		
+	${Else} # No user path
+		DetailPrint "Note: Unable to find user Path environment variable."
+		DetailPrint "Please check that the variable exists and remove %SBS_HOME\bin manually if required."
+	${EndUnless}
+    
+    # Read system path
+    !insertmacro ReadSysPath $RESULT
+    DetailPrint "Read system Path: $RESULT"
+    
+    ${Unless} ${Errors} # No errors, so system path read OK.
+        ${If} $RESULT un.=~ "%SBS_HOME%\\bin;" # Only need to act if %SBS_HOME%\bin; is in the Path 
+        
+            DetailPrint "Removing %SBS_HOME%\bin; from system path"
+            
+            # Reset error flag
+            ClearErrors
+            !insertmacro RemoveFromPathString $RESULT "%SBS_HOME%\bin;"
+            DetailPrint "DEBUG: System Path $$RESULT = "
+            DetailPrint "DEBUG: System Path $RESULT"
+            ClearErrors
+            # Write cleaned PATH to registry
+            !insertmacro WriteSysEnvVarExp "Path" $RESULT
+            
+            ${If} ${Errors}
+                DetailPrint "ERROR: The ${INSTALLER_NAME} uninstaller could not clean the PATH."
+                DetailPrint "Please clean it manually."
+            ${EndIf}
+        ${Else}
+            DetailPrint "Nothing to remove from system path."
+        ${EndIf}
+    ${Else} # Some error reading system path
+        DetailPrint "Note: Unable to read the system Path environment variable."
+        DetailPrint "Please check that the variable and remove %SBS_HOME\bin manually if required."
+    ${EndUnless}
+	
+	##########################################################################
+	# Refresh environment to get changes for SBS_HOME and PATH
+    !insertmacro RefreshEnv
+	
+	# Unload registry plug in
+	${registry::Unload}
+SectionEnd
+
+# Languages
+!insertmacro MUI_LANGUAGE "English"
+
+################################################ End ################################################