Add confirm.select and confirm.select-ok frames
This commit is contained in:
parent
399d78dfe5
commit
c7a12d22c1
|
|
@ -111,6 +111,13 @@ private:
|
||||||
*/
|
*/
|
||||||
bool processBasicFrame(ConnectionImpl *connection);
|
bool processBasicFrame(ConnectionImpl *connection);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process a confirm frame
|
||||||
|
* @param connection
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
bool processConfirmFrame(ConnectionImpl *connection);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process a transaction frame
|
* Process a transaction frame
|
||||||
* @param connection
|
* @param connection
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,8 @@ channelframe.h
|
||||||
channelimpl.cpp
|
channelimpl.cpp
|
||||||
channelopenframe.h
|
channelopenframe.h
|
||||||
channelopenokframe.h
|
channelopenokframe.h
|
||||||
|
confirmselectframe.h
|
||||||
|
confirmselectokframe.h
|
||||||
connectioncloseframe.h
|
connectioncloseframe.h
|
||||||
connectioncloseokframe.h
|
connectioncloseokframe.h
|
||||||
connectionframe.h
|
connectionframe.h
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
/**
|
||||||
|
* Class describing an AMQP confirm frame
|
||||||
|
*
|
||||||
|
* @author Marcin Gibula <m.gibula@gmail.com>
|
||||||
|
* @copyright 2017 Copernica BV
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up namespace
|
||||||
|
*/
|
||||||
|
namespace AMQP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class implementation
|
||||||
|
*/
|
||||||
|
class ConfirmFrame : public MethodFrame
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* @param channel channel identifier
|
||||||
|
* @param size frame size
|
||||||
|
*/
|
||||||
|
ConfirmFrame(uint16_t channel, uint32_t size) :
|
||||||
|
MethodFrame(channel, size)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor based on incoming frame
|
||||||
|
* @param frame
|
||||||
|
*/
|
||||||
|
ConfirmFrame(ReceivedFrame &frame) :
|
||||||
|
MethodFrame(frame)
|
||||||
|
{}
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Destructor
|
||||||
|
*/
|
||||||
|
virtual ~ConfirmFrame() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class id
|
||||||
|
* @return uint16_t
|
||||||
|
*/
|
||||||
|
virtual uint16_t classID() const override
|
||||||
|
{
|
||||||
|
return 85;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* end namespace
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,88 @@
|
||||||
|
/**
|
||||||
|
* Class describing an AMQP confirm select frame
|
||||||
|
*
|
||||||
|
* @author Marcin Gibula <m.gibula@gmail.com>
|
||||||
|
* @copyright 2017 Copernica BV
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up namespace
|
||||||
|
*/
|
||||||
|
namespace AMQP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class implementation
|
||||||
|
*/
|
||||||
|
class ConfirmSelectFrame : public ConfirmFrame
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* whether to wait for a response
|
||||||
|
* @var BooleanSet
|
||||||
|
*/
|
||||||
|
BooleanSet _noWait;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
* Encode a frame on a string buffer
|
||||||
|
*
|
||||||
|
* @param buffer buffer to write frame to
|
||||||
|
*/
|
||||||
|
virtual void fill(OutBuffer& buffer) const override
|
||||||
|
{
|
||||||
|
// call base
|
||||||
|
ConfirmFrame::fill(buffer);
|
||||||
|
|
||||||
|
// add boolean
|
||||||
|
_noWait.fill(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Decode a confirm select frame from a received frame
|
||||||
|
*
|
||||||
|
* @param frame received frame to decode
|
||||||
|
*/
|
||||||
|
ConfirmSelectFrame(ReceivedFrame& frame) : ConfirmFrame(frame), _noWait(frame) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a confirm select frame
|
||||||
|
*
|
||||||
|
* @param channel channel identifier
|
||||||
|
* @return newly created confirm select frame
|
||||||
|
*/
|
||||||
|
ConfirmSelectFrame(uint16_t channel, bool noWait = false) :
|
||||||
|
ConfirmFrame(channel, 0),
|
||||||
|
_noWait(noWait)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destructor
|
||||||
|
*/
|
||||||
|
virtual ~ConfirmSelectFrame() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the method id
|
||||||
|
* @return uint16_t
|
||||||
|
*/
|
||||||
|
virtual uint16_t methodID() const override
|
||||||
|
{
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return whether to wait for a response
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
bool noWait() const
|
||||||
|
{
|
||||||
|
return _noWait.get(0);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* end namespace
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
/**
|
||||||
|
* Class describing an AMQP confirm select ok frame
|
||||||
|
*
|
||||||
|
* @author Marcin Gibula <m.gibula@gmail.com>
|
||||||
|
* @copyright 2017 Copernica BV
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up namespace
|
||||||
|
*/
|
||||||
|
namespace AMQP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class implementation
|
||||||
|
*/
|
||||||
|
class ConfirmSelectOKFrame : public ConfirmFrame
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
* Encode a frame on a string buffer
|
||||||
|
*
|
||||||
|
* @param buffer buffer to write frame to
|
||||||
|
*/
|
||||||
|
virtual void fill(OutBuffer& buffer) const override
|
||||||
|
{
|
||||||
|
// call base
|
||||||
|
ConfirmFrame::fill(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor for an incoming frame
|
||||||
|
*
|
||||||
|
* @param frame received frame to decode
|
||||||
|
*/
|
||||||
|
ConfirmSelectOKFrame(ReceivedFrame& frame) :
|
||||||
|
ConfirmFrame(frame)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a confirm select ok frame
|
||||||
|
*
|
||||||
|
* @param channel channel identifier
|
||||||
|
* @return newly created confirm select ok frame
|
||||||
|
*/
|
||||||
|
ConfirmSelectOKFrame(uint16_t channel) :
|
||||||
|
ConfirmFrame(channel, 0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destructor
|
||||||
|
*/
|
||||||
|
virtual ~ConfirmSelectOKFrame() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the method id
|
||||||
|
* @return uint16_t
|
||||||
|
*/
|
||||||
|
virtual uint16_t methodID() const override
|
||||||
|
{
|
||||||
|
return 11;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process the frame
|
||||||
|
* @param connection The connection over which it was received
|
||||||
|
* @return bool Was it succesfully processed?
|
||||||
|
*/
|
||||||
|
virtual bool process(ConnectionImpl *connection) override
|
||||||
|
{
|
||||||
|
// we need the appropriate channel
|
||||||
|
auto channel = connection->channel(this->channel());
|
||||||
|
|
||||||
|
// channel does not exist
|
||||||
|
if(!channel) return false;
|
||||||
|
|
||||||
|
// report that the channel is open
|
||||||
|
if (channel->reportSuccess()) channel->onSynchronized();
|
||||||
|
|
||||||
|
// done
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* end namespace
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -90,6 +90,7 @@
|
||||||
#include "exchangeframe.h"
|
#include "exchangeframe.h"
|
||||||
#include "queueframe.h"
|
#include "queueframe.h"
|
||||||
#include "basicframe.h"
|
#include "basicframe.h"
|
||||||
|
#include "confirmframe.h"
|
||||||
#include "transactionframe.h"
|
#include "transactionframe.h"
|
||||||
#include "addressinfo.h"
|
#include "addressinfo.h"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,8 @@
|
||||||
*/
|
*/
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
#include "heartbeatframe.h"
|
#include "heartbeatframe.h"
|
||||||
|
#include "confirmselectframe.h"
|
||||||
|
#include "confirmselectokframe.h"
|
||||||
#include "connectionstartokframe.h"
|
#include "connectionstartokframe.h"
|
||||||
#include "connectionstartframe.h"
|
#include "connectionstartframe.h"
|
||||||
#include "connectionsecureframe.h"
|
#include "connectionsecureframe.h"
|
||||||
|
|
@ -336,6 +338,7 @@ bool ReceivedFrame::processMethodFrame(ConnectionImpl *connection)
|
||||||
case 40: return processExchangeFrame(connection);
|
case 40: return processExchangeFrame(connection);
|
||||||
case 50: return processQueueFrame(connection);
|
case 50: return processQueueFrame(connection);
|
||||||
case 60: return processBasicFrame(connection);
|
case 60: return processBasicFrame(connection);
|
||||||
|
case 85: return processConfirmFrame(connection);
|
||||||
case 90: return processTransactionFrame(connection);
|
case 90: return processTransactionFrame(connection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -493,6 +496,27 @@ bool ReceivedFrame::processBasicFrame(ConnectionImpl *connection)
|
||||||
throw ProtocolException("unrecognized basic frame method " + std::to_string(methodID));
|
throw ProtocolException("unrecognized basic frame method " + std::to_string(methodID));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process a confirm frame
|
||||||
|
* @param connection
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
bool ReceivedFrame::processConfirmFrame(ConnectionImpl *connection)
|
||||||
|
{
|
||||||
|
// read the method id
|
||||||
|
uint16_t methodID = nextUint16();
|
||||||
|
|
||||||
|
// construct frame based on method id
|
||||||
|
switch (methodID)
|
||||||
|
{
|
||||||
|
case 10: return ConfirmSelectFrame(*this).process(connection);
|
||||||
|
case 11: return ConfirmSelectOKFrame(*this).process(connection);
|
||||||
|
}
|
||||||
|
|
||||||
|
// this is a problem
|
||||||
|
throw ProtocolException("unrecognized confirm frame method " + std::to_string(methodID));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process a transaction frame
|
* Process a transaction frame
|
||||||
* @param connection
|
* @param connection
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue