sbsv2/raptor/util/install-windows/raptorinstallerutils.nsh
changeset 0 044383f39525
child 3 e1eecf4d390d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/util/install-windows/raptorinstallerutils.nsh	Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,243 @@
+# 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 header file
+
+!include "WordFunc.nsh"
+
+# Time macros
+!macro DefineDateStamp
+	${time::GetLocalTime} $RESULT
+	${time::TimeString} "$RESULT" $0 $1 $2 $3 $4 $5
+	!define DATE_STAMP "$2-$1-$0-$3-$4-$5"
+!macroend
+
+# Env var manipulation macros
+
+# Macro to refresh the computer's environment by sending Windows the
+# WM_WININICHANGE message so that it re-reads the environment changes
+# the installer has made.
+!macro RefreshEnv
+	DetailPrint "Refreshing your computer's environment..."
+	SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" $RESULT /TIMEOUT=5000
+	DetailPrint "Done."
+!macroend
+
+# Sets ${RESULT} to value of user env var named ${VARNAME}
+!macro ReadUsrEnvVar VARNAME RESULT
+	ReadRegStr ${RESULT} HKCU "Environment" ${VARNAME}
+!macroend
+
+# Sets ${RESULT} to value of system env var named ${VARNAME}
+!macro ReadSysEnvVar VARNAME RESULT
+	ReadRegStr ${RESULT} HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" ${VARNAME}
+!macroend
+
+# Read the env var from the appropriate place
+!macro ReadEnvVar VARNAME RESULT
+	${If} $USERONLYINSTALL_STATE == ${BST_CHECKED}
+		# User env var
+		!insertmacro ReadUsrEnvVar ${VARNAME} ${RESULT}
+	${ElseIf} $ALLUSERSINSTALL_STATE == ${BST_CHECKED}
+		# System env var
+		!insertmacro ReadSysEnvVar ${VARNAME} ${RESULT}
+	${Else}
+		# Something has gone wrong!
+		MessageBox MB_OK|MB_ICONSTOP "Failed to determine installation type (Current User or All Users)."
+	${EndIf}
+!macroend
+
+# Read the user Path
+!macro ReadUsrPath OUTPUT
+	# Reset error flag
+	ClearErrors
+    !insertmacro ReadUsrEnvVar "Path" ${OUTPUT}
+    
+	${If} ${Errors}
+		DetailPrint "User has no Path variable."
+		StrCpy "${OUTPUT}" ""
+	${EndIf}
+!macroend
+
+# Read the user Path
+!macro ReadSysPath OUTPUT
+	# Reset error flag
+	ClearErrors
+	!insertmacro ReadSysEnvVar "Path" ${OUTPUT}
+!macroend
+
+# Read the Path (installer only).
+!macro ReadPath OUTPUT
+${If} $USERONLYINSTALL_STATE == ${BST_CHECKED}
+	# User env var
+	!insertmacro ReadUsrPath ${OUTPUT}
+${ElseIf} $ALLUSERSINSTALL_STATE == ${BST_CHECKED}
+	# System env var
+	!insertmacro ReadSysPath ${OUTPUT}
+${Else}
+	# Something has gone wrong!
+	MessageBox MB_OK|MB_ICONSTOP "Failed to determine installation type (Current User or All Users)."
+${EndIf}
+!macroend
+
+# Writes a string user environment variable to the Registry
+# DO NOT USE FOR WRITING THE PATH ENVIRONMENT VARIABLE. USE THE BELOW MARCOS!
+!macro WriteUsrEnvVar VARNAME VALUE
+	WriteRegStr HKCU "Environment" ${VARNAME} ${VALUE}
+!macroend
+
+# Writes a string system environment variable to the Registry
+# DO NOT USE FOR WRITING THE PATH ENVIRONMENT VARIABLE. USE THE BELOW MARCOS!
+!macro WriteSysEnvVar VARNAME VALUE
+	WriteRegStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" ${VARNAME} ${VALUE}
+!macroend
+
+# Use the following for PATH env var that can expand variables it contains, e.g.
+# Something like 
+# %SBS_HOME%;C:\Windows...
+# should be written to the registry
+# SBS_HOME must NOT be an "expandable string"; in fact expandable strings don't work recursively
+
+# Writes an expandable string user environment variable to the Registry; mostly used for PATH
+!macro WriteUsrEnvVarExp VARNAME VALUE
+	WriteRegExpandStr HKCU "Environment" ${VARNAME} ${VALUE}
+!macroend
+
+# Writes an expandable string system environment variable to the Registry; mostly used for PATH
+!macro WriteSysEnvVarExp VARNAME VALUE
+	WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" ${VARNAME} ${VALUE}
+!macroend
+
+# Deletes a user environment variable from the Registry
+!macro RmUsrEnvVar VARNAME
+	DeleteRegValue HKCU "Environment" ${VARNAME}
+!macroend
+
+# Deletes a system environment variable from the Registry
+!macro RmSysEnvVar VARNAME
+	DeleteRegValue HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" ${VARNAME}
+!macroend
+
+# Push env var name, value of env var, and either "" (for normal string env var) 
+# or "exp" (for expandable env var) onto stack before calling this function
+# in this order
+Function WriteEnvVar
+	pop $2 # Expandable string or not?
+	pop $1 # Env var value
+	pop $0 # Env var name
+		
+	DetailPrint "Going to write evn var $0, with value $1, expandable: $2."
+	
+	# Reset error flag
+	ClearErrors
+	
+	${If} $2 == "exp" # Expandable string env var
+		# Write the env var to the appropriate place
+		${If} $USERONLYINSTALL_STATE == ${BST_CHECKED}
+			DetailPrint "DEBUG $$0 $$1 = $0 $1"
+			# User env var
+			!insertmacro WriteUsrEnvVarExp $0 $1
+		${ElseIf} $ALLUSERSINSTALL_STATE == ${BST_CHECKED}
+			DetailPrint "DEBUG $$0 $$1 = $0 $1"
+			# System env var
+			!insertmacro WriteSysEnvVarExp $0 $1
+		${Else}
+			# Something has gone wrong!
+			MessageBox MB_OK|MB_ICONSTOP "Failed to determine installation type (Current User or All Users)."
+		${EndIf}
+	${Else} # Normal string env var
+		# Write the env var to the appropriate place
+		${If} $USERONLYINSTALL_STATE == ${BST_CHECKED}
+			DetailPrint "DEBUG $$0 $$1 = $0 $1"
+			# User env var
+			!insertmacro WriteUsrEnvVar $0 $1
+		${ElseIf} $ALLUSERSINSTALL_STATE == ${BST_CHECKED}
+			DetailPrint "DEBUG $$0 $$1 = $0 $1"
+			# System env var
+			!insertmacro WriteSysEnvVar $0 $1
+		${Else}
+			# Something has gone wrong!
+			MessageBox MB_OK|MB_ICONSTOP "Failed to determine installation type (Current User or All Users)."
+		${EndIf}
+	${EndIf}
+FunctionEnd
+
+# Prepend the PATH env var with the given string. User/system path is determined using
+# other function.
+Function PrependToPath
+	pop $0 # String to prepend to PATH
+		
+	DetailPrint "Going to prepend PATH with $0."
+	
+	# Reset error flag
+	ClearErrors
+	
+	# Read Path
+	!insertmacro ReadPath $RESULT
+	
+	${Unless} ${Errors} # If no errors
+		${REQuoteMeta} $9 $0 # $9 now contains the meta-quoted version of $0
+		${If} $RESULT !~ $9 # If Path doesn't contain string to add
+			StrLen $RESULT2 "$0;$RESULT"
+			# Warn is Path might be "too" long for the Windows registry.
+			${If} $RESULT2 > 1023
+				DetailPrint "Note: adding %SBS_HOME%\bin; to the start of your Path..."
+				DetailPrint "... will result in a string longer than 1023 characters..."
+				DetailPrint "... being written to your registry. Certain versions of Windows..."
+				DetailPrint "... cannot handle a string that long in the registry. The installer..."
+				DetailPrint "... will continue writing to the registry. However, a back up of..."
+				DetailPrint "... your full environment has been created in your installation directory ..."
+				DetailPrint "... should anything go wrong which can be used to restore your previous Path."
+			${EndIf}
+			
+			Push "Path" # Third on stack
+			Push "$0;$RESULT" # Second on stack
+			Push "exp" # First on stack
+			# Write expandable string to registry
+			call WriteEnvVar
+		${EndIf}
+	${Else}
+		DetailPrint "Error: failed to read Path environment variable."
+	${EndUnless}
+FunctionEnd
+
+# Remove the string STR from the string PATH.
+!macro RemoveFromPathString PATH STR
+	DetailPrint "Going to remove ${STR} from ${PATH}."
+	${WordReplace} "${PATH}" "${STR}" "" "+" $RESULT2
+	DetailPrint "Debug: Replaced ${STR} in RESULT2 = [$RESULT2]"
+	StrCpy ${PATH} "$RESULT2"
+	
+	${WordReplace} "${PATH}" ";;" ";" "+" $RESULT2
+	DetailPrint "Debug: Replaced ;; in RESULT2 = [$RESULT2]"
+	StrCpy ${PATH} $RESULT2
+!macroend
+
+################### Miscellaneous utilities
+# WriteFile - writes a file with given contents
+# FILENAME - full path to file (all directories in path must exist)
+# CONTENTS - string to write to the file.
+!macro WriteFile FILENAME CONTENTS
+	DetailPrint "Creating batch file for setting Raptor's environment..."
+	ClearErrors
+	FileOpen $0 ${FILENAME} w
+	${Unless} ${Errors}
+		FileWrite $0 "${CONTENTS}"
+		FileClose $0
+		DetailPrint "Done."		
+	${Else}
+		DetailPrint "Error: failed to write RaptorEnv.bat."
+	${EndUnless}
+!macroend
+
+################################################ End ################################################