From 2eab485c76def8894c9d82c56ee5996a07d94271 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Wed, 10 Jan 2024 16:23:54 +1000 Subject: [PATCH] feat(windows): Add a installNow event to SM Added an event for install now when the user wants to manual start the install process straight away. --- .../windows/delphi/general/RegistryKeys.pas | 1 + .../desktop/kmshell/main/BackgroundUpdate.pas | 116 +++++++++++++++++- 2 files changed, 114 insertions(+), 3 deletions(-) diff --git a/common/windows/delphi/general/RegistryKeys.pas b/common/windows/delphi/general/RegistryKeys.pas index 7404a2af4f..6de8909423 100644 --- a/common/windows/delphi/general/RegistryKeys.pas +++ b/common/windows/delphi/general/RegistryKeys.pas @@ -180,6 +180,7 @@ const SRegValue_Install_Update = 'install update'; SRegValue_Update_State = 'update state'; + SRegValue_Install_Mode = 'install mode'; { Privacy } diff --git a/windows/src/desktop/kmshell/main/BackgroundUpdate.pas b/windows/src/desktop/kmshell/main/BackgroundUpdate.pas index fe2eb22a6c..a816987822 100644 --- a/windows/src/desktop/kmshell/main/BackgroundUpdate.pas +++ b/windows/src/desktop/kmshell/main/BackgroundUpdate.pas @@ -98,6 +98,7 @@ type procedure HandleInstall; virtual; abstract; procedure HandleMSIInstallComplete; virtual; abstract; procedure HandleAbort; virtual; abstract; + procedure HandleInstallNow; virtual; abstract; // For convenience function StateName: string; virtual; abstract; @@ -111,10 +112,11 @@ type procedure Exit; override; procedure HandleCheck; override; procedure HandleDownload; override; - function HandleKmShell : Integer; override; + function HandleKmShell : Integer; override; procedure HandleInstall; override; procedure HandleMSIInstallComplete; override; procedure HandleAbort; override; + procedure HandleInstallNow; override; function StateName: string; override; end; @@ -124,10 +126,11 @@ type procedure Exit; override; procedure HandleCheck; override; procedure HandleDownload; override; - function HandleKmShell : Integer; override; + function HandleKmShell : Integer; override; procedure HandleInstall; override; procedure HandleMSIInstallComplete; override; procedure HandleAbort; override; + procedure HandleInstallNow; override; function StateName: string; override; end; @@ -143,6 +146,7 @@ type procedure HandleInstall; override; procedure HandleMSIInstallComplete; override; procedure HandleAbort; override; + procedure HandleInstallNow; override; function StateName: string; override; end; @@ -156,6 +160,7 @@ type procedure HandleInstall; override; procedure HandleMSIInstallComplete; override; procedure HandleAbort; override; + procedure HandleInstallNow; override; function StateName: string; override; end; @@ -181,6 +186,7 @@ type procedure HandleInstall; override; procedure HandleMSIInstallComplete; override; procedure HandleAbort; override; + procedure HandleInstallNow; override; function StateName: string; override; end; @@ -194,6 +200,7 @@ type procedure HandleInstall; override; procedure HandleMSIInstallComplete; override; procedure HandleAbort; override; + procedure HandleInstallNow; override; function StateName: string; override; end; @@ -207,6 +214,7 @@ type procedure HandleInstall; override; procedure HandleMSIInstallComplete; override; procedure HandleAbort; override; + procedure HandleInstallNow; override; function StateName: string; override; end; @@ -254,6 +262,7 @@ type function checkUpdateSchedule : Boolean; function SetRegistryState (Update : TUpdateState): Boolean; + function SetRegistryInstallMode (InstallMode : Boolean): Boolean; protected property State: TStateClass read GetState write SetState; @@ -268,10 +277,12 @@ type procedure HandleInstall; procedure HandleMSIInstallComplete; procedure HandleAbort; + procedure HandleInstallNow; function CurrentStateName: string; property ShowErrors: Boolean read FShowErrors write FShowErrors; function CheckRegistryState : TUpdateState; + function CheckRegistryInstallMode : Boolean; end; @@ -459,6 +470,57 @@ begin Result := UpdateState; end; +function TBackgroundUpdate.SetRegistryInstallMode (InstallMode : Boolean): Boolean; +var + InstallModeStr : string; +begin + + Result := False; + with TRegistryErrorControlled.Create do + try + RootKey := HKEY_LOCAL_MACHINE; + KL.Log('SetRegistryState State Entry'); + if OpenKey(SRegKey_KeymanEngine_LM, True) then + begin + InstallModeStr := BoolToStr(InstallMode, True); + WriteString(SRegValue_Install_Mode, InstallModeStr); + KL.Log('SetRegistryInstallMode is:[' + InstallModeStr + ']'); + end; + Result := True; + finally + Free; + end; + +end; + +function TBackgroundUpdate.CheckRegistryInstallMode : Boolean; +var + InstallMode : Boolean; + +begin + // We will use a registry flag to maintain the install mode background/foreground + + InstallMode := False; + // check the registry value + with TRegistryErrorControlled.Create do // I2890 + try + RootKey := HKEY_LOCAL_MACHINE; + if OpenKeyReadOnly(SRegKey_KeymanEngine_LM) and ValueExists(SRegValue_Install_Mode) then + begin + InstallMode := StrToBool(ReadString(SRegValue_Install_Mode)); + KL.Log('CheckRegistryState State is:[' + ReadString(SRegValue_Update_State) + ']'); + end + else + begin + InstallMode := False; // default to background + KL.Log('CheckRegistryInstallMode reg value not found default:[ False ]'); + end + finally + Free; + end; + Result := InstallMode; +end; + //function TBackgroundUpdate.IsKeymanRunning: Boolean; // I2329 @@ -612,6 +674,11 @@ begin CurrentState.HandleAbort; end; +procedure TBackgroundUpdate.HandleInstallNow; +begin + CurrentState.HandleInstallNow; +end; + function TBackgroundUpdate.CurrentStateName: string; begin // Implement your logic here @@ -699,6 +766,12 @@ begin // Implement your logic here end; +procedure IdleState.HandleInstallNow; +begin + bucStateContext.SetRegistryInstallMode(True); + bucStateContext.CurrentState.HandleCheck; +end; + function IdleState.StateName; begin // Implement your logic here @@ -713,7 +786,7 @@ begin bucStateContext.SetRegistryState(usUpdateAvailable); if bucStateContext.FAuto then begin - bucStateContext.CurrentState.HandleDownload ; + bucStateContext.CurrentState.HandleDownload; end; end; @@ -756,6 +829,12 @@ begin // Implement your logic here end; +procedure UpdateAvailableState.HandleInstallNow; +begin + bucStateContext.SetRegistryInstallMode(True); + ChangeState(DownloadingState); +end; + function UpdateAvailableState.StateName; begin // Implement your logic here @@ -831,6 +910,12 @@ begin // Implement your logic here end; +procedure DownloadingState.HandleInstallNow; +begin + bucStateContext.SetRegistryInstallMode(True); + // Continue downloading +end; + function DownloadingState.StateName; begin // Implement your logic here @@ -939,6 +1024,14 @@ begin // Implement your logic here end; +procedure WaitingRestartState.HandleInstallNow; +begin + bucStateContext.SetRegistryInstallMode(True); + // Notify User to install + ChangeState(InstallingState); + +end; + function WaitingRestartState.StateName; begin // Implement your logic here @@ -1080,6 +1173,11 @@ begin ChangeState(IdleState); end; +procedure InstallingState.HandleInstallNow; +begin + // Do Nothing. Need the UI to let user know installation in progress OR +end; + function InstallingState.StateName; begin // Implement your logic here @@ -1130,6 +1228,13 @@ begin // Implement your logic here end; +procedure RetryState.HandleInstallNow; +begin + bucStateContext.SetRegistryInstallMode(True); + // TODO: #10038 handle retry counts + ChangeState(InstallingState); +end; + function RetryState.StateName; begin // Implement your logic here @@ -1198,6 +1303,11 @@ begin // Handle Abort end; +procedure WaitingPostInstallState.HandleInstallNow; +begin + // Do nothing as files will be cleaned via HandleKmShell +end; + function WaitingPostInstallState.StateName; begin // Implement your logic here