CPeer::m_Clients is a list

pull/1/head
Tom Early 6 years ago
parent 811e950e91
commit c84965983a

@ -1,6 +1,9 @@
//
// cbmpeer.cpp
// xlxd
// Created by Jean-Luc Deltombe (LX3JL) on 10/12/2016.
// Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved.
// Copyright © 2020 Thomas A. Early, N7TAE
//
// ----------------------------------------------------------------------------
// This file is part of xlxd.
@ -38,7 +41,7 @@ CBmPeer::CBmPeer(const CCallsign &callsign, const CIp &ip, const char *modules,
: 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++ )
{
@ -52,17 +55,11 @@ CBmPeer::CBmPeer(const CCallsign &callsign, const CIp &ip, const char *modules,
CBmPeer::CBmPeer(const CBmPeer &peer)
: CPeer(peer)
{
for ( int i = 0; i < peer.m_Clients.size(); i++ )
for ( auto it=peer.cbegin(); it!=peer.cend(); it++ )
{
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
CBmClient *client = new CBmClient((const CBmClient &)*(*it));
m_Clients.push_back(client);
}
}
@ -88,4 +85,3 @@ int CBmPeer::GetProtocolRevision(const CVersion &version)
{
return XLX_PROTOCOL_REVISION_2;
}

@ -4,6 +4,7 @@
//
// Created by Antony Chazapis (SV9OAN) on 25/2/2018.
// Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved.
// Copyright © 2020 Thomas A. Early, N7TAE
//
// ----------------------------------------------------------------------------
// This file is part of xlxd.
@ -41,7 +42,7 @@ CDextraPeer::CDextraPeer(const CCallsign &callsign, const CIp &ip, const char *m
: CPeer(callsign, ip, modules, version)
{
std::cout << "Adding DExtra peer" << std::endl;
// and construct the DExtra clients
for ( int i = 0; i < ::strlen(modules); i++ )
{
@ -55,17 +56,11 @@ CDextraPeer::CDextraPeer(const CCallsign &callsign, const CIp &ip, const char *m
CDextraPeer::CDextraPeer(const CDextraPeer &peer)
: CPeer(peer)
{
for ( int i = 0; i < peer.m_Clients.size(); i++ )
for ( auto it=peer.cbegin(); it!=peer.cend(); it++ )
{
CDextraClient *client = new CDextraClient((const CDextraClient &)*(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
CDextraClient *client = new CDextraClient((const CDextraClient &)*(*it));
m_Clients.push_back(client);
}
}
@ -81,12 +76,12 @@ CDextraPeer::~CDextraPeer()
bool CDextraPeer::IsAlive(void) const
{
bool alive = true;
for ( int i = 0; (i < m_Clients.size()) && alive ; i++ )
for ( auto it=cbegin(); it!=cend(); it++ )
{
alive &= m_Clients[i]->IsAlive();
if (! (*it)->IsAlive())
return false;
}
return alive;
return true;
}
////////////////////////////////////////////////////////////////////////////////////////
@ -96,4 +91,3 @@ int CDextraPeer::GetProtocolRevision(const CVersion &version)
{
return version.GetMajor();
}

@ -352,9 +352,9 @@ void CDextraProtocol::HandleKeepalives(void)
CBuffer disconnect;
EncodeDisconnectPacket(&disconnect, peer->GetReflectorModules()[0]);
CClients *clients = g_Reflector.GetClients();
for ( int i = 0; i < peer->GetNbClients(); i++ )
for ( auto cit=peer->cbegin(); cit!=peer->cend(); cit++ )
{
m_Socket.Send(disconnect, peer->GetClient(i)->GetIp());
m_Socket.Send(disconnect, (*cit)->GetIp());
}
g_Reflector.ReleaseClients();

@ -4,6 +4,7 @@
//
// Created by Jean-Luc Deltombe (LX3JL) on 104/03/2017.
// Copyright © 2015 Jean-Luc Deltombe (LX3JL). All rights reserved.
// Copyright © 2020 Thomas A. Early, N7TAE
//
// ----------------------------------------------------------------------------
// This file is part of xlxd.

@ -4,6 +4,7 @@
//
// Created by Jean-Luc Deltombe (LX3JL) on 10/12/2016.
// Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved.
// Copyright © 2020 Thomas A. Early, N7TAE
//
// ----------------------------------------------------------------------------
// This file is part of xlxd.
@ -35,7 +36,6 @@
CPeer::CPeer()
{
::memset(m_ReflectorModules, 0, sizeof(m_ReflectorModules));
m_Clients.reserve(100);
m_ConnectTime = std::time(NULL);
m_LastHeardTime = std::time(NULL);
}
@ -68,9 +68,9 @@ CPeer::CPeer(const CPeer &peer)
CPeer::~CPeer()
{
for ( int i = 0; i < m_Clients.size(); i++ )
for ( auto it=begin(); it!=end(); it++ )
{
delete m_Clients[i];
delete *it;
}
m_Clients.clear();
}
@ -80,16 +80,26 @@ CPeer::~CPeer()
bool CPeer::operator ==(const CPeer &peer) const
{
bool same = true;
same &= (peer.m_Callsign == m_Callsign);
same &= (peer.m_Ip == m_Ip);
same &= (peer.m_Version == m_Version);
for ( int i = 0; (i < m_Clients.size()) && same ; i++ )
if (peer.m_Callsign != m_Callsign)
return false;
if (peer.m_Ip != m_Ip)
return false;
if (! (peer.m_Version == m_Version))
return false;
auto it1 = cbegin();
auto it2 = peer.cbegin();
while (true)
{
same &= (peer.m_Clients[i] == m_Clients[i]);
if (it1==cend() && it2==peer.cend())
break;
if (it1==cend() || it2==peer.cend())
return false;
if (*it1 != *it2)
return false;
it1++;
it2++;
}
return same;
return true;
}
@ -98,42 +108,23 @@ bool CPeer::operator ==(const CPeer &peer) const
bool CPeer::IsAMaster(void) const
{
bool master = false;
for ( int i = 0; (i < m_Clients.size()) && !master ; i++ )
for ( auto it=cbegin(); it!=cend(); it++ )
{
master |= m_Clients[i]->IsAMaster();
if ((*it)->IsAMaster())
return true;
}
return master;
return false;
}
void CPeer::Alive(void)
{
m_LastKeepaliveTime.Now();;
for ( int i = 0; i < m_Clients.size(); i++ )
for ( auto it=begin(); it!=end(); it++ )
{
m_Clients[i]->Alive();
}
}
////////////////////////////////////////////////////////////////////////////////////////
// manage clients
CClient *CPeer::GetClient(int i)
{
if ( (i >= 0) && (i < m_Clients.size()) )
{
return m_Clients[i];
}
else
{
return NULL;
(*it)->Alive();
}
}
////////////////////////////////////////////////////////////////////////////////////////
// reporting
////////////////////////////////////////////////////////////////////////////////////////
// reporting
@ -161,11 +152,11 @@ void CPeer::GetJsonObject(char *Buffer)
char sz[512];
char mbstr[100];
char cs[16];
if (std::strftime(mbstr, sizeof(mbstr), "%A %c", std::localtime(&m_LastHeardTime)))
{
m_Callsign.GetCallsignString(cs);
::sprintf(sz, "{\"callsign\":\"%s\",\"linkedto\":\"%s\",\"time\":\"%s\"}",
cs,
m_ReflectorModules,

@ -4,6 +4,7 @@
//
// Created by Jean-Luc Deltombe (LX3JL) on 10/12/2016.
// Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved.
// Copyright © 2020 Thomas A. Early, N7TAE
//
// ----------------------------------------------------------------------------
// This file is part of xlxd.
@ -44,52 +45,57 @@ public:
CPeer();
CPeer(const CCallsign &, const CIp &, const char *, const CVersion &);
CPeer(const CPeer &);
// destructor
virtual ~CPeer();
// operators
bool operator ==(const CPeer &) const;
// get
const CCallsign &GetCallsign(void) const { return m_Callsign; }
const CIp &GetIp(void) const { return m_Ip; }
char *GetReflectorModules(void) { return m_ReflectorModules; }
// set
// identity
virtual int GetProtocol(void) const { return PROTOCOL_NONE; }
virtual int GetProtocolRevision(void) const { return 0; }
virtual const char *GetProtocolName(void) const { return "none"; }
// status
virtual bool IsAMaster(void) const;
virtual void Alive(void);
virtual bool IsAlive(void) const { return false; }
virtual void Heard(void) { m_LastHeardTime = std::time(NULL); }
// clients access
int GetNbClients(void) const { return (int)m_Clients.size(); }
void ClearClients(void) { m_Clients.clear(); }
CClient *GetClient(int);
// pass-thru
std::list<CClient *>::iterator begin() { return m_Clients.begin(); }
std::list<CClient *>::iterator end() { return m_Clients.end(); }
std::list<CClient *>::const_iterator cbegin() const { return m_Clients.cbegin(); }
std::list<CClient *>::const_iterator cend() const { return m_Clients.cend(); }
// reporting
virtual void WriteXml(std::ofstream &);
virtual void GetJsonObject(char *);
protected:
// data
CCallsign m_Callsign;
CIp m_Ip;
char m_ReflectorModules[NB_MODULES_MAX+1];
CVersion m_Version;
std::vector<CClient *> m_Clients;
CCallsign m_Callsign;
CIp m_Ip;
char m_ReflectorModules[NB_MODULES_MAX+1];
CVersion m_Version;
std::list<CClient *> m_Clients;
// status
CTimePoint m_LastKeepaliveTime;
std::time_t m_ConnectTime;
std::time_t m_LastHeardTime;
CTimePoint m_LastKeepaliveTime;
std::time_t m_ConnectTime;
std::time_t m_LastHeardTime;
};
////////////////////////////////////////////////////////////////////////////////////////

@ -4,6 +4,7 @@
//
// Created by Jean-Luc Deltombe (LX3JL) on 10/12/2016.
// Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved.
// Copyright © 2020 Thomas A. Early, N7TAE
//
// ----------------------------------------------------------------------------
// This file is part of xlxd.
@ -48,7 +49,7 @@ CPeers::~CPeers()
delete m_Peers[i];
}
m_Peers.clear();
}
m_Mutex.unlock();
}
@ -73,7 +74,7 @@ void CPeers::AddPeer(CPeer *peer)
//std::cout << "Adding existing peer " << peer->GetCallsign() << " at " << peer->GetIp() << std::endl;
}
}
// if not, append to the vector
if ( !found )
{
@ -89,12 +90,12 @@ void CPeers::AddPeer(CPeer *peer)
// and append all peer's client to reflector client list
// it is double lock safe to lock Clients list after Peers list
CClients *clients = g_Reflector.GetClients();
for ( int i = 0; i < peer->GetNbClients(); i++ )
for ( auto cit=peer->cbegin(); cit!=peer->cend(); cit++ )
{
clients->AddClient(peer->GetClient(i));
clients->AddClient(*cit);
}
g_Reflector.ReleaseClients();
// notify
g_Reflector.OnPeersChanged();
}
@ -115,15 +116,15 @@ void CPeers::RemovePeer(CPeer *peer)
// remove all clients from reflector client list
// it is double lock safe to lock Clients list after Peers list
CClients *clients = g_Reflector.GetClients();
for ( int i = 0; i < peer->GetNbClients(); i++ )
for ( auto cit=peer->begin(); cit!=peer->end(); cit++ )
{
// this also delete the client object
clients->RemoveClient(peer->GetClient(i));
clients->RemoveClient(*cit);
}
// so clear it then
m_Peers[i]->ClearClients();
g_Reflector.ReleaseClients();
// remove it
std::cout << "Peer " << m_Peers[i]->GetCallsign() << " at " << m_Peers[i]->GetIp()
<< " removed" << std::endl;
@ -155,7 +156,7 @@ CPeer *CPeers::GetPeer(int i)
CPeer *CPeers::FindPeer(const CIp &Ip, int Protocol)
{
CPeer *peer = NULL;
// find peer
for ( int i = 0; (i < m_Peers.size()) && (peer == NULL); i++ )
{
@ -164,7 +165,7 @@ CPeer *CPeers::FindPeer(const CIp &Ip, int Protocol)
peer = m_Peers[i];
}
}
// done
return peer;
}
@ -172,7 +173,7 @@ CPeer *CPeers::FindPeer(const CIp &Ip, int Protocol)
CPeer *CPeers::FindPeer(const CCallsign &Callsign, const CIp &Ip, int Protocol)
{
CPeer *peer = NULL;
// find peer
for ( int i = 0; (i < m_Peers.size()) && (peer == NULL); i++ )
{
@ -183,7 +184,7 @@ CPeer *CPeers::FindPeer(const CCallsign &Callsign, const CIp &Ip, int Protocol)
peer = m_Peers[i];
}
}
// done
return peer;
}
@ -191,7 +192,7 @@ CPeer *CPeers::FindPeer(const CCallsign &Callsign, const CIp &Ip, int Protocol)
CPeer *CPeers::FindPeer(const CCallsign &Callsign, int Protocol)
{
CPeer *peer = NULL;
// find peer
for ( int i = 0; (i < m_Peers.size()) && (peer == NULL); i++ )
{
@ -201,7 +202,7 @@ CPeer *CPeers::FindPeer(const CCallsign &Callsign, int Protocol)
peer = m_Peers[i];
}
}
// done
return peer;
}
@ -213,7 +214,7 @@ CPeer *CPeers::FindPeer(const CCallsign &Callsign, int Protocol)
CPeer *CPeers::FindNextPeer(int Protocol, int *index)
{
CPeer *peer = NULL;
// find next peer
bool found = false;
for ( int i = *index+1; (i < m_Peers.size()) && !found; i++ )
@ -227,4 +228,3 @@ CPeer *CPeers::FindNextPeer(int Protocol, int *index)
}
return peer;
}

@ -4,6 +4,7 @@
//
// Created by Jean-Luc Deltombe (LX3JL) on 10/12/2016.
// Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved.
// Copyright © 2020 Thomas A. Early, N7TAE
//
// ----------------------------------------------------------------------------
// This file is part of xlxd.
@ -43,7 +44,7 @@ CXlxPeer::CXlxPeer(const CCallsign &callsign, const CIp &ip, const char *modules
// get protocol revision
int protrev = GetProtocolRevision(version);
//std::cout << "Adding XLX peer with protocol revision " << protrev << std::endl;
// and construct all xlx clients
for ( int i = 0; i < ::strlen(modules); i++ )
{
@ -57,17 +58,11 @@ CXlxPeer::CXlxPeer(const CCallsign &callsign, const CIp &ip, const char *modules
CXlxPeer::CXlxPeer(const CXlxPeer &peer)
: CPeer(peer)
{
for ( int i = 0; i < peer.m_Clients.size(); i++ )
for ( auto it=peer.cbegin(); it!=peer.cend(); it++ )
{
CXlxClient *client = new CXlxClient((const CXlxClient &)*(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
CXlxClient *client = new CXlxClient((const CXlxClient &)*(*it));
m_Clients.push_back(client);
}
}
@ -92,7 +87,7 @@ bool CXlxPeer::IsAlive(void) const
int CXlxPeer::GetProtocolRevision(const CVersion &version)
{
int protrev = XLX_PROTOCOL_REVISION_0;
if ( version.IsEqualOrHigherTo(CVersion(2,2,0)) )
{
protrev = XLX_PROTOCOL_REVISION_2;
@ -103,4 +98,3 @@ int CXlxPeer::GetProtocolRevision(const CVersion &version)
}
return protrev;
}

Loading…
Cancel
Save

Powered by TurnKey Linux.