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.
@ -52,15 +55,9 @@ 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.
@ -55,15 +56,9 @@ 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++ )
{
m_Clients[i]->Alive();
}
}
////////////////////////////////////////////////////////////////////////////////////////
// manage clients
CClient *CPeer::GetClient(int i)
for ( auto it=begin(); it!=end(); it++ )
{
if ( (i >= 0) && (i < m_Clients.size()) )
{
return m_Clients[i];
}
else
{
return NULL;
(*it)->Alive();
}
}
////////////////////////////////////////////////////////////////////////////////////////
// reporting
////////////////////////////////////////////////////////////////////////////////////////
// reporting

@ -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.
@ -72,7 +73,12 @@ public:
// 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 &);
@ -84,7 +90,7 @@ protected:
CIp m_Ip;
char m_ReflectorModules[NB_MODULES_MAX+1];
CVersion m_Version;
std::vector<CClient *> m_Clients;
std::list<CClient *> m_Clients;
// status
CTimePoint m_LastKeepaliveTime;

@ -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.
@ -89,9 +90,9 @@ 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();
@ -115,10 +116,10 @@ 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();
@ -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.
@ -57,15 +58,9 @@ 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);
}
@ -103,4 +98,3 @@ int CXlxPeer::GetProtocolRevision(const CVersion &version)
}
return protrev;
}

Loading…
Cancel
Save

Powered by TurnKey Linux.