add TraceResolver::PrintAvailable method
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Mon, 27 Aug 2007 20:25:15 +0200
changeset 1368 e75dc1a2a5fb
parent 1367 45e351c58b30
child 1369 ca4667a61c57
add TraceResolver::PrintAvailable method
src/core/array-trace-resolver.h
src/core/composite-trace-resolver.cc
src/core/composite-trace-resolver.h
src/core/object.cc
src/core/object.h
src/core/trace-resolver.h
src/node/node-list.cc
src/node/node-list.h
utils/print-trace-sources.cc
utils/wscript
--- a/src/core/array-trace-resolver.h	Mon Aug 27 16:02:55 2007 +0200
+++ b/src/core/array-trace-resolver.h	Mon Aug 27 20:25:15 2007 +0200
@@ -62,6 +62,7 @@
   // inherited from TraceResolver
   virtual void Connect (std::string path, CallbackBase const &cb, const TraceContext &context);
   virtual void Disconnect (std::string path, CallbackBase const &cb);
+  virtual void PrintAvailable (std::string path, const TraceContext &context, std::ostream &os);
 
 private:
   class IteratorBase
@@ -139,7 +140,7 @@
         INDEX index = j;
         tmp.AddElement (index);
         Ptr<Object> obj = m_iter->Get ();
-        obj->TraceConnect (subpath, cb, tmp);
+        obj->GetTraceResolver ()->Connect (subpath, cb, tmp);
         j++;
       }
   }
@@ -163,6 +164,22 @@
       }
   }
 }
+template <typename INDEX>
+void 
+ArrayTraceResolver<INDEX>::PrintAvailable (std::string path, const TraceContext &context, std::ostream &os)
+{
+  path.append ("/[0-n]");
+  uint32_t j = 0;
+  for (m_iter->Rewind (); m_iter->HasNext (); m_iter->Next ())
+    {
+        TraceContext tmp = context;
+        INDEX index = j;
+        tmp.AddElement (index);
+        Ptr<Object> obj = m_iter->Get ();
+        obj->GetTraceResolver ()->PrintAvailable (path, tmp, os);
+        j++;
+    }
+}
 
 }//namespace ns3
 
--- a/src/core/composite-trace-resolver.cc	Mon Aug 27 16:02:55 2007 +0200
+++ b/src/core/composite-trace-resolver.cc	Mon Aug 27 20:25:15 2007 +0200
@@ -82,7 +82,14 @@
     {if (subpath == "") {trace->AddCallback (cb, context);}}
     virtual void Disconnect (std::string subpath, const CallbackBase &cb)
     {if (subpath == "") {trace->RemoveCallback (cb);}}
-
+    virtual void PrintAvailable (std::string path, const TraceContext &context, std::ostream &os)
+    {
+      os << path << "/" << this->name << " [";
+      TraceContext ctx = context;
+      ctx.Union (this->context);
+      ctx.PrintAvailable (os, ",");
+      os << "]" << std::endl;
+    }
     TraceSource *trace;
   } *item = new SourceCompositeItem ();
   item->name = name;
@@ -106,9 +113,17 @@
   {
   public:
     virtual void Connect (std::string subpath, const CallbackBase &cb, const TraceContext &context)
-    {child->TraceConnect (subpath, cb, context);}
+    {child->GetTraceResolver ()->Connect (subpath, cb, context);}
     virtual void Disconnect (std::string subpath, const CallbackBase &cb)
     {child->TraceDisconnect (subpath, cb);}
+    virtual void PrintAvailable (std::string path, const TraceContext &context, std::ostream &os)
+    {
+      path.append ("/");
+      path.append (this->name);
+      TraceContext ctx = context;
+      ctx.Union (this->context);
+      this->child->GetTraceResolver ()->PrintAvailable (path, ctx, os);
+    }
 
     Ptr<Object> child;
   } *item = new ChildCompositeItem ();
@@ -249,6 +264,19 @@
   } operation  = DisconnectOperation (cb);
   DoRecursiveOperation (path, operation);
 }
+void 
+CompositeTraceResolver::PrintAvailable (std::string path, const TraceContext &context, std::ostream &os)
+{
+  for (TraceItems::const_iterator i = m_items.begin (); i != m_items.end (); i++)
+    {
+      NS_DEBUG ("print " << (*i)->name);
+      (*i)->PrintAvailable (path, context, os);
+    }
+  if (m_parent != 0)
+    {
+      m_parent->PrintAvailable (path, context, os);
+    }
+}
 
 }//namespace ns3
 
--- a/src/core/composite-trace-resolver.h	Mon Aug 27 16:02:55 2007 +0200
+++ b/src/core/composite-trace-resolver.h	Mon Aug 27 20:25:15 2007 +0200
@@ -91,6 +91,7 @@
 
   virtual void Connect (std::string path, CallbackBase const &cb, const TraceContext &context);
   virtual void Disconnect (std::string path, CallbackBase const &cb);
+  virtual void PrintAvailable (std::string path, const TraceContext &context, std::ostream &os);
 
 private:
   class CompositeItem 
@@ -99,6 +100,7 @@
     virtual ~CompositeItem () {}
     virtual void Connect (std::string subpath, const CallbackBase &cb, const TraceContext &context) = 0;
     virtual void Disconnect (std::string subpath, const CallbackBase &cb) = 0;
+    virtual void PrintAvailable (std::string path, const TraceContext &context, std::ostream &os) {}
 
     std::string name;
     TraceContext context;
@@ -155,7 +157,13 @@
     {array->Connect (subpath, cb, context);}
     virtual void Disconnect (std::string subpath, const CallbackBase &cb)
     {array->Disconnect (subpath, cb);}
-
+    virtual void PrintAvailable (std::string path, const TraceContext &context, std::ostream &os)
+    {
+      path.append ("/");
+      path.append (this->name);
+      TraceContext ctx = context;
+      ctx.Union (this->context);
+      array->PrintAvailable (path, ctx, os);}
     Ptr<ArrayTraceResolver<INDEX> > array;
   } *item = new ArrayCompositeItem ();
   item->name = name;
--- a/src/core/object.cc	Mon Aug 27 16:02:55 2007 +0200
+++ b/src/core/object.cc	Mon Aug 27 20:25:15 2007 +0200
@@ -63,6 +63,7 @@
   InterfaceIdTraceResolver (Ptr<Object> aggregate);
   virtual void Connect (std::string path, CallbackBase const &cb, const TraceContext &context);
   virtual void Disconnect (std::string path, CallbackBase const &cb);
+  virtual void PrintAvailable (std::string path, const TraceContext &context, std::ostream &os);
 private:
   Ptr<Object> ParseForInterface (std::string path);
   Ptr<Object> m_aggregate;
@@ -91,7 +92,7 @@
   Ptr<Object> interface = ParseForInterface (path);
   if (interface != 0)
     {
-      interface->TraceConnect (GetSubpath (path), cb, context);
+      interface->GetTraceResolver ()->Connect (GetSubpath (path), cb, context);
     }
 }
 void 
@@ -103,6 +104,11 @@
       interface->TraceDisconnect (GetSubpath (path), cb);
     }
 }
+void 
+InterfaceIdTraceResolver::PrintAvailable (std::string path, const TraceContext &context, std::ostream &os)
+{
+  
+}
 
 
 InterfaceId::InterfaceId (uint16_t iid)
@@ -216,12 +222,7 @@
 void 
 Object::TraceConnect (std::string path, const CallbackBase &cb)
 {
-  TraceConnect (path, cb, TraceContext ());
-}
-void 
-Object::TraceConnect (std::string path, const CallbackBase &cb, const TraceContext &context)
-{
-  GetTraceResolver ()->Connect (path, cb, context);
+  GetTraceResolver ()->Connect (path, cb, TraceContext ());
 }
 void 
 Object::TraceDisconnect (std::string path, const CallbackBase &cb)
@@ -229,7 +230,6 @@
   GetTraceResolver ()->Disconnect (path, cb);
 }
 
-
 void 
 Object::SetInterfaceId (InterfaceId iid)
 {
--- a/src/core/object.h	Mon Aug 27 16:02:55 2007 +0200
+++ b/src/core/object.h	Mon Aug 27 20:25:15 2007 +0200
@@ -138,8 +138,8 @@
 
 
   void TraceConnect (std::string path, const CallbackBase &cb);
-  void TraceConnect (std::string path, const CallbackBase &cb, const TraceContext &context);
   void TraceDisconnect (std::string path, const CallbackBase &cb);
+  virtual Ptr<TraceResolver> GetTraceResolver (void);
 protected:
   /**
    * \param iid an InterfaceId
@@ -155,8 +155,6 @@
    * up to their parent's implementation once they are done.
    */
   virtual void DoDispose (void);
-
-  virtual Ptr<TraceResolver> GetTraceResolver (void);
 private:
   Ptr<Object> DoQueryInterface (InterfaceId iid) const;
   bool Check (void) const;
--- a/src/core/trace-resolver.h	Mon Aug 27 16:02:55 2007 +0200
+++ b/src/core/trace-resolver.h	Mon Aug 27 20:25:15 2007 +0200
@@ -69,6 +69,8 @@
    * This method should behave as Connect.
    */
   virtual void Disconnect (std::string path, CallbackBase const &cb) = 0;
+
+  virtual void PrintAvailable (std::string path, const TraceContext &context, std::ostream &os) = 0;
 protected:
   /**
    * \param path a namespace path
--- a/src/node/node-list.cc	Mon Aug 27 16:02:55 2007 +0200
+++ b/src/node/node-list.cc	Mon Aug 27 20:25:15 2007 +0200
@@ -171,5 +171,9 @@
 {
   SimulationSingleton<NodeListPriv>::Get ()->GetTraceResolver ()->Disconnect (name, cb);
 }
-
+Ptr<TraceResolver> 
+NodeList::GetTraceResolver (void)
+{
+  return SimulationSingleton<NodeListPriv>::Get ()->GetTraceResolver ();
+}
 }//namespace ns3
--- a/src/node/node-list.h	Mon Aug 27 16:02:55 2007 +0200
+++ b/src/node/node-list.h	Mon Aug 27 20:25:15 2007 +0200
@@ -30,6 +30,7 @@
 
 class Node;
 class CallbackBase;
+class TraceResolver;
 
 class NodeListIndex : public TraceContextElement
 {
@@ -94,6 +95,7 @@
    * the input namespace regexp.
    */
   static void Disconnect (std::string name, const CallbackBase &cb);
+  static Ptr<TraceResolver> GetTraceResolver (void);
 private:
 };
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/utils/print-trace-sources.cc	Mon Aug 27 20:25:15 2007 +0200
@@ -0,0 +1,23 @@
+#include "ns3/internet-node.h"
+#include "ns3/ptr.h"
+#include "ns3/trace-resolver.h"
+#include "ns3/node-list.h"
+#include "ns3/point-to-point-net-device.h"
+#include "ns3/csma-cd-net-device.h"
+#include "ns3/queue.h"
+
+using namespace ns3;
+
+int main (int argc, char *argv[])
+{
+  Ptr<Node> node = Create<InternetNode> ();
+
+  Ptr<PointToPointNetDevice> p2p = Create<PointToPointNetDevice> (node);
+  p2p->AddQueue (Queue::CreateDefault ());
+  Ptr<CsmaCdNetDevice> csma = Create<CsmaCdNetDevice> (node);
+  csma->AddQueue (Queue::CreateDefault ());
+
+  NodeList::GetTraceResolver ()->PrintAvailable ("", TraceContext (), std::cout);
+
+  return 0;
+}
--- a/utils/wscript	Mon Aug 27 16:02:55 2007 +0200
+++ b/utils/wscript	Mon Aug 27 20:25:15 2007 +0200
@@ -16,3 +16,7 @@
 
     obj = bld.create_ns3_program('replay-simulation', ['simulator'])
     obj.source = 'replay-simulation.cc'
+
+    obj = bld.create_ns3_program('print-trace-sources',
+                                 ['internet-node', 'csma-cd', 'point-to-point'])
+    obj.source = 'print-trace-sources.cc'