From 48bf7fbbadd6bbff82d40247ebcd673891dbbcfb Mon Sep 17 00:00:00 2001 From: sr55 Date: Sun, 23 May 2010 17:32:45 +0000 Subject: WinGui: - Improvements to the Installer. (Both Nightly and Primary nsi scripts) * Check for .NET 3.5 SP1 and if it doesn't exist, download and run the web Installer * Uninstall the current version before trying to install the new version. git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@3319 b64f7644-9d1e-0410-96f1-a4d463321fa5 --- win/C#/Installer/Installer.nsi | 223 +++++++++++++++++++++++++++++----- win/C#/Installer/MakeNightly.nsi.tmpl | 223 +++++++++++++++++++++++++++++----- 2 files changed, 388 insertions(+), 58 deletions(-) (limited to 'win/C#') diff --git a/win/C#/Installer/Installer.nsi b/win/C#/Installer/Installer.nsi index b24c47278..3a17b335a 100644 --- a/win/C#/Installer/Installer.nsi +++ b/win/C#/Installer/Installer.nsi @@ -14,6 +14,11 @@ !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" +;Required .NET framework +!define MIN_FRA_MAJOR "3" +!define MIN_FRA_MINOR "5" +!define MIN_FRA_BUILD "*" + SetCompressor lzma ; MUI 1.67 compatible ------ @@ -51,45 +56,72 @@ OutFile "HandBrake-${PRODUCT_VERSION_NUMBER}-Win_GUI.exe" !insertmacro VersionCompare !include LogicLib.nsh -; Check to see if .NET Framework 2.0 or above is Installed. +InstallDir "$PROGRAMFILES\Handbrake" +InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" +ShowInstDetails show +ShowUnInstDetails show + +Var InstallDotNET + Function .onInit - Call GetDotNETVersion - Pop $0 - ${If} $0 == "not found" - MessageBox MB_OK|MB_ICONSTOP ".NET runtime library is not installed. $\r$\n You can download .Net Framework 2.0 redistributable from the microsoft website. $\r$\n Alternatively you can use google for a direct download URL" - Abort - ${EndIf} - StrCpy $0 $0 "" 1 # skip "v" + ; Begin Only allow one version + System::Call 'kernel32::CreateMutexA(i 0, i 0, t "myMutex") i .r1 ?e' + Pop $R0 - ${VersionCompare} $0 "2.0" $1 - ${If} $1 == 2 - MessageBox MB_OK|MB_ICONSTOP ".NET runtime library v2.0 or newer is required. You have $0. $\r$\n You can download .Net Framework 2.0 redistributable from the Microsoft website. $\r$\n Alternatively you can use google for a direct download URL" - Abort - ${EndIf} -FunctionEnd + StrCmp $R0 0 +3 + MessageBox MB_OK|MB_ICONEXCLAMATION "The installer is already running." + Abort -Function GetDotNETVersion - Push $0 - Push $1 + ;Remove previous version + ReadRegStr $R0 HKLM \ + "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}\" \ + "UninstallString" + StrCmp $R0 "" done - System::Call "mscoree::GetCORVersion(w .r0, i ${NSIS_MAX_STRLEN}, *i) i .r1 ?u" - StrCmp $1 "error" 0 +2 - StrCpy $0 "not found" + MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \ + "${PRODUCT_NAME} ${PRODUCT_VERSION} is already installed. $\n$\nClick `OK` to remove the \ + previous version or `Cancel` to continue." \ + IDOK uninst + goto done - Pop $1 - Exch $0 + ;Run the uninstaller + uninst: + Exec $INSTDIR\uninst.exe + done: FunctionEnd -InstallDir "$PROGRAMFILES\Handbrake" -InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" -ShowInstDetails show -ShowUnInstDetails show - Section "Handbrake" SEC01 SetOutPath "$INSTDIR" SetOverwrite ifnewer + + ; Begin Check .NET version + StrCpy $InstallDotNET "No" + Call CheckFramework + StrCmp $0 "1" +3 + StrCpy $InstallDotNET "Yes" + MessageBox MB_OK|MB_ICONINFORMATION "${PRODUCT_NAME} requires that the .NET Framework 3.5 SP1 is installed. The latest .NET Framework will be downloaded and installed automatically during installation of ${PRODUCT_NAME}." + Pop $0 + + ; Get .NET if required + ${If} $InstallDotNET == "Yes" + SetDetailsView hide + inetc::get /caption "Downloading .NET Framework 3.5" /canceltext "Cancel" "http://www.microsoft.com/downloads/info.aspx?na=90&p=&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=ab99342f-5d1a-413d-8319-81da479ab0d7&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f0%2f6%2f1%2f061f001c-8752-4600-a198-53214c69b51f%2fdotnetfx35setup.exe" "$INSTDIR\dotnetfx.exe" /end + Pop $1 + + ${If} $1 != "OK" + Delete "$INSTDIR\dotnetfx.exe" + Abort "Installation cancelled, ${PRODUCT_NAME} requires the .NET 3.5 Framework" + ${EndIf} + + ExecWait "$INSTDIR\dotnetfx.exe" + Delete "$INSTDIR\dotnetfx.exe" + + SetDetailsView show + ${EndIf} + + ; Install Files File "Handbrake.exe" CreateDirectory "$SMPROGRAMS\Handbrake" CreateShortCut "$SMPROGRAMS\Handbrake\Handbrake.lnk" "$INSTDIR\Handbrake.exe" @@ -127,7 +159,6 @@ Section -Post WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" SectionEnd - Function un.onUninstSuccess HideWindow MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was successfully removed from your computer." @@ -167,4 +198,138 @@ Section Uninstall DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" SetAutoClose true -SectionEnd \ No newline at end of file +SectionEnd + +;Check for .NET framework +Function CheckFrameWork + + ;Save the variables in case something else is using them + Push $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push $R1 + Push $R2 + Push $R3 + Push $R4 + Push $R5 + Push $R6 + Push $R7 + Push $R8 + + StrCpy $R5 "0" + StrCpy $R6 "0" + StrCpy $R7 "0" + StrCpy $R8 "0.0.0" + StrCpy $0 0 + + loop: + + ;Get each sub key under "SOFTWARE\Microsoft\NET Framework Setup\NDP" + EnumRegKey $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP" $0 + StrCmp $1 "" done ;jump to end if no more registry keys + IntOp $0 $0 + 1 + StrCpy $2 $1 1 ;Cut off the first character + StrCpy $3 $1 "" 1 ;Remainder of string + + ;Loop if first character is not a 'v' + StrCmpS $2 "v" start_parse loop + + ;Parse the string + start_parse: + StrCpy $R1 "" + StrCpy $R2 "" + StrCpy $R3 "" + StrCpy $R4 $3 + + StrCpy $4 1 + + parse: + StrCmp $3 "" parse_done ;If string is empty, we are finished + StrCpy $2 $3 1 ;Cut off the first character + StrCpy $3 $3 "" 1 ;Remainder of string + StrCmp $2 "." is_dot not_dot ;Move to next part if it's a dot + + is_dot: + IntOp $4 $4 + 1 ; Move to the next section + goto parse ;Carry on parsing + + not_dot: + IntCmp $4 1 major_ver + IntCmp $4 2 minor_ver + IntCmp $4 3 build_ver + IntCmp $4 4 parse_done + + major_ver: + StrCpy $R1 $R1$2 + goto parse ;Carry on parsing + + minor_ver: + StrCpy $R2 $R2$2 + goto parse ;Carry on parsing + + build_ver: + StrCpy $R3 $R3$2 + goto parse ;Carry on parsing + + parse_done: + + IntCmp $R1 $R5 this_major_same loop this_major_more + this_major_more: + StrCpy $R5 $R1 + StrCpy $R6 $R2 + StrCpy $R7 $R3 + StrCpy $R8 $R4 + + goto loop + + this_major_same: + IntCmp $R2 $R6 this_minor_same loop this_minor_more + this_minor_more: + StrCpy $R6 $R2 + StrCpy $R7 R3 + StrCpy $R8 $R4 + goto loop + + this_minor_same: + IntCmp $R3 $R7 loop loop this_build_more + this_build_more: + StrCpy $R7 $R3 + StrCpy $R8 $R4 + goto loop + + done: + + ;Have we got the framework we need? + IntCmp $R5 ${MIN_FRA_MAJOR} max_major_same fail OK + max_major_same: + IntCmp $R6 ${MIN_FRA_MINOR} max_minor_same fail OK + max_minor_same: + IntCmp $R7 ${MIN_FRA_BUILD} OK fail OK + + ;Version on machine is greater than what we need + OK: + StrCpy $0 "1" + goto end + + fail: + StrCmp $R8 "0.0.0" end + + + end: + + ;Pop the variables we pushed earlier + Pop $R8 + Pop $R7 + Pop $R6 + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Pop $4 + Pop $3 + Pop $2 + Pop $1 +FunctionEnd \ No newline at end of file diff --git a/win/C#/Installer/MakeNightly.nsi.tmpl b/win/C#/Installer/MakeNightly.nsi.tmpl index 26f177d53..c9000192e 100644 --- a/win/C#/Installer/MakeNightly.nsi.tmpl +++ b/win/C#/Installer/MakeNightly.nsi.tmpl @@ -14,6 +14,11 @@ !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" +;Required .NET framework +!define MIN_FRA_MAJOR "3" +!define MIN_FRA_MINOR "5" +!define MIN_FRA_BUILD "*" + SetCompressor lzma ; MUI 1.67 compatible ------ @@ -51,45 +56,71 @@ OutFile "HandBrake-${PRODUCT_VERSION_NUMBER}-Win_GUI.exe" !insertmacro VersionCompare !include LogicLib.nsh -; Check to see if .NET Framework 2.0 or above is Installed. -Function .onInit - Call GetDotNETVersion - Pop $0 - ${If} $0 == "not found" - MessageBox MB_OK|MB_ICONSTOP ".NET runtime library is not installed. $\r$\n You can download .Net Framework 2.0 redistributable from the microsoft website. $\r$\n Alternatively you can use google for a direct download URL" - Abort - ${EndIf} +InstallDir "$PROGRAMFILES\Handbrake" +InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" +ShowInstDetails show +ShowUnInstDetails show - StrCpy $0 $0 "" 1 # skip "v" +Var InstallDotNET - ${VersionCompare} $0 "2.0" $1 - ${If} $1 == 2 - MessageBox MB_OK|MB_ICONSTOP ".NET runtime library v2.0 or newer is required. You have $0. $\r$\n You can download .Net Framework 2.0 redistributable from the Microsoft website. $\r$\n Alternatively you can use google for a direct download URL" - Abort - ${EndIf} -FunctionEnd +Function .onInit -Function GetDotNETVersion - Push $0 - Push $1 + ; Begin Only allow one version + System::Call 'kernel32::CreateMutexA(i 0, i 0, t "myMutex") i .r1 ?e' + Pop $R0 - System::Call "mscoree::GetCORVersion(w .r0, i ${NSIS_MAX_STRLEN}, *i) i .r1 ?u" - StrCmp $1 "error" 0 +2 - StrCpy $0 "not found" + StrCmp $R0 0 +3 + MessageBox MB_OK|MB_ICONEXCLAMATION "The installer is already running." + Abort - Pop $1 - Exch $0 -FunctionEnd + ;Remove previous version + ReadRegStr $R0 HKLM \ + "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}\" \ + "UninstallString" + StrCmp $R0 "" done + MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \ + "${PRODUCT_NAME} ${PRODUCT_VERSION} is already installed. $\n$\nClick `OK` to remove the \ + previous version or `Cancel` to continue." \ + IDOK uninst + goto done -InstallDir "$PROGRAMFILES\Handbrake" -InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" -ShowInstDetails show -ShowUnInstDetails show + ;Run the uninstaller + uninst: + Exec $INSTDIR\uninst.exe + done: +FunctionEnd Section "Handbrake" SEC01 SetOutPath "$INSTDIR" SetOverwrite ifnewer + + ; Begin Check .NET version + StrCpy $InstallDotNET "No" + Call CheckFramework + StrCmp $0 "1" +3 + StrCpy $InstallDotNET "Yes" + MessageBox MB_OK|MB_ICONINFORMATION "${PRODUCT_NAME} requires that the .NET Framework 3.5 SP1 is installed. The latest .NET Framework will be downloaded and installed automatically during installation of ${PRODUCT_NAME}." + Pop $0 + + ; Get .NET if required + ${If} $InstallDotNET == "Yes" + SetDetailsView hide + inetc::get /caption "Downloading .NET Framework 3.5" /canceltext "Cancel" "http://www.microsoft.com/downloads/info.aspx?na=90&p=&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=ab99342f-5d1a-413d-8319-81da479ab0d7&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f0%2f6%2f1%2f061f001c-8752-4600-a198-53214c69b51f%2fdotnetfx35setup.exe" "$INSTDIR\dotnetfx.exe" /end + Pop $1 + + ${If} $1 != "OK" + Delete "$INSTDIR\dotnetfx.exe" + Abort "Installation cancelled, ${PRODUCT_NAME} requires the .NET 3.5 Framework" + ${EndIf} + + ExecWait "$INSTDIR\dotnetfx.exe" + Delete "$INSTDIR\dotnetfx.exe" + + SetDetailsView show + ${EndIf} + + File "Handbrake.exe" CreateDirectory "$SMPROGRAMS\Handbrake" CreateShortCut "$SMPROGRAMS\Handbrake\Handbrake.lnk" "$INSTDIR\Handbrake.exe" @@ -146,4 +177,138 @@ Section Uninstall DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" SetAutoClose true -SectionEnd \ No newline at end of file +SectionEnd + +;Check for .NET framework +Function CheckFrameWork + + ;Save the variables in case something else is using them + Push $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push $R1 + Push $R2 + Push $R3 + Push $R4 + Push $R5 + Push $R6 + Push $R7 + Push $R8 + + StrCpy $R5 "0" + StrCpy $R6 "0" + StrCpy $R7 "0" + StrCpy $R8 "0.0.0" + StrCpy $0 0 + + loop: + + ;Get each sub key under "SOFTWARE\Microsoft\NET Framework Setup\NDP" + EnumRegKey $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP" $0 + StrCmp $1 "" done ;jump to end if no more registry keys + IntOp $0 $0 + 1 + StrCpy $2 $1 1 ;Cut off the first character + StrCpy $3 $1 "" 1 ;Remainder of string + + ;Loop if first character is not a 'v' + StrCmpS $2 "v" start_parse loop + + ;Parse the string + start_parse: + StrCpy $R1 "" + StrCpy $R2 "" + StrCpy $R3 "" + StrCpy $R4 $3 + + StrCpy $4 1 + + parse: + StrCmp $3 "" parse_done ;If string is empty, we are finished + StrCpy $2 $3 1 ;Cut off the first character + StrCpy $3 $3 "" 1 ;Remainder of string + StrCmp $2 "." is_dot not_dot ;Move to next part if it's a dot + + is_dot: + IntOp $4 $4 + 1 ; Move to the next section + goto parse ;Carry on parsing + + not_dot: + IntCmp $4 1 major_ver + IntCmp $4 2 minor_ver + IntCmp $4 3 build_ver + IntCmp $4 4 parse_done + + major_ver: + StrCpy $R1 $R1$2 + goto parse ;Carry on parsing + + minor_ver: + StrCpy $R2 $R2$2 + goto parse ;Carry on parsing + + build_ver: + StrCpy $R3 $R3$2 + goto parse ;Carry on parsing + + parse_done: + + IntCmp $R1 $R5 this_major_same loop this_major_more + this_major_more: + StrCpy $R5 $R1 + StrCpy $R6 $R2 + StrCpy $R7 $R3 + StrCpy $R8 $R4 + + goto loop + + this_major_same: + IntCmp $R2 $R6 this_minor_same loop this_minor_more + this_minor_more: + StrCpy $R6 $R2 + StrCpy $R7 R3 + StrCpy $R8 $R4 + goto loop + + this_minor_same: + IntCmp $R3 $R7 loop loop this_build_more + this_build_more: + StrCpy $R7 $R3 + StrCpy $R8 $R4 + goto loop + + done: + + ;Have we got the framework we need? + IntCmp $R5 ${MIN_FRA_MAJOR} max_major_same fail OK + max_major_same: + IntCmp $R6 ${MIN_FRA_MINOR} max_minor_same fail OK + max_minor_same: + IntCmp $R7 ${MIN_FRA_BUILD} OK fail OK + + ;Version on machine is greater than what we need + OK: + StrCpy $0 "1" + goto end + + fail: + StrCmp $R8 "0.0.0" end + + + end: + + ;Pop the variables we pushed earlier + Pop $R8 + Pop $R7 + Pop $R6 + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Pop $4 + Pop $3 + Pop $2 + Pop $1 +FunctionEnd \ No newline at end of file -- cgit v1.2.3