diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/src/cdnspacket.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/src/cdnspacket.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,254 @@ +/* +* Copyright (c) 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 "cdnspacket.h" + + +CDnsPacket::CDnsPacket(const TDes8& aPacketPtr): iPtr(aPacketPtr.Ptr()),iDataLength(aPacketPtr.Size()), + iMaxLength(aPacketPtr.MaxSize()) + { + } + +CDnsPacket* CDnsPacket::NewL(const TDes8& aPacketPtr) + { + CDnsPacket* self = new (ELeave) CDnsPacket( aPacketPtr ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CDnsPacket::~CDnsPacket() + { + } + +void CDnsPacket::ConstructL() + { + iIndex = 0; + } + +TUint8 CDnsPacket::GetCharL() + { + __OOB(iIndex,iDataLength) + TUint8 val = *(iPtr+iIndex); + iIndex += sizeof(TUint8); + return val; + } + +TUint16 CDnsPacket::GetInt16L() + { + __OOB(iIndex,iDataLength) + TUint16 val = BigEndian::Get16(iPtr+iIndex); + iIndex += sizeof(TUint16); + return val; + } + +TUint32 CDnsPacket::GetInt32L() + { + __OOB(iIndex,iDataLength) + TUint32 val = BigEndian::Get32(iPtr+iIndex); + iIndex += sizeof(TUint32); + return val; + } + +const TDnsHeader& CDnsPacket::GetHeaderL() + { + iHeader.SetId(GetInt16L()); + iHeader.SetFlags(GetInt16L()); + iHeader.SetQueryCount(GetInt16L()); + iHeader.SetAnswerCount(GetInt16L()); + iHeader.SetAuthorityNSCount(GetInt16L()); + iHeader.SetAdditionalRCount(GetInt16L()); + + return iHeader; + } + +void CDnsPacket::GetDomainNameL(TDes8& aName) + { + TInt labelLen = GetCharL(); + RBuf8 label; + TInt isStartingWithPointer = labelLen & KPointerBit; + + if(isStartingWithPointer) + { + TUint16 pointerOffset = labelLen & KPointerOffsetBit; + __OOB(pointerOffset,iDataLength) + pointerOffset = (pointerOffset << 8) + GetCharL(); + GetDomainNameAtIndexL(aName, pointerOffset); + } + else + { + while(labelLen) + { + TInt isPointer = labelLen & KPointerBit; + if(isPointer) + { + TUint16 pointerOffset = labelLen & KPointerOffsetBit; + __OOB(pointerOffset,iDataLength) + pointerOffset = (pointerOffset << 8) + GetCharL(); + label.CreateL(KMaxDNSNameLength); + GetStringAtIndexL(label,pointerOffset); + } + else + { + label.CreateL(labelLen); + GetStringL(label,labelLen); + } + aName.Append(label); + if(aName[aName.Size()-1]!='.') + aName.Append(KDot); + label.Close(); + if(isPointer ) + { + break; + } + else + { + labelLen = GetCharL(); + } + } + } + } + +void CDnsPacket::GetRdDomainNameL(TDes8& aDomainName,TUint aLength) + { + TInt labelLen = GetCharL(); + aLength--; + RBuf8 label; + TInt isStartingWithPointer = labelLen & KPointerBit; + + while(aLength) + { + TInt isPointer = labelLen & KPointerBit; + if(isPointer) + { + TUint16 pointerOffset = labelLen & KPointerOffsetBit; + __OOB(pointerOffset,iDataLength) + pointerOffset = (pointerOffset << 8) + GetCharL(); + aLength--; + label.CreateL(KMaxLabelLength); + if(isStartingWithPointer ) + { + GetDomainNameAtIndexL(aDomainName, pointerOffset); + } + else + { + GetDomainNameAtIndexL(label, pointerOffset); + //GetStringAtIndexL(label, pointerOffset); + } + } + else + { + label.CreateL(labelLen); + GetStringL(label,labelLen); + aLength-=labelLen; + } + + aDomainName.Append(label); + label.Close(); + if(isStartingWithPointer) + { + break; + } + else + { + if(aLength ) + { + labelLen = GetCharL(); + aLength--; + if(aDomainName[aDomainName.Size()-1]!='.') + aDomainName.Append(KDot); + } + } + } + } + +void CDnsPacket::GetStringL(TDes8& aString, TUint16 aLength) + { + __OOB(iIndex,iDataLength) + aString.Copy(iPtr+iIndex,aLength); + iIndex+= aLength; + } + +void CDnsPacket::GetDomainNameAtIndexL(TDes8& aDomainName, TUint aOffset) + { + __OOB(aOffset,iDataLength) + TUint8 labelLen = *(iPtr + aOffset); + RBuf8 label; + TInt isPointer; + TUint16 pointerOffset; + TInt isStartingWithPointer = labelLen & KPointerBit; + TUint8 ptrPos; + if(isStartingWithPointer) + { + pointerOffset = labelLen & KPointerOffsetBit; + __OOB(aOffset,iDataLength) + aOffset++; + ptrPos = *(iPtr + aOffset); + pointerOffset = (pointerOffset << 8) + ptrPos; + GetDomainNameAtIndexL(aDomainName, pointerOffset); + } + else + { + while(labelLen) + { + label.CreateL(KMaxLabelLength); + GetStringAtIndexL(label, aOffset); + aDomainName.Append(label); + if(aDomainName[aDomainName.Size()-1]!='.') + aDomainName.Append(KDot); + __OOB(aOffset,iDataLength) + aOffset++; // increment by one byte for length field + aOffset += labelLen; + label.Close(); + labelLen = *(iPtr + aOffset); + isPointer = labelLen & KPointerBit; + if(isPointer) + { + pointerOffset = labelLen & KPointerOffsetBit; + __OOB(aOffset,iDataLength) + aOffset++; + ptrPos = *(iPtr + aOffset); + pointerOffset = (pointerOffset << 8) + ptrPos; + label.CreateL(KMaxLabelLength); + GetStringAtIndexL(label, pointerOffset); + aDomainName.Append(label); + if(aDomainName[aDomainName.Size()-1]!='.') + aDomainName.Append(KDot); + label.Close(); + break; + } + } + } + } + +void CDnsPacket::GetStringAtIndexL(TDes8& aLabel, TUint aOffset) + { + __OOB(aOffset,iDataLength) + TUint8 labelLen = *(iPtr + aOffset); + if(labelLen & KPointerBit) // recursive pointers + { + TUint16 pointerOffset = labelLen & KPointerOffsetBit; + pointerOffset = (pointerOffset << 8) + GetCharL(); + GetStringAtIndexL(aLabel, pointerOffset); + } + else + { + aLabel.Copy(iPtr+aOffset+1, labelLen); + } + }