override Connect and Disconnect in Composite and Terminal Trace resolvers
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Fri, 10 Aug 2007 14:14:29 +0200
changeset 1327 798c425d3b1f
parent 1326 5ddb45fb3b4b
child 1328 03f1081c21a7
override Connect and Disconnect in Composite and Terminal Trace resolvers
src/common/composite-trace-resolver.cc
src/common/composite-trace-resolver.h
src/common/terminal-trace-resolver.h
--- a/src/common/composite-trace-resolver.cc	Fri Aug 10 14:13:47 2007 +0200
+++ b/src/common/composite-trace-resolver.cc	Fri Aug 10 14:14:29 2007 +0200
@@ -19,6 +19,9 @@
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
 #include "composite-trace-resolver.h"
+#include "ns3/debug.h"
+
+NS_DEBUG_COMPONENT_DEFINE ("CompositeTraceResolver");
 
 namespace ns3 {
 
@@ -47,17 +50,39 @@
   m_items.push_back (item);
 }
 
-TraceResolver::TraceResolverList 
-CompositeTraceResolver::DoLookup (std::string id) const
+void 
+CompositeTraceResolver::Connect (std::string path, CallbackBase const &cb, const TraceContext &context)
+{
+  NS_DEBUG ("connect path="<<path);
+  DoRecursiveOperation (path, cb, context, CONNECT);
+}
+void 
+CompositeTraceResolver::DoRecursiveOperation (std::string path, CallbackBase const &cb, 
+                                              const TraceContext &context,
+                                              enum Operation op)
 {
+  std::string::size_type cur = 1;
+  // check that first char is "/"
+  std::string::size_type next = path.find ("/", cur);
+  std::string id = std::string (path, cur, next-1);
+  std::string subpath;
+  if (next != std::string::npos)
+    {
+      subpath = std::string (path, next, std::string::npos);
+    }
+  else
+    {
+      subpath = "";
+    }
+
   if (id == "*")
     {
       TraceResolver::TraceResolverList list;
       for (TraceItems::const_iterator i = m_items.begin (); i != m_items.end (); i++)
 	{
-	  list.push_back (std::make_pair (i->createResolver (), i->context));
-	}
-      return list;
+          OperationOne (subpath, i, cb, context, op);
+        }
+      return;
     }
   std::string::size_type start, end;
   start = id.find_first_of ("(", 0);
@@ -68,30 +93,29 @@
 	{
 	  if (i->name == id)
 	    {
-	      TraceResolver::TraceResolverList list;
-	      list.push_back (std::make_pair (i->createResolver (), i->context));
-	      return list;
+              OperationOne (subpath, i, cb, context, op);
+              return;
 	    }
 	}
     }
   std::list<std::string> names;
   std::string alternatives = std::string (id, start+1, end-1);
-  std::string::size_type next, cur;
-  next = 0;
-  cur = 0;
+  std::string::size_type next_pos, cur_pos;
+  next_pos = 0;
+  cur_pos = 0;
   while (true)
     {
       std::string element;
-      next = alternatives.find ("|", cur);
-      if (next == std::string::npos)
+      next_pos = alternatives.find ("|", cur_pos);
+      if (next_pos == std::string::npos)
 	{
-	  element = std::string (alternatives, cur, alternatives.size ());
+	  element = std::string (alternatives, cur_pos, alternatives.size ());
 	  names.push_back (element);
 	  break;
 	}
-      element = std::string (alternatives, cur, next);
+      element = std::string (alternatives, cur_pos, next_pos);
       names.push_back (element);
-      cur = next + 1;
+      cur_pos = next_pos + 1;
     }
   TraceResolver::TraceResolverList list;
   for (std::list<std::string>::const_iterator i = names.begin (); i != names.end (); i++)
@@ -100,12 +124,38 @@
 	{
 	  if (j->name == *i)
 	    {
-	      list.push_back (std::make_pair (j->createResolver (), j->context));
+              OperationOne (subpath, j, cb, context, op);
 	      break;
 	    }
 	}
     }
-  return list;
+}
+
+void 
+CompositeTraceResolver::OperationOne (std::string subpath, 
+                                      TraceItems::const_iterator i,
+                                      const CallbackBase &cb,
+                                      const TraceContext &context,
+                                      enum Operation op)
+{
+  TraceResolver *resolver = i->createResolver ();
+  switch (op) {
+  case CONNECT: {
+    NS_DEBUG ("connect to path="<<subpath<<" name="<<i->name);
+    TraceContext ctx = context;
+    ctx.Add (i->context);
+    resolver->Connect (subpath, cb, ctx);
+    } break;
+  case DISCONNECT:
+    resolver->Disconnect (subpath, cb);
+    break;
+  }
+  }
+
+void 
+CompositeTraceResolver::Disconnect (std::string path, CallbackBase const &cb)
+{
+  DoRecursiveOperation (path, cb, TraceContext (), DISCONNECT);
 }
 
 }//namespace ns3
--- a/src/common/composite-trace-resolver.h	Fri Aug 10 14:13:47 2007 +0200
+++ b/src/common/composite-trace-resolver.h	Fri Aug 10 14:14:29 2007 +0200
@@ -123,7 +123,22 @@
    */
   void Add (std::string name, 
             Callback<TraceResolver *> createResolver);
+  virtual void Connect (std::string path, CallbackBase const &cb, const TraceContext &context);
+  virtual void Disconnect (std::string path, CallbackBase const &cb);
+
 private:
+  struct CallbackTraceSourceItem
+  {
+    std::string name;
+    Callback<TraceResolver *> createResolver;
+    TraceContext context;
+  };
+  typedef std::list<struct CallbackTraceSourceItem> TraceItems;
+  enum Operation {
+    CONNECT,
+    DISCONNECT
+  };
+
   template <typename SOURCE, typename CONTEXT>
   void DoAddTraceSource (std::string name,
                          SOURCE &traceSource, CONTEXT const &context);
@@ -132,16 +147,17 @@
   void DoAdd (std::string name, 
               Callback<TraceResolver *> createResolver,
               TraceContext const &context);
-  virtual TraceResolverList DoLookup (std::string id) const;
+  void OperationOne (std::string subpath, 
+                     TraceItems::const_iterator i,
+                     const CallbackBase &cb,
+                     const TraceContext &context,
+                     enum Operation op);
+  void DoRecursiveOperation (std::string path, CallbackBase const &cb, 
+                             const TraceContext &context,
+                             enum Operation op);
 
-  struct CallbackTraceSourceItem
-  {
-    std::string name;
-    Callback<TraceResolver *> createResolver;
-    TraceContext context;
-  };
 
-  typedef std::list<struct CallbackTraceSourceItem> TraceItems;
+
   TraceItems m_items;
 };
 
--- a/src/common/terminal-trace-resolver.h	Fri Aug 10 14:13:47 2007 +0200
+++ b/src/common/terminal-trace-resolver.h	Fri Aug 10 14:14:29 2007 +0200
@@ -22,6 +22,7 @@
 #define TERMINAL_TRACE_RESOLVER_H
 
 #include "trace-resolver.h"
+#include "ns3/assert.h"
 
 namespace ns3 {
 
@@ -32,9 +33,10 @@
 {
  public:
   TerminalTraceResolver (T &traceSource);
+
+  virtual void Connect (std::string path, CallbackBase const &cb, const TraceContext &context);
+  virtual void Disconnect (std::string path, CallbackBase const &cb);
  private:
-  virtual void DoConnect (CallbackBase const &cb, const TraceContext &context);
-  virtual void DoDisconnect (CallbackBase const &cb);
   T &m_traceSource;
 };
 
@@ -48,15 +50,21 @@
 {}
 template <typename T>
 void 
-TerminalTraceResolver<T>::DoConnect (CallbackBase const &cb, const TraceContext &context)
+TerminalTraceResolver<T>::Connect (std::string path, CallbackBase const &cb, const TraceContext &context)
 {
-  m_traceSource.AddCallback (cb, context);
+  if (path == "")
+    {
+      m_traceSource.AddCallback (cb, context);
+    }
 }
 template <typename T>
 void 
-TerminalTraceResolver<T>::DoDisconnect (CallbackBase const &cb)
+TerminalTraceResolver<T>::Disconnect (std::string path, CallbackBase const &cb)
 {
-  m_traceSource.RemoveCallback (cb);
+  if (path == "")
+    {
+      m_traceSource.RemoveCallback (cb);
+    }
 }
 
 }//namespace ns3