140 lines
3.6 KiB
C++
140 lines
3.6 KiB
C++
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
// Copyright (C) 2010 Winch Gate Property Limited
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Affero General Public License as
|
|
// published by the Free Software Foundation, either version 3 of the
|
|
// License, or (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Affero General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
#ifndef NL_RECEIVE_TASK_H
|
|
#define NL_RECEIVE_TASK_H
|
|
|
|
#include "nel/misc/types_nl.h"
|
|
#include "nel/misc/debug.h"
|
|
#include "nel/misc/thread.h"
|
|
#include "nel/misc/buf_fifo.h"
|
|
#include "nel/misc/mutex.h"
|
|
|
|
#include "nel/net/udp_sock.h"
|
|
|
|
#include <vector>
|
|
|
|
|
|
const uint32 MsgHeaderSize = 1+8; // 8 for the date
|
|
|
|
|
|
/**
|
|
* Placeholder for received messages
|
|
*/
|
|
struct TReceivedMessage
|
|
{
|
|
/// Type of incoming events (see also NLNET::CBufNetBase::TEventType)
|
|
enum TEventType { User = 'U', RemoveClient = 'D' };
|
|
|
|
/// Constructor
|
|
TReceivedMessage();
|
|
|
|
/// Resize data
|
|
void resizeData( uint32 datasize ) { _Data.resize( MsgHeaderSize + datasize ); }
|
|
|
|
/// Return a vector containing the address info
|
|
void addressToVector();
|
|
|
|
/// Set address with address info from specified vector
|
|
void vectorToAddress();
|
|
|
|
/// Set "disconnection" message for the current AddrFrom
|
|
void setTypeEvent( TEventType t ) { *_Data.begin() = (uint8)t; }
|
|
|
|
void setDate() { *(sint64*)&(*(_Data.begin()+1)) = NLMISC::CTime::getLocalTime(); }
|
|
|
|
sint64 getDate() { return *(sint64*)&(*(_Data.begin()+1)); }
|
|
|
|
/// Return the event type
|
|
TEventType eventType() const { return (TEventType)(*_Data.begin()); }
|
|
|
|
/// Return a pointer to user data for writing
|
|
uint8 *userDataW() { return &*_Data.begin() + MsgHeaderSize; }
|
|
|
|
/// Return a pointer to user data for reading
|
|
const uint8 *userDataR() const { return &*_Data.begin() + MsgHeaderSize; }
|
|
|
|
/// Return the size of user data
|
|
uint32 userSize() { return (uint32)_Data.size() - MsgHeaderSize; }
|
|
|
|
/// Return the data vector (event type header byte + user data)
|
|
std::vector<uint8>& data() { return _Data; }
|
|
|
|
private:
|
|
|
|
/// One byte for event type (header), followed by user data
|
|
std::vector<uint8> _Data;
|
|
|
|
public:
|
|
|
|
/// Address of sender as CInetAddress
|
|
NLNET::CInetAddress AddrFrom;
|
|
|
|
/// Placeholder vector for address info
|
|
std::vector<uint8> VAddrFrom;
|
|
};
|
|
|
|
|
|
/**
|
|
* receive task
|
|
* \author Olivier Cado
|
|
* \author Nevrax France
|
|
* \date 2001
|
|
*/
|
|
class CReceiveTask : public NLMISC::IRunnable
|
|
{
|
|
public:
|
|
|
|
/// Constructor
|
|
CReceiveTask( uint16 port, uint32 msgsize );
|
|
|
|
/// Destructor
|
|
~CReceiveTask();
|
|
|
|
/// Run
|
|
virtual void run();
|
|
|
|
/// Set new write queue
|
|
void setWriteQueue( NLMISC::CBufFIFO *writequeue );
|
|
|
|
/// Require exit
|
|
void requireExit() { _ExitRequired = true; }
|
|
|
|
private:
|
|
|
|
/// Datagram length
|
|
uint _DatagramLength;
|
|
|
|
/// Received message
|
|
TReceivedMessage _ReceivedMessage;
|
|
|
|
/// Write queue access
|
|
NLMISC::CSynchronized<NLMISC::CBufFIFO*> _WriteQueue;
|
|
|
|
/// Exit required
|
|
volatile bool _ExitRequired;
|
|
|
|
public:
|
|
|
|
/// External datagram socket
|
|
NLNET::CUdpSock *DataSock;
|
|
|
|
};
|
|
|
|
|
|
#endif // NL_RECEIVE_TASK_H
|
|
|
|
/* End of receive_task.h */
|