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 ------------------------------------------------------