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

#ifndef __GSMP_GSMPSTATISTICSMESSAGES_H__
#define __GSMP_GSMPSTATISTICSMESSAGES_H__

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

//
// Class: gsmpVCActivityRecord
//
// Description:
//

class gsmpVCActivityRecord
{
    public:
        gsmpVCActivityRecord(void);
        gsmpVCActivityRecord(pfUlong inputPort_,
                             pfUlong flags_,
                             pfUlong inputVPI_,
                             pfUlong inputVCI_,
                             string &VCTrafficCount_);
        gsmpVCActivityRecord(const gsmpVCActivityRecord& other_);
        virtual ~gsmpVCActivityRecord(void);

        gsmpVCActivityRecord &operator=(const gsmpVCActivityRecord &other);

        pfUlong getInputPort(void) const;
        pfUlong getInputVPI(void) const;
        pfUlong getInputVCI(void) const;
        pfUlong getFlags(void) const;
        string getVCTrafficCount(void) const;
        
    private:
        pfUlong _inputPort;
        pfUlong _flags;
        pfUlong _inputVPI;
        pfUlong _inputVCI;
        string _VCTrafficCount;
};

typedef vector<gsmpVCActivityRecord> gsmpVCactivityRecordVector;
typedef gsmpVCactivityRecordVector::iterator gsmpVCactivityRecordIterator;

//
// Class: gsmpVCActivityMessage
//
// Description:
//

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

        pfUlong getNumberOfRecords(void) const;
        gsmpVCactivityRecordVector getActivityRecord(void) const;

        virtual void decodeFrame(pfFrame &frame_);
        virtual pfFrame encodeFrame(void);
        
    protected:
        gsmpVCActivityMessage(void);

	pfUlong _numberOfRecords;
        gsmpVCactivityRecordVector _activityRecords;
};

//
// Class: gsmpVCActivityRequestMessage
//
// Description:
//

class gsmpVCActivityRequestMessage : public gsmpVCActivityMessage
{
    public:
        gsmpVCActivityRequestMessage(void);
        gsmpVCActivityRequestMessage(
            pfUlong transactionIdentifier_,
            gsmpVCactivityRecordVector &activityRecords_);
        gsmpVCActivityRequestMessage(
            const gsmpVCActivityRequestMessage &other_);
        virtual ~gsmpVCActivityRequestMessage(void);

        void addActivityRecord(pfUlong inputPort_,
                               pfUlong inputVPI_,
                               pfUlong inputVCI_);

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

//
// Class: gsmpVCActivityResponseMessage
//
// Description:
//

class gsmpVCActivityResponseMessage : public gsmpVCActivityMessage
{
    public:
        gsmpVCActivityResponseMessage(void);
        gsmpVCActivityResponseMessage(pfUlong transactionIdentifier_);
        gsmpVCActivityResponseMessage(
            const gsmpVCActivityResponseMessage &other_);
        virtual ~gsmpVCActivityResponseMessage(void);

        void addActivityRecord(pfUlong inputPort_,
                               pfUlong flags_,
                               pfUlong inputVPI_,
                               pfUlong inputVCI_,
                               string VCTrafficCount_);

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

//
// Class: gsmpStatisticsRequestMessage
//
// Description:
//

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

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

        pfUlong getPort(void) const;
        pfUlong getVPI(void) const;
        pfUlong getVCI(void) const;

    protected:
        gsmpStatisticsRequestMessage(void);

        pfUlong _port;
        pfUlong _VPI;
        pfUlong _VCI;
};

//
// Class: gsmpVCStatisticsRequestMessage
//
// Description:
//

class gsmpVCStatisticsRequestMessage : public gsmpStatisticsRequestMessage
{
    public:
        gsmpVCStatisticsRequestMessage(void);
        gsmpVCStatisticsRequestMessage(pfUlong transactionIdentifier_,
                                       pfUlong port_,
                                       pfUlong VPI_,
                                       pfUlong VCI_);
        gsmpVCStatisticsRequestMessage(
            const gsmpVCStatisticsRequestMessage &other_);
        virtual ~gsmpVCStatisticsRequestMessage(void);

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

//
// Class: gsmpPortStatisticsRequestMessage
//
// Description:
//

class gsmpPortStatisticsRequestMessage : public gsmpStatisticsRequestMessage
{
    public:
        gsmpPortStatisticsRequestMessage(void);
        gsmpPortStatisticsRequestMessage(pfUlong transactionIdentifier_,
                                         pfUlong port_);
        gsmpPortStatisticsRequestMessage(
            const gsmpPortStatisticsRequestMessage &other_);
        virtual ~gsmpPortStatisticsRequestMessage(void);

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

//
// Class: gsmpStatisticsResponseMessage
//
// Description:
//

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

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

        pfUlong getPort(void) const;
        pfUlong getVPI(void) const;
        pfUlong getVCI(void) const;
        string getInputCellCount(void) const;
        string getInputFrameCount(void) const;
        string getInputCellDiscardCount(void) const;
        string getInputFrameDiscardCount(void) const;
        string getInputHecErrorCount(void) const;
        string getInputInvalidVPIVCICount(void) const;
        string getOutputCellCount(void) const;
        string getOutputFrameCount(void) const;
        string getOutputCellDiscardCount(void) const;
        string getOutputFrameDiscardCount(void) const;

    protected:
        gsmpStatisticsResponseMessage(void);

        void decodeCounter(pfFrame &frame_,
                           string &counter_);
        void encodeCounter(pfFrame &frame_,
                           string &counter_);

        pfUlong _port;
        pfUlong _VPI;
        pfUlong _VCI;
        string _inputCellCount;
        string _inputFrameCount;
        string _inputCellDiscardCount;
        string _inputFrameDiscardCount;
        string _inputHecErrorCount;
        string _inputInvalidVPIVCICount;
        string _outputCellCount;
        string _outputFrameCount;
        string _outputCellDiscardCount;
        string _outputFrameDiscardCount;
};

//
// Class: gsmpVCStatisticsResponseMessage
//
// Description:
//

class gsmpVCStatisticsResponseMessage : public gsmpStatisticsResponseMessage
{
    public:
        gsmpVCStatisticsResponseMessage(void);
        gsmpVCStatisticsResponseMessage(pfUlong transactionIdentifier_,
                                        pfUlong port_,
                                        pfUlong VPI_,
                                        pfUlong VCI_,
                                        string inputCellCount_,
                                        string inputFrameCount_,
                                        string inputCellDiscardCount_,
                                        string inputFrameDiscardCount_,
                                        string inputHecErrorCount_,
                                        string inputInvalidVPIVCICount_,
                                        string outputCellCount_,
                                        string outputFrameCount_,
                                        string outputCellDiscardCount_,
                                        string outputFrameDiscardCount_);
        gsmpVCStatisticsResponseMessage(
            const gsmpVCStatisticsResponseMessage &other_);
        virtual ~gsmpVCStatisticsResponseMessage(void);
        
        virtual gsmpVCStatisticsResponseMessage *clone(void);
        void apply(pfState *state_, pfProtocol *protocol_);
};

//
// Class: gsmpPortStatisticsResponseMessage
//
// Description:
//

class gsmpPortStatisticsResponseMessage : public gsmpStatisticsResponseMessage
{
    public:
        gsmpPortStatisticsResponseMessage(void);
        gsmpPortStatisticsResponseMessage(pfUlong transactionIdentifier_,
                                          pfUlong port_,
                                          string inputCellCount_,
                                          string inputFrameCount_,
                                          string inputCellDiscardCount_,
                                          string inputFrameDiscardCount_,
                                          string inputHecErrorCount_,
                                          string inputInvalidVPIVCICount_,
                                          string outputCellCount_,
                                          string outputFrameCount_,
                                          string outputCellDiscardCount_,
                                          string outputFrameDiscardCount_);
        gsmpPortStatisticsResponseMessage(
            const gsmpPortStatisticsResponseMessage &other_);
        virtual ~gsmpPortStatisticsResponseMessage(void);
        
        virtual gsmpPortStatisticsResponseMessage *clone(void);
        void apply(pfState *state_, pfProtocol *protocol_);
};

#endif // __GSMP_GSMPSTATISTICSMESSAGES_H__
