model: First set of major API changes and reorganizations

Main motive: change interface in Face class, resulting in need to change forwarding strategy interfaces

Refs #1005 (http://redmine.named-data.net/)
diff --git a/model/ndn-face.cc b/model/ndn-face.cc
index 625af55..b5f7c34 100644
--- a/model/ndn-face.cc
+++ b/model/ndn-face.cc
@@ -54,13 +54,6 @@
                    UintegerValue (0),
                    MakeUintegerAccessor (&Face::m_id),
                    MakeUintegerChecker<uint32_t> ())
-
-    .AddTraceSource ("NdnTx", "Transmitted packet trace",
-                     MakeTraceSourceAccessor (&Face::m_txTrace))
-    .AddTraceSource ("NdnRx", "Received packet trace",
-                     MakeTraceSourceAccessor (&Face::m_rxTrace))
-    .AddTraceSource ("NdnDrop", "Dropped packet trace",
-                     MakeTraceSourceAccessor (&Face::m_dropTrace))
     ;
   return tid;
 }
@@ -104,25 +97,59 @@
 }
 
 void
-Face::RegisterProtocolHandler (ProtocolHandler handler)
+Face::RegisterProtocolHandlers (const InterestHandler &interestHandler, const DataHandler &dataHandler)
 {
   NS_LOG_FUNCTION_NOARGS ();
 
-  m_protocolHandler = handler;
+  m_upstreamInterestHandler = interestHandler;
+  m_upstreamDataHandler = dataHandler;
+}
+
+void
+Face::UnRegisterProtocolHandlers ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+
+  m_upstreamInterestHandler = MakeNullCallback< void, const Ptr<Face>&, Ptr<Interest>, Ptr<Packet> > ();
+  m_upstreamDataHandler = MakeNullCallback< void, const Ptr<Face>&, Ptr<ContentObject>, Ptr<Packet> > ();
+}
+
+
+bool
+Face::SendInterest (Ptr<const Interest> interest, Ptr<const Packet> packet)
+{
+  NS_LOG_FUNCTION (this << interest << packet);
+
+  if (!IsUp ())
+    {
+      return false;
+    }
+
+  Ptr<Packet> copy = packet->Copy ();
+  copy->AddHeader (*interest);
+
+  return Send (copy);
+}
+
+bool
+Face::SendData (Ptr<const ContentObject> data, Ptr<const Packet> packet)
+{
+  NS_LOG_FUNCTION (this << data << packet);
+
+  if (!IsUp ())
+    {
+      return false;
+    }
+
+  Ptr<Packet> copy = packet->Copy ();
+  copy->AddHeader (*data);
+  
+  return Send (copy);
 }
 
 bool
 Face::Send (Ptr<Packet> packet)
 {
-  NS_LOG_FUNCTION (boost::cref (*this) << packet << packet->GetSize ());
-  NS_LOG_DEBUG (*packet);
-
-  if (!IsUp ())
-    {
-      m_dropTrace (packet);
-      return false;
-    }
-
   FwHopCountTag hopCount;
   bool tagExists = packet->RemovePacketTag (hopCount);
   if (tagExists)
@@ -131,23 +158,13 @@
       packet->AddPacketTag (hopCount);
     }
 
-  bool ok = SendImpl (packet);
-  if (ok)
-    {
-      m_txTrace (packet);
-      return true;
-    }
-  else
-    {
-      m_dropTrace (packet);
-      return false;
-    }
+  return true;
 }
 
 bool
-Face::Receive (const Ptr<const Packet> &packet)
+Face::Receive (Ptr<const Packet> p)
 {
-  NS_LOG_FUNCTION (boost::cref (*this) << packet << packet->GetSize ());
+  NS_LOG_FUNCTION (this << packet << packet->GetSize ());
 
   if (!IsUp ())
     {
@@ -155,9 +172,65 @@
       return false;
     }
 
-  m_rxTrace (packet);
-  m_protocolHandler (this, packet);
+  Ptr<Packet> packet = p->Copy (); // give upper layers a rw copy of the packet
+  try
+    {
+      HeaderHelper::Type type = HeaderHelper::GetNdnHeaderType (packet);
+      switch (type)
+        {
+        case HeaderHelper::INTEREST_NDNSIM:
+          {
+            Ptr<Interest> interest = Create<Interest> ();
+            packet->RemoveHeader (*header);
 
+            return ReceiveInterest (interest, packet/*payload*/);
+          }
+        case HeaderHelper::CONTENT_OBJECT_NDNSIM:
+          {
+            Ptr<ContentObject> data = Create<ContentObject> ();
+            packet->RemoveHeader (*header);
+
+            return ReceiveData (data, packet);
+          }
+        case HeaderHelper::INTEREST_CCNB:
+        case HeaderHelper::CONTENT_OBJECT_CCNB:
+          NS_FATAL_ERROR ("ccnb support is broken in this implementation");
+          return false;
+        }
+
+      // exception will be thrown if packet is not recognized
+    }
+  catch (UnknownHeaderException)
+    {
+      NS_ASSERT_MSG (false, "Unknown NDN header. Should not happen");
+      NS_LOG_ERROR ("Unknown NDN header. Should not happen");
+      return false;
+    }
+}
+
+bool
+Face::ReceiveInterest (Ptr<Interest> interest, Ptr<Packet> payload)
+{
+  if (!IsUp ())
+    {
+      // no tracing here. If we were off while receiving, we shouldn't even know that something was there
+      return false;
+    }
+
+  m_upstreamInterestHandler (this, interest, payload);
+  return true;
+}
+
+bool
+Face::ReceiveData (Ptr<ContentObject> data, Ptr<Packet> payload)
+{
+  if (!IsUp ())
+    {
+      // no tracing here. If we were off while receiving, we shouldn't even know that something was there
+      return false;
+    }
+
+  m_upstreamDataHandler (this, data, payload);
   return true;
 }
 
@@ -171,7 +244,6 @@
 uint16_t
 Face::GetMetric (void) const
 {
-  NS_LOG_FUNCTION_NOARGS ();
   return m_metric;
 }
 
@@ -181,20 +253,6 @@
  * (where the device may be down but face state is still up).
  */
 
-bool
-Face::IsUp (void) const
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  return m_ifup;
-}
-
-void
-Face::SetUp (bool up/* = true*/)
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  m_ifup = up;
-}
-
 void
 Face::SetFlags (uint32_t flags)
 {