Thijs Wenkernew style qt connectorsecd368f11 years agoHistory
67 lines · 2.5 KB · C++
RawDownload
////  WebSocketServerClass.cpp//  libraries/script-engine/src/////  Created by Thijs Wenker on 8/10/15.//  Copyright (c) 2015 High Fidelity, Inc. All rights reserved.////  Making WebSocketServer accessible through scripting.////  Distributed under the Apache License, Version 2.0.//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html// #include "ScriptEngine.h"#include "WebSocketServerClass.h" WebSocketServerClass::WebSocketServerClass(QScriptEngine* engine, const QString& serverName, const quint16 port) :    _engine(engine),    _webSocketServer(serverName, QWebSocketServer::SslMode::NonSecureMode){    if (_webSocketServer.listen(QHostAddress::Any, port)) {        connect(&_webSocketServer, &QWebSocketServer::newConnection, this, &WebSocketServerClass::onNewConnection);    }} QScriptValue WebSocketServerClass::constructor(QScriptContext* context, QScriptEngine* engine) {    // the serverName is used in handshakes    QString serverName = QStringLiteral("HighFidelity - Scripted WebSocket Listener");    // port 0 will auto-assign a free port    quint16 port = 0;    QScriptValue callee = context->callee();    if (context->argumentCount() > 0) {        QScriptValue options = context->argument(0);        QScriptValue portOption = options.property(QStringLiteral("port"));        if (portOption.isValid() && portOption.isNumber()) {            port = portOption.toNumber();        }        QScriptValue serverNameOption = options.property(QStringLiteral("serverName"));        if (serverNameOption.isValid() && serverNameOption.isString()) {            serverName = serverNameOption.toString();        }    }    auto webSocketServerClass = new WebSocketServerClass(engine, serverName, port);    connect(static_cast<ScriptEngine*>(engine), &ScriptEngine::finished, webSocketServerClass, &QObject::deleteLater);    return engine->newQObject(webSocketServerClass);} WebSocketServerClass::~WebSocketServerClass() {    if (_webSocketServer.isListening()) {        close();    }} void WebSocketServerClass::onNewConnection() {    WebSocketClass* newClient = new WebSocketClass(_engine, _webSocketServer.nextPendingConnection());    _clients << newClient;    emit newConnection(newClient);} void WebSocketServerClass::close() {    foreach(WebSocketClass* client, _clients) {        if (client->getReadyState() != WebSocketClass::ReadyState::CLOSED) {            client->close(QWebSocketProtocol::CloseCode::CloseCodeGoingAway, "Server closing.");        }    }    _webSocketServer.close();}