AMQP-CPP/src/tcpstate.h

142 lines
3.1 KiB
C++

/**
* TcpState.h
*
* Base class / interface of the various states of the TCP connection
*
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
* @copyright 2015 - 2016 Copernica BV
*/
/**
* Include guard
*/
#pragma once
/**
* Set up namespace
*/
namespace AMQP {
/**
* Class definition
*/
class TcpState
{
protected:
/**
* Parent TcpConnection object as is seen by the user
* @var TcpConnection
*/
TcpConnection *_connection;
/**
* User-supplied handler
* @var TcpHandler
*/
TcpHandler *_handler;
protected:
/**
* Protected constructor
* @param connection Original TCP connection object
* @param handler User-supplied handler class
*/
TcpState(TcpConnection *connection, TcpHandler *handler) :
_connection(connection), _handler(handler) {}
/**
* Protected "copy" constructor
* @param state Original TcpState object
*/
TcpState(const TcpState *state) :
_connection(state->_connection), _handler(state->_handler) {}
public:
/**
* Virtual destructor
*/
virtual ~TcpState() = default;
/**
* Process the filedescriptor in the object
* @param fd The filedescriptor that is active
* @param flags AMQP::readable and/or AMQP::writable
* @return New implementation object
*/
virtual TcpState *process(int fd, int flags)
{
// default implementation does nothing and preserves same implementation
return this;
}
/**
* Send data over the connection
* @param buffer buffer to send
* @param size size of the buffer
*/
virtual void send(const char *buffer, size_t size)
{
// default does nothing
}
/**
* Report that heartbeat negotiation is going on
* @param heartbeat suggested heartbeat
* @return uint16_t accepted heartbeat
*/
virtual uint16_t reportNegotiate(uint16_t heartbeat)
{
// pass to handler
return _handler->onNegotiate(_connection, heartbeat);
}
/**
* Flush the connection
* @return TcpState new implementation object
*/
virtual TcpState *flush() { return this; }
/**
* Report to the handler that the object is in an error state
* @param error
*/
void reportError(const char *error)
{
// pass to handler
_handler->onError(_connection, error);
}
/**
* Report that a heartbeat frame was received
*/
void reportHeartbeat()
{
// pass to handler
_handler->onHeartbeat(_connection);
}
/**
* Report to the handler that the connection is ready for use
*/
void reportConnected()
{
// pass to handler
_handler->onConnected(_connection);
}
/**
* Report to the handler that the connection was nicely closed
*/
void reportClosed()
{
// pass to handler
_handler->onClosed(_connection);
}
};
/**
* End of namespace
*/
}