//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / UNI
//
//File: unirrnstate.h
//
//Version: $Revision: 1.8 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/08/05 05:22:07 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Jari Katajavuori
//
//Description:
//      RRN (Reset Response) protocol states. 
//
//Copyright:
//
//
//Licence:
//
//
//History: 

#ifndef __UNI_UNIRRNSTATE_H__
#define __UNI_UNIRRNSTATE_H__

#include "pf/state.h"

#include "uniprimitives.h"
#include "unipdu.h"
#include "unitimeouts.h"

class pfProtocol;

//
// Class: uniRRNState
//
// Description:
//      Base class for Null & Restart states
//

class uniRRNState : public uniDownRRNInputs,
                    public uniRRNMessageInputs,
                    public uniStatusMessageInputs,
                    public uniRRNTimeoutInputs,
                    public pfState
{
    public:
        virtual void uniRESETrespAct(
            uniRESETresp *message_,
            pfProtocol *protocol_);
        virtual void uniRESET_ERRORrespAct(
            uniRESET_ERRORresp *message_,
            pfProtocol *protocol_);
        virtual void uniRESTARTpduAct(
            uniRESTARTpdu *message_,
            pfProtocol *protocol_);
        virtual void uniSTATUSpduAct(
            uniSTATUSpdu *message_,
            pfProtocol *protocol_);

        virtual void uniT317timeoutAct(
            pfProtocol *protocol_);
        
    protected:
        uniRRNState(void);
        virtual ~uniRRNState(void);
};

//
// Class: uniRRNNullState
//
// Description:
//      State for waiting for RESTART pdu.
//

class uniRRNNullState : public uniRRNState
{
    public:
        static uniRRNNullState *instance(void);

        virtual void uniRESTARTpduAct(
            uniRESTARTpdu *message_,
            pfProtocol *protocol_);

    protected:
        uniRRNNullState(void);
        virtual ~uniRRNNullState(void);

    private:
        static uniRRNNullState *_only;
};

//
// Class: uniRRNRestartState
//
// Description:
//      RESET ind sent, waiting for reset to be performed.
//      

class uniRRNRestartState : public uniRRNState
{
    public:
        static uniRRNRestartState *instance(void);

        virtual void uniRESETrespAct(
            uniRESETresp *message_,
            pfProtocol *protocol_);
        virtual void uniRESET_ERRORrespAct(
            uniRESET_ERRORresp *message_,
            pfProtocol *protocol_);
        virtual void uniRESTARTpduAct(
            uniRESTARTpdu *message_,
            pfProtocol *protocol_);
        virtual void uniSTATUSpduAct(
            uniSTATUSpdu *message_,
            pfProtocol *protocol_);

        virtual void uniT317timeoutAct(
            pfProtocol *protocol_);
        
    protected:
        uniRRNRestartState(void);
        virtual ~uniRRNRestartState(void);

    private:
        static uniRRNRestartState *_only;
};

#endif // __UNI_UNIRRNSTATE_H__
