--- a/telephonyserverplugins/simatktsy/utility/src/cbertlv.cpp Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/simatktsy/utility/src/cbertlv.cpp Thu May 06 15:10:38 2010 +0100
@@ -1,221 +1,221 @@
-// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "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:
-// Name : CBerTlv.cpp
-// Part of : Series 60 / utility
-// Based on 3GPP TS 11.14 V8.8.0
-// Version : 1.0
-// EXTERNAL RESOURCES
-//
-
-
-
-// Include Files
-#include "CBerTlv.h" // Header of this class
-#include "tflogger.h" // For logging
-
-// External Data Structures
-// none
-
-// External Function Prototypes
-// none
-
-// LOCAL CONSTANTS AND MACROS
-// none
-
-// MODULE DATA STRUCTURES
-// none
-
-// Local Data Structures
-// none
-
-// Local Function Prototypes
-// none
-
-// LOCAL FUNCTIONS
-// none
-
-// MEMBER FUNCTIONS
-
-//=============================================================================
-
-// -----------------------------------------------------------------------------
-// CBerTlv::CBerTlv
-// Constructor
-// -----------------------------------------------------------------------------
-//
-EXPORT_C CBerTlv::CBerTlv
- (
- // None
- )
- {
- // None
- }
-
-// -----------------------------------------------------------------------------
-// CBerTlv::TlvByTagValue
-// Find TLV by tag value. aTlv is set to point to found TLV. If there are more
-// than one TLV with the same tag then itemNbr can be used to select which one
-// is returned. If no tags are found return KErrNotFound else KErrNone.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TInt CBerTlv::TlvByTagValue
- (
- CTlv* aTlv, // TLV
- TUint8 aTlvTagValue, // TLV identifier
- TInt itemNbr // Item number
- )
- {
- TFLOGSTRING("UTILITY: CBerTlv::TlvByTagValue");
- TInt currentTlv( 0 );
- TInt tlvLength( 0 );
- TInt index( 0 );
-
- // TLV start index
- TInt ind( KCommonTlvHeaderLength );
- TUint8 berTlvLength( 0 );
- if ( KTwoByteLengthCoding == iData[KTlvLengthStartPosition] )
- {
- berTlvLength = iData[KTlvLengthStartPosition + 1];
- ind = ind + 1;
- }
- else
- {
- berTlvLength = iData[KTlvLengthStartPosition];
- }
-
- for ( TInt i = 0; i < berTlvLength; i += tlvLength )
- {
- // First determine if the length of the TLV is coded with 1 or 2 bytes.
- if ( KTwoByteLengthCoding == iData[ind + 1] )
- {
- // Length is coded with 2 bytes -> 1 extra byte required to be
- // added to total length. Also TLV header bytes (2) must be added
- // to total length
- tlvLength = iData[ind + 2] + KTlvHeaderLength + 1;
- }
- else
- {
- // TLV header bytes (2) must be added to total length
- tlvLength = iData[ind + 1] + KTlvHeaderLength;
- }
-
- currentTlv = iData[ind]&KTagValueMask;
-
- // Check if TLV in current index is the one that we are searching for
- if ( aTlvTagValue == currentTlv )
- {
- if( index == itemNbr)
- {
- TPtrC8 data = ( iData.Mid( ind , tlvLength ) );
- aTlv->SetData( data );
- return KErrNone;
- }
- else
- {
- index++;
- }
- }
-
- ind += tlvLength;
- }
-
- return KErrNotFound;
- }
-
-// -----------------------------------------------------------------------------
-// CBerTlv::TlvByTagValueMulti
-// Find several TLVs by tag value. It is assumed that TLVs are sequential. aTlv
-// is set to point to TLV sequence. If no tags are found return KErrNotFound
-// else KErrNone.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TInt CBerTlv::TlvByTagValueMulti
- (
- CTlv* aTlv, // TLV to fill
- TUint8 aTlvTagValue // Tag of TLV to find
- )
- {
- TFLOGSTRING("UTILITY: CBerTlv::TlvByTagValueMulti");
- TInt currentTlv( 0 );
- TInt16 tlvLength( 0 );
- TInt indMulti( 0 );
- TInt16 multiLength( 0 );
- // TLV start index
- TInt ind( KCommonTlvHeaderLength );
- TUint8 berTlvLength;
- // First determine if the length of the BerTLV is coded with 1 or 2 bytes.
- if ( KTwoByteLengthCoding == iData[KTlvLengthStartPosition] )
- {
- berTlvLength = iData[KTlvLengthStartPosition + 1];
- ind = ind + 1;
- }
- else
- {
- berTlvLength = iData[KTlvLengthStartPosition];
- }
-
- for ( TInt i = 0; i < berTlvLength; i+= tlvLength )
- {
- // First determine if the length of the TLV is coded with 1 or 2 bytes.
- if ( KTwoByteLengthCoding == iData[ind + 1] )
- {
- // Length is coded with 2 bytes -> real length is in second byte.
- // first byte is 81 and it is tag for 2 byte length coding.
- tlvLength = static_cast<TInt16>( iData[ind + 0x02] +
- KTlvHeaderLength + 1 );
- }
- else
- {
- // TLV header bytes (2) must be added to total length
- tlvLength = static_cast<TInt16>( iData[ind + 1] +
- KTlvHeaderLength );
- }
-
- currentTlv = iData[ind]&KTagValueMask;
-
- // Check if TLV in current index is the one that we are searching for
- if ( aTlvTagValue == currentTlv && multiLength == 0x00 )
- {
- // Save first tag position
- indMulti = ind;
- multiLength = tlvLength;
- }
- // Add length
- if ( aTlvTagValue == currentTlv && indMulti != ind )
- {
- multiLength = static_cast<TInt16>( multiLength + tlvLength );
- }
-
- // If last tag, return
- if ( (i + tlvLength) >= berTlvLength )
- {
- TPtrC8 data = ( iData.Mid( indMulti , multiLength ) );
- aTlv->SetData( data );
- break;
- }
- ind += tlvLength;
- }
-
- if( 0 == indMulti)
- {
- return KErrNotFound;
- }
- else
- {
- return KErrNone;
- }
- }
-
-
-//End Of File
+// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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:
+// Name : CBerTlv.cpp
+// Part of : Series 60 / utility
+// Based on 3GPP TS 11.14 V8.8.0
+// Version : 1.0
+// EXTERNAL RESOURCES
+//
+
+
+
+// Include Files
+#include "CBerTlv.h" // Header of this class
+#include "tflogger.h" // For logging
+
+// External Data Structures
+// none
+
+// External Function Prototypes
+// none
+
+// LOCAL CONSTANTS AND MACROS
+// none
+
+// MODULE DATA STRUCTURES
+// none
+
+// Local Data Structures
+// none
+
+// Local Function Prototypes
+// none
+
+// LOCAL FUNCTIONS
+// none
+
+// MEMBER FUNCTIONS
+
+//=============================================================================
+
+// -----------------------------------------------------------------------------
+// CBerTlv::CBerTlv
+// Constructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CBerTlv::CBerTlv
+ (
+ // None
+ )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CBerTlv::TlvByTagValue
+// Find TLV by tag value. aTlv is set to point to found TLV. If there are more
+// than one TLV with the same tag then itemNbr can be used to select which one
+// is returned. If no tags are found return KErrNotFound else KErrNone.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CBerTlv::TlvByTagValue
+ (
+ CTlv* aTlv, // TLV
+ TUint8 aTlvTagValue, // TLV identifier
+ TInt itemNbr // Item number
+ )
+ {
+ TFLOGSTRING("UTILITY: CBerTlv::TlvByTagValue");
+ TInt currentTlv( 0 );
+ TInt tlvLength( 0 );
+ TInt index( 0 );
+
+ // TLV start index
+ TInt ind( KCommonTlvHeaderLength );
+ TUint8 berTlvLength( 0 );
+ if ( KTwoByteLengthCoding == iData[KTlvLengthStartPosition] )
+ {
+ berTlvLength = iData[KTlvLengthStartPosition + 1];
+ ind = ind + 1;
+ }
+ else
+ {
+ berTlvLength = iData[KTlvLengthStartPosition];
+ }
+
+ for ( TInt i = 0; i < berTlvLength; i += tlvLength )
+ {
+ // First determine if the length of the TLV is coded with 1 or 2 bytes.
+ if ( KTwoByteLengthCoding == iData[ind + 1] )
+ {
+ // Length is coded with 2 bytes -> 1 extra byte required to be
+ // added to total length. Also TLV header bytes (2) must be added
+ // to total length
+ tlvLength = iData[ind + 2] + KTlvHeaderLength + 1;
+ }
+ else
+ {
+ // TLV header bytes (2) must be added to total length
+ tlvLength = iData[ind + 1] + KTlvHeaderLength;
+ }
+
+ currentTlv = iData[ind]&KTagValueMask;
+
+ // Check if TLV in current index is the one that we are searching for
+ if ( aTlvTagValue == currentTlv )
+ {
+ if( index == itemNbr)
+ {
+ TPtrC8 data = ( iData.Mid( ind , tlvLength ) );
+ aTlv->SetData( data );
+ return KErrNone;
+ }
+ else
+ {
+ index++;
+ }
+ }
+
+ ind += tlvLength;
+ }
+
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CBerTlv::TlvByTagValueMulti
+// Find several TLVs by tag value. It is assumed that TLVs are sequential. aTlv
+// is set to point to TLV sequence. If no tags are found return KErrNotFound
+// else KErrNone.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CBerTlv::TlvByTagValueMulti
+ (
+ CTlv* aTlv, // TLV to fill
+ TUint8 aTlvTagValue // Tag of TLV to find
+ )
+ {
+ TFLOGSTRING("UTILITY: CBerTlv::TlvByTagValueMulti");
+ TInt currentTlv( 0 );
+ TInt16 tlvLength( 0 );
+ TInt indMulti( 0 );
+ TInt16 multiLength( 0 );
+ // TLV start index
+ TInt ind( KCommonTlvHeaderLength );
+ TUint8 berTlvLength;
+ // First determine if the length of the BerTLV is coded with 1 or 2 bytes.
+ if ( KTwoByteLengthCoding == iData[KTlvLengthStartPosition] )
+ {
+ berTlvLength = iData[KTlvLengthStartPosition + 1];
+ ind = ind + 1;
+ }
+ else
+ {
+ berTlvLength = iData[KTlvLengthStartPosition];
+ }
+
+ for ( TInt i = 0; i < berTlvLength; i+= tlvLength )
+ {
+ // First determine if the length of the TLV is coded with 1 or 2 bytes.
+ if ( KTwoByteLengthCoding == iData[ind + 1] )
+ {
+ // Length is coded with 2 bytes -> real length is in second byte.
+ // first byte is 81 and it is tag for 2 byte length coding.
+ tlvLength = static_cast<TInt16>( iData[ind + 0x02] +
+ KTlvHeaderLength + 1 );
+ }
+ else
+ {
+ // TLV header bytes (2) must be added to total length
+ tlvLength = static_cast<TInt16>( iData[ind + 1] +
+ KTlvHeaderLength );
+ }
+
+ currentTlv = iData[ind]&KTagValueMask;
+
+ // Check if TLV in current index is the one that we are searching for
+ if ( aTlvTagValue == currentTlv && multiLength == 0x00 )
+ {
+ // Save first tag position
+ indMulti = ind;
+ multiLength = tlvLength;
+ }
+ // Add length
+ if ( aTlvTagValue == currentTlv && indMulti != ind )
+ {
+ multiLength = static_cast<TInt16>( multiLength + tlvLength );
+ }
+
+ // If last tag, return
+ if ( (i + tlvLength) >= berTlvLength )
+ {
+ TPtrC8 data = ( iData.Mid( indMulti , multiLength ) );
+ aTlv->SetData( data );
+ break;
+ }
+ ind += tlvLength;
+ }
+
+ if( 0 == indMulti)
+ {
+ return KErrNotFound;
+ }
+ else
+ {
+ return KErrNone;
+ }
+ }
+
+
+//End Of File