adaptationlayer/tsy/simatktsy_dll/inc/ber_tlv.h
author mikaruus <mika.a.ruuskanen@nokia.com>
Thu, 14 Jan 2010 10:44:58 +0200
changeset 5 8ccc39f9d787
parent 0 63b37f68c1ce
permissions -rw-r--r--
New release based on our 2010wk02 release

/*
* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/



#ifndef BER_TLV_H
#define BER_TLV_H

//  INCLUDES
#include <e32base.h>        // base class cbase


//  CONSTANTS
const TUint8 KTlvLengthStartPosition                            = 0x01;
const TUint8 KTlvDataAreaStartPosition                          = 0x02;
const TUint8 KTlvHeaderLength                                   = 0x02;
const TUint8 KTwoByteLengthCoding                               = 0x81;
const TUint8 KMccAndMncLength                                   = 0x03;
const TUint8 KLocationAreaCodeLength                            = 0x02;
const TUint8 KCApduLengthWithoutLc                              = 0x06;
const TUint8 KCommonTlvHeaderLength                             = 0x02;
const TUint8 KDefaultCommandNumber                              = 0x01;
const TUint8 KDefaultGetInkeyCodingScheme                       = 0x04;
const TUint8 KTagValueMask                                      = 0x7f;
const TUint8 KTagCrMask                                         = 0x80;
const TUint8 KMaxOneByteLength                                  = 0x7f;


// In 242 octets, it is possible to pack (242x8)/7=277 characters.
// See ref. 3GPP TS 23.038.
const TInt16 KTextBufferMaxSize                                 = 277;
const TUint8 KCommandQualifier                                  = 4;
const TUint8 KTlvMaxSize                                        = 255;

//Proactive SIM commands
const TUint8 KRefresh                                           = 0x01;
const TUint8 KMoreTime                                          = 0x02;
const TUint8 KPollInterval                                      = 0x03;
const TUint8 KPollingOff                                        = 0x04;
const TUint8 KSetUpEventList                                    = 0x05;
const TUint8 KSetUpCall                                         = 0x10;
const TUint8 KSendSs                                            = 0x11;
const TUint8 KSendUssd                                          = 0x12;
const TUint8 KSendShortMessage                                  = 0x13;
const TUint8 KSendDtmf                                          = 0x14;
const TUint8 KLaunchBrowser                                     = 0x15;
const TUint8 KPlayTone                                          = 0x20;
const TUint8 KDisplayText                                       = 0x21;
const TUint8 KGetInkey                                          = 0x22;
const TUint8 KGetInput                                          = 0x23;
const TUint8 KSelectItem                                        = 0x24;
const TUint8 KSetUpMenu                                         = 0x25;
const TUint8 KProvideLocalInformation                           = 0x26;
const TUint8 KTimerManagement                                   = 0x27;
const TUint8 KSetUpIdleModeText                                 = 0x28;
const TUint8 KPerformCardApdu                                   = 0x30;
const TUint8 KPowerOnCard                                       = 0x31;
const TUint8 KPowerOffCard                                      = 0x32;
const TUint8 KGetReaderStatus                                   = 0x33;
const TUint8 KRunAtCommand                                      = 0x34;
const TUint8 KLanguageNotification                              = 0x35;
const TUint8 KOpenChannel                                       = 0x40;
const TUint8 KCloseChannel                                      = 0x41;
const TUint8 KReceiveData                                       = 0x42;
const TUint8 KSendData                                          = 0x43;
const TUint8 KGetChannelStatus                                  = 0x44;
const TUint8 KEndOfTheProactiveSession                          = 0x81;


//TAG Values

//BER-TLV tags
//BER-TLV tags in ME to SIM direction
const TUint8 KBerTlvSmsPpDownloadTag                            = 0xD1;
const TUint8 KBerTlvCellBroadcastTag                            = 0xD2;
const TUint8 KBerTlvMenuSelectionTag                            = 0xD3;
const TUint8 KBerTlvCallControlTag                              = 0xD4;
const TUint8 KBerTlvMoShortMessageControlTag                    = 0xD5;
const TUint8 KBerTlvEventDownloadTag                            = 0xD6;
const TUint8 KBerTlvTimerExpirationTag                          = 0xD7;

//BER-TLV tags in SIM to ME direction
const TUint8 KBerTlvProactiveSimCommandTag                      = 0xD0;

//SIMPLE-TLV tags in both directions
//TLV tags, Tag value, bits 1-7 (Range: '01' - '7E')
const TUint8 KTlvCommandDetailsTag                              = 0x01;
const TUint8 KTlvDeviceIdentityTag                              = 0x02;
const TUint8 KTlvResultTag                                      = 0x03;
const TUint8 KTlvDurationTag                                    = 0x04;
const TUint8 KTlvAlphaIdentifierTag                             = 0x05;
const TUint8 KTlvAddressTag                                     = 0x06;
const TUint8 KTlvCapabilityConfigurationParametersTag           = 0x07;
const TUint8 KTlvSubaddressTag                                  = 0x08;
const TUint8 KTlvSsStringTag                                    = 0x09;
const TUint8 KTlvUssdStringTag                                  = 0x0A;
const TUint8 KTlvSmsTpduTag                                     = 0x0B;
const TUint8 KTlvCellBroadcastPageTag                           = 0x0C;
const TUint8 KTlvTextStringTag                                  = 0x0D;
const TUint8 KTlvToneTag                                        = 0x0E;
const TUint8 KTlvItemTag                                        = 0x0F;
const TUint8 KTlvItemIdentifierTag                              = 0x10;
const TUint8 KTlvResponseLengthTag                              = 0x11;
const TUint8 KTlvFileListTag                                    = 0x12;
const TUint8 KTlvLocationInformationTag                         = 0x13;
const TUint8 KTlvImeiTag                                        = 0x14;
const TUint8 KTlvHelpRequestTag                                 = 0x15;
const TUint8 KTlvNetworkMeasurementResultsTag                   = 0x16;
const TUint8 KTlvDefaultTextTag                                 = 0x17;
const TUint8 KTlvItemsNextActionIndicatorTag                    = 0x18;
const TUint8 KTlvEventListTag                                   = 0x19;
const TUint8 KTlvCauseTag                                       = 0x1A;
const TUint8 KTlvLocationStatusTag                              = 0x1B;
const TUint8 KTlvTransactionIdentifierTag                       = 0x1C;
const TUint8 KTlvBccdChannelListTag                             = 0x1D;
const TUint8 KTlvIconIdentifierTag                              = 0x1E;
const TUint8 KTlvItemIconIdentifierListTag                      = 0x1F;
const TUint8 KTlvCardReaderStatusTag                            = 0x20;
const TUint8 KTlvCardAtrTag                                     = 0x21;
const TUint8 KTlvCApduTag                                       = 0x22;
const TUint8 KTlvRApduTag                                       = 0x23;
const TUint8 KTlvTimerIdentifierTag                             = 0x24;
const TUint8 KTlvTimerValueTag                                  = 0x25;
const TUint8 KTlvDateTimeAndTimeZoneTag                         = 0x26;
const TUint8 KTlvCallControlRequestedActionTag                  = 0x27;
const TUint8 KTlvAtCommandTag                                   = 0x28;
const TUint8 KTlvAtResponseTag                                  = 0x29;
const TUint8 KTlvBcRepeatIndicatorTag                           = 0x2A;
const TUint8 KTlvImmediateResponseTag                           = 0x2B;
const TUint8 KTlvDtmfStringTag                                  = 0x2C;
const TUint8 KTlvLanguageTag                                    = 0x2D;
const TUint8 KTlvTimingAdvanceTag                               = 0x2E;
const TUint8 KTlvAIDTag                                         = 0x2F;
const TUint8 KTlvBrowserIdentityTag                             = 0x30;
const TUint8 KTlvUrlTag                                         = 0x31;
const TUint8 KTlvBearerTag                                      = 0x32;
const TUint8 KTlvProvisioningReferenceFileTag                   = 0x33;
const TUint8 KTlvBrowserTerminationCauseTag                     = 0x34;
const TUint8 KTlvBearerDescriptionTag                           = 0x35;
const TUint8 KTlvChannelDataTag                                 = 0x36;
const TUint8 KTlvChannelDataLengthTag                           = 0x37;
const TUint8 KTlvChannelStatusTag                               = 0x38;
const TUint8 KTlvBufferSizeTag                                  = 0x39;
const TUint8 KTlvCardReaderIdentifierTag                        = 0x3A;
const TUint8 KTlvTextStringTagUserPassword                      = 0x3B;
const TUint8 KTlvSimMeTransportLevelTag                         = 0x3C;
const TUint8 KTlvURLTag                                         = 0x3D;
const TUint8 KTlvOtherAddressTag                                = 0x3E;

const TUint8 KTlvAccessTechnologyTag                            = 0x3F;
const TUint8 KTlvESNTag                                         = 0x46;
const TUint8 KTlvNetworkAccessNameTag                           = 0x47;
const TUint8 KTlvPdpContextActivationParametersTag              = 0x52;
const TUint8 KTlvImeisvTag                                      = 0x62;

const TUint8 KTlvTimerIdentifierTagCRBitOn                      = 0xA4;

const TUint8 KTlvUtranMeasurementQualifierTag                   = 0x69;
//TLV Coding

// event download - Event list event coding
const TUint8 KEventMTCall                                       = 0x00;
const TUint8 KEventCallConnected                                = 0x01;
const TUint8 KEventCallDisconnected                             = 0x02;
const TUint8 KEventLocationStatus                               = 0x03;
const TUint8 KEventUserActivity                                 = 0x04;
const TUint8 KEventIdleScreenAvailable                          = 0x05;
const TUint8 KEventCardReaderStatus                             = 0x06;
const TUint8 KEventLanguageSelection                            = 0x07;
const TUint8 KEventBrowserTermination                           = 0x08;
const TUint8 KEventDataAvailable                                = 0x09;
const TUint8 KEventChannelStatus                                = 0x0A;
const TUint8 KEventAccessTechnologyChange                       = 0x0B;

// event download - Location status coding
const TUint8 KLocationStatusNormalService                       = 0x00;
const TUint8 KLocationStatusLimitedService                      = 0x01;
const TUint8 KLocationStatusNoService                           = 0x02;

// event download - Browser termination coding
const TUint8 KBrowserTerminationUser                            = 0x00;
const TUint8 KBrowserTerminationError                           = 0x01;


//REFRESH;
const TUint8 KSimInitFullFileChangeNotification                 = 0x00;
const TUint8 KFileChangeNotification                            = 0x01;
const TUint8 KSimInitFileChangeNotification                     = 0x02;
const TUint8 KSimInit                                           = 0x03;
const TUint8 KSimReset                                          = 0x04;
const TUint8 KUSIMApplicationReset                              = 0x05;
const TUint8 K3GSessionReset                                    = 0x06;
const TUint8 KMaxPathLength                                     = 16;


//SET UP CALL;
const TUint8 KSetUpCallIfNotCurrentlyBusy                       = 0x00;
const TUint8 KSetUpCallIfNotCurrentlyBusyWithRedial             = 0x01;
const TUint8 KSetUpCallPuttingOtherCallsOnHold                  = 0x02;
const TUint8 KSetUpCallPuttingOtherCallsOnHoldWithRedial        = 0x03;
const TUint8 KSetUpCallDisconnectingOtherCalls                  = 0x04;
const TUint8 KSetUpCallDisconnectingOtherCallsWithRedial        = 0x05;
const TUint8 KAuthorityFormatIdentifier                         = 0x50;
const TUint8 KMinutes                                           = 0x00;
const TUint8 KSeconds                                           = 0x01;
const TUint8 KTenthsOfSeconds                                   = 0x02;


//SEND SHORT MESSAGE;
const TUint8 KSmsPackingRequiredMask                            = 0x01;
const TUint8 KDCSAlphabetMask                                   = 0x06;
const TUint8 KSmsMaxSize                                        = 160;
const TUint8 KSmsMaxSizeWithoutPacking                          = 140;
const TUint8 KSMSCommandMaxSize                                 = 152;

//DISPLAY TEXT,
const TUint8 KPriorityMask                                      = 0x01;
const TUint8 KMessageClearMask                                  = 0x80;

//GET INKEY,
const TUint8 KAlphabetMask                                      = 0x01;
const TUint8 KUCS2AlphabetMask                                  = 0x02;
const TUint8 KYesNoMask                                         = 0x04;
const TUint8 KImmediateDigitResponse                            = 0x08;
const TUint8 KHelpAvailabilityMask                              = 0x80;

//GET INPUT,
const TUint8 KUserInputMask                                     = 0x04;
const TUint8 KGetInputSmsPackedMask                             = 0x08;
const TUint8 KUCS2DCS                                           = 0x08;
const TUint8 K7BitDefaultSmsDCS                                 = 0x00;
const TUint8 K8BitDCS                                           = 0x04;

//SELECT ITEM.
const TUint8 KSelectItemPresentationTypeMask                    = 0x01;
const TUint8 KSelectItemChoiceOfNavigationMask                  = 0x02;
const TUint8 KSelectItemSelectUsingSoftKeyMask                  = 0x04;

//SET UP MENU.
const TUint8 KSelectionUsingSoftKey                             = 0x01;

//TIMER MANAGEMENT
const TUint8 KDeactivateTimer                                   = 0x01;
const TUint8 KGetTimerValue                                     = 0x02;

//LAUNCH BROWSER
const TUint8 KLaunchBrowserIfNotYetLaunched                     = 0x00;
const TUint8 KUseExistingBrowser                                = 0x02;
const TUint8 KCloseAndLaunchNewBrowser                          = 0x03;

//PROVIDE LOCAL INFORMATION
const TUint8 KNetworkModeGsm                                    = 0x00;
const TUint8 KNetworkModeUtran                                  = 0x03;
const TUint8 KIntraFrequencyMeasurements                        = 0x01;
const TUint8 KInterFrequencyMeasurements                        = 0x02;
const TUint8 KInterRatMeasurements                              = 0x03;
// BEARER INDEPENDENT PROTOCOL
const TUint8 KIPV4                                              = 0x21;
const TUint8 KIPV6                                              = 0x57;

//General result
//All other values are reserved.
//Results '0X' and '1X' indicate that the command has been performed.
const TUint8 KCommandPerformedSuccessfully                              = 0x00;
const TUint8 KCommandPerformedWithPartialComprehension                  = 0x01;
const TUint8 KCommandPerformedWithMissingInformation                    = 0x02;
const TUint8 KRefreshPerformedWithAdditionalEfsRead                     = 0x03;
const TUint8 KCommandPerformedSuccessfullyIconCouldNotBeDisplayed       = 0x04;
const TUint8 KCommandPerformedButModifiedByCallControlBySim             = 0x05;
const TUint8 KCommandPerformedSuccessfullyLimitedService                = 0x06;
const TUint8 KCommandPerformedWithModification                          = 0x07;
const TUint8 KProactiveSimSessionTerminatedByTheUser                    = 0x10;
const TUint8 KBackwardMoveInTheProactiveSimSessionRequestedByTheUser    = 0x11;
const TUint8 KNoResponseFromUser                                        = 0x12;
const TUint8 KHelpInformationRequiredByTheUser                          = 0x13;
const TUint8 KUssdOrSsTransactionTerminatedByTheUser                    = 0x14;

//Results '2X' Indicate To The SIM That It May Be Worth Re-Trying The Command
//At A Later Opportunity.
const TUint8 KMeCurrentlyUnableToProcessCommand                         = 0x20;
const TUint8 KNetworkCurrentlyUnableToProcessCommand                    = 0x21;
const TUint8 KUserDidNotAcceptTheProactiveCommand                       = 0x22;
const TUint8 KUserClearedDownCallBeforeConnectionOrNetworkRelease       = 0x23;
const TUint8 KActionInContradictionWithTheCurrentTimerState             = 0x24;
const TUint8 KInteractionWithCallControlBySimTemporaryProblem           = 0x25;
const TUint8 KLaunchBrowserGenericErrorCode                             = 0x26;

//Results '3X' Indicate That It Is Not Worth The SIM Re-Trying With An
//Identical Command, As It Will Only Get The Same Response. However, The
//Decision To Retry Lies With The SIM Application.
const TUint8 KCommandBeyondMeCapabilities                               = 0x30;
const TUint8 KCommandTypeNotUnderstoodByMe                              = 0x31;
const TUint8 KCommandDataNotUnderstoodByMe                              = 0x32;
const TUint8 KCommandNumberNotKnownByMe                                 = 0x33;
const TUint8 KSsReturnError                                             = 0x34;
const TUint8 KSmsRpError                                                = 0x35;
const TUint8 KErrorRequiredValuesAreMissing                             = 0x36;
const TUint8 KUssdReturnError                                           = 0x37;
const TUint8 KMultiplecardCommandsError                                 = 0x38;
const TUint8 KSimPermanentProblem                                       = 0x39;
const TUint8 KBearerIndependentProtocolError                            = 0x3a;

//Additional information
//Contents: For the general result "Command performed successfully", some
// proactive commands require additional information in the command result.
// This is defined in the subclauses below. For the general results '20', '21',
// '26', '34', '35', '37', '38' and '39' and '3A', it is mandatory for the ME
// to provide a specific cause value as additional information, as defined in
// the subclauses below. For the other general results, the ME may optionally
// supply additional information. If additional information is not supplied,
// then the length of the value part of the data object need only contain the
// general result. See 3GPP TS 11.14 V8.8.0, chapters 12.12.1 - 12.12.11 for
// more details.

//Additional information for ME problem
//Additional information for network problem
//Additional information for SS problem
const TUint8 KNoSpecificCauseCanBeGiven                         = 0x00;
const TUint8 KScreenIsBusy                                      = 0x01;
const TUint8 KMeCurrentlyBusyOnCall                             = 0x02;
const TUint8 KMeCurrentlyBusyOnSsTransaction                    = 0x03;
const TUint8 KNoService                                         = 0x04;
const TUint8 KAccessControlClassBar                             = 0x05;
const TUint8 KRadioResourceNotGranted                           = 0x06;
const TUint8 KNotInSpeechCall                                   = 0x07;
const TUint8 KMeCurrentlyBusyOnUssdTransaction                  = 0x08;
const TUint8 KMeCurrentlyBusyOnSendDtmfCommand                  = 0x09;

//Additional information for interaction with call control or MO SM control
const TUint8 KActionNotAllowed                                  = 0x01;
const TUint8 KTypeOfRequestHasChanged                           = 0x02;

//Additional information for MultipleCard commands
const TUint8 KCardReaderRemovedOrNotPresent                     = 0x01;
const TUint8 KCardRemovedOrNotPresent                           = 0x02;
const TUint8 KCardReaderBusy                                    = 0x03;
const TUint8 KCardPoweredOff                                    = 0x04;
const TUint8 KCApduFormatError                                  = 0x05;
const TUint8 KMuteCard                                          = 0x06;
const TUint8 KTransmissionError                                 = 0x07;
const TUint8 KProtocolNotSupported                              = 0x08;
const TUint8 KSpecifiedReaderNotValid                           = 0x09;

//Additional information for Launch Browser problem
const TUint8 KBearerUnavailable                                 = 0x01;
const TUint8 KBrowserUnavailable                                = 0x02;
const TUint8 KMeUnableToReadTheProvisioningData                 = 0x03;

//Additional information for Bearer Independent Protocol
const TUint8 KNoChannelAvailable                                = 0x01;
const TUint8 KChannelClosed                                     = 0x02;
const TUint8 KChannelIdentifierNotValid                         = 0x03;
const TUint8 KRequestedBufferSizeNotAvailable                   = 0x04;
const TUint8 KSecurityError                                     = 0x05;
const TUint8 KRequestedSimMeInterfaceTransportLevelNotAvailable = 0x06;

//Source and Destination device identities are coded as follows:
const TUint8 KKeypad                                            = 0x01;
const TUint8 KDisplay                                           = 0x02;
const TUint8 KEarpiece                                          = 0x03;
const TUint8 KAdditionalCardReader0                             = 0x10;
const TUint8 KAdditionalCardReader1                             = 0x11;
const TUint8 KAdditionalCardReader2                             = 0x12;
const TUint8 KAdditionalCardReader3                             = 0x13;
const TUint8 KAdditionalCardReader4                             = 0x14;
const TUint8 KAdditionalCardReader5                             = 0x15;
const TUint8 KAdditionalCardReader6                             = 0x16;
const TUint8 KAdditionalCardReader7                             = 0x17;
const TUint8 KChannel1                                          = 0x21;
const TUint8 KChannel2                                          = 0x22;
const TUint8 KChannel3                                          = 0x23;
const TUint8 KChannel4                                          = 0x24;
const TUint8 KChannel5                                          = 0x25;
const TUint8 KChannel6                                          = 0x26;
const TUint8 KChannel7                                          = 0x27;
const TUint8 KSim                                               = 0x81;
const TUint8 KMe                                                = 0x82;
const TUint8 KNetwork                                           = 0x83;


//  DATA TYPES

// Tlv Specific Data Types
enum TTlvSpesificDataType
    {
    ETLV_TonAndNpi,
    ETLV_DiallingNumberString,
    ETLV_AlphaIdentifier,
    ETLV_SubAddress,
    ETLV_CapabilityConfigurationParameters,
    ETLV_CellBroadcastPage,
    ETLV_CommandNumber,
    ETLV_TypeOfCommand,
    ETLV_CommandQualifier,
    ETLV_SourceDeviceIdentity,
    ETLV_DestinationDeviceIdentity,
    ETLV_TimeUnit,
    ETLV_TimeInteval,
    ETLV_IdentifierOfItem,
    ETLV_TextStringOfItem,
    ETLV_IdentifierOfItemChosen,
    ETLV_MinimumLengthOfResponse,
    ETLV_MaximumLengthOfResponse,
    ETLV_GeneralResult,
    ETLV_AdditionalInformationOnResult,
    ETLV_SmsTPdu,
    ETLV_DataCodingScheme,
    ETLV_SsOrUssdString,
    ETLV_TextString,
    ETLV_Tone,
    ETLV_UssdString,
    ETLV_NumberOfFiles,
    ETLV_Files,
    ETLV_LocationAreaCode,
    ETLV_CellIdentityValue,
    ETLV_MccAndMnc,
    ETLV_Imei,
    ETLV_NetworkMeasurementResults,
    ETLV_DefaultText,
    ETLV_ItemsNextActionIndicator,
    ETLV_EventList,
    ETLV_Cause,
    ETLV_LocationStatus,
    ETLV_TransactionIdentifier,
    ETLV_BcchChannelList,
    ETLV_IconIdentifier,
    ETLV_IconQualifier,
    ETLV_IconListQualifier,
    ETLV_IconIdentifierList,
    ETLV_CardReaderStatus,
    ETLV_CommandClassCLA,
    ETLV_CommandInstructionCodeIns,
    ETLV_P1Parameter,
    ETLV_P2Parameter,
    ETLV_Lc,
    ETLV_Data,
    ETLV_Le,
    ETLV_RApduData,
    ETLV_StatusWordSW1,
    ETLV_StatusWordSW2,
    ETLV_TimerIdentifier,
    ETLV_TimerValue,
    ETLV_DateTimeAndTimeZone,
    ETLV_AtCommand,
    ETLV_AtResponse,
    ETLV_BcRepeatIndicatorValues,
    ETLV_DtmfString,
    ETLV_Language,
    ETLV_MeStatus,
    ETLV_TimingAdvance,
    ETLV_BrowserIdentity,
    ETLV_Url,
    ETLV_ListOfBearers,
    ETLV_PathToProvisioningFile,
    ETLV_BrowserTerminationCause,
    ETLV_BearerType,
    ETLV_BearerParameters,
    ETLV_ChannelDataString,
    ETLV_ChannelDataLength,
    ETLV_BufferSize,
    ETLV_ChannelStatus,
    ETLV_IdentifierOfCardReader,
    ETLV_TypeOfAddress,
    ETLV_Address,
    ETLV_TransportProtocolType,
    ETLV_PortNumber,
    ETLV_NetworkAccessName,
    ETLV_CallControlRequestedAction,
    ETLV_Atr,
    ETLV_AID,
    ETLV_UtranMeasurementQualifier,
    ETLV_RemoteEntityAddressCoding,
    ETLV_RemoteEntityAddress
    };


// FORWARD DECLARATIONS
class TIsiReceiveC;
class CTlv;


// CLASS DECLARATION
/**
*  TTlvBase
*  TLV type: Tag Length Value(s)
*  Generic BER-TLV constructor class, can be used to create TLVs
*  You do not need to worry about lenghts; Example usage:
*                  TTlv tlv;
*                  tlv.Begin( KxxBerTag);  <--- top level tag
*                  tlv.AddTag( KxxxTag )   <--- simple tags
*                  tlv.AddByte(...)        <--- add values for this tag
*                  tlv.AddByte(...)
*                  .... add more simple tags and values..
*                  result = tlv.End();     <--- ends construction and returns
*                                               the ber-tlv
*  @lib SIMATKTSY.LIB
*  @since Series 60 Series60_2.6
*/
class TTlvBase
    {
    public: // Constructor

        /**
        * Constructor
        * @since Series 60 Series60_2.6
        * @param aData data to be inserted
        */
        TTlvBase(TDes8& aData) : iLenIndex(0),iData(aData) {}

    public:

        /**
        * Begin TLV construction
        * @since Series 60 Series60_2.6
        * @param aTag  ber-tlv tag
        * @return None
        */
        void Begin( TUint8 aTag );

        /**
        * Start new simple TLV
        * @since Series 60 Series60_2.6
        * @param aTag  simple tag
        * @return None
        */
        void AddTag( TUint8 aTag );

        /**
        * Add byte value to simple TLV
        * @since Series 60 Series60_2.6
        * @param aValue byte value
        * @return None
        */
        void AddByte( TUint8 aValue );

        /**
        * Add descriptor value to simple TLV
        * @since Series 60 Series60_2.6
        * @param aValue descriptor value
        * @return None
        */
        void AddData( const TDesC8& aValue );


        /**
        * End tlv construction
        * @since Series 60 Series60_2.6
        * @param None
        * @return TDesC8& descriptor containing BER-TLV
        */
        const TDesC8& End();

        /**
        * Return data, calculated without
        * top level tag.
        * @since Series 60 Series60_2.6
        * @param None
        * @return TDesC8& descriptor containing BER-TLV
        */
        const TDesC8& GetDataWithoutTopLevelTag();


    protected: // Data

        TInt        iLenIndex;
        TDes8&      iData;
    };

/**
*  TTlvBuf
*  Type for Tag Length Value buffer.
*  Define tlv that is smaller than default max size of 255
*
*  @lib SIMATKTSY.LIB
*  @since Series 60 Series60_2.6
*/
template <TInt S>
class TTlvBuf : public TTlvBase
    {
    public: // Constructor

    /**
    * Constructor
    * @since Series 60 Series60_2.6
    * @param iBuffer
    */
    TTlvBuf() : TTlvBase( iBuffer ) {}

private: // Data

    // Data buffer smaller than default maximum size of 255
    TBuf8<S>   iBuffer;
    };

/**
*  TTlv
*  Type for Tag Length Value buffer.
*  Default TLV with size of 255
*
*  @lib SIMATKTSY.LIB
*  @since Series 60 Series60_2.6
*/
class TTlv : public TTlvBase
    {
    public: // Constructor

        /**
        * Constructor
        * @since Series 60 Series60_2.6
        * @param iBuffer
        */
        TTlv() : TTlvBase( iBuffer ) {}

        private:    // Data

        // TLV must fit in APDU limits (255 bytes)
        // therefore the maximum possible TLV size is 255
        TBuf8<255>   iBuffer;
    };

/**
*  CTlvBase
*  TLV Base class. methods common for CTlv and CBerTlv
*
*  @lib SIMATKTSY.LIB
*  @since Series 60 Series60_2.6
*/
class CTlvBase : public CBase
    {
    public:

        /**
        * Constructor
        * @since Series 60 Series60_2.6
        * @param iData
        */
        CTlvBase() : iData( 0, 0 ) {}

        /**
        * Get pointer to TLV data
        * @since Series 60 Series60_2.6
        * @return iData Pointer to TLV data
        */
        TPtrC8 Data() const
            {
            return iData;
            }

        /**
        * Set TLV data
        * @since Series 60 Series60_2.6
        * @param aData Data to be inserted
        * @return None
        */
        void SetData
                (
                TPtrC8 aData    // TLV
                )
            {
            iData.Set( aData );
            }

        /**
        * Get total size, including tag
        * @since Series 60 Series60_2.6
        * @return size
        */
        TInt GetSize() const
            {
            return ( iData.Length() );
            }

        /**
        * Get tag part of TLV
        * @since Series 60 Series60_2.6
        * @return tag value
        */
        TUint8 GetTag() const
            {
            return TUint8( iData[0] & KTagValueMask );
            }

        /**
        * Returns true if comprehension flag is on
        * @since Series 60 Series60_2.6
        * @return boolean
        */
        TBool GetComprehensionRequired() const
            {
            return ( iData[0] & KTagCrMask ) ? ETrue : EFalse;
            }

        /**
        * Get length part of TLV
        * @since Series 60 Series60_2.6
        * @return length
        */
        TUint8 GetLength () const
            {
            return ( KTwoByteLengthCoding == iData[KTlvLengthStartPosition] ) ?
                iData[KTlvLengthStartPosition + 1] :
                iData[KTlvLengthStartPosition];
            }

        /**
        * Get value part of TLV
        * @since Series 60 Series60_2.6
        * @return value
        */
        TPtrC8 GetValue() const
            {
            TInt offset = ( KTwoByteLengthCoding == iData[1] ) ? 1 : 0;
            return iData.Mid( 2+offset, iData[1+offset] );
            }

    protected: // Data

        // Pointer to Tlv data
        TPtrC8 iData;
    };

/**
*  CBerTlv
*  CBerTlv contains methods to read BER-TLV data
*
*  @lib SIMATKTSY.LIB
*  @since Series 60 Series60_2.6
*/
class CBerTlv : public CTlvBase
    {

    public: // Constructor

        /**
        * Default constructor
        */
        CBerTlv();

    public: // New methods

        /**
        * Find tlv by tag value
        * @param aTlv
        * @param aTlvTagValue TlvTag
        * @param aItemNbr number of requested Tlv, default is 0
        * @return TInt: KErrNone or KErrNotFound
        */
        TInt TlvByTagValue(
            CTlv* aTlv,
            TUint8 aTlvTagValue,
            TInt aItemNbr = 0 );

        /**
        * Find several tlvs by tag value
        * @since Series 60 Series60_2.6
        * @param aSubBlock retruns tlvs
        * @param aSubBlockId TlvTag
        * @return TInt: KErrNone or KErrNotFound
        */
        TInt TlvByTagValueMulti( CTlv* aTlv, TUint8 aTlvTag );

        /**
        * Set ber-tlv from atk_generic_req isi-message.
        * @since NCP 5.0
        * @param aIsiMessage ISI message
        * @return TInt: KErrNone or KErrNotFound
        */
        TInt BerTlv( const TIsiReceiveC& aIsiMessage );
};

/**
*  CTlv
*  CTlv contains methods to read simple TLV data
*
*  @lib SIMATKTSY.LIB
*  @since Series 60 Series60_2.6
*/
class CTlv : public CTlvBase
{
    public: // Constructor

        /**
        * Default constructor
        */
        CTlv();

    public: // New methods

        /**
        * Returns short info defined by aType.
        * @since Series 60 Series60_2.6
        * TAtkSpesificDataType aType: wanted data type.
        * @return TUint8: wanted data.
        */
         TUint8 GetShortInfo( TTlvSpesificDataType aType );

        /**
        * Returns the Data defined by aType. Index and length of the
        * data depends on data type.
        * @since Series 60 Series60_2.6
        * @param TAtkSpesificDataType aType: data type.
        * @return TptrC8: pointer to the data.
        */
         TPtrC8 GetData( TTlvSpesificDataType aType );

        /**
        * Returns long info by aType.
        * @since Series 60 Series60_2.6
        * @param TAtkSpesificDataType aType: data type.
        * @return TUint8: returned data
        */
         TUint16 GetLongInfo( TTlvSpesificDataType aType );
};

#endif // BER_TLV_H

// End of File