obex/obexprotocol/obextransport/src/obexinternalheader.cpp
changeset 54 4dc88a4ac6f4
parent 52 866b4af7ffbe
child 57 f6055a57ae18
--- a/obex/obexprotocol/obextransport/src/obexinternalheader.cpp	Tue Sep 28 20:14:08 2010 +0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,463 +0,0 @@
-// Copyright (c) 1997-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 <obex/internal/obexinternalheader.h>
-#include <es_sock.h>
-#include "logger.h"
-#include "obextransportfaults.h"
-#ifdef __FLOG_ACTIVE
-_LIT8(KLogComponent, "OBEXCT");
-#endif
-
-#ifdef _DEBUG
-_LIT(KPanicCat, "ObexIntHdr");
-#endif
-
-/** @internalComponent */
-const TUint8 KObexHeaderTypeMask = 0xc0;
-
-/**
-Constructor
-*/
-EXPORT_C TObexInternalHeader::TObexInternalHeader ()
-	{
-	LOG_LINE
-	LOG_FUNC
-
-	iHVSize = 0;
-	}
-
-/**
-Try to read a header from aSource, taking up to a maximum of aMaxSize bytes.
-Returns the number of bytes actually read out.
-*/
-TUint16 TObexInternalHeader::ParseIn (TUint8* aSource, const TUint16 aMaxSize)
-	{
-	iHVSize = 1;
-	if (aMaxSize < KObexHeaderHIShortSize + 1) return (0);
-	SetHI (STATIC_CAST(THeaderID, *aSource));
-
-	switch (HIType ())
-		{
-	case EUnicode:
-	case EByteSeq:	
-		if (aMaxSize < KObexHeaderHILongSize) return (0);
-		{
-		TInt hvsize = BigEndian::Get16 (&aSource[1]) - HISize ();
-		if (hvsize < 0) return (0);
-		iHVSize = STATIC_CAST(TUint16, hvsize);
-		}
-		iHV.iObex = &aSource[KObexHeaderHILongSize];
-		iHVRep = EHVObexDefault;
-		break;
-	case E4Byte:
-		iHVSize = 4; //fallthrough to case E1Byte
-	case E1Byte:
-		iHV.iObex = &aSource[KObexHeaderHIShortSize];
-		iHVRep = EHVObexDefault;
-		break;
-	default:
-		return (0);
-		}
-	if (aMaxSize < TotalSize ()) 
-		return (0);
-	return (TotalSize ());
-	}
-
-/**
-Write this header out to aDest, writting up to a max of aMaxSize bytes.
-returns the number of bytes actually written.
-All complicated by the fact that the internal rep. of the data in the header
-might be in one of a number of forms, as well as having to convert to the 
-correct OBEX form, all with heavy consideration for thick and thin builds.
-For unicode on the wire, we also need to to endian conversion too....
-*/
-TUint16 TObexInternalHeader::WriteOut (TUint8* aDest, const TUint16 aMaxSize) const
-	{
-	TInt byteswritten = TotalSize ();
-	if (aMaxSize < byteswritten) return (0);
-	*aDest = iHI;
-
-	switch (HIType ())
-		{
-	case EUnicode:
-	case EByteSeq:
-	// The following is arranged in order of expected frequency of use.
-	// The less common the conversion, the less effort is put to efficiency.
-		if (iHVRep == EHVDefered)
-			{// The data will actually be written after the header is inserted.
-			byteswritten = iHVMaxSize + KObexHeaderHILongSize;
-			if (byteswritten > aMaxSize)	
-				byteswritten = aMaxSize;
-			iHV.iDefered->Set (&aDest[KObexHeaderHILongSize], 0, byteswritten - KObexHeaderHILongSize);
-			}
-		else if (iHVRep == EHVObexDefault)
-			{// The easy case: just send the data directly
-			Mem::Copy (&aDest[KObexHeaderHILongSize], iHV.iObex, iHVSize);
-			}
-		else
-			{// Big time (Uniocde/Ascii) conversions necessary
-			TBufC<40> numbuf;
-			TPtr src (numbuf.Des ());
-			if (iHVRep == EHVInt)
-				{
-				if ( GetHVText(src) != KErrNone )
-					{
-					return (0);
-					}
-				}
-			else
-				{
-				src.Set (iHV.iMachine, iHVSize / sizeof (TText), iHVSize / sizeof (TText));
-				}
-			TInt i;
-			if (HIType () == EUnicode)
-				{// Need to convert to Unicode, from internal machine rep
-				byteswritten = KObexHeaderHILongSize;
-				if(src.Length())
-					{// Only need null term if the length is non-zero
-					byteswritten += (2 * (src.Length () + 1)); 
-									// 2 = Unicode word size, + 1 for null terminal
-					if (aMaxSize < byteswritten) return (0);
-					for (i = 0; i < src.Length (); ++i)
-						BigEndian::Put16 (&aDest[KObexHeaderHILongSize + (i * 2)], src[i]);
-					BigEndian::Put16 (&aDest[KObexHeaderHILongSize + (i * 2)], 0);		// Null term
-					}
-				}
-			else	// HIType == ByteSeq
-				{// Convert to obex "byte sequence", from internal machine rep.
-				byteswritten = KObexHeaderHILongSize + src.Length ();
-				if (aMaxSize < byteswritten) return (0);
-				for (i = 0; i < src.Length (); ++i)
-					aDest[KObexHeaderHILongSize + i] = STATIC_CAST(TUint8, src[i]);
-				}
-			}
-		BigEndian::Put16 (&aDest[1], STATIC_CAST(TUint16, byteswritten));
-		break;
-	case E1Byte:
-		aDest[KObexHeaderHIShortSize] = STATIC_CAST(TUint8, HVInt ());
-		break;
-	case E4Byte:
-		BigEndian::Put32 (&aDest[KObexHeaderHIShortSize], HVInt ());
-		break;
-	default:
-		return (0);
-		}
-	return (STATIC_CAST(TUint16, byteswritten));
-	}
-
-/**
-Setter for the header id
-
-@param aHID Header id
-*/
-EXPORT_C void TObexInternalHeader::SetHI (THeaderID aHID)
-	{
-	LOG_LINE
-	LOG_FUNC
-
-	iHI = aHID;
-	}
-	
-/**
-Setter for the header id and header value
-
-@param aHID Header id
-@param aValue Value for the header
-@see SetHI
-*/
-EXPORT_C void TObexInternalHeader::Set (THeaderID aHID, TInt aValue)
-	{
-	LOG_LINE
-	LOG_FUNC
-
-	SetHI (aHID);
-	iHV.iInt = aValue;
-	iHVRep = EHVInt;
-	}
-
-/**
-Setter for the header id,  header value and size of the header value
-
-@param aHID Header id
-@param aHV Header value
-@param aHVSize Size of the header value
-@see SetHI
-*/
-EXPORT_C void TObexInternalHeader::Set (THeaderID aHID, TUint8* aHV, TInt aHVSize)
-	{
-	LOG_LINE
-	LOG_FUNC
-
-	__ASSERT_DEBUG (aHV, PANIC (KPanicCat, ETransportNullPointer));
-	__ASSERT_DEBUG (aHVSize >= 0, PANIC (KPanicCat, EInvalidHeaderSize));
-	__ASSERT_DEBUG (aHVSize < (TInt)(KMaxTUint16 - 3), PANIC (KPanicCat, EInvalidHeaderSize));
-	SetHI (aHID);
-	iHV.iObex = aHV;
-	iHVSize = STATIC_CAST(TUint16, aHVSize);
-	iHVRep = EHVObexDefault;
-	}
-	
-/**
-Setter for the header id,  header value and size of the header value
-
-@param aHID Header id
-@param aString Descriptor containing the header value and its size
-@see SetHI
-*/
-EXPORT_C void TObexInternalHeader::Set (THeaderID aHID, const TDesC& aString)
-	{
-	LOG_LINE
-	LOG_FUNC
-
-	__ASSERT_DEBUG (aString.Size () <= (TInt)(KMaxTUint16 - 3), PANIC(KPanicCat, EStringOverflow));
-	SetHI (aHID);
-	iHV.iMachine = CONST_CAST(TText*, aString.Ptr ());
-	iHVSize = STATIC_CAST(TUint16, aString.Size ());
-	iHVRep = EHVMachineText;
-	}
-	
-/**
-Setter for the header id, the header value data inserter, min and max size
-
-@param aHID Header id
-@param aDataInserter Data inserter
-@param aMinSize Min size of header value
-@param aMaxSize Max size of header value
-@see SetHI
-*/
-EXPORT_C void TObexInternalHeader::SetDeferred (THeaderID aHID, TPtr8* aDataInserter, TInt aMinSize, TInt aMaxSize)
-	{
-	LOG_LINE
-	LOG_FUNC
-
-	__ASSERT_DEBUG (aMinSize > 0, PANIC(KPanicCat, EInvalidHeaderSize));
-	SetHI (aHID);
-	iHV.iDefered = aDataInserter;
-	iHVSize = STATIC_CAST (TUint16, aMinSize);
-	if (aMaxSize > TInt(KMaxTUint16 - KObexHeaderHILongSize))
-		iHVMaxSize = TUint16(KMaxTUint16 - (TUint)(KObexHeaderHILongSize));
-	else
-		iHVMaxSize = STATIC_CAST (TUint16, aMaxSize > aMinSize ? aMaxSize : aMinSize);
-	iHVRep = EHVDefered;
-	aDataInserter->Set (NULL, 0, 0);
-	}
-	
-/**
-Returns the internal header ID
-
-@return Internal header ID
-*/	 
-EXPORT_C TObexInternalHeader::THeaderID TObexInternalHeader::HI () const
-	{
-	LOG_LINE
-	LOG_FUNC
-
-	return (iHI);
-	}
-
-/**
-Returns the internal header type
-
-@return Internal header type
-*/	
-EXPORT_C TObexInternalHeader::THeaderType TObexInternalHeader::HIType () const
-	{
-	LOG_LINE
-	LOG_FUNC
-
-	return (STATIC_CAST(THeaderType, (HI () & KObexHeaderTypeMask)));
-	}
-
-/**
-Returns the internal header value
-
-@return Internal header value
-*/	
-EXPORT_C TInt TObexInternalHeader::HVInt () const
-	{
-	LOG_LINE
-	LOG_FUNC
-
-	if (iHVRep == EHVObexDefault)
-		{
-		if (HIType () == E4Byte)
-			return (BigEndian::Get32 (iHV.iObex));
-		else
-			return (*iHV.iObex);
-		}
-	if (iHVRep == EHVInt)
-		return (iHV.iInt);
-	// Don't bother converting machine strings to ints!
-	return (0);				
-	}
-
-/**
-Returns a pointer to the internal header value byte sequence
-
-@return Pointer to the internal header value byte sequence
-*/
-EXPORT_C TUint8* TObexInternalHeader::HVByteSeq () const
-	{
-	LOG_LINE
-	LOG_FUNC
-
-	if (iHVRep == EHVObexDefault)
-		return (iHV.iObex);
-	// Could do alsorts of fancy stuff else.
-	return (NULL);			
-	}
-
-/**
-Returns header value as text
-
-Take the HV and put "an appropriate" representation of it into aString.
-The stable mate of "WriteOut" in terms of nasty conversions, but again all 
-necessary in order to support both thick & thin builds.
-
-@return Error code
-*/
-EXPORT_C TInt TObexInternalHeader::GetHVText (TDes& aString) const
-    {
-	LOG_LINE
-	LOG_FUNC
-
-	switch (iHVRep)
-		{
-	case EHVMachineText:
-		FLOG(_L8("EHVMachineText"));
-		if (aString.Length () < STATIC_CAST(TInt, TUint(iHVSize / sizeof(TText))))
-			{
-			FLOG(_L8("Target descriptor too small"));
-			return (KErrBadDescriptor);
-			}
-			
-		aString.Copy (TPtr (iHV.iMachine, iHVSize / sizeof(TText), iHVSize / sizeof(TText)));
-		return (KErrNone);
-	
-	case EHVObexDefault:
-		FLOG(_L8("EHVObexDefault"));
-		if (HIType () == EUnicode)
-			{
-			// Unicode: read big endian and shove into descriptor
-			FLOG(_L8(" -Unicode"));
-			if (aString.MaxLength () < iHVSize / 2)
-				{
-				FLOG(_L8("Target descriptor too small"));
-				return (KErrBadDescriptor);
-				}
-			
-			aString.SetLength (iHVSize / 2);
-			TInt i;
-			for (i = 0; i < iHVSize / 2; ++i)
-				{
-				aString[i] = STATIC_CAST (TText, BigEndian::Get16 (&iHV.iObex[i * 2]));
-				}
-				
-			if (i > 0 && aString[--i] == 0) // Zero length headers have no null terminal!
-				{
-				// Make sure last char is null term, and chop it off
-				aString.SetLength (i);
-				}
-			
-			return (KErrNone);
-			}
-		
-		if (HIType () == EByteSeq)
-			{
-			// Descriptors can actually do the conversion for us here.
-			FLOG(_L8(" -ByteSeq"));
-			if (aString.MaxLength () < iHVSize)
-				{
-				FLOG(_L8("Target descriptor too small"));
-				return (KErrBadDescriptor);
-				}
-			
-			aString.Copy (TPtrC8 (iHV.iObex, iHVSize));
-			return (KErrNone);
-			}
-		break;
-		
-	case EHVInt:
-		FLOG(_L8("EHVInt"));
-		aString.Num (HVInt ());
-		return (KErrNone);
-	
-	default:
-		break;
-		}
-	
-	FLOG(_L8("Unknown error..."));
-	aString.SetLength (0);
-	return (KErrGeneral);
-	}
-
- TUint16 TObexInternalHeader::DoTotalSize () const
-	{
-	return (STATIC_CAST(TUint16, HISize () + HVSize ()));
-	}
-
-/**
-Returns the size of the internal header
-
-@return Size of the internal header
-*/
-EXPORT_C TUint16 TObexInternalHeader::HISize () const
-	{
-	LOG_LINE
-	LOG_FUNC
-
-	switch (HIType ())
-		{
-	case EUnicode:
-	case EByteSeq:	
-		return (KObexHeaderHILongSize);
-	case E1Byte:
-	case E4Byte:
-		return (KObexHeaderHIShortSize);
-	default:
-		return (0);
-		}
-	}
-	
-/**
-Returns the size of the internal header value
-
-@return Size of the internal header value
-*/
-EXPORT_C TUint16 TObexInternalHeader::HVSize () const
-	{
-	LOG_LINE
-	LOG_FUNC
-
-	if (iHVRep == EHVObexDefault || iHVRep == EHVDefered)
-		return (iHVSize);
-	TInt fact = 1;
-	switch (HIType ())
-		{
-	case EUnicode:
-		fact = 2; //fallthrough to case EByteSeq
-	case EByteSeq:	
-		if (iHVRep == EHVMachineText)
-			return (STATIC_CAST(TUint16, fact * iHVSize / sizeof (TText)));
-		return (40);
-	case E1Byte:
-		return (1);
-	case E4Byte:
-		return (4);
-	default:
-		return (0);
-		}
-	}