From e12f436cbe7c2e46e0b2770143f69744f32a28b6 Mon Sep 17 00:00:00 2001 From: fuCtor Date: Wed, 23 May 2012 03:49:56 -0700 Subject: [PATCH] + auto reconnection + SSL support --- src/qamqp/amqp.cpp | 10 +++++ src/qamqp/amqp.h | 3 ++ src/qamqp/amqp_network.cpp | 77 +++++++++++++++++++++++++++----------- src/qamqp/amqp_network.h | 21 ++++++++--- src/qamqp/amqp_p.h | 1 + 5 files changed, 85 insertions(+), 27 deletions(-) diff --git a/src/qamqp/amqp.cpp b/src/qamqp/amqp.cpp index 4664f5e..dfa9664 100644 --- a/src/qamqp/amqp.cpp +++ b/src/qamqp/amqp.cpp @@ -340,4 +340,14 @@ bool QAMQP::Client::isSsl() const void QAMQP::Client::setSsl( bool value ) { pd_func()->network_->setSsl(value); +} + +bool QAMQP::Client::autoReconnect() const +{ + return pd_func()->network_->autoReconnect(); +} + +void QAMQP::Client::setAutoReconnect( bool value ) +{ + pd_func()->network_->setAutoReconnect(value); } \ No newline at end of file diff --git a/src/qamqp/amqp.h b/src/qamqp/amqp.h index accc573..2f2417a 100644 --- a/src/qamqp/amqp.h +++ b/src/qamqp/amqp.h @@ -22,6 +22,7 @@ namespace QAMQP Q_PROPERTY(QString user READ user WRITE setUser); Q_PROPERTY(QString password READ password WRITE setPassword); Q_PROPERTY(bool ssl READ isSsl WRITE setSsl); + Q_PROPERTY(bool autoReconnect READ autoReconnect WRITE setAutoReconnect); Q_DISABLE_COPY(Client) @@ -69,6 +70,8 @@ namespace QAMQP bool isSsl() const; void setSsl(bool value); + bool autoReconnect() const; + void setAutoReconnect(bool value); protected: ClientPrivate * const pd_ptr; diff --git a/src/qamqp/amqp_network.cpp b/src/qamqp/amqp_network.cpp index 4f8d94b..02c553a 100644 --- a/src/qamqp/amqp_network.cpp +++ b/src/qamqp/amqp_network.cpp @@ -1,6 +1,6 @@ #include "amqp_network.h" - #include +#include QAMQP::Network::Network( QObject * parent /*= 0*/ ):QObject(parent) { @@ -10,6 +10,8 @@ QAMQP::Network::Network( QObject * parent /*= 0*/ ):QObject(parent) buffer_ = new QBuffer(this); offsetBuf = 0; leftSize = 0; + timeOut_ = 1000; + connect_ = false; buffer_->open(QIODevice::ReadWrite); @@ -23,41 +25,60 @@ QAMQP::Network::~Network() void QAMQP::Network::connectTo( const QString & host, quint32 port ) { + QString h(host); + int p(port); + connect_ = true; + if(host.isEmpty()) + h = lastHost_ ; + if(port == 0) + p = lastPort_; + if (isSsl()) { - static_cast(socket_.data())->connectToHostEncrypted(host, port); + static_cast(socket_.data())->connectToHostEncrypted(h, p); } else { - socket_->connectToHost(host, port); + socket_->connectToHost(h, p); } - + + lastHost_ = h; + lastPort_ = p; } void QAMQP::Network::disconnect() { + connect_ = false; if(socket_) socket_->abort(); } -void QAMQP::Network::connected() -{ - if(isSsl() && !static_cast(socket_.data())->isEncrypted() ) - { - qDebug() << "[SSL] start encrypt"; - static_cast(socket_.data())->startClientEncryption(); - } else { - conectionReady(); - } - -} - -void QAMQP::Network::disconnected() -{ - -} - void QAMQP::Network::error( QAbstractSocket::SocketError socketError ) { + if(timeOut_ == 0) + { + timeOut_ = 1000; + } else { + if(timeOut_ < 120000) + { + timeOut_ *= 5; + } + } + Q_UNUSED(socketError); + switch(socketError) + { + case QAbstractSocket::ConnectionRefusedError: + case QAbstractSocket::RemoteHostClosedError: + case QAbstractSocket::SocketTimeoutError: + case QAbstractSocket::NetworkError: + if( autoReconnect_ && connect_ ) + { + QTimer::singleShot(timeOut_, this, SLOT(connectTo())); + } + break; + + default: + break; + } } void QAMQP::Network::readyRead() @@ -159,7 +180,7 @@ void QAMQP::Network::initSocket( bool ssl /*= false*/ ) connect(socket_, SIGNAL(connected()), this, SLOT(conectionReady())); } - connect(socket_, SIGNAL(disconnected()), this, SLOT(disconnected())); + connect(socket_, SIGNAL(disconnected()), this, SIGNAL(disconnected())); connect(socket_, SIGNAL(readyRead()), this, SLOT(readyRead())); connect(socket_, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error(QAbstractSocket::SocketError))); } @@ -171,6 +192,18 @@ void QAMQP::Network::sslErrors( const QList & errors ) void QAMQP::Network::conectionReady() { + emit connected(); + timeOut_ = 0; char header_[8] = {'A', 'M', 'Q', 'P', 0,0,9,1}; socket_->write(header_, 8); +} + +bool QAMQP::Network::autoReconnect() const +{ + return autoReconnect_; +} + +void QAMQP::Network::setAutoReconnect( bool value ) +{ + autoReconnect_ = value; } \ No newline at end of file diff --git a/src/qamqp/amqp_network.h b/src/qamqp/amqp_network.h index c3b196c..6ce9b5c 100644 --- a/src/qamqp/amqp_network.h +++ b/src/qamqp/amqp_network.h @@ -18,8 +18,7 @@ namespace QAMQP public: Network(QObject * parent = 0); ~Network(); - - void connectTo(const QString & host, quint32 port); + void disconnect(); void sendFrame(); @@ -28,14 +27,20 @@ namespace QAMQP bool isSsl() const; void setSsl(bool value); - signals: + bool autoReconnect() const; + void setAutoReconnect(bool value); + + public slots: + void connectTo(const QString & host = QString(), quint32 port = 0); + + signals: + void connected(); + void disconnected(); void method(const QAMQP::Frame::Method & method); void content(const QAMQP::Frame::Content & content); void body(int channeNumber, const QByteArray & body); private slots: - void connected(); - void disconnected(); void error( QAbstractSocket::SocketError socketError ); void readyRead(); void sslErrors ( const QList & errors ); @@ -46,9 +51,15 @@ namespace QAMQP void initSocket(bool ssl = false); QPointer socket_; QPointer buffer_; + QString lastHost_; + int lastPort_; int offsetBuf; int leftSize; qint8 lastType_; + bool autoReconnect_; + int timeOut_; + + bool connect_; }; } #endif // amqp_network_h__ diff --git a/src/qamqp/amqp_p.h b/src/qamqp/amqp_p.h index adcf485..4bb9d9a 100644 --- a/src/qamqp/amqp_p.h +++ b/src/qamqp/amqp_p.h @@ -40,6 +40,7 @@ namespace QAMQP bool isSSl() const; + Client * const pq_ptr;