2011-06-15 15:32:22 +00:00
|
|
|
#include "clienttransmit.h"
|
2018-01-29 21:55:48 +01:00
|
|
|
|
2011-06-14 15:20:00 +00:00
|
|
|
#include "../../clib/esignal.h"
|
2018-01-29 21:55:48 +01:00
|
|
|
#include "../../clib/rawtypes.h"
|
|
|
|
|
#include "../globals/network.h"
|
2016-02-25 18:29:59 +01:00
|
|
|
#include "../polsem.h"
|
2018-01-29 21:55:48 +01:00
|
|
|
#include "client.h"
|
2014-12-30 14:14:41 +01:00
|
|
|
|
2016-02-19 19:26:35 +01:00
|
|
|
namespace Pol
|
|
|
|
|
{
|
|
|
|
|
namespace Network
|
|
|
|
|
{
|
2018-01-29 21:55:48 +01:00
|
|
|
ClientTransmit::ClientTransmit() : _transmitqueue() {}
|
2014-08-29 16:58:29 +02:00
|
|
|
|
2018-01-29 21:55:48 +01:00
|
|
|
ClientTransmit::~ClientTransmit() {}
|
2014-08-29 16:58:29 +02:00
|
|
|
|
2016-02-19 19:26:35 +01:00
|
|
|
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 = TransmitDataSPtr( new TransmitData );
|
2016-02-25 18:29:59 +01:00
|
|
|
transmitdata->client = client->getWeakPtr();
|
2016-02-19 19:26:35 +01:00
|
|
|
transmitdata->len = len;
|
|
|
|
|
transmitdata->data.assign( message, message + len );
|
|
|
|
|
transmitdata->disconnects = false;
|
|
|
|
|
_transmitqueue.push_move( std::move( transmitdata ) );
|
|
|
|
|
}
|
2011-06-14 15:20:00 +00:00
|
|
|
|
2016-02-19 19:26:35 +01:00
|
|
|
void ClientTransmit::QueueDisconnection( Client* client )
|
|
|
|
|
{
|
|
|
|
|
auto transmitdata = TransmitDataSPtr( new TransmitData );
|
|
|
|
|
transmitdata->disconnects = true;
|
2016-02-25 18:29:59 +01:00
|
|
|
transmitdata->client = client->getWeakPtr();
|
|
|
|
|
_transmitqueue.push_move( std::move( transmitdata ) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClientTransmit::QueueDelete( Client* client )
|
|
|
|
|
{
|
|
|
|
|
auto transmitdata = TransmitDataSPtr( new TransmitData );
|
|
|
|
|
transmitdata->remove = true;
|
|
|
|
|
transmitdata->client = client->getWeakPtr();
|
2016-02-19 19:26:35 +01:00
|
|
|
_transmitqueue.push_move( std::move( transmitdata ) );
|
|
|
|
|
}
|
2011-12-01 22:05:02 +00:00
|
|
|
|
2016-02-19 19:26:35 +01:00
|
|
|
TransmitDataSPtr ClientTransmit::NextQueueEntry()
|
|
|
|
|
{
|
|
|
|
|
auto transmitdata = TransmitDataSPtr();
|
|
|
|
|
_transmitqueue.pop_wait( &transmitdata );
|
|
|
|
|
return transmitdata;
|
|
|
|
|
}
|
2011-06-14 15:20:00 +00:00
|
|
|
|
2016-02-19 19:26:35 +01:00
|
|
|
void ClientTransmitThread()
|
|
|
|
|
{
|
|
|
|
|
ClientTransmit* transmit_instance = Core::networkManager.clientTransmit.get();
|
|
|
|
|
while ( !Clib::exit_signalled )
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
auto data = transmit_instance->NextQueueEntry();
|
2016-02-25 18:29:59 +01:00
|
|
|
if ( data->client.exists() )
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
2016-02-25 18:29:59 +01:00
|
|
|
if ( data->remove )
|
|
|
|
|
{
|
|
|
|
|
Core::PolLock lock;
|
2022-11-29 07:02:53 +01:00
|
|
|
delete data->client.get_weakptr();
|
2016-02-25 18:29:59 +01:00
|
|
|
}
|
2018-01-29 21:55:48 +01:00
|
|
|
else if ( data->disconnects )
|
|
|
|
|
{
|
2016-02-19 19:26:35 +01:00
|
|
|
data->client->forceDisconnect();
|
2016-03-04 00:37:43 +01:00
|
|
|
}
|
2016-02-19 19:26:35 +01:00
|
|
|
else if ( data->client->isReallyConnected() )
|
2022-11-29 07:02:53 +01:00
|
|
|
{
|
2020-09-21 07:59:23 -07:00
|
|
|
data->client->transmit( static_cast<void*>( &data->data[0] ), data->len );
|
2022-11-29 07:02:53 +01:00
|
|
|
}
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch ( ClientTransmitQueue::Canceled& )
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
2013-12-21 09:10:46 +00:00
|
|
|
}
|
2011-06-14 15:20:00 +00:00
|
|
|
}
|
2020-08-03 20:30:27 +02:00
|
|
|
} // namespace Network
|
|
|
|
|
} // namespace Pol
|