2018-12-28 17:55:49 +01:00
|
|
|
#include <flatbufserver/FlatBufferServer.h>
|
|
|
|
#include "FlatBufferClient.h"
|
2020-09-07 21:34:14 +02:00
|
|
|
#include "HyperionConfig.h"
|
2018-12-28 17:55:49 +01:00
|
|
|
|
2019-07-12 16:54:26 +02:00
|
|
|
// util
|
|
|
|
#include <utils/NetOrigin.h>
|
2019-07-29 19:09:26 +02:00
|
|
|
#include <utils/GlobalSignals.h>
|
2019-07-12 16:54:26 +02:00
|
|
|
|
2018-12-28 17:55:49 +01:00
|
|
|
// qt
|
|
|
|
#include <QJsonObject>
|
|
|
|
#include <QTcpServer>
|
|
|
|
#include <QTcpSocket>
|
|
|
|
|
mDNS Support (#1452)
* Allow build, if no grabbers are enabled
* Align available functions to right Qt version
* Update to next development version
* Align available functions to right Qt version
* fix workflows (apt/nightly)
* Disable QNetworkConfigurationManager deprecation warnings
* Initial go on Smart Pointers
* Add Deallocation
* Correct QT_WARNING_DISABLE_DEPRECATED (available since 5.9)
* Cluster Build Variables
* Hyperion Light
* Address build warnings
* Hyperion Light - UI
* Update Protobuf to latest master
* Removed compiler warnings
* Added restart ability to systray
* Correct Protobuf
* Ignore 'no-return' warning on protobuf build
* hyperion-remote: Fix auto discovery of hyperion server
* Fix Qt version override
* Update changelog
* Remove Grabber Components, if no Grabber exists
* Standalone Grabber - Fix fps default
* Remote Control - Have Source Selction accrosswhole screen
* Enable Blackborder detection only, if relevant input sources available
* Enable Blackborder detection only, if relevant input sources available
* Remote UI - rearrange containers
* Checkout
* Fix compilation on windows
* Re-added qmdnsengine template cmake
* chrono added for linux
* Removed existing AVAHI/Bonjour, allow to enable/disable mDNS
* hyperiond macos typo fix
* Fix macOS Bundle build
* Fix macOS bundle info details
* Correct CMake files
* Removed existing AVAHI/Bonjour (2)
* Share hyperion's services via mDNS
* Add mDNS Browser and mDNS for LED-Devices
* Support mDNS discovery for standalone grabbers
* Remove ZLib Dependency & Cleanup
* mDNS - hanle 2.local2 an ".local." domains equally
* Hue - Link discovery to bridge class, workaround port 443 for mDNS discovery
* Fix save button state when switching between devices
* Removed sessions (of other hyperions)
* mDNS Publisher - Simplify service naming
* mDNS refactoring & Forwarder discovery
* mDNS Updates to use device service name
* Consistency of standalone grabbers with mDNS Service Registry
* Merge branch 'hyperion-project:master' into mDNS
* Start JSON and WebServers only after Instance 0 is available
* Remove bespoke qDebug Output again
* MDNS updates and refactor Forwarder
* Minor updates
* Upgrade to CMake 3.1
* typo
* macOS fix
* Correct merge
* - Remove dynamic linker flag from standalone dispmanX Grabber
- Added ability to use system qmdns libs
* Cec handler library will load at runtime
* typo fix
* protobuf changes
* mDNS changes for Windows/macOS
* test window build qmdnsengine
* absolute path to protobuf cmake dir
* Rework Hue Wizard supporting mDNS
* LED-Devices - Retry support + Refactoring (excl. Hue)
* LED-Devices - Refactoring/Retry support Hue + additional alignments
* Address LGTM findings
* Fix CI-Build, revert test changes
* Build Windows in Release mode to avoid python problem
* Correct that WebServerObject is available earlier
* Ensure that instance name in logs for one instance are presented
* Update content LEDs
* Rework mDNS Address lookup
* Fix LED UI
* Fix for non mDNS Services (ignore default port)
* Disbale device when now input is available
* Revert back some updates, ensure last color is updated when switched on
* Handle reopening case and changed IP, port for API-calls
* Add UPD-DDP Device
* WLED support for DDP
* Fix printout
* LEDDevice - Allow more retries, udapte defaults
* LED-Net Devices - Select Custom device, if configured
Co-authored-by: Paulchen Panther <16664240+Paulchen-Panther@users.noreply.github.com>
Co-authored-by: Paulchen Panther <Paulchen-Panter@protonmail.com>
2022-05-01 19:42:47 +02:00
|
|
|
// Constants
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
const char SERVICE_TYPE[] = "flatbuffer";
|
|
|
|
|
|
|
|
} //End of constants
|
|
|
|
|
2018-12-28 17:55:49 +01:00
|
|
|
FlatBufferServer::FlatBufferServer(const QJsonDocument& config, QObject* parent)
|
|
|
|
: QObject(parent)
|
|
|
|
, _server(new QTcpServer(this))
|
|
|
|
, _log(Logger::getInstance("FLATBUFSERVER"))
|
|
|
|
, _timeout(5000)
|
|
|
|
, _config(config)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
FlatBufferServer::~FlatBufferServer()
|
|
|
|
{
|
|
|
|
stopServer();
|
|
|
|
delete _server;
|
|
|
|
}
|
|
|
|
|
|
|
|
void FlatBufferServer::initServer()
|
|
|
|
{
|
2019-07-12 16:54:26 +02:00
|
|
|
_netOrigin = NetOrigin::getInstance();
|
2018-12-28 17:55:49 +01:00
|
|
|
connect(_server, &QTcpServer::newConnection, this, &FlatBufferServer::newConnection);
|
|
|
|
|
|
|
|
// apply config
|
|
|
|
handleSettingsUpdate(settings::FLATBUFSERVER, _config);
|
|
|
|
}
|
|
|
|
|
2020-08-08 13:09:15 +02:00
|
|
|
void FlatBufferServer::handleSettingsUpdate(settings::type type, const QJsonDocument& config)
|
2018-12-28 17:55:49 +01:00
|
|
|
{
|
|
|
|
if(type == settings::FLATBUFSERVER)
|
|
|
|
{
|
|
|
|
const QJsonObject& obj = config.object();
|
|
|
|
|
|
|
|
quint16 port = obj["port"].toInt(19400);
|
|
|
|
|
|
|
|
// port check
|
|
|
|
if(_server->serverPort() != port)
|
|
|
|
{
|
|
|
|
stopServer();
|
|
|
|
_port = port;
|
|
|
|
}
|
|
|
|
|
|
|
|
// new timeout just for new connections
|
|
|
|
_timeout = obj["timeout"].toInt(5000);
|
|
|
|
// enable check
|
|
|
|
obj["enable"].toBool(true) ? startServer() : stopServer();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void FlatBufferServer::newConnection()
|
|
|
|
{
|
|
|
|
while(_server->hasPendingConnections())
|
|
|
|
{
|
|
|
|
if(QTcpSocket* socket = _server->nextPendingConnection())
|
|
|
|
{
|
2019-07-12 16:54:26 +02:00
|
|
|
if(_netOrigin->accessAllowed(socket->peerAddress(), socket->localAddress()))
|
|
|
|
{
|
|
|
|
Debug(_log, "New connection from %s", QSTRING_CSTR(socket->peerAddress().toString()));
|
|
|
|
FlatBufferClient *client = new FlatBufferClient(socket, _timeout, this);
|
|
|
|
// internal
|
|
|
|
connect(client, &FlatBufferClient::clientDisconnected, this, &FlatBufferServer::clientDisconnected);
|
2019-07-29 19:09:26 +02:00
|
|
|
connect(client, &FlatBufferClient::registerGlobalInput, GlobalSignals::getInstance(), &GlobalSignals::registerGlobalInput);
|
|
|
|
connect(client, &FlatBufferClient::clearGlobalInput, GlobalSignals::getInstance(), &GlobalSignals::clearGlobalInput);
|
|
|
|
connect(client, &FlatBufferClient::setGlobalInputImage, GlobalSignals::getInstance(), &GlobalSignals::setGlobalImage);
|
|
|
|
connect(client, &FlatBufferClient::setGlobalInputColor, GlobalSignals::getInstance(), &GlobalSignals::setGlobalColor);
|
|
|
|
connect(GlobalSignals::getInstance(), &GlobalSignals::globalRegRequired, client, &FlatBufferClient::registationRequired);
|
2019-07-12 16:54:26 +02:00
|
|
|
_openConnections.append(client);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
socket->close();
|
2018-12-28 17:55:49 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void FlatBufferServer::clientDisconnected()
|
|
|
|
{
|
|
|
|
FlatBufferClient* client = qobject_cast<FlatBufferClient*>(sender());
|
|
|
|
client->deleteLater();
|
|
|
|
_openConnections.removeAll(client);
|
|
|
|
}
|
|
|
|
|
|
|
|
void FlatBufferServer::startServer()
|
|
|
|
{
|
|
|
|
if(!_server->isListening())
|
|
|
|
{
|
2020-09-07 21:34:14 +02:00
|
|
|
if(!_server->listen(QHostAddress::Any, _port))
|
|
|
|
{
|
|
|
|
Error(_log,"Failed to bind port %d", _port);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Info(_log,"Started on port %d", _port);
|
mDNS Support (#1452)
* Allow build, if no grabbers are enabled
* Align available functions to right Qt version
* Update to next development version
* Align available functions to right Qt version
* fix workflows (apt/nightly)
* Disable QNetworkConfigurationManager deprecation warnings
* Initial go on Smart Pointers
* Add Deallocation
* Correct QT_WARNING_DISABLE_DEPRECATED (available since 5.9)
* Cluster Build Variables
* Hyperion Light
* Address build warnings
* Hyperion Light - UI
* Update Protobuf to latest master
* Removed compiler warnings
* Added restart ability to systray
* Correct Protobuf
* Ignore 'no-return' warning on protobuf build
* hyperion-remote: Fix auto discovery of hyperion server
* Fix Qt version override
* Update changelog
* Remove Grabber Components, if no Grabber exists
* Standalone Grabber - Fix fps default
* Remote Control - Have Source Selction accrosswhole screen
* Enable Blackborder detection only, if relevant input sources available
* Enable Blackborder detection only, if relevant input sources available
* Remote UI - rearrange containers
* Checkout
* Fix compilation on windows
* Re-added qmdnsengine template cmake
* chrono added for linux
* Removed existing AVAHI/Bonjour, allow to enable/disable mDNS
* hyperiond macos typo fix
* Fix macOS Bundle build
* Fix macOS bundle info details
* Correct CMake files
* Removed existing AVAHI/Bonjour (2)
* Share hyperion's services via mDNS
* Add mDNS Browser and mDNS for LED-Devices
* Support mDNS discovery for standalone grabbers
* Remove ZLib Dependency & Cleanup
* mDNS - hanle 2.local2 an ".local." domains equally
* Hue - Link discovery to bridge class, workaround port 443 for mDNS discovery
* Fix save button state when switching between devices
* Removed sessions (of other hyperions)
* mDNS Publisher - Simplify service naming
* mDNS refactoring & Forwarder discovery
* mDNS Updates to use device service name
* Consistency of standalone grabbers with mDNS Service Registry
* Merge branch 'hyperion-project:master' into mDNS
* Start JSON and WebServers only after Instance 0 is available
* Remove bespoke qDebug Output again
* MDNS updates and refactor Forwarder
* Minor updates
* Upgrade to CMake 3.1
* typo
* macOS fix
* Correct merge
* - Remove dynamic linker flag from standalone dispmanX Grabber
- Added ability to use system qmdns libs
* Cec handler library will load at runtime
* typo fix
* protobuf changes
* mDNS changes for Windows/macOS
* test window build qmdnsengine
* absolute path to protobuf cmake dir
* Rework Hue Wizard supporting mDNS
* LED-Devices - Retry support + Refactoring (excl. Hue)
* LED-Devices - Refactoring/Retry support Hue + additional alignments
* Address LGTM findings
* Fix CI-Build, revert test changes
* Build Windows in Release mode to avoid python problem
* Correct that WebServerObject is available earlier
* Ensure that instance name in logs for one instance are presented
* Update content LEDs
* Rework mDNS Address lookup
* Fix LED UI
* Fix for non mDNS Services (ignore default port)
* Disbale device when now input is available
* Revert back some updates, ensure last color is updated when switched on
* Handle reopening case and changed IP, port for API-calls
* Add UPD-DDP Device
* WLED support for DDP
* Fix printout
* LEDDevice - Allow more retries, udapte defaults
* LED-Net Devices - Select Custom device, if configured
Co-authored-by: Paulchen Panther <16664240+Paulchen-Panther@users.noreply.github.com>
Co-authored-by: Paulchen Panther <Paulchen-Panter@protonmail.com>
2022-05-01 19:42:47 +02:00
|
|
|
|
|
|
|
emit publishService(SERVICE_TYPE, _port);
|
2020-09-07 21:34:14 +02:00
|
|
|
}
|
2018-12-28 17:55:49 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void FlatBufferServer::stopServer()
|
|
|
|
{
|
|
|
|
if(_server->isListening())
|
|
|
|
{
|
|
|
|
// close client connections
|
2019-01-19 18:35:40 +01:00
|
|
|
for(const auto& client : _openConnections)
|
2018-12-28 17:55:49 +01:00
|
|
|
{
|
|
|
|
client->forceClose();
|
|
|
|
}
|
|
|
|
_server->close();
|
|
|
|
Info(_log, "Stopped");
|
|
|
|
}
|
|
|
|
}
|