status-react/deployment/windows/nsis/setup.nsi

1035 lines
27 KiB
Plaintext

;--------------------------------
; Build environment
;--------------------------------
;Unicode true
;!define top_srcdir @top_srcdir@
;!define base_image_dir ""
;!define srcdir @srcdir@
!define VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_BUILD}
!define VERSION_FULL ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_BUILD}.0
;!define PUBLISHER "Status.im"
;!define WEBSITE_URL "https://status.im/"
!define AppUserModelId "StatusIm.Status.Desktop.1" ; app.id must match ID in modules/react-native-desktop-notification/desktop/desktopnotification.cpp
!define SnoreToastExe "$INSTDIR\SnoreToast.exe"
!define AppLinkFileName "Status.lnk"
!define AppExeName "Status.exe"
!define UninstallExeName "Uninstall.exe"
!define UninstallLinkName "Uninstall.lnk"
!define NodeJsServerExeName "ubuntu-server.exe"
!define SetupExeFileName "Status-x86_64-setup.exe"
!define OrgRegistryKeyPath "Software\${PUBLISHER}"
!define AppRegistryKeyPath "${OrgRegistryKeyPath}\Status Desktop"
!define UninstallRegKeyPath "Software\Microsoft\Windows\CurrentVersion\Uninstall\Status Desktop"
!addplugindir plugins/x86-ansi
;--------------------------------
;General
;--------------------------------
;Name and file
Name "Status Desktop ${VERSION}"
OutFile "${top_srcdir}/${SetupExeFileName}"
SetCompressor /FINAL ${COMPRESSION_TYPE} ${COMPRESSION_ALGO}
; Default installation folder
InstallDir "$PROGRAMFILES64\${PUBLISHER}"
; Get installation folder from registry if available
InstallDirRegKey HKLM "${AppRegistryKeyPath}" ""
RequestExecutionLevel user
!define DUMP_KEY "SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
;--------------------------------
; Include Modern UI and functions
;--------------------------------
!include "MUI2.nsh"
!include "WordFunc.nsh"
!include "Library.nsh"
!include "WinVer.nsh"
!include "FileFunc.nsh"
; !include "Memento.nsh"
!include "StrFunc.nsh"
!include "include/UAC.nsh"
!include "include/SnoreNotify.nsh"
!include "include/nsProcess.nsh"
${StrRep}
;--------------------------------
; Installer's VersionInfo
;--------------------------------
VIProductVersion "${VERSION_FULL}"
VIAddVersionKey "CompanyName" "${PUBLISHER}"
VIAddVersionKey "ProductName" "Status Desktop"
VIAddVersionKey "ProductVersion" "${VERSION}"
VIAddVersionKey "FileDescription" "Status Desktop Client"
VIAddVersionKey "FileVersion" "${VERSION}"
VIAddVersionKey "LegalCopyright" "${PUBLISHER}"
VIAddVersionKey "OriginalFilename" "${SetupExeFileName}"
;--------------------------------
; Required functions
;--------------------------------
!insertmacro GetParameters
!insertmacro GetOptions
!insertmacro un.GetParameters
!insertmacro un.GetOptions
;--------------------------------
;Variables
;--------------------------------
Var MUI_TEMP
Var STARTMENU_FOLDER
Var PREVIOUS_INSTALLDIR
Var PREVIOUS_VERSION
Var PREVIOUS_VERSION_STATE
Var REINSTALL_UNINSTALL
Var ALL_USERS_DEFAULT
Var ALL_USERS
Var IS_ADMIN
Var USERNAME
Var PERFORM_UPDATE
Var SKIPLICENSE
Var SKIPUAC
Var GetInstalledSize.total
Var OldRunDir
Var CommandLine
Var Quiet
;--------------------------------
;Interface Settings
;--------------------------------
!define MUI_ICON "${top_srcdir}/deployment/windows/status.ico"
;!define MUI_UNICON "${srcdir}/uninstall.ico"
!define MUI_ABORTWARNING
;--------------------------------
;Memento settings
;--------------------------------
;!define MEMENTO_REGISTRY_ROOT SHELL_CONTEXT
;!define MEMENTO_REGISTRY_KEY "${AppRegistryKeyPath}"
;--------------------------------
;Pages
!define MUI_PAGE_CUSTOMFUNCTION_PRE PageDirectoryPre
!insertmacro MUI_PAGE_DIRECTORY
; Start Menu Folder Page Configuration
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "${AppRegistryKeyPath}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Startmenu"
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "Status Desktop"
!define MUI_PAGE_CUSTOMFUNCTION_PRE PageStartmenuPre
!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE PostInstPage
!insertmacro MUI_PAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_PRE un.ConfirmPagePre
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_PRE un.FinishPagePre
!insertmacro MUI_UNPAGE_FINISH
Function GetUserInfo
ClearErrors
UserInfo::GetName
${If} ${Errors}
StrCpy $IS_ADMIN 1
Return
${EndIf}
Pop $USERNAME
${If} ${UAC_IsAdmin}
StrCpy $IS_ADMIN 1
${Else}
StrCpy $IS_ADMIN 0
${EndIf}
FunctionEnd
Function UpdateShellVarContext
${If} $ALL_USERS == 1
SetShellVarContext all
DetailPrint "Installing for all users"
${Else}
SetShellVarContext current
DetailPrint "Installing for current user"
${EndIf}
FunctionEnd
!Macro MessageBoxImpl options text sdreturn checks
${If} $Quiet == 1
MessageBox ${options} `${text}` ${checks}
${Else}
MessageBox ${options} `${text}` /SD ${sdreturn} ${checks}
${Endif}
!MacroEnd
!define MessageBox `!insertmacro MessageBoxImpl`
Function ReadAllUsersCommandline
${GetOptions} $CommandLine "/user" $R1
${Unless} ${Errors}
${If} $R1 == "current"
${OrIf} $R1 == "=current"
StrCpy $ALL_USERS 0
${ElseIf} $R1 == "all"
${OrIf} $R1 == "=all"
StrCpy $ALL_USERS 1
${Else}
${MessageBox} MB_ICONSTOP "Invalid option for /user. Has to be either /user=all or /user=current" IDOK ''
Abort
${EndIf}
${EndUnless}
Call UpdateShellVarContext
FunctionEnd
Function CheckPrevInstallDirExists
${If} $PREVIOUS_INSTALLDIR != ""
; Make sure directory is valid
Push $R0
Push $R1
StrCpy $R0 "$PREVIOUS_INSTALLDIR" "" -1
${If} $R0 == '\'
${OrIf} $R0 == '/'
StrCpy $R0 $PREVIOUS_INSTALLDIR*.*
${Else}
StrCpy $R0 $PREVIOUS_INSTALLDIR\*.*
${EndIf}
${IfNot} ${FileExists} $R0
StrCpy $PREVIOUS_INSTALLDIR ""
${EndIf}
Pop $R1
Pop $R0
${EndIf}
FunctionEnd
Function ReadPreviousVersion
ReadRegStr $PREVIOUS_INSTALLDIR HKLM "${AppRegistryKeyPath}" ""
Call CheckPrevInstallDirExists
${If} $PREVIOUS_INSTALLDIR != ""
; Detect version
ReadRegStr $PREVIOUS_VERSION HKLM "${AppRegistryKeyPath}" "Version"
${If} $PREVIOUS_VERSION != ""
StrCpy $ALL_USERS 1
SetShellVarContext all
return
${EndIf}
${EndIf}
ReadRegStr $PREVIOUS_INSTALLDIR HKCU "${AppRegistryKeyPath}" ""
Call CheckPrevInstallDirExists
${If} $PREVIOUS_INSTALLDIR != ""
; Detect version
ReadRegStr $PREVIOUS_VERSION HKCU "${AppRegistryKeyPath}" "Version"
${If} $PREVIOUS_VERSION != ""
StrCpy $ALL_USERS 0
SetShellVarContext current
return
${EndIf}
${EndIf}
FunctionEnd
Function LoadPreviousSettings
; Component selection
;${MementoSectionRestore}
; Startmenu
!define ID "Application"
!ifdef MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME
ReadRegStr $mui.StartMenuPage.RegistryLocation "${MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME}"
${if} $mui.StartMenuPage.RegistryLocation != ""
StrCpy "$STARTMENU_FOLDER" $mui.StartMenuPage.RegistryLocation
${else}
StrCpy "$STARTMENU_FOLDER" ""
${endif}
!undef ID
!endif
${If} $PREVIOUS_INSTALLDIR != ""
StrCpy $INSTDIR $PREVIOUS_INSTALLDIR
${EndIf}
FunctionEnd
Function ReadUpdateCommandline
${GetOptions} $CommandLine "/update" $R1
${If} ${Errors}
StrCpy $PERFORM_UPDATE 0
${Else}
StrCpy $PERFORM_UPDATE 1
${EndIf}
FunctionEnd
Function ReadSkipLicense
${GetOptions} $CommandLine "/skiplicense" $R1
${If} ${Errors}
StrCpy $SKIPLICENSE 0
${Else}
StrCpy $SKIPLICENSE 1
${EndIf}
FunctionEnd
Function ReadSkipUAC
${GetOptions} $CommandLine "/skipuac" $R1
${If} ${Errors}
StrCpy $SKIPUAC 0
${Else}
StrCpy $SKIPUAC 1
${EndIf}
FunctionEnd
Function ReadQuiet
${GetOptions} $CommandLine "/quiet" $R1
${If} ${Errors}
StrCpy $Quiet 0
${Else}
StrCpy $Quiet 1
SetSilent silent
${EndIf}
FunctionEnd
Function .onInit
Pop $OldRunDir
; Store command line
${GetParameters} $CommandLine
Call ReadQuiet
${Unless} ${AtLeastWin7}
${MessageBox} MB_YESNO|MB_ICONSTOP "Unsupported operating system.$\nStatus Desktop ${VERSION} requires at least Windows 7 and may not work correctly on your system.$\nDo you really want to continue with the installation?" IDNO 'IDYES installonoldwindows'
Abort
installonoldwindows:
${EndUnless}
${Unless} ${RunningX64}
${MessageBox} MB_OK|MB_ICONSTOP "Unsupported operating system.$\nThis is the installer for the 64bit version of Status Desktop ${VERSION} and does not run on your operating system which is only 32bit." IDOK ''
Abort
${EndUnless}
Call ReadSkipUAC
${If} $SKIPUAC != 1
uac_tryagain:
!insertmacro UAC_RunElevated
${Switch} $0
${Case} 0
${IfThen} $1 = 1 ${|} Quit ${|} ;we are the outer process, the inner process has done its work, we are done.
${IfThen} $3 <> 0 ${|} ${Break} ${|} ;we are admin, let the show go on
${If} $2 = 3 ;RunAs completed successfully, but with a non-admin user
MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND "Status Desktop setup requires admin privileges, try again" /SD IDNO IDYES uac_tryagain IDNO 0
${EndIf}
;fall-through and die
${Case} 1223
; User aborted elevation, continue regardless
${Break}
${Default}
${MessageBox} mb_iconstop "Could not elevate process (errorcode $0), continuing with normal user privileges." IDOK ''
${Break}
${EndSwitch}
; The UAC plugin changes the error level even in the inner process, reset it.
SetErrorLevel -1
${EndIf}
; /update argument
Call ReadUpdateCommandline
Call ReadSkipLicense
Call GetUserInfo
; Initialize $ALL_USERS with default value
${If} $IS_ADMIN == 1
StrCpy $ALL_USERS 1
${Else}
StrCpy $ALL_USERS 0
${EndIf}
Call UpdateShellVarContext
; See if previous version exists
; This can change ALL_USERS
Call ReadPreviousVersion
${If} $PREVIOUS_VERSION != ""
StrCpy $REINSTALL_UNINSTALL 1
${EndIf}
; Load _all_ previous settings.
; Need to do it now as up to now, $ALL_USERS was possibly reflecting a
; previous installation. After this call, $ALL_USERS reflects the requested
; installation mode for this installation.
Call LoadPreviousSettings
Call ReadAllUsersCommandline
${If} $ALL_USERS == 1
${If} $IS_ADMIN == 0
${If} $PREVIOUS_VERSION != ""
${MessageBox} MB_ICONSTOP "Status Desktop has been previously installed for all users.$\nPlease restart the installer with Administrator privileges." IDOK ''
Abort
${Else}
${MessageBox} MB_ICONSTOP "Cannot install for all users.$\nPlease restart the installer with Administrator privileges." IDOK ''
Abort
${EndIf}
${EndIf}
${EndIf}
${If} $PREVIOUS_VERSION == ""
StrCpy $PERFORM_UPDATE 0
DetailPrint "No previous version of Status Desktop was found"
${Else}
Push "${VERSION}"
Push $PREVIOUS_VERSION
Call StatusVersionCompare
DetailPrint "Found previous version: $PREVIOUS_VERSION"
DetailPrint "Installing $PREVIOUS_VERSION_STATE version ${VERSION}"
${EndIf}
StrCpy $ALL_USERS_DEFAULT $ALL_USERS
FunctionEnd
Function StatusVersionCompare
Exch $1
Exch
Exch $0
Push $2
Push $3
Push $4
versioncomparebegin:
${If} $0 == ""
${AndIf} $1 == ""
StrCpy $PREVIOUS_VERSION_STATE "same"
goto versioncomparedone
${EndIf}
StrCpy $2 0
StrCpy $3 0
; Parse rc / beta suffixes for segments
StrCpy $4 $0 2
${If} $4 == "rc"
StrCpy $2 100
StrCpy $0 $0 "" 2
${Else}
StrCpy $4 $0 4
${If} $4 == "beta"
StrCpy $0 $0 "" 4
${Else}
StrCpy $2 10000
${EndIf}
${EndIf}
StrCpy $4 $1 2
${If} $4 == "rc"
StrCpy $3 100
StrCpy $1 $1 "" 2
${Else}
StrCpy $4 $1 4
${If} $4 == "beta"
StrCpy $1 $1 "" 4
${Else}
StrCpy $3 10000
${EndIf}
${EndIf}
split1loop:
StrCmp $0 "" split1loopdone
StrCpy $4 $0 1
StrCpy $0 $0 "" 1
StrCmp $4 "." split1loopdone
StrCmp $4 "-" split1loopdone
StrCpy $2 $2$4
goto split1loop
split1loopdone:
split2loop:
StrCmp $1 "" split2loopdone
StrCpy $4 $1 1
StrCpy $1 $1 "" 1
StrCmp $4 "." split2loopdone
StrCmp $4 "-" split2loopdone
StrCpy $3 $3$4
goto split2loop
split2loopdone:
${If} $2 > $3
StrCpy $PREVIOUS_VERSION_STATE "newer"
${ElseIf} $3 > $2
StrCpy $PREVIOUS_VERSION_STATE "older"
${Else}
goto versioncomparebegin
${EndIf}
versioncomparedone:
Pop $4
Pop $3
Pop $2
Pop $1
Pop $0
FunctionEnd
Function PageDirectoryPre
${If} $PERFORM_UPDATE == 1
Abort
${EndIf}
${If} $REINSTALL_UNINSTALL == "1"
${AndIf} $PREVIOUS_VERSION_STATE != "same"
Abort
${EndIf}
FunctionEnd
Function PageStartmenuPre
${If} $PERFORM_UPDATE == 1
Abort
${EndIf}
${If} $REINSTALL_UNINSTALL == "1"
${AndIf} $PREVIOUS_VERSION_STATE != "same"
${If} "$STARTMENU_FOLDER" == ""
StrCpy "$STARTMENU_FOLDER" ">"
${EndIf}
Abort
${EndIf}
FunctionEnd
Function .OnInstFailed
FunctionEnd
Function .onInstSuccess
;${MementoSectionSave}
; Detect multiple install directories
${If} $OldRunDir != ''
${GetFileVersion} $OldRunDir $R0
${GetFileVersion} "$INSTDIR\${AppExeName}" $R1
StrCpy $R2 $OldRunDir -14
${If} $R0 != ''
${AndIf} $R1 != ''
${AndIf} $R0 != $R1
${MessageBox} MB_ICONEXCLAMATION 'Multiple installations of Status Desktop detected.$\n$\nStatus Desktop ${VERSION} has been installed to "$InstDir".$\nAn old installation of Status Desktop $R0 still exists in the "$R2" directory.$\n$\nPlease delete the old version in the "$R2" directory.' IDOK ''
${EndIf}
${EndIf}
FunctionEnd
;--------------------------------
; Languages
;--------------------------------
!insertmacro MUI_LANGUAGE "English"
;--------------------------------
;Installer Sections
;--------------------------------
Section "Status Desktop" SecMain
;SectionIn 1 RO
${nsProcess::FindProcess} "${NodeJsServerExeName}" $R0
${If} $R0 == 0
DetailPrint "${NodeJsServerExeName} is running. Closing it down"
${nsProcess::CloseProcess} "${NodeJsServerExeName}" $R0
DetailPrint "Waiting for ${NodeJsServerExeName} to close"
Sleep 2000
${Else}
DetailPrint "${NodeJsServerExeName} was not found to be running"
${EndIf}
${nsProcess::Unload}
SetOutPath "$INSTDIR"
File "${top_srcdir}\.env"
File "${top_srcdir}\node_modules\node-notifier\vendor\snoreToast\SnoreToast.exe"
File /r "${top_srcdir}\desktop\bin\"
File /r "${base_image_dir}\"
SetOutPath "$INSTDIR\notifier"
File "${top_srcdir}\node_modules\node-notifier\vendor\notifu\*.exe"
SetOutPath "$INSTDIR\assets\resources\fonts"
File /r "${top_srcdir}\resources\fonts\"
SetOutPath "$INSTDIR\assets\desktop\resources"
File /r "${top_srcdir}\desktop\resources\"
SetOutPath "$INSTDIR\assets\resources\images"
File /r "${top_srcdir}\resources\images\"
;Create uninstaller
WriteUninstaller "$INSTDIR\${UninstallExeName}"
WriteRegStr SHCTX "${AppRegistryKeyPath}" "" $INSTDIR
WriteRegStr SHCTX "${AppRegistryKeyPath}" "Version" "${VERSION}"
WriteRegDWORD SHCTX "${AppRegistryKeyPath}" "Updated" $PERFORM_UPDATE
${StrRep} $R0 "$INSTDIR\${UninstallExeName}" '"' '""'
WriteRegExpandStr SHCTX "${UninstallRegKeyPath}" "UninstallString" '"$R0"'
WriteRegExpandStr SHCTX "${UninstallRegKeyPath}" "InstallLocation" "$INSTDIR"
WriteRegStr SHCTX "${UninstallRegKeyPath}" "DisplayName" "Status Desktop ${VERSION}"
WriteRegStr SHCTX "${UninstallRegKeyPath}" "DisplayIcon" "$INSTDIR\${AppExeName}"
WriteRegStr SHCTX "${UninstallRegKeyPath}" "DisplayVersion" "${VERSION}"
WriteRegStr SHCTX "${UninstallRegKeyPath}" "URLInfoAbout" "${WEBSITE_URL}"
WriteRegStr SHCTX "${UninstallRegKeyPath}" "URLUpdateInfo" "${WEBSITE_URL}"
WriteRegStr SHCTX "${UninstallRegKeyPath}" "HelpLink" "${WEBSITE_URL}"
WriteRegStr SHCTX "${UninstallRegKeyPath}" "Publisher" "${PUBLISHER}"
WriteRegDWORD SHCTX "${UninstallRegKeyPath}" "VersionMajor" "${VERSION_MAJOR}"
WriteRegDWORD SHCTX "${UninstallRegKeyPath}" "VersionMinor" "${VERSION_MINOR}"
WriteRegDWORD SHCTX "${UninstallRegKeyPath}" "NoModify" "1"
WriteRegDWORD SHCTX "${UninstallRegKeyPath}" "NoRepair" "1"
Call GetInstalledSize
WriteRegDWORD SHCTX "${UninstallRegKeyPath}" "EstimatedSize" "$GetInstalledSize.total" ; Create/Write the reg key with the dword value
;Add applications to the firewall exception list - All Networks - All IP Version - Enabled
SimpleFC::IsApplicationAdded "$INSTDIR\${AppExeName}"
Pop $0 ; return error(1)/success(0)
${if} $0 == "0"
Pop $1 ; return 1=Added/0=Not added
${if} $1 == "0"
; SimpleFC::AddApplication [name] [path] [scope] [ip_version] [remote_addresses] [status]
SimpleFC::AddApplication "Status Desktop Ethereum Node" "$INSTDIR\${AppExeName}" 0 2 "" 1
SimpleFC::AddApplication "Status Desktop Node.js Server" "$INSTDIR\${NodeJsServerExeName}" 1 2 "" 1
${endif}
${endif}
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
;Create shortcuts
SetOutPath "$INSTDIR"
CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\${UninstallLinkName}" "$INSTDIR\${UninstallExeName}"
;CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\${AppLinkFileName}" "$INSTDIR\${AppExeName}"
!insertmacro SnoreShortcut "$SMPROGRAMS\$STARTMENU_FOLDER\${AppLinkFileName}" "$INSTDIR\${AppExeName}" "${AppUserModelId}"
!insertmacro MUI_STARTMENU_WRITE_END
; Push $R0
; StrCpy $R0 "$STARTMENU_FOLDER" 1
; ${if} $R0 == ">"
; ;Write folder to registry
; WriteRegStr "${MUI_STARTMENUPAGE_Application_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_Application_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_Application_REGISTRY_VALUENAME}" ">"
; ${endif}
; Pop $R0
${If} $ALL_USERS == 1
; Enable mini dumps
${If} ${RunningX64}
SetRegView 64
${EndIf}
WriteRegDWORD HKLM "${DUMP_KEY}\${AppExeName}" "DumpType" "1"
WriteRegDWORD HKLM "${DUMP_KEY}\${NodeJsServerExeName}" "DumpType" "1"
${If} ${RunningX64}
SetRegView lastused
${EndIf}
${EndIf}
; Register App Path so that typing status in Win+R dialog starts Status Desktop
WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\App Paths\${AppExeName}" "" "$INSTDIR\${AppExeName}"
WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\App Paths\${AppExeName}" "Path" "$INSTDIR"
SectionEnd
;--------------------------------
; Functions
;--------------------------------
Function PostInstPage
; Don't advance automatically if details expanded
FindWindow $R0 "#32770" "" $HWNDPARENT
GetDlgItem $R0 $R0 1016
System::Call user32::IsWindowVisible(i$R0)i.s
Pop $R0
${If} $R0 != 0
SetAutoClose false
${EndIf}
FunctionEnd
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}
${Next}
Pop $1
Pop $0
IntFmt $GetInstalledSize.total "0x%08X" $GetInstalledSize.total
Push $GetInstalledSize.total
FunctionEnd
;--------------------------------
; Descriptions
;--------------------------------
; Language strings
LangString DESC_SecMain ${LANG_ENGLISH} "Required program files."
;LangString DESC_SecDesktop ${LANG_ENGLISH} "Create desktop icon for FileZilla"
; Assign language strings to sections
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SecMain} $(DESC_SecMain)
;!insertmacro MUI_DESCRIPTION_TEXT ${SecDesktop} $(DESC_SecDesktop)
!insertmacro MUI_FUNCTION_DESCRIPTION_END
;--------------------------------
; Uninstaller Variables
;--------------------------------
Var un.REMOVE_ALL_USERS
Var un.REMOVE_CURRENT_USER
;--------------------------------
;Uninstaller Functions
;--------------------------------
Function un.GetUserInfo
ClearErrors
UserInfo::GetName
${If} ${Errors}
StrCpy $IS_ADMIN 1
Return
${EndIf}
Pop $USERNAME
${If} ${UAC_IsAdmin}
StrCpy $IS_ADMIN 1
${Else}
StrCpy $IS_ADMIN 0
${EndIf}
FunctionEnd
Function un.ReadPreviousVersion
ReadRegStr $R0 HKLM "${AppRegistryKeyPath}" ""
${If} $R0 != ""
;Detect version
ReadRegStr $R2 HKLM "${AppRegistryKeyPath}" "Version"
${If} $R2 == ""
StrCpy $R0 ""
${EndIf}
${EndIf}
ReadRegStr $R1 HKCU "${AppRegistryKeyPath}" ""
${If} $R1 != ""
;Detect version
ReadRegStr $R2 HKCU "${AppRegistryKeyPath}" "Version"
${If} $R2 == ""
StrCpy $R1 ""
${EndIf}
${EndIf}
${If} $R1 == $INSTDIR
Strcpy $un.REMOVE_CURRENT_USER 1
${EndIf}
${If} $R0 == $INSTDIR
Strcpy $un.REMOVE_ALL_USERS 1
${EndIf}
${If} $un.REMOVE_CURRENT_USER != 1
${AndIf} $un.REMOVE_ALL_USERS != 1
${If} $R1 != ""
Strcpy $un.REMOVE_CURRENT_USER 1
${If} $R0 == $R1
Strcpy $un.REMOVE_ALL_USERS 1
${EndIf}
${Else}
StrCpy $un.REMOVE_ALL_USERS = 1
${EndIf}
${EndIf}
FunctionEnd
Function un.onInit
${un.GetParameters} $CommandLine
${un.GetOptions} $CommandLine "/quiet" $R1
${If} ${Errors}
StrCpy $Quiet 0
${Else}
StrCpy $Quiet 1
SetSilent silent
${EndIf}
Call un.GetUserInfo
Call un.ReadPreviousVersion
${If} $un.REMOVE_ALL_USERS == 1
${AndIf} $IS_ADMIN == 0
uac_tryagain:
!insertmacro UAC_RunElevated
${Switch} $0
${Case} 0
${IfThen} $1 = 1 ${|} Quit ${|} ;we are the outer process, the inner process has done its work, we are done.
${IfThen} $3 <> 0 ${|} ${Break} ${|} ;we are admin, let the show go on
${If} $2 = 3 ;RunAs completed successfully, but with a non-admin user
MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND "Status Desktop setup requires admin privileges, try again" /SD IDNO IDYES uac_tryagain IDNO 0
Abort
${EndIf}
;fall-through and die
${Default}
${MessageBox} MB_ICONSTOP "Status Desktop has been installed for all users.$\nPlease restart the uninstaller with Administrator privileges to remove it." IDOK ''
Abort
${EndSwitch}
; The UAC plugin changes the error level even in the inner process, reset it.
SetErrorLevel -1
${EndIf}
FunctionEnd
Function un.RemoveStartmenu
!insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
Delete "$SMPROGRAMS\$MUI_TEMP\${UninstallLinkName}"
Delete "$SMPROGRAMS\$MUI_TEMP\${AppLinkFileName}"
${un.GetOptions} $CommandLine "/keepstartmenudir" $R1
${If} ${Errors}
; Delete empty start menu parent diretories
StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"
startMenuDeleteLoop:
RMDir $MUI_TEMP
GetFullPathName $MUI_TEMP "$MUI_TEMP\.."
IfErrors startMenuDeleteLoopDone
StrCmp $MUI_TEMP $SMPROGRAMS startMenuDeleteLoopDone startMenuDeleteLoop
startMenuDeleteLoopDone:
${EndUnless}
FunctionEnd
Function un.ConfirmPagePre
${un.GetOptions} $CommandLine "/frominstall" $R1
${Unless} ${Errors}
Abort
${EndUnless}
FunctionEnd
Function un.FinishPagePre
${un.GetOptions} $CommandLine "/frominstall" $R1
${Unless} ${Errors}
SetRebootFlag false
Abort
${EndUnless}
FunctionEnd
;--------------------------------
; Uninstaller Section
;--------------------------------
Section "Uninstall"
SetShellVarContext all
SetDetailsPrint lastused
${nsProcess::FindProcess} "${AppExeName}" $R0
${If} $R0 == 0
DetailPrint "${AppExeName} is running. Closing it down"
${nsProcess::CloseProcess} "${AppExeName}" $R0
DetailPrint "Waiting for ${AppExeName} to close"
Sleep 2000
${Else}
DetailPrint "${AppExeName} was not found to be running"
${EndIf}
${nsProcess::FindProcess} "${NodeJsServerExeName}" $R0
${If} $R0 == 0
DetailPrint "${NodeJsServerExeName} is running. Closing it down"
${nsProcess::CloseProcess} "${NodeJsServerExeName}" $R0
DetailPrint "Waiting for ${NodeJsServerExeName} to close"
Sleep 2000
${Else}
DetailPrint "${NodeJsServerExeName} was not found to be running"
${EndIf}
${nsProcess::Unload}
SimpleFC::RemoveApplication "$INSTDIR\${AppExeName}"
SimpleFC::RemoveApplication "$INSTDIR\${NodeJsServerExeName}"
Delete "$INSTDIR\.env"
Delete "$INSTDIR\*.dll"
Delete "$INSTDIR\${AppExeName}"
Delete "$INSTDIR\reportApp.exe"
Delete "$INSTDIR\vc_redist.x64.exe"
Delete "$INSTDIR\${NodeJsServerExeName}"
Delete "$INSTDIR\${UninstallExeName}"
RMDir /r "$INSTDIR\assets"
Delete "$INSTDIR\bearer\*.dll"
RMDir "$INSTDIR\bearer"
Delete "$INSTDIR\iconengines\*.dll"
RMDir "$INSTDIR\iconengines"
Delete "$INSTDIR\imageformats\*.dll"
RMDir "$INSTDIR\imageformats"
RMDir /r "$INSTDIR\node_modules"
Delete "$INSTDIR\notifier\*.exe"
RMDir "$INSTDIR\notifier"
Delete "$INSTDIR\platforms\*.dll"
RMDir "$INSTDIR\platforms"
RMDir /r "$INSTDIR\QtGraphicalEffects"
RMDir /r "$INSTDIR\QtQml"
RMDir /r "$INSTDIR\QtQuick"
RMDir /r "$INSTDIR\QtQuick.2"
RMDir /r "$INSTDIR\QtWebSockets"
Delete "$INSTDIR\styles\*.dll"
RMDir "$INSTDIR\styles"
Delete "$INSTDIR\translations\*.qm"
RMDir "$INSTDIR\translations"
Delete "$INSTDIR"
${un.GetOptions} $CommandLine "/frominstall" $R1
${If} ${Errors}
RMDir /r /REBOOTOK "$INSTDIR"
DeleteRegValue SHCTX "${AppRegistryKeyPath}" "Package"
DeleteRegValue SHCTX "${AppRegistryKeyPath}" "Updated"
DeleteRegValue SHCTX "${AppRegistryKeyPath}" "Channel"
${EndIf}
${If} $un.REMOVE_ALL_USERS == 1
SetShellVarContext all
Call un.RemoveStartmenu
DeleteRegKey /ifempty HKLM "${AppRegistryKeyPath}"
DeleteRegKey /ifempty HKLM "${OrgRegistryKeyPath}"
DeleteRegKey HKLM "${UninstallRegKeyPath}"
Delete "$DESKTOP\${AppLinkFileName}"
; Remove dump key
${If} ${RunningX64}
SetRegView 64
${EndIf}
DeleteRegValue HKLM "${DUMP_KEY}\${AppExeName}" "DumpType"
DeleteRegValue HKLM "${DUMP_KEY}\${NodeJsServerExeName}" "DumpType"
${If} ${RunningX64}
SetRegView lastused
${EndIf}
${EndIf}
${If} $un.REMOVE_CURRENT_USER == 1
SetShellVarContext current
Call un.RemoveStartmenu
DeleteRegKey /ifempty HKCU "${AppRegistryKeyPath}"
DeleteRegKey /ifempty HKCU "${OrgRegistryKeyPath}"
DeleteRegKey HKCU "${UninstallRegKeyPath}"
Delete "$DESKTOP\${AppLinkFileName}"
${EndIf}
DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\App Paths\${AppExeName}"
SectionEnd