;-------------------------------- ;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