//Editor-Info: -*- C++ -*-
//
//Subject: GSMP
//
//File: gsmpstate.h
//
//Version: $Revision: 1.4 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/06/05 08:17:13 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Harri Sunila
//
//Description:
//      Base Class for all Adjacency Protocol and GSMP Protocol FSM state
//      classes
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//      
//Licence:
//     
//
//History:
//

#ifndef __GSMPSTATE_H__
#define __GSMPSTATE_H__

#include "pf/state.h"
#include "pf/protocol.h"

class gsmpMessage;

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 gsmpVCStatisticsRequestMessage;
class gsmpVCStatisticsResponseMessage;
class gsmpPortStatisticsRequestMessage;
class gsmpPortStatisticsResponseMessage;

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

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

class gsmpAdjacencyProtocolMessage;
class gsmpAdjacencyProtocolACKmessage;
class gsmpAdjacencyProtocolSYNmessage;
class gsmpAdjacencyProtocolSYNACKmessage;
class gsmpAdjacencyProtocolRSTACKmessage;

class gsmpLinkEstablished;
class gsmpLinkNotEstablished;

class pfProtocol;

//
// Class: gsmpState
//
// Description:
//

class gsmpState : public pfState
{
    public:
        static gsmpState *instance(void);
        
        // 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_);
        
        // 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_);
        
        // 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_);
  
        // 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_);
  
        // 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_);
        
        // Adjacency Protocol
        virtual void gsmpAdjacencyProtocolMessageAct(
            gsmpAdjacencyProtocolMessage *message_,
            pfProtocol *protocol_);
        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);

        // Internal messages
        virtual void gsmpLinkEstablishedAct(gsmpLinkEstablished *message_,
                                            pfProtocol *protocol_);
        virtual void gsmpLinkNotEstablishedAct(
            gsmpLinkNotEstablished *message_,
            pfProtocol *protocol_);
        
    protected:
        gsmpState(void);
        virtual ~gsmpState(void);
        
        virtual void sendNonAdjacencyMessage(gsmpMessage *message_,
                                             pfProtocol *protocol_);
};

#endif	// __GSMPSTATE_H__
