/* init.nsh Initialization functions */ #-------------------------------- # User initialization Var FCLangName Function InitUser # Get FreeCAD language ReadRegStr $FCLangName SHELL_CONTEXT "${APP_REGKEY_SETUP}" "FreeCAD Language" ${If} $FCLangName != "" StrCpy $LangName $FCLangName ${EndIf} FunctionEnd #-------------------------------- # MultiUser custom method Function PostMultiUserPageInit # check if this FreeCAD version is already installed ReadRegStr $0 SHCTX "${APP_UNINST_KEY}" "UninstallString" ${if} $0 != "" # check if the uninstaller was accidentally deleted # if so, don't bother the user if they really want to install a new FreeCAD over an existing one # because they won't have a chance to deny this # remove quotes from uninstaller filename ${TrimQuotes} $0 $0 # skip message box if uninstaller file is missing IfFileExists $0 0 ContinueInstall # installing over an existing installation of the same FreeCAD release is not necessary # if the users does this, they most probably have a problem with FreeCAD that can better be solved # by reinstalling FreeCAD # for beta and other test releases over-installing can even cause errors MessageBox MB_YESNOCANCEL "$(AlreadyInstalled)" /SD IDCANCEL IDYES ContinueInstall IDNO BackToMuiltUserPage Quit BackToMuiltUserPage: Abort ContinueInstall: ${endif} # check if there is an existing FreeCAD installation of the same FreeCAD series # we usually don't release more than 10 versions so with 20 we are safe to check if a newer version is installed IntOp $4 ${APP_VERSION_PATCH} + 20 ${for} $5 0 $4 ReadRegStr $0 SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}${APP_VERSION_MAJOR}${APP_VERSION_MINOR}$5" "DisplayVersion" # also check for an emergency release ${if} $0 == "" ReadRegStr $0 SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}${APP_VERSION_MAJOR}${APP_VERSION_MINOR}$51" "DisplayVersion" ${endif} ${if} $0 != "" StrCpy $R5 $0 # store the read version number StrCpy $OldVersionNumber "${APP_VERSION_MAJOR}${APP_VERSION_MINOR}$5" # we don't stop here because we want the latest installed version ${endif} ${next} # NSIS cannot handle numbers with leading zero, thus cut it off before comparing StrCpy $1 $OldVersionNumber "" 1 StrCpy $2 ${APP_SERIES_KEY} "" 1 ${if} $1 > $2 # store the version number and reformat it temporarily for the error message StrCpy $R0 $OldVersionNumber StrCpy $OldVersionNumber $R5 MessageBox MB_OK|MB_ICONSTOP "$(NewerInstalled)" /SD IDOK StrCpy $OldVersionNumber $R0 Quit ${endif} FunctionEnd #-------------------------------- # visible installer sections Section "!${APP_NAME}" SecCore SectionIn RO SectionEnd Section "$(SecFileAssocTitle)" SecFileAssoc StrCpy $CreateFileAssociations "true" SectionEnd Section "$(SecDesktopTitle)" SecDesktop StrCpy $CreateDesktopIcon "true" SectionEnd # Section descriptions !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SecCore} "$(SecCoreDescription)" !insertmacro MUI_DESCRIPTION_TEXT ${SecFileAssoc} "$(SecFileAssocDescription)" !insertmacro MUI_DESCRIPTION_TEXT ${SecDesktop} "$(SecDesktopDescription)" !insertmacro MUI_FUNCTION_DESCRIPTION_END # .onInit must be here after the section definition because we have to set # the selection states of the dictionary sections Function .onInit ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion ${if} $R0 == "5.0" # 2000 ${orif} $R0 == "5.1" # XP ${orif} $R0 == "5.2" # 2003 ${orif} $R0 == "6.0" # Vista ${orif} $R0 == "6.1" # 7 MessageBox MB_OK|MB_ICONSTOP "${APP_NAME} ${APP_VERSION} requires Windows 8 or newer." /SD IDOK Quit ${endif} # check if it is a 64bit system ${if} ${RunningX64} SetRegView 64 !define LIBRARY_X64 ${endif} # Check that FreeCAD is not currently running ${nsProcess::FindProcess} ${BIN_FREECAD} $R0 # if running result is '0', if not running it is '603' ${if} $R0 == "0" MessageBox MB_OK|MB_ICONSTOP "$(UnInstallRunning)" /SD IDOK Abort ${endif} # plugin must be unloaded ${nsProcess::Unload} # initialize the multi-user installer UI !insertmacro MULTIUSER_INIT # this can be reset to "true" in section SecDesktop StrCpy $CreateDesktopIcon "false" StrCpy $CreateFileAssociations "false" ${IfNot} ${Silent} # Show banner while installer is initializing Banner::show /NOUNLOAD "Checking system" Banner::destroy ${EndIf} # if installer runs silent the post install mode page routine has to be called here ${If} ${Silent} Call PostMultiUserPageInit ${endif} FunctionEnd # this function is called at first after starting the uninstaller Function un.onInit # Macro to investigate name of FreeCAD's preferences folders to be able remove them !insertmacro UnAppPreSuff $AppPre $AppSuff # macro from Utils.nsh !insertmacro MULTIUSER_UNINIT # Check that FreeCAD is not currently running ${nsProcess::FindProcess} ${BIN_FREECAD} $R0 # if running result is '0', if not running it is '603' ${if} $R0 == "0" MessageBox MB_OK|MB_ICONSTOP "$(UnInstallRunning)" /SD IDOK Abort ${endif} # plugin must be unloaded ${nsProcess::Unload} # check if it is a 64bit system ${if} ${RunningX64} SetRegView 64 ${endif} # Ascertain whether the user has sufficient privileges to uninstall. # abort when FreeCAD was installed with admin permissions but the user doesn't have administrator privileges ReadRegStr $0 HKLM "${APP_UNINST_KEY}" "DisplayVersion" ${if} $0 != "" ${andif} $MultiUser.Privileges != "Admin" ${andif} $MultiUser.Privileges != "Power" MessageBox MB_OK|MB_ICONSTOP "$(UnNotAdminLabel)" /SD IDOK Abort ${endif} # warning when FreeCAD couldn't be found in the registry ${if} $0 == "" # check in HKCU ReadRegStr $0 HKCU "${APP_UNINST_KEY}" "DisplayVersion" ${if} $0 == "" MessageBox MB_OK|MB_ICONEXCLAMATION "$(UnNotInRegistryLabel)" /SD IDOK ${endif} ${endif} # question message if the user really wants to uninstall FreeCAD MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "$(UnReallyRemoveLabel)" /SD IDYES IDYES +2 # continue if yes Abort FunctionEnd