2016-02-16 14:59:31 +01:00
// STL includes
2016-02-16 15:56:20 +01:00
# include <stdexcept>
2016-02-16 14:59:31 +01:00
2016-02-15 18:25:18 +01:00
# include <hyperion/MessageForwarder.h>
2018-12-27 23:11:32 +01:00
# include <utils/Logger.h>
# include <hyperion/Hyperion.h>
2016-02-15 18:25:18 +01:00
2018-12-27 23:11:32 +01:00
MessageForwarder : : MessageForwarder ( Hyperion * hyperion , const QJsonDocument & config )
: QObject ( )
, _hyperion ( hyperion )
, _log ( Logger : : getInstance ( " NETFORWARDER " ) )
2016-02-15 18:25:18 +01:00
{
2018-12-27 23:11:32 +01:00
handleSettingsUpdate ( settings : : NETFORWARD , config ) ;
// get settings updates
connect ( _hyperion , & Hyperion : : settingsChanged , this , & MessageForwarder : : handleSettingsUpdate ) ;
2016-02-15 18:25:18 +01:00
}
MessageForwarder : : ~ MessageForwarder ( )
{
}
2018-12-27 23:11:32 +01:00
void MessageForwarder : : handleSettingsUpdate ( const settings : : type & type , const QJsonDocument & config )
{
if ( type = = settings : : NETFORWARD )
{
// clear the current targets
_jsonSlaves . clear ( ) ;
_protoSlaves . clear ( ) ;
// build new one
const QJsonObject & obj = config . object ( ) ;
if ( ! obj [ " json " ] . isNull ( ) )
{
const QJsonArray & addr = obj [ " json " ] . toArray ( ) ;
for ( const auto & entry : addr )
{
addJsonSlave ( entry . toString ( ) ) ;
}
}
if ( ! obj [ " proto " ] . isNull ( ) )
{
const QJsonArray & addr = obj [ " proto " ] . toArray ( ) ;
for ( const auto & entry : addr )
{
addProtoSlave ( entry . toString ( ) ) ;
}
}
InfoIf ( obj [ " enable " ] . toBool ( true ) , _log , " Forward now to json targets '%s' and proto targets '%s' " , QSTRING_CSTR ( _jsonSlaves . join ( " , " ) ) , QSTRING_CSTR ( _protoSlaves . join ( " , " ) ) )
// update comp state
_hyperion - > getComponentRegister ( ) . componentStateChanged ( hyperion : : COMP_FORWARDER , obj [ " enable " ] . toBool ( true ) ) ;
}
}
2016-02-15 18:25:18 +01:00
2017-03-04 22:17:42 +01:00
void MessageForwarder : : addJsonSlave ( QString slave )
2016-02-15 18:25:18 +01:00
{
2017-03-04 22:17:42 +01:00
QStringList parts = slave . split ( " : " ) ;
2016-02-15 20:53:03 +01:00
if ( parts . size ( ) ! = 2 )
2018-12-27 23:11:32 +01:00
{
Error ( _log , " Unable to parse address (%s) " , QSTRING_CSTR ( slave ) ) ;
return ;
}
2016-02-15 20:53:03 +01:00
bool ok ;
2018-12-27 23:11:32 +01:00
parts [ 1 ] . toUShort ( & ok ) ;
2016-02-15 20:53:03 +01:00
if ( ! ok )
2018-12-27 23:11:32 +01:00
{
Error ( _log , " Unable to parse port number (%s) " , QSTRING_CSTR ( parts [ 1 ] ) ) ;
return ;
}
// verify loop with jsonserver
const QJsonObject & obj = _hyperion - > getSetting ( settings : : JSONSERVER ) . object ( ) ;
if ( QHostAddress ( parts [ 0 ] ) = = QHostAddress : : LocalHost & & parts [ 1 ] . toInt ( ) = = obj [ " port " ] . toInt ( ) )
{
Error ( _log , " Loop between JsonServer and Forwarder! (%s) " , QSTRING_CSTR ( slave ) ) ;
return ;
}
2016-02-15 20:53:03 +01:00
2018-12-27 23:11:32 +01:00
_jsonSlaves < < slave ;
2016-02-15 18:25:18 +01:00
}
2017-03-04 22:17:42 +01:00
void MessageForwarder : : addProtoSlave ( QString slave )
2016-02-15 18:25:18 +01:00
{
2018-12-27 23:11:32 +01:00
QStringList parts = slave . split ( " : " ) ;
if ( parts . size ( ) ! = 2 )
{
Error ( _log , " Unable to parse address (%s) " , QSTRING_CSTR ( slave ) ) ;
return ;
}
2016-02-15 18:25:18 +01:00
2018-12-27 23:11:32 +01:00
bool ok ;
parts [ 1 ] . toUShort ( & ok ) ;
if ( ! ok )
{
Error ( _log , " Unable to parse port number (%s) " , QSTRING_CSTR ( parts [ 1 ] ) ) ;
return ;
}
2016-02-15 20:53:03 +01:00
2018-12-27 23:11:32 +01:00
// verify loop with protoserver
2018-12-30 22:07:53 +01:00
const QJsonObject & obj = _hyperion - > getSetting ( settings : : FLATBUFSERVER ) . object ( ) ;
2018-12-27 23:11:32 +01:00
if ( QHostAddress ( parts [ 0 ] ) = = QHostAddress : : LocalHost & & parts [ 1 ] . toInt ( ) = = obj [ " port " ] . toInt ( ) )
{
Error ( _log , " Loop between ProtoServer and Forwarder! (%s) " , QSTRING_CSTR ( slave ) ) ;
return ;
}
_protoSlaves < < slave ;
2016-02-15 20:53:03 +01:00
}
2016-02-19 13:31:08 +01:00
bool MessageForwarder : : protoForwardingEnabled ( )
{
return ! _protoSlaves . empty ( ) ;
}
2016-09-07 20:10:37 +02:00
bool MessageForwarder : : jsonForwardingEnabled ( )
{
return ! _jsonSlaves . empty ( ) ;
}