Files
jpexs-decompiler/nsis_plugins/JREDyna_Inetc.nsh
2015-06-30 08:33:30 +02:00

272 lines
6.9 KiB
NSIS

; Version 1.0.1
;JPEXS : Added 64 bit support
!ifndef JRE_DECLARES
!define JRE_DECLARES
!include "WordFunc.nsh"
!include "x64.nsh"
!macro CUSTOM_PAGE_JREINFO
Page custom CUSTOM_PAGE_JREINFO
!macroend
!ifndef JRE_VERSION
!error "JRE_VERSION must be defined"
!endif
!ifndef JRE_URL_64
!error "JRE_URL_64 must be defined"
!endif
!ifndef JRE_URL_32
!error "JRE_URL_32 must be defined"
!endif
;;;;;;;;;;;;;;;;;;;;;
; Custom panel
;;;;;;;;;;;;;;;;;;;;;
Function CUSTOM_PAGE_JREINFO
push $0
push $1
push $2
Push "${JRE_VERSION}"
Call DetectJRE
Pop $0
Pop $1
StrCmp $0 "OK" exit
nsDialogs::create /NOUNLOAD 1018
pop $1
StrCmp $0 "0" NoFound
StrCmp $0 "-1" FoundOld
NoFound:
!insertmacro MUI_HEADER_TEXT "JRE Installation Required" "This application requires Java ${JRE_VERSION} or higher"
${NSD_CreateLabel} 0 0 100% 100% "This application requires installation of the Java Runtime Environment. This will be downloaded and installed as part of the installation."
pop $1
goto ShowDialog
FoundOld:
!insertmacro MUI_HEADER_TEXT "JRE Update Required" "This application requires Java ${JRE_VERSION} or higher"
${NSD_CreateLabel} 0 0 100% 100% "This application requires a more recent version of the Java Runtime Environment. This will be downloaded and installed as part of the installation."
pop $1
goto ShowDialog
ShowDialog:
nsDialogs::Show
exit:
pop $2
pop $1
pop $0
FunctionEnd
; Checks to ensure that the installed version of the JRE (if any) is at least that of
; the JRE_VERSION variable. The JRE will be downloaded and installed if necessary
; The full path of java.exe will be returned on the stack
var JRE_URL
Function DownloadAndInstallJREIfNecessary
Push $0
Push $1
DetailPrint "Detecting JRE Version"
Push "${JRE_VERSION}"
Call DetectJRE
Pop $0 ; Get return value from stack
Pop $1 ; get JRE path (or error message)
DetailPrint "JRE Version detection complete - result = $1"
strcmp $0 "OK" End downloadJRE
downloadJRE:
${If} ${RunningX64}
Push ${JRE_URL_64}
${Else}
Push ${JRE_URL_32}
${EndIf}
Pop $JRE_URL
DetailPrint "About to download JRE from $JRE_URL"
Inetc::get "$JRE_URL" "$TEMP\jre_Setup.exe" /END
Pop $0 # return value = exit code, "OK" if OK
DetailPrint "Download result = $0"
strcmp $0 "OK" downloadsuccessful
MessageBox MB_ABORTRETRYIGNORE|MB_ICONSTOP "Cannot download Java. You can download it later manually." /SD IDIGNORE IDRETRY downloadJRE IDIGNORE End
Abort
downloadsuccessful:
DetailPrint "Launching JRE setup"
IfSilent doSilent
ExecWait '"$TEMP\jre_setup.exe" REBOOT=Suppress /L \"$TEMP\jre_setup.log\"' $0
goto jreSetupfinished
doSilent:
ExecWait '"$TEMP\jre_setup.exe" /S REBOOT=Suppress /L \"$TEMP\jre_setup.log\"' $0
jreSetupFinished:
DetailPrint "JRE Setup finished"
Delete "$TEMP\jre_setup.exe"
StrCmp $0 "0" InstallVerif 0
Push "The JRE setup has been abnormally interrupted - return code $0"
Goto ExitInstallJRE
InstallVerif:
DetailPrint "Checking the JRE Setup's outcome"
Push "${JRE_VERSION}"
Call DetectJRE
Pop $0 ; DetectJRE's return value
Pop $1 ; JRE home (or error message if compatible JRE could not be found)
StrCmp $0 "OK" 0 JavaVerStillWrong
Goto JREPathStorage
JavaVerStillWrong:
Push "Unable to find JRE with version above ${JRE_VERSION}, even though the JRE setup was successful$\n$\n$1"
Goto ExitInstallJRE
JREPathStorage:
push $0 ; => rv, r1, r0
exch 2 ; => r0, r1, rv
exch ; => r1, r0, rv
Goto End
ExitInstallJRE:
Pop $1
MessageBox MB_ABORTRETRYIGNORE|MB_ICONSTOP "Unable to install Java. You can installl it later manually.$\n$\n$1" /SD IDIGNORE IDRETRY downloadJRE IDIGNORE End
Pop $1 ; Restore $1
Pop $0 ; Restore $0
Abort
End:
Pop $1 ; Restore $1
Pop $0 ; Restore $0
FunctionEnd
; DetectJRE
; Inputs: Minimum JRE version requested on stack (this value will be overwritten)
; Outputs: Returns two values on the stack:
; First value (rv0): 0 - JRE not found. -1 - JRE found but too old. OK - JRE found and meets version criteria
; Second value (rv1): Problem description. Otherwise - Path to the java runtime (javaw.exe will be at .\bin\java.exe relative to this path)
Function DetectJRE
Exch $0 ; Get version requested
; Now the previous value of $0 is on the stack, and the asked for version of JDK is in $0
Push $1 ; $1 = Java version string (ie 1.5.0)
Push $2 ; $2 = Javahome
Push $3 ; $3 = holds the version comparison result
; stack is now: r3, r2, r1, r0
;DetectJRE64:
SetRegView 64
; first, check for an installed JRE
ReadRegStr $1 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion"
StrCmp $1 "" DetectJDK64
ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment\$1" "JavaHome"
StrCmp $2 "" DetectJDK64
Goto GetJRE
DetectJDK64:
SetRegView 64
; next, check for an installed JDK
ReadRegStr $1 HKLM "SOFTWARE\JavaSoft\Java Development Kit" "CurrentVersion"
StrCmp $1 "" DetectJRE
ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Development Kit\$1" "JavaHome"
StrCmp $2 "" DetectJRE
Goto GetJRE
DetectJRE:
SetRegView 32
; first, check for an installed JRE
ReadRegStr $1 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion"
StrCmp $1 "" DetectJDK
ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment\$1" "JavaHome"
StrCmp $2 "" DetectJDK
Goto GetJRE
DetectJDK:
SetRegView 32
; next, check for an installed JDK
ReadRegStr $1 HKLM "SOFTWARE\JavaSoft\Java Development Kit" "CurrentVersion"
StrCmp $1 "" NoFound
ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Development Kit\$1" "JavaHome"
StrCmp $2 "" NoFound
Goto GetJRE
GetJRE:
SetRegView 32
; ok, we found a JRE, let's compare it's version and make sure it is new enough
; $0 = version requested. $1 = version found. $2 = javaHome
IfFileExists "$2\bin\java.exe" 0 NoFound
${VersionCompare} $0 $1 $3 ; $3 now contains the result of the comparison
DetailPrint "Comparing version $0 to $1 results in $3"
intcmp $3 1 FoundOld
goto FoundNew
NoFound:
; No JRE found
strcpy $0 "0"
strcpy $1 "No JRE Found"
Goto DetectJREEnd
FoundOld:
; An old JRE was found
strcpy $0 "-1"
strcpy $1 "Old JRE found"
Goto DetectJREEnd
FoundNew:
; A suitable JRE was found
strcpy $0 "OK"
strcpy $1 $2
Goto DetectJREEnd
DetectJREEnd:
SetRegView 32
; at this stage, $0 contains rv0, $1 contains rv1
; now, straighten the stack out and recover original values for r0, r1, r2 and r3
; there are two return values: rv0 = -1, 0, OK and rv1 = JRE path or problem description
; stack looks like this:
; r3,r2,r1,r0
Pop $3 ; => r2,r1,r0
Pop $2 ; => r1,r0
Push $0 ; => rv0, r1, r0
Exch 2 ; => r0, r1, rv0
Push $1 ; => rv1, r0, r1, rv0
Exch 2 ; => r1, r0, rv1, rv0
Pop $1 ; => r0, rv1, rv0
Pop $0 ; => rv1, rv0
Exch ; => rv0, rv1
FunctionEnd
!endif ; // JRE_DECLARES