diff --git a/src/cpp/handler/httpsessionupdatemanager.cpp b/src/cpp/handler/httpsessionupdatemanager.cpp index 15df59bf..1f403f07 100644 --- a/src/cpp/handler/httpsessionupdatemanager.cpp +++ b/src/cpp/handler/httpsessionupdatemanager.cpp @@ -113,7 +113,9 @@ class HttpSessionUpdateManager::Private : public QObject bucket->key = key; bucket->sessions += hs; bucket->timer = new QTimer(this); - connect(bucket->timer, &QTimer::timeout, this, &Private::timer_timeout); + QObject::connect(bucket->timer, &QTimer::timeout, [this, timer=bucket->timer]() { + this->timer_timeout(timer); + }); buckets[key] = bucket; bucketsByTimer[bucket->timer] = bucket; @@ -137,10 +139,9 @@ class HttpSessionUpdateManager::Private : public QObject removeBucket(bucket); } -private slots: - void timer_timeout() +private: + void timer_timeout(QTimer *timer) { - QTimer *timer = (QTimer *)sender(); Bucket *bucket = bucketsByTimer.value(timer); if(!bucket) return; diff --git a/src/cpp/proxy/sockjsmanager.cpp b/src/cpp/proxy/sockjsmanager.cpp index b26ca31a..3d6b107d 100644 --- a/src/cpp/proxy/sockjsmanager.cpp +++ b/src/cpp/proxy/sockjsmanager.cpp @@ -70,6 +70,11 @@ static QByteArray serializeJsonString(const QString &s) return tmp.mid(1, tmp.length() - 2); } +struct WSConnections { + Connection closedConnection; + Connection errorConnection; +}; + struct ZhttpReqConnections{ Connection readyReadConnection; Connection bytesWrittenConnection; @@ -123,6 +128,7 @@ class SockJsManager::Private : public QObject owner->reqConnectionMap.erase(req); delete req; } + owner->wsConnectionMap.erase(sock); delete sock; if(timer) @@ -146,6 +152,7 @@ class SockJsManager::Private : public QObject QByteArray iframeHtmlEtag; QSet discardedRequests; map reqConnectionMap; + map wsConnectionMap; Private(SockJsManager *_q, const QString &sockJsUrl) : QObject(_q), @@ -198,7 +205,10 @@ class SockJsManager::Private : public QObject { // if there's a close value, hang around for a little bit s->timer = new QTimer(this); - connect(s->timer, &QTimer::timeout, this, &Private::timer_timeout); + QObject::connect(s->timer, &QTimer::timeout, [this, timer=s->timer]() { + this->timer_timeout(timer); + }); + s->timer->setSingleShot(true); sessionsByTimer.insert(s->timer, s); s->timer->start(5000); @@ -277,8 +287,10 @@ class SockJsManager::Private : public QObject s->asUri.setPath(QString::fromUtf8(encPath.mid(0, basePathStart) + "/websocket"), QUrl::StrictMode); s->route = route; - connect(sock, &ZWebSocket::closed, this, &Private::sock_closed); - connect(sock, &ZWebSocket::error, this, &Private::sock_error); + wsConnectionMap[sock] = { + sock->closed.connect(boost::bind(&Private::sock_closed, this, sock)), + sock->error.connect(boost::bind(&Private::sock_error, this, sock)) + }; sessions += s; sessionsBySocket.insert(s->sock, s); @@ -589,6 +601,7 @@ class SockJsManager::Private : public QObject return s->ext; } +private: void req_readyRead(ZhttpRequest *req) { // for a request to have been discardable, we must have read the @@ -646,10 +659,8 @@ class SockJsManager::Private : public QObject removeSession(s); } -private slots: - void sock_closed() + void sock_closed(ZWebSocket *sock) { - ZWebSocket *sock = (ZWebSocket *)sender(); Session *s = sessionsBySocket.value(sock); assert(s); @@ -659,9 +670,8 @@ private slots: removeSession(s); } - void sock_error() + void sock_error(ZWebSocket *sock) { - ZWebSocket *sock = (ZWebSocket *)sender(); Session *s = sessionsBySocket.value(sock); assert(s); @@ -671,9 +681,9 @@ private slots: removeSession(s); } - void timer_timeout() +private: + void timer_timeout(QTimer *timer) { - QTimer *timer = (QTimer *)sender(); Session *s = sessionsByTimer.value(timer); assert(s); diff --git a/src/cpp/proxy/sockjssession.cpp b/src/cpp/proxy/sockjssession.cpp index e3df9adb..15819ce2 100644 --- a/src/cpp/proxy/sockjssession.cpp +++ b/src/cpp/proxy/sockjssession.cpp @@ -37,10 +37,22 @@ #include "zwebsocket.h" #include "sockjsmanager.h" +using std::map; + #define BUFFER_SIZE 200000 #define KEEPALIVE_TIMEOUT 25 #define UNCONNECTED_TIMEOUT 5 +struct WSConnections { + Connection connectedConnection; + Connection readyReadConnection; + Connection framesWrittenConnection; + Connection writeBytesChangedConnection; + Connection closedConnection; + Connection peerClosedConnection; + Connection sockErrorConnection; +}; + class SockJsSession::Private : public QObject { Q_OBJECT @@ -148,6 +160,7 @@ class SockJsSession::Private : public QObject bool updating; Connection bytesWrittenConnection; Connection errorConnection; + WSConnections wsConnection; Private(SockJsSession *_q) : QObject(_q), @@ -231,6 +244,7 @@ class SockJsSession::Private : public QObject } requests.clear(); + wsConnection = WSConnections(); delete sock; sock = 0; @@ -261,12 +275,14 @@ class SockJsSession::Private : public QObject } else { - connect(sock, &ZWebSocket::readyRead, this, &Private::sock_readyRead); - connect(sock, &ZWebSocket::framesWritten, this, &Private::sock_framesWritten); - connect(sock, &ZWebSocket::writeBytesChanged, this, &Private::sock_writeBytesChanged); - connect(sock, &ZWebSocket::closed, this, &Private::sock_closed); - connect(sock, &ZWebSocket::peerClosed, this, &Private::sock_peerClosed); - connect(sock, &ZWebSocket::error, this, &Private::sock_error); + wsConnection = WSConnections{ + sock->readyRead.connect(boost::bind(&Private::sock_readyRead, this)), + sock->framesWritten.connect(boost::bind(&Private::sock_framesWritten, this, boost::placeholders::_1, boost::placeholders::_2)), + sock->writeBytesChanged.connect(boost::bind(&Private::sock_writeBytesChanged, this)), + sock->closed.connect(boost::bind(&Private::sock_closed, this)), + sock->peerClosed.connect(boost::bind(&Private::sock_peerClosed, this)), + sock->error.connect(boost::bind(&Private::sock_error, this)) + }; } } @@ -560,7 +576,7 @@ class SockJsSession::Private : public QObject state = Idle; applyLinger(); cleanup(); - QMetaObject::invokeMethod(q, "closed", Qt::QueuedConnection); + QMetaObject::invokeMethod(q, "doClosed", Qt::QueuedConnection); } else tryWrite(); @@ -622,7 +638,7 @@ class SockJsSession::Private : public QObject if(bytes > 0) { QPointer self = this; - emit q->writeBytesChanged(); + q->writeBytesChanged(); if(!self) return; } @@ -692,7 +708,7 @@ class SockJsSession::Private : public QObject if(emitReadyRead) { - emit q->readyRead(); + q->readyRead(); if(!self) return false; } @@ -799,7 +815,7 @@ class SockJsSession::Private : public QObject { state = Idle; cleanup(); - emit q->error(); + q->error(); // stop signals return false; @@ -807,7 +823,7 @@ class SockJsSession::Private : public QObject if(emitReadyRead) { - emit q->readyRead(); + q->readyRead(); if(!self) return false; } @@ -850,7 +866,7 @@ class SockJsSession::Private : public QObject pendingWrittenBytes = 0; } - emit q->framesWritten(count, contentBytes); + q->framesWritten(count, contentBytes); } QVariant applyLinger() @@ -901,7 +917,7 @@ class SockJsSession::Private : public QObject state = Idle; removeRequestItem(ri); cleanup(); - emit q->closed(); + q->closed(); return; } else if(ri->type == RequestItem::Receive) @@ -918,7 +934,7 @@ class SockJsSession::Private : public QObject state = Idle; removeRequestItem(ri); cleanup(); - emit q->closed(); + q->closed(); return; } } @@ -951,7 +967,7 @@ class SockJsSession::Private : public QObject if(close && !peerClosed) { peerClosed = true; - emit q->peerClosed(); + q->peerClosed(); return; } @@ -959,9 +975,9 @@ class SockJsSession::Private : public QObject cleanup(); if(close) - emit q->closed(); + q->closed(); else - emit q->error(); + q->error(); } else { @@ -969,7 +985,6 @@ class SockJsSession::Private : public QObject } } -private slots: void sock_readyRead() { if(mode == WebSocketFramed) @@ -978,7 +993,7 @@ private slots: } else // WebSocketPassthrough { - emit q->readyRead(); + q->readyRead(); } } @@ -989,14 +1004,14 @@ private slots: void sock_writeBytesChanged() { - emit q->writeBytesChanged(); + q->writeBytesChanged(); } void sock_peerClosed() { peerCloseCode = sock->peerCloseCode(); peerCloseReason = sock->peerCloseReason(); - emit q->peerClosed(); + q->peerClosed(); } void sock_closed() @@ -1005,7 +1020,7 @@ private slots: peerCloseReason = sock->peerCloseReason(); state = Idle; cleanup(); - emit q->closed(); + q->closed(); } void sock_error() @@ -1013,7 +1028,7 @@ private slots: state = Idle; errorCondition = sock->errorCondition(); cleanup(); - emit q->error(); + q->error(); } void doUpdate() @@ -1024,7 +1039,7 @@ private slots: { state = Idle; cleanup(); - emit q->error(); + q->error(); return; } @@ -1040,11 +1055,16 @@ private slots: pendingWrittenFrames = 0; pendingWrittenBytes = 0; - emit q->framesWritten(count, contentBytes); + q->framesWritten(count, contentBytes); } } } +private slots: + void doClosed(){ + q->closed(); + } + void keepAliveTimer_timeout() { assert(mode != WebSocketPassthrough); @@ -1064,7 +1084,7 @@ private slots: // timeout while unconnected state = Idle; cleanup(); - emit q->error(); + q->error(); } } else diff --git a/src/cpp/proxy/testwebsocket.cpp b/src/cpp/proxy/testwebsocket.cpp index 782ea290..417a3258 100644 --- a/src/cpp/proxy/testwebsocket.cpp +++ b/src/cpp/proxy/testwebsocket.cpp @@ -115,10 +115,10 @@ public slots: } } - emit q->connected(); + q->connected(); if(gripEnabled && !channels.isEmpty()) - QMetaObject::invokeMethod(q, "readyRead", Qt::QueuedConnection); + QMetaObject::invokeMethod(this, "doReadyRead", Qt::QueuedConnection); } else { @@ -128,14 +128,29 @@ public slots: response.body += QByteArray("no such test resource\n"); errorCondition = ErrorRejected; - emit q->error(); + q->error(); } } + void doReadyRead() + { + q->readyRead(); + } + + void doFramesWritten(int count, int bytes) + { + q->framesWritten(count, bytes); + } + + void doWriteBytesChanged() + { + q->writeBytesChanged(); + } + void handleClose() { state = Idle; - emit q->closed(); + q->closed(); } }; @@ -296,13 +311,13 @@ void TestWebSocket::writeFrame(const Frame &frame) d->inFrames += tmp; - QMetaObject::invokeMethod(this, "framesWritten", Qt::QueuedConnection, Q_ARG(int, 1), Q_ARG(int, tmp.data.size())); - QMetaObject::invokeMethod(this, "readyRead", Qt::QueuedConnection); + QMetaObject::invokeMethod(d, "doFramesWritten", Qt::QueuedConnection, Q_ARG(int, 1), Q_ARG(int, tmp.data.size())); + QMetaObject::invokeMethod(d, "doReadyRead", Qt::QueuedConnection); } WebSocket::Frame TestWebSocket::readFrame() { - QMetaObject::invokeMethod(this, "writeBytesChanged", Qt::QueuedConnection); + QMetaObject::invokeMethod(d, "doWriteBytesChanged", Qt::QueuedConnection); return d->inFrames.takeFirst(); } diff --git a/src/cpp/proxy/websocketoverhttp.cpp b/src/cpp/proxy/websocketoverhttp.cpp index 4d10f39d..1792d39b 100644 --- a/src/cpp/proxy/websocketoverhttp.cpp +++ b/src/cpp/proxy/websocketoverhttp.cpp @@ -46,6 +46,12 @@ namespace { +struct WSConnections { + Connection disconnectedConnection; + Connection closedConnection; + Connection errorConnection; +}; + class WsEvent { public: @@ -69,7 +75,7 @@ class WebSocketOverHttp::DisconnectManager : public QObject { Q_OBJECT - map disconnectedConnection; + map wsConnectionMap; public: DisconnectManager(QObject *parent = 0) : @@ -80,9 +86,11 @@ class WebSocketOverHttp::DisconnectManager : public QObject void addSocket(WebSocketOverHttp *sock) { sock->setParent(this); - disconnectedConnection[sock] = sock->disconnected.connect(boost::bind(&DisconnectManager::sock_disconnected, this, sock)); - connect(sock, &WebSocketOverHttp::closed, this, &DisconnectManager::sock_closed); - connect(sock, &WebSocketOverHttp::error, this, &DisconnectManager::sock_error); + wsConnectionMap[sock] = { + sock->disconnected.connect(boost::bind(&DisconnectManager::sock_disconnected, this, sock)), + sock->closed.connect(boost::bind(&DisconnectManager::sock_closed, this, sock)), + sock->error.connect(boost::bind(&DisconnectManager::sock_error, this, sock)) + }; sock->sendDisconnect(); } @@ -95,7 +103,7 @@ class WebSocketOverHttp::DisconnectManager : public QObject private: void cleanupSocket(WebSocketOverHttp *sock) { - disconnectedConnection.erase(sock); + wsConnectionMap.erase(sock); delete sock; } @@ -105,16 +113,13 @@ class WebSocketOverHttp::DisconnectManager : public QObject cleanupSocket(sock); } -private slots: - void sock_closed() + void sock_closed(WebSocketOverHttp *sock) { - WebSocketOverHttp *sock = (WebSocketOverHttp *)sender(); cleanupSocket(sock); } - void sock_error() + void sock_error(WebSocketOverHttp *sock) { - WebSocketOverHttp *sock = (WebSocketOverHttp *)sender(); cleanupSocket(sock); } }; @@ -646,7 +651,7 @@ class WebSocketOverHttp::Private : public QObject if(inBuf.size() + req->bytesAvailable() > RESPONSE_BODY_MAX) { cleanup(); - emit q->error(); + q->error(); return; } @@ -690,7 +695,7 @@ class WebSocketOverHttp::Private : public QObject errorCondition = ErrorGeneric; cleanup(); - emit q->error(); + q->error(); return; } @@ -726,7 +731,7 @@ class WebSocketOverHttp::Private : public QObject if(!ok) { cleanup(); - emit q->error(); + q->error(); return; } @@ -736,7 +741,7 @@ class WebSocketOverHttp::Private : public QObject if(events.isEmpty() && keepAliveInterval == -1) { cleanup(); - emit q->error(); + q->error(); return; } @@ -744,7 +749,7 @@ class WebSocketOverHttp::Private : public QObject if(!events.isEmpty() && events.first().type != "OPEN") { cleanup(); - emit q->error(); + q->error(); return; } @@ -837,7 +842,7 @@ class WebSocketOverHttp::Private : public QObject if(emitConnected) { - emit q->connected(); + q->connected(); if(!self) return; } @@ -851,7 +856,7 @@ class WebSocketOverHttp::Private : public QObject if(reqFrames > 0) { - emit q->framesWritten(reqFrames, reqContentSize); + q->framesWritten(reqFrames, reqContentSize); if(!self) return; } @@ -863,7 +868,7 @@ class WebSocketOverHttp::Private : public QObject if(hadContent) { - emit q->writeBytesChanged(); + q->writeBytesChanged(); if(!self) return; } @@ -876,12 +881,12 @@ class WebSocketOverHttp::Private : public QObject if(closeSent) { cleanup(); - emit q->closed(); + q->closed(); return; } else { - emit q->peerClosed(); + q->peerClosed(); } } else if(closeSent && keepAliveInterval == -1) @@ -895,14 +900,14 @@ class WebSocketOverHttp::Private : public QObject if(disconnected) { cleanup(); - emit q->error(); + q->error(); return; } if(reqClose && peerClosing) { cleanup(); - emit q->closed(); + q->closed(); return; } @@ -977,7 +982,7 @@ class WebSocketOverHttp::Private : public QObject errorCondition = WebSocket::ErrorTls; cleanup(); - emit q->error(); + q->error(); } private slots: @@ -996,7 +1001,7 @@ private slots: cleanup(); errorCondition = pendingErrorCondition; pendingErrorCondition = (ErrorCondition)-1; - emit q->error(); + q->error(); } }; diff --git a/src/cpp/proxy/wsproxysession.cpp b/src/cpp/proxy/wsproxysession.cpp index cccc2a28..57f139a9 100644 --- a/src/cpp/proxy/wsproxysession.cpp +++ b/src/cpp/proxy/wsproxysession.cpp @@ -50,13 +50,31 @@ #define ACTIVITY_TIMEOUT 60000 #define KEEPALIVE_RAND_MAX 1000 +struct WSConnections { + Connection connectedConnection; + Connection readyReadConnection; + Connection writeBytesChangedConnection; + Connection peerClosedConnection; + Connection closedConnection; + Connection errorConnection; +}; + +struct InWSConnections { + Connection readyReadConnection; + Connection framesWrittenConnection; + Connection writeBytesChangedConnection; + Connection peerClosedConnection; + Connection closedConnection; + Connection errorConnection; +}; + struct WSProxyConnections { - Connection sendEventReceivedConnection; - Connection keepAliveSetupEventReceivedConnection; - Connection closeEventReceivedConnection; - Connection detachEventReceivedConnection; - Connection cancelEventReceivedConnection; - Connection errorConnection; + Connection sendEventReceivedConnection; + Connection keepAliveSetupEventReceivedConnection; + Connection closeEventReceivedConnection; + Connection detachEventReceivedConnection; + Connection cancelEventReceivedConnection; + Connection errorConnection; }; class HttpExtension @@ -291,6 +309,8 @@ class WsProxySession::Private : public QObject Connection keepAliveConneciton; Connection aboutToSendRequestConnection; map wsProxyConnectionMap; + WSConnections outWSConnection; + InWSConnections inWSConnection; Private(WsProxySession *_q, ZRoutes *_zroutes, ConnectionManager *_connectionManager, const LogUtil::Config &_logConfig, StatsManager *_statsManager, WsControlManager *_wsControlManager) : QObject(_q), @@ -331,7 +351,8 @@ class WsProxySession::Private : public QObject cleanupKeepAliveTimer(); cleanupInSock(); - + + outWSConnection = WSConnections(); delete outSock; outSock = 0; @@ -351,6 +372,7 @@ class WsProxySession::Private : public QObject if(inSock) { connectionManager->removeConnection(inSock); + inWSConnection = InWSConnections(); delete inSock; inSock = 0; } @@ -380,12 +402,14 @@ class WsProxySession::Private : public QObject inSock = sock; inSock->setParent(this); - connect(inSock, &WebSocket::readyRead, this, &Private::in_readyRead); - connect(inSock, &WebSocket::framesWritten, this, &Private::in_framesWritten); - connect(inSock, &WebSocket::writeBytesChanged, this, &Private::in_writeBytesChanged); - connect(inSock, &WebSocket::peerClosed, this, &Private::in_peerClosed); - connect(inSock, &WebSocket::closed, this, &Private::in_closed); - connect(inSock, &WebSocket::error, this, &Private::in_error); + inWSConnection = InWSConnections{ + inSock->readyRead.connect(boost::bind(&Private::in_readyRead, this)), + inSock->framesWritten.connect(boost::bind(&Private::in_framesWritten, this, boost::placeholders::_1, boost::placeholders::_2)), + inSock->writeBytesChanged.connect(boost::bind(&Private::in_writeBytesChanged, this)), + inSock->peerClosed.connect(boost::bind(&Private::in_peerClosed, this)), + inSock->closed.connect(boost::bind(&Private::in_closed, this)), + inSock->error.connect(boost::bind(&Private::in_error, this)) + }; requestData.uri = inSock->requestUri(); requestData.headers = inSock->requestHeaders(); @@ -558,13 +582,14 @@ class WsProxySession::Private : public QObject outSock->setParent(this); } } - - connect(outSock, &WebSocket::connected, this, &Private::out_connected); - connect(outSock, &WebSocket::readyRead, this, &Private::out_readyRead); - connect(outSock, &WebSocket::writeBytesChanged, this, &Private::out_writeBytesChanged); - connect(outSock, &WebSocket::peerClosed, this, &Private::out_peerClosed); - connect(outSock, &WebSocket::closed, this, &Private::out_closed); - connect(outSock, &WebSocket::error, this, &Private::out_error); + outWSConnection = { + outSock->connected.connect(boost::bind(&Private::out_connected, this)), + outSock->readyRead.connect(boost::bind(&Private::out_readyRead, this)), + outSock->writeBytesChanged.connect(boost::bind(&Private::out_writeBytesChanged, this)), + outSock->peerClosed.connect(boost::bind(&Private::out_peerClosed, this)), + outSock->closed.connect(boost::bind(&Private::out_closed, this)), + outSock->error.connect(boost::bind(&Private::out_error, this)) + }; if(target.trusted) outSock->setIgnorePolicies(true); @@ -835,6 +860,7 @@ private slots: { if(outSock->state() == WebSocket::Connecting) { + outWSConnection = WSConnections(); delete outSock; outSock = 0; @@ -866,6 +892,7 @@ private slots: if(!detached) { + outWSConnection = WSConnections(); delete outSock; outSock = 0; } @@ -961,6 +988,7 @@ private slots: { int code = outSock->peerCloseCode(); QString reason = outSock->peerCloseReason(); + outWSConnection = WSConnections(); delete outSock; outSock = 0; @@ -977,6 +1005,7 @@ private slots: if(detached) { + outWSConnection = WSConnections(); delete outSock; outSock = 0; @@ -1003,6 +1032,7 @@ private slots: break; } + outWSConnection = WSConnections(); delete outSock; outSock = 0; @@ -1013,6 +1043,7 @@ private slots: { cleanupInSock(); + outWSConnection = WSConnections(); delete outSock; outSock = 0; @@ -1113,6 +1144,7 @@ private slots: { if(outSock) { + outWSConnection = WSConnections(); delete outSock; outSock = 0; } diff --git a/src/cpp/runner/service.cpp b/src/cpp/runner/service.cpp index 721f2fbd..044a9739 100644 --- a/src/cpp/runner/service.cpp +++ b/src/cpp/runner/service.cpp @@ -202,6 +202,11 @@ class Service::Private : public QObject } private slots: + void doError(const QString &str) + { + q->error(str); + } + void proc_started() { if(!pidFile.isEmpty()) @@ -328,7 +333,7 @@ void Service::start() if(!preStart()) { QString str = "Failure preparing to start"; - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(QString, str)); + QMetaObject::invokeMethod(this, "doError", Qt::QueuedConnection, Q_ARG(QString, str)); return; } diff --git a/src/cpp/simplehttpserver.cpp b/src/cpp/simplehttpserver.cpp index bec9ba51..bf395dbe 100644 --- a/src/cpp/simplehttpserver.cpp +++ b/src/cpp/simplehttpserver.cpp @@ -91,9 +91,15 @@ class SimpleHttpRequest::Private : public QObject void start(QTcpSocket *_sock) { - connect(_sock, &QTcpSocket::readyRead, this, &Private::sock_readyRead); - connect(_sock, &QTcpSocket::bytesWritten, this, &Private::sock_bytesWritten); - connect(_sock, &QTcpSocket::disconnected, this, &Private::sock_disconnected); + QObject::connect(_sock, &QTcpSocket::readyRead, [this]() { + this->sock_readyRead(); + }); + QObject::connect(_sock, &QTcpSocket::bytesWritten, this, [this](qint64 bytes) { + this->sock_bytesWritten(bytes); + }); + QObject::connect(_sock, &QTcpSocket::disconnected, [this]() { + this->sock_disconnected(); + }); sock = _sock; sock->setParent(this); @@ -103,9 +109,15 @@ class SimpleHttpRequest::Private : public QObject void start(QLocalSocket *_sock) { - connect(_sock, &QLocalSocket::readyRead, this, &Private::sock_readyRead); - connect(_sock, &QLocalSocket::bytesWritten, this, &Private::sock_bytesWritten); - connect(_sock, &QLocalSocket::disconnected, this, &Private::sock_disconnected); + QObject::connect(_sock, &QLocalSocket::readyRead, [this]() { + this->sock_readyRead(); + }); + QObject::connect(_sock, &QLocalSocket::bytesWritten, this, [this](qint64 bytes) { + this->sock_bytesWritten(bytes); + }); + QObject::connect(_sock, &QLocalSocket::disconnected, [this]() { + this->sock_disconnected(); + }); sock = _sock; sock->setParent(this); @@ -342,7 +354,6 @@ class SimpleHttpRequest::Private : public QObject } } -private slots: void sock_readyRead() { if(state == ReadHeader || state == ReadBody) diff --git a/src/cpp/websocket.h b/src/cpp/websocket.h index b17b0302..312c715d 100644 --- a/src/cpp/websocket.h +++ b/src/cpp/websocket.h @@ -28,6 +28,9 @@ #include #include #include "httpheaders.h" +#include + +using Signal = boost::signals2::signal; class WebSocket : public QObject { @@ -110,14 +113,13 @@ class WebSocket : public QObject virtual Frame readFrame() = 0; virtual void close(int code = -1, const QString &reason = QString()) = 0; -signals: - void connected(); - void readyRead(); - void framesWritten(int count, int contentBytes); - void writeBytesChanged(); - void peerClosed(); // emitted only if peer closes before we do - void closed(); // emitted after peer acks our close, or immediately if we were acking - void error(); + Signal connected; + Signal readyRead; + boost::signals2::signal framesWritten; + Signal writeBytesChanged; + Signal peerClosed; // emitted only if peer closes before we do + Signal closed; // emitted after peer acks our close, or immediately if we were acking + Signal error; }; #endif diff --git a/src/cpp/zwebsocket.cpp b/src/cpp/zwebsocket.cpp index 3233a1ac..4f631b77 100644 --- a/src/cpp/zwebsocket.cpp +++ b/src/cpp/zwebsocket.cpp @@ -297,7 +297,7 @@ class ZWebSocket::Private : public QObject state = Idle; cleanup(); - QMetaObject::invokeMethod(q, "closed", Qt::QueuedConnection); + QMetaObject::invokeMethod(q, "doClosed", Qt::QueuedConnection); } Frame readFrame() @@ -337,7 +337,7 @@ class ZWebSocket::Private : public QObject // if peer was already closed, then we're done! state = Idle; cleanup(); - QMetaObject::invokeMethod(q, "closed", Qt::QueuedConnection); + QMetaObject::invokeMethod(q, "doClosed", Qt::QueuedConnection); } else { @@ -414,7 +414,7 @@ class ZWebSocket::Private : public QObject if(written > 0 || contentBytesWritten > 0) { - emit q->framesWritten(written, contentBytesWritten); + q->framesWritten(written, contentBytesWritten); if(!self) return; } @@ -428,7 +428,7 @@ class ZWebSocket::Private : public QObject // if peer was already closed, then we're done! state = Idle; cleanup(); - emit q->closed(); + q->closed(); return; } else @@ -483,7 +483,7 @@ class ZWebSocket::Private : public QObject state = Idle; cleanup(); - emit q->error(); + q->error(); return; } else if(packet.type == ZhttpRequestPacket::Cancel) @@ -493,7 +493,7 @@ class ZWebSocket::Private : public QObject errorCondition = ErrorGeneric; state = Idle; cleanup(); - emit q->error(); + q->error(); return; } @@ -506,7 +506,7 @@ class ZWebSocket::Private : public QObject state = Idle; errorCondition = ErrorGeneric; cleanup(); - emit q->error(); + q->error(); return; } @@ -588,7 +588,7 @@ class ZWebSocket::Private : public QObject state = Idle; cleanup(); - emit q->error(); + q->error(); return; } else if(packet.type == ZhttpResponsePacket::Cancel) @@ -598,7 +598,7 @@ class ZWebSocket::Private : public QObject errorCondition = ErrorGeneric; state = Idle; cleanup(); - emit q->error(); + q->error(); return; } @@ -614,7 +614,7 @@ class ZWebSocket::Private : public QObject state = Idle; errorCondition = ErrorGeneric; cleanup(); - emit q->error(); + q->error(); return; } @@ -640,7 +640,7 @@ class ZWebSocket::Private : public QObject errorCondition = ErrorGeneric; cleanup(); log_warning("zws client: error id=%s initial response wrong type", id.data()); - emit q->error(); + q->error(); return; } @@ -650,7 +650,7 @@ class ZWebSocket::Private : public QObject errorCondition = ErrorGeneric; cleanup(); log_warning("zws client: error id=%s initial ack did not contain from field", id.data()); - emit q->error(); + q->error(); return; } } @@ -671,7 +671,7 @@ class ZWebSocket::Private : public QObject state = Connected; update(); - emit q->connected(); + q->connected(); } else { @@ -740,12 +740,12 @@ class ZWebSocket::Private : public QObject { state = Idle; cleanup(); - emit q->closed(); + q->closed(); } else { state = ConnectedPeerClosed; - emit q->peerClosed(); + q->peerClosed(); } } } @@ -977,6 +977,11 @@ class ZWebSocket::Private : public QObject } public slots: + void doClosed() + { + q->closed(); + } + void doUpdate() { pendingUpdate = false; @@ -989,14 +994,14 @@ public slots: { state = Idle; cleanup(); - emit q->closed(); + q->closed(); return; } else { QPointer self = this; state = ConnectedPeerClosed; - emit q->peerClosed(); + q->peerClosed(); if(!self) return; } @@ -1008,7 +1013,7 @@ public slots: readableChanged = false; QPointer self = this; - emit q->readyRead(); + q->readyRead(); if(!self) return; } @@ -1021,7 +1026,7 @@ public slots: { state = Idle; errorCondition = ErrorUnavailable; - emit q->error(); + q->error(); cleanup(); return; } @@ -1055,7 +1060,7 @@ public slots: { writableChanged = false; - emit q->writeBytesChanged(); + q->writeBytesChanged(); } } } @@ -1066,7 +1071,7 @@ public slots: state = Idle; errorCondition = ErrorTimeout; cleanup(); - emit q->error(); + q->error(); } void keepAlive_timeout()