// /* -*-  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
//  *
//  * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
//  */

// #include "ns3/application.h"
// #include "ns3/log.h"
// #include "ns3/random-variable.h"
// #include "ns3/nstime.h"
// #include "ns3/event-id.h"
// #include "ns3/ptr.h"
// #include "ns3/simulator.h"
// #include "ns3/ccnx-interest-header.h"
// #include "ns3/ccnx-local-face.h"
// #include "ns3/ccnx-name-components.h"
// #include "ns3/packet.h"
// #include "ns3/boolean.h"
// #include "ns3/integer.h"
// #include "ns3/uinteger.h"
// #include "ns3/random-variable.h"
// #include <limits> 
// #include "ns3/pointer.h"

// namespace ns3 
// {
    
// class Socket;
    
// class CcnxInterestSender: public Application
// {
// public: 
//   static TypeId GetTypeId (void);
        
//   CcnxInterestSender ();
        
//   virtual ~CcnxInterestSender ();
        
// protected:
//   virtual void DoDispose (void);
// private:
//   // inherited from Application base class.
//   virtual void StartApplication (void);    // Called at time specified by Start
//   virtual void StopApplication (void);     // Called at time specified by Stop
        
//   //Time m_onTime;
//   Time m_offTime;
//   CcnxNameComponents m_interestName;
  
//   Time m_interestLifeTime;
//   int32_t m_minSuffixComponents;
//   int32_t m_maxSuffixComponents;
//   bool m_childSelector;
//   CcnxNameComponents m_exclude;
//   uint32_t m_initialNonce;
    
//   //EventId         m_startStopEvent;     // Event id for next start or stop event
//   EventId         m_sendEvent;    // Eventid of pending "send packet" event
//   TypeId          m_tid;
//   Ptr<CcnxLocalFace> m_face;
        
//   //helpers
//   void CancelEvents ();
        
//   void Construct (Ptr<Node> n,
//                   std::string tid,
//                   const Time& offtime,
//                   Ptr<CcnxLocalFace> face,
//                   Ptr<CcnxNameComponents> nameComponents,
//                   const Time& lifetime,
//                   const int32_t& minSuffixComponents,
//                   const int32_t& maxSuffixComponents,
//                   const bool childSelector,
//                   Ptr<CcnxNameComponents> exclude,
//                   const uint32_t& initialNonce
//                   );
    
//   // Event handlers
//   void StartSending ();
//   void StopSending ();
//   void SendPacket ();
        
// private:
//   void ScheduleNextTx ();
//   //void ScheduleStartEvent ();
//   //void ScheduleStopEvent ();
//   void ConnectionSucceeded (Ptr<Socket>);
//   void ConnectionFailed (Ptr<Socket>);
//   void Ignore (Ptr<Socket>);
        
// };
// }
