From 890f998fe003b58a9537cb4ef2ccb44f23544a50 Mon Sep 17 00:00:00 2001 From: antelle Date: Sat, 9 Jan 2021 17:14:56 +0100 Subject: [PATCH] updating support in win32 installer --- package/nsis/check-running.nsh | 46 +++++++++++-------- package/nsis/defines.nsh | 26 ++++++----- package/nsis/includes.nsh | 13 +++--- package/nsis/main.nsi | 84 +++++++++++++++++++++++----------- 4 files changed, 105 insertions(+), 64 deletions(-) diff --git a/package/nsis/check-running.nsh b/package/nsis/check-running.nsh index d709516d..92ff0392 100755 --- a/package/nsis/check-running.nsh +++ b/package/nsis/check-running.nsh @@ -1,21 +1,29 @@ -!macro EnsureAppIsNotRunning - ${Do} - nsExec::ExecToStack /OEM 'tasklist /NH /FI "IMAGENAME eq ${PRODUCT_EXE}"' - Pop $0 - ${If} $0 != 0 - DetailPrint "Error checking ${PRODUCT_EXE}: $0" +!macro EnsureAppIsNotRunning + Var /GLOBAL retryNumEnsureAppIsNotRunning + ${For} $retryNumEnsureAppIsNotRunning 0 1000 + DetailPrint "Checking if ${PRODUCT_EXE} is running..." + nsExec::ExecToStack /OEM 'tasklist /NH /FI "IMAGENAME eq ${PRODUCT_EXE}"' + Pop $0 + ${If} $0 != 0 + DetailPrint "Error checking ${PRODUCT_EXE}: $0" MessageBox MB_ICONSTOP|MB_OK "Failed to check whether process is running" /SD IDOK - Quit - ${EndIf} - Pop $1 + Quit + ${EndIf} + Pop $1 ${StrStr} $0 $1 "${PRODUCT_EXE}" - ${If} $0 == "" - DetailPrint "${PRODUCT_EXE} is not running" - ${ExitDo} - ${Else} - MessageBox MB_ICONQUESTION|MB_OKCANCEL|MB_DEFBUTTON1 "To proceed, please close ${PRODUCT_NAME} and click OK" /SD IDCANCEL IDOK ok - Quit - ok: - ${EndIf} - ${Loop} -!macroend + ${If} $0 == "" + DetailPrint "${PRODUCT_EXE} is not running" + ${ExitFor} + ${Else} + ${If} $isUpdaterMode == 1 + ${AndIf} $retryNumEnsureAppIsNotRunning < 5 + DetailPrint "${PRODUCT_EXE} is running, waiting..." + Sleep 1000 + ${Else} + MessageBox MB_ICONQUESTION|MB_OKCANCEL|MB_DEFBUTTON1 "To proceed, please close ${PRODUCT_NAME} and click OK" /SD IDCANCEL IDOK ok + Quit + ok: + ${EndIf} + ${EndIf} + ${Next} +!macroend diff --git a/package/nsis/defines.nsh b/package/nsis/defines.nsh index eab30481..97a709f5 100755 --- a/package/nsis/defines.nsh +++ b/package/nsis/defines.nsh @@ -1,20 +1,22 @@ -!define PRODUCT_NAME "KeeWeb" -!define PRODUCT_VERSION "${version}" -!define PRODUCT_PUBLISHER "KeeWeb" -!define PRODUCT_WEB_SITE "${homepage}" -!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" -!define PRODUCT_UNINST_ROOT_KEY "HKLM" +Unicode True + +!define PRODUCT_NAME "KeeWeb" +!define PRODUCT_VERSION "${version}" +!define PRODUCT_PUBLISHER "KeeWeb" +!define PRODUCT_WEB_SITE "${homepage}" +!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" +!define PRODUCT_UNINST_ROOT_KEY "HKLM" !define PRODUCT_EXE "KeeWeb.exe" !define PRODUCT_UNINST_TEMP_EXE "KeeWebUninst.exe" - -!define MUI_ABORTWARNING + +!define MUI_ABORTWARNING !define MUI_ICON "graphics\icon.ico" !define MUI_FINISHPAGE_RUN "$INSTDIR\${PRODUCT_EXE}" -!define MULTIUSER_EXECUTIONLEVEL Highest -!define MULTIUSER_MUI -!define MULTIUSER_INSTALLMODE_COMMANDLINE - +!define MULTIUSER_EXECUTIONLEVEL Highest +!define MULTIUSER_MUI +!define MULTIUSER_INSTALLMODE_COMMANDLINE + SetCompressor lzma Name "${PRODUCT_NAME}" OutFile "${output}" diff --git a/package/nsis/includes.nsh b/package/nsis/includes.nsh index eebcc595..d5108d41 100755 --- a/package/nsis/includes.nsh +++ b/package/nsis/includes.nsh @@ -1,10 +1,11 @@ -!include MultiUser.nsh -!include MUI2.nsh -!include Util.nsh -!include x64.nsh -!include nsDialogs.nsh +!include MultiUser.nsh +!include MUI2.nsh +!include Util.nsh +!include x64.nsh +!include nsDialogs.nsh !include LogicLib.nsh !include StrFunc.nsh !include WinVer.nsh - +!include FileFunc.nsh + !include package\nsis\lib\FileAssoc.nsh diff --git a/package/nsis/main.nsi b/package/nsis/main.nsi index b958bdd9..c026efd6 100755 --- a/package/nsis/main.nsi +++ b/package/nsis/main.nsi @@ -7,22 +7,35 @@ !define MUI_FINISHPAGE_SHOWREADME_TEXT "Create a Shortcut on Desktop" !define MUI_FINISHPAGE_SHOWREADME_FUNCTION FinishPageCheckboxCheckedAction +!define MUI_PAGE_CUSTOMFUNCTION_PRE AbortIfInUpdaterMode !insertmacro MUI_PAGE_WELCOME + #!insertmacro MULTIUSER_PAGE_INSTALLMODE + +!define MUI_PAGE_CUSTOMFUNCTION_PRE AbortIfInUpdaterMode !insertmacro MUI_PAGE_DIRECTORY + !insertmacro MUI_PAGE_INSTFILES + +!define MUI_PAGE_CUSTOMFUNCTION_PRE AbortIfInUpdaterMode !insertmacro MUI_PAGE_FINISH !insertmacro MUI_LANGUAGE "English" +Var /GLOBAL isUpdaterMode + Function .onInit + ${GetOptions} $CMDLINE "/U" $isUpdaterMode + ${If} ${IsNativeAMD64} ${If} ${arch} != "x64" MessageBox MB_ICONSTOP|MB_OK "Please use a 64-bit installer on a 64-bit system" Quit ${EndIf} SetRegView 64 - StrCpy $InstDir "$PROGRAMFILES64\${PRODUCT_NAME}" + ${If} $isUpdaterMode != 1 + StrCpy $InstDir "$PROGRAMFILES64\${PRODUCT_NAME}" + ${EndIf} ${EndIf} ${If} ${IsNativeARM64} @@ -30,7 +43,9 @@ Function .onInit MessageBox MB_ICONSTOP|MB_OK "Please use an ARM64 installer on an ARM64 system" Quit ${EndIf} - StrCpy $InstDir "$PROGRAMFILES64\${PRODUCT_NAME}" + ${If} $isUpdaterMode != 1 + StrCpy $InstDir "$PROGRAMFILES64\${PRODUCT_NAME}" + ${EndIf} ${EndIf} ${If} ${IsNativeIA32} @@ -55,6 +70,12 @@ Function .onInit !insertmacro MULTIUSER_INIT FunctionEnd +Function AbortIfInUpdaterMode + ${If} $isUpdaterMode == 1 + abort + ${EndIf} +FunctionEnd + Function FinishPageCheckboxCheckedAction CreateShortCut "$DESKTOP\KeeWeb.lnk" "$INSTDIR\${PRODUCT_EXE}" FunctionEnd @@ -64,20 +85,22 @@ Section "MainSection" SEC01 SetOverwrite on - ReadRegStr $R0 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" - ${If} $R0 != "" - CopyFiles "$R0" "$TEMP\${PRODUCT_UNINST_TEMP_EXE}" - ExecWait '"$TEMP\${PRODUCT_UNINST_TEMP_EXE}" /S' - ${EndIf} + ${If} $isUpdaterMode != 1 + ReadRegStr $R0 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" + ${If} $R0 != "" + CopyFiles "$R0" "$TEMP\${PRODUCT_UNINST_TEMP_EXE}" + ExecWait '"$TEMP\${PRODUCT_UNINST_TEMP_EXE}" /S' + ${EndIf} - ReadRegStr $R0 "HKCU" "${PRODUCT_UNINST_KEY}" "QuietUninstallString" - ${If} $R0 != "" - ExecWait '$R0' - ${EndIf} + ReadRegStr $R0 "HKCU" "${PRODUCT_UNINST_KEY}" "QuietUninstallString" + ${If} $R0 != "" + ExecWait '$R0' + ${EndIf} - ReadRegStr $R0 "HKCU" "${PRODUCT_UNINST_KEY}" "UninstallString" - ${If} $R0 != "" - ExecWait '$R0' + ReadRegStr $R0 "HKCU" "${PRODUCT_UNINST_KEY}" "UninstallString" + ${If} $R0 != "" + ExecWait '$R0' + ${EndIf} ${EndIf} SetOutPath "$INSTDIR" @@ -85,21 +108,28 @@ Section "MainSection" SEC01 File /r "tmp\desktop\KeeWeb-win32-${arch}\*" Delete "$INSTDIR\resources\app\*.*" RMDir /r "$INSTDIR\resources\app" - CreateDirectory "$SMPROGRAMS\KeeWeb" - CreateShortCut "$SMPROGRAMS\KeeWeb\KeeWeb.lnk" "$INSTDIR\${PRODUCT_EXE}" - !insertmacro APP_ASSOCIATE "kdbx" "kdbxfile" "KeePass Password Database" \ - "$INSTDIR\${PRODUCT_EXE},0" "Open with KeeWeb" "$INSTDIR\${PRODUCT_EXE} $\"%1$\"" - !insertmacro UPDATEFILEASSOC + ${If} $isUpdaterMode != 1 + CreateDirectory "$SMPROGRAMS\KeeWeb" + CreateShortCut "$SMPROGRAMS\KeeWeb\KeeWeb.lnk" "$INSTDIR\${PRODUCT_EXE}" + + !insertmacro APP_ASSOCIATE "kdbx" "kdbxfile" "KeePass Password Database" \ + "$INSTDIR\${PRODUCT_EXE},0" "Open with KeeWeb" "$INSTDIR\${PRODUCT_EXE} $\"%1$\"" + !insertmacro UPDATEFILEASSOC + ${EndIf} SectionEnd Section -Post - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" '"$INSTDIR\uninst.exe"' - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "QuietUninstallString" '"$INSTDIR\uninst.exe" /S' - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_EXE}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "InstallDir" "$INSTDIR" + ${If} $isUpdaterMode == 1 + Exec '"$WINDIR\explorer.exe" "$INSTDIR\${PRODUCT_EXE}"' + ${Else} + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" '"$INSTDIR\uninst.exe"' + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "QuietUninstallString" '"$INSTDIR\uninst.exe" /S' + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_EXE}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "InstallDir" "$INSTDIR" + ${EndIf} SectionEnd