More progress on CCNx stack. Now we have helpers. Everything compiles, but not yet working

diff --git a/helper/ccnx-stack-helper.h b/helper/ccnx-stack-helper.h
new file mode 100644
index 0000000..d692b05
--- /dev/null
+++ b/helper/ccnx-stack-helper.h
@@ -0,0 +1,191 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: 
+ */
+
+#ifndef CCNX_STACK_HELPER_H
+#define CCNX_STACK_HELPER_H
+
+#include "ns3/node-container.h"
+#include "ns3/net-device-container.h"
+#include "ns3/packet.h"
+#include "ns3/ptr.h"
+#include "ns3/object-factory.h"
+#include "ns3/ccnx-l3-protocol.h"
+
+#include "ccnx-trace-helper.h"
+
+namespace ns3 {
+
+class Node;
+class CcnxForwardingHelper;
+
+/**
+ * \brief Adding CCNx functionality to existing Nodes.
+ *
+ * This helper enables pcap and ascii tracing of events in the ccnx stack
+ * associated with a node.  This is substantially similar to the tracing that
+ * happens in device helpers, but the important difference is that, well, there
+ * is no device.  This means that the creation of output file names will change,
+ * and also the user-visible methods will not reference devices and therefore
+ * the number of trace enable methods is reduced.
+ *
+ * Normally we eschew multiple inheritance, however, the classes
+ * PcapUserHelperForCcnx and AsciiTraceUserHelperForCcnx are treated as
+ * "mixins".  A mixin is a self-contained class that encapsulates a general
+ * attribute or a set of functionality that may be of interest to many other
+ * classes.
+ */
+class CcnxStackHelper : public PcapHelperForCcnx, public AsciiTraceHelperForCcnx
+{
+public:
+  /**
+   * Create a new CcnxStackHelper which <empty> forwarding by default.
+   *
+   * \todo set non-empty default forwarding
+   */
+  CcnxStackHelper ();
+
+  /**
+   * Destroy the CcnxStackHelper
+   */
+  virtual ~CcnxStackHelper ();
+  CcnxStackHelper (const CcnxStackHelper &);
+  CcnxStackHelper &operator = (const CcnxStackHelper &o);
+
+  /**
+   * Return helper internal state to that of a newly constructed one
+   */
+  void Reset ();
+
+  /**
+   * \param forwarding a new forwarding helper
+   *
+   * Set the forwarding helper to use during Install. The forwarding helper is
+   * really an object factory which is used to create an object of type
+   * ns3::CcnxFrProtocol per node. This forwarding object is then associated to
+   * a single ns3::Ccnx object through its ns3::Ccnx::SetforwardingProtocol.
+   */
+  void SetForwardingHelper (const CcnxForwardingHelper &forwarding);
+
+  /**
+   * Install CCNx stack on the node
+   *
+   * This method will assert if called on a node that already has Ccnx object
+   * installed on it
+   * 
+   * \param nodeName The name of the node on which to install the stack.
+   */
+  void Install (std::string nodeName) const;
+
+  /**
+   * Install CCNx stack on the node
+   *
+   * This method will assert if called on a node that already has Ccnx object
+   * installed on it
+   * 
+   * \param node The node on which to install the stack.
+   */
+  void Install (Ptr<Node> node) const;
+
+  /**
+   * Install CCNx stack on each node in the input container
+   *
+   * The program will assert if this method is called on a container with a node
+   * that already has an ccnx object aggregated to it.
+   * 
+   * \param c NodeContainer that holds the set of nodes on which to install the
+   * new stacks.
+   */
+  void Install (NodeContainer c) const;
+
+  /**
+   * Install CCNx stack on all nodes in the simulation
+   */
+  void 
+  InstallAll () const;
+
+  /**
+   * \brief Enable/disable ccnx stack install.
+   * \param enable enable state
+   */
+  void SetCcnxStackInstall (bool enable);
+
+private:
+  /**
+   * @brief Enable pcap output the indicated Ccnx and interface pair.
+   * @internal
+   *
+   * @param prefix Filename prefix to use for pcap files.
+   * @param ccnx Ptr to the Ccnx interface on which you want to enable tracing.
+   * @param interface Interface ID on the Ccnx on which you want to enable tracing.
+   */
+  virtual void EnablePcapCcnxInternal (std::string prefix, 
+                                       Ptr<Ccnx> ccnx, 
+                                       uint32_t interface,
+                                       bool explicitFilename);
+
+  /**
+   * @brief Enable ascii trace output on the indicated Ccnx and interface pair.
+   * @internal
+   *
+   * @param stream An OutputStreamWrapper representing an existing file to use
+   *               when writing trace data.
+   * @param prefix Filename prefix to use for ascii trace files.
+   * @param ccnx Ptr to the Ccnx interface on which you want to enable tracing.
+   * @param interface Interface ID on the Ccnx on which you want to enable tracing.
+   */
+  virtual void EnableAsciiCcnxInternal (Ptr<OutputStreamWrapper> stream, 
+                                        std::string prefix, 
+                                        Ptr<Ccnx> ccnx, 
+                                        uint32_t interface,
+                                        bool explicitFilename);
+
+  void Initialize (void);
+  ObjectFactory m_tcpFactory;
+  const CcnxForwardingHelper *m_forwarding;
+
+  /**
+   * \internal
+   */
+  static void CreateAndAggregateObjectFromTypeId (Ptr<Node> node, const std::string typeId);
+
+  /**
+   * \internal
+   */
+  static void Cleanup (void);
+
+  /**
+   * \internal
+   */
+  bool PcapHooked (Ptr<Ccnx> ccnx);
+
+  /**
+   * \internal
+   */
+  bool AsciiHooked (Ptr<Ccnx> ccnx);
+
+  /**
+   * \brief Ccnx install state (enabled/disabled) ?
+   */
+  bool m_ccnxEnabled;
+};
+
+} // namespace ns3
+
+#endif /* CCNX_STACK_HELPER_H */