Change open method so that a web socket can be reopened
authorKurt Pattyn <pattyn.kurt@gmail.com>
Mon, 18 Nov 2013 20:03:15 +0000 (21:03 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Mon, 18 Nov 2013 22:29:15 +0000 (23:29 +0100)
Change-Id: I1c7059a8e581ce5179c00f187b03f59fbed63ba6
Reviewed-by: Kurt Pattyn <pattyn.kurt@gmail.com>
examples/echoclient/echoclient.cpp
examples/echoclient/echoclient.h
src/websockets/qwebsocket_p.cpp
src/websockets/qwebsocket_p.h

index 9dab2cb..64a95ea 100644 (file)
@@ -46,7 +46,8 @@ QT_USE_NAMESPACE
 //! [constructor]
 EchoClient::EchoClient(const QUrl &url, QObject *parent) :
     QObject(parent),
-    m_webSocket()
+    m_webSocket(),
+    m_url(url)
 {
     connect(&m_webSocket, SIGNAL(connected()), this, SLOT(onConnected()));
     m_webSocket.open(QUrl(url));
@@ -66,5 +67,6 @@ void EchoClient::onConnected()
 void EchoClient::onTextMessageReceived(QString message)
 {
     qDebug() << "Message received:" << message;
+    m_webSocket.close();
 }
 //! [onTextMessageReceived]
index 02592d9..dd71497 100644 (file)
@@ -62,6 +62,7 @@ private Q_SLOTS:
 
 private:
     QWebSocket m_webSocket;
+    QUrl m_url;
 };
 
 #endif // ECHOCLIENT_H
index 87bfa3f..9537f2a 100644 (file)
@@ -88,7 +88,7 @@ QWebSocketConfiguration::QWebSocketConfiguration() :
 QWebSocketPrivate::QWebSocketPrivate(const QString &origin, QWebSocketProtocol::Version version, QWebSocket *pWebSocket, QObject *parent) :
     QObject(parent),
     q_ptr(pWebSocket),
-    m_pSocket(Q_NULLPTR),
+    m_pSocket(),
     m_errorString(),
     m_version(version),
     m_resourceName(),
@@ -137,7 +137,7 @@ QWebSocketPrivate::QWebSocketPrivate(QTcpSocket *pTcpSocket, QWebSocketProtocol:
     m_configuration()
 {
     Q_ASSERT(pWebSocket);
-    makeConnections(m_pSocket);
+    makeConnections(m_pSocket.data());
 }
 
 /*!
@@ -151,9 +151,9 @@ QWebSocketPrivate::~QWebSocketPrivate()
         {
             close(QWebSocketProtocol::CC_GOING_AWAY, tr("Connection closed"));
         }
-        releaseConnections(m_pSocket);
-        m_pSocket->deleteLater();
-        m_pSocket = Q_NULLPTR;
+        releaseConnections(m_pSocket.data());
+//        m_pSocket->deleteLater();
+//        m_pSocket = Q_NULLPTR;
     }
 }
 
@@ -280,7 +280,7 @@ void QWebSocketPrivate::ignoreSslErrors()
     m_configuration.m_ignoreSslErrors = true;
     if (m_pSocket)
     {
-        QSslSocket *pSslSocket = qobject_cast<QSslSocket *>(m_pSocket);
+        QSslSocket *pSslSocket = qobject_cast<QSslSocket *>(m_pSocket.data());
         if (pSslSocket)
         {
             pSslSocket->ignoreSslErrors();
@@ -355,6 +355,14 @@ void QWebSocketPrivate::close(QWebSocketProtocol::CloseCode closeCode, QString r
  */
 void QWebSocketPrivate::open(const QUrl &url, bool mask)
 {
+    //m_pSocket.reset();  //just delete the old socket for the moment; later, we can add more 'intelligent' handling by looking at the url
+    QTcpSocket *pTcpSocket = m_pSocket.take();
+    if (pTcpSocket)
+    {
+        releaseConnections(pTcpSocket);
+        pTcpSocket->deleteLater();
+    }
+    //if (m_url != url)
     if (!m_pSocket)
     {
         Q_Q(QWebSocket);
@@ -393,9 +401,9 @@ void QWebSocketPrivate::open(const QUrl &url, bool mask)
             else
             {
                 QSslSocket *sslSocket = new QSslSocket(this);
-                m_pSocket = sslSocket;
+                m_pSocket.reset(sslSocket);
 
-                makeConnections(m_pSocket);
+                makeConnections(m_pSocket.data());
                 connect(sslSocket, SIGNAL(encryptedBytesWritten(qint64)), q, SIGNAL(bytesWritten(qint64)));
                 setSocketState(QAbstractSocket::ConnectingState);
 
@@ -418,10 +426,10 @@ void QWebSocketPrivate::open(const QUrl &url, bool mask)
     #endif
         if (url.scheme() == QStringLiteral("ws"))
         {
-            m_pSocket = new QTcpSocket(this);
+            m_pSocket.reset(new QTcpSocket(this));
 
-            makeConnections(m_pSocket);
-            connect(m_pSocket, SIGNAL(bytesWritten(qint64)), q, SIGNAL(bytesWritten(qint64)));
+            makeConnections(m_pSocket.data());
+            connect(m_pSocket.data(), SIGNAL(bytesWritten(qint64)), q, SIGNAL(bytesWritten(qint64)));
             setSocketState(QAbstractSocket::ConnectingState);
 #ifndef QT_NO_NETWORKPROXY
             m_pSocket->setProxy(m_configuration.m_proxy);
@@ -1071,11 +1079,11 @@ void QWebSocketPrivate::processData()
     {
         if (state() == QAbstractSocket::ConnectingState)
         {
-            processHandshake(m_pSocket);
+            processHandshake(m_pSocket.data());
         }
         else
         {
-            m_dataProcessor.process(m_pSocket);
+            m_dataProcessor.process(m_pSocket.data());
         }
     }
 }
index bd41d8b..9fd686b 100644 (file)
@@ -208,7 +208,7 @@ private:
     qint64 writeFrames(const QList<QByteArray> &frames);
     qint64 writeFrame(const QByteArray &frame);
 
-    QTcpSocket *m_pSocket;
+    QScopedPointer<QTcpSocket> m_pSocket;
     QString m_errorString;
     QWebSocketProtocol::Version m_version;
     QUrl m_resource;