Files
UnrealEngine/Engine/Source/Programs/UnrealVirtualizationTool/Private/UnrealVirtualizationToolApp.h
2025-05-18 13:04:45 +08:00

119 lines
3.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Containers/Array.h"
#include "Containers/UnrealString.h"
#include "ProjectFiles.h"
#include "Templates/UniquePtr.h"
namespace UE::Virtualization
{
class FCommand;
struct FCommandOutput;
/** The mode of the application to run */
enum class EMode :uint32
{
/** Error condition */
Unknown = 0,
// Legacy (should be phased out)
/** Virtualize and submit a given changelist */
Changelist,
/** Virtualize a list of packages provided by text file */
PackageList,
/// New Style Commands
/** Virtualize one or more packages */
Virtualize,
/** Rehydrate one or more packages */
Rehydrate
};
/** The result of FUnrealVirtualizationToolApp initialization */
enum class EInitResult
{
/** Initialization succeeded and the application should run. */
Success = 0,
/** No error was encountered but the application should early out and not run. */
EarlyOut,
/** Initialization failed with an error, we should not run and should display an error to the user */
Error
};
enum class EProcessResult
{
Success = 0,
Error,
ChildProcessError
};
class FUnrealVirtualizationToolApp
{
public:
FUnrealVirtualizationToolApp();
~FUnrealVirtualizationToolApp();
EInitResult Initialize();
EProcessResult Run();
private:
void PrintCmdLineHelp() const;
EProcessResult ProcessProjects(TArray<TUniquePtr<FCommandOutput>>& OutputArray);
bool TryLoadModules();
bool TryInitEnginePlugins();
EInitResult TryParseCmdLine();
EInitResult TryParseGlobalOptions(const TCHAR* CmdLine);
EInitResult CreateCommandFromString(const FString& CommandName, const TCHAR* Cmdline);
bool TrySortFilesByProject(const TArray<FString>& Packages);
bool TryFindProject(const FString& PackagePath, FString& ProjectFilePath, FString& PluginFilePath) const;
FProject& FindOrAddProject(FString&& ProjectFilePath);
bool IsChildProcess() const;
void AddGlobalOption(FStringView Options);
static bool TryReadChildProcessOutputFile(const FGuid& ChildProcessId, const FCommand& Command, TArray<TUniquePtr<FCommandOutput>>& OutputArray);
static bool TryWriteChildProcessOutputFile(const FString& ChildProcessId, const TArray<TUniquePtr<FCommandOutput>>& OutputArray);
/** Note not currently static due to dependencies */
bool TryReadChildProcessInputFile(const FString& InputPath);
static bool TryWriteChildProcessInputFile(const FGuid& ChildProcessId, const FCommand& Command, const FProject& Project, FStringBuilderBase& OutPath);
static void CleanUpChildProcessFiles(const FGuid& ChildProcessId);
static EProcessResult LaunchChildProcess(const FCommand& Command, const FProject& Project, FStringView GlobalOptions, TArray<TUniquePtr<FCommandOutput>>& OutputArray);
private:
/** Override used to suppress log messages */
TUniquePtr<FFeedbackContext> OutputDeviceOverride;
/** Stored the id of the child process. This is the base file name of the input file used to launch it */
FString ChildProcessId;
/** A string containing all global options that were found in the cmdline */
FString GlobalCmdlineOptions;
/** Data structure holding the files in the changelist sorted by project and then by plugin*/
TArray<FProject> Projects;
/** The mode for the application to run */
EMode Mode = EMode::Unknown;
/** The command being processed */
TUniquePtr<FCommand> CurrentCommand;
};
} //namespace UE::Virtualization