This commit is contained in:
fuCtor 2012-05-23 03:23:20 -07:00
parent 7e639776b8
commit 8a4c5dbc57
6 changed files with 95 additions and 10 deletions

View File

@ -98,8 +98,9 @@ void ClientPrivate::connect()
void ClientPrivate::parseCnnString( const QUrl & con )
{
P_Q(QAMQP::Client);
if(con.scheme() == AMQPSCHEME )
if(con.scheme() == AMQPSCHEME || con.scheme() == AMQPSSCHEME )
{
q->setSsl(con.scheme() == AMQPSSCHEME);
q->setPassword(con.password());
q->setUser(con.userName());
q->setPort(con.port());
@ -154,6 +155,8 @@ void ClientPrivate::disconnect()
}
//////////////////////////////////////////////////////////////////////////
@ -327,4 +330,14 @@ void QAMQP::Client::setAuth( Authenticator * auth )
Authenticator * QAMQP::Client::auth() const
{
return pd_func()->auth_.data();
}
bool QAMQP::Client::isSsl() const
{
return pd_func()->network_->isSsl();
}
void QAMQP::Client::setSsl( bool value )
{
pd_func()->network_->setSsl(value);
}

View File

@ -21,6 +21,7 @@ namespace QAMQP
Q_PROPERTY(QString virtualHost READ virtualHost WRITE setVirtualHost);
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_DISABLE_COPY(Client)
@ -64,6 +65,11 @@ namespace QAMQP
void open(const QUrl & connectionString);
void close();
void reopen();
bool isSsl() const;
void setSsl(bool value);
protected:
ClientPrivate * const pd_ptr;

View File

@ -5,6 +5,7 @@
#define QAMQP_P_INCLUDE
#define AMQPSCHEME "amqp"
#define AMQPSSCHEME "amqps"
#define AMQPPORT 5672
#define AMQPHOST "localhost"
#define AMQPVHOST "/"

View File

@ -6,17 +6,14 @@ QAMQP::Network::Network( QObject * parent /*= 0*/ ):QObject(parent)
{
qRegisterMetaType<QAMQP::Frame::Method>("QAMQP::Frame::Method");
socket_ = new QTcpSocket(this);
buffer_ = new QBuffer(this);
offsetBuf = 0;
leftSize = 0;
buffer_->open(QIODevice::ReadWrite);
connect(socket_, SIGNAL(connected()), this, SLOT(connected()));
connect(socket_, SIGNAL(disconnected()), this, SLOT(disconnected()));
connect(socket_, SIGNAL(readyRead()), this, SLOT(readyRead()));
connect(socket_, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error(QAbstractSocket::SocketError)));
initSocket(false);
}
QAMQP::Network::~Network()
@ -26,7 +23,13 @@ QAMQP::Network::~Network()
void QAMQP::Network::connectTo( const QString & host, quint32 port )
{
socket_->connectToHost(host, port);
if (isSsl())
{
static_cast<QSslSocket *>(socket_.data())->connectToHostEncrypted(host, port);
} else {
socket_->connectToHost(host, port);
}
}
void QAMQP::Network::disconnect()
@ -37,8 +40,14 @@ void QAMQP::Network::disconnect()
void QAMQP::Network::connected()
{
char header_[8] = {'A', 'M', 'Q', 'P', 0,0,9,1};
socket_->write(header_, 8);
if(isSsl() && !static_cast<QSslSocket *>(socket_.data())->isEncrypted() )
{
qDebug() << "[SSL] start encrypt";
static_cast<QSslSocket *>(socket_.data())->startClientEncryption();
} else {
conectionReady();
}
}
void QAMQP::Network::disconnected()
@ -118,4 +127,50 @@ void QAMQP::Network::sendFrame( const QAMQP::Frame::Base & frame )
{
QDataStream stream(socket_);
frame.toStream(stream);
}
bool QAMQP::Network::isSsl() const
{
return QString(socket_->metaObject()->className()).compare( "QSslSocket", Qt::CaseInsensitive) == 0;
}
void QAMQP::Network::setSsl( bool value )
{
initSocket(value);
}
void QAMQP::Network::initSocket( bool ssl /*= false*/ )
{
if(socket_)
delete socket_;
if(ssl)
{
socket_ = new QSslSocket(this);
QSslSocket * ssl_= static_cast<QSslSocket*> (socket_.data());
ssl_->setProtocol(QSsl::AnyProtocol);
connect(socket_, SIGNAL(sslErrors(const QList<QSslError> &)),
this, SLOT(sslErrors(const QList<QSslError> &)));
//connect(socket_, SIGNAL(encrypted()), this, SLOT(conectionReady()));
connect(socket_, SIGNAL(connected()), this, SLOT(conectionReady()));
} else {
socket_ = new QTcpSocket(this);
connect(socket_, SIGNAL(connected()), this, SLOT(conectionReady()));
}
connect(socket_, SIGNAL(disconnected()), this, SLOT(disconnected()));
connect(socket_, SIGNAL(readyRead()), this, SLOT(readyRead()));
connect(socket_, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error(QAbstractSocket::SocketError)));
}
void QAMQP::Network::sslErrors( const QList<QSslError> & errors )
{
static_cast<QSslSocket*>(socket_.data())->ignoreSslErrors();
}
void QAMQP::Network::conectionReady()
{
char header_[8] = {'A', 'M', 'Q', 'P', 0,0,9,1};
socket_->write(header_, 8);
}

View File

@ -3,6 +3,7 @@
#include <QObject>
#include <QTcpSocket>
#include <QSslSocket>
#include <QPointer>
#include <QBuffer>
@ -24,6 +25,9 @@ namespace QAMQP
void sendFrame(const QAMQP::Frame::Base & frame);
bool isSsl() const;
void setSsl(bool value);
signals:
void method(const QAMQP::Frame::Method & method);
void content(const QAMQP::Frame::Content & content);
@ -34,8 +38,12 @@ namespace QAMQP
void disconnected();
void error( QAbstractSocket::SocketError socketError );
void readyRead();
void sslErrors ( const QList<QSslError> & errors );
void conectionReady();
private:
void initSocket(bool ssl = false);
QPointer<QTcpSocket> socket_;
QPointer<QBuffer> buffer_;
int offsetBuf;

View File

@ -38,6 +38,8 @@ namespace QAMQP
QPointer<QAMQP::Connection> connection_;
QSharedPointer<Authenticator> auth_;
bool isSSl() const;
Client * const pq_ptr;