//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / UNI
//
//File: unistate.h
//
//Version: $Revision: 1.14 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/11/20 12:08:12 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Jari Pusa
//
//Description:
//      FSMs for uniProtocol protocol conduit.
//
//Copyright:
//
//
//Licence:
//
//
//History: 

#ifndef __UNI_UNISTATE_H__
#define __UNI_UNISTATE_H__

#include "pf/state.h"
#include "iface/sigif/sigdownprimitives.h"
#include "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 sigDownInputs,
                 public uniUpRSNandRRNInputs,
                 public uniUpInputs,
                 public uniMessageInputs,
                 public uniPMPInputs,
                 public uniTimeoutInputs,
                 public pfState
{
    public:
        uniProtocol *protocolCast(pfProtocol *protocol_) const;

        // sigDownInputs
        virtual void sigSETUPreqAct(
            sigSETUPreq *message_,
            pfProtocol *protocol_);
        virtual void sigPROCEEDINGreqAct(
            sigPROCEEDINGreq *message_,
            pfProtocol *protocol_);
        virtual void sigSETUPrespAct(
            sigSETUPresp *message_,
            pfProtocol *protocol_);
        virtual void sigSETUP_COMPLETEreqAct(
            sigSETUP_COMPLETEreq *message_,
            pfProtocol *protocol_);
        virtual void sigRELEASEreqAct(
            sigRELEASEreq *message_,
            pfProtocol *protocol_);
        virtual void sigRELEASErespAct(
            sigRELEASEresp *message_,
            pfProtocol *protocol_);
        virtual void sigRESETreqAct(
            sigRESETreq *message_,
            pfProtocol *protocol_);
        virtual void sigRESETrespAct(
            sigRESETresp *message_,
            pfProtocol *protocol_);
        virtual void sigRESET_ERRORrespAct(
            sigRESET_ERRORresp *message_,
            pfProtocol *protocol_);
        
        // 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(
            uniSETUPpdu *message_,
            pfProtocol *protocol_);
        virtual void uniCALL_PROCEEDINGpduAct(
            uniCALL_PROCEEDINGpdu *message_,
            pfProtocol *protocol_);
        virtual void uniALERTINGpduAct(
            uniALERTINGpdu *message_,
            pfProtocol *protocol_);
        virtual void uniCONNECTpduAct(
            uniCONNECTpdu *message_,
            pfProtocol *protocol_);
        virtual void uniCONNECT_ACKpduAct(
            uniCONNECT_ACKpdu *message_,
            pfProtocol *protocol_);
        virtual void uniRELEASEpduAct(
            uniRELEASEpdu *message_,
            pfProtocol *protocol_);
        virtual void uniRELEASE_COMPLETEpduAct(
            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__

