mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 21:37:17 +01:00
add ClientDestination::Ready
This commit is contained in:
parent
c0cba7b376
commit
ac88c1a8f1
|
@ -168,7 +168,7 @@ namespace client
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<const i2p::data::LeaseSet> LeaseSetDestination::FindLeaseSet (const i2p::data::IdentHash& ident)
|
std::shared_ptr<const i2p::data::LeaseSet> LeaseSetDestination::FindLeaseSet (const i2p::data::IdentHash& ident)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(m_RemoteLeaseSetsMutex);
|
std::lock_guard<std::mutex> lock(m_RemoteLeaseSetsMutex);
|
||||||
|
@ -665,7 +665,8 @@ namespace client
|
||||||
|
|
||||||
ClientDestination::ClientDestination (const i2p::data::PrivateKeys& keys, bool isPublic, const std::map<std::string, std::string> * params):
|
ClientDestination::ClientDestination (const i2p::data::PrivateKeys& keys, bool isPublic, const std::map<std::string, std::string> * params):
|
||||||
LeaseSetDestination (isPublic, params),
|
LeaseSetDestination (isPublic, params),
|
||||||
m_Keys (keys), m_DatagramDestination (nullptr)
|
m_Keys (keys), m_DatagramDestination (nullptr),
|
||||||
|
m_ReadyChecker(GetService())
|
||||||
{
|
{
|
||||||
if (isPublic)
|
if (isPublic)
|
||||||
PersistTemporaryKeys ();
|
PersistTemporaryKeys ();
|
||||||
|
@ -697,6 +698,7 @@ namespace client
|
||||||
{
|
{
|
||||||
if (LeaseSetDestination::Stop ())
|
if (LeaseSetDestination::Stop ())
|
||||||
{
|
{
|
||||||
|
m_ReadyChecker.cancel();
|
||||||
m_StreamingDestination->Stop ();
|
m_StreamingDestination->Stop ();
|
||||||
m_StreamingDestination = nullptr;
|
m_StreamingDestination = nullptr;
|
||||||
for (auto& it: m_StreamingDestinationsByPorts)
|
for (auto& it: m_StreamingDestinationsByPorts)
|
||||||
|
@ -710,6 +712,30 @@ namespace client
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClientDestination::Ready(ReadyPromise & p)
|
||||||
|
{
|
||||||
|
ScheduleCheckForReady(&p);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientDestination::ScheduleCheckForReady(ReadyPromise * p)
|
||||||
|
{
|
||||||
|
// tick every 100ms
|
||||||
|
m_ReadyChecker.expires_from_now(boost::posix_time::milliseconds(100));
|
||||||
|
m_ReadyChecker.async_wait([&, p] (const boost::system::error_code & ecode) {
|
||||||
|
HandleCheckForReady(ecode, p);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientDestination::HandleCheckForReady(const boost::system::error_code & ecode, ReadyPromise * p)
|
||||||
|
{
|
||||||
|
if(ecode) // error happened
|
||||||
|
p->set_value(nullptr);
|
||||||
|
else if(IsReady()) // we are ready
|
||||||
|
p->set_value(std::shared_ptr<ClientDestination>(this));
|
||||||
|
else // we are not ready
|
||||||
|
ScheduleCheckForReady(p);
|
||||||
|
}
|
||||||
|
|
||||||
void ClientDestination::HandleDataMessage (const uint8_t * buf, size_t len)
|
void ClientDestination::HandleDataMessage (const uint8_t * buf, size_t len)
|
||||||
{
|
{
|
||||||
uint32_t length = bufbe32toh (buf);
|
uint32_t length = bufbe32toh (buf);
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
#include <future>
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
#include "Identity.h"
|
#include "Identity.h"
|
||||||
#include "TunnelPool.h"
|
#include "TunnelPool.h"
|
||||||
|
@ -143,13 +144,19 @@ namespace client
|
||||||
class ClientDestination: public LeaseSetDestination
|
class ClientDestination: public LeaseSetDestination
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
// type for informing that a client destination is ready
|
||||||
|
typedef std::promise<std::shared_ptr<ClientDestination> > ReadyPromise;
|
||||||
|
|
||||||
ClientDestination (const i2p::data::PrivateKeys& keys, bool isPublic, const std::map<std::string, std::string> * params = nullptr);
|
ClientDestination (const i2p::data::PrivateKeys& keys, bool isPublic, const std::map<std::string, std::string> * params = nullptr);
|
||||||
~ClientDestination ();
|
~ClientDestination ();
|
||||||
|
|
||||||
bool Start ();
|
bool Start ();
|
||||||
bool Stop ();
|
bool Stop ();
|
||||||
|
|
||||||
|
// informs promise with shared_from_this() when this destination is ready to use
|
||||||
|
// if cancelled before ready, informs promise with nullptr
|
||||||
|
void Ready(ReadyPromise & p);
|
||||||
|
|
||||||
const i2p::data::PrivateKeys& GetPrivateKeys () const { return m_Keys; };
|
const i2p::data::PrivateKeys& GetPrivateKeys () const { return m_Keys; };
|
||||||
void Sign (const uint8_t * buf, int len, uint8_t * signature) const { m_Keys.Sign (buf, len, signature); };
|
void Sign (const uint8_t * buf, int len, uint8_t * signature) const { m_Keys.Sign (buf, len, signature); };
|
||||||
|
|
||||||
|
@ -183,6 +190,9 @@ namespace client
|
||||||
{ return std::static_pointer_cast<ClientDestination>(shared_from_this ()); }
|
{ return std::static_pointer_cast<ClientDestination>(shared_from_this ()); }
|
||||||
void PersistTemporaryKeys ();
|
void PersistTemporaryKeys ();
|
||||||
|
|
||||||
|
void ScheduleCheckForReady(ReadyPromise * p);
|
||||||
|
void HandleCheckForReady(const boost::system::error_code & ecode, ReadyPromise * p);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
i2p::data::PrivateKeys m_Keys;
|
i2p::data::PrivateKeys m_Keys;
|
||||||
|
@ -192,6 +202,8 @@ namespace client
|
||||||
std::map<uint16_t, std::shared_ptr<i2p::stream::StreamingDestination> > m_StreamingDestinationsByPorts;
|
std::map<uint16_t, std::shared_ptr<i2p::stream::StreamingDestination> > m_StreamingDestinationsByPorts;
|
||||||
i2p::datagram::DatagramDestination * m_DatagramDestination;
|
i2p::datagram::DatagramDestination * m_DatagramDestination;
|
||||||
|
|
||||||
|
boost::asio::deadline_timer m_ReadyChecker;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// for HTTP only
|
// for HTTP only
|
||||||
|
|
Loading…
Reference in a new issue