Files
jpexs-decompiler/installer.nsi
2026-02-01 09:09:54 +00:00

619 lines
16 KiB
NSIS

;--------------------------------
;Include Modern UI
!include "MUI2.nsh"
;--------------------------------
;General
;These are defined in Ant script:
!ifndef APP_VER
!define APP_VER "0.0"
!define APP_VER_MAJOR 0
!define APP_VER_MINOR 0
!define APP_URL "https://github.com/jindrapetrik/jpexs-decompiler"
!define APP_PUBLISHER "JPEXS"
!define APP_NAME "JPEXS Free Flash Decompiler"
; !define JRE_VERSION "1.8"
!endif
Unicode true
!define APP_EXENAME "ffdec.exe"
SetCompressor /SOLID lzma
!include "StrFunc.nsh"
!include x64.nsh
!include Integration.nsh
!define APP_SHORTVERNAME "JPEXS FFDec v. ${APP_VER}"
!define APP_VERNAME "${APP_NAME} v. ${APP_VER}"
!define MUI_WELCOMEFINISHPAGE_BITMAP "graphics\installer2_164x314.bmp"
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "graphics\installer2_150x57.bmp"
!define APP_UNINSTKEY "{E618D276-6596-41F4-8A98-447D442A77DB}_is1"
;Name and file
Name "${APP_SHORTVERNAME}"
OutFile "${APP_SETUPFILE}"
;Default installation folder
InstallDir "$PROGRAMFILES\FFDec"
;Get installation folder from registry if available
InstallDirRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}" "InstallLocation"
;Request application privileges for Windows Vista
RequestExecutionLevel admin
;--------------------------------
;Interface Settings
!define MUI_ABORTWARNING
!define MUI_LANGDLL_ALLLANGUAGES
!define MUI_PAGE_CUSTOMFUNCTION_SHOW un.ModifyUnWelcome
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE un.LeaveUnWelcome
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_INSTFILES
!include LogicLib.nsh
; Return on top of stack the total size of the selected (installed) sections, formated as DWORD
; Assumes no more than 256 sections are defined
Var GetInstalledSize.total
Function GetInstalledSize
Push $0
Push $1
StrCpy $GetInstalledSize.total 0
${ForEach} $1 0 256 + 1
${if} ${SectionIsSelected} $1
SectionGetSize $1 $0
IntOp $GetInstalledSize.total $GetInstalledSize.total + $0
${Endif}
; Error flag is set when an out-of-bound section is referenced
${if} ${errors}
${break}
${Endif}
${Next}
ClearErrors
Pop $1
Pop $0
IntFmt $GetInstalledSize.total "0x%08X" $GetInstalledSize.total
Push $GetInstalledSize.total
FunctionEnd
Function GetTime
!define GetTime `!insertmacro GetTimeCall`
!macro GetTimeCall _FILE _OPTION _R1 _R2 _R3 _R4 _R5 _R6 _R7
Push `${_FILE}`
Push `${_OPTION}`
Call GetTime
Pop ${_R1}
Pop ${_R2}
Pop ${_R3}
Pop ${_R4}
Pop ${_R5}
Pop ${_R6}
Pop ${_R7}
!macroend
Exch $1
Exch
Exch $0
Exch
Push $2
Push $3
Push $4
Push $5
Push $6
Push $7
ClearErrors
StrCmp $1 'L' gettime
StrCmp $1 'A' getfile
StrCmp $1 'C' getfile
StrCmp $1 'M' getfile
StrCmp $1 'LS' gettime
StrCmp $1 'AS' getfile
StrCmp $1 'CS' getfile
StrCmp $1 'MS' getfile
goto error
getfile:
IfFileExists $0 0 error
System::Call /NOUNLOAD '*(i,l,l,l,i,i,i,i,&t260,&t14) i .r6'
System::Call /NOUNLOAD 'kernel32::FindFirstFileA(t,i)i(r0,r6) .r2'
System::Call /NOUNLOAD 'kernel32::FindClose(i)i(r2)'
gettime:
System::Call /NOUNLOAD '*(&i2,&i2,&i2,&i2,&i2,&i2,&i2,&i2) i .r7'
StrCmp $1 'L' 0 systemtime
System::Call /NOUNLOAD 'kernel32::GetLocalTime(i)i(r7)'
goto convert
systemtime:
StrCmp $1 'LS' 0 filetime
System::Call /NOUNLOAD 'kernel32::GetSystemTime(i)i(r7)'
goto convert
filetime:
System::Call /NOUNLOAD '*$6(i,l,l,l,i,i,i,i,&t260,&t14)i(,.r4,.r3,.r2)'
System::Free /NOUNLOAD $6
StrCmp $1 'A' 0 +3
StrCpy $2 $3
goto tolocal
StrCmp $1 'C' 0 +3
StrCpy $2 $4
goto tolocal
StrCmp $1 'M' tolocal
StrCmp $1 'AS' tosystem
StrCmp $1 'CS' 0 +3
StrCpy $3 $4
goto tosystem
StrCmp $1 'MS' 0 +3
StrCpy $3 $2
goto tosystem
tolocal:
System::Call /NOUNLOAD 'kernel32::FileTimeToLocalFileTime(*l,*l)i(r2,.r3)'
tosystem:
System::Call /NOUNLOAD 'kernel32::FileTimeToSystemTime(*l,i)i(r3,r7)'
convert:
System::Call /NOUNLOAD '*$7(&i2,&i2,&i2,&i2,&i2,&i2,&i2,&i2)i(.r5,.r6,.r4,.r0,.r3,.r2,.r1,)'
System::Free $7
IntCmp $0 9 0 0 +2
StrCpy $0 '0$0'
IntCmp $1 9 0 0 +2
StrCpy $1 '0$1'
IntCmp $2 9 0 0 +2
StrCpy $2 '0$2'
IntCmp $6 9 0 0 +2
StrCpy $6 '0$6'
StrCmp $4 0 0 +3
StrCpy $4 Sunday
goto end
StrCmp $4 1 0 +3
StrCpy $4 Monday
goto end
StrCmp $4 2 0 +3
StrCpy $4 Tuesday
goto end
StrCmp $4 3 0 +3
StrCpy $4 Wednesday
goto end
StrCmp $4 4 0 +3
StrCpy $4 Thursday
goto end
StrCmp $4 5 0 +3
StrCpy $4 Friday
goto end
StrCmp $4 6 0 error
StrCpy $4 Saturday
goto end
error:
SetErrors
StrCpy $0 ''
StrCpy $1 ''
StrCpy $2 ''
StrCpy $3 ''
StrCpy $4 ''
StrCpy $5 ''
StrCpy $6 ''
end:
Pop $7
Exch $6
Exch
Exch $5
Exch 2
Exch $4
Exch 3
Exch $3
Exch 4
Exch $2
Exch 5
Exch $1
Exch 6
Exch $0
FunctionEnd
!macro StrRPos Var Str Char
Push "${Char}"
Push "${Str}"
Call RIndexOf
Pop $1
StrLen $0 ${Str}
IntOp ${Var} $0 - $1
!macroend
!define StrRPos "!insertmacro StrRPos"
;--------------------------------
;Pages
!insertmacro MUI_PAGE_LICENSE "resources/license.txt"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
;!insertmacro CUSTOM_PAGE_JREINFO
;!insertmacro CUSTOM_PAGE_FLASHINFO
var SMDir
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "${APP_NAME}"
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKLM"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Inno Setup: Icon Group"
!insertmacro MUI_PAGE_STARTMENU 0 $SMDir
;Page custom CUSTOM_PAGE_CONTEXTMENU
!insertmacro MUI_PAGE_INSTFILES
;Page custom CUSTOM_PAGE_HELPUS
!define MUI_FINISHPAGE_RUN "$INSTDIR\${APP_EXENAME}"
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
;--------------------------------
;Languages
!define !IfExist `!insertmacro _!IfExist ""`
!define !IfNExist `!insertmacro _!IfExist "n"`
!macro _!IfExist _OP _FilePath
!ifdef !IfExistIsTrue
!undef !IfExistIsTrue
!endif
!tempfile "!IfExistTmp"
!system `IF EXIST "${_FilePath}" Echo !define "!IfExistIsTrue" > "${!IfExistTmp}"`
!include /NONFATAL "${!IfExistTmp}"
!delfile /NONFATAL "${!IfExistTmp}"
!undef !IfExistTmp
!if${_OP}def !IfExistIsTrue
!macroend
!macro LANG_LOAD LANGLOAD
!insertmacro MUI_LANGUAGE "${LANGLOAD}"
!verbose push
!verbose 0
!include "nsis_locales\${LANGLOAD}.nsh"
!verbose pop
!undef LANG
!macroend
!macro LANG_STRING NAME VALUE
LangString "${NAME}" ${LANG_${LANG}} "${VALUE}"
!macroend
!macro LANG_UNSTRING NAME VALUE
!insertmacro LANG_STRING "un.${NAME}" "${VALUE}"
!macroend
!insertmacro LANG_LOAD "English"
!insertmacro LANG_LOAD "Catalan"
!insertmacro LANG_LOAD "Czech"
!insertmacro LANG_LOAD "Dutch"
!insertmacro LANG_LOAD "French"
!insertmacro LANG_LOAD "German"
!insertmacro LANG_LOAD "Hungarian"
!insertmacro LANG_LOAD "Italian"
!insertmacro LANG_LOAD "Japanese"
!insertmacro LANG_LOAD "Polish"
!insertmacro LANG_LOAD "Portuguese"
!insertmacro LANG_LOAD "PortugueseBR"
!insertmacro LANG_LOAD "SimpChinese"
!insertmacro LANG_LOAD "Slovak"
!insertmacro LANG_LOAD "Slovenian"
!insertmacro LANG_LOAD "Spanish"
!insertmacro LANG_LOAD "Swedish"
!insertmacro LANG_LOAD "Russian"
!insertmacro LANG_LOAD "Turkish"
!insertmacro LANG_LOAD "Ukrainian"
;--------------------------------
;Installer Sections
!macro IfKeyExists ROOT MAIN_KEY KEY
Push $R0
Push $R1
Push $R2
# XXX bug if ${ROOT}, ${MAIN_KEY} or ${KEY} use $R0 or $R1
StrCpy $R1 "0" # loop index
StrCpy $R2 "0" # not found
${Do}
EnumRegKey $R0 ${ROOT} "${MAIN_KEY}" "$R1"
${If} $R0 == "${KEY}"
StrCpy $R2 "1" # found
${Break}
${EndIf}
IntOp $R1 $R1 + 1
${LoopWhile} $R0 != ""
ClearErrors
Exch 2
Pop $R0
Pop $R1
Exch $R2
!macroend
!define REG_CLASSES_HKEY HKLM
var className
!define VERB "ffdec"
!define VERB_NAME "Open with FFDec"
!define VERB_RESOURCE_ID "1001"
var ext
Function un.RemoveExtContextMenu
pop $ext
; ----------- Remove "Open With"
DeleteRegKey ${REG_CLASSES_HKEY} "Software\Classes\Applications\${APP_EXENAME}"
ReadRegStr $className ${REG_CLASSES_HKEY} "Software\Classes\.$ext" ""
IfErrors step2
DeleteRegKey ${REG_CLASSES_HKEY} "Software\Classes\$className\shell\${VERB}"
step2:
DeleteRegKey ${REG_CLASSES_HKEY} "Software\Classes\SystemFileAssociations\.$ext\Shell\${VERB}"
FunctionEnd
Function AddToExtContextMenu
pop $ext
; ------------ Register "Open With"
WriteRegStr ${REG_CLASSES_HKEY} "Software\Classes\Applications\${APP_EXENAME}\shell\open" "" ${VERB}
WriteRegStr ${REG_CLASSES_HKEY} "Software\Classes\Applications\${APP_EXENAME}\shell\open\command" "" '"$INSTDIR\${APP_EXENAME}" "%1"'
WriteRegStr ${REG_CLASSES_HKEY} "Software\Classes\.$ext\OpenWithList\${APP_EXENAME}" "" ""
; ------------ Associate file extension
!insertmacro IfKeyExists ${REG_CLASSES_HKEY} "Software\Classes" ".$ext"
Pop $R0
${If} $R0 == 0
WriteRegStr ${REG_CLASSES_HKEY} "Software\Classes\.$ext" "" "ShockwaveFlash.ShockwaveFlash"
${EndIf}
ReadRegStr $className ${REG_CLASSES_HKEY} "Software\Classes\.$ext" ""
!insertmacro IfKeyExists ${REG_CLASSES_HKEY} "Software\Classes" $className
Pop $R0
${If} $R0 == 0
WriteRegStr ${REG_CLASSES_HKEY} "Software\Classes\$className" "" "Flash Movie"
${EndIf}
WriteRegStr ${REG_CLASSES_HKEY} "Software\Classes\$className\shell\${VERB}" "" "${VERB_NAME}"
WriteRegStr ${REG_CLASSES_HKEY} "Software\Classes\$className\shell\${VERB}\command" "" '"$INSTDIR\${APP_EXENAME}" "%1"'
WriteRegStr ${REG_CLASSES_HKEY} "Software\Classes\$className\shell\${VERB}" "MUIVerb" '@$INSTDIR\${APP_EXENAME},-${VERB_RESOURCE_ID}'
; ----------- Associate global verb - if anybody changes default app, it won't remove the verbs
!insertmacro IfKeyExists ${REG_CLASSES_HKEY} "Software\Classes" "SystemFileAssociations"
Pop $R0
${If} $R0 == 1
WriteRegStr ${REG_CLASSES_HKEY} "Software\Classes\SystemFileAssociations\.$ext\Shell\${VERB}" "" "${VERB_NAME}"
WriteRegStr ${REG_CLASSES_HKEY} "Software\Classes\SystemFileAssociations\.$ext\Shell\${VERB}\Command" "" '"$INSTDIR\${APP_EXENAME}" "%1"'
WriteRegStr ${REG_CLASSES_HKEY} "Software\Classes\SystemFileAssociations\.$ext\Shell\${VERB}" "MUIVerb" '@$INSTDIR\${APP_EXENAME},-${VERB_RESOURCE_ID}'
${EndIf}
FunctionEnd
Section "FFDec" SecDummy
SetShellVarContext all
SetOutPath "$INSTDIR"
File "dist\${APP_EXENAME}"
File "dist\ffdec.bat"
File "dist\ffdec.jar"
File "dist\ffdec-cli.exe"
File "dist\ffdec-cli.jar"
File "dist\icon.ico"
File "dist\license.txt"
File "dist\soleditor.bat"
;File "dist\soleditor.lnk"
File "dist\translator.bat"
;File "dist\translator.lnk"
SetOutPath "$INSTDIR"
File /r "dist\flashlib"
File /r "dist\lib"
;create start-menu items
!insertmacro MUI_STARTMENU_WRITE_BEGIN 0 ;This macro sets $SMDir and skips to MUI_STARTMENU_WRITE_END if the "Don't create shortcuts" checkbox is checked...
CreateDirectory "$SMPROGRAMS\$SMDir"
CreateShortCut "$SMPROGRAMS\$SMDir\Uninstall ${APP_NAME}.lnk" "$INSTDIR\Uninstall.exe" "" "$INSTDIR\Uninstall.exe" 0
CreateShortCut "$SMPROGRAMS\$SMDir\${APP_NAME}.lnk" "$INSTDIR\${APP_EXENAME}" "" "$INSTDIR\${APP_EXENAME}" 0
CreateShortCut "$SMPROGRAMS\$SMDir\$(STRING_SOL_EDITOR).lnk" "$INSTDIR\${APP_EXENAME}" "-soleditor" "$INSTDIR\${APP_EXENAME}" 2
!insertmacro MUI_STARTMENU_WRITE_END
;Store installation folder
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}" "DisplayName" "${APP_NAME}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}" "UninstallString" '"$INSTDIR\Uninstall.exe"'
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}" "QuietUninstallString" '"$INSTDIR\Uninstall.exe" /S'
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}" "DisplayIcon" '"$INSTDIR\${APP_EXENAME}"'
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}" "DisplayVersion" "${APP_VER}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}" "URLInfoAbout" "${APP_URL}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}" "URLUpdateInfo" "${APP_URL}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}" "HelpLink" "${APP_URL}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}" "Publisher" "${APP_PUBLISHER}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}" "InstallLocation" "$INSTDIR"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}" "Inno Setup: Icon Group" "$SMDir"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}" "NSIS: Language" "$language"
Call GetInstalledSize
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}" "EstimatedSize" $GetInstalledSize.total
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}" "MajorVersion" ${APP_VER_MAJOR}
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}" "MinorVersion" ${APP_VER_MINOR}
${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}" "InstallDate" "$2$1$0"
;Create un1installer
WriteUninstaller "$INSTDIR\Uninstall.exe"
;call DownloadAndInstallJREIfNecessary
;call DownloadAndInstallFlashIfNecessary
SectionEnd
Section $(STRING_DESKTOP_SHORTCUT) SecShortcut
SetShellVarContext all
CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "$INSTDIR\${APP_EXENAME}" ""
SectionEnd
Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
IntOp $0 ${SF_SELECTED} | ${SF_RO}
SectionSetFlags ${SecDummy} $0
FunctionEnd
Section "$(STRING_ADD_CONTEXT_MENU)" SecContextMenu
SetRegView 64
Push "swf"
Call AddToExtContextMenu
Push "spl"
Call AddToExtContextMenu
Push "gfx"
Call AddToExtContextMenu
Push "swt"
Call AddToExtContextMenu
Push "swc"
Call AddToExtContextMenu
SetRegView 32
Push "swf"
Call AddToExtContextMenu
Push "spl"
Call AddToExtContextMenu
Push "gfx"
Call AddToExtContextMenu
Push "swt"
Call AddToExtContextMenu
Push "swc"
Call AddToExtContextMenu
${NotifyShell_AssocChanged}
SectionEnd
;--------------------------------
;Descriptions
;Assign language strings to sections
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} "$(STRING_SECTION_APP)"
!insertmacro MUI_DESCRIPTION_TEXT ${SecContextMenu} "$(STRING_SECTION_CONTEXT_MENU)"
!insertmacro MUI_DESCRIPTION_TEXT ${SecShortcut} "$(STRING_SECTION_SHORTCUT)"
!insertmacro MUI_FUNCTION_DESCRIPTION_END
Var mycheckbox
Var uninstlocal
Function un.ModifyUnWelcome
${NSD_CreateCheckbox} 120u -18u 50% 12u "$(STRING_UNINST_USER)"
Pop $mycheckbox
SetCtlColors $mycheckbox "" ${MUI_BGCOLOR}
;${NSD_Check} $mycheckbox ; Check it by default
FunctionEnd
Function un.LeaveUnWelcome
StrCpy $uninstlocal 0
${NSD_GetState} $mycheckbox $0
${If} $0 <> 0
StrCpy $uninstlocal 1
${EndIf}
FunctionEnd
;--------------------------------
;Uninstaller Section
Section "Uninstall"
SetShellVarContext all
RMDir /r "$INSTDIR\*.*"
Delete "$INSTDIR\Uninstall.exe"
RMDir "$INSTDIR"
;Delete Start Menu Shortcuts
Delete "$DESKTOP\${APP_NAME}.lnk"
!insertmacro MUI_STARTMENU_GETFOLDER 0 $SMDir
RmDir /r "$SMPROGRAMS\$SMDir\*.*"
RmDir "$SMPROGRAMS\$SMDir"
SetRegView 64
Push "swf"
Call un.RemoveExtContextMenu
Push "spl"
Call un.RemoveExtContextMenu
Push "gfx"
Call un.RemoveExtContextMenu
Push "swt"
Call un.RemoveExtContextMenu
Push "swc"
Call un.RemoveExtContextMenu
SetRegView 32
Push "swf"
Call un.RemoveExtContextMenu
Push "spl"
Call un.RemoveExtContextMenu
Push "gfx"
Call un.RemoveExtContextMenu
Push "swt"
Call un.RemoveExtContextMenu
Push "swc"
Call un.RemoveExtContextMenu
${NotifyShell_AssocChanged}
StrCmp $uninstlocal 1 0 +5
SetShellVarContext current
RmDir /r "$APPDATA\JPEXS\FFDec\*.*"
RmDir "$APPDATA\JPEXS\FFDec"
RmDir "$APPDATA\JPEXS"
DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APP_UNINSTKEY}"
SectionEnd