diff --git a/windows/src/desktop/kmshell/main/Keyman.System.RemoteUpdateCheck.pas b/windows/src/desktop/kmshell/main/Keyman.System.RemoteUpdateCheck.pas index 0a28e1b8286..e03ee795df6 100644 --- a/windows/src/desktop/kmshell/main/Keyman.System.RemoteUpdateCheck.pas +++ b/windows/src/desktop/kmshell/main/Keyman.System.RemoteUpdateCheck.pas @@ -39,7 +39,7 @@ TRemoteUpdateCheckDownloadParams = record TRemoteUpdateCheck = class private - FForce: Boolean; + FForce, FManualCheck: Boolean; FRemoteResult: TRemoteUpdateCheckResult; FErrorMessage: string; FShowErrors: Boolean; @@ -57,7 +57,7 @@ TRemoteUpdateCheck = class function DoRun: TRemoteUpdateCheckResult; public - constructor Create(AForce: Boolean); + constructor Create(AForce, AManualCheck: Boolean); destructor Destroy; override; function Run: TRemoteUpdateCheckResult; property ShowErrors: Boolean read FShowErrors write FShowErrors; @@ -95,7 +95,7 @@ implementation { TRemoteUpdateCheck } -constructor TRemoteUpdateCheck.Create(AForce: Boolean); +constructor TRemoteUpdateCheck.Create(AForce, AManualCheck: Boolean); begin inherited Create; @@ -103,6 +103,7 @@ constructor TRemoteUpdateCheck.Create(AForce: Boolean); FRemoteResult := wucUnknown; FForce := AForce; + FManualCheck := AManualCheck; KL.Log('TRemoteUpdateCheck.Create'); end; @@ -159,7 +160,7 @@ function TRemoteUpdateCheck.DoRun: TRemoteUpdateCheckResult; http.Fields.Add('version', ansistring(CKeymanVersionInfo.Version)); http.Fields.Add('tier', ansistring(CKeymanVersionInfo.Tier)); http.Fields.Add('update', '1'); // This is checking for an update - if FForce then + if FManualCheck then http.Fields.Add('manual', '1') else http.Fields.Add('manual', '0'); diff --git a/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas b/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas index 974734a467c..b7b004aec5c 100644 --- a/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas +++ b/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas @@ -41,7 +41,7 @@ TState = class abstract constructor Create(Context: TUpdateStateMachine); procedure EnterState; virtual; abstract; procedure ExitState; virtual; abstract; - procedure HandleCheck; virtual; abstract; + procedure HandleCheck(ManualCheck: Boolean); virtual; abstract; function HandleKmShell: Integer; virtual; abstract; procedure HandleDownload; virtual; abstract; procedure HandleAbort; virtual; abstract; @@ -80,7 +80,7 @@ TUpdateStateMachine = class constructor Create(AForce: Boolean); destructor Destroy; override; - procedure HandleCheck; + procedure HandleCheck(ManualCheck: Boolean); function HandleKmShell: Integer; procedure HandleDownload; procedure HandleAbort; @@ -166,7 +166,7 @@ IdleState = class(TState) public procedure EnterState; override; procedure ExitState; override; - procedure HandleCheck; override; + procedure HandleCheck(ManualCheck: Boolean); override; function HandleKmShell: Integer; override; procedure HandleDownload; override; procedure HandleAbort; override; @@ -180,7 +180,7 @@ UpdateAvailableState = class(TState) public procedure EnterState; override; procedure ExitState; override; - procedure HandleCheck; override; + procedure HandleCheck(ManualCheck: Boolean); override; function HandleKmShell: Integer; override; procedure HandleDownload; override; procedure HandleAbort; override; @@ -192,7 +192,7 @@ DownloadingState = class(TState) function DownloadUpdatesBackground: Boolean; procedure EnterState; override; procedure ExitState; override; - procedure HandleCheck; override; + procedure HandleCheck(ManualCheck: Boolean); override; function HandleKmShell: Integer; override; procedure HandleDownload; override; procedure HandleAbort; override; @@ -203,7 +203,7 @@ WaitingRestartState = class(TState) public procedure EnterState; override; procedure ExitState; override; - procedure HandleCheck; override; + procedure HandleCheck(ManualCheck: Boolean); override; function HandleKmShell: Integer; override; procedure HandleDownload; override; procedure HandleAbort; override; @@ -238,7 +238,7 @@ InstallingState = class(TState) public procedure EnterState; override; procedure ExitState; override; - procedure HandleCheck; override; + procedure HandleCheck(ManualCheck: Boolean); override; function HandleKmShell: Integer; override; procedure HandleDownload; override; procedure HandleAbort; override; @@ -520,11 +520,11 @@ procedure TUpdateStateMachine.RemoveCachedFiles; end; end; -procedure TUpdateStateMachine.HandleCheck; +procedure TUpdateStateMachine.HandleCheck(ManualCheck: Boolean); begin if not IsCurrentStateAssigned then Exit; - CurrentState.HandleCheck; + CurrentState.HandleCheck(ManualCheck); end; function TUpdateStateMachine.HandleKmShell: Integer; @@ -639,13 +639,13 @@ procedure IdleState.ExitState; end; -procedure IdleState.HandleCheck; +procedure IdleState.HandleCheck(ManualCheck: Boolean); var CheckForUpdates: TRemoteUpdateCheck; Result: TRemoteUpdateCheckResult; begin - CheckForUpdates := TRemoteUpdateCheck.Create(True); + CheckForUpdates := TRemoteUpdateCheck.Create(True, ManualCheck); try Result := CheckForUpdates.Run; finally @@ -669,7 +669,7 @@ function IdleState.HandleKmShell; // Remote manages the last check time therefore // we will allow it to return early if it hasn't reached // the configured time between checks. - CheckForUpdates := TRemoteUpdateCheck.Create(False); + CheckForUpdates := TRemoteUpdateCheck.Create(False, False); try UpdateCheckResult := CheckForUpdates.Run; finally @@ -748,13 +748,13 @@ procedure UpdateAvailableState.ExitState; // Exit UpdateAvailableState end; -procedure UpdateAvailableState.HandleCheck; +procedure UpdateAvailableState.HandleCheck(ManualCheck: Boolean); var CheckForUpdates: TRemoteUpdateCheck; Result: TRemoteUpdateCheckResult; begin // Check if new updates while in this state - CheckForUpdates := TRemoteUpdateCheck.Create(True); + CheckForUpdates := TRemoteUpdateCheck.Create(True, ManualCheck); try Result := CheckForUpdates.Run; finally @@ -866,7 +866,7 @@ procedure DownloadingState.ExitState; // Exit DownloadingState end; -procedure DownloadingState.HandleCheck; +procedure DownloadingState.HandleCheck(ManualCheck: Boolean); begin end; @@ -887,7 +887,7 @@ function DownloadingState.HandleKmShell; bucStateContext.RemoveCachedFiles; FMutex.ReleaseOwnership; // Mutex must be freed before changing state ChangeState(IdleState); - bucStateContext.CurrentState.HandleCheck; + bucStateContext.CurrentState.HandleCheck(False); end; finally FreeAndNil(FMutex); @@ -906,7 +906,7 @@ procedure DownloadingState.HandleDownload; bucStateContext.RemoveCachedFiles; FMutex.ReleaseOwnership; // Mutex must be freed before changing state ChangeState(IdleState); - bucStateContext.CurrentState.HandleCheck; + bucStateContext.CurrentState.HandleCheck(False); end; finally FreeAndNil(FMutex); @@ -961,13 +961,13 @@ procedure WaitingRestartState.ExitState; // Exit DownloadingState end; -procedure WaitingRestartState.HandleCheck; +procedure WaitingRestartState.HandleCheck(ManualCheck: Boolean); var CheckForUpdates: TRemoteUpdateCheck; Result: TRemoteUpdateCheckResult; begin // Check if new updates while in this state - CheckForUpdates := TRemoteUpdateCheck.Create(True); + CheckForUpdates := TRemoteUpdateCheck.Create(True, ManualCheck); try Result := CheckForUpdates.Run; finally @@ -996,7 +996,7 @@ function WaitingRestartState.HandleKmShell; begin // Return to Idle state and check for Updates state ChangeState(IdleState); - bucStateContext.CurrentState.HandleCheck; + bucStateContext.CurrentState.HandleCheck(False); Result := kmShellContinue; end else @@ -1198,7 +1198,7 @@ procedure InstallingState.ExitState; end; -procedure InstallingState.HandleCheck; +procedure InstallingState.HandleCheck(ManualCheck: Boolean); begin end; diff --git a/windows/src/desktop/kmshell/main/UfrmMain.pas b/windows/src/desktop/kmshell/main/UfrmMain.pas index a8fdfe9845f..2440825cbc3 100644 --- a/windows/src/desktop/kmshell/main/UfrmMain.pas +++ b/windows/src/desktop/kmshell/main/UfrmMain.pas @@ -809,7 +809,8 @@ procedure TfrmMain.Update_CheckNow; begin BUpdateSM := TUpdateStateMachine.Create(False); try - BUpdateSM.HandleCheck; + // User initiated manual check + BUpdateSM.HandleCheck(True); finally BUpdateSM.Free; end; diff --git a/windows/src/desktop/kmshell/main/initprog.pas b/windows/src/desktop/kmshell/main/initprog.pas index 39c4cc50e87..956ba714e3e 100644 --- a/windows/src/desktop/kmshell/main/initprog.pas +++ b/windows/src/desktop/kmshell/main/initprog.pas @@ -702,7 +702,9 @@ function ProcessBackgroundUpdate(FMode: TKMShellMode; FSilent: Boolean) : Boolea try if (FMode = fmBackgroundUpdateCheck) then begin - BUpdateSM.HandleCheck; + // -buc BackgroundUpdateCheck is designed to be called by a + // scheduled service therefore it is not a "manual" check + BUpdateSM.HandleCheck(False); Result := True; Exit; end