messagingfw/wappushfw/pushutils/src/WapDecoder.cpp
changeset 0 8e480a14352b
child 44 7c176670643f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/wappushfw/pushutils/src/WapDecoder.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,136 @@
+// 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 "wapdecoder.h"
+
+const TInt KMaxLongIntSize = 0x1E;	// Long-integer can have maximum 30 OCTETS (WSP Spec)
+
+/**
+Extracts a WAP variable length integer from a binary data buffer.
+
+@param	aSource 
+Input binary data buffer.
+
+@param	aStartIndex
+Position in aSource from which to extract the integer.
+
+@param	aMultiByte
+On return, the extracted variable length integer.
+
+@leave	KErrCorrupt
+A valid variable length integer was not found in the buffer.
+*/
+EXPORT_C void TWapBinCodex::ExtractUIntvarL(const TDesC8& aSource, TInt aStartIndex, TWapBinCodex::TUintvar& aMultiByte)
+	{
+	TUint8 byte = 0, topThreeBits = 0;
+	aMultiByte.iValue = 0;
+	aMultiByte.iOctetSize = 0;
+	TInt lenLeft = aSource.Length() - aStartIndex;
+
+	if (lenLeft <= 0)
+		User::Leave(KErrCorrupt);
+	
+	// get the first octet
+	byte = aSource[aStartIndex];
+
+	// if the topThreeBits are set and we are using all 5 octets, this is corrupt data
+	topThreeBits |= byte & 0x70; 
+	
+	// copy over the top byte
+	aMultiByte.iValue |= byte & ~0x80;
+	++aMultiByte.iOctetSize;
+
+	// while the top 'continue' byte is set and we have more data
+	while ((byte & 0x80) && (aMultiByte.iOctetSize < 5) && (--lenLeft > 0))
+	{
+		aMultiByte.iValue <<= 7;
+		byte = aSource[aStartIndex + aMultiByte.iOctetSize++];
+		aMultiByte.iValue |= byte & ~0x80;
+	} 
+
+	// last octet had continue bit set ... NOT allowed or aSource wasn't complete
+	if (byte & 0x80)
+		User::Leave(KErrCorrupt);
+
+	// this was encoded wrong and the topThreeBits are about to shift off ... NOT allowed
+	if (aMultiByte.iOctetSize == 5 && topThreeBits)
+		User::Leave(KErrCorrupt);
+
+	}
+
+/**
+Extracts a WAP-encoded multi-octet integer from a binary data buffer.
+
+The function will panic if the binary data is corrupt.
+
+@param	aSource
+The binary data buffer containing the integer.
+
+@param	aInt
+The output argument with the parsed integer.
+
+@panic
+The binary data buffer is corrupted (debug only).
+
+@deprecated TWapBinCodex::ParseMultiOctetInteger function.
+Use the new 
+*/
+EXPORT_C void TWapBinCodex::ExtractMultiOctetInteger(const TDesC8& aSource, TInt& aInt)
+/* 
+ * NOTE - It is a straight copy from CHttpResponse as the function isn't exported, and it is  
+ * not possible to change the interface to the Wapplugins dll. 
+ */
+	{
+	// Get num bytes encoding the integer - 
+	// we are positioned at that location in the source descriptor
+	TUint8 numBytes = aSource[0];
+	aInt = 0;
+	__ASSERT_DEBUG(numBytes < aSource.Length(), User::Invariant());
+	// Loop over the source, taking each byte and shifting it in to the count.  
+    for (TInt count = 1; (count <= numBytes); count++)
+        aInt = (aInt << 8) + aSource[count];
+	}
+
+/**
+Extracts a WAP-encoded multi-octet integer from a binary data buffer.
+
+If the integer could not be parsed, then the output argument aInt is not valid.
+
+@param
+aSource	The binary data buffer containing the integer.
+
+@param
+aInt	The output argument with the parsed integer.
+
+@return
+The number of bytes parsed or an error code. A value of KErrCorrupt indicates 
+that the data buffer contained a corrupted multi-octet integer.
+*/
+EXPORT_C TInt TWapBinCodex::ParseMultiOctetInteger(const TDesC8& aSource, TInt& aInt)
+	{
+	// Get num bytes encoding the integer.
+	TUint8 numBytes = aSource[0];
+	aInt = 0;
+	
+	if( numBytes > aSource.Length() - 1 || numBytes > KMaxLongIntSize )
+		return KErrCorrupt;
+	
+	// Loop over the source, taking each byte and shifting it in to the count.  
+    for (TInt count = 1; (count <= numBytes); ++count)
+        aInt = (aInt << 8) + aSource[count];
+
+	return numBytes + 1;
+	}
+