diff --git a/src/blackmisc/network/clientlist.cpp b/src/blackmisc/network/clientlist.cpp index 8164e30ac..52e08f68c 100644 --- a/src/blackmisc/network/clientlist.cpp +++ b/src/blackmisc/network/clientlist.cpp @@ -9,6 +9,8 @@ #include "clientlist.h" +using namespace BlackMisc::Aviation; + namespace BlackMisc { namespace Network @@ -28,5 +30,15 @@ namespace BlackMisc if (this->isEmpty()) { return static_cast(CClient::None); } return this->findFirstByCallsign(callsign).getCapabilities(); } + + QMap CClientList::asMap() const + { + QMap map; + for (const CClient &client : *this) + { + map.insert(client.getCallsign(), client); + } + return map; + } } // namespace } // namespace diff --git a/src/blackmisc/network/clientlist.h b/src/blackmisc/network/clientlist.h index 4fa4960b3..005ac2cd4 100644 --- a/src/blackmisc/network/clientlist.h +++ b/src/blackmisc/network/clientlist.h @@ -18,6 +18,7 @@ #include "blackmisc/network/client.h" #include "blackmisc/sequence.h" #include "blackmisc/variant.h" +#include #include namespace BlackMisc @@ -44,6 +45,9 @@ namespace BlackMisc //! Capabilities of client for callsign CClient::Capabilities getCapabilities(const Aviation::CCallsign &callsign) const; + + //! As map + QMap asMap() const; }; } //namespace } // namespace diff --git a/src/blackmisc/network/clientprovider.cpp b/src/blackmisc/network/clientprovider.cpp index 9ac9ff722..e04cd9d95 100644 --- a/src/blackmisc/network/clientprovider.cpp +++ b/src/blackmisc/network/clientprovider.cpp @@ -18,14 +18,19 @@ namespace BlackMisc { CClientList CClientProvider::getClients() const { - QReadLocker l(&m_lockClient); - return m_clients; + QList clients; + { + QReadLocker l(&m_lockClient); + clients = m_clients.values(); + } + return CClientList(clients); } void CClientProvider::setClients(const CClientList &clients) { + const QMap map = clients.asMap(); QWriteLocker l(&m_lockClient); - m_clients = clients; + m_clients = map; } void CClientProvider::clearClients() @@ -41,20 +46,21 @@ namespace BlackMisc CClient CClientProvider::getClientOrDefaultForCallsign(const CCallsign &callsign) const { - const CClientList clients(this->getClients()); - return clients.findFirstByCallsign(callsign); + QReadLocker l(&m_lockClient); + return m_clients.value(callsign); } bool CClientProvider::setOtherClient(const CClient &client) { QWriteLocker l(&m_lockClient); - m_clients.replaceOrAddObjectByCallsign(client); + m_clients[client.getCallsign()] = client; return true; } bool CClientProvider::hasClientInfo(const CCallsign &callsign) const { - return this->getClients().containsCallsign(callsign); + QReadLocker l(&m_lockClient); + return m_clients.contains(callsign); } bool CClientProvider::addNewClient(const CClient &client) @@ -63,7 +69,7 @@ namespace BlackMisc Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "invalid callsign"); if (this->hasClientInfo(callsign)) { return false; } QWriteLocker l(&m_lockClient); - m_clients.push_back(client); + m_clients[callsign] = client; return true; } @@ -71,16 +77,18 @@ namespace BlackMisc { Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "Missing callsign"); int c = 0; - if (!this->hasClientInfo(callsign)) + if (this->hasClientInfo(callsign)) { - CClient client(callsign); - c = client.apply(vm).size(); - this->addNewClient(client); + QWriteLocker l(&m_lockClient); + CClient &client = m_clients[callsign]; + c = client.apply(vm, skipEqualValues).size(); } else { + CClient client(callsign); + c = client.apply(vm).size(); QWriteLocker l(&m_lockClient); - c = m_clients.applyIfCallsign(callsign, vm, skipEqualValues); + m_clients[callsign] = client; } return c; } @@ -88,7 +96,7 @@ namespace BlackMisc int CClientProvider::removeClient(const CCallsign &callsign) { QWriteLocker l(&m_lockClient); - return m_clients.removeByCallsign(callsign); + return m_clients.remove(callsign); } bool CClientProvider::autoAdjustCientGndCapability(const CAircraftSituation &situation) @@ -120,7 +128,7 @@ namespace BlackMisc client.removeCapability(CClient::FsdWithGroundFlag); } QWriteLocker l(&m_lockClient); - m_clients.replaceOrAddObjectByCallsign(client); + m_clients[callsign] = client; return true; } diff --git a/src/blackmisc/network/clientprovider.h b/src/blackmisc/network/clientprovider.h index 1e0fe3832..97978bf46 100644 --- a/src/blackmisc/network/clientprovider.h +++ b/src/blackmisc/network/clientprovider.h @@ -16,6 +16,7 @@ #include "blackmisc/aviation/callsignset.h" #include "blackmisc/provider.h" #include +#include namespace BlackMisc { @@ -101,7 +102,7 @@ namespace BlackMisc //! @} private: - CClientList m_clients; + QMap m_clients; mutable QReadWriteLock m_lockClient; //!< lock clients: m_clients };