src/common/packet.cc
changeset 2660 1d54065d728a
parent 2647 3e9474e1d77b
child 2663 dc5314da50aa
--- a/src/common/packet.cc	Wed Mar 19 12:36:09 2008 -0700
+++ b/src/common/packet.cc	Wed Mar 19 12:36:27 2008 -0700
@@ -186,7 +186,58 @@
 void 
 Packet::Print (std::ostream &os) const
 {
-  //XXX
+  PacketMetadata::ItemIterator i = m_metadata.BeginItem (m_buffer);
+  while (i.HasNext ())
+    {
+      PacketMetadata::Item item = i.Next ();
+      if (item.isFragment)
+        {
+          switch (item.type) {
+          case PacketMetadata::Item::PAYLOAD:
+            os << "Payload";
+            break;
+          case PacketMetadata::Item::HEADER:
+          case PacketMetadata::Item::TRAILER:
+            os << item.tid.GetName ();
+            break;
+          }
+          os << " Fragment [" << item.currentTrimedFromStart<<":"
+             << (item.currentTrimedFromStart + item.currentSize) << "]";
+        }
+      else
+        {
+          switch (item.type) {
+          case PacketMetadata::Item::PAYLOAD:
+            os << "Payload (size=" << item.currentSize << ")";
+            break;
+          case PacketMetadata::Item::HEADER:
+          case PacketMetadata::Item::TRAILER:
+            os << item.tid.GetName () << " (";
+            {
+              NS_ASSERT (item.tid.HasConstructor ());
+              Callback<ObjectBase *> constructor = item.tid.GetConstructor ();
+              NS_ASSERT (!constructor.IsNull ());
+              ObjectBase *instance = constructor ();
+              NS_ASSERT (instance != 0);
+              Chunk *chunk = dynamic_cast<Chunk *> (instance);
+              NS_ASSERT (chunk != 0);
+              chunk->Deserialize (item.current);
+              chunk->Print (os);
+            }
+            os << ")";
+            break;
+          }          
+        }
+      if (i.HasNext ())
+        {
+          os << " ";
+        }
+    }
+#if 0
+  // The code below will work only if headers and trailers
+  // define the right attributes which is not the case for
+  // now. So, as a temporary measure, we use the 
+  // headers' and trailers' Print method as shown above.
   PacketMetadata::ItemIterator i = m_metadata.BeginItem (m_buffer);
   while (i.HasNext ())
     {
@@ -245,7 +296,7 @@
           os << " ";
         }
     }
-  
+#endif   
 }
 
 PacketMetadata::ItemIterator