diff --git a/include/protoserver/ProtoConnection.h b/include/protoserver/ProtoConnection.h index bb41e1b7..a61947fe 100644 --- a/include/protoserver/ProtoConnection.h +++ b/include/protoserver/ProtoConnection.h @@ -67,10 +67,6 @@ public: /// void clearAll(); -private: - /// Try to connect to the Hyperion host - void connectToHost(); - /// /// Send a command message and receive its reply /// @@ -78,6 +74,10 @@ private: /// void sendMessage(const proto::HyperionRequest & message); +private: + /// Try to connect to the Hyperion host + void connectToHost(); + /// /// Parse a reply message /// diff --git a/include/protoserver/ProtoServer.h b/include/protoserver/ProtoServer.h index dae57481..c18b38fb 100644 --- a/include/protoserver/ProtoServer.h +++ b/include/protoserver/ProtoServer.h @@ -6,6 +6,7 @@ // Qt includes #include #include +#include // Hyperion includes #include @@ -27,7 +28,7 @@ public: /// @param hyperion Hyperion instance /// @param port port number on which to start listening for connections /// - ProtoServer(Hyperion * hyperion, uint16_t port = 19445); + ProtoServer(Hyperion * hyperion, uint16_t port = 19445, QStringList * forwardClientList = new QStringList() ); ~ProtoServer(); /// @@ -56,4 +57,5 @@ private: /// List with open connections QSet _openConnections; + QStringList _forwardClients; }; diff --git a/libsrc/protoserver/ProtoClientConnection.cpp b/libsrc/protoserver/ProtoClientConnection.cpp index 165315f7..2f0cc8d3 100644 --- a/libsrc/protoserver/ProtoClientConnection.cpp +++ b/libsrc/protoserver/ProtoClientConnection.cpp @@ -20,7 +20,7 @@ // project includes #include "ProtoClientConnection.h" -ProtoClientConnection::ProtoClientConnection(QTcpSocket *socket, Hyperion * hyperion) : +ProtoClientConnection::ProtoClientConnection(QTcpSocket *socket, Hyperion * hyperion, QStringList forwardClientList) : QObject(), _socket(socket), _imageProcessor(ImageProcessorFactory::getInstance().newImageProcessor()), @@ -30,11 +30,22 @@ ProtoClientConnection::ProtoClientConnection(QTcpSocket *socket, Hyperion * hype // connect internal signals and slots connect(_socket, SIGNAL(disconnected()), this, SLOT(socketClosed())); connect(_socket, SIGNAL(readyRead()), this, SLOT(readData())); + + for (int i = 0; i < forwardClientList.size(); ++i) { + std::cout << "Proto forward to " << forwardClientList.at(i).toLocal8Bit().constData() << std::endl; + ProtoConnection* p = new ProtoConnection("127.0.0.1:19445"); + p->setSkipReply(true); + _proxy_connections << p; + } + } ProtoClientConnection::~ProtoClientConnection() { delete _socket; + + while (!_proxy_connections.isEmpty()) + delete _proxy_connections.takeFirst(); } void ProtoClientConnection::readData() @@ -81,6 +92,10 @@ void ProtoClientConnection::socketClosed() void ProtoClientConnection::handleMessage(const proto::HyperionRequest & message) { + // forward messages + for (int i = 0; i < _proxy_connections.size(); ++i) + _proxy_connections.at(i)->sendMessage(message); + switch (message.command()) { case proto::HyperionRequest::COLOR: diff --git a/libsrc/protoserver/ProtoClientConnection.h b/libsrc/protoserver/ProtoClientConnection.h index ec7d2e1c..a0c1186e 100644 --- a/libsrc/protoserver/ProtoClientConnection.h +++ b/libsrc/protoserver/ProtoClientConnection.h @@ -6,12 +6,14 @@ // Qt includes #include #include +#include // Hyperion includes #include // proto includes #include "message.pb.h" +#include "protoserver/ProtoConnection.h" class ImageProcessor; @@ -28,7 +30,7 @@ public: /// @param socket The Socket object for this connection /// @param hyperion The Hyperion server /// - ProtoClientConnection(QTcpSocket * socket, Hyperion * hyperion); + ProtoClientConnection(QTcpSocket * socket, Hyperion * hyperion, QStringList forwardClientList); /// /// Destructor @@ -123,4 +125,8 @@ private: /// The buffer used for reading data from the socket QByteArray _receiveBuffer; + + /// Hyperion proto connection object for forwarding + QList _proxy_connections; + }; diff --git a/libsrc/protoserver/ProtoServer.cpp b/libsrc/protoserver/ProtoServer.cpp index a1afa30c..54d8611b 100644 --- a/libsrc/protoserver/ProtoServer.cpp +++ b/libsrc/protoserver/ProtoServer.cpp @@ -5,12 +5,15 @@ #include #include "ProtoClientConnection.h" -ProtoServer::ProtoServer(Hyperion *hyperion, uint16_t port) : +ProtoServer::ProtoServer(Hyperion *hyperion, uint16_t port, QStringList * forwardClientList) : QObject(), _hyperion(hyperion), _server(), _openConnections() { + for (int i = 0; i < forwardClientList->size(); ++i) + _forwardClients << forwardClientList->at(i); + if (!_server.listen(QHostAddress::Any, port)) { throw std::runtime_error("Proto server could not bind to port"); @@ -39,7 +42,7 @@ void ProtoServer::newConnection() if (socket != nullptr) { std::cout << "New proto connection" << std::endl; - ProtoClientConnection * connection = new ProtoClientConnection(socket, _hyperion); + ProtoClientConnection * connection = new ProtoClientConnection(socket, _hyperion, _forwardClients); _openConnections.insert(connection); // register slot for cleaning up after the connection closed diff --git a/src/hyperiond/hyperiond.cpp b/src/hyperiond/hyperiond.cpp index 032d44db..d96b345a 100644 --- a/src/hyperiond/hyperiond.cpp +++ b/src/hyperiond/hyperiond.cpp @@ -1,6 +1,7 @@ // C++ includes #include #include +#include // QT includes #include @@ -368,7 +369,18 @@ int main(int argc, char** argv) if (config.isMember("protoServer")) { const Json::Value & protoServerConfig = config["protoServer"]; - protoServer = new ProtoServer(&hyperion, protoServerConfig["port"].asUInt()); + QStringList forwardClientList; + + if ( ! protoServerConfig["forward"].isNull() && protoServerConfig["forward"].isArray() ) + { + for (const Json::Value& client : protoServerConfig["forward"]) + { + forwardClientList << client.asString().c_str(); + std::cout << client.asString() << std::endl; + } + } + + protoServer = new ProtoServer(&hyperion, protoServerConfig["port"].asUInt(), &forwardClientList ); std::cout << "Proto server created and started on port " << protoServer->getPort() << std::endl; } #endif