//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project
//
//File: uniie.h
//
//Version: $Revision: 1.1 $
//
//State: $State: Exp $
//
//Date: $Date: 1999/01/22 15:53:43 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//	Samu Uimonen
//	Saku Vaittinen
//
//Description:
//
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History: 

#ifndef __UNI_UNIIECODER_H__
#define __UNI_UNIIECODER_H__

#include <typeinfo>
#include "protocol/sig/iecoder.h"

const pfUlong uniIEMinimumSize = 4;
const pfUlong uniIEMaximumSize = 100;

// Constant for IE Coding Standard & Instruction Field
// (= ITU-T standardized & IE inst. field not significant)
const pfByte standardInstructionField = B1000_0000;
const pfByte specificInstructionField = B1110_0000;


class uniIECoder : public IECoder
{
    public:
        virtual ~uniIECoder(void);
        virtual void decodeIE(pfFrame &frame_, pfMessenger *msg_);
        virtual void encodeIE(pfFrame &frame_, pfMessenger *msg_);
        
    protected:
        uniIECoder(const string &IEname_,
                   const pfByte &IEtype_,
                   pfBoolean isMandatory_);
        
        virtual void decodeContent(pfMessenger *msg_) = 0;
        virtual void encodeContent(pfFrame &frame_, pfMessenger *msg_) = 0;
        
        // Variable length information element identifiers        
        enum IEType
        {
            uniIEUndefined               = B0000_0000,
            uniIECause                   = B0000_1000,
            uniIECallState               = B0001_0100,
            uniIEEndpointReference       = B0101_0100,
            uniIEEndpointState           = B0101_0101,
            uniIEAALParameters           = B0101_1000,
            uniIEATMTrafficDescriptor    = B0101_1001,
            uniIEConnectionIdentifier    = B0101_1010,
            uniIEQoSParameters           = B0101_1100,
            uniIEBHighLayerInfo          = B0101_1101,
            uniIEBBearerCapability       = B0101_1110,
            uniIEBLowLayerInfo           = B0101_1111,
            uniIEBLockingShift           = B0110_0000,
            uniIEBNonlockingShift        = B0110_0001,
            uniIEBSendingComplete        = B0110_0010,
            uniIEBRepeatIndicator        = B0110_0011,
            uniIECallingPartyNumber      = B0110_1100,
            uniIECallingPartySubaddress  = B0110_1101,
            uniIECalledPartyNumber       = B0111_0000,
            uniIECalledPartySubaddress   = B0111_0001,
            uniIETransitNetworkSelection = B0111_1000,
            uniIERestartIndicator        = B0111_1001
        };

};


class uniConnectionIdIdentifierIECoder : public uniIECoder
{
    public:
        uniConnectionIdIdentifierIECoder(const string &IEname_,
                                        const pfByte &IEtype_,
                                        pfBoolean isMandatory_);

        virtual ~uniConnectionIdIdentifierIECoder(void);

    private:
        virtual void decodeContent(pfMessenger *msg_);
        virtual void encodeContent(pfFrame &frame_, pfMessenger *msg_);
};

class uniQoSIECoder : public uniIECoder
{
    public:
        uniQoSIECoder(const string &IEname_,
                                        const pfByte &IEtype_,
                                        pfBoolean isMandatory_);

        virtual ~uniQoSIECoder(void);

    private:
	virtual void decodeQoSparameters(pfMessenger *msg_);
        virtual void encodeQoSparameters(pfFrame &frame_, 
						pfMessenger *msg_);

};

class uniBBCIECoder : public uniIECoder
{
    public:
        uniBBCIECoder(const string &IEname_,
                                        const pfByte &IEtype_,
                                        pfBoolean isMandatory_);

        virtual ~uniBBCIECoder(void);

    private:
	virtual void decodeBroadbandBearerCapability(pfMessenger *msg_);
        virtual void encodeBroadbandBearerCapability(pfFrame &frame_, 
							pfMessenger *msg_);

};

class uniCallStateIECoder : public uniIECoder
{
    public:
        uniCallStateIECoder(const string &IEname_,
                                        const pfByte &IEtype_,
                                        pfBoolean isMandatory_);

        virtual ~uniCallStateIECoder(void);

    private:
	virtual void decodeCallState(pfMessenger *msg_);
        virtual void encodeCallState(pfFrame &frame_, pfMessenger *msg_);

};

class uniCauseIECoder : public uniIECoder
{
    public:
        uniCauseIECoder(const string &IEname_,
                                        const pfByte &IEtype_,
                                        pfBoolean isMandatory_);

        virtual ~uniCauseIECoder(void);

    private:
	virtual void decodeCause(pfMessenger *msg_);
        virtual void encodeCause(pfFrame &frame_, pfMessenger *msg_);

};

#endif // __UNI_UNIIECODER_H__

