ConcertTransportMessages.h
unknown
c_cpp
4 years ago
6.7 kB
11
Indexable
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Async/Future.h"
#include "Misc/Guid.h"
#include "Misc/EnumClassFlags.h"
#include "UObject/ObjectMacros.h"
#include "ConcertTransportMessages.generated.h"
/** Message Flags when sent */
UENUM()
enum class EConcertMessageFlags : uint8
{
/** No special flags */
None = 0,
/** Guarantee that this message is received by the client(s) and processed in the order they were sent */
ReliableOrdered = 1<<0,
/** Message sent with this flag should be uniquely identifiable across clients. */
UniqueId = 1<<1,
};
ENUM_CLASS_FLAGS(EConcertMessageFlags);
/** Response codes to a sent request */
UENUM()
enum class EConcertResponseCode : uint8
{
/** The response code is still pending. */
Pending,
/** The request data was valid. A response was generated. */
Success,
/** The request data was valid, but the request failed. A response was generated. */
Failed,
/** The request data was invalid. No response was generated. */
InvalidRequest,
/** The request type was unknown on the target instance. No response was generated. */
UnknownRequest,
/** The request failed to reach the target instance. No response was generated. */
TimedOut,
};
/** Handshake codes used during reliable channel negotiation */
UENUM()
enum class EConcertReliableHandshakeState : uint8
{
/** Handshake initialization state */
None,
/** Handshake is being negotiated */
Negotiate,
/** Handshake was successfully negotiated */
Success,
};
/** Versioning for concert message protocol */
UENUM()
enum class EConcertMessageVersion : uint32
{
BeforeVersioning = 0,
Initial,
// -----<new versions can be added above this line>-------------------------------------------------
VersionPlusOne,
LatestVersion = VersionPlusOne - 1
};
/** Base class for all message data sent through concert */
USTRUCT()
struct FConcertMessageData
{
GENERATED_BODY()
FConcertMessageData()
: MessageOrderIndex(0)
, ChannelId(UnreliableChannelId)
{
}
virtual ~FConcertMessageData() = default;
bool IsReliable() const
{
return ChannelId != UnreliableChannelId;
}
EConcertMessageFlags GetMessageFlags() const
{
return IsReliable() ? EConcertMessageFlags::ReliableOrdered : EConcertMessageFlags::None;
}
virtual bool IsSafeToHandle() const
{
return true;
}
/** ID of the Endpoint this was sent from */
UPROPERTY(VisibleAnywhere, AdvancedDisplay, Category="Concert Message")
FGuid ConcertEndpointId;
/** ID of the message */
UPROPERTY(VisibleAnywhere, AdvancedDisplay, Category="Concert Message")
FGuid MessageId;
/** Order index of the message (for ordering reliable messages, used when ChannelId != UnreliableChannelId) */
UPROPERTY(VisibleAnywhere, AdvancedDisplay, Category="Concert Message")
uint16 MessageOrderIndex;
/** ID of the channel this message was sent from */
UPROPERTY(VisibleAnywhere, AdvancedDisplay, Category="Concert Message")
uint16 ChannelId;
/** Constant to represent a unreliable channel ID */
static const uint16 UnreliableChannelId = 0;
};
/** Base struct for all concert event messages */
USTRUCT()
struct FConcertEventData : public FConcertMessageData
{
GENERATED_BODY()
};
/** Base struct for all concert request messages */
USTRUCT()
struct FConcertRequestData : public FConcertMessageData
{
GENERATED_BODY()
};
/** Base struct for all concert request response messages */
USTRUCT()
struct FConcertResponseData : public FConcertMessageData
{
GENERATED_BODY()
FConcertResponseData()
: ResponseCode(EConcertResponseCode::Pending)
{
}
FConcertResponseData(EConcertResponseCode InResponseCode)
: ResponseCode(InResponseCode)
{
}
/** Utility to get resolved response data as a future */
template <typename ResponseType>
static FORCEINLINE TFuture<ResponseType> AsFuture(ResponseType&& ResponseData)
{
return MakeFulfilledPromise<ResponseType>(Forward<ResponseType>(ResponseData)).GetFuture();
}
/** ID of the request message we're responding to */
UPROPERTY(VisibleAnywhere, AdvancedDisplay, Category="Concert Message")
FGuid RequestMessageId;
/** Response code for the response */
UPROPERTY(VisibleAnywhere, AdvancedDisplay, Category="Concert Message")
EConcertResponseCode ResponseCode;
/** If the code isn't successful, a reason for it */
UPROPERTY(VisibleAnywhere, AdvancedDisplay, Category="Concert Message")
FText Reason;
};
/** Special event message base struct that is also caught by the endpoint to discover remote endpoint before passing it to handlers */
USTRUCT()
struct FConcertEndpointDiscoveryEvent : public FConcertEventData
{
GENERATED_BODY()
/** Holds the concert messages protocol version, default initialize to `BeforeVersioning` to handle message sent from older protocol. */
UPROPERTY()
EConcertMessageVersion ConcertProtocolVersion = EConcertMessageVersion::BeforeVersioning;
};
/** Message send when an endpoint is closed on a remote peer */
USTRUCT()
struct FConcertEndpointClosedData : public FConcertMessageData
{
GENERATED_BODY()
};
/** Handshake used to negotiate a reliable channel between endpoints (also uses the ReliableChannelId from the base message) */
USTRUCT()
struct FConcertReliableHandshakeData : public FConcertEndpointDiscoveryEvent
{
GENERATED_BODY()
/** State of the handshake */
UPROPERTY()
EConcertReliableHandshakeState HandshakeState = EConcertReliableHandshakeState::None;
/** Channel ID we're going to send reliable messages of */
UPROPERTY(VisibleAnywhere, AdvancedDisplay, Category="Concert Message")
uint16 ReliableChannelId = 0;
/** The next message index that the remote endpoint is going to send */
UPROPERTY(VisibleAnywhere, AdvancedDisplay, Category="Concert Message")
uint16 NextMessageIndex = 0;
/** It's a timespan encoded in ticks. EndpointTimeoutTick represent the time it takes for the sending endpoint to consider another endpoint timed out */
UPROPERTY(config, EditAnywhere, AdvancedDisplay, Category = "Concert Message")
int64 EndpointTimeoutTick = 0;
};
/** Acknowledgment messages to reliable events */
USTRUCT()
struct FConcertAckData : public FConcertMessageData
{
GENERATED_BODY()
/** Time when this acknowledgment was sent (UTC) */
UPROPERTY(VisibleAnywhere, AdvancedDisplay, Category="Concert Message")
int64 AckSendTimeTicks = 0;
/** ID of the source message we're acknowledging */
UPROPERTY(VisibleAnywhere, AdvancedDisplay, Category="Concert Message")
FGuid SourceMessageId;
};
/** Keep alive message */
USTRUCT()
struct FConcertKeepAlive : public FConcertMessageData
{
GENERATED_BODY()
};
/** Force the endpoint to resend pending packages.*/
USTRUCT()
struct FConcertSendResendPending
{
GENERATED_BODY()
};
Editor is loading...