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 ) void ClientPrivate::parseCnnString( const QUrl & con )
{ {
P_Q(QAMQP::Client); 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->setPassword(con.password());
q->setUser(con.userName()); q->setUser(con.userName());
q->setPort(con.port()); 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 Authenticator * QAMQP::Client::auth() const
{ {
return pd_func()->auth_.data(); 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 virtualHost READ virtualHost WRITE setVirtualHost);
Q_PROPERTY(QString user READ user WRITE setUser); Q_PROPERTY(QString user READ user WRITE setUser);
Q_PROPERTY(QString password READ password WRITE setPassword); Q_PROPERTY(QString password READ password WRITE setPassword);
Q_PROPERTY(bool ssl READ isSsl WRITE setSsl);
Q_DISABLE_COPY(Client) Q_DISABLE_COPY(Client)
@ -64,6 +65,11 @@ namespace QAMQP
void open(const QUrl & connectionString); void open(const QUrl & connectionString);
void close(); void close();
void reopen(); void reopen();
bool isSsl() const;
void setSsl(bool value);
protected: protected:
ClientPrivate * const pd_ptr; ClientPrivate * const pd_ptr;

View File

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

View File

@ -6,17 +6,14 @@ QAMQP::Network::Network( QObject * parent /*= 0*/ ):QObject(parent)
{ {
qRegisterMetaType<QAMQP::Frame::Method>("QAMQP::Frame::Method"); qRegisterMetaType<QAMQP::Frame::Method>("QAMQP::Frame::Method");
socket_ = new QTcpSocket(this);
buffer_ = new QBuffer(this); buffer_ = new QBuffer(this);
offsetBuf = 0; offsetBuf = 0;
leftSize = 0; leftSize = 0;
buffer_->open(QIODevice::ReadWrite); buffer_->open(QIODevice::ReadWrite);
connect(socket_, SIGNAL(connected()), this, SLOT(connected()));
connect(socket_, SIGNAL(disconnected()), this, SLOT(disconnected())); initSocket(false);
connect(socket_, SIGNAL(readyRead()), this, SLOT(readyRead()));
connect(socket_, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error(QAbstractSocket::SocketError)));
} }
QAMQP::Network::~Network() QAMQP::Network::~Network()
@ -26,7 +23,13 @@ QAMQP::Network::~Network()
void QAMQP::Network::connectTo( const QString & host, quint32 port ) 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() void QAMQP::Network::disconnect()
@ -37,8 +40,14 @@ void QAMQP::Network::disconnect()
void QAMQP::Network::connected() void QAMQP::Network::connected()
{ {
char header_[8] = {'A', 'M', 'Q', 'P', 0,0,9,1}; if(isSsl() && !static_cast<QSslSocket *>(socket_.data())->isEncrypted() )
socket_->write(header_, 8); {
qDebug() << "[SSL] start encrypt";
static_cast<QSslSocket *>(socket_.data())->startClientEncryption();
} else {
conectionReady();
}
} }
void QAMQP::Network::disconnected() void QAMQP::Network::disconnected()
@ -118,4 +127,50 @@ void QAMQP::Network::sendFrame( const QAMQP::Frame::Base & frame )
{ {
QDataStream stream(socket_); QDataStream stream(socket_);
frame.toStream(stream); 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 <QObject>
#include <QTcpSocket> #include <QTcpSocket>
#include <QSslSocket>
#include <QPointer> #include <QPointer>
#include <QBuffer> #include <QBuffer>
@ -24,6 +25,9 @@ namespace QAMQP
void sendFrame(const QAMQP::Frame::Base & frame); void sendFrame(const QAMQP::Frame::Base & frame);
bool isSsl() const;
void setSsl(bool value);
signals: signals:
void method(const QAMQP::Frame::Method & method); void method(const QAMQP::Frame::Method & method);
void content(const QAMQP::Frame::Content & content); void content(const QAMQP::Frame::Content & content);
@ -34,8 +38,12 @@ namespace QAMQP
void disconnected(); void disconnected();
void error( QAbstractSocket::SocketError socketError ); void error( QAbstractSocket::SocketError socketError );
void readyRead(); void readyRead();
void sslErrors ( const QList<QSslError> & errors );
void conectionReady();
private: private:
void initSocket(bool ssl = false);
QPointer<QTcpSocket> socket_; QPointer<QTcpSocket> socket_;
QPointer<QBuffer> buffer_; QPointer<QBuffer> buffer_;
int offsetBuf; int offsetBuf;

View File

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