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

#include "ns3/application.h"
#include "ns3/event-id.h"
#include "ns3/ptr.h"
#include "ns3/traced-callback.h"
#include "ns3/address.h"

namespace ns3 
{
    
    class Address;
    class Socket;
    class Packet;

    class StupidInterestSink : public Application
    {
    public:
        static TypeId GetTypeId (void);
        StupidInterestSink ();
        
        virtual ~StupidInterestSink ();
        
        /**
         * \return the total bytes received in this sink app
         */
        uint32_t GetTotalRx () const;
        
        /**
         * \return pointer to listening socket
         */
        Ptr<Socket> GetListeningSocket (void) const;
        
        /**
         * \return list of pointers to accepted sockets
         */
        std::list<Ptr<Socket> > GetAcceptedSockets (void) const;
        
    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
        
        void HandleRead (Ptr<Socket>);
        void HandleAccept (Ptr<Socket>, const Address& from);
        void HandlePeerClose (Ptr<Socket>);
        void HandlePeerError (Ptr<Socket>);
        
        // In the case of TCP, each socket accept returns a new socket, so the 
        // listening socket is stored seperately from the accepted sockets
        Ptr<Socket>     m_socket;       // Listening socket
        std::list<Ptr<Socket> > m_socketList; //the accepted sockets
        
        Address         m_local;        // Local address to bind to
        uint32_t        m_totalRx;      // Total bytes received
        TypeId          m_tid;          // Protocol TypeId
        TracedCallback<Ptr<const Packet>, const Address &> m_rxTrace;
    };
}
