From 8fb83ba1a48de5fb8c99c63eaece52231d437681 Mon Sep 17 00:00:00 2001 From: fuCtor Date: Thu, 24 May 2012 20:34:16 -0700 Subject: [PATCH] [*] fix reconnection --- src/qamqp/amqp.cpp | 20 ++++++++++++++------ src/qamqp/amqp_connection.cpp | 1 + src/qamqp/amqp_network.cpp | 11 ++++++++++- src/qamqp/amqp_network.h | 6 ++++-- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/qamqp/amqp.cpp b/src/qamqp/amqp.cpp index 392a60d..9a1420e 100644 --- a/src/qamqp/amqp.cpp +++ b/src/qamqp/amqp.cpp @@ -114,7 +114,10 @@ void ClientPrivate::parseCnnString( const QUrl & con ) void ClientPrivate::sockConnect() { - disconnect(); + if(network_->state() != QAbstractSocket::UnconnectedState ) + { + disconnect(); + } network_->connectTo(host, port); } @@ -130,7 +133,7 @@ Exchange * ClientPrivate::createExchange(int channelNumber, const QString &name exchange_, SLOT(_q_method(const QAMQP::Frame::Method &))); QObject::connect(connection_, SIGNAL(connected()), exchange_, SLOT(_q_open())); - QObject::connect(connection_, SIGNAL(disconnected()), exchange_, SLOT(_q_disconnected())); + QObject::connect(pq_func(), SIGNAL(disconnected()), exchange_, SLOT(_q_disconnected())); exchange_->setName(name); return exchange_; } @@ -148,6 +151,7 @@ Queue * ClientPrivate::createQueue(int channelNumber, const QString &name ) queue_, SLOT(_q_body(int, const QByteArray &))); QObject::connect(connection_, SIGNAL(connected()), queue_, SLOT(_q_open())); + QObject::connect(pq_func(), SIGNAL(disconnected()), queue_, SLOT(_q_disconnected())); queue_->setName(name); return queue_; } @@ -155,12 +159,16 @@ Queue * ClientPrivate::createQueue(int channelNumber, const QString &name ) void ClientPrivate::disconnect() { - network_->QAMQP::Network::disconnect(); + P_Q(QAMQP::Client); + //connection_->close(); + if(network_->state() != QAbstractSocket::UnconnectedState) + { + network_->QAMQP::Network::disconnect(); + connection_->pd_func()->connected = false; + emit pq_func()->disconnected(); + } } - - - ////////////////////////////////////////////////////////////////////////// diff --git a/src/qamqp/amqp_connection.cpp b/src/qamqp/amqp_connection.cpp index aba0760..c31fbdf 100644 --- a/src/qamqp/amqp_connection.cpp +++ b/src/qamqp/amqp_connection.cpp @@ -185,6 +185,7 @@ void ConnectionPrivate::close( const QAMQP::Frame::Method & frame ) qDebug(">> class-id: %d", classId); qDebug(">> method-id: %d", methodId); connected = false; + client_->pd_func()->network_->error(QAbstractSocket::RemoteHostClosedError); QMetaObject::invokeMethod(pq_func(), "disconnected"); } diff --git a/src/qamqp/amqp_network.cpp b/src/qamqp/amqp_network.cpp index a34c500..cc4a62f 100644 --- a/src/qamqp/amqp_network.cpp +++ b/src/qamqp/amqp_network.cpp @@ -48,7 +48,7 @@ void QAMQP::Network::disconnect() { connect_ = false; if(socket_) - socket_->abort(); + socket_->close(); } void QAMQP::Network::error( QAbstractSocket::SocketError socketError ) @@ -70,6 +70,9 @@ void QAMQP::Network::error( QAbstractSocket::SocketError socketError ) case QAbstractSocket::RemoteHostClosedError: case QAbstractSocket::SocketTimeoutError: case QAbstractSocket::NetworkError: + case QAbstractSocket::ProxyConnectionClosedError: + case QAbstractSocket::ProxyConnectionRefusedError: + case QAbstractSocket::ProxyConnectionTimeoutError: if( autoReconnect_ && connect_ ) { QTimer::singleShot(timeOut_, this, SLOT(connectTo())); @@ -77,6 +80,7 @@ void QAMQP::Network::error( QAbstractSocket::SocketError socketError ) break; default: + qWarning() << "AMQP Socket Error: " << socket_->errorString(); break; } } @@ -210,3 +214,8 @@ void QAMQP::Network::setAutoReconnect( bool value ) { autoReconnect_ = value; } + +QAbstractSocket::SocketState QAMQP::Network::state() const +{ + return socket_->state(); +} diff --git a/src/qamqp/amqp_network.h b/src/qamqp/amqp_network.h index 6ce9b5c..ec52cc4 100644 --- a/src/qamqp/amqp_network.h +++ b/src/qamqp/amqp_network.h @@ -30,8 +30,11 @@ namespace QAMQP bool autoReconnect() const; void setAutoReconnect(bool value); + QAbstractSocket::SocketState state() const; + public slots: void connectTo(const QString & host = QString(), quint32 port = 0); + void error( QAbstractSocket::SocketError socketError ); signals: void connected(); @@ -40,8 +43,7 @@ namespace QAMQP void content(const QAMQP::Frame::Content & content); void body(int channeNumber, const QByteArray & body); - private slots: - void error( QAbstractSocket::SocketError socketError ); + private slots: void readyRead(); void sslErrors ( const QList & errors );