diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btsdp/database/sdputil.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetooth/btsdp/database/sdputil.cpp Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,169 @@ +// Copyright (c) 2000-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: +// + +#include +#include +#include "sdputil.h" + +void DbPanic(TSdpDbPanic aCode) + { + User::Panic(KSdpDatabasePanicString, aCode); + } + +void ParsePanic(TSdpParsePanic aCode) + { + User::Panic(KSdpParsePanicString, aCode); + } + +EXPORT_C TUint SdpUtil::GetUint(const TDesC8& aData) +/** Gets an unsigned integer from a descriptor. + +@param aData The descriptor containing the integer +@return The unsigned integer contained in the descriptor +*/ + { + switch(aData.Length()) + { + case 0: + return 0; + case 1: + return aData[0]; + case 2: + return BigEndian::Get16(aData.Ptr()); + case 4: + return BigEndian::Get32(aData.Ptr()); + default: + ParsePanic(EGetUintBadDescriptorLength); + return 0; + } + } + +EXPORT_C void SdpUtil::PutUint(TUint8* aPtr, TInt64 aInt, TInt aNumberOfBytes) +/** Puts an unsigned integer into a descriptor. + +@param aPtr Pointer to the descriptor's data field +@param aInt Integer to be copied into descriptor +@param aNumberOfBytes Number of bytes occupied by integer +*/ + { + for(TInt i = aNumberOfBytes - 1; i >= 0; --i) + { + aPtr[i] = (static_cast(I64LOW(aInt))); + aInt >>= 8; + } + } + +/* +Puts a TUint64 into a descriptor + +@param aPtr Pointer to the descriptor's data field +@param aNumber The unsigned 64 bit integer to be copied into the descriptor +*/ +EXPORT_C void SdpUtil::PutUint64(TUint8* aPtr, const TUint64& aNumber) + { + TUint8 temp; + TUint64 number = aNumber; + + for (TInt i = sizeof(TUint64) -1; i >= 0; i--) + { + temp = number & 0xFF; // transfer the lowest byte.. + aPtr[i] = temp; //.. into the right hand side of the descriptor + number >>= 8; + } + } + + +/* +Gets a TUint64 from a descriptor + +@param aData The descriptor containing the integer +@param aNumber The unsigned 64 bit integer contained in the descriptor +*/ +EXPORT_C void SdpUtil::GetUint64(const TDesC8& aData, TUint64& aNumber) + { + if (aData.Length() != 8) //i.e. 64/8 + { + ParsePanic(EGetUint64BadDescriptorLength); + return; + } + + const TUint8* dataPtr = aData.Ptr(); + + aNumber = (static_cast(dataPtr[0])<<56) | (static_cast(dataPtr[1])<<48) | + (static_cast(dataPtr[2])<<40) | (static_cast(dataPtr[3])<<32) | + (static_cast(dataPtr[4])<<24) | (static_cast(dataPtr[5])<<16) | + (static_cast(dataPtr[6])<<8) | (static_cast(dataPtr[7]) ); + + } + + +EXPORT_C void SdpUtil::PutUint128(TUint8* aPtr, const TUint64& aLo, const TUint64& aHi) +/** +Puts two unsigned 64 bit integers into a descriptor. + +@param aPtr Pointer to the descriptor's data field +@param aLo The 64 lower bits of a 128 bit integer to be copied into the descriptor +@param aHi The 64 higher bits of a 128 bit integer to be copied into the descriptor +*/ + { + TUint8 tempLow; + TUint8 tempHigh; + TUint64 lowNumber = aLo; + TUint64 highNumber = aHi; + TInt offset = sizeof(TUint64); + + for(TInt i = offset -1; i >= 0; i--) + { + tempLow = lowNumber & 0xFF; // transfer the lowest byte.. + aPtr[i+offset] = tempLow; //.. into the right hand side of the descriptor + lowNumber >>= 8; + + tempHigh = highNumber & 0xFF; + aPtr[i] = tempHigh; + highNumber >>= 8; + } + + } + + +/* +Gets two TUint64s, one being the high 64 bits and one being the low 64 bits of a 128 bit integer + +@param aData The descriptor containing the integer +@param aLo The unsigned 64 bit integer contains the lower bits of the 128 bit integer contained in the descriptor +@param aHi The unsigned 64 bit integer contains the higher bits of the 128 bit integer contained in the descriptor +*/ +EXPORT_C void SdpUtil::GetUint128(const TDesC8& aData, TUint64& aLo, TUint64& aHi) + { + if (aData.Length() != 16) //i.e. 128/8 + { + ParsePanic(EGetUint128BadDescriptorLength); + } + + const TUint8* dataPtr = aData.Ptr(); + + // left hand side of the descriptor transfers to the high TUint64 + aHi = (static_cast(dataPtr[0])<<56) | (static_cast(dataPtr[1])<<48) | + (static_cast(dataPtr[2])<<40) | (static_cast(dataPtr[3])<<32) | + (static_cast(dataPtr[4])<<24) | (static_cast(dataPtr[5])<<16) | + (static_cast(dataPtr[6])<<8) | (static_cast(dataPtr[7]) ); + + // right hand side of the descriptor transfers to the low TUint64 + aLo = (static_cast(dataPtr[8])<<56) | (static_cast(dataPtr[9])<<48) | + (static_cast(dataPtr[10])<<40) | (static_cast(dataPtr[11])<<32) | + (static_cast(dataPtr[12])<<24) | (static_cast(dataPtr[13])<<16) | + (static_cast(dataPtr[14])<<8) | (static_cast(dataPtr[15]) ); + + }