!include "MUI2.nsh" ;-------------------------------- ; The name of the installer Name "Univerxel @CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@.@CMAKE_PROJECT_VERSION_PATCH@" Icon "../resource/package/univerxel.ico" !define MUI_ICON "../resource/package/univerxel.ico" ; Request application privileges for Windows Vista and higher RequestExecutionLevel user ; Build Unicode installer Unicode True SetCompressor /SOLID LZMA ; The default installation directory InstallDir $LOCALAPPDATA\Univerxel ; Registry key to check for directory (so if you install again, it will ; overwrite the old one automatically) InstallDirRegKey HKLM "Software\Univerxel" "Install_Dir" VIAddVersionKey "CompanyName" "Shu" VIAddVersionKey "FileDescription" "Univerxel installer" VIAddVersionKey "ProductName" "Univerxel installer" VIAddVersionKey "LegalCopyright" "MIT - Shu" VIAddVersionKey "FileVersion" "@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@.@CMAKE_PROJECT_VERSION_PATCH@" VIProductVersion "@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@.@CMAKE_PROJECT_VERSION_PATCH@.1" OutFile "Univerxel-installer.exe" ;-------------------------------- ;Variables Var StartMenuFolder ;-------------------------------- ; Pages !define MUI_ABORTWARNING !define MUI_COMPONENTSPAGE_NODESC !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !define MUI_STARTMENUPAGE_DEFAULTFOLDER "Univerxel" !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\Univerxel" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" !insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_LANGUAGE "English" ;-------------------------------- Function WordFind2X !define WordFind2X `!insertmacro WordFind2XCall` !macro WordFind2XCall _STRING _DELIMITER1 _DELIMITER2 _NUMBER _RESULT Push `${_STRING}` Push `${_DELIMITER1}` Push `${_DELIMITER2}` Push `${_NUMBER}` Call WordFind2X Pop ${_RESULT} !macroend Exch $2 Exch Exch $1 Exch Exch 2 Exch $0 Exch 2 Exch 3 Exch $R0 Exch 3 Push $3 Push $4 Push $5 Push $6 Push $7 Push $8 Push $9 Push $R1 Push $R2 ClearErrors StrCpy $R2 '' StrCpy $3 $2 1 StrCpy $2 $2 '' 1 StrCmp $3 'E' 0 +3 StrCpy $R2 E goto -4 StrCmp $3 '+' +5 StrCmp $3 '-' +4 StrCmp $3 '#' restart StrCmp $3 '/' restart goto error3 StrCpy $4 $2 2 -2 StrCmp $4 '{{' +9 StrCmp $4 '}}' +8 StrCmp $4 '{*' +7 StrCmp $4 '*{' +6 StrCmp $4 '*}' +5 StrCmp $4 '}*' +4 StrCmp $4 '{}' +3 StrCpy $4 '' goto +2 StrCpy $2 $2 -2 IntOp $2 $2 + 0 StrCmp $2 0 error2 restart: StrCmp $R0 '' error1 StrCpy $5 -1 StrCpy $6 0 StrCpy $7 '' StrLen $8 $0 StrLen $9 $1 loop: IntOp $5 $5 + 1 delim1: StrCpy $R1 $R0 $8 $5 StrCmp $R1$6 0 error1 StrCmp $R1 '' minus StrCmp $R1 $0 +2 StrCmp $7 '' loop delim2 StrCmp $0 $1 0 +2 StrCmp $7 '' 0 delim2 IntOp $7 $5 + $8 StrCpy $5 $7 goto delim1 delim2: StrCpy $R1 $R0 $9 $5 StrCmp $R1 $1 0 loop IntOp $6 $6 + 1 StrCmp $3$6 '+$2' plus StrCmp $3 '/' 0 nextword IntOp $R1 $5 - $7 StrCpy $R1 $R0 $R1 $7 StrCmp $R1 $2 0 +3 StrCpy $R1 $6 goto end nextword: IntOp $5 $5 + $9 StrCpy $7 '' goto delim1 minus: StrCmp $3 '-' 0 sum StrCpy $3 + IntOp $2 $6 - $2 IntOp $2 $2 + 1 IntCmp $2 0 error2 error2 restart sum: StrCmp $3 '#' 0 error2 StrCpy $R1 $6 goto end plus: StrCmp $4 '' 0 +4 IntOp $R1 $5 - $7 StrCpy $R1 $R0 $R1 $7 goto end IntOp $5 $5 + $9 IntOp $7 $7 - $8 StrCmp $4 '{*' +2 StrCmp $4 '*{' 0 +3 StrCpy $R1 $R0 $5 goto end StrCmp $4 '*}' +2 StrCmp $4 '}*' 0 +3 StrCpy $R1 $R0 '' $7 goto end StrCmp $4 '}}' 0 +3 StrCpy $R1 $R0 '' $5 goto end StrCmp $4 '{{' 0 +3 StrCpy $R1 $R0 $7 goto end StrCmp $4 '{}' 0 error3 StrCpy $5 $R0 '' $5 StrCpy $7 $R0 $7 StrCpy $R1 '$7$5' goto end error3: StrCpy $R1 3 goto error error2: StrCpy $R1 2 goto error error1: StrCpy $R1 1 error: StrCmp $R2 'E' 0 +3 SetErrors end: StrCpy $R0 $R1 Pop $R2 Pop $R1 Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 Exch $R0 FunctionEnd ; The stuff to install Section "Check updates" upretry: inetc::get /canceltext "Skip updates !" "https://framagit.org/api/v4/projects/67835/packages?page=1&per_page=1&sort=desc&order_by=created_at&package_type=generic&package_name=Univerxel" "$TEMP\packages.json" /end Pop $0 StrCmp $0 "OK" updlok DetailPrint "Failed to check updates: $0" MessageBox MB_ABORTRETRYIGNORE|MB_ICONEXCLAMATION "Failed to check updates, click IGNORE to skip updates" IDIGNORE upskip IDRETRY upretry Abort updlok: FileOpen $4 "$TEMP\packages.json" r FileRead $4 $1 FileClose $4 Delete "$TEMP\packages.json" ${WordFind2X} $1 `"version":"` `"` "E+1" $R0 IfErrors 0 upcmp upmal: DetailPrint "Malformed pacakges: $R0" MessageBox MB_ABORTRETRYIGNORE|MB_ICONEXCLAMATION "Failed to check updates, click IGNORE to skip updates" IDIGNORE upskip IDRETRY upretry upcmp: StrCpy $4 $R0 StrCmp $4 "@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@.@CMAKE_PROJECT_VERSION_PATCH@" upskip upfound upfound: DetailPrint "Update found: $R0" ${WordFind2X} $1 `"web_path":"` `"` "E+1" $R0 IfErrors upmal 0 StrCpy $3 $R0 MessageBox MB_YESNO|MB_ICONINFORMATION "Version: $4 found, click YES to download new one" IDNO upskip ExecShell "open" "https://framagit.org/$3" SW_SHOWNORMAL upskip: DetailPrint "Updates check done" SectionEnd Section "Dependencies" SectionIn RO SetOutPath $INSTDIR File "package\libcrypto-1_1-x64.dll" File "package\openssl-license.txt" ; Write the installation path into the registry WriteRegStr HKLM SOFTWARE\Univerxel "Install_Dir" "$INSTDIR" ; Write the uninstall keys for Windows WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Univerxel" "DisplayName" "Univerxel" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Univerxel" "UninstallString" '"$INSTDIR\uninstall.exe"' WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Univerxel" "NoModify" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Univerxel" "NoRepair" 1 WriteUninstaller "$INSTDIR\uninstall.exe" !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateDirectory "$SMPROGRAMS\$StartMenuFolder" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd Section "All in one" SetOutPath $INSTDIR File "Release\univerxel.exe" File /r content SetOverwrite off File /oname=config.toml "..\resource\package\config.full.toml" SetOverwrite on !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Univerxel (Full).lnk" "$INSTDIR\univerxel.exe" !insertmacro MUI_STARTMENU_WRITE_END !define MUI_FINISHPAGE_RUN "$INSTDIR\univerxel.exe" !define MUI_FINISHPAGE_RUN_NOTCHECKED SectionEnd Section /o "Client" SetOutPath $INSTDIR File "Release\univerxel-client.exe" File /r /x *.pem /x *.dict content SetOverwrite off File /oname=config.toml "..\resource\package\config.client.toml" SetOverwrite on !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Univerxel (Client).lnk" "$INSTDIR\univerxel-client.exe" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd Section /o "Server" SetOutPath $INSTDIR File "Release\univerxel-server.exe" CreateDirectory "$INSTDIR\content" File /oname=content\cert.pem content\cert.pem File /oname=content\key.pem content\key.pem File /oname=content\zstd.dict content\zstd.dict SetOverwrite off File /oname=config.toml "..\resource\package\config.server.toml" SetOverwrite on !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Univerxel (Server).lnk" "$INSTDIR\univerxel-server.exe" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd ;-------------------------------- ; Uninstaller Section "Uninstall" ; Remove registry keys DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Univerxel" DeleteRegKey HKLM SOFTWARE\Univerxel ; Remove files and uninstaller Delete "$INSTDIR\libcrypto-1_1-x64.dll" Delete "$INSTDIR\openssl-license.txt" Delete "$INSTDIR\univerxel.exe" Delete "$INSTDIR\univerxel-client.exe" Delete "$INSTDIR\univerxel-server.exe" RMDir /r "$INSTDIR\content" Delete "$INSTDIR\uninstall.exe" ; Remove shortcuts, if any !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder Delete "$SMPROGRAMS\$StartMenuFolder\*.lnk" ; Remove directories RMDir /r "$SMPROGRAMS\$StartMenuFolder" RMDir /r "$INSTDIR" DeleteRegKey /ifempty HKCU "Software\Univerxel" SectionEnd