void TWebSocketWorker::run() { QString es = TUrlRoute::splitPath(requestPath).value(0).toLower() + "endpoint"; TDispatcher<TWebSocketEndpoint> dispatcher(es); TWebSocketEndpoint *endpoint = dispatcher.object(); if (endpoint) { tSystemDebug("Found endpoint: %s", qPrintable(es)); tSystemDebug("TWebSocketWorker opcode: %d", opcode); switch (opcode) { case TWebSocketFrame::Continuation: // means session opening if (sessionStore.id().isEmpty()) { endpoint->onOpen(sessionStore); } else { tError("Invalid logic [%s:%d]", __FILE__, __LINE__); } break; case TWebSocketFrame::TextFrame: endpoint->onTextReceived(QString::fromUtf8(requestData)); break; case TWebSocketFrame::BinaryFrame: endpoint->onBinaryReceived(requestData); break; case TWebSocketFrame::Close: endpoint->onClose(); endpoint->closeWebSocket(); break; case TWebSocketFrame::Ping: endpoint->onPing(); endpoint->sendPong(); break; case TWebSocketFrame::Pong: endpoint->onPong(); break; default: tWarn("Invalid opcode: 0x%x [%s:%d]", (int)opcode, __FILE__, __LINE__); break; } // Sends payload for (QListIterator<QVariant> it(endpoint->payloadList); it.hasNext(); ) { const QVariant &var = it.next(); switch (var.type()) { case QVariant::String: socket->sendText(var.toString()); break; case QVariant::ByteArray: socket->sendBinary(var.toByteArray()); break; case QVariant::Int: { int opcode = var.toInt(); switch (opcode) { case TWebSocketFrame::Close: socket->disconnect(); break; case TWebSocketFrame::Ping: socket->sendPing(); break; case TWebSocketFrame::Pong: socket->sendPong(); break; default: tError("Invalid logic [%s:%d]", __FILE__, __LINE__); break; } break; } default: tError("Invalid logic [%s:%d]", __FILE__, __LINE__); break; } } } }