//Editor-Info: -*- C++ -*-
//
//Subject: GSMP
//
//File: gsmpconfigurationmessage.h
//
//Version: $Revision: 1.5 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/06/18 05:21:56 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Harri Sunila
//
//Description:
//      Messenger classes for all GSMP Configuration Messages 
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//      
//Licence:
//     
//
//History:
//

#ifndef __GSMP_GSMPCONFIGURATIONMESSAGES_H__
#define __GSMP_GSMPCONFIGURATIONMESSAGES_H__

#include <typeinfo>
#include <string>
#include <vector>
#include "pf/frame.h"
#include "gsmpmessage.h"
#include "gsmpstate.h"

//
// Class: gsmpConfigurationRequestMessage
//
// Description:
//     This is the base class for all different
//     GSMP Configuration Request Messages
//

class gsmpConfigurationRequestMessage : public gsmpMessage
{
    public:
        gsmpConfigurationRequestMessage(
	    const gsmpConfigurationRequestMessage &other_);
        virtual ~gsmpConfigurationRequestMessage(void);

        virtual pfFrame encodeFrame(void);
        virtual void decodeFrame(pfFrame &frame_);

        virtual gsmpConfigurationRequestMessage *clone(void);

        pfUlong getPort(void) const;

    protected:
        gsmpConfigurationRequestMessage(void);

        pfUlong _port;
};

//
// Class: gsmpSwitchConfigurationRequestMessage
//
// Description:
//     This is the messenger class for GSMP Switch Configuration Request
//     Message 
//

class gsmpSwitchConfigurationRequestMessage :
    public gsmpConfigurationRequestMessage
{
    public:
        gsmpSwitchConfigurationRequestMessage(void);
        gsmpSwitchConfigurationRequestMessage(pfUlong transactionIdentifier_);
        gsmpSwitchConfigurationRequestMessage(
	    const gsmpSwitchConfigurationRequestMessage &other_);
        virtual ~gsmpSwitchConfigurationRequestMessage(void);
        virtual gsmpSwitchConfigurationRequestMessage *clone(void);

        void apply(pfState *state_, pfProtocol *protocol_);
};

//
// Class: gsmpPortConfigurationRequestMessage
//
// Description:
//     This is the messenger class for GSMP Port Configuration Request Message
//

class gsmpPortConfigurationRequestMessage :
    public gsmpConfigurationRequestMessage
{
    public:
        gsmpPortConfigurationRequestMessage(void);
        gsmpPortConfigurationRequestMessage(pfUlong transactionIdentifier_,
                                            pfUlong port_);
        gsmpPortConfigurationRequestMessage(
	    const gsmpPortConfigurationRequestMessage &other_);
        virtual ~gsmpPortConfigurationRequestMessage(void);
        virtual gsmpPortConfigurationRequestMessage *clone(void);

        void apply(pfState *state_, pfProtocol *protocol_);
};

//
// Class: gsmpAllPortsConfigurationRequestMessage
//
// Description:
//     This is the messenger class for GSMP All Ports Configuration Request
//     Message 
//

class gsmpAllPortsConfigurationRequestMessage :
    public gsmpConfigurationRequestMessage
{
    public:
        gsmpAllPortsConfigurationRequestMessage(void);
        gsmpAllPortsConfigurationRequestMessage(
            pfUlong transactionIdentifier_);
        gsmpAllPortsConfigurationRequestMessage(
	    const gsmpAllPortsConfigurationRequestMessage &other_);
        virtual ~gsmpAllPortsConfigurationRequestMessage(void);
        virtual gsmpAllPortsConfigurationRequestMessage *clone(void);

        void apply(pfState *state_, pfProtocol *protocol_);
};

//
// Class: gsmpSwitchConfigurationResponseMessage
//
// Description:
//     This is messenger class for GSMP Switch Configuration Response Message
//

class gsmpSwitchConfigurationResponseMessage : public gsmpMessage 
{
    public:
        gsmpSwitchConfigurationResponseMessage(void);
        gsmpSwitchConfigurationResponseMessage(pfUlong transactionIdentifier_,
                                               pfUlong firmwareVersionNumber_,
                                               pfUlong switchType_,
                                               const string &switchName_);
        gsmpSwitchConfigurationResponseMessage(
	    const gsmpSwitchConfigurationResponseMessage &other_);
        virtual ~gsmpSwitchConfigurationResponseMessage(void);
        virtual gsmpSwitchConfigurationResponseMessage *clone(void);

        pfUlong getFirmwareVersionNumber(void) const;
        pfUlong getSwitchType(void) const;
        string getSwitchName(void) const;
        
        virtual pfFrame encodeFrame(void);
        virtual void decodeFrame(pfFrame &frame_);
        void apply(pfState *state_, pfProtocol *protocol_);
        
    private:
        pfUlong _firmwareVersionNumber;
        pfUlong _switchType;
        string _switchName;
};

//
// Class: gsmpPortConfigurationResponseMessage
//
// Description:
//     This is the messenger class for GSMP Port Configuration Response Message
//

class gsmpPortConfigurationResponseMessage : public gsmpMessage
{
    public:
        gsmpPortConfigurationResponseMessage(void);
        gsmpPortConfigurationResponseMessage(pfUlong transactionIdentifier_,
                                             pfUlong port_,
                                             pfUlong portSessionNumber_,
                                             pfUlong minVPI_,
                                             pfUlong maxVPI_,
                                             pfUlong minVCI_,
                                             pfUlong maxVCI_,
                                             pfUlong cellRate_,
                                             pfByte portStatus_,
                                             pfByte portType_,
                                             pfByte lineStatus_,
                                             pfByte priorities_);
        gsmpPortConfigurationResponseMessage(
	    const gsmpPortConfigurationResponseMessage &other_);
        virtual ~gsmpPortConfigurationResponseMessage(void);
        virtual gsmpPortConfigurationResponseMessage *clone(void);

        virtual pfFrame encodeFrame(void);
        virtual void decodeFrame(pfFrame &frame_);

        void apply(pfState *state_, pfProtocol *protocol_);

        pfUlong getPort(void) const;
        pfUlong getPortSessionNumber(void) const;
        pfUlong getMinVPI(void) const;
        pfUlong getMaxVPI(void) const;
        pfUlong getMinVCI(void) const;
        pfUlong getMaxVCI(void) const;
        pfUlong getCellRate(void) const;
        pfByte getPortStatus(void) const;
        pfByte getPortType(void) const;
        pfByte getLineStatus(void) const;
        pfByte getPriorities(void) const;
        
    private:
        pfUlong _port;
        pfUlong _portSessionNumber;
        pfUlong _minVPI;
        pfUlong _maxVPI;
        pfUlong _minVCI;
        pfUlong _maxVCI;
        pfUlong _cellRate;
        pfByte _portStatus;
        pfByte _portType;
        pfByte _lineStatus;
        pfByte _priorities;
};

//
// Class: gsmpPortRecord
//
// Description:
//     gsmpPortRecord class is used to store port record information in
//     GSMP All Ports Configuration Response Message messengers.
//

class gsmpPortRecord
{
    public:
        gsmpPortRecord(void);
        gsmpPortRecord(pfUlong port_,
                       pfUlong portSessionNumber_,
                       pfUlong minVPI_,
                       pfUlong maxVPI_,
                       pfUlong minVCI_,
                       pfUlong maxVCI_,
                       pfUlong cellRate_,
                       pfUlong portStatus_,
                       pfUlong portType_,
                       pfUlong lineStatus_,
                       pfUlong priorities_);
        gsmpPortRecord(const gsmpPortRecord &other_); 
        virtual ~gsmpPortRecord(void);

        gsmpPortRecord &operator=(const gsmpPortRecord &other_);

        pfUlong getPort(void) const;
        pfUlong getPortSessionNumber(void) const;
        pfUlong getMinVPI(void) const;
        pfUlong getMaxVPI(void) const;
        pfUlong getMinVCI(void) const;
        pfUlong getMaxVCI(void) const;
        pfUlong getCellRate(void) const;
        pfByte getPortStatus(void) const;
        pfByte getPortType(void) const;
        pfByte getLineStatus(void) const;
        pfByte getPriorities(void) const;
        
    private:
        pfUlong _port;
        pfUlong _portSessionNumber;
        pfUlong _minVPI;
        pfUlong _maxVPI;
        pfUlong _minVCI;
        pfUlong _maxVCI;
        pfUlong _cellRate;
        pfUlong _portStatus;
        pfUlong _portType;
        pfUlong _lineStatus;
        pfUlong _priorities;
        
};


//
// Class: gsmpAllPortsConfigurationResponseMessage
//
// Description:
//     This is the messenger class for GSMP All Ports Configuration Response
//     Message

class gsmpAllPortsConfigurationResponseMessage : public gsmpMessage
{
    public:
        typedef vector<gsmpPortRecord> gsmpPortRecordVector;
        typedef gsmpPortRecordVector::iterator gsmpPortRecordIterator; 

        gsmpAllPortsConfigurationResponseMessage(void);
        gsmpAllPortsConfigurationResponseMessage(
            pfByte result_,
            pfByte code_,
            pfUlong transactionIdentifier_);
        gsmpAllPortsConfigurationResponseMessage(
	    const gsmpAllPortsConfigurationResponseMessage &other_);
        virtual ~gsmpAllPortsConfigurationResponseMessage(void);
        virtual gsmpAllPortsConfigurationResponseMessage *clone(void);

        void addPortRecord(pfUlong port_,
                           pfUlong portSessionNumber_,
                           pfUlong minVPI_,
                           pfUlong maxVPI_,
                           pfUlong minVCI_,
                           pfUlong maxVCI_,
                           pfUlong cellRate_,
                           pfByte portStatus_,
                           pfByte portType_,
                           pfByte lineStatus_,
                           pfByte priorities_);
        gsmpPortRecordVector getPortRecords(void) const;

        pfUlong getNumberOfRecords(void) const;
        pfUlong getPortRecordLength(void) const;
        
        virtual pfFrame encodeFrame(void);
        virtual void decodeFrame(pfFrame &frame_);
        void apply(pfState *state_, pfProtocol *protocol_);
        
    protected:
        pfUlong _numberOfRecords;
        pfUlong _portRecordLength;
        gsmpPortRecordVector _portRecords;
};

#endif // __GSMP_GSMPCONFIGURATIONMESSAGES_H__
