/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
/*
 * Copyright (c) 2011 University of California, Los Angeles
 *
 * 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
 *
 * Authors:     Alexander Afanasyev <alexander.afanasyev@ucla.edu>
                Ilya Moiseenko <iliamo@cs.ucla.edu>
 */

#ifndef NDN_APP_FACE_H
#define NDN_APP_FACE_H

#include "ndn-face.hpp"
#include "ns3/traced-callback.h"

namespace ns3 {

class Packet;

namespace ndn {

class Interest;
class Data;

typedef Interest InterestHeader;
typedef Data DataHeader;

class App;

/**
 * \ingroup ndn-face
 * \brief Implementation of application Ndn face
 *
 * This class defines basic functionality of Ndn face. Face is core
 * component responsible for actual delivery of data packet to and
 * from Ndn stack
 *
 * \see AppFace, NdnNetDeviceFace, NdnIpv4Face, NdnUdpFace
 */
class AppFace : public Face {
public:
  static TypeId
  GetTypeId();

  /**
   * \brief Default constructor
   */
  AppFace(Ptr<App> app);
  virtual ~AppFace();

  ////////////////////////////////////////////////////////////////////
  // methods overloaded from Face
  virtual bool
  SendInterest(Ptr<const Interest> interest);

  virtual bool
  SendData(Ptr<const Data> data);

public:
  virtual std::ostream&
  Print(std::ostream& os) const;
  ////////////////////////////////////////////////////////////////////

private:
  AppFace();
  AppFace(const AppFace&); ///< \brief Disabled copy constructor
  AppFace&
  operator=(const AppFace&); ///< \brief Disabled copy operator

private:
  Ptr<App> m_app;
};

} // namespace ndn
} // namespace ns3

#endif // NDN_APP_FACE_H
