//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / IE
//
//File: aalparameters.h
//
//Version: $Revision: 1.6 $
//
//State: $State: Exp $
//
//Date: $Date: 1999/03/10 11:44:56 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Sami Raatikainen
//
//Description:
//      BISUP (Q.2763/7.2, Q.2931/4.5.5), UNI3.1 (5.4.5.5)
//      AALtype codes (enum AALtype) apply to Q.2931, UNI3.1, UNI4.0, BISUP
//      allthough not all of them are supported in UNI3.1 and 4.0.
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History: 
//

#ifndef __IE_AALPARAMETERS_H__
#define __IE_AALPARAMETERS_H__

#include "informationelement.h"

class ieAALParameters : public ieInformationElement
{
    public:
        enum AALtype
        {
            voice = B0000_0000,
            AALtype1 = B0000_0001,
            AALtype2 = B0000_0001,
            AALtype34 = B0000_0001,
            AALtype5 = B0000_0001,
            userDefined = B0001_0000
        };

        explicit ieAALParameters(AALtype type_);
        ieAALParameters(const ieAALParameters &other_);
        virtual ~ieAALParameters(void);
        const ieAALParameters &operator=(const ieAALParameters &other_);
        
        pfIE *clone(void) const;
        static ieAALParameters* narrow(pfIE *ie_);
        
        // ALL
        pfUlong getType(void) const;
        
        // AAL1
        void setSubtype(pfUlong value_);
        void setMultiplier(pfUlong value_);
        void setSourceClockRecovery(pfUlong value_);
        void setErrorCorrectionMethod(pfUlong value_);
        void setDataTransferBlocksize(pfUlong value_);
        void setPartiallyFilled(pfUlong value_);
        
        pfUlong getSubtype(void) const;
        pfUlong getMultiplier(void) const;
        pfUlong getSourceClockRecovery(void) const;
        pfUlong getErrorCorrectionMethod(void) const;
        pfUlong getDataTransferBlocksize(void) const;
        pfUlong getPartiallyFilled(void) const;

        bool isSubtype(void) const;
        bool isMultiplier(void) const;
        bool isSourceClockRecovery(void) const;
        bool isErrorCorrectionMethod(void) const;
        bool isDataTransferBlocksize(void) const;
        bool isPartiallyFilled(void) const;
        

        // AAL3/4, AAL5
        void setForwardMaxSDUSize(pfUlong value_);
        void setBackwardMaxSDUSize(pfUlong value_);
        void setMIDRangeLow(pfUlong value_);
        void setMIDRangeHigh(pfUlong value_);
        void setSSCSType(pfUlong value_);

        pfUlong getForwardMaxSDUSize(void) const;
        pfUlong getBackwardMaxSDUSize(void) const;
        pfUlong getMIDRangeLow(void) const;
        pfUlong getMIDRangeHigh(void) const;
        pfUlong getSSCSType(void) const;

        bool isForwardMaxSDUSize(void) const;
        bool isBackwardMaxSDUSize(void) const;
        bool isMIDRangeLow(void) const;
        bool isMIDRangeHigh(void) const;
        bool isSSCSType(void) const;

        
        // user defined AAL
        void setUserDefinedInfo(pfUlong value_);
        pfUlong getUserDefinedInfo(void) const;
        bool isUserDefinedInfo(void) const;
                
    private:
        AALtype _type;

        // AAL1
        pfUlong _subtype;
        pfUlong _CBRRate;
        pfUlong _multiplier;
        pfUlong _sourceClockRecovery;   // default = null
        pfUlong _errorCorrectionMethod; // default = null
        pfUlong _dataTransferBlocksize; // default = no SDT is used
        pfUlong _partiallyFilled;       // default = 47 octets
                
        // AAL3/4, AAL5
        pfUlong _forwardMaxSDUSize;     // default = 65 535 octets
        pfUlong _backwardMaxSDUSize;    // default = 65 535 octets
        pfUlong _MIDRangeLow;           // default = 0
        pfUlong _MIDRangeHigh;          // default = 0
        pfUlong _SSCSType;              // default = null
        
        // user defined AAL
        pfUlong _userDefinedInfo;

        bool _subtypeSet;
        bool _CBRRateSet;
        bool _multiplierSet;
        bool _sourceClockRecoverySet;  
        bool _errorCorrectionMethodSet; 
        bool _dataTransferBlocksizeSet; 
        bool _partiallyFilledSet;
        
        bool _forwardMaxSDUSizeSet;    
        bool _backwardMaxSDUSizeSet;  
        bool _MIDRangeLowSet;        
        bool _MIDRangeHighSet;
        bool _SSCSTypeSet;
        
        bool _userDefinedInfoSet;
};

#endif // __IE_AALPARAMETERS_H__
