diff --git a/src/cbmclient.cpp b/src/cbmclient.cpp new file mode 100644 index 0000000..8dc4b0c --- /dev/null +++ b/src/cbmclient.cpp @@ -0,0 +1,54 @@ +// +// cbmclient.cpp +// xlxd +// +// Created by Jean-Luc Deltombe (LX3JL) on 20/01/2017. +// Copyright © 2015 Jean-Luc Deltombe (LX3JL). All rights reserved. +// +// ---------------------------------------------------------------------------- +// This file is part of xlxd. +// +// xlxd is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// xlxd is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Foobar. If not, see . +// ---------------------------------------------------------------------------- + +#include +#include "main.h" +#include "cbmclient.h" + + +//////////////////////////////////////////////////////////////////////////////////////// +// constructors + +CBmClient::CBmClient() +{ +} + +CBmClient::CBmClient(const CCallsign &callsign, const CIp &ip, char reflectorModule) + : CClient(callsign, ip, reflectorModule) +{ +} + +CBmClient::CBmClient(const CBmClient &client) + : CClient(client) +{ +} + +//////////////////////////////////////////////////////////////////////////////////////// +// status + +bool CBmClient::IsAlive(void) const +{ + return (m_LastKeepaliveTime.DurationSinceNow() < XLX_KEEPALIVE_TIMEOUT); +} + diff --git a/src/cbmclient.h b/src/cbmclient.h new file mode 100644 index 0000000..fc47778 --- /dev/null +++ b/src/cbmclient.h @@ -0,0 +1,65 @@ +// +// cbmclient.h +// xlxd +// +// Created by Jean-Luc Deltombe (LX3JL) on 20/01/2017. +// Copyright © 2015 Jean-Luc Deltombe (LX3JL). All rights reserved. +// +// ---------------------------------------------------------------------------- +// This file is part of xlxd. +// +// xlxd is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// xlxd is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Foobar. If not, see . +// ---------------------------------------------------------------------------- + +#ifndef cbmclient_h +#define cbmclient_h + + +#include "cclient.h" +#include "cxlxclient.h" + +//////////////////////////////////////////////////////////////////////////////////////// +// define + + +//////////////////////////////////////////////////////////////////////////////////////// +// class + +class CBmClient : public CClient +{ +public: + // constructors + CBmClient(); + CBmClient(const CCallsign &, const CIp &, char = ' '); + CBmClient(const CBmClient &); + + // destructor + virtual ~CBmClient() {}; + + // identity + int GetProtocol(void) const { return PROTOCOL_XLX; } + int GetProtocolRevision(void) const { return XLX_PROTOCOL_REVISION_2; } + const char *GetProtocolName(void) const { return "XLX"; } + int GetCodec(void) const { return CODEC_AMBE2PLUS; } + bool IsPeer(void) const { return true; } + + // status + bool IsAlive(void) const; + + // reporting + void WriteXml(std::ofstream &) {} +}; + +//////////////////////////////////////////////////////////////////////////////////////// +#endif /* cbmclient_h */ diff --git a/src/cbmpeer.cpp b/src/cbmpeer.cpp new file mode 100644 index 0000000..36c38fb --- /dev/null +++ b/src/cbmpeer.cpp @@ -0,0 +1,91 @@ +// +// cbmpeer.cpp +// xlxd +// +// ---------------------------------------------------------------------------- +// This file is part of xlxd. +// +// xlxd is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// xlxd is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Foobar. If not, see . +// ---------------------------------------------------------------------------- + +#include "main.h" +#include +#include "creflector.h" +#include "cbmpeer.h" +#include "cbmclient.h" + + +//////////////////////////////////////////////////////////////////////////////////////// +// constructor + + +CBmPeer::CBmPeer() +{ +} + +CBmPeer::CBmPeer(const CCallsign &callsign, const CIp &ip, char *modules, const CVersion &version) +: CPeer(callsign, ip, modules, version) +{ + std::cout << "Adding BM peer" << std::endl; + + // and construct all xlx clients + for ( int i = 0; i < ::strlen(modules); i++ ) + { + // create + CBmClient *client = new CBmClient(callsign, ip, modules[i]); + // and append to vector + m_Clients.push_back(client); + } +} + +CBmPeer::CBmPeer(const CBmPeer &peer) +: CPeer(peer) +{ + for ( int i = 0; i < peer.m_Clients.size(); i++ ) + { + CBmClient *client = new CBmClient((const CBmClient &)*(peer.m_Clients[i])); + // grow vector capacity if needed + if ( m_Clients.capacity() == m_Clients.size() ) + { + m_Clients.reserve(m_Clients.capacity()+10); + } + // and append + m_Clients.push_back(client); + + } +} + +//////////////////////////////////////////////////////////////////////////////////////// +// destructors + +CBmPeer::~CBmPeer() +{ +} + +//////////////////////////////////////////////////////////////////////////////////////// +// status + +bool CBmPeer::IsAlive(void) const +{ + return (m_LastKeepaliveTime.DurationSinceNow() < XLX_KEEPALIVE_TIMEOUT); +} + +//////////////////////////////////////////////////////////////////////////////////////// +// revision helper + +int CBmPeer::GetProtocolRevision(const CVersion &version) +{ + return XLX_PROTOCOL_REVISION_2; +} + diff --git a/src/cbmpeer.h b/src/cbmpeer.h new file mode 100644 index 0000000..b92d238 --- /dev/null +++ b/src/cbmpeer.h @@ -0,0 +1,62 @@ +// +// cbmpeer.h +// xlxd +// +// Created by Jean-Luc Deltombe (LX3JL) on 20/01/2017. +// Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved. +// +// ---------------------------------------------------------------------------- +// This file is part of xlxd. +// +// xlxd is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// xlxd is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Foobar. If not, see . +// ---------------------------------------------------------------------------- + +#ifndef cbmpeer_h +#define cbmpeer_h + + +#include "cpeer.h" +#include "cbmclient.h" + +//////////////////////////////////////////////////////////////////////////////////////// +// define + + +//////////////////////////////////////////////////////////////////////////////////////// +// class + +class CBmPeer : public CPeer +{ +public: + // constructors + CBmPeer(); + CBmPeer(const CCallsign &, const CIp &, char *, const CVersion &); + CBmPeer(const CBmPeer &); + + // destructor + ~CBmPeer(); + + // status + bool IsAlive(void) const; + + // identity + int GetProtocol(void) const { return PROTOCOL_XLX; } + const char *GetProtocolName(void) const { return "XLX"; } + + // revision helper + static int GetProtocolRevision(const CVersion &); +}; + +//////////////////////////////////////////////////////////////////////////////////////// +#endif /* cbmpeer_h */ diff --git a/src/cxlxprotocol.cpp b/src/cxlxprotocol.cpp index 0a6dd7c..f01fb9a 100644 --- a/src/cxlxprotocol.cpp +++ b/src/cxlxprotocol.cpp @@ -25,6 +25,7 @@ #include "main.h" #include #include "cxlxpeer.h" +#include "cbmpeer.h" #include "cxlxprotocol.h" #include "creflector.h" #include "cgatekeeper.h" @@ -118,7 +119,7 @@ void CXlxProtocol::Task(void) { // acknowledge connecting request // following is version dependent - switch ( CXlxPeer::GetProtocolRevision(Version) ) + switch ( GetConnectingPeerProtocolRevision(Callsign, Version) ) { case XLX_PROTOCOL_REVISION_0: { @@ -163,7 +164,7 @@ void CXlxProtocol::Task(void) { // create the new peer // this also create one client per module - CXlxPeer *peer = new CXlxPeer(Callsign, Ip, Modules, Version); + CPeer *peer = CreateNewPeer(Callsign, Ip, Modules, Version); // append the peer to reflector peer list // this also add all new clients to reflector client list @@ -722,3 +723,44 @@ bool CXlxProtocol::EncodeDvLastFramePacket(const CDvLastFramePacket &Packet, CBu return true; } + +//////////////////////////////////////////////////////////////////////////////////////// +// protocol revision helper + +int CXlxProtocol::GetConnectingPeerProtocolRevision(const CCallsign &Callsign, const CVersion &Version) +{ + int protrev; + + // BM ? + if ( Callsign.HasSameCallsignWithWildcard(CCallsign("BM*")) ) + { + protrev = CBmPeer::GetProtocolRevision(Version); + } + // otherwise, assume native xlx + else + { + protrev = CXlxPeer::GetProtocolRevision(Version); + } + + // done + return protrev; +} + +CPeer *CXlxProtocol::CreateNewPeer(const CCallsign &Callsign, const CIp &Ip, char *Modules, const CVersion &Version) +{ + CPeer *peer = NULL; + + // BM ? + if ( Callsign.HasSameCallsignWithWildcard(CCallsign("BM*")) ) + { + peer = new CBmPeer(Callsign, Ip, Modules, Version); + } + else + { + peer = new CXlxPeer(Callsign, Ip, Modules, Version); + } + + // done + return peer; +} + diff --git a/src/cxlxprotocol.h b/src/cxlxprotocol.h index 1d23c50..1b8d8d9 100644 --- a/src/cxlxprotocol.h +++ b/src/cxlxprotocol.h @@ -32,6 +32,7 @@ //////////////////////////////////////////////////////////////////////////////////////// +class CPeer; //////////////////////////////////////////////////////////////////////////////////////// // class @@ -82,6 +83,10 @@ protected: bool EncodeDvFramePacket(const CDvFramePacket &, CBuffer *) const; bool EncodeDvLastFramePacket(const CDvLastFramePacket &, CBuffer *) const; + // protocol revision helper + int GetConnectingPeerProtocolRevision(const CCallsign &, const CVersion &); + CPeer *CreateNewPeer(const CCallsign &, const CIp &, char *, const CVersion &); + protected: // time CTimePoint m_LastKeepaliveTime; diff --git a/src/main.h b/src/main.h index ac77c96..fa7acab 100644 --- a/src/main.h +++ b/src/main.h @@ -49,7 +49,7 @@ #define VERSION_MAJOR 2 #define VERSION_MINOR 2 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 // global ------------------------------------------------------