//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / SIGINFO
//
//File: siginfos.h
//
//Version: $Revision: 1.12 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/10/19 18:11:58 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications and Multimedia
//
//Author:
//      Timo Pärnänen
//
//Description:
//      Class definitions for information elements used in signalling
//      protocol PDUs (eg. DSS2 PDUs)
//
//Copyright:
//
//
//Licence:
//
//
//History: 

#ifndef __SIG_INFOS_H__
#define __SIG_INFOS_H__

#include <std/typeinfo.h>
#include "pf/types.h"
#include "siginfodef.h"

//
//Class: sigInfo
//
//Description:
//    Base class for information elements used in signalling protocol
//    PDUs.
//

class sigInfo
{
    public:
        virtual bool verifyIEcontent(void);
    
        void setIEpresent(void);
        bool isIEpresent(void) const;

        void setIEmandatory(void);
        bool isIEmandatory(void) const;

        void setIEallowed(void);
        bool isIEallowed(void) const;

        void setIEinvalidContent(void);
        bool isIEcontentValid(void) const;
        
        void setIEcodingStandard(long ieCodingStandard_);
        long getIEcodingStandard(void) const;

        void setIEinstructionFlag(long ieInstructionFlag_);
        long getIEinstructionFlag(void) const;

        void setIEactionIndicator(long ieActionIndicator_);
        long getIEactionIndicator(void) const;

    protected:
        sigInfo(void);
        virtual ~sigInfo(void);
        
        bool _isContentValid;
        
    private:
        bool _isPresent;
        bool _isMandatory;
        bool _isAllowed;
        
        long _ieCodingStandard;
        long _ieInstructionFlag;
        long _ieActionIndicator;
};

// ----------------------------------------------------------------------
//
//Class: sigPhoneNumber
//
//Description:
//    Class definition for phoneNumber abstraction. This class can be used
//    for different kind of phone numbers like called or calling party number.
//

class sigPhoneNumber : public sigInfo
{
    public:
        sigPhoneNumber(void);
        virtual ~sigPhoneNumber(void);

        // here specific for calledPartNymber
        virtual bool verifyIEcontent(void); 
        
        bool isEqual(char *number_);

        void setType(long type_);
        long getType(void) const;

        void setPlan(long plan_);
        long getPlan(void) const;

        void setNumber(char *number_);
        char *getNumber(void) const;
        
        long getLength(void) const;

    protected:
        long _type;
        long _plan;

    private:        
        char *_number;
        long _length;        
};

// ----------------------------------------------------------------------
//
//Class: sigSubAddress
//
//Description:
//

class sigSubAddress : public sigPhoneNumber
{
    public:
        sigSubAddress(void);
        virtual ~sigSubAddress(void);

        virtual bool verifyIEcontent(void);
};

// ----------------------------------------------------------------------
//
//Class: information elements
//
//Description:
//    Class definition for information elements inherited from sigInfo
//

class sigPeakCellRate : public sigInfo
{
    public:
        sigPeakCellRate(void);
        virtual ~sigPeakCellRate(void);

        bool verifyIEcontent(void);        
        
        void setForwardCLP0(long forwardCLP0_);
        long getForwardCLP0(void) const;
        
        void setBackwardCLP0(long backwardCLP0_);
        long getBackwardCLP0(void) const;
        
        void setForwardCLP1(long forwardCLP1_);
        long getForwardCLP1(void) const;
        
        void setBackwardCLP1(long backwardCLP1_);
        long getBackwardCLP1(void) const;

    private:
        long _forwardCLP0;
        long _backwardCLP0;
        long _forwardCLP1;
        long _backwardCLP1;
};

// ----------------------------------------------------------------------

class sigBroadbandBearerCapability : public sigInfo
{
    public:
        sigBroadbandBearerCapability(void);
        virtual ~sigBroadbandBearerCapability(void);

        bool verifyIEcontent(void);        
        void copyAttributes(sigBroadbandBearerCapability &other_);
        
        void setBearerClass(long bearerClass_);
        long getBearerClass(void) const;

        void setTrafficType(long trafficType_);
        long getTrafficType(void) const;
        
        void setTimingRequirements(long timingRequirements_);
        long getTimingRequirements(void) const;

        void setSusceptibleToClipping(long susceptibleToClipping_);
        long getSusceptibleToClipping(void) const;

        void setUserPlaneConnectionConfig(long userPlaneConnectionConfig_);
        long getUserPlaneConnectionConfig(void) const;
        
    private:
        long _bearerClass;
        long _trafficType;
        long _timingRequirements;
        long _susceptibleToClipping;
        long _userPlaneConnectionConfig;
};

// ----------------------------------------------------------------------

class sigCause : public sigInfo
{
    public:
        sigCause(void);
        virtual ~sigCause(void);        

        void setLocation(long location_);
        long getLocation(void) const;

        void setCauseValue(long causeValue_);
        long getCauseValue(void) const;

    private:
        long _location;
        long _causeValue;
};

// ----------------------------------------------------------------------

class sigQualityOfService : public sigInfo
{
    public:
        sigQualityOfService(void);
        virtual ~sigQualityOfService(void);        

        bool verifyIEcontent(void);        
        
        void setQosClassForward(long qosClassForward_);
        long getQosClassForward(void) const;

        void setQosClassBackward(long qosClassBackward_);        
        long getQosClassBackward(void) const;        
        
    private:
        long _qosClassForward;
        long _qosClassBackward;        
};

// ----------------------------------------------------------------------

class sigCallState : public sigInfo
{
    public:
        sigCallState(void);
        virtual ~sigCallState(void);        

        bool verifyIEcontent(void);
        
        void setStateValue(long stateValue_);
        long getStateValue(void) const;
        
    private:
        long _stateValue;
};

// ----------------------------------------------------------------------

class sigConnectionIdentifier : public sigInfo
{
    public:
        sigConnectionIdentifier(void);
        virtual ~sigConnectionIdentifier(void);

        const sigConnectionIdentifier &operator =
            (const sigConnectionIdentifier &other_); 

        bool verifyIEcontent(void);
        
        void setVPassociatedSignalling(long vpAssociatedSignalling_);
        long getVPassociatedSignalling(void) const;

        void setPreferredExclusive(long preferredExclusive_);
        long getPreferredExclusive(void) const;
        
        void setVPCI(long vpci_);
        long getVPCI(void) const;

        void setVCI(long vci_);        
        long getVCI(void) const;        
        
    private:
        long _vpAssociatedSignalling;
        long _preferredExclusive;
        long _vpci;
        long _vci;        
};

// ----------------------------------------------------------------------

class sigRestartIndicator : public sigInfo
{
    public:
        sigRestartIndicator(void);
        virtual ~sigRestartIndicator(void);
        
        bool verifyIEcontent(void);
        
        void setClass(long class_);
        long getClass(void) const;

    private:
        long _class;
};

// ----------------------------------------------------------------------
//
//Class: sigUnImplementedIE
//
//Description:
//    Used for decoding when some unimplemented in frame.
//    This will be removed when all information elements are implemented
//

class sigUnImplementedIE : public sigInfo
{
    public:
        sigUnImplementedIE(void);
        virtual ~sigUnImplementedIE(void);
};

#endif // __SIG_INFOS_H__
