refactor Connection into a private class, since it can only be created by a Client.
moved ConnectionPrivate methods into Connection
This commit is contained in:
parent
9eabe0587e
commit
60bcfabe2b
|
|
@ -275,7 +275,10 @@ void ChannelPrivate::openOk(const Frame::Method &frame)
|
||||||
|
|
||||||
void ChannelPrivate::setQOS(qint32 prefetchSize, quint16 prefetchCount)
|
void ChannelPrivate::setQOS(qint32 prefetchSize, quint16 prefetchCount)
|
||||||
{
|
{
|
||||||
client_->d_func()->connection_->d_func()->setQOS(prefetchSize, prefetchCount, number, false);
|
Q_UNUSED(prefetchSize)
|
||||||
|
Q_UNUSED(prefetchCount)
|
||||||
|
qDebug() << Q_FUNC_INFO << "temporarily disabled";
|
||||||
|
// client_->d_func()->connection_->d_func()->setQOS(prefetchSize, prefetchCount, number, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChannelPrivate::_q_disconnected()
|
void ChannelPrivate::_q_disconnected()
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,10 @@ void ClientPrivate::disconnect()
|
||||||
}
|
}
|
||||||
|
|
||||||
network_->disconnect();
|
network_->disconnect();
|
||||||
connection_->d_func()->connected = false;
|
|
||||||
|
// NOTE: this should be handled by signals, no need for dptr
|
||||||
|
// access here.
|
||||||
|
// connection_->d_func()->connected = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@
|
||||||
#include <QSharedPointer>
|
#include <QSharedPointer>
|
||||||
|
|
||||||
#include "amqp_network.h"
|
#include "amqp_network.h"
|
||||||
#include "amqp_connection.h"
|
|
||||||
#include "amqp_authenticator.h"
|
#include "amqp_authenticator.h"
|
||||||
|
|
||||||
namespace QAMQP
|
namespace QAMQP
|
||||||
|
|
@ -12,6 +11,7 @@ namespace QAMQP
|
||||||
|
|
||||||
class Queue;
|
class Queue;
|
||||||
class Exchange;
|
class Exchange;
|
||||||
|
class Connection;
|
||||||
class ClientPrivate
|
class ClientPrivate
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
#include "amqp_connection.h"
|
|
||||||
#include "amqp_connection_p.h"
|
#include "amqp_connection_p.h"
|
||||||
#include "amqp_client.h"
|
#include "amqp_client.h"
|
||||||
#include "amqp_client_p.h"
|
#include "amqp_client_p.h"
|
||||||
|
|
@ -9,7 +8,36 @@
|
||||||
#include <QDataStream>
|
#include <QDataStream>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
using namespace QAMQP;
|
#define METHOD_ID_ENUM(name, id) name = id, name ## Ok
|
||||||
|
|
||||||
|
namespace QAMQP {
|
||||||
|
|
||||||
|
class ConnectionPrivate
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum MethodId {
|
||||||
|
METHOD_ID_ENUM(miStart, 10),
|
||||||
|
METHOD_ID_ENUM(miSecure, 20),
|
||||||
|
METHOD_ID_ENUM(miTune, 30),
|
||||||
|
METHOD_ID_ENUM(miOpen, 40),
|
||||||
|
METHOD_ID_ENUM(miClose, 50)
|
||||||
|
};
|
||||||
|
|
||||||
|
ConnectionPrivate(Connection *q);
|
||||||
|
|
||||||
|
// private slots
|
||||||
|
void _q_heartbeat();
|
||||||
|
|
||||||
|
QPointer<Client> client;
|
||||||
|
QPointer<Network> network;
|
||||||
|
bool closed;
|
||||||
|
bool connected;
|
||||||
|
QPointer<QTimer> heartbeatTimer;
|
||||||
|
Frame::TableField customProperty;
|
||||||
|
|
||||||
|
Q_DECLARE_PUBLIC(Connection)
|
||||||
|
Connection * const q_ptr;
|
||||||
|
};
|
||||||
|
|
||||||
ConnectionPrivate::ConnectionPrivate(Connection *q)
|
ConnectionPrivate::ConnectionPrivate(Connection *q)
|
||||||
: closed(false),
|
: closed(false),
|
||||||
|
|
@ -18,64 +46,33 @@ ConnectionPrivate::ConnectionPrivate(Connection *q)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ConnectionPrivate::~ConnectionPrivate()
|
void ConnectionPrivate::_q_heartbeat()
|
||||||
{
|
{
|
||||||
}
|
Frame::Heartbeat frame;
|
||||||
|
|
||||||
void ConnectionPrivate::startOk()
|
|
||||||
{
|
|
||||||
Frame::Method frame(Frame::fcConnection, miStartOk);
|
|
||||||
QByteArray arguments;
|
|
||||||
QDataStream stream(&arguments, QIODevice::WriteOnly);
|
|
||||||
|
|
||||||
Frame::TableField clientProperties;
|
|
||||||
clientProperties["version"] = QString(QAMQP_VERSION);
|
|
||||||
clientProperties["platform"] = QString("Qt %1").arg(qVersion());
|
|
||||||
clientProperties["product"] = QString("QAMQP");
|
|
||||||
clientProperties.unite(customProperty);
|
|
||||||
Frame::serialize(stream, clientProperties);
|
|
||||||
|
|
||||||
client->auth()->write(stream);
|
|
||||||
Frame::writeField('s', stream, "en_US");
|
|
||||||
|
|
||||||
frame.setArguments(arguments);
|
|
||||||
network->sendFrame(frame);
|
network->sendFrame(frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionPrivate::secureOk()
|
} // namespace QAMQP
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
using namespace QAMQP;
|
||||||
|
Connection::Connection(Network *network, Client *client)
|
||||||
|
: QObject(client),
|
||||||
|
d_ptr(new ConnectionPrivate(this))
|
||||||
|
{
|
||||||
|
Q_D(Connection);
|
||||||
|
d->client = client;
|
||||||
|
d->network = network;
|
||||||
|
d->heartbeatTimer = new QTimer(this);
|
||||||
|
connect(d->heartbeatTimer, SIGNAL(timeout()), this, SLOT(_q_heartbeat()));
|
||||||
|
}
|
||||||
|
|
||||||
|
Connection::~Connection()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionPrivate::tuneOk()
|
void Connection::start(const Frame::Method &frame)
|
||||||
{
|
|
||||||
Frame::Method frame(Frame::fcConnection, miTuneOk);
|
|
||||||
QByteArray arguments;
|
|
||||||
QDataStream stream(&arguments, QIODevice::WriteOnly);
|
|
||||||
|
|
||||||
stream << qint16(0); //channel_max
|
|
||||||
stream << qint32(FRAME_MAX); //frame_max
|
|
||||||
stream << qint16(heartbeatTimer->interval() / 1000); //heartbeat
|
|
||||||
|
|
||||||
frame.setArguments(arguments);
|
|
||||||
network->sendFrame(frame);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConnectionPrivate::open()
|
|
||||||
{
|
|
||||||
Frame::Method frame(Frame::fcConnection, miOpen);
|
|
||||||
QByteArray arguments;
|
|
||||||
QDataStream stream(&arguments, QIODevice::WriteOnly);
|
|
||||||
|
|
||||||
Frame::writeField('s',stream, client->virtualHost());
|
|
||||||
|
|
||||||
stream << qint8(0);
|
|
||||||
stream << qint8(0);
|
|
||||||
|
|
||||||
frame.setArguments(arguments);
|
|
||||||
network->sendFrame(frame);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConnectionPrivate::start(const Frame::Method &frame)
|
|
||||||
{
|
{
|
||||||
qDebug(">> Start");
|
qDebug(">> Start");
|
||||||
QByteArray data = frame.arguments();
|
QByteArray data = frame.arguments();
|
||||||
|
|
@ -102,13 +99,15 @@ void ConnectionPrivate::start(const Frame::Method &frame)
|
||||||
startOk();
|
startOk();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionPrivate::secure(const Frame::Method &frame)
|
void Connection::secure(const Frame::Method &frame)
|
||||||
{
|
{
|
||||||
Q_UNUSED(frame)
|
Q_UNUSED(frame)
|
||||||
|
qDebug() << Q_FUNC_INFO << "called!";
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionPrivate::tune(const Frame::Method &frame)
|
void Connection::tune(const Frame::Method &frame)
|
||||||
{
|
{
|
||||||
|
Q_D(Connection);
|
||||||
qDebug(">> Tune");
|
qDebug(">> Tune");
|
||||||
QByteArray data = frame.arguments();
|
QByteArray data = frame.arguments();
|
||||||
QDataStream stream(&data, QIODevice::ReadOnly);
|
QDataStream stream(&data, QIODevice::ReadOnly);
|
||||||
|
|
@ -125,32 +124,42 @@ void ConnectionPrivate::tune(const Frame::Method &frame)
|
||||||
qDebug(">> frame_max: %d", frame_max);
|
qDebug(">> frame_max: %d", frame_max);
|
||||||
qDebug(">> heartbeat: %d", heartbeat);
|
qDebug(">> heartbeat: %d", heartbeat);
|
||||||
|
|
||||||
if (heartbeatTimer) {
|
if (d->heartbeatTimer) {
|
||||||
heartbeatTimer->setInterval(heartbeat * 1000);
|
d->heartbeatTimer->setInterval(heartbeat * 1000);
|
||||||
if (heartbeatTimer->interval())
|
if (d->heartbeatTimer->interval())
|
||||||
heartbeatTimer->start();
|
d->heartbeatTimer->start();
|
||||||
else
|
else
|
||||||
heartbeatTimer->stop();
|
d->heartbeatTimer->stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
tuneOk();
|
tuneOk();
|
||||||
open();
|
open();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionPrivate::openOk(const Frame::Method &frame)
|
void Connection::openOk(const Frame::Method &frame)
|
||||||
{
|
{
|
||||||
Q_UNUSED(frame)
|
Q_UNUSED(frame)
|
||||||
Q_Q(Connection);
|
Q_D(Connection);
|
||||||
|
|
||||||
qDebug(">> OpenOK");
|
qDebug(">> OpenOK");
|
||||||
connected = true;
|
d->connected = true;
|
||||||
q->openOk();
|
Q_EMIT connected();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionPrivate::close(const Frame::Method &frame)
|
void Connection::closeOk(const Frame::Method &frame)
|
||||||
{
|
{
|
||||||
Q_Q(Connection);
|
Q_UNUSED(frame)
|
||||||
|
Q_D(Connection);
|
||||||
|
|
||||||
|
d->connected = false;
|
||||||
|
Q_EMIT disconnected();
|
||||||
|
if (d->heartbeatTimer)
|
||||||
|
d->heartbeatTimer->stop();
|
||||||
|
Q_EMIT disconnected();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Connection::close(const Frame::Method &frame)
|
||||||
|
{
|
||||||
|
Q_D(Connection);
|
||||||
qDebug(">> CLOSE");
|
qDebug(">> CLOSE");
|
||||||
QByteArray data = frame.arguments();
|
QByteArray data = frame.arguments();
|
||||||
QDataStream stream(&data, QIODevice::ReadOnly);
|
QDataStream stream(&data, QIODevice::ReadOnly);
|
||||||
|
|
@ -164,18 +173,76 @@ void ConnectionPrivate::close(const Frame::Method &frame)
|
||||||
qDebug(">> text: %s", qPrintable(text));
|
qDebug(">> text: %s", qPrintable(text));
|
||||||
qDebug(">> class-id: %d", classId);
|
qDebug(">> class-id: %d", classId);
|
||||||
qDebug(">> method-id: %d", methodId);
|
qDebug(">> method-id: %d", methodId);
|
||||||
connected = false;
|
d->connected = false;
|
||||||
network->error(QAbstractSocket::RemoteHostClosedError);
|
d->network->error(QAbstractSocket::RemoteHostClosedError);
|
||||||
Q_EMIT q->disconnected();
|
Q_EMIT disconnected();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionPrivate::close(int code, const QString &text, int classId, int methodId)
|
void Connection::startOk()
|
||||||
{
|
{
|
||||||
Frame::Method frame(Frame::fcConnection, miClose);
|
Q_D(Connection);
|
||||||
|
Frame::Method frame(Frame::fcConnection, ConnectionPrivate::miStartOk);
|
||||||
QByteArray arguments;
|
QByteArray arguments;
|
||||||
QDataStream stream(&arguments, QIODevice::WriteOnly);
|
QDataStream stream(&arguments, QIODevice::WriteOnly);
|
||||||
|
|
||||||
Frame::writeField('s',stream, client->virtualHost());
|
Frame::TableField clientProperties;
|
||||||
|
clientProperties["version"] = QString(QAMQP_VERSION);
|
||||||
|
clientProperties["platform"] = QString("Qt %1").arg(qVersion());
|
||||||
|
clientProperties["product"] = QString("QAMQP");
|
||||||
|
clientProperties.unite(d->customProperty);
|
||||||
|
Frame::serialize(stream, clientProperties);
|
||||||
|
|
||||||
|
d->client->auth()->write(stream);
|
||||||
|
Frame::writeField('s', stream, "en_US");
|
||||||
|
|
||||||
|
frame.setArguments(arguments);
|
||||||
|
d->network->sendFrame(frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Connection::secureOk()
|
||||||
|
{
|
||||||
|
qDebug() << Q_FUNC_INFO;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Connection::tuneOk()
|
||||||
|
{
|
||||||
|
Q_D(Connection);
|
||||||
|
Frame::Method frame(Frame::fcConnection, ConnectionPrivate::miTuneOk);
|
||||||
|
QByteArray arguments;
|
||||||
|
QDataStream stream(&arguments, QIODevice::WriteOnly);
|
||||||
|
|
||||||
|
stream << qint16(0); //channel_max
|
||||||
|
stream << qint32(FRAME_MAX); //frame_max
|
||||||
|
stream << qint16(d->heartbeatTimer->interval() / 1000); //heartbeat
|
||||||
|
|
||||||
|
frame.setArguments(arguments);
|
||||||
|
d->network->sendFrame(frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Connection::open()
|
||||||
|
{
|
||||||
|
Q_D(Connection);
|
||||||
|
Frame::Method frame(Frame::fcConnection, ConnectionPrivate::miOpen);
|
||||||
|
QByteArray arguments;
|
||||||
|
QDataStream stream(&arguments, QIODevice::WriteOnly);
|
||||||
|
|
||||||
|
Frame::writeField('s',stream, d->client->virtualHost());
|
||||||
|
|
||||||
|
stream << qint8(0);
|
||||||
|
stream << qint8(0);
|
||||||
|
|
||||||
|
frame.setArguments(arguments);
|
||||||
|
d->network->sendFrame(frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Connection::close(int code, const QString &text, int classId, int methodId)
|
||||||
|
{
|
||||||
|
Q_D(Connection);
|
||||||
|
Frame::Method frame(Frame::fcConnection, ConnectionPrivate::miClose);
|
||||||
|
QByteArray arguments;
|
||||||
|
QDataStream stream(&arguments, QIODevice::WriteOnly);
|
||||||
|
|
||||||
|
Frame::writeField('s',stream, d->client->virtualHost());
|
||||||
|
|
||||||
stream << qint16(code);
|
stream << qint16(code);
|
||||||
Frame::writeField('s', stream, text);
|
Frame::writeField('s', stream, text);
|
||||||
|
|
@ -183,153 +250,54 @@ void ConnectionPrivate::close(int code, const QString &text, int classId, int me
|
||||||
stream << qint16(methodId);
|
stream << qint16(methodId);
|
||||||
|
|
||||||
frame.setArguments(arguments);
|
frame.setArguments(arguments);
|
||||||
network->sendFrame(frame);
|
d->network->sendFrame(frame);
|
||||||
}
|
|
||||||
|
|
||||||
void ConnectionPrivate::closeOk()
|
|
||||||
{
|
|
||||||
Frame::Method frame(Frame::fcConnection, miCloseOk);
|
|
||||||
connected = false;
|
|
||||||
network->sendFrame(frame);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConnectionPrivate::closeOk(const Frame::Method &frame)
|
|
||||||
{
|
|
||||||
Q_UNUSED(frame)
|
|
||||||
Q_Q(Connection);
|
|
||||||
|
|
||||||
connected = false;
|
|
||||||
Q_EMIT q->disconnected();
|
|
||||||
if (heartbeatTimer)
|
|
||||||
heartbeatTimer->stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConnectionPrivate::setQOS(qint32 prefetchSize, quint16 prefetchCount, int channel, bool global)
|
|
||||||
{
|
|
||||||
Frame::Method frame(Frame::fcBasic, 10);
|
|
||||||
frame.setChannel(channel);
|
|
||||||
QByteArray arguments;
|
|
||||||
QDataStream out(&arguments, QIODevice::WriteOnly);
|
|
||||||
|
|
||||||
out << prefetchSize;
|
|
||||||
out << prefetchCount;
|
|
||||||
out << qint8(global ? 1 : 0);
|
|
||||||
|
|
||||||
frame.setArguments(arguments);
|
|
||||||
network->sendFrame(frame);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ConnectionPrivate::_q_method(const Frame::Method &frame)
|
|
||||||
{
|
|
||||||
Q_ASSERT(frame.methodClass() == Frame::fcConnection);
|
|
||||||
if (frame.methodClass() != Frame::fcConnection)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
qDebug() << "Connection:";
|
|
||||||
|
|
||||||
if (closed) {
|
|
||||||
if (frame.id() == miCloseOk)
|
|
||||||
closeOk(frame);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (MethodId(frame.id())) {
|
|
||||||
case miStart:
|
|
||||||
start(frame);
|
|
||||||
break;
|
|
||||||
case miSecure:
|
|
||||||
secure(frame);
|
|
||||||
break;
|
|
||||||
case miTune:
|
|
||||||
tune(frame);
|
|
||||||
break;
|
|
||||||
case miOpenOk:
|
|
||||||
openOk(frame);
|
|
||||||
break;
|
|
||||||
case miClose:
|
|
||||||
close(frame);
|
|
||||||
break;
|
|
||||||
case miCloseOk:
|
|
||||||
closeOk(frame);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
qWarning("Unknown method-id %d", frame.id());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConnectionPrivate::_q_heartbeat()
|
|
||||||
{
|
|
||||||
Frame::Heartbeat frame;
|
|
||||||
network->sendFrame(frame);
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
Connection::Connection(Network *network, Client *client)
|
|
||||||
: QObject(client),
|
|
||||||
d_ptr(new ConnectionPrivate(this))
|
|
||||||
{
|
|
||||||
Q_D(Connection);
|
|
||||||
d->client = client;
|
|
||||||
d->network = network;
|
|
||||||
d->heartbeatTimer = new QTimer(this);
|
|
||||||
connect(d->heartbeatTimer, SIGNAL(timeout()), this, SLOT(_q_heartbeat()));
|
|
||||||
}
|
|
||||||
|
|
||||||
Connection::~Connection()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void Connection::startOk()
|
|
||||||
{
|
|
||||||
Q_D(Connection);
|
|
||||||
d->startOk();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Connection::secureOk()
|
|
||||||
{
|
|
||||||
Q_D(Connection);
|
|
||||||
d->secureOk();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Connection::tuneOk()
|
|
||||||
{
|
|
||||||
Q_D(Connection);
|
|
||||||
d->tuneOk();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Connection::open()
|
|
||||||
{
|
|
||||||
Q_D(Connection);
|
|
||||||
d->open();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Connection::close(int code, const QString &text, int classId , int methodId)
|
|
||||||
{
|
|
||||||
Q_D(Connection);
|
|
||||||
d->close(code, text, classId, methodId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Connection::closeOk()
|
void Connection::closeOk()
|
||||||
{
|
{
|
||||||
Q_D(Connection);
|
Q_D(Connection);
|
||||||
d->closeOk();
|
Frame::Method frame(Frame::fcConnection, ConnectionPrivate::miCloseOk);
|
||||||
Q_EMIT disconnected();
|
d->connected = false;
|
||||||
}
|
d->network->sendFrame(frame);
|
||||||
|
|
||||||
void Connection::openOk()
|
|
||||||
{
|
|
||||||
Q_EMIT connected();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Connection::_q_method(const Frame::Method &frame)
|
void Connection::_q_method(const Frame::Method &frame)
|
||||||
{
|
{
|
||||||
Q_D(Connection);
|
Q_D(Connection);
|
||||||
d->_q_method(frame);
|
Q_ASSERT(frame.methodClass() == Frame::fcConnection);
|
||||||
|
if (frame.methodClass() != Frame::fcConnection)
|
||||||
|
return;
|
||||||
|
|
||||||
|
qDebug() << "Connection:";
|
||||||
|
|
||||||
|
if (d->closed) {
|
||||||
|
if (frame.id() == ConnectionPrivate::miCloseOk)
|
||||||
|
closeOk(frame);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (ConnectionPrivate::MethodId(frame.id())) {
|
||||||
|
case ConnectionPrivate::miStart:
|
||||||
|
start(frame);
|
||||||
|
break;
|
||||||
|
case ConnectionPrivate::miSecure:
|
||||||
|
secure(frame);
|
||||||
|
break;
|
||||||
|
case ConnectionPrivate::miTune:
|
||||||
|
tune(frame);
|
||||||
|
break;
|
||||||
|
case ConnectionPrivate::miOpenOk:
|
||||||
|
openOk(frame);
|
||||||
|
break;
|
||||||
|
case ConnectionPrivate::miClose:
|
||||||
|
close(frame);
|
||||||
|
break;
|
||||||
|
case ConnectionPrivate::miCloseOk:
|
||||||
|
closeOk(frame);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
qWarning("Unknown method-id %d", frame.id());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Connection::isConnected() const
|
bool Connection::isConnected() const
|
||||||
|
|
@ -341,7 +309,22 @@ bool Connection::isConnected() const
|
||||||
void Connection::setQOS(qint32 prefetchSize, quint16 prefetchCount)
|
void Connection::setQOS(qint32 prefetchSize, quint16 prefetchCount)
|
||||||
{
|
{
|
||||||
Q_D(Connection);
|
Q_D(Connection);
|
||||||
d->setQOS(prefetchSize, prefetchCount, 0, true);
|
|
||||||
|
// NOTE: these were hardcoded values, could be bad
|
||||||
|
int channel = 0;
|
||||||
|
bool global = true;
|
||||||
|
|
||||||
|
Frame::Method frame(Frame::fcBasic, 10);
|
||||||
|
frame.setChannel(channel);
|
||||||
|
QByteArray arguments;
|
||||||
|
QDataStream out(&arguments, QIODevice::WriteOnly);
|
||||||
|
|
||||||
|
out << prefetchSize;
|
||||||
|
out << prefetchCount;
|
||||||
|
out << qint8(global ? 1 : 0);
|
||||||
|
|
||||||
|
frame.setArguments(arguments);
|
||||||
|
d->network->sendFrame(frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Connection::addCustomProperty(const QString &name, const QString &value)
|
void Connection::addCustomProperty(const QString &name, const QString &value)
|
||||||
|
|
@ -358,4 +341,4 @@ QString Connection::customProperty(const QString &name) const
|
||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "moc_amqp_connection.cpp"
|
#include "moc_amqp_connection_p.cpp"
|
||||||
|
|
|
||||||
|
|
@ -1,60 +0,0 @@
|
||||||
#ifndef amqp_connection_h__
|
|
||||||
#define amqp_connection_h__
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include "amqp_frame.h"
|
|
||||||
|
|
||||||
namespace QAMQP
|
|
||||||
{
|
|
||||||
|
|
||||||
class Client;
|
|
||||||
class Network;
|
|
||||||
class ClientPrivate;
|
|
||||||
class ChannelPrivate;
|
|
||||||
class ConnectionPrivate;
|
|
||||||
class QAMQP_EXPORT Connection : public QObject, public Frame::MethodHandler
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
Q_PROPERTY(bool connected READ isConnected CONSTANT)
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual ~Connection();
|
|
||||||
|
|
||||||
void addCustomProperty(const QString &name, const QString &value);
|
|
||||||
QString customProperty(const QString &name) const;
|
|
||||||
|
|
||||||
bool isConnected() const;
|
|
||||||
|
|
||||||
public Q_SLOTS:
|
|
||||||
void startOk();
|
|
||||||
void secureOk();
|
|
||||||
void tuneOk();
|
|
||||||
void open();
|
|
||||||
void close(int code, const QString &text, int classId = 0, int methodId = 0);
|
|
||||||
void closeOk();
|
|
||||||
|
|
||||||
void setQOS(qint32 prefetchSize, quint16 prefetchCount);
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
|
||||||
void disconnected();
|
|
||||||
void connected();
|
|
||||||
|
|
||||||
private:
|
|
||||||
explicit Connection(Network *network, Client *parent);
|
|
||||||
|
|
||||||
Q_DISABLE_COPY(Connection)
|
|
||||||
Q_DECLARE_PRIVATE(Connection)
|
|
||||||
QScopedPointer<ConnectionPrivate> d_ptr;
|
|
||||||
|
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_heartbeat())
|
|
||||||
friend class ClientPrivate;
|
|
||||||
friend class ChannelPrivate;
|
|
||||||
|
|
||||||
// should be moved to private
|
|
||||||
void openOk();
|
|
||||||
void _q_method(const Frame::Method &frame);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace QAMQP
|
|
||||||
|
|
||||||
#endif // amqp_connection_h__
|
|
||||||
|
|
@ -1,62 +1,67 @@
|
||||||
#ifndef amqp_connection_p_h__
|
#ifndef amqp_connection_p_h__
|
||||||
#define amqp_connection_p_h__
|
#define amqp_connection_p_h__
|
||||||
|
|
||||||
#include <QPointer>
|
#include <QObject>
|
||||||
|
#include "amqp_frame.h"
|
||||||
|
|
||||||
#define METHOD_ID_ENUM(name, id) name = id, name ## Ok
|
|
||||||
|
|
||||||
class QTimer;
|
|
||||||
namespace QAMQP
|
namespace QAMQP
|
||||||
{
|
{
|
||||||
|
|
||||||
class Client;
|
class Client;
|
||||||
|
class Network;
|
||||||
class ClientPrivate;
|
class ClientPrivate;
|
||||||
class Connection;
|
class ConnectionPrivate;
|
||||||
class ConnectionPrivate
|
class QAMQP_EXPORT Connection : public QObject, public Frame::MethodHandler
|
||||||
{
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(bool connected READ isConnected CONSTANT)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum MethodId {
|
virtual ~Connection();
|
||||||
METHOD_ID_ENUM(miStart, 10),
|
|
||||||
METHOD_ID_ENUM(miSecure, 20),
|
|
||||||
METHOD_ID_ENUM(miTune, 30),
|
|
||||||
METHOD_ID_ENUM(miOpen, 40),
|
|
||||||
METHOD_ID_ENUM(miClose, 50)
|
|
||||||
};
|
|
||||||
|
|
||||||
ConnectionPrivate(Connection *q);
|
void addCustomProperty(const QString &name, const QString &value);
|
||||||
~ConnectionPrivate();
|
QString customProperty(const QString &name) const;
|
||||||
|
|
||||||
void init(Client *parent);
|
bool isConnected() const;
|
||||||
void startOk();
|
void setQOS(qint32 prefetchSize, quint16 prefetchCount);
|
||||||
void secureOk();
|
|
||||||
void tuneOk();
|
|
||||||
void open();
|
|
||||||
void close(int code, const QString &text, int classId = 0, int methodId = 0);
|
|
||||||
void closeOk();
|
|
||||||
|
|
||||||
|
// method handlers, FROM server
|
||||||
void start(const Frame::Method &frame);
|
void start(const Frame::Method &frame);
|
||||||
void secure(const Frame::Method &frame);
|
void secure(const Frame::Method &frame);
|
||||||
void tune(const Frame::Method &frame);
|
void tune(const Frame::Method &frame);
|
||||||
void openOk(const Frame::Method &frame);
|
void openOk(const Frame::Method &frame);
|
||||||
void close(const Frame::Method &frame);
|
|
||||||
void closeOk(const Frame::Method &frame);
|
void closeOk(const Frame::Method &frame);
|
||||||
|
|
||||||
bool _q_method(const Frame::Method &frame);
|
// method handlers, TO server
|
||||||
void _q_heartbeat();
|
void startOk();
|
||||||
|
void secureOk();
|
||||||
|
void tuneOk();
|
||||||
|
void open();
|
||||||
|
|
||||||
void setQOS(qint32 prefetchSize, quint16 prefetchCount, int channel, bool global);
|
// method handlers, BOTH ways
|
||||||
|
void close(int code, const QString &text, int classId = 0, int methodId = 0);
|
||||||
|
void close(const Frame::Method &frame);
|
||||||
|
void closeOk();
|
||||||
|
|
||||||
QPointer<Client> client;
|
Q_SIGNALS:
|
||||||
QPointer<Network> network;
|
void disconnected();
|
||||||
bool closed;
|
void connected();
|
||||||
bool connected;
|
|
||||||
QPointer<QTimer> heartbeatTimer;
|
|
||||||
Frame::TableField customProperty;
|
|
||||||
|
|
||||||
Q_DECLARE_PUBLIC(Connection)
|
private:
|
||||||
Connection * const q_ptr;
|
explicit Connection(Network *network, Client *parent);
|
||||||
|
|
||||||
|
Q_DISABLE_COPY(Connection)
|
||||||
|
Q_DECLARE_PRIVATE(Connection)
|
||||||
|
QScopedPointer<ConnectionPrivate> d_ptr;
|
||||||
|
|
||||||
|
Q_PRIVATE_SLOT(d_func(), void _q_heartbeat())
|
||||||
|
friend class ClientPrivate;
|
||||||
|
|
||||||
|
// should be moved to private
|
||||||
|
void openOk();
|
||||||
|
void _q_method(const Frame::Method &frame);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace QAMQP
|
} // namespace QAMQP
|
||||||
|
|
||||||
#endif // amqp_connection_p_h__
|
#endif // amqp_connection_h__
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ void Network::error(QAbstractSocket::SocketError socketError)
|
||||||
timeOut_ *= 5;
|
timeOut_ *= 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(socketError) {
|
switch (socketError) {
|
||||||
case QAbstractSocket::ConnectionRefusedError:
|
case QAbstractSocket::ConnectionRefusedError:
|
||||||
case QAbstractSocket::RemoteHostClosedError:
|
case QAbstractSocket::RemoteHostClosedError:
|
||||||
case QAbstractSocket::SocketTimeoutError:
|
case QAbstractSocket::SocketTimeoutError:
|
||||||
|
|
@ -91,14 +91,14 @@ void Network::readyRead()
|
||||||
char *headerData = buffer_.data();
|
char *headerData = buffer_.data();
|
||||||
socket_->peek(headerData, Frame::HEADER_SIZE);
|
socket_->peek(headerData, Frame::HEADER_SIZE);
|
||||||
const quint32 payloadSize = qFromBigEndian<quint32>(*(quint32*)&headerData[3]);
|
const quint32 payloadSize = qFromBigEndian<quint32>(*(quint32*)&headerData[3]);
|
||||||
const qint64 readSize = Frame::HEADER_SIZE+payloadSize+Frame::FRAME_END_SIZE;
|
const qint64 readSize = Frame::HEADER_SIZE+payloadSize + Frame::FRAME_END_SIZE;
|
||||||
|
|
||||||
if (socket_->bytesAvailable() >= readSize) {
|
if (socket_->bytesAvailable() >= readSize) {
|
||||||
buffer_.resize(readSize);
|
buffer_.resize(readSize);
|
||||||
socket_->read(buffer_.data(), readSize);
|
socket_->read(buffer_.data(), readSize);
|
||||||
const char *bufferData = buffer_.constData();
|
const char *bufferData = buffer_.constData();
|
||||||
const quint8 type = *(quint8*)&bufferData[0];
|
const quint8 type = *(quint8*)&bufferData[0];
|
||||||
const quint8 magic = *(quint8*)&bufferData[Frame::HEADER_SIZE+payloadSize];
|
const quint8 magic = *(quint8*)&bufferData[Frame::HEADER_SIZE + payloadSize];
|
||||||
if (magic != Frame::FRAME_END)
|
if (magic != Frame::FRAME_END)
|
||||||
qWarning() << "Wrong end frame";
|
qWarning() << "Wrong end frame";
|
||||||
|
|
||||||
|
|
@ -203,11 +203,10 @@ void Network::sslErrors()
|
||||||
|
|
||||||
void Network::conectionReady()
|
void Network::conectionReady()
|
||||||
{
|
{
|
||||||
Q_EMIT connected();
|
|
||||||
timeOut_ = 0;
|
timeOut_ = 0;
|
||||||
|
char header[8] = {'A', 'M', 'Q', 'P', 0, 0, 9, 1};
|
||||||
char header_[8] = {'A', 'M', 'Q', 'P', 0,0,9,1};
|
socket_->write(header, 8);
|
||||||
socket_->write(header_, 8);
|
Q_EMIT connected();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Network::autoReconnect() const
|
bool Network::autoReconnect() const
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@ INSTALL_HEADERS += \
|
||||||
amqp_authenticator.h \
|
amqp_authenticator.h \
|
||||||
amqp_channel.h \
|
amqp_channel.h \
|
||||||
amqp_client.h \
|
amqp_client.h \
|
||||||
amqp_connection.h \
|
|
||||||
amqp_exchange.h \
|
amqp_exchange.h \
|
||||||
amqp_frame.h \
|
amqp_frame.h \
|
||||||
amqp_global.h \
|
amqp_global.h \
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue