// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "BuildPatchSettings.h" #include "BuildPatchManifest.h" namespace BuildPatchServices { struct FPreReqInfo { TSet IdSet; FString Name; FString Path; FString Args; FString AppName; FString VersionString; bool bIsRepair; }; /** * FBuildPatchInstallerAction * This class decorates an FInstallerAction instance with downcasted functions for internal manifest implementation. * It also allows editing of the install manifest in the case a more optimal version was produced from a delta download. */ struct FBuildPatchInstallerAction { public: FBuildPatchInstallerAction(const FInstallerAction& InInstallerAction) : InstallerAction(InInstallerAction) , CurrentManifest(StaticCastSharedPtr(InstallerAction.TryGetCurrentManifest())) , InstallManifest(StaticCastSharedPtr(InstallerAction.TryGetInstallManifest())) { // Pre-process install tags. Doing this logic here means it doesn't need repeating around lower level code. // No tags means full installation. InstallTags = InstallerAction.GetInstallTags(); if (InstallTags.Num() == 0) { GetInstallOrCurrentManifest().GetFileTagList(InstallTags); } // Always require the empty tag. InstallTags.Add(TEXT("")); // Cache tagged files. if (!IsUninstall()) { GetInstallManifest().GetTaggedFileList(InstallTags, TaggedFiles); } } bool IsInstall() const { return InstallerAction.IsInstall(); } bool IsUpdate() const { return InstallerAction.IsUpdate(); } bool IsRepair() const { return InstallerAction.IsRepair(); } bool IsUninstall() const { return InstallerAction.IsUninstall(); } const TSet& GetInstallTags() const { return InstallTags; } const TSet& GetTaggedFiles() const { return TaggedFiles; } const FString& GetInstallSubdirectory() const { return InstallerAction.GetInstallSubdirectory(); } const FString& GetCloudSubdirectory() const { return InstallerAction.GetCloudSubdirectory(); } const FBuildPatchAppManifest& GetCurrentManifest() const { return *CurrentManifest; } const FBuildPatchAppManifest& GetInstallManifest() const { return *InstallManifest; } const FBuildPatchAppManifest* TryGetCurrentManifest() const { return CurrentManifest.Get(); } const FBuildPatchAppManifest* TryGetInstallManifest() const { return InstallManifest.Get(); } const FBuildPatchAppManifest& GetCurrentOrInstallManifest() const { return *(CurrentManifest.IsValid() ? CurrentManifest : InstallManifest); } const FBuildPatchAppManifest& GetInstallOrCurrentManifest() const { return *(InstallManifest.IsValid() ? InstallManifest : CurrentManifest); } const FBuildPatchAppManifestRef GetSharedCurrentManifest() const { return CurrentManifest.ToSharedRef(); } const FBuildPatchAppManifestRef GetSharedInstallManifest() const { return InstallManifest.ToSharedRef(); } const FBuildPatchAppManifestPtr TryGetSharedCurrentManifest() const { return CurrentManifest; } const FBuildPatchAppManifestPtr TryGetSharedInstallManifest() const { return InstallManifest; } const FBuildPatchAppManifestRef GetSharedCurrentOrInstallManifest() const { return (CurrentManifest.IsValid() ? CurrentManifest : InstallManifest).ToSharedRef(); } const FBuildPatchAppManifestRef GetSharedInstallOrCurrentManifest() const { return (InstallManifest.IsValid() ? InstallManifest : CurrentManifest).ToSharedRef(); } void SetDeltaManifest(const FBuildPatchAppManifestRef& DeltaManifest) { if (IsUpdate()) { InstallManifest = DeltaManifest; } } void SetTaggedFiles(TSet OverrideTaggedFiles) { TaggedFiles = MoveTemp(OverrideTaggedFiles); } private: const FInstallerAction InstallerAction; FBuildPatchAppManifestPtr CurrentManifest; FBuildPatchAppManifestPtr InstallManifest; TSet InstallTags; TSet TaggedFiles; }; class IBuildManifestSet { public: virtual ~IBuildManifestSet() {} // Manifest info virtual void GetInstallResumeIds(TSet& ResumeIds, bool bIncludeLegacy) const = 0; virtual void GetInstallResumeIdsForFile(const FString& BuildFile, TSet& ResumeIds, bool bIncludeLegacy) const = 0; // Data enumeration virtual void GetReferencedChunks(TSet& DataGuids) const = 0; virtual uint64 GetDownloadSize(const FGuid& DataGuid) const = 0; virtual uint64 GetDownloadSize(const TSet& DataGuids) const = 0; virtual FChunkInfo const* GetChunkInfo(const FGuid& DataGuid) const = 0; virtual bool GetChunkShaHash(const FGuid& ChunkGuid, FSHAHash& OutHash) const = 0; virtual FString GetDataFilename(const FGuid& DataGuid) const = 0; // File enumeration virtual int32 GetNumExpectedFiles() const = 0; virtual void GetExpectedFiles(TSet& Filenames) const = 0; virtual void GetOutdatedFiles(const FString& InstallDirectory, TSet& OutdatedFiles) const = 0; virtual void GetRemovableFiles(TSet& FilesToRemove) const = 0; virtual const FFileManifest* GetCurrentFileManifest(const FString& BuildFile) const = 0; virtual const FFileManifest* GetNewFileManifest(const FString& BuildFile) const = 0; virtual uint64 GetTotalNewFileSize(const TArray& Filenames) const = 0; virtual uint64 GetTotalNewFileSize(const TSet& Filenames) const = 0; virtual void GetPreReqInfo(TArray& PreReqInfo) const = 0; virtual void GetFilesTaggedForRepair(TSet& Filenames) const = 0; virtual bool IsFileRepairAction(const FString& Filename) const = 0; // Misc actions virtual bool ContainsUpdate() const = 0; virtual bool IsRepairOnly() const = 0; virtual bool HasFileAttributes() const = 0; }; class FBuildManifestSetFactory { public: static IBuildManifestSet* Create(TArray InstallerActions); }; }