From aaf386a0abd126a191f782fa18473159c1fc49ce Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 3 Sep 2014 16:49:48 -0400 Subject: [PATCH] GetRandomEstablishedSession --- SSU.cpp | 24 ++++++++++++++++++++++++ SSU.h | 4 ++++ 2 files changed, 28 insertions(+) diff --git a/SSU.cpp b/SSU.cpp index 1a3d938f..cab234af 100644 --- a/SSU.cpp +++ b/SSU.cpp @@ -1058,6 +1058,30 @@ namespace ssu } m_Sessions.clear (); } + + template + SSUSession * SSUServer::GetRandomSession (Filter filter) + { + std::vector filteredSessions; + for (auto s :m_Sessions) + if (filter (s.second)) filteredSessions.push_back (s.second); + if (filteredSessions.size () > 0) + { + auto ind = i2p::context.GetRandomNumberGenerator ().GenerateWord32 (0, filteredSessions.size ()-1); + return filteredSessions[ind]; + } + return nullptr; + } + + SSUSession * SSUServer::GetRandomEstablishedSession () + { + return GetRandomSession ( + [](SSUSession * session)->bool + { + return session->GetState () == eSessionStateEstablished; + } + ); + } } } diff --git a/SSU.h b/SSU.h index 5a72b4d0..30c61c86 100644 --- a/SSU.h +++ b/SSU.h @@ -147,6 +147,7 @@ namespace ssu SSUSession * GetSession (const i2p::data::RouterInfo * router, bool peerTest = false); SSUSession * FindSession (const i2p::data::RouterInfo * router); SSUSession * FindSession (const boost::asio::ip::udp::endpoint& e); + SSUSession * GetRandomEstablishedSession (); void DeleteSession (SSUSession * session); void DeleteAllSessions (); @@ -162,6 +163,9 @@ namespace ssu void Receive (); void HandleReceivedFrom (const boost::system::error_code& ecode, std::size_t bytes_transferred); + template + SSUSession * GetRandomSession (Filter filter); + private: bool m_IsRunning;