From 7c77e0e941f3fe9b3ceda0a079a31b8d63ace6fa Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Thu, 13 Aug 2015 18:21:50 +0200 Subject: [PATCH] initial WebSocketServer --- libraries/script-engine/src/ScriptEngine.cpp | 4 ++ .../script-engine/src/WebSocketClass.cpp | 1 - .../src/WebSocketServerClass.cpp | 44 +++++++++++++++++++ .../script-engine/src/WebSocketServerClass.h | 39 ++++++++++++++++ 4 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 libraries/script-engine/src/WebSocketServerClass.cpp create mode 100644 libraries/script-engine/src/WebSocketServerClass.h diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 861034a6dc..bde0643c51 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -39,6 +39,7 @@ #include "TypedArrays.h" #include "XMLHttpRequestClass.h" #include "WebSocketClass.h" +#include "WebSocketServerClass.h" #include "SceneScriptingInterface.h" @@ -347,6 +348,9 @@ void ScriptEngine::init() { QScriptValue webSocketConstructorValue = newFunction(WebSocketClass::constructor); globalObject().setProperty("WebSocket", webSocketConstructorValue); + QScriptValue webSocketServerConstructorValue = newFunction(WebSocketServerClass::constructor); + globalObject().setProperty("WebSocketServer", webSocketServerConstructorValue); + QScriptValue printConstructorValue = newFunction(debugPrint); globalObject().setProperty("print", printConstructorValue); diff --git a/libraries/script-engine/src/WebSocketClass.cpp b/libraries/script-engine/src/WebSocketClass.cpp index 1b8d305b16..f116c3a0e4 100644 --- a/libraries/script-engine/src/WebSocketClass.cpp +++ b/libraries/script-engine/src/WebSocketClass.cpp @@ -64,7 +64,6 @@ void WebSocketClass::handleOnError(QAbstractSocket::SocketError error) { void WebSocketClass::handleOnMessage(const QString& message) { if (_onMessageEvent.isFunction()) { - QScriptValueList args; QScriptValue arg = _engine->newObject(); arg.setProperty("data", message); diff --git a/libraries/script-engine/src/WebSocketServerClass.cpp b/libraries/script-engine/src/WebSocketServerClass.cpp new file mode 100644 index 0000000000..86f6506375 --- /dev/null +++ b/libraries/script-engine/src/WebSocketServerClass.cpp @@ -0,0 +1,44 @@ +// +// 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, quint16 port) : + _engine(engine), + _webSocketServer(serverName, QWebSocketServer::SslMode::NonSecureMode) +{ + _webSocketServer.listen(QHostAddress::Any, port); +} + +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(); + } + } + return engine->newQObject(new WebSocketServerClass(engine, serverName, port)); +} + +WebSocketServerClass::~WebSocketServerClass() { + if (_webSocketServer.isListening()) { + _webSocketServer.close(); + } +} diff --git a/libraries/script-engine/src/WebSocketServerClass.h b/libraries/script-engine/src/WebSocketServerClass.h new file mode 100644 index 0000000000..18fcdc693e --- /dev/null +++ b/libraries/script-engine/src/WebSocketServerClass.h @@ -0,0 +1,39 @@ +// +// WebSocketServerClass.h +// libraries/script-engine/src/ +// +// Created by Thijs Wenker on 8/10/15. +// Copyright (c) 2015 High Fidelity, Inc. All rights reserved. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_WebSocketServerClass_h +#define hifi_WebSocketServerClass_h + +#include +#include +#include + +class WebSocketServerClass : public QObject { + Q_OBJECT + +public: + WebSocketServerClass(QScriptEngine* engine, const QString& serverName, quint16 port); + ~WebSocketServerClass(); + + static QScriptValue WebSocketServerClass::constructor(QScriptContext* context, QScriptEngine* engine); + +private: + QWebSocketServer _webSocketServer; + QScriptEngine* _engine; + +signals: + void newConnection(); + + + +}; + +#endif // hifi_WebSocketServerClass_h