//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / NNI SSCF protocol
//
//File: nsscfstate.h
//
//Version: $Revision: 1.8 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/10/19 18:11:09 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications and Multimedia
//
//Author:
//      Juhana Räsänen
//
//Description:
//      Base State class definition for NNI-SSCF state machine
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History:
 

#ifndef __NSSCFSTATE_H__
#define __NSSCFSTATE_H__

#include "nsscf.h"
#include "pf/protocol.h"
#include "pf/state.h"
#include "iface/aaif/aaupprimitives.h"
#include "iface/naalif/naaldownprimitives.h"

class nsscfProtocol;
class maalPROVING_UNSUCCESFULresp;
class maalFORCE_PROVINGreq;
class maalFORCE_EMERGENCYreq;
class maalCLEAR_FORCE_MODESreq;
class maalRELEASEreq;
class maalLOCAL_PROCESSOR_OUTAGEreq;
class maalLOCAL_PROCESSOR_RECOVEREDreq;


//
// Class: nsscfState
//
// Description:
//     This is the NNI-SSCF state machine base state class. Actual states
//     inherit this class and default actions defined here. NNI-SSCF state
//     itself inherits the AA-interface upward primitive input methods from
//     an interface class (and pfState through that class)
//

class nsscfState : public pfState, 
                   public aaUpInputs,
                   public naalDownInputs
{
    public:
        // Actions for incoming (N)AAL-primitives from above layer
        virtual void naalMESSAGE_FOR_TRANSMISSIONreqAct(
            naalMESSAGE_FOR_TRANSMISSIONreq *messenger_,
            pfProtocol *protocol_);
        virtual void naalEMERGENCYreqAct(
            naalEMERGENCYreq *messenger_,
            pfProtocol *protocol_);
        virtual void naalEMERGENCY_CEASESreqAct(
            naalEMERGENCY_CEASESreq *messenger_,
            pfProtocol *protocol_);
        virtual void naalSTOPreqAct(
            naalSTOPreq *messenger_,
            pfProtocol *protocol_);
        virtual void naalSTARTreqAct(
            naalSTARTreq *messenger_,
            pfProtocol *protocol_);
        virtual void naalRETRIEVE_BSNTreqAct(
            naalRETRIEVE_BSNTreq *messenger_,
            pfProtocol *protocol_);
        virtual void naalRETRIEVAL_REQUEST_AND_FSNCreqAct(
            naalRETRIEVAL_REQUEST_AND_FSNCreq *messenger_,
            pfProtocol *protocol_);
        virtual void naalFLUSH_BUFFERSreqAct(
            naalFLUSH_BUFFERSreq *messenger_,
            pfProtocol *protocol_);
        virtual void naalCONTINUEreqAct(
            naalCONTINUEreq *messenger_,
            pfProtocol *protocol_);

        // Actions for incoming AA-signals from lower layer
        virtual void aaESTABLISHindAct(aaESTABLISHind *messenger_,
                                       pfProtocol *protocol_);
        virtual void aaESTABLISHconfAct(aaESTABLISHconf *messenger_,
                                        pfProtocol *protocol_);
        virtual void aaRELEASEindAct(aaRELEASEind *messenger_,
                                     pfProtocol *protocol_);
        virtual void aaRELEASEconfAct(aaRELEASEconf *messenger_,
                                      pfProtocol *protocol_);
        virtual void aaDATAindAct(aaDATAind *messenger_,
                                  pfProtocol *protocol_);
        virtual void aaRESYNCindAct(aaRESYNCind *messenger_,
                                    pfProtocol *protocol_);
        virtual void aaRESYNCconfAct(aaRESYNCconf *messenger_,
                                     pfProtocol *protocol_);
        virtual void aaRECOVERindAct(aaRECOVERind *messenger_,
                                     pfProtocol *protocol_);
        virtual void aaUNITDATAindAct(aaUNITDATAind *messenger_,
                                      pfProtocol *protocol_);
        virtual void aaRETRIEVEindAct(aaRETRIEVEind *messenger_,
                                      pfProtocol *protocol_);
        virtual void aaRETRIEVE_COMPLETEindAct(
            aaRETRIEVE_COMPLETEind *messenger_,
            pfProtocol *protocol_);

        // Actions for incoming MAAL-primitives from management plane
        virtual void maalPROVING_UNSUCCESFULrespAct(
            maalPROVING_UNSUCCESFULresp *messenger_,
            pfProtocol *protocol_);
        virtual void maalFORCE_PROVINGreqAct(
            maalFORCE_PROVINGreq *messenger_,
            pfProtocol *protocol_);
        virtual void maalFORCE_EMERGENCYreqAct(
            maalFORCE_EMERGENCYreq *messenger_,
            pfProtocol *protocol_);
        virtual void maalCLEAR_FORCE_MODESreqAct(
            maalCLEAR_FORCE_MODESreq *messenger_,
            pfProtocol *protocol_);
        virtual void maalRELEASEreqAct(
            maalRELEASEreq *messenger_,
            pfProtocol *protocol_);
        virtual void maalLOCAL_PROCESSOR_OUTAGEreqAct(
            maalLOCAL_PROCESSOR_OUTAGEreq *messenger_,
            pfProtocol *protocol_);
        virtual void maalLOCAL_PROCESSOR_RECOVEREDreqAct(
            maalLOCAL_PROCESSOR_RECOVEREDreq *messenger_,
            pfProtocol *protocol_);

        // Actions for timer timeouts
        virtual void nsscfT1timeoutAct(nsscfProtocol *protocol_);
        virtual void nsscfT2timeoutAct(nsscfProtocol *protocol_);
        virtual void nsscfT3timeoutAct(nsscfProtocol *protocol_);

        // Compound actions commonly used in protocol SDL descriptions
        virtual void releaseConnection(nsscfProtocol *protocol_,
                                       nsscfPDU pdu_,
                                       bool sendIndication_);

    protected:
        nsscfState(void);
        virtual ~nsscfState(void);
};


#endif // __NSSCFSTATE_H__

