//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project
//
//File: unicoordstate.h
//
//Version: $Revision: 1.11 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/10/10 15:57:11 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Jari Katajavuori
//
//Description:
//
//
//Copyright:
//
//
//Licence:
//
//
//History: 

#ifndef __UNI_UNICOORDSTATE_H__
#define __UNI_UNICOORDSTATE_H__

#include "pf/state.h"

#include "iface/uaalif/uaalupprimitives.h"

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

class pfProtocol;

//
// Class: uniCoOrdState
//
// Description:
//     State machines for coordination protocol conduit.
//

class uniCoOrdState : public uniUpRSNandRRNInputs,
                      public uniDownRSNInputs,
                      public uniDownRRNInputs,
                      public uniDownInputs,
                      public uniMessageInputs,
                      public uniRSNMessageInputs,
                      public uniRRNMessageInputs,
                      public uaalUpInputs,
                      public uniCoOrdTimeoutInputs,
                      public pfState
{
    public:
        // uniUpInputs, primitives from RSN/RRN, going to UNI
        virtual void uniRESET_ERRORindAct(
            uniRESET_ERRORind *message_,
            pfProtocol *protocol_);
        virtual void uniRESETconfAct(
            uniRESETconf *message_,
            pfProtocol *protocol_);
        virtual void uniRESETindAct(
            uniRESETind *message_,
            pfProtocol *protocol_);
        
        // uniDownRSNInputs, primitives from UNI, going to RSN
        virtual void uniRESETreqAct(
            uniRESETreq *message_,
            pfProtocol *protocol_);

        // uniDownRRNInputs,  primitives from UNI, going to RRN
        virtual void uniRESETrespAct(
            uniRESETresp *message_,
            pfProtocol *protocol_);
        virtual void uniRESET_ERRORrespAct(
            uniRESET_ERRORresp *message_,
            pfProtocol *protocol_);

        // uniDownInputs, primitives from UNI

        virtual void uniLINK_ESTABLISHreqAct(
            uniLINK_ESTABLISHreq *message_,
            pfProtocol *protocol_);
        virtual void uniLINK_RELEASEreqAct(
            uniLINK_RELEASEreq *message_,
            pfProtocol *protocol_);
        
        // uniMessageInputs, from UNI

        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 uniRESTARTpduAct(
            uniRESTARTpdu *message_,
            pfProtocol *protocol_);
        virtual void uniRESTART_ACKpduAct(
            uniRESTART_ACKpdu *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_);
        
        
        // uaalUpInputs, primitives from uaal

        virtual void uaalESTABLISHindAct(
            uaalESTABLISHind *message_,
            pfProtocol *protocol_);
        virtual void uaalESTABLISHconfAct(
            uaalESTABLISHconf *message_,
            pfProtocol *protocol_);
        virtual void uaalRELEASEindAct(
            uaalRELEASEind *message_,
            pfProtocol *protocol_);
        virtual void uaalRELEASEconfAct(
            uaalRELEASEconf *message_,
            pfProtocol *protocol_);
        virtual void uaalDATAindAct(
            uaalDATAind *message_,
            pfProtocol *protocol_);
        virtual void uaalUNITDATAindAct(
            uaalUNITDATAind *message_,
            pfProtocol *protocol_);
        
        // timeouts

        virtual void uniT309timeoutAct(pfProtocol *protocol_);
        
    protected:
        uniCoOrdState(void);
        virtual ~uniCoOrdState(void);
};

class uniCoOrdAALConnectionReleased : public uniCoOrdState
{
    public:
        static uniCoOrdAALConnectionReleased *instance(void);

        virtual void uniRESETreqAct(
            uniRESETreq *message_,
            pfProtocol *protocol_);
        virtual void uniLINK_ESTABLISHreqAct(
            uniLINK_ESTABLISHreq *message_,
            pfProtocol *protocol_);
        virtual void uniSETUPpduAct(
            uniSETUPpdu *message_,
            pfProtocol *protocol_);
        virtual void uaalESTABLISHindAct(
            uaalESTABLISHind *message_,
            pfProtocol *protocol_);
        virtual void uniT309timeoutAct(pfProtocol *protocol_);
        
    protected:
        uniCoOrdAALConnectionReleased(void);
        virtual ~uniCoOrdAALConnectionReleased(void);
        
    private:
        static uniCoOrdAALConnectionReleased *_only;
};

class uniCoOrdAALAwaitingEstablish : public uniCoOrdState
{
    public:
        static uniCoOrdAALAwaitingEstablish *instance(void);

        // uniMessageInputs, from UNI (save these)

        virtual void uniSETUPpduAct(
            uniSETUPpdu *message_,
            pfProtocol *protocol_);
        virtual void uniCALL_PROCEEDINGpduAct(
            uniCALL_PROCEEDINGpdu *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 uniSTATUSpduAct(
            uniSTATUSpdu *message_,
            pfProtocol *protocol_);
        virtual void uniSTATUS_ENQUIRYpduAct(
            uniSTATUS_ENQUIRYpdu *message_,
            pfProtocol *protocol_);
        virtual void uniRESTARTpduAct(
            uniRESTARTpdu *message_,
            pfProtocol *protocol_);
        virtual void uniRESTART_ACKpduAct(
            uniRESTART_ACKpdu *message_,
            pfProtocol *protocol_);
        
        // AAL Message Actions
        virtual void uaalESTABLISHconfAct(
            uaalESTABLISHconf *message_,
            pfProtocol *protocol_);
        virtual void uaalRELEASEindAct(
            uaalRELEASEind *message_,
            pfProtocol *protocol_);

        // timeout
        virtual void uniT309timeoutAct(pfProtocol *protocol_);
        
    protected:
        void saveMessage(pfMessenger *message_, pfProtocol *protocol_);
        
        uniCoOrdAALAwaitingEstablish(void);
        virtual ~uniCoOrdAALAwaitingEstablish(void);

    private:
        static uniCoOrdAALAwaitingEstablish *_only;
};

class uniCoOrdAALAwaitingRelease : public uniCoOrdState
{
    public:
        static uniCoOrdAALAwaitingRelease *instance(void);

        virtual void uaalRELEASEconfAct(
            uaalRELEASEconf *message_,
            pfProtocol *protocol_);
        
    protected:
        uniCoOrdAALAwaitingRelease(void);
        virtual ~uniCoOrdAALAwaitingRelease(void);

    private:
        static uniCoOrdAALAwaitingRelease *_only;
};

class uniCoOrdAALConnectionEstablished : public uniCoOrdState
{
    public:
        static uniCoOrdAALConnectionEstablished *instance(void);

        virtual void uniRESET_ERRORindAct(
            uniRESET_ERRORind *message_,
            pfProtocol *protocol_);
        virtual void uniRESETconfAct(
            uniRESETconf *message_,
            pfProtocol *protocol_);
        virtual void uniRESETindAct(
            uniRESETind *message_,
            pfProtocol *protocol_);
        
        virtual void uniRESETreqAct(
            uniRESETreq *message_,
            pfProtocol *protocol_);
        virtual void uniRESETrespAct(
            uniRESETresp *message_,
            pfProtocol *protocol_);
        virtual void uniRESET_ERRORrespAct(
            uniRESET_ERRORresp *message_,
            pfProtocol *protocol_);
        
        virtual void uniLINK_RELEASEreqAct(
            uniLINK_RELEASEreq *message_,
            pfProtocol *protocol_);
        virtual void uniLINK_ESTABLISHreqAct(
            uniLINK_ESTABLISHreq *message_,
            pfProtocol *protocol_);
        virtual void uaalRELEASEindAct(
            uaalRELEASEind *message_,
            pfProtocol *protocol_);
        virtual void uaalESTABLISHindAct(
            uaalESTABLISHind *message_,
            pfProtocol *protocol_);
        virtual void uaalESTABLISHconfAct(
            uaalESTABLISHconf *message_,
            pfProtocol *protocol_);
        virtual void uaalDATAindAct(
            uaalDATAind *message_,
            pfProtocol *protocol_);

        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 uniRESTARTpduAct(
            uniRESTARTpdu *message_,
            pfProtocol *protocol_);
        virtual void uniRESTART_ACKpduAct(
            uniRESTART_ACKpdu *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_);
        
    protected:
        uniCoOrdAALConnectionEstablished(void);
        virtual ~uniCoOrdAALConnectionEstablished(void);

    private:
        static uniCoOrdAALConnectionEstablished *_only;
};

#endif // __UNI_UNICOORDSTATE_H__
