//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project
//
//File: gsmpadjacencystate.h
//
//State: $State: Exp $
//
//Version: $Revision: 1.4 $
//
//Date: $Date: 1998/06/18 05:21:56 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
// 
//Author:
//      Harri Sunila
//
//Description:
//      The Base class for other state classes used in GSMP Adjacency Protocol
//      FSM
//
//Copyright:    
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999 
//      
//Licence:
//     
//
//History:
//
//

#ifndef __GSMP_GSMPADJACENCYSTATE_H__
#define __GSMP_GSMPADJACENCYSTATE_H__

class gsmpAdjcencyProtocolSYNMessage;
class gsmpAdjcencyProtocolSYNACKMessage;
class gsmpAdjcencyProtocolACKMessage;
class gsmpAdjcencyProtocolRSTACKMessage;

class gsmpAddBranchMessage;
class gsmpDeleteBranchMessage;
class gsmpDeleteTreeMessage;
class gsmpVerifyTreeMessage;
class gsmpDeleteAllMessage;
class gsmpMoveBranchMessage;

class gsmpBringUpMessage;
class gsmpTakeDownMessage;
class gsmpInternalLoopbackMessage;
class gsmpExternalLoopbackMessage;
class gsmpBothwayLoopbackMessage;
class gsmpResetInputPortMessage;
class gsmpResetEventFlagsMessage;

class gsmpVCActivityRequestMessage;
class gsmpVCActivityResponseMessage;
class gsmpVCStatisticsRequestMassage;
class gsmpVCStatisticsResponseMassage;
class gsmpPortStatisticsRequestMassage;
class gsmpPortStatisticsResponseMassage;

class gsmpSwitchConfigurationRequestMessage;
class gsmpSwitchConfigurationResponseMessage;
class gsmpPortConfigurationRequestMessage;
class gsmpPortConfigurationResponseMessage;
class gsmpAllPortsConfigurationRequestMessage;
class gsmpAllPortsConfigurationResponseMessage;

class gsmpPortUpEventMessage;
class gsmpPortDownEventMessage;
class gsmpInvalidVPIVCIEventMessage;
class gsmpNewPortEventMessage;
class gsmpDeadPortEventMessage;

#include "gsmpstate.h"
#include "iface/cpcsif/cpcsupprimitives.h"

class gsmpAdjacencyProtocol;

//
// Class: gsmpAdjacencyState
//
// Description:
//     See file description
//

class gsmpAdjacencyState : public gsmpState, public cpcsUpInputs
{
    public:
        virtual void gsmpAdjacencySYNCtimeoutAct(
            gsmpAdjacencyProtocol *protocol_);

        virtual void gsmpAdjacencyResyncTimeoutAct(
            gsmpAdjacencyProtocol *protocol_);

        virtual void gsmpAdjacencyRetryTimeoutAct(
            gsmpAdjacencyProtocol *protocol_);
        
        // Action for incoming CPCS-UNITDATA.indications

        virtual void cpcsUNITDATAindAct(cpcsUNITDATAind *message_,
                                        pfProtocol *protocol_) const;

        // Actions for incoming GSMP Adjacency Protocol messages
        
        virtual void gsmpAdjacencyProtocolSYNmessageAct(
            gsmpAdjacencyProtocolSYNmessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpAdjacencyProtocolSYNACKmessageAct(
            gsmpAdjacencyProtocolSYNACKmessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpAdjacencyProtocolACKmessageAct(
            gsmpAdjacencyProtocolACKmessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpAdjacencyProtocolRSTACKmessageAct(
            gsmpAdjacencyProtocolRSTACKmessage *message_,
            pfProtocol *protocol_);
        
        // Actions for incoming GSMP Connection Management Messages

        virtual void gsmpAddBranchMessageAct(gsmpAddBranchMessage *message_,
                                             pfProtocol *protocol_);
        virtual void gsmpDeleteBranchMessageAct(
            gsmpDeleteBranchMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpDeleteTreeMessageAct(gsmpDeleteTreeMessage *message_,
                                              pfProtocol *protocol_);
        virtual void gsmpVerifyTreeMessageAct(gsmpVerifyTreeMessage *message_,
                                              pfProtocol *protocol_);
        virtual void gsmpDeleteAllMessageAct(gsmpDeleteAllMessage *message_,
                                             pfProtocol *protocol_);
        virtual void gsmpMoveBranchMessageAct(gsmpMoveBranchMessage *message_,
                                              pfProtocol *protocol_);
        
        // Actions for incoming GSMP Port Management Messages

        virtual void gsmpBringUpMessageAct(gsmpBringUpMessage *message_,
                                           pfProtocol *protocol_);
        virtual void gsmpTakeDownMessageAct(gsmpTakeDownMessage *message_,
                                            pfProtocol *protocol_);
        virtual void gsmpInternalLoopbackMessageAct(
            gsmpInternalLoopbackMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpExternalLoopbackMessageAct(
            gsmpExternalLoopbackMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpBothwayLoopbackMessageAct(
            gsmpBothwayLoopbackMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpResetInputPortMessageAct(
            gsmpResetInputPortMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpResetEventFlagsMessageAct(
            gsmpResetEventFlagsMessage *message_,
            pfProtocol *protocol_);
        
        // Actions for incoming GSMP Statistics Messages
        
        virtual void gsmpVCActivityRequestMessageAct(
            gsmpVCActivityRequestMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpVCActivityResponseMessageAct(
            gsmpVCActivityResponseMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpPortStatisticsRequestMessageAct(
            gsmpPortStatisticsRequestMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpPortStatisticsResponseMessageAct(
            gsmpPortStatisticsResponseMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpVCStatisticsRequestMessageAct(
            gsmpVCStatisticsRequestMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpVCStatisticsResponseMessageAct(
            gsmpVCStatisticsResponseMessage *message_,
            pfProtocol *protocol_);
        
        // Actions for incoming GSMP Switch Configuration Messages
        
        virtual void gsmpSwitchConfigurationRequestMessageAct(
            gsmpSwitchConfigurationRequestMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpPortConfigurationRequestMessageAct(
            gsmpPortConfigurationRequestMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpAllPortsConfigurationRequestMessageAct(
            gsmpAllPortsConfigurationRequestMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpSwitchConfigurationResponseMessageAct(
            gsmpSwitchConfigurationResponseMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpPortConfigurationResponseMessageAct(
            gsmpPortConfigurationResponseMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpAllPortsConfigurationResponseMessageAct(
            gsmpAllPortsConfigurationResponseMessage *message_,
            pfProtocol *protocol_);
        
        // Actions for incoming GSMP Event Messages
        
        virtual void gsmpPortUpEventMessageAct(
            gsmpPortUpEventMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpPortDownEventMessageAct(
            gsmpPortDownEventMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpInvalidVPIVCIEventMessageAct(
            gsmpInvalidVPIVCIEventMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpNewPortEventMessageAct(
            gsmpNewPortEventMessage *message_,
            pfProtocol *protocol_);
        virtual void gsmpDeadPortEventMessageAct(
            gsmpDeadPortEventMessage *message_,
            pfProtocol *protocol_);

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

        void resetTheLink(pfProtocol *protocol_);
        virtual void sendNonAdjacencyMessage(gsmpMessage *message_,
                                             pfProtocol *protocol_);
};

#endif // __GSMP_GSMPADJACENCYSTATE_H__
