/* -*- 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 */
