overte-HifiExperiments/libraries/script-engine/src/WebSocketServerClass.cpp

67 lines
2.5 KiB
C++

//
// 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(engine, SIGNAL(finished(const QString&)), webSocketServerClass, SLOT(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();
}