diff --git a/Destination.cpp b/Destination.cpp index 0fb86b93..4b5f6af4 100644 --- a/Destination.cpp +++ b/Destination.cpp @@ -281,7 +281,7 @@ namespace client return nullptr; } - void ClientDestination::AcceptStreams (const std::function& acceptor) + void ClientDestination::AcceptStreams (const i2p::stream::StreamingDestination::Acceptor& acceptor) { if (m_StreamingDestination) m_StreamingDestination->SetAcceptor (acceptor); diff --git a/Destination.h b/Destination.h index 744cd6a7..c804dea8 100644 --- a/Destination.h +++ b/Destination.h @@ -42,7 +42,7 @@ namespace client // streaming i2p::stream::StreamingDestination * GetStreamingDestination () const { return m_StreamingDestination; }; i2p::stream::Stream * CreateStream (const i2p::data::LeaseSet& remote, int port = 0); - void AcceptStreams (const std::function& acceptor); + void AcceptStreams (const i2p::stream::StreamingDestination::Acceptor& acceptor); void StopAcceptingStreams (); bool IsAcceptingStreams () const; diff --git a/Streaming.h b/Streaming.h index 1c8958b2..82a01b30 100644 --- a/Streaming.h +++ b/Streaming.h @@ -153,6 +153,8 @@ namespace stream { public: + typedef std::function Acceptor; + StreamingDestination (i2p::client::ClientDestination& owner): m_Owner (owner) {}; ~StreamingDestination () {}; @@ -161,7 +163,7 @@ namespace stream Stream * CreateNewOutgoingStream (const i2p::data::LeaseSet& remote, int port = 0); void DeleteStream (Stream * stream); - void SetAcceptor (const std::function& acceptor) { m_Acceptor = acceptor; }; + void SetAcceptor (const Acceptor& acceptor) { m_Acceptor = acceptor; }; void ResetAcceptor () { m_Acceptor = nullptr; }; bool IsAcceptorSet () const { return m_Acceptor != nullptr; }; i2p::client::ClientDestination& GetOwner () { return m_Owner; }; @@ -178,7 +180,7 @@ namespace stream i2p::client::ClientDestination& m_Owner; std::mutex m_StreamsMutex; std::map m_Streams; - std::function m_Acceptor; + Acceptor m_Acceptor; public: diff --git a/api/api.cpp b/api/api.cpp index 8bf819db..f4766722 100644 --- a/api/api.cpp +++ b/api/api.cpp @@ -14,11 +14,9 @@ namespace i2p { namespace api { - static std::map g_Destinations; - - void InitI2P (int argc, char* argv[]) + void InitI2P (int argc, char* argv[], const char * appName) { - i2p::util::filesystem::SetAppName ("i2papi"); + i2p::util::filesystem::SetAppName (appName); i2p::util::config::OptionParser(argc, argv); i2p::context.Init (); } @@ -43,29 +41,19 @@ namespace api LogPrint("Transports stoped"); i2p::data::netdb.Stop(); LogPrint("NetDB stoped"); - for (auto it: g_Destinations) - { - it.second->Stop (); - delete it.second; - } - g_Destinations.clear (); - LogPrint("Local destinations deleted"); - StopLog (); } - i2p::client::ClientDestination * CreateLocalDestination (const i2p::data::PrivateKeys& keys) + i2p::client::ClientDestination * CreateLocalDestination (const i2p::data::PrivateKeys& keys, bool isPublic) { - auto localDestination = new i2p::client::ClientDestination (keys, true); // public - g_Destinations[localDestination->GetIdentHash ()] = localDestination; + auto localDestination = new i2p::client::ClientDestination (keys, isPublic); localDestination->Start (); return localDestination; } - i2p::client::ClientDestination * CreateLocalDestination (i2p::data::SigningKeyType sigType) + i2p::client::ClientDestination * CreateLocalDestination (bool isPublic, i2p::data::SigningKeyType sigType) { - auto localDestination = new i2p::client::ClientDestination (true, sigType); // public - g_Destinations[localDestination->GetIdentHash ()] = localDestination; + auto localDestination = new i2p::client::ClientDestination (isPublic, sigType); localDestination->Start (); return localDestination; } @@ -75,10 +63,46 @@ namespace api if (dest) { dest->Stop (); - g_Destinations.erase (dest->GetIdentHash ()); delete dest; } } + + void RequestLeaseSet (i2p::client::ClientDestination * dest, const i2p::data::IdentHash& remote) + { + if (dest) + i2p::data::netdb.RequestDestination (remote, true, dest->GetTunnelPool ()); + } + + i2p::stream::Stream * CreateStream (i2p::client::ClientDestination * dest, const i2p::data::IdentHash& remote) + { + auto leaseSet = i2p::data::netdb.FindLeaseSet (remote); + if (leaseSet) + { + auto stream = dest->CreateStream (*leaseSet); + stream->Send (nullptr, 0); // connect + return stream; + } + else + { + RequestLeaseSet (dest, remote); + return nullptr; + } + } + + void AcceptStream (i2p::client::ClientDestination * dest, const i2p::stream::StreamingDestination::Acceptor& acceptor) + { + if (dest) + dest->AcceptStreams (acceptor); + } + + void DestroyStream (i2p::stream::Stream * stream) + { + if (stream) + { + stream->Close (); + i2p::stream::DeleteStream (stream); + } + } } } diff --git a/api/api.h b/api/api.h index 6e763338..2fea8627 100644 --- a/api/api.h +++ b/api/api.h @@ -2,18 +2,28 @@ #define API_H__ #include "Identity.h" +#include "Destination.h" +#include "Streaming.h" namespace i2p { namespace api { - void InitI2P (int argc, char* argv[]); + // initialization start and stop + void InitI2P (int argc, char* argv[], const char * appName); void StartI2P (); void StopI2P (); - i2p::client::ClientDestination * CreateLocalDestination (const i2p::data::PrivateKeys& keys); - i2p::client::ClientDestination * CreateLocalDestination (i2p::data::SigningKeyType sigType = i2p::data::SIGNING_KEY_TYPE_DSA_SHA1); + // destinations + i2p::client::ClientDestination * CreateLocalDestination (const i2p::data::PrivateKeys& keys, bool isPublic = true); + i2p::client::ClientDestination * CreateLocalDestination (bool isPublic = false, i2p::data::SigningKeyType sigType = i2p::data::SIGNING_KEY_TYPE_DSA_SHA1); // transient destinations usually not published void DestoroyLocalDestination (i2p::client::ClientDestination * dest); + + // streams + void RequestLeaseSet (i2p::client::ClientDestination * dest, const i2p::data::IdentHash& remote); + i2p::stream::Stream * CreateStream (i2p::client::ClientDestination * dest, const i2p::data::IdentHash& remote); + void AcceptStream (i2p::client::ClientDestination * dest, const i2p::stream::StreamingDestination::Acceptor& acceptor); + void DestroyStream (i2p::stream::Stream * stream); } }