Files
UnrealEngineUWP/Engine/Source/Developer/TargetPlatform/Public/Interfaces/ITargetDevice.h
Wojciech Krywult 7b5537cc26 CookOnTheFly (platform protocol): Editor: Added support of the platform-specific transport communication protocols to the editor and use it in the cooking server.
This change allows the cooking server to communicate with clients using platform-specific communication protocols instead of TCP (the default).

This new mode is activated by adding '-platformprotocol' command-line parameter when starting the cooking server (in addition to the usual '-cookonthefly').

The new functionality is included in FNetworkFileServerPlatformProtocol, which is a variant of the preexisting FNetworkFileServer but using ITargetDevice/ITargetDeviceSocket interfaces instead of traditional sockets.

Direct communication with targets is only supported on some platforms, which can be checked by calling ITargetPlatform::SupportsFeature(ETargetPlatformFeatures::DirectDataExchange).

#rb jeff.newquist
#preflight 62166a4237178b0175af6269

[CL 19094838 by Wojciech Krywult in ue5-main branch]
2022-02-23 12:54:09 -05:00

466 lines
12 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Interfaces/TargetDeviceId.h"
#include "Interfaces/ITargetDeviceSocket.h"
class ITargetDevice;
class ITargetDeviceOutput;
/**
* Enumerates features that may be supported by target devices.
*/
enum class ETargetDeviceFeatures
{
/** Multiple instances of a game can run at the same time. */
MultiLaunch,
/** The device can be powered off remotely. */
PowerOff,
/** The device can be powered on remotely. */
PowerOn,
/** Snapshot of processes running on the device. */
ProcessSnapshot,
/** The device can be rebooted remotely. */
Reboot
};
/**
* Enumerates target device types.
*/
enum class ETargetDeviceTypes
{
/** Indeterminate device type. */
Indeterminate,
/** The device is a web browser (i.e. Flash). */
Browser,
/** The device is a game console. */
Console,
/** The device is a desktop computer. */
Desktop,
/** The device is a smart phone. */
Phone,
/** The device is a tablet computer. */
Tablet,
/** The device is a standalone HMD */
HMD
};
namespace TargetDeviceTypes
{
/**
* Returns the string representation of the specified ETargetDeviceTypes value.
*
* @param Configuration The value to get the string for.
* @return A string value.
*/
inline FString ToString(ETargetDeviceTypes DeviceType)
{
switch (DeviceType)
{
case ETargetDeviceTypes::Browser:
return FString("Browser");
case ETargetDeviceTypes::Console:
return FString("Console");
case ETargetDeviceTypes::Desktop:
return FString("Desktop");
case ETargetDeviceTypes::Phone:
return FString("Phone");
case ETargetDeviceTypes::Tablet:
return FString("Tablet");
default:
return FString("Indeterminate");
}
}
}
/**
* Enumerates states of threads running on a target device.
*/
enum class ETargetDeviceThreadStates
{
/** Unknown thread state. */
Unknown,
/** The thread can run, but is not running right now. */
CanRun,
/** The thread is inactive, i.e. has just been created or exited. */
Inactive,
/** The thread cannot run right now. */
Inhibited,
/** The thread is in the run queue. */
RunQueue,
/** The thread is running. */
Running
};
/**
* Enumerates wait states of threads running on a target device.
*/
enum class ETargetDeviceThreadWaitStates
{
/** Unknown wait state. */
Unknown,
/** The thread is blocked by a lock. */
Locked,
/** The thread is sleeping. */
Sleeping,
/** The thread is suspended. */
Suspended,
/** The thread is swapped. */
Swapped,
/** The thread is waiting on an interrupt. */
Waiting
};
/**
* Structure for thread information.
*/
struct FTargetDeviceThreadInfo
{
/** Holds the exit code. */
uint64 ExitCode;
/** Holds the thread identifier. */
uint32 Id;
/** Holds the name of the thread. */
FString Name;
/** Holds the thread's stack size. */
uint64 StackSize;
/** Holds the thread's current state. */
ETargetDeviceThreadStates State;
/** Holds the thread's current wait state. */
ETargetDeviceThreadWaitStates WaitState;
};
/**
* Structure for information for processes that are running on a target device.
*/
struct FTargetDeviceProcessInfo
{
/** Holds the process identifier. */
int64 Id;
/** Holds the process name. */
FString Name;
/** Holds the identifier of the parent process. */
uint64 ParentId;
/** Holds the collection of threads that belong to this process. */
TArray<FTargetDeviceThreadInfo> Threads;
/** The name of the user that owns this process. */
FString UserName;
};
/** Type definition for shared pointers to instances of ITargetDevice. */
typedef TSharedPtr<class ITargetDevice, ESPMode::ThreadSafe> ITargetDevicePtr;
/** Type definition for shared references to instances of ITargetDevice. */
typedef TSharedRef<class ITargetDevice, ESPMode::ThreadSafe> ITargetDeviceRef;
/** Type definition for weak pointers to instances of ITargetDevice. */
typedef TWeakPtr<class ITargetDevice, ESPMode::ThreadSafe> ITargetDeviceWeakPtr;
/** Type definition for shared pointers to instances of ITargetDeviceOutput. */
typedef TSharedPtr<class ITargetDeviceOutput, ESPMode::ThreadSafe> ITargetDeviceOutputPtr;
/**
* Interface for target devices.
*/
class ITargetDevice
{
public:
/**
* Connect to the physical device.
*
* @return true if the device is connected, false otherwise.
*/
virtual bool Connect() = 0;
/**
* Disconnect from the physical device.
*/
virtual void Disconnect() = 0;
/**
* Gets the device type.
*
* @return Device type.
*/
virtual ETargetDeviceTypes GetDeviceType() const = 0;
/**
* Gets the unique device identifier.
*
* @return Device identifier.
* @see GetName
*/
virtual FTargetDeviceId GetId() const = 0;
/**
* Gets the name of the device.
*
* In contrast to GetId(), this method is intended to return a human readable
* name for use in the user interface. Depending on the target platform, this
* name may be some user defined string, a host name, an IP address, or some
* other string identifying the device that does not need to be unique.
*
* @return Device name.
* @see GetId
*/
virtual FString GetName() const = 0;
/**
* Gets the name of the operating system running on this device.
*
* @return Operating system name.
*/
virtual FString GetOperatingSystemName() = 0;
/**
* Creates a snapshot of processes currently running on the device.
*
* @param OutProcessInfos Will contain the information for running processes.
* @return The number of returned processes.
*/
virtual int32 GetProcessSnapshot( TArray<FTargetDeviceProcessInfo>& OutProcessInfos ) = 0;
/**
* Creates a snapshot of processes currently running on the device.
*
* @param OutProcessInfos Will contain the information for running processes.
* @param CompleteHandler will be invoked when process snapshot information is available
* @return True if retrieving a process snapshot is supported
*/
virtual bool GetProcessSnapshotAsync(TFunction<void(const TArray<FTargetDeviceProcessInfo>&)> CompleteHandler)
{
TArray<FTargetDeviceProcessInfo> InProcessInfos;
GetProcessSnapshot(InProcessInfos);
CompleteHandler(InProcessInfos);
return true;
}
/**
* Gets the TargetPlatform that this device belongs to.
*/
virtual const class ITargetPlatform& GetTargetPlatform() const = 0;
/**
* Checks whether this device is connected.
*
* @return true if the device is connected, false otherwise.
*/
virtual bool IsConnected() = 0;
/**
* Checks whether this is the default device.
*
* Note that not all platforms may have a notion of default devices.
*
* @return true if this is the default device, false otherwise.
*/
virtual bool IsDefault() const = 0;
/**
* Checks whether this device is authorized to be used with this computer.
*
* This is true for most platforms by default, but may be false for mobile platforms
*
* @return true if this this device is authorized for launch
*/
virtual bool IsAuthorized() const { return true; }
/**
* Powers off the device.
*
* @param Force Whether to force powering off.
* @return true if the device will be powered off, false otherwise.
*/
virtual bool PowerOff( bool Force ) = 0;
/**
* Powers on the device.
*
* @return true if the device will be powered on, false otherwise.
*/
virtual bool PowerOn() = 0;
/**
* Reboot the device.
*
* @param bReconnect If true, wait and reconnect when done.
* @return true if the reboot was successful from the perspective of the PC .
*/
virtual bool Reboot( bool bReconnect = false ) = 0;
/**
* Checks whether the target device supports the specified feature.
*
* @param Feature The feature to check.
* @return true if the feature is supported, false otherwise.
*/
virtual bool SupportsFeature( ETargetDeviceFeatures Feature ) const = 0;
/**
* Terminates a process that was launched on the device using the Launch() or Run() methods.
*
* @param ProcessId The identifier of the process to terminate.
* @return true if the process was terminated, false otherwise.
*/
virtual bool TerminateProcess( const int64 ProcessId ) = 0;
/**
* Set credentials for the user account to use on the device
*
* @param UserName The user account on the device we will run under
* @param UserPassword The password for the user account on the device we will run under.
*/
virtual void SetUserCredentials( const FString& UserName, const FString& UserPassword ) = 0;
/**
* Get credentials for the user account to use on the device
*
* @param OutUserName The user account on the device we will run under
* @param OutUserPassword The password for the user account on the device we will run under
* @return true on success, false if not supported.
*/
virtual bool GetUserCredentials( FString& OutUserName, FString& OutUserPassword ) = 0;
/**
* Execute console command on the device
*
* @param ExecCommand Command to execute
*/
virtual void ExecuteConsoleCommand(const FString& ExecCommand) const {};
/**
* Create device output router
*
* This will route device logs into specified OutputDevice
* until connection to device is alive
*
* @param Output OutputDevice to where output should be routed (has to be thread safe)
* @return Valid router object for devices that support output routing
*/
virtual ITargetDeviceOutputPtr CreateDeviceOutputRouter(FOutputDevice* Output) const { return nullptr; };
/**
* Cancel the application running on the device
* @param ProcessIdentifier The bundle id
*/
virtual bool TerminateLaunchedProcess(const FString & ProcessIdentifier) { return false; };
/**
* Execute console command on the device to reload the global shader map
*
* @param GlobalShaderMapDirectory path to directory that contains global shader map
*/
virtual void ReloadGlobalShadersMap(const FString& GlobalShaderMapDirectory) const
{
return ExecuteConsoleCommand(TEXT("ReloadGlobalShaders"));
}
/**
* Opens a direct connection with the device allowing data exchange with a process running on the target.
*
* ProtocolIndex is a number that identifies the connection and has to be know both to the target
* process and the PC. There can be only one connection using a given protocol index at a time.
*
* You may check EHostProtocol enumeration for known protocols used by the engine.
*
* This function just opens a communication channel but doesn't check if there is a peer
* on the other end of the connection. To know this, you should either check IsProtocolAvailable
* or ITargetDeviceSocket::Connected.
*
* @param ProtocolIndex Unique index of the communication channel (from 0 to a platform-dependent maximum).
* @return Socket object on success, nullptr otherwise.
* @see CloseSocket, EHostProtocol, IsProtocolAvailable, ITargetDeviceSocket::Connected
*/
virtual ITargetDeviceSocketPtr OpenConnection(uint32 ProtocolIndex) { return nullptr; }
/**
* Closes a previously opened connection with a process on the target.
*
* @param Socket Socket object returned by OpenSocket.
* @see OpenSocket
*/
virtual void CloseConnection(ITargetDeviceSocketPtr Socket) { }
/**
* Checks if connections using the given ProtocolIndex are available for this device at the moment.
* If this function returns true, it means that OpenConnection should succeed and communication
* with a game running on the target should be possible.
*
* @param ProtocolIndex Unique index of the communication channel (from 0 to a platform-dependent maximum).
* @return True if the protocol is available and we can connect to the device, false otherwise.
*/
virtual bool IsProtocolAvailable(uint32 ProtocolIndex) const { return false; }
public:
/**
* Get the "All devices" flag for the platform
*
* @return true if the platform has an "All devices" proxy.
*/
virtual bool IsPlatformAggregated() const { return false; }
/**
* Get the "All devices" name
*
* @return "All devices" name.
*/
virtual FString GetAllDevicesName() const { return FString(); }
/**
* Get the "All devices" default variant
*
* @return "All devices" default variant.
*/
virtual FName GetAllDevicesDefaultVariant() const { return FName(); }
public:
/** Virtual destructor. */
virtual ~ITargetDevice() { }
};