You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
152 lines
4.7 KiB
C++
152 lines
4.7 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#pragma once
|
|
|
|
#include "HAL/Platform.h"
|
|
#include "Containers/StringView.h"
|
|
#include "Containers/UnrealString.h"
|
|
#include "Dom/JsonObject.h"
|
|
#include "Misc/TVariant.h"
|
|
#include "Policies/PrettyJsonPrintPolicy.h"
|
|
#include "Serialization/JsonWriter.h"
|
|
#include "Templates/UniquePtr.h"
|
|
|
|
#ifndef UE_WITH_ZEN
|
|
# if PLATFORM_WINDOWS
|
|
# define UE_WITH_ZEN 1
|
|
# else
|
|
# define UE_WITH_ZEN 0
|
|
# endif
|
|
#endif
|
|
|
|
#define UE_API ZEN_API
|
|
|
|
namespace UE::Zen
|
|
{
|
|
|
|
struct FServiceConnectSettings
|
|
{
|
|
FString HostName;
|
|
uint16 Port = 1337;
|
|
};
|
|
|
|
struct FServiceAutoLaunchSettings
|
|
{
|
|
FString DataPath;
|
|
FString ExtraArgs;
|
|
uint16 DesiredPort = 1337;
|
|
bool bShowConsole = false;
|
|
bool bLimitProcessLifetime = false;
|
|
};
|
|
|
|
struct FServiceSettings
|
|
{
|
|
TVariant<FServiceAutoLaunchSettings, FServiceConnectSettings> SettingsVariant;
|
|
|
|
inline bool IsAutoLaunch() const { return SettingsVariant.IsType<FServiceAutoLaunchSettings>(); }
|
|
inline bool IsConnectExisting() const { return SettingsVariant.IsType<FServiceConnectSettings>(); }
|
|
|
|
UE_API void ReadFromConfig();
|
|
UE_API void ReadFromJson(FJsonObject& JsonObject);
|
|
UE_API void ReadFromURL(FStringView InstanceURL);
|
|
|
|
UE_API void WriteToJson(TJsonWriter<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>& Writer) const;
|
|
|
|
private:
|
|
bool TryApplyAutoLaunchOverride();
|
|
};
|
|
|
|
};
|
|
|
|
#if UE_WITH_ZEN
|
|
|
|
#include "ZenStatistics.h"
|
|
|
|
namespace UE::Zen
|
|
{
|
|
|
|
class FZenServiceInstance;
|
|
|
|
/**
|
|
* Type used to declare usage of a Zen server instance whether the shared default instance or a unique non-default instance.
|
|
* Used to help manage launch, and optionally in the future, shutdown a shared default instance. Use the default constructor
|
|
* to reference the default instance (which may be launched on demand), or use the non-default constructors with a specific
|
|
* URL or HostName/Port pair which is required to pre-exist (will not be auto-launched).
|
|
*/
|
|
class FScopeZenService
|
|
{
|
|
public:
|
|
UE_API FScopeZenService();
|
|
UE_API FScopeZenService(FStringView InstanceURL);
|
|
UE_API FScopeZenService(FServiceSettings&& InSettings);
|
|
UE_API ~FScopeZenService();
|
|
|
|
|
|
UE_API const FZenServiceInstance& GetInstance() const { return *ServiceInstance; }
|
|
UE_API FZenServiceInstance& GetInstance() { return *ServiceInstance; }
|
|
|
|
private:
|
|
FZenServiceInstance* ServiceInstance;
|
|
TUniquePtr<UE::Zen::FZenServiceInstance> UniqueNonDefaultInstance;
|
|
};
|
|
|
|
/**
|
|
* Gets the default Zen service instance. The default instance is configured through ZenServiceInstance INI section.
|
|
* The default instance can (depending on configuration):
|
|
* - Auto-launched on demand (optionally elevated on Windows)
|
|
* - Be copied out of the workspace tree before execution
|
|
* - Shared between multiple tools running concurrently (implemented by launching multiple instances and expecting them to communicate and shutdown as needed)
|
|
* - Instigate self-shutdown when all processes that requested it have terminated
|
|
* - Use a subdirectory of the existing local DDC cache path as Zen's data path
|
|
* - Use an upstream Zen service
|
|
* - Be overridden by commandline arguments to reference an existing running instance instead of auto-launching a new instance.
|
|
* Note that no assumptions should be made about the hostname/port of the default instance. Calling code should instead expect
|
|
* that the instance is authoritative over the hostname/port that it will end up using and should query that information from the
|
|
* instance as needed.
|
|
*/
|
|
UE_API FZenServiceInstance& GetDefaultServiceInstance();
|
|
UE_API bool IsDefaultServicePresent();
|
|
|
|
/**
|
|
* A representation of a Zen service instance. Generally not accessed directly, but via FScopeZenService.
|
|
*/
|
|
class FZenServiceInstance
|
|
{
|
|
public:
|
|
|
|
UE_API FZenServiceInstance();
|
|
UE_API FZenServiceInstance(FStringView InstanceURL);
|
|
UE_API FZenServiceInstance(FServiceSettings&& InSettings);
|
|
UE_API ~FZenServiceInstance();
|
|
|
|
inline const TCHAR* GetURL() const { return *URL; }
|
|
inline const TCHAR* GetHostName() const { return *HostName; }
|
|
inline uint16 GetPort() const { return Port; }
|
|
inline const FServiceSettings& GetServiceSettings() const { return Settings; }
|
|
UE_API bool GetStats(FZenStats& stats) const;
|
|
UE_API bool IsServiceRunning();
|
|
UE_API bool IsServiceReady();
|
|
|
|
static uint16 GetAutoLaunchedPort() { return AutoLaunchedPort; }
|
|
|
|
private:
|
|
|
|
void Initialize();
|
|
void PromptUserToStopRunningServerInstance(const FString& ServerFilePath);
|
|
FString ConditionalUpdateLocalInstall();
|
|
static bool AutoLaunch(const FServiceAutoLaunchSettings& InSettings, FString&& ExecutablePath, FString& OutHostName, uint16& OutPort);
|
|
|
|
FServiceSettings Settings;
|
|
FString URL;
|
|
FString HostName;
|
|
uint16 Port;
|
|
static inline uint16 AutoLaunchedPort = 0;
|
|
bool bHasLaunchedLocal = false;
|
|
};
|
|
|
|
} // namespace UE::Zen
|
|
|
|
#endif // UE_WITH_ZEN
|
|
|
|
#undef UE_API
|