+ auto reconnection

+ SSL support
This commit is contained in:
fuCtor 2012-05-23 03:49:56 -07:00
parent 8a4c5dbc57
commit e12f436cbe
5 changed files with 85 additions and 27 deletions

View File

@ -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);
}

View File

@ -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;

View File

@ -1,6 +1,6 @@
#include "amqp_network.h"
#include <QDebug>
#include <QTimer>
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<QSslSocket *>(socket_.data())->connectToHostEncrypted(host, port);
static_cast<QSslSocket *>(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<QSslSocket *>(socket_.data())->isEncrypted() )
{
qDebug() << "[SSL] start encrypt";
static_cast<QSslSocket *>(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<QSslError> & 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;
}

View File

@ -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<QSslError> & errors );
@ -46,9 +51,15 @@ namespace QAMQP
void initSocket(bool ssl = false);
QPointer<QTcpSocket> socket_;
QPointer<QBuffer> buffer_;
QString lastHost_;
int lastPort_;
int offsetBuf;
int leftSize;
qint8 lastType_;
bool autoReconnect_;
int timeOut_;
bool connect_;
};
}
#endif // amqp_network_h__

View File

@ -40,6 +40,7 @@ namespace QAMQP
bool isSSl() const;
Client * const pq_ptr;