Files
UnrealEngine/Engine/Source/Runtime/Online/BuildPatchServices/Private/BuildPatchProgress.h
2025-05-18 13:04:45 +08:00

160 lines
4.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
/*=============================================================================
BuildPatchProgress.h: Declares classes involved with tracking the patch
progress information.
=============================================================================*/
#pragma once
#include "CoreMinimal.h"
#include "HAL/ThreadSafeBool.h"
#include "Installer/Controllable.h"
#include "BuildPatchState.h"
namespace BuildPatchServices
{
/**
* A struct to hold patch progress tracking
*/
struct FBuildPatchProgress
: public IControllable
{
public:
/**
* Default constructor
*/
FBuildPatchProgress();
// IControllable interface begin.
virtual void SetPaused(bool bIsPaused) override;
virtual void Abort() override;
// IControllable interface end.
/**
* Sets the progress value for a particular state
* @param State The state to set progress for
* @param Value The progress value
*/
virtual void SetStateProgress(const EBuildPatchState& State, const float& Value);
/**
* Sets the progress weight for a particular state
* @param State The state to set weight for
* @param Value The weight value
*/
virtual void SetStateWeight(const EBuildPatchState& State, const float& Value);
/**
* Gets the current progress state
* @return The current progress state
*/
virtual EBuildPatchState GetState() const;
/**
* Gets the current overall progress
* @return The current progress value. Range 0 to 1. -1 indicates undetermined, i.e. show a marquee style bar.
*/
virtual float GetProgress() const;
/**
* Gets the current overall progress regardless of current state using marquee
* @return The current progress value. Range 0 to 1.
*/
virtual float GetProgressNoMarquee() const;
/**
* Gets the progress value for a particular state
* @param State The state to get progress for
* @return The state progress value. Range 0 to 1.
*/
virtual float GetStateProgress(const EBuildPatchState& State) const;
/**
* Gets the weight value for a particular state
* @param State The state to get weight for
* @return The state weight value.
*/
virtual float GetStateWeight(const EBuildPatchState& State) const;
/**
* Toggles the pause state
* @return Whether the current state is now paused
*/
virtual bool TogglePauseState();
/**
* Blocks calling thread while the progress is paused
* @return How long we paused for, in seconds
*/
virtual double WaitWhilePaused() const;
/**
* Gets the pause state
* @return Whether the current state is paused
*/
virtual bool GetPauseState() const;
/**
* Set the set state of whether the system is currently downloading data.
* @param bIsDownloading Whether the system is currently downloading data.
*/
virtual void SetIsDownloading(bool bIsDownloading);
/**
* Resets an abort state, for the next installer iteration.
*/
virtual void CancelAbort();
private:
/**
* Updates the current state and progress values
*/
void UpdateProgressInfo();
/**
* Updates the cached values
*/
void UpdateCachedValues();
private:
// Defines whether each state displays progress percent or is designed for a "please wait" or marquee style progress bar
// This is predefined and constant.
static const bool bHasProgressValue[static_cast<int32>(EBuildPatchState::NUM_PROGRESS_STATES)];
// Defines whether each state should count towards the overall progress
// This is predefined and constant.
static const bool bCountsTowardsProgress[static_cast<int32>(EBuildPatchState::NUM_PROGRESS_STATES)];
// Holds the current percentage complete for each state, this will decide the "current" state, being the first that is not complete.
// Range 0 to 1.
float StateProgressValues[static_cast<int32>(EBuildPatchState::NUM_PROGRESS_STATES)];
// Holds the weight that each stage has on overall progress.
// Range 0 to 1.
float StateProgressWeights[static_cast<int32>(EBuildPatchState::NUM_PROGRESS_STATES)];
// Cached total weight value for progress calculation
float TotalWeight;
// Externally set variable to say if the system is currently making download requests
bool bIsDownloading;
// The current state value for UI polling
EBuildPatchState CurrentState;
// The current progress value for UI polling
float CurrentProgress;
// Thread safe bool for whether the process should abort
FThreadSafeBool bShouldAbort;
// Critical section to protect variable access
mutable FCriticalSection ThreadLock;
};
}