plugins/ip-faces: Updating TcpFace implementation

In addition to changes to follow latest API changes in ndnSIM, the
helper ndn::IpFacesHelper allows scheduling TcpFace creation at specific
point of simulation.

Refs #1006 (http://redmine.named-data.net/)
diff --git a/plugins/ip-faces/ndn-tcp-face.cc b/plugins/ip-faces/ndn-tcp-face.cc
index 4ef8908..68a7d08 100644
--- a/plugins/ip-faces/ndn-tcp-face.cc
+++ b/plugins/ip-faces/ndn-tcp-face.cc
@@ -110,6 +110,8 @@
 
 NS_OBJECT_ENSURE_REGISTERED (TcpFace);
 
+const Callback< void, Ptr<Face> > TcpFace::NULL_CREATE_CALLBACK = MakeNullCallback< void, Ptr<Face> > ();
+
 TypeId
 TcpFace::GetTypeId ()
 {
@@ -144,19 +146,31 @@
 }
 
 void
-TcpFace::RegisterProtocolHandler (ProtocolHandler handler)
+TcpFace::RegisterProtocolHandlers (const InterestHandler &interestHandler, const DataHandler &dataHandler)
 {
   NS_LOG_FUNCTION (this);
 
-  Face::RegisterProtocolHandler (handler);
-
+  Face::RegisterProtocolHandlers (interestHandler, dataHandler);
   m_socket->SetRecvCallback (MakeCallback (&TcpFace::ReceiveFromTcp, this));
 }
 
-bool
-TcpFace::SendImpl (Ptr<Packet> packet)
+void
+TcpFace:: UnRegisterProtocolHandlers ()
 {
+  m_socket->SetRecvCallback (MakeNullCallback< void, Ptr<Socket> > ());
+  Face::UnRegisterProtocolHandlers ();
+}
+
+bool
+TcpFace::Send (Ptr<Packet> packet)
+{
+  if (!Face::Send (packet))
+    {
+      return false;
+    }
+  
   NS_LOG_FUNCTION (this << packet);
+
   Ptr<Packet> boundary = Create<Packet> ();
   TcpBoundaryHeader hdr (packet);
   boundary->AddHeader (hdr);
@@ -247,7 +261,7 @@
 }
 
 Ptr<TcpFace>
-TcpFace::CreateOrGetFace (Ptr<Node> node, Ipv4Address address)
+TcpFace::CreateOrGetFace (Ptr<Node> node, Ipv4Address address, Callback< void, Ptr<Face> > onCreate)
 {
   NS_LOG_FUNCTION (address);
 
@@ -257,6 +271,8 @@
   
   Ptr<Socket> socket = Socket::CreateSocket (node, TcpSocketFactory::GetTypeId ());
   Ptr<TcpFace> face = CreateObject<TcpFace> (node, socket, address);
+
+  face->SetCreateCallback (onCreate);
   
   socket->SetConnectCallback (MakeCallback (&TcpFace::OnConnect, face),
                               MakeNullCallback< void, Ptr< Socket > > ());
@@ -268,6 +284,12 @@
 }
 
 void
+TcpFace::SetCreateCallback (Callback< void, Ptr<Face> > callback)
+{
+  m_onCreateCallback = callback;
+}
+
+void
 TcpFace::OnConnect (Ptr<Socket> socket)
 {
   NS_LOG_FUNCTION (this << socket);
@@ -279,6 +301,12 @@
 
   socket->SetCloseCallbacks (MakeCallback (&TcpFace::OnTcpConnectionClosed, this),
                              MakeCallback (&TcpFace::OnTcpConnectionClosed, this));
+
+  if (!m_onCreateCallback.IsNull ())
+    {
+      m_onCreateCallback (this);
+      m_onCreateCallback = NULL_CREATE_CALLBACK;
+    }
 }
     
 std::ostream&