/* -*- 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:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
 */

#include "ndn-global-router.hpp"

#include "ns3/ndn-l3-protocol.hpp"
#include "ns3/ndn-face.hpp"

#include "ns3/channel.h"

namespace ns3 {
namespace ndn {

uint32_t GlobalRouter::m_idCounter = 0;

NS_OBJECT_ENSURE_REGISTERED(GlobalRouter);

TypeId
GlobalRouter::GetTypeId()
{
  static TypeId tid = TypeId("ns3::ndn::GlobalRouter").SetGroupName("Ndn").SetParent<Object>();
  return tid;
}

GlobalRouter::GlobalRouter()
{
  m_id = m_idCounter;
  m_idCounter++;
}

void
GlobalRouter::NotifyNewAggregate()
{
  if (m_ndn == 0) {
    m_ndn = GetObject<L3Protocol>();
  }
  Object::NotifyNewAggregate();
}

uint32_t
GlobalRouter::GetId() const
{
  return m_id;
}

Ptr<L3Protocol>
GlobalRouter::GetL3Protocol() const
{
  return m_ndn;
}

void
GlobalRouter::AddLocalPrefix(shared_ptr<Name> prefix)
{
  m_localPrefixes.push_back(prefix);
}

void
GlobalRouter::AddIncidency(Ptr<Face> face, Ptr<GlobalRouter> gr)
{
  m_incidencies.push_back(boost::make_tuple(this, face, gr));
}

GlobalRouter::IncidencyList&
GlobalRouter::GetIncidencies()
{
  return m_incidencies;
}

const GlobalRouter::LocalPrefixList&
GlobalRouter::GetLocalPrefixes() const
{
  return m_localPrefixes;
}

// void
// GlobalRouter::AddIncidencyChannel (Ptr< NdnFace > face, Ptr< Channel > channel)
// {
//   m_incidenciesChannel.push_back (make_tuple (face, channel));
// }

} // namespace ndn
} // namespace ns3
