From c84965983a2c7f7a58cf61bb7d7412259b6c4d72 Mon Sep 17 00:00:00 2001 From: Tom Early Date: Fri, 3 Jul 2020 11:54:00 -0700 Subject: [PATCH] CPeer::m_Clients is a list --- src/cbmpeer.cpp | 18 ++++------- src/cdextrapeer.cpp | 24 ++++++-------- src/cdextraprotocol.cpp | 4 +-- src/cdmrmmdvmprotocol.cpp | 1 + src/cpeer.cpp | 67 +++++++++++++++++---------------------- src/cpeer.h | 44 ++++++++++++++----------- src/cpeers.cpp | 32 +++++++++---------- src/cxlxpeer.cpp | 18 ++++------- 8 files changed, 95 insertions(+), 113 deletions(-) diff --git a/src/cbmpeer.cpp b/src/cbmpeer.cpp index cef9661..2e8c86d 100644 --- a/src/cbmpeer.cpp +++ b/src/cbmpeer.cpp @@ -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; } - diff --git a/src/cdextrapeer.cpp b/src/cdextrapeer.cpp index e6a13e6..0e9c0df 100644 --- a/src/cdextrapeer.cpp +++ b/src/cdextrapeer.cpp @@ -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(); } - diff --git a/src/cdextraprotocol.cpp b/src/cdextraprotocol.cpp index 9f96f28..7a400fe 100644 --- a/src/cdextraprotocol.cpp +++ b/src/cdextraprotocol.cpp @@ -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(); diff --git a/src/cdmrmmdvmprotocol.cpp b/src/cdmrmmdvmprotocol.cpp index 24d0aa8..41468b3 100644 --- a/src/cdmrmmdvmprotocol.cpp +++ b/src/cdmrmmdvmprotocol.cpp @@ -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. diff --git a/src/cpeer.cpp b/src/cpeer.cpp index 96f9c9a..65d0b69 100644 --- a/src/cpeer.cpp +++ b/src/cpeer.cpp @@ -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, diff --git a/src/cpeer.h b/src/cpeer.h index dc1a7b9..ec03451 100644 --- a/src/cpeer.h +++ b/src/cpeer.h @@ -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::iterator begin() { return m_Clients.begin(); } + std::list::iterator end() { return m_Clients.end(); } + std::list::const_iterator cbegin() const { return m_Clients.cbegin(); } + std::list::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 m_Clients; - + CCallsign m_Callsign; + CIp m_Ip; + char m_ReflectorModules[NB_MODULES_MAX+1]; + CVersion m_Version; + std::list 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; }; //////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/cpeers.cpp b/src/cpeers.cpp index 0a83cdb..be7e9eb 100644 --- a/src/cpeers.cpp +++ b/src/cpeers.cpp @@ -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; } - diff --git a/src/cxlxpeer.cpp b/src/cxlxpeer.cpp index 264d1f6..8527ec4 100644 --- a/src/cxlxpeer.cpp +++ b/src/cxlxpeer.cpp @@ -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; } -