polserver/pol-core/pol/network/clienttransmit.cpp
turleypol 21577d8e5b
Clang Tidy concat namespaces (#855)
* tidy

* Automated clang-tidy change: modernize-concat-nested-namespaces

* compile test

* fix namespace

---------

Co-authored-by: Clang Tidy <clang-tidy@users.noreply.github.com>
2026-01-17 10:30:21 +01:00

87 lines
2.2 KiB
C++

#include "clienttransmit.h"
#include <memory>
#include "../../clib/esignal.h"
#include "../../clib/rawtypes.h"
#include "../globals/network.h"
#include "../polsem.h"
#include "client.h"
namespace Pol::Network
{
ClientTransmit::ClientTransmit() : _transmitqueue() {}
ClientTransmit::~ClientTransmit() = default;
void ClientTransmit::Cancel()
{
_transmitqueue.cancel();
}
void ClientTransmit::AddToQueue( Client* client, const void* data, int len )
{
const u8* message = static_cast<const u8*>( data );
auto transmitdata = std::make_unique<TransmitData>();
transmitdata->client = client->getWeakPtr();
transmitdata->len = len;
transmitdata->data.assign( message, message + len );
transmitdata->disconnects = false;
_transmitqueue.push_move( std::move( transmitdata ) );
}
void ClientTransmit::QueueDisconnection( Client* client )
{
auto transmitdata = std::make_unique<TransmitData>();
transmitdata->disconnects = true;
transmitdata->client = client->getWeakPtr();
_transmitqueue.push_move( std::move( transmitdata ) );
}
void ClientTransmit::QueueDelete( Client* client )
{
auto transmitdata = std::make_unique<TransmitData>();
transmitdata->remove = true;
transmitdata->client = client->getWeakPtr();
_transmitqueue.push_move( std::move( transmitdata ) );
}
TransmitDataSPtr ClientTransmit::NextQueueEntry()
{
auto transmitdata = TransmitDataSPtr();
_transmitqueue.pop_wait( &transmitdata );
return transmitdata;
}
void ClientTransmitThread()
{
ClientTransmit* transmit_instance = Core::networkManager.clientTransmit.get();
while ( !Clib::exit_signalled )
{
try
{
auto data = transmit_instance->NextQueueEntry();
if ( data->client.exists() )
{
if ( data->remove )
{
Core::PolLock lock;
delete data->client.get_weakptr();
}
else if ( data->disconnects )
{
data->client->forceDisconnect();
}
else if ( data->client->isReallyConnected() )
{
data->client->transmit( static_cast<void*>( &data->data[0] ), data->len );
}
}
}
catch ( ClientTransmitQueue::Canceled& )
{
return;
}
}
}
} // namespace Pol::Network