/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
//
//  ndn_stupidinterestgenerator.h
//  Abstraction
//
//  Created by Ilya Moiseenko on 05.08.11.
//  Copyright 2011 UCLA. All rights reserved.
//

#include "ns3/application.h"
#include "ns3/log.h"
#include "ns3/address.h"
#include "ns3/random-variable.h"
#include "ns3/nstime.h"
#include "ns3/event-id.h"
#include "ns3/ptr.h"
#include "ns3/udp-socket-factory.h"
#include "ns3/socket.h"

namespace ns3 
{

//namespace NDNabstraction
//{
    class Socket; //dynamic linking works in a somehow strange way
    
    class StupidInterestGenerator: public Application
    {
    public: 
        static TypeId GetTypeId (void);
        
        StupidInterestGenerator ();
        
        virtual ~StupidInterestGenerator();
        
                
    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;
        
        Address         m_peer;         // Peer address
        Ptr<Socket>     m_socket;
        EventId         m_startStopEvent;     // Event id for next start or stop event
        EventId         m_sendEvent;    // Eventid of pending "send packet" event
        TypeId          m_tid;
        
        //helpers
        void CancelEvents ();
        
        void Construct (Ptr<Node> n,
                        const Address &remote,
                        std::string tid,
                        const RandomVariable& ontime,
                        const RandomVariable& offtime,
                        uint32_t size);
        
        // 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>);

    };
//}
}
