diff -r 000000000000 -r 044383f39525 sbsv2/raptor/util/install-windows/raptorinstallerutils.nsh --- /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 ################################################