use TransportSession for sending messages

This commit is contained in:
orignal 2015-01-10 23:00:27 -05:00
parent 4d25634b66
commit d8942a3359
2 changed files with 23 additions and 20 deletions

View file

@ -6,6 +6,7 @@
#include <memory> #include <memory>
#include "Identity.h" #include "Identity.h"
#include "RouterInfo.h" #include "RouterInfo.h"
#include "I2NPProtocol.h"
namespace i2p namespace i2p
{ {
@ -64,6 +65,8 @@ namespace transport
std::shared_ptr<const i2p::data::RouterInfo> GetRemoteRouter () { return m_RemoteRouter; }; std::shared_ptr<const i2p::data::RouterInfo> GetRemoteRouter () { return m_RemoteRouter; };
const i2p::data::IdentityEx& GetRemoteIdentity () { return m_RemoteIdentity; }; const i2p::data::IdentityEx& GetRemoteIdentity () { return m_RemoteIdentity; };
virtual void SendI2NPMessage (I2NPMessage * msg) = 0;
protected: protected:
std::shared_ptr<const i2p::data::RouterInfo> m_RemoteRouter; std::shared_ptr<const i2p::data::RouterInfo> m_RemoteRouter;

View file

@ -285,27 +285,26 @@ namespace transport
void Transports::SendMessage (const i2p::data::IdentHash& ident, i2p::I2NPMessage * msg) void Transports::SendMessage (const i2p::data::IdentHash& ident, i2p::I2NPMessage * msg)
{ {
if (ident == i2p::context.GetRouterInfo ().GetIdentHash ()) m_Service.post (boost::bind (&Transports::PostMessage, this, ident, msg));
// we send it to ourself
i2p::HandleI2NPMessage (msg);
else
m_Service.post (boost::bind (&Transports::PostMessage, this, ident, msg));
} }
void Transports::PostMessage (const i2p::data::IdentHash& ident, i2p::I2NPMessage * msg) void Transports::PostMessage (const i2p::data::IdentHash& ident, i2p::I2NPMessage * msg)
{ {
auto session = FindNTCPSession (ident); if (ident == i2p::context.GetRouterInfo ().GetIdentHash ())
if (session) {
session->SendI2NPMessage (msg); // we send it to ourself
else i2p::HandleI2NPMessage (msg);
return;
}
std::shared_ptr<TransportSession> session = FindNTCPSession (ident);
if (!session)
{ {
auto r = netdb.FindRouter (ident); auto r = netdb.FindRouter (ident);
if (r) if (r)
{ {
auto ssuSession = m_SSUServer ? m_SSUServer->FindSession (r) : nullptr; if (m_SSUServer)
if (ssuSession) session = m_SSUServer->FindSession (r);
ssuSession->SendI2NPMessage (msg); if (!session)
else
{ {
// existing session not found. create new // existing session not found. create new
// try NTCP first if message size < 16K // try NTCP first if message size < 16K
@ -314,20 +313,19 @@ namespace transport
{ {
auto s = std::make_shared<NTCPSession> (m_Service, r); auto s = std::make_shared<NTCPSession> (m_Service, r);
AddNTCPSession (s); AddNTCPSession (s);
s->SendI2NPMessage (msg); session = s;
Connect (address->host, address->port, s); Connect (address->host, address->port, s);
} }
else else
{ {
// then SSU // then SSU
auto s = m_SSUServer ? m_SSUServer->GetSession (r) : nullptr; if (m_SSUServer)
if (s) session = m_SSUServer->GetSession (r);
s->SendI2NPMessage (msg); if (!session)
else
{ {
LogPrint ("No NTCP and SSU addresses available"); LogPrint ("No NTCP and SSU addresses available");
DeleteI2NPMessage (msg); DeleteI2NPMessage (msg);
} }
} }
} }
} }
@ -341,6 +339,8 @@ namespace transport
this, boost::asio::placeholders::error, resendTimer, ident, msg)); this, boost::asio::placeholders::error, resendTimer, ident, msg));
} }
} }
if (session)
session->SendI2NPMessage (msg);
} }
void Transports::HandleResendTimer (const boost::system::error_code& ecode, void Transports::HandleResendTimer (const boost::system::error_code& ecode,