/* -*- 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 "ns3/ndnSIM/model/ndn-common.hpp"

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

namespace ns3 {

class Packet;

namespace ndn {

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(shared_ptr<const Interest> interest);

  virtual bool
  SendData(shared_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
