diff options
Diffstat (limited to 'Src/installer/winamp/main.nsi')
-rw-r--r-- | Src/installer/winamp/main.nsi | 482 |
1 files changed, 482 insertions, 0 deletions
diff --git a/Src/installer/winamp/main.nsi b/Src/installer/winamp/main.nsi new file mode 100644 index 00000000..2fd35323 --- /dev/null +++ b/Src/installer/winamp/main.nsi @@ -0,0 +1,482 @@ +Unicode true
+!ifdef _DEBUG
+ SetCompress off
+ FileBufSize 64
+ SetDatablockOptimize off
+!else
+ SetDatablockOptimize on
+ !ifdef lzma
+ SetCompressor /SOLID lzma
+ SetCompressorDictSize 16
+ FileBufSize 64
+ !else
+ SetCompressor /SOLID bzip2 ; actually doesnt seem to help :(
+ !endif
+!endif
+
+ReserveFile /plugin "LangDLL.dll"
+ReserveFile /plugin "nsDialogs.dll"
+ReserveFile /plugin "System.dll"
+
+; temp hack 2022 (hard-coded to 32-bit release build - might need e.g. a Winamp_x64_Release version later)
+!ifndef FILES_PATH
+ !define FILES_PATH ..\..\..\Build\Winamp_x86_Release
+; change to this when copied to Winamp-Desktop\Src\Build\Winamp_x86_Release\installer\winamp
+; !define FILES_PATH ..\..\..\Winamp_x86_Release
+!endif
+
+!define MUI_LANGDLL_REGISTRY_ROOT HKLM
+!define MUI_LANGDLL_REGISTRY_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${WINAMP}"
+!define MUI_LANGDLL_REGISTRY_VALUENAME "LangId"
+
+!define MUI_LANGDLL_WINDOWTITLE $(LANGUAGE_DLL_TITLE)
+!define MUI_LANGDLL_INFO $(LANGUAGE_DLL_INFO)
+
+!addincludedir "..\shared\scripts"
+
+!include "MUI2.nsh"
+!include "WordFunc.nsh"
+!include "WinMessages.nsh"
+!include "LogicLib.nsh"
+!include ".\parameters.nsh"
+!include ".\branding.nsh"
+!include "verInfo.nsh"
+!include "WinVer.nsh"
+
+Var SETTINGSDIR
+Var INSTINI
+Var WINAMPINI
+Var WINAMPM3U
+Var M3UBASEDIR
+Var PREVINSTINI
+Var RESTARTAGENT
+Var FIRSTINSTALL
+Var needplaystart
+Var IDX_INSTTYPE_STANDARD
+Var IDX_INSTTYPE_PREVIOUS
+Var IDX_INSTTYPE_FULL
+Var /GLOBAL VERSION_REGISTRY
+Var /GLOBAL VERSION_MINIMUM
+
+!include ".\utils\wafuncs.nsh"
+
+!ifndef _DEBUG
+; BrandingText "Winamp ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_MINOR_SECOND} ${InstallType} -- $(BuiltOn) ${__DATE__} $(at) ${__TIME__}"
+ BrandingText "Winamp ${VERSION_MAJOR}.${VERSION_MINOR} ${InstallType} -- $(BuiltOn) ${__DATE__} $(at) ${__TIME__}"
+!else
+ BrandingText "Winamp Debug -- internal use only"
+!endif
+
+RequestExecutionLevel admin
+Caption $(IDS_CAPTION)
+Name "${WINAMP}"
+InstallDir "$PROGRAMFILES\${WINAMPFOLDER}"
+InstallDirRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${WINAMP}" "UninstallString"
+
+XPStyle on
+
+!define OVERWRITEMODE on
+
+!ifdef _DEBUG
+ ShowInstDetails show
+ AutoCloseWindow false
+!else
+ ShowInstDetails nevershow
+ AutoCloseWindow true
+!endif
+
+SetDateSave on
+
+!define SECTIONIN_FULL "SectionIn 1"
+
+!ifdef FULL
+ !define SECTIONIN_STD "SectionIn 1 2"
+ !define SECTIONIN_LITE "SectionIn 1 2 3"
+!else
+ !define SECTIONIN_STD "SectionIn 1"
+ !define SECTIONIN_LITE "SectionIn 1"
+!endif
+
+!ifndef INSTALL_NAME
+ !define INSTALL_NAME "winamp${VERSION_MAJOR}${VERSION_MINOR}${VERSION_MINOR_SECOND}"
+!endif
+
+!ifdef _DEBUG
+ OutFile "wasetup_dbg${LANG_FILESPEC}.exe"
+!else
+ !ifdef LITE
+ OutFile "$%INSTALL_NAME%_lite${LANG_FILESPEC}.exe"
+ !else ifdef full
+ OutFile "$%INSTALL_NAME%_full${LANG_FILESPEC}.exe"
+ !else
+ OutFile 'winamp_unknown${LANG_FILESPEC}.exe'
+ !endif
+!endif
+
+!include ".\ui.nsh"
+!include ".\sectionsHelper.nsh"
+!include ".\wasections.nsh"
+!include ".\uninstall\uninstall.nsh"
+!include ".\languages.nsh"
+
+Section -LastSection IDX_SECTION_LAST ; keep last section after languages
+SectionEnd
+
+!include ".\uiEvents.nsh"
+!include ".\descriptionTable.nsh"
+
+Function .onInit
+ !ifdef WINAMP64
+ ReadEnvStr $0 PROGRAMW6432
+ StrCpy $INSTDIR "$0\${WINAMPFOLDER}"
+ !endif
+
+ InitPluginsDir
+
+ System::Call "User32::SetProcessDPIAware()"
+
+ StrCpy $PREVINSTINI ""
+ StrCpy $INSTINI "$PLUGINSDIR\install.ini"
+
+ !ifdef LANGID
+ WriteRegStr "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" ${LANGID}
+ !endif ; LANGID
+
+ !insertmacro MUI_LANGDLL_DISPLAY
+
+ ; check Windows version
+ ; this will need testing...
+ ${If} ${AtMostWin7}
+ ${If} ${IsWin7}
+ ${AndIf} ${AtLeastServicePack} 1
+ ${Else}
+ MessageBox MB_OK|MB_ICONEXCLAMATION "$(IDS_MSG_WINDOWS_TOO_OLD)" /SD IDOK
+ Quit
+ ${EndIf}
+ ${EndIf}
+
+; VC142 runtime required for all installations - pt.1: external
+/* ReadRegStr $0 HKLM "SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x86" "Version"
+ ${If} $0 == "v14.29.30139.00"
+ ${OrIf} $0 == "v14.30.30423.00"
+ ${OrIf} $0 == "v14.30.30528.00"
+ ${OrIf} $0 == "v14.30.30704.00"
+ ${OrIf} $0 == "v14.30.*"
+ ${OrIf} $0 == "v14.31.30818.00"
+ ${OrIf} $0 == "v14.31.30919.00"
+ ${OrIf} $0 == "v14.31.31005.00"
+ ${OrIf} $0 == "v14.31.31103.00"
+ ${OrIf} $0 == "v14.31.*"
+ ${OrIf} $0 == "v14.32.31302.00"
+ ${OrIf} $0 == "v14.32.31326.00"
+ ${OrIf} $0 == "v14.32.31332.00"
+ ${OrIf} $0 == "v14.32.*"
+ ${OrIf} $0 == "v14.33.31424.00"
+ ${OrIf} $0 == "v14.33.*"
+ ${OrIf} $0 == "v14.34.*"
+ Goto continue
+*/
+ ; Get Visual Studio Version
+ DetailPrint "Getting Visual Studio Version string from registry..."
+ ReadRegStr $0 HKLM "SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x86" "Version"
+ DetailPrint "Visual Studio Version String: $0"
+ DetailPrint "Done!"
+ DetailPrint ""
+
+ ; Replace v in Version String
+ DetailPrint "Replacing v substring in version string..."
+ ${WordReplace} "$0" "v" "" "+" $0
+ DetailPrint "Visual Studio Version: $0"
+ DetailPrint "Done!"
+ DetailPrint ""
+
+ ; Compare Versions
+ DetailPrint "Comparing Visual Studio Registry and Minimal Versions..."
+ ; ${VersionCompare} "[Version1]" "[Version2]" $var
+ ; "[Version1]" ; REGISTRY VERSION
+ ; "[Version2]" ; MINIMUM VERSION
+ ; $var ; Result:
+ ; $var=0 Versions are equal
+ ; $var=1 Version1 is newer
+ ; $var=2 Version2 is newer
+
+
+ ; Visual Studio Registry Version
+ StrCpy $VERSION_REGISTRY $0
+ DetailPrint " Registry Version: $VERSION_REGISTRY"
+
+ ; Visual Studio Minimal Version
+ StrCpy $VERSION_MINIMUM "14.29.30139.00" ; MINIMUM VERSION!!!
+ ; ===========================================================
+ ; --- DEBUG ---
+ ;StrCpy $VERSION_MINIMUM "14.29.30139.00" ; REGISTRY > MINIMUM
+ ;StrCpy $VERSION_MINIMUM "14.32.31332.00" ; REGISTRY = MINIMUM
+ ;StrCpy $VERSION_MINIMUM "14.33.31424.00" ; REGISTRY < MINIMUM -> INSTALLATION REQUIRED!
+ ; --- DEBUG ---
+ ; ===========================================================
+ DetailPrint " Minimum Version: $VERSION_MINIMUM"
+
+ ${VersionCompare} "$VERSION_REGISTRY" "$VERSION_MINIMUM" $R0
+ DetailPrint "Version Compare Result: $R0"
+
+ ${If} $R0 == 0
+ ${OrIf} $R0 == 1
+ ; Visual C++ Redistributable for Visual Studio 2015 Installation NOT Required!
+ ${If} $R0 == 0
+ DetailPrint "VERSIONS ARE EQUAL ($VERSION_REGISTRY = $VERSION_MINIMUM)"
+ DetailPrint "Visual C++ Redistributable for Visual Studio 2015 Installation NOT Required!"
+ ${Else}
+ DetailPrint "REGISTRY VERSION ($VERSION_REGISTRY) > MINIMUM VERSION ($VERSION_MINIMUM)"
+ DetailPrint "Visual C++ Redistributable for Visual Studio 2015 Installation NOT Required!"
+ ${EndIf}
+ ${Else}
+ ; Visual C++ Redistributable for Visual Studio 2015 Installation Required!
+ DetailPrint "REGISTRY VERSION ($VERSION_REGISTRY) < MINIMUM VERSION ($VERSION_MINIMUM)"
+ DetailPrint "Visual C++ Redistributable for Visual Studio 2015 Installation Required!"
+
+ ; Code for Download and Install vc_redist.x86.exe...
+
+ MessageBox MB_YESNO|MB_ICONQUESTION "$(IDS_MSG_VC_REDIST_LINK_TO_MSDOWNLOAD)$\r$\n$\r$\n$(IDS_VC_REDIST_MSDOWNLOAD_URL)$\r$\n$\r$\n$(IDS_VC_DOWNLOAD)$\r$\n$(IDS_VC_DOWNLOAD_OR_ABORT)" /SD IDYES IDYES download IDNO abortInstaller
+
+ download:
+ SetOutPath "$TEMP"
+ NSISdl::download "https://aka.ms/vs/16/release/vc_redist.x86.exe" "$TEMP\vc_redist.x86.exe"
+ ExecWait "$TEMP\vc_redist.x86.exe"
+ Delete "$TEMP\vc_redist.x86.exe"
+ Goto continue
+
+ abortInstaller:
+ Quit
+
+ continue:
+
+ ${EndIf}
+
+ ${FrenchRadio_OnInit}
+ ${If} ${AtLeastWin7}
+ ${ExpressMode_Initialize}
+ ${EndIf}
+FunctionEnd
+
+Function .onInstSuccess
+ Delete $PREVINSTINI
+ Call SaveSelection
+ DeleteINISec "$INSTINI" "Bundle"
+ CopyFiles /SILENT "$INSTINI" "$INSTDIR\install.ini"
+FunctionEnd
+
+Function un.onInit
+ !insertmacro MUI_UNGETLANGUAGE
+ StrCpy $winamp.uninstall.checkFolder "false"
+FunctionEnd
+
+${InitializeGetSectionName}
+
+Function GetLastInstTypeIndex
+ Push $R0
+ Push $R1
+ StrCpy $R0 0
+loop:
+ InstTypeGetText $R0 $R1
+ StrCmp $R1 '' +3
+ IntOp $R0 $R0 + 1
+ goto loop
+ Pop $R1
+ IntOp $R0 $R0 - 1
+ Exch $R0
+FunctionEnd
+
+Function ReadSections
+ Push $R0
+ Push $R1
+ Push $R2
+ Push $R3
+ Push $R4
+ Push $R5
+ Push $R6
+ Push $R7
+ Push $R8
+ StrCpy $R1 ${IDX_SECTION_LAST}
+ Call GetLastInstTypeIndex
+ Pop $R5
+ StrCpy $R0 1
+ IntOp $R6 $R0 << $R5
+ IntOp $R6 $R6 ~
+
+ StrCpy $R0 0
+
+ ReadINIStr $R8 "$INSTINI" "installer" "sectionsVer"
+
+ loop:
+
+ !ifdef IDX_SEC_ML
+ StrCmp $R0 ${IDX_SEC_ML} skipRead
+ !endif
+
+ !ifdef IDX_SEC_ML_PMP
+ StrCmp $R0 ${IDX_SEC_ML_PMP} skipRead
+ !endif
+
+ ${If} $R8 >= 2
+ ${GetSectionName} $R0 $R2
+ ${Else}
+ SectionGetText $R0 $R2
+ ${EndIf}
+
+ StrCmp $R2 "-" skipRead
+ StrCmp $R2 "" skipRead
+
+ SectionGetFlags $R0 $R3
+ IntOp $R3 $R3 & 0x00000017
+ IntCmp $R3 1 gotoRead gotoRead
+ IntOp $R7 $R3 & 0x00000002 ; check if it is section
+ IntCmp $R7 0 +2
+ StrCpy $R7 $R0 ;remember section index (we can use it later to make it bold)
+ goto skipRead ; skip sections, section end and readonly
+gotoRead:
+ ReadINIStr $R4 "$INSTINI" "sections" $R2
+ ; MessageBox MB_OK "$R2 - $R4"
+ StrCmp $R4 "" 0 normalRead ;new feature or not?
+ IntOp $R4 0x00000000 | 0x0000009 ; new feature make it selected and bold
+ SectionGetFlags $R7 $0
+ IntOp $0 $0 | 0x0000008
+ SectionSetFlags $R7 $0
+normalRead:
+
+ IntOp $R3 $R3 & 0xfffffffe
+ IntOp $R3 $R3 | $R4
+ SectionSetFlags $R0 $R3
+
+ SectionGetInstTypes $R0 $R3
+ IntOp $R3 $R3 & $R6
+ IntOp $R4 $R4 << $R5
+ IntOp $R3 $R3 | $R4
+ SectionSetInstTypes $R0 $R3
+
+skipRead:
+ IntOp $R0 $R0 + 1
+ IntCmp $R0 $R1 "" loop
+ Pop $R8
+ Pop $R7
+ Pop $R6
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Pop $R0
+FunctionEnd
+
+Function SaveSelection
+ Push $R0
+ Push $R1
+ Push $R2
+ Push $R3
+ StrCpy $R1 ${IDX_SECTION_LAST}
+ StrCpy $R0 0
+
+ WriteINIStr "$INSTINI" "installer" "sectionsVer" "2"
+ DeleteINISec "$INSTINI" "sections"
+
+ loop:
+ !ifdef FULL
+ StrCmp $R0 ${IDX_SEC_ML} 0 ignore_1
+ StrCmp $R0 ${IDX_SEC_ML_PMP} 0 ignore_1
+ !endif ; FULL
+ ${GetSectionName} $R0 $R2
+ SectionGetFlags $R0 $R3
+ IntOp $R3 $R3 & 0x0001
+ goto force_write
+!ifdef FULL
+ ignore_1:
+!endif ; FULL
+ ${GetSectionName} $R0 $R2
+ StrCmp $R2 "-" skipWrite
+ StrCmp $R2 "" skipWrite
+
+ SectionGetFlags $R0 $R3
+ IntOp $R3 $R3 & 0x00000017
+ IntCmp $R3 1 0 0 skipWrite ; skip sections, section end and readonly
+ force_write:
+ WriteINIStr "$INSTINI" "sections" $R2 $R3
+skipWrite:
+ IntOp $R0 $R0 + 1
+ IntCmp $R0 $R1 "" loop
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Pop $R0
+FunctionEnd
+
+!ifdef FULL
+Function UpdateAutoSelectSection
+
+ Exch $1 ; section id
+ Exch
+ Exch $0 ; group id
+ Exch
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+
+ StrCpy $2 "1" ; - nesting counter
+ StrCpy $3 "0" ; - sel counter
+ IntOp $0 $0 + 1
+
+ ${Do}
+ SectionGetFlags $0 $4
+ IntOp $5 $4 & 0x0002 ; test if group start
+ ${If} $5 <> 0
+ IntOp $2 $2 + 1
+ ${EndIf}
+
+ IntOp $5 $4 & 0x0004 ; test if group end
+ ${If} $5 <> 0
+ IntOp $2 $2 - 1
+ ${If} $2 == 0
+ ${ExitDo}
+ ${EndIf}
+ ${Else}
+ IntOp $5 $4 & 0x0041 ; test if selected or partial selected
+ ${If} $5 <> 0
+ ${AndIf} $0 <> $1
+ StrCpy $3 "1"
+ ${ExitDo}
+ ${EndIf}
+ ${EndIf}
+
+ IntOp $0 $0 + 1
+ ${Loop}
+
+ SectionGetFlags $1 $4
+ IntOp $4 $4 & 0xFFEF
+ ${If} $3 <> 0
+ IntOp $4 $4 | 0x0011
+ ${EndIf}
+ SectionSetFlags $1 $4
+
+ Pop $5
+ Pop $4
+ Pop $3
+ Exch $2
+ Exch
+ Exch $1
+ Exch 2
+ Exch $0
+FunctionEnd
+
+!macro UpdateAutoSelectSection __groupId __sectionId
+ Push ${__groupId}
+ Push ${__sectionId}
+ Call UpdateAutoSelectSection
+!macroend
+!define UpdateAutoSelectSection "!insertmacro 'UpdateAutoSelectSection'"
+!endif
+
+Function .onSelChange
+ !ifdef FULL
+ ${UpdateAutoSelectSection} ${IDX_GRP_WALIB_PORTABLE} ${IDX_SEC_ML_PMP}
+ ${UpdateAutoSelectSection} ${IDX_GRP_WALIB} ${IDX_SEC_ML}
+ !endif
+FunctionEnd
|