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

311 lines
16 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Modules/ModuleInterface.h"
#include "Interfaces/IBuildInstaller.h"
#include "Interfaces/IBuildStatistics.h"
#include "Interfaces/IBuildInstallStreamer.h"
#include "Interfaces/IPatchDataEnumeration.h"
#include "BuildPatchSettings.h"
class IAnalyticsProvider;
/**
* Delegates that will be accepted and fired off by the implementation.
*/
DECLARE_DELEGATE_OneParam(FBuildPatchInstallerDelegate, const IBuildInstallerRef&);
DECLARE_DELEGATE_TwoParams(FBuildPatchBoolManifestDelegate, bool, IBuildManifestRef);
namespace ECompactifyMode
{
enum Type
{
Preview,
Full
};
}
/**
* Interface for the services manager.
*/
class IBuildPatchServicesModule
: public IModuleInterface
{
public:
/**
* Virtual destructor.
*/
virtual ~IBuildPatchServicesModule() { }
/**
* Factory providing construction of a build streamer class.
* @param Configuration The configuration for the installer.
* @return an instance of an IBuildInstallStreamer implementation.
*/
virtual IBuildInstallStreamerRef CreateBuildInstallStreamer(BuildPatchServices::FBuildInstallStreamerConfiguration Configuration) = 0;
/**
* Factory providing construction of a build installer class.
* @param Configuration The configuration for the installer.
* @param OnComplete The delegate that will be called when the installer completes.
* @return an instance of an IBuildInstaller implementation.
*/
virtual IBuildInstallerRef CreateBuildInstaller(BuildPatchServices::FBuildInstallerConfiguration Configuration, FBuildPatchInstallerDelegate OnComplete) const = 0;
/**
* Factory providing construction of a build installer shared context class.
* @param DebugName Used to tag resources allocated with the shared context.
* @return an instance of an IBuildInstallerSharedContex implementation.
*/
virtual IBuildInstallerSharedContextRef CreateBuildInstallerSharedContext(const TCHAR* DebugName) const = 0;
/**
* Factory providing construction of a build statistics class.
* @param Installer The installer to create a build statistics for.
* @return an instance of an IBuildStatistics implementation.
*/
virtual BuildPatchServices::IBuildStatisticsRef CreateBuildStatistics(const IBuildInstallerRef& Installer) const = 0;
/**
* Factory providing construction of a patch data enumeration class.
* @param Configuration Specifies the settings for the operation. See BuildPatchServices::FPatchDataEnumerationConfiguration comments.
* @return an instance of an IPatchDataEnumeration implementation.
*/
virtual BuildPatchServices::IPatchDataEnumerationRef CreatePatchDataEnumeration(BuildPatchServices::FPatchDataEnumerationConfiguration Configuration) const = 0;
/**
* Loads a Build Manifest from file and returns the interface
* @param Filename The file to load from
* @return a shared pointer to the manifest, which will be invalid if load failed.
*/
virtual IBuildManifestPtr LoadManifestFromFile( const FString& Filename ) = 0;
/**
* Constructs a Build Manifest from a data
* @param ManifestData The data received from a web api
* @return a shared pointer to the manifest, which will be invalid if creation failed.
*/
virtual IBuildManifestPtr MakeManifestFromData( const TArray<uint8>& ManifestData ) = 0;
/**
* Saves a Build Manifest to file
* @param Filename The file to save to
* @param Manifest The manifest to save out
* @return If the save was successful.
*/
virtual bool SaveManifestToFile(const FString& Filename, IBuildManifestRef Manifest) = 0;
/**
* Gets an array of prerequisite identifiers that are registered as installed on this system.
* @return a set containing all installed prerequisite identifiers.
*/
virtual TSet<FString> GetInstalledPrereqIds() const = 0;
/**
* Gets a list of currently active installers
* @return all installers that are currently active.
*/
virtual const TArray<IBuildInstallerRef>& GetInstallers() const = 0;
/**
* Sets the directory used for staging intermediate files.
* @param StagingDir The staging directory
*/
virtual void SetStagingDirectory( const FString& StagingDir ) = 0;
/**
* Sets the cloud directory where chunks and manifests will be pulled from and saved to.
* @param CloudDir The cloud directory
*/
virtual void SetCloudDirectory( FString CloudDir ) = 0;
/**
* Sets the cloud directory list where chunks and manifests will be pulled from and saved to.
* When downloading, if we get a failure, we move on to the next cloud option for that request.
* @param CloudDirs The cloud directory list
*/
virtual void SetCloudDirectories( TArray<FString> CloudDirs ) = 0;
/**
* Sets the backup directory where files that are being clobbered by repair/patch will be placed.
* @param BackupDir The backup directory
*/
virtual void SetBackupDirectory( const FString& BackupDir ) = 0;
/**
* Sets the Analytics provider that will be used to register errors with patch/build installs
* @param AnalyticsProvider Shared ptr to an analytics interface to use. If NULL analytics will be disabled.
*/
virtual void SetAnalyticsProvider( TSharedPtr< IAnalyticsProvider > AnalyticsProvider ) = 0;
/**
* Registers an installation on this machine. This information is used to gather a list of install locations that can be used as chunk sources.
* @param AppManifest Ref to the manifest for this installation
* @param AppInstallDirectory The install location
*/
virtual void RegisterAppInstallation(IBuildManifestRef AppManifest, const FString AppInstallDirectory) = 0;
/**
* Unregisters an installation on this machine
* @param AppInstallDirectory The install location which RegisterAppInstallation was executed with
* @return returns true if successfully removed installation directory
*/
virtual bool UnregisterAppInstallation(const FString AppInstallDirectory) = 0;
/**
* Call to force the exit out of all current installers, optionally blocks until threads have exited and complete delegates are called.
* @param WaitForThreads If true, will block on threads exit and completion delegates
*/
virtual void CancelAllInstallers(bool WaitForThreads) = 0;
/**
* Processes a Build directory to create chunks for new data and produce a manifest, saved to the provided cloud directory.
* NOTE: This function is blocking and will not return until finished.
* @param Configuration Specifies the settings for the operation. See BuildPatchServices::FChunkBuildConfiguration comments.
* @return true if successful.
*/
virtual bool ChunkBuildDirectory(const BuildPatchServices::FChunkBuildConfiguration& Configuration) = 0;
/**
* Process a pair of manifests to produce additional delta data which reduces the patch directly between them.
* NOTE: This function is blocking and will not return until finished.
* @param Configuration Specifies the settings for the operation. See BuildPatchServices::FChunkDeltaOptimiserConfiguration comments.
* @return true if successful.
*/
virtual bool OptimiseChunkDelta(const BuildPatchServices::FChunkDeltaOptimiserConfiguration& Configuration) = 0;
/**
* Processes a Cloud Directory to identify and delete any orphaned chunks or files.
* NOTE: THIS function is blocking and will not return until finished.
* @param Configuration Specifies the settings for the operation. See BuildPatchServices::FCompactifyConfiguration comments.
* @return true if successful.
*/
virtual bool CompactifyCloudDirectory(const BuildPatchServices::FCompactifyConfiguration& Configuration) = 0;
/**
* Saves info for an enumeration of patch data referenced from an input file of known format, to a specified output file.
* NOTE: THIS function is blocking and will not return until finished.
* @param Configuration Specifies the settings for the operation. See BuildPatchServices::FPatchDataEnumerationConfiguration comments.
* @return true if successful.
*/
virtual bool EnumeratePatchData(const BuildPatchServices::FPatchDataEnumerationConfiguration& Configuration) = 0;
/**
* Searches a given directory for chunk and chunkdb files, and verifies their integrity uses the hashes in the files.
* NOTE: THIS function is blocking and will not return until finished. Don't run on main thread.
* @param SearchPath A full file path for the directory to search.
* @param OutputFile A full file path where to save the output text.
* @return true if successful and no corruptions detected.
*/
virtual bool VerifyChunkData(const FString& SearchPath, const FString& OutputFile) = 0;
/**
* Packages data referenced by a manifest file into chunkdb files, supporting a maximum filesize per chunkdb.
* NOTE: THIS function is blocking and will not return until finished. Don't run on main thread.
* @param Configuration Specifies the settings for the operation. See BuildPatchServices::FPackageChunksConfiguration comments.
* @return true if successful.
*/
virtual bool PackageChunkData(const BuildPatchServices::FPackageChunksConfiguration& Configuration) = 0;
/**
* Takes two manifests as input, in order to merge together producing a new manifest containing all files.
* NOTE: THIS function is blocking and will not return until finished. Don't run on main thread.
* @param ManifestFilePathA A full file path for the base manifest to be loaded.
* @param ManifestFilePathB A full file path for the merge manifest to be loaded, by default files in B will stomp over A.
* @param ManifestFilePathC A full file path for the manifest to be output.
* @param NewVersionString The new version string for the build, all other meta will be copied from B.
* @param SelectionDetailFilePath Optional full file path to a text file listing each build relative file required, followed by A or B to select which manifest to pull from.
* The format should be \r\n separated lines of filename \t A|B. Example:
* File/in/build1 A
* File/in/build2 B
* @return true if successful.
*/
virtual bool MergeManifests(const FString& ManifestFilePathA, const FString& ManifestFilePathB, const FString& ManifestFilePathC, const FString& NewVersionString, const FString& SelectionDetailFilePath) = 0;
/**
* Takes two manifests as input and outputs the details of the patch.
* NOTE: THIS function is blocking and will not return until finished. Don't run on main thread.
* @param Configuration Specifies the settings for the operation. See BuildPatchServices::FDiffManifestsConfiguration comments.
* @return true if successful.
*/
virtual bool DiffManifests(const BuildPatchServices::FDiffManifestsConfiguration& Configuration) = 0;
/**
* Returns an event which fires when we start a new build install.
*/
DECLARE_EVENT(IBuildPatchServicesModule, FSimpleEvent)
virtual FSimpleEvent& OnStartBuildInstall() = 0;
///// DEPRECATED FUNCTIONS
UE_DEPRECATED(4.21, "MakeManifestFromJSON(const FString& ManifestJSON) has been deprecated. Please use MakeManifestFromData(const TArray<uint8>& ManifestData) instead.")
virtual IBuildManifestPtr MakeManifestFromJSON(const FString& ManifestJSON) = 0;
UE_DEPRECATED(4.21, "Please use ChunkBuildDirectory instead.")
virtual bool GenerateChunksManifestFromDirectory(const BuildPatchServices::FGenerationConfiguration& Configuration)
{
return ChunkBuildDirectory(Configuration);
}
UE_DEPRECATED(4.23, "StartBuildInstall(IBuildManifestPtr, IBuildManifestPtr, const FString&, FBuildPatchBoolManifestDelegate, bool, TSet<FString>) has been deprecated. Please use CreateBuildInstaller(BuildPatchServices::FBuildInstallerConfiguration, FBuildPatchInstallerDelegate) instead, followed by IBuildInstaller::StartInstallation.")
IBuildInstallerPtr StartBuildInstall(IBuildManifestPtr CurrentManifest, IBuildManifestPtr InstallManifest, const FString& InstallDirectory, FBuildPatchBoolManifestDelegate OnCompleteDelegate, bool bIsRepair = false, TSet<FString> InstallTags = TSet<FString>())
{
BuildPatchServices::FBuildInstallerConfiguration InstallerConfiguration({ BuildPatchServices::FInstallerAction::MakeInstallOrUpdate(CurrentManifest, InstallManifest.ToSharedRef(), InstallTags) });
FBuildPatchInstallerDelegate CompleteDelegate = FBuildPatchInstallerDelegate::CreateLambda([OnCompleteDelegate, InstallManifest](const IBuildInstallerRef& Installer)
{
OnCompleteDelegate.ExecuteIfBound(Installer->CompletedSuccessfully(), InstallManifest.ToSharedRef());
});
IBuildInstallerRef Installer = CreateBuildInstaller(InstallerConfiguration, CompleteDelegate);
Installer->StartInstallation();
return Installer;
}
UE_DEPRECATED(4.23, "StartBuildInstallStageOnly(IBuildManifestPtr, IBuildManifestPtr, const FString&, FBuildPatchBoolManifestDelegate, bool, TSet<FString>) has been deprecated. Please use CreateBuildInstaller(BuildPatchServices::FBuildInstallerConfiguration, FBuildPatchInstallerDelegate) instead, followed by IBuildInstaller::StartInstallation.")
IBuildInstallerPtr StartBuildInstallStageOnly(IBuildManifestPtr CurrentManifest, IBuildManifestPtr InstallManifest, const FString& InstallDirectory, FBuildPatchBoolManifestDelegate OnCompleteDelegate, bool bIsRepair = false, TSet<FString> InstallTags = TSet<FString>())
{
BuildPatchServices::FBuildInstallerConfiguration InstallerConfiguration({ BuildPatchServices::FInstallerAction::MakeInstallOrUpdate(CurrentManifest, InstallManifest.ToSharedRef(), InstallTags) });
InstallerConfiguration.InstallMode = BuildPatchServices::EInstallMode::StageFiles;
FBuildPatchInstallerDelegate CompleteDelegate = FBuildPatchInstallerDelegate::CreateLambda([OnCompleteDelegate, InstallManifest](const IBuildInstallerRef& Installer)
{
OnCompleteDelegate.ExecuteIfBound(Installer->CompletedSuccessfully(), InstallManifest.ToSharedRef());
});
IBuildInstallerRef Installer = CreateBuildInstaller(InstallerConfiguration, CompleteDelegate);
Installer->StartInstallation();
return Installer;
}
UE_DEPRECATED(4.23, "StartBuildInstall(BuildPatchServices::FInstallerConfiguration, FBuildPatchBoolManifestDelegate) has been deprecated. Please use CreateBuildInstaller(BuildPatchServices::FBuildInstallerConfiguration, FBuildPatchInstallerDelegate) instead, followed by IBuildInstaller::StartInstallation.")
IBuildInstallerRef StartBuildInstall(BuildPatchServices::FInstallerConfiguration Configuration, FBuildPatchBoolManifestDelegate OnCompleteDelegate)
{
FBuildPatchInstallerDelegate CompleteDelegate = FBuildPatchInstallerDelegate::CreateLambda([Configuration, OnCompleteDelegate](const IBuildInstallerRef& Installer)
{
OnCompleteDelegate.ExecuteIfBound(Installer->CompletedSuccessfully(), Configuration.InstallManifest);
});
TArray<BuildPatchServices::FInstallerAction> Actions;
if (Configuration.bIsRepair)
{
Actions.Add(BuildPatchServices::FInstallerAction::MakeRepair(Configuration.InstallManifest, Configuration.InstallTags));
}
else
{
Actions.Add(BuildPatchServices::FInstallerAction::MakeInstallOrUpdate(Configuration.CurrentManifest, Configuration.InstallManifest, Configuration.InstallTags));
}
BuildPatchServices::FBuildInstallerConfiguration BuildInstallerConfiguration(MoveTemp(Actions));
BuildInstallerConfiguration.InstallDirectory = Configuration.InstallDirectory;
BuildInstallerConfiguration.StagingDirectory = Configuration.StagingDirectory;
BuildInstallerConfiguration.BackupDirectory = Configuration.BackupDirectory;
BuildInstallerConfiguration.ChunkDatabaseFiles = Configuration.ChunkDatabaseFiles;
BuildInstallerConfiguration.CloudDirectories = Configuration.CloudDirectories;
BuildInstallerConfiguration.InstallMode = Configuration.InstallMode;
BuildInstallerConfiguration.VerifyMode = Configuration.VerifyMode;
BuildInstallerConfiguration.DeltaPolicy = Configuration.DeltaPolicy;
BuildInstallerConfiguration.bRunRequiredPrereqs = Configuration.bRunRequiredPrereqs;
BuildInstallerConfiguration.bAllowConcurrentExecution = Configuration.bAllowConcurrentExecution;
IBuildInstallerRef Installer = CreateBuildInstaller(BuildInstallerConfiguration, CompleteDelegate);
Installer->StartInstallation();
return Installer;
}
};