//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / testing/testadapter/uni
//
//File: unipducoder.h
//
//Version: $Revision: 1.8 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/11/20 13:54:22 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Timo Kokkonen
//      Jussi Turunen
//
//Description:
//      
//      Encode and decode methods for uniPDUs used with testing.
//      The class inherits pduCoderBase and decode is rewritten. This
//      class is used exclusively in UNI testing and it's use limited
//      elsewhere.
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History:
//
#ifndef __TESTADAPTER_UNIPDUCODER_H__
#define __TESTADAPTER_UNIPDUCODER_H__

#include "testing/testadapter/adapter/pducoderbase.h"

class uniPDUcoder : public pduCoderBase
{
    public:
        uniPDUcoder(void);
        virtual ~uniPDUcoder(void);

        otMessage::SerializedMessage decode(const pfFrame &frame_);

    private:
        void decodeHeader(void);
        void decodeIEs(void);

        void unknownPdu(void);

        // decode methods for individual IEs
        void decodeCA_IE(pfUlong numberOfCAIEs_); // Cause
        void decodeCS_IE(void); // Call state
        void decodeAAL_IE(void); // ATM adaptation layer parameters
        void decodeATD_IE(void); // ATM traffic descriptor
        void decodeCI_IE(void); // Connection identifier
        void decodeQOS_IE(void); // Quality of service parameter
        void decodeBHL_IE(void); // Broadband high layer information
        void decodeBBC_IE(void); // Broadband bearer capability
        void decodeBLL_IE(void); // Broadband low-layer information
        void decodeBLSH_IE(void); // Broadband locking shift
        void decodeBNSH_IE(void); // Broadband non-locking shift
        void decodeBSC_IE(void); // Broadband sending complete
        void decodeBRI_IE(void); // Broadband repeat indicator
        void decodeCGN_IE(void); // Calling party number
        void decodeCGS_IE(void); // Calling party subaddress
        void decodeCDN_IE(void); // Called party number
        void decodeCDS_IE(void); // Called party subaddress
        void decodeTNS_IE(void); // Transit network selection
        void decodeRI_IE(void); // Restart indicator
        void decodeUN_IE(void); // Unknown IE

        void getExtension(void);
        pfUlong endExtension(void);

        // These methods act as wrapper methods for actual decode()-
        // methods. These methods keep track of _IELength and call
        // the appropriate decode method only when there is data 
        // available.
        void decodeBitStr(const string &name_, pfUlong length_);
        void decodeOctetStr(const string &name_, pfUlong length_);
        void decodeHexStr(const string &name_, pfUlong length_);
        void decodeIA5Str(const string &name_, pfUlong length_);

        void getIElength(void);
        void decreaseIElength(pfUlong bits_);
        pfUlong blocksInIE(const pfUlong blockSize_);

        const pfUlong SHIFTFORPDUTYPE;
        pfUlong _IElengthInBits;
        pfUlong _extensionBit;
};

#endif // __TESTADAPTER_UNIPDUCODER_H__
