Files
UnrealEngineUWP/Engine/Source/Programs/UnrealTraceServer/src/TraceRelay.cpp

125 lines
2.3 KiB
C++
Raw Normal View History

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Pch.h"
#include "AsioSocket.h"
#include "Recorder.h"
#include "TraceRelay.h"
////////////////////////////////////////////////////////////////////////////////
FTraceRelay::FTraceRelay(
asio::io_context& IoContext,
FAsioReadable* InInput,
uint32 InSessionId,
FRecorder& InRecorder)
: FAsioTcpServer(IoContext)
, FAsioTickable(IoContext)
, Input(InInput)
, Recorder(InRecorder)
, SessionId(InSessionId)
{
StartServer();
TickOnce(3000);
}
////////////////////////////////////////////////////////////////////////////////
FTraceRelay::~FTraceRelay()
{
check(!Input->IsOpen());
delete Input;
if (Output != nullptr)
{
check(!Output->IsOpen());
delete Output;
}
}
////////////////////////////////////////////////////////////////////////////////
void FTraceRelay::Close()
{
if (Output != nullptr)
{
Output->Close();
}
Input->Close();
FAsioTcpServer::Close();
}
////////////////////////////////////////////////////////////////////////////////
bool FTraceRelay::IsOpen() const
{
if (FAsioTcpServer::IsOpen())
{
return true;
}
bool bOpen = Input->IsOpen();
if (Output != nullptr)
{
bOpen &= Output->IsOpen();
}
return bOpen;
}
////////////////////////////////////////////////////////////////////////////////
bool FTraceRelay::OnAccept(asio::ip::tcp::socket& Socket)
{
Output = new FAsioSocket(Socket);
StopTick();
OnIoComplete(OpStart, 0);
return false;
}
////////////////////////////////////////////////////////////////////////////////
void FTraceRelay::OnTick()
{
if (FAsioTcpServer::IsOpen())
{
Close();
return;
}
return OnIoComplete(OpStart, 0);
}
////////////////////////////////////////////////////////////////////////////////
void FTraceRelay::OnIoComplete(uint32 Id, int32 Size)
{
if (Size < 0)
{
if (Id == OpRead && SessionId && -Size == asio::error::eof)
{
for (int i = 0, n = Recorder.GetSessionCount(); i < n; ++i)
{
const FRecorder::FSession* Session = Recorder.GetSessionInfo(i);
if (Session->GetId() == SessionId)
{
TickOnce(200);
return;
}
}
}
Output->Close();
Input->Close();
return;
}
switch (Id)
{
case OpStart:
case OpSend:
Input->Read(Buffer, BufferSize, this, OpRead);
break;
case OpRead:
Output->Write(Buffer, Size, this, OpSend);
break;
}
}
/* vim: set noexpandtab : */