From 0ccb66476e2a3349a869ac206fa76d3e95c8355c Mon Sep 17 00:00:00 2001
From: orignal <i2porignal@yandex.ru>
Date: Tue, 25 Nov 2014 15:16:03 -0500
Subject: [PATCH] moved NTCP client code to Transports

---
 NTCPSession.cpp | 35 -----------------------------------
 NTCPSession.h   | 20 ++------------------
 Transports.cpp  | 30 +++++++++++++++++++++++++++++-
 Transports.h    |  3 +++
 4 files changed, 34 insertions(+), 54 deletions(-)

diff --git a/NTCPSession.cpp b/NTCPSession.cpp
index c64cfe8c..9689b292 100644
--- a/NTCPSession.cpp
+++ b/NTCPSession.cpp
@@ -658,40 +658,5 @@ namespace transport
 			m_Socket.close ();// invoke Terminate () from HandleReceive 
 		}	
 	}	
-		
-		
-	NTCPClient::NTCPClient (boost::asio::io_service& service, const boost::asio::ip::address& address, 
-		int port, std::shared_ptr<const i2p::data::RouterInfo> in_RouterInfo): 
-		NTCPSession (service, in_RouterInfo), m_Endpoint (address, port)	
-	{
-		Connect ();
-	}
-
-	void NTCPClient::Connect ()
-	{
-		LogPrint ("Connecting to ", m_Endpoint.address ().to_string (),":",  m_Endpoint.port ());
-		 GetSocket ().async_connect (m_Endpoint, boost::bind (&NTCPClient::HandleConnect,
-			this, boost::asio::placeholders::error));
-	}	
-
-	void NTCPClient::HandleConnect (const boost::system::error_code& ecode)
-	{
-		if (ecode)
-        {
-			LogPrint ("Connect error: ", ecode.message ());
-			if (ecode != boost::asio::error::operation_aborted)
-			{
-				i2p::data::netdb.SetUnreachable (GetRemoteIdentity ().GetIdentHash (), true);
-				Terminate ();
-			}
-		}
-		else
-		{
-			LogPrint ("Connected");
-			if (GetSocket ().local_endpoint ().protocol () == boost::asio::ip::tcp::v6()) // ipv6
-				context.UpdateNTCPV6Address (GetSocket ().local_endpoint ().address ());
-			ClientLogin ();
-		}	
-	}	
 }	
 }	
diff --git a/NTCPSession.h b/NTCPSession.h
index 6780c89c..b384cfb9 100644
--- a/NTCPSession.h
+++ b/NTCPSession.h
@@ -49,6 +49,7 @@ namespace transport
 
 			NTCPSession (boost::asio::io_service& service, std::shared_ptr<const i2p::data::RouterInfo> in_RemoteRouter = nullptr);
 			~NTCPSession ();
+			void Terminate ();
 
 			boost::asio::ip::tcp::socket& GetSocket () { return m_Socket; };
 			bool IsEstablished () const { return m_IsEstablished; };
@@ -62,8 +63,7 @@ namespace transport
 			
 		protected:
 
-			void Terminate ();
-			virtual void Connected ();
+			void Connected ();
 			void SendTimeSyncMessage ();
 			void SetIsEstablished (bool isEstablished) { m_IsEstablished = isEstablished; }
 			
@@ -127,22 +127,6 @@ namespace transport
 
 			size_t m_NumSentBytes, m_NumReceivedBytes;
 	};	
-
-	class NTCPClient: public NTCPSession
-	{
-		public:
-
-			NTCPClient (boost::asio::io_service& service, const boost::asio::ip::address& address, int port, std::shared_ptr<const i2p::data::RouterInfo> in_RouterInfo);
-
-		private:
-
-			void Connect ();
-			void HandleConnect (const boost::system::error_code& ecode);
-			
-		private:
-
-			boost::asio::ip::tcp::endpoint m_Endpoint;
-	};		
 }	
 }	
 
diff --git a/Transports.cpp b/Transports.cpp
index b0143b5b..907ed415 100644
--- a/Transports.cpp
+++ b/Transports.cpp
@@ -245,6 +245,33 @@ namespace transport
 		}	
 	}
 
+	void Transports::Connect (const boost::asio::ip::address& address, int port, NTCPSession * conn)
+	{
+		LogPrint ("Connecting to ", address ,":",  port);
+		conn->GetSocket ().async_connect (boost::asio::ip::tcp::endpoint (address, port), 
+			boost::bind (&Transports::HandleConnect, this, boost::asio::placeholders::error, conn));
+	}
+
+	void Transports::HandleConnect (const boost::system::error_code& ecode, NTCPSession * conn)
+	{
+		if (ecode)
+        {
+			LogPrint ("Connect error: ", ecode.message ());
+			if (ecode != boost::asio::error::operation_aborted)
+			{
+				i2p::data::netdb.SetUnreachable (conn->GetRemoteIdentity ().GetIdentHash (), true);
+				conn->Terminate ();
+			}
+		}
+		else
+		{
+			LogPrint ("Connected");
+			if (conn->GetSocket ().local_endpoint ().protocol () == boost::asio::ip::tcp::v6()) // ipv6
+				context.UpdateNTCPV6Address (conn->GetSocket ().local_endpoint ().address ());
+			conn->ClientLogin ();
+		}	
+	}	
+
 	NTCPSession * Transports::GetNextNTCPSession ()
 	{
 		for (auto session: m_NTCPSessions)
@@ -290,9 +317,10 @@ namespace transport
 					auto address = r->GetNTCPAddress (!context.SupportsV6 ()); 
 					if (address && !r->UsesIntroducer () && !r->IsUnreachable () && msg->GetLength () < NTCP_MAX_MESSAGE_SIZE)
 					{	
-						auto s = new NTCPClient (m_Service, address->host, address->port, r);
+						auto s = new NTCPSession (m_Service, r);
 						AddNTCPSession (s);
 						s->SendI2NPMessage (msg);
+						Connect (address->host, address->port, s);
 					}	
 					else
 					{	
diff --git a/Transports.h b/Transports.h
index 012e4836..8133e39f 100644
--- a/Transports.h
+++ b/Transports.h
@@ -82,6 +82,9 @@ namespace transport
 			void PostMessage (const i2p::data::IdentHash& ident, i2p::I2NPMessage * msg);
 			void PostCloseSession (std::shared_ptr<const i2p::data::RouterInfo> router);
 			
+			void Connect (const boost::asio::ip::address& address, int port, NTCPSession * conn);
+			void HandleConnect (const boost::system::error_code& ecode, NTCPSession * conn);
+
 			void DetectExternalIP ();
 			
 		private: