//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / UNI
//
//File: unistate.h
//
//Version: $Revision: 1.12 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/12/08 16:37:37 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Jari Pusa
//      Sami Raatikainen (based on version 1.14)
//
//Description:
//      FSMs for uniProtocol protocol conduit.
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History: 

#ifndef __UNI_UNISTATE_H__
#define __UNI_UNISTATE_H__

#include "protocol/uni/uniprimitives.h"
#include "unipdu.h"
#include "unitimeouts.h"

class pfProtocol;
class uniProtocol;

//
// Class: uniState
//
// Description:
//      This class implements FSMs for uniProtocol protocol conduit.
//      Inputs are from sigif (upper layer), from coord, from RSN, RRN
//      and opposite UNI protocol via coord, and timer events.
//

class uniState : public uniUpRSNandRRNInputs,
                 public uniUpInputs,
                 public uniMessageInputs,
                 public uniPMPInputs,
                 public uniTimeoutInputs
{
    public:
        uniProtocol *protocolCast(pfProtocol *protocol_) const;

        // uniUpRSNandRRNInputs        
        virtual void uniRESET_ERRORindAct(
            uniRESET_ERRORind *message_,
            pfProtocol *protocol_);
        virtual void uniRESETconfAct(
            uniRESETconf *message_,
            pfProtocol *protocol_);
        virtual void uniRESETindAct(
            uniRESETind *message_,
            pfProtocol *protocol_);

        // uniUpInputs
        virtual void uniLINK_ESTABLISHconfAct(
            uniLINK_ESTABLISHconf *message_,
            pfProtocol *protocol_);
        virtual void uniLINK_ESTABLISHindAct(
            uniLINK_ESTABLISHind *message_,
            pfProtocol *protocol_);
        virtual void uniLINK_ESTABLISHerrorAct(
            uniLINK_ESTABLISHerror *message_,
            pfProtocol *protocol_);
        virtual void uniLINK_RELEASEconfAct(
            uniLINK_RELEASEconf *message_,
            pfProtocol *protocol_);
        virtual void uniLINK_RELEASEindAct(
            uniLINK_RELEASEind *message_,
            pfProtocol *protocol_);

        // uniMessageInputs
        virtual void uniSETUPpduAct( // not implemented
            uniSETUPpdu *message_,
            pfProtocol *protocol_);
        virtual void uniCALL_PROCEEDINGpduAct( // not implemented
            uniCALL_PROCEEDINGpdu *message_,
            pfProtocol *protocol_);
        virtual void uniALERTINGpduAct( // not implemented
            uniALERTINGpdu *message_,
            pfProtocol *protocol_);
        virtual void uniCONNECTpduAct( // not implemented
            uniCONNECTpdu *message_,
            pfProtocol *protocol_);
        virtual void uniCONNECT_ACKpduAct( // not implemented
            uniCONNECT_ACKpdu *message_,
            pfProtocol *protocol_);
        virtual void uniRELEASEpduAct( // not implemented
            uniRELEASEpdu *message_,
            pfProtocol *protocol_);
        virtual void uniRELEASE_COMPLETEpduAct( // not implemented
            uniRELEASE_COMPLETEpdu *message_,
            pfProtocol *protocol_);

        virtual void uniNOTIFYpduAct(
            uniNOTIFYpdu *message_,
            pfProtocol *protocol_);
        virtual void uniSTATUSpduAct(
            uniSTATUSpdu *message_,
            pfProtocol *protocol_);
        virtual void uniSTATUS_ENQUIRYpduAct(
            uniSTATUS_ENQUIRYpdu *message_,
            pfProtocol *protocol_);
        virtual void uniADD_PARTYpduAct(
            uniADD_PARTYpdu *message_,
            pfProtocol *protocol_);
        virtual void uniADD_PARTY_ACKpduAct(
            uniADD_PARTY_ACKpdu *message_,
            pfProtocol *protocol_);
        virtual void uniADD_PARTY_REJECTpduAct(
            uniADD_PARTY_REJECTpdu *message_,
            pfProtocol *protocol_);
        virtual void uniDROP_PARTYpduAct(
            uniDROP_PARTYpdu *message_,
            pfProtocol *protocol_);
        virtual void uniDROP_PARTY_ACKpduAct(
            uniDROP_PARTY_ACKpdu *message_,
            pfProtocol *protocol_);

        // uniPMPInputs        
        virtual void uniADD_PARTYreqAct(
            uniADD_PARTYreq *message_,
            pfProtocol *protocol_);
        virtual void uniADD_PARTYrespAct(
            uniADD_PARTYresp *message_,
            pfProtocol *protocol_);
        virtual void uniADD_PARTYerrorAct(
            uniADD_PARTYerror *message_,
            pfProtocol *protocol_);
        virtual void uniDROP_PARTYreqAct(
            uniDROP_PARTYreq *message_,
            pfProtocol *protocol_);
        virtual void uniDROP_PARTYrespAct(
            uniDROP_PARTYresp *message_,
            pfProtocol *protocol_);
        virtual void uniSTATUSreqAct(
            uniSTATUSreq *message_,
            pfProtocol *protocol_);
        virtual void uniSTATUSrespAct(
            uniSTATUSresp *message_,
            pfProtocol *protocol_);
        
        // Timeout inputs
        virtual void uniT301timeoutAct(pfProtocol *protocol_);
        virtual void uniT303timeoutAct(pfProtocol *protocol_);
        virtual void uniT308timeoutAct(pfProtocol *protocol_);
        virtual void uniT310timeoutAct(pfProtocol *protocol_);
        virtual void uniT313timeoutAct(pfProtocol *protocol_);
        virtual void uniT322timeoutAct(pfProtocol *protocol_);
        virtual void uniTREMOVEDtimeoutAct(pfProtocol *protocol_);
        
    protected:
        uniState(void);
        virtual ~uniState(void);
};

#endif // __UNI_UNISTATE_H__

