diff -r 000000000000 -r 29b1cd4cb562 bluetoothmgmt/bluetoothclientlib/avlib/avctppacketstatics.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothmgmt/bluetoothclientlib/avlib/avctppacketstatics.cpp Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,202 @@ +// 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: +// + +/** + @file + @internalComponent +*/ + +#include +#include + +#include "avctppacketstatics.h" + +#ifdef __FLOG_ACTIVE +_LIT8(KLogComponent, LOG_COMPONENT_AVLIB); +#endif + +#ifdef _DEBUG +PANICCATEGORY("pktstats"); +#endif + +namespace SymbianAvctp + { +enum TAvctpLibPanic + { + /** Unknown Packet Type */ + EAvctpLibUnknownPacketType = 0, + /** Incorrect Packet Type */ + EAvctpLibIncorrectPacketType = 1, + /** Invalid Transaction label */ + EAvctpLibInvalidTransactionLabel = 2, + }; + +void Panic(TAvctpLibPanic aPanic) + { + _LIT(KAvctpLibPanicName, "BtAvAvctpPanic"); + User::Panic(KAvctpLibPanicName, aPanic); + } + +EXPORT_C TPduHeaderLength ConvertPacketTypeToHeaderLength(TPacketType aPktType) + { + TPduHeaderLength ret = ENormalHeaderLength; + switch (aPktType) { + case ENormalPkt: + // leave ret as ENormalHeaderLength; + break; + case EStartFrag: + ret = EStartFragHeaderLength; + break; + case EContinueFrag: + case EEndFrag: + ret = EOtherFragHeaderLength; + break; + default: + Panic(EAvctpLibUnknownPacketType); + break; + } + return ret; + } + +/** +Provides a method to assert that AVCTP transaction Labels +are valid + + @internalTechnology + @param aLabel the label to check +*/ +EXPORT_C void AssertValidTransactionLabel(TTransactionLabel aLabel) + { + __ASSERT_ALWAYS (IsValidTransactionLabel(aLabel), + Panic(EAvctpLibInvalidTransactionLabel)); + } + + +/** +Provides a method to validate AVCTP transaction Labels + + @internalTechnology + @param aLabel the label to check + @return ETrue if the label is valid, EFalse otherwise +*/ +EXPORT_C TBool IsValidTransactionLabel(TTransactionLabel aLabel) + { + return (aLabel < KMaxTransactionLabel); + } + +/** +The AVCTP transaction label + + @internalComponent + @return The transaction label +*/ +EXPORT_C TTransactionLabel TransactionLabel(const TDesC8& aData) + { + ASSERT_DEBUG(aData.Length() >= EOtherFragHeaderLength); // since EStartFragHeaderLength & ENormalHeaderLength are > EOtherFragHeaderLength + + return static_cast((*const_cast(aData.Ptr()) & KTransactionMask) >> 4); + } + + +/** +The AVCTP message type + + @internalComponent + @return The message type +*/ +EXPORT_C TMessageType MessageType(const TDesC8& aData) + { + ASSERT_DEBUG(aData.Length() >= EOtherFragHeaderLength); // since EStartFragHeaderLength & ENormalHeaderLength are > EOtherFragHeaderLength + + return static_cast(((*const_cast(aData.Ptr()) & KMessageTypeMask) >> 1) + 1); + } + + +/** +The AVCTP packet type + + @internalComponent + @return The packet type +*/ +EXPORT_C TPacketType PacketType(const TDesC8& aData) + { + ASSERT_DEBUG(aData.Length() >= EOtherFragHeaderLength); // since EStartFragHeaderLength & ENormalHeaderLength are > EOtherFragHeaderLength + + return static_cast((*const_cast(aData.Ptr()) & KPacketTypeMask) >> 2); + } + +/** +The AVCTP PID + + @internalComponent + @return The packet's PID +*/ +EXPORT_C TPid Pid(const TDesC8& aData) + { + ASSERT_DEBUG(aData.Length() >= ENormalHeaderLength); // since EStartFragHeaderLength is > ENormalHeaderLength + + TPacketType pkt = PacketType(aData); + TPid pid = 0; + + switch (pkt) + { + case ENormalPkt: + { + pid = TPid(BigEndian::Get16(const_cast(aData.Ptr()) + 1)); + break; + } + case EStartFrag: + { + pid = TPid(BigEndian::Get16(const_cast(aData.Ptr()) + 2)); + break; + } + default: + { + Panic(EAvctpLibIncorrectPacketType); + } + } + return pid; + } + + +/** +Check that the invalid PID bit is not set. + + @internalComponent + @return ETrue if the bit is not set, EFalse otherwise +*/ +EXPORT_C TBool IsValidPid(const TDesC8& aData) + { + ASSERT_DEBUG(aData.Length() >= EOtherFragHeaderLength); // since EStartFragHeaderLength & ENormalHeaderLength are > EOtherFragHeaderLength + __ASSERT_DEBUG(PacketType(aData) == ENormalPkt || + PacketType(aData) == EStartFrag, + Panic(EAvctpLibIncorrectPacketType)); + + return ((*const_cast(aData.Ptr()) & KIsValidPidMask) == 0); + } + + +EXPORT_C TUint8 FragmentsInSdu(const TDesC8& aData) + { + ASSERT_DEBUG(aData.Length() >= EStartFragHeaderLength); + __ASSERT_DEBUG(PacketType(aData) == EStartFrag, Panic(EAvctpLibIncorrectPacketType)); + + return *(const_cast(aData.Ptr()) + 1); + } + +} // end of namespace SymbianAvctp + +// EOF +