add support for a default PacketPrinter
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Thu, 31 May 2007 12:34:33 +0200
changeset 799 3236b54a77a6
parent 798 f947deabe06e
child 800 dd9660f5f784
add support for a default PacketPrinter
src/common/packet-printer.cc
src/common/packet-printer.h
--- a/src/common/packet-printer.cc	Thu May 31 11:03:42 2007 +0200
+++ b/src/common/packet-printer.cc	Thu May 31 12:34:33 2007 +0200
@@ -54,6 +54,25 @@
   return &registeredChunks;
 }
 
+PacketPrinter 
+PacketPrinter::GetDefault (void)
+{
+  return *(PacketPrinter::PeekDefault ());
+}
+PacketPrinter *
+PacketPrinter::PeekDefault (void)
+{
+  static PacketPrinter *tmp = PacketPrinter::CreateStaticDefault ();
+  return tmp;
+}
+PacketPrinter *
+PacketPrinter::CreateStaticDefault (void)
+{
+  static PacketPrinter tmp;
+  return &tmp;
+}
+
+
 void 
 PacketPrinter::PrintChunk (uint32_t chunkUid, 
                            Buffer::Iterator start, 
@@ -112,5 +131,40 @@
   m_payloadPrinter (os, packetUid, size, info);
 }
 
+void 
+PacketPrinter::DoDefaultPrintPayload (std::ostream & os,
+                                      uint32_t packetUid,
+                                      uint32_t size,
+                                      struct PacketPrinter::FragmentInformation info)
+{
+  os << "data ";
+  os << "[" << info.start << ":" << info.end << "] -> "
+     << "[0:" << size << "]";
+  os << std::endl;
+}
+
+void 
+PacketPrinter::DoDefaultPrintDefault (std::ostream & os,
+                                      uint32_t packetUid,
+                                      uint32_t size,
+                                      std::string &name,
+                                      struct PacketPrinter::FragmentInformation info)
+{
+  NS_ASSERT_MSG (false, "This should never happen because we provide a printer for _all_ chunk types.");
+}
+
+void 
+PacketPrinter::DoDefaultPrintFragment (std::ostream & os,
+                                       uint32_t packetUid,
+                                       uint32_t size,
+                                       std::string &name,
+                                       struct PacketPrinter::FragmentInformation info)
+{
+  os << name << " ";
+  os << "[" << info.start << ":" << info.end << "] -> "
+     << "[0:" << size << "]";
+  os << std::endl;
+}
+
 
 } // namespace ns3
--- a/src/common/packet-printer.h	Thu May 31 11:03:42 2007 +0200
+++ b/src/common/packet-printer.h	Thu May 31 12:34:33 2007 +0200
@@ -105,6 +105,24 @@
 
 
   static PacketPrinter GetDefault (void);
+  static PacketPrinter *PeekDefault (void);
+  static PacketPrinter *CreateStaticDefault (void);
+  static void DoDefaultPrintPayload (std::ostream & os,
+                                     uint32_t packetUid,
+                                     uint32_t size,
+                                     struct PacketPrinter::FragmentInformation info);
+  static void DoDefaultPrintDefault (std::ostream & os,
+                                     uint32_t packetUid,
+                                     uint32_t size,
+                                     std::string &name,
+                                     struct PacketPrinter::FragmentInformation info);
+  template <typename T>
+  static void DoDefaultPrint (std::ostream &os, uint32_t packetUid, uint32_t size, const T *chunk);
+  static void DoDefaultPrintFragment (std::ostream & os,
+                                      uint32_t packetUid,
+                                      uint32_t size,
+                                      std::string &name,
+                                      struct PacketPrinter::FragmentInformation info);
 
   template <typename T>
   static void DoPrint (Ptr<CallbackImplBase> callbackPrinter,
@@ -202,9 +220,20 @@
   RegisteredChunks *chunks = PacketPrinter::GetRegisteredChunks ();
   chunks->push_back (std::make_pair(&PacketPrinter::DoPrint<T>, 
                                     &PacketPrinter::DoGetName<T>));
+  PacketPrinter::PeekDefault ()->AddPrinter (MakeCallback (&PacketPrinter::DoDefaultPrint<T>),
+                                             MakeCallback (&PacketPrinter::DoDefaultPrintFragment));
   return chunks->size ();
 }
 
+template <typename T>
+void 
+PacketPrinter::DoDefaultPrint (std::ostream &os, uint32_t packetUid, uint32_t size, const T *chunk)
+{
+  chunk->Print (os);
+  os << std::endl;
+}
+
+
 
 } // namespace ns3