Files
UnrealEngine/Engine/Plugins/Bridge/Source/MegascansPlugin/Private/TCPServer.cpp
2025-05-18 13:04:45 +08:00

105 lines
2.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "TCPServer.h"
#include "HAL/RunnableThread.h"
#include "UObject/GarbageCollection.h"
#include "AssetsImportController.h"
#include "Sockets.h"
#include "TickableEditorObject.h"
#include "UObject/UObjectGlobals.h"
TQueue<FString> FTCPServer::ImportQueue;
/* Actually import data during the "Game tick" phase when components can be created and destroyed etc. */
class FDeferredPackageImporter : public FTickableEditorObject
{
public:
FDeferredPackageImporter() {}
virtual ~FDeferredPackageImporter() {}
virtual TStatId GetStatId() const override { RETURN_QUICK_DECLARE_CYCLE_STAT(DeferredPackageImporter, STATGROUP_Tickables); }
virtual ETickableTickType GetTickableTickType() const override { return ETickableTickType::Always; }
virtual void Tick(float DeltaTime) override
{
// Not sure if these are required
if (IsGarbageCollecting() || GIsSavingPackage)
{
return;
}
if (FTCPServer::ImportQueue.IsEmpty())
{
return;
}
FString ImportData;
FTCPServer::ImportQueue.Dequeue(ImportData);
FAssetsImportController::Get()->DataReceived(ImportData);
}
};
FTCPServer::FTCPServer()
{
FThreadSafeCounter WorkerCounter;
FString ThreadName(FString::Printf(TEXT("MegascansPlugin%i"), WorkerCounter.Increment()));
ClientThread = FRunnableThread::Create(this, *ThreadName, 8 * 1024, TPri_Normal);
static FDeferredPackageImporter PackageImporter;
}
FTCPServer::~FTCPServer()
{
Stop();
if (ClientThread != NULL)
{
ClientThread->Kill(true);
delete ClientThread;
}
}
bool FTCPServer::Init()
{
Stopping = false;
return true;
}
uint32 FTCPServer::Run()
{
/*while (!Stopping)
{
FPlatformProcess::Sleep(0.3f);
}*/
return 0;
}
// bool FTCPServer::RecvMessage(FSocket* Socket, uint32 DataSize, FString& Message)
//{
// check(Socket);
// FArrayReaderPtr Datagram = MakeShareable(new FArrayReader(true));
// int32 stuff = 16;
// Datagram->Init(FMath::Min(DataSize, 65507u), 81920);
// int32 BytesRead = 0;
//
// if (Socket->Recv(Datagram->GetData(), Datagram->Num(), BytesRead))
// {
//
// char* Data = (char*)Datagram->GetData();
// Data[BytesRead] = '\0';
// FString message = UTF8_TO_TCHAR(Data);
// Message = message;
//
// return true;
// }
//
// return false;
// }
bool FTCPServer::HandleListenerConnectionAccepted(class FSocket *ClientSocket, const FIPv4Endpoint &ClientEndpoint)
{
PendingClients.Enqueue(ClientSocket);
return true;
}