// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Async/Async.h" #include "BuildPatchManifest.h" #include "BuildPatchProgress.h" #include "Containers/Queue.h" #include "Containers/Set.h" #include "Containers/UnrealString.h" #include "HAL/Event.h" #include "HAL/ThreadSafeBool.h" #include "Interfaces/IBuildInstallStreamer.h" #include "Interfaces/IBuildPatchServicesModule.h" #include "Templates/UniquePtr.h" #include "Templates/Tuple.h" namespace BuildPatchServices { class IBuildManifestSet; class IHttpManager; class IFileSystem; class IChunkDataSerialization; class IPlatform; class IInstallerError; class IInstallerAnalytics; class IFileOperationTracker; class ISpeedRecorder; class IChunkDataSizeProvider; class IDownloadServiceStatistics; class IMemoryChunkStoreStatistics; class ICloudChunkSourceStatistics; class IFileConstructorStatistics; class IDownloadConnectionCount; class IDownloadService; class IMessagePump; class FBuildInstallStreamer : public IBuildInstallStreamer , public TSharedFromThis { public: FBuildInstallStreamer(FBuildInstallStreamerConfiguration Configuration); ~FBuildInstallStreamer(); public: // IBuildInstallStreamer interface begin. virtual void QueueFilesByTag(TSet Tags, FBuildPatchStreamCompleteDelegate OnComplete) override; virtual void QueueFilesByName(TSet Files, FBuildPatchStreamCompleteDelegate OnComplete) override; virtual void RegisterMessageHandler(FMessageHandler* MessageHandler) override; virtual void UnregisterMessageHandler(FMessageHandler* MessageHandler) override; virtual const FBuildInstallStreamerConfiguration& GetConfiguration() const override; virtual const FBuildInstallStreamerStats& GetInstallStreamerStatistics() const override; virtual const FBuildInstallStreamerStats& GetInstallStreamerSessionStatistics() const override; virtual void ResetSessionStatistics() override; // IBuildInstallStreamer interface end. bool Tick(); void CancelAllRequests(); void PreExit(); private: void Initialise(); void RequestWorkerThread(); void CloudWorkerThread(); void CallOnDelegateThread(const TFunction& Callback); private: const FBuildInstallStreamerConfiguration Configuration; FBuildPatchAppManifestPtr BuildPatchManifest; FBuildPatchProgress BuildProgress; TUniquePtr ManifestSet; TUniquePtr HttpManager; TUniquePtr FileSystem; TUniquePtr ChunkDataSerialization; TUniquePtr Platform; TUniquePtr InstallerAnalytics; TUniquePtr InstallerError; TUniquePtr FileOperationTracker; TUniquePtr DownloadSpeedRecorder; TUniquePtr FileReadSpeedRecorder; TUniquePtr FileWriteSpeedRecorder; TUniquePtr ChunkDataSizeProvider; TUniquePtr DownloadServiceStatistics; TUniquePtr MemoryChunkStoreStatistics; TUniquePtr CloudChunkSourceStatistics; TUniquePtr FileConstructorStatistics; TUniquePtr DownloadConnectionCount; TUniquePtr DownloadService; TUniquePtr MessagePump; FThreadSafeBool bIsShuttingDown; TFuture RequestWorker; TFuture CloudWorker; typedef TTuple, bool, FBuildPatchStreamCompleteDelegate> FStreamRequest; TQueue RequestQueue; TQueue, EQueueMode::Spsc> CloudQueue; TQueue, EQueueMode::Spsc> TickQueue; FEvent* RequestTrigger; FEvent* CloudTrigger; FBuildInstallStreamerStats StreamerStats; FBuildInstallStreamerStats PerSessionStreamerStats; }; /** * A factory for creating an IBuildInstallStreamer instance. */ class FBuildInstallStreamerFactory { public: static FBuildInstallStreamer* Create(FBuildInstallStreamerConfiguration Configuration); }; } typedef TSharedPtr< BuildPatchServices::FBuildInstallStreamer, ESPMode::ThreadSafe > FBuildInstallStreamerPtr; typedef TSharedRef< BuildPatchServices::FBuildInstallStreamer, ESPMode::ThreadSafe > FBuildInstallStreamerRef; typedef TWeakPtr< BuildPatchServices::FBuildInstallStreamer, ESPMode::ThreadSafe > FBuildInstallStreamerWeakPtr;