smsprotocols/smsstack/gsmu/src/gsmupriv.cpp
branchopencode
changeset 24 6638e7f4bd8f
parent 0 3553901f7fa8
--- a/smsprotocols/smsstack/gsmu/src/gsmupriv.cpp	Mon May 03 13:37:20 2010 +0300
+++ b/smsprotocols/smsstack/gsmu/src/gsmupriv.cpp	Thu May 06 15:10:38 2010 +0100
@@ -1,246 +1,246 @@
-// 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:
-// Implements utility classes private to the GSMU dll
-// 
-//
-
-/**
- @file
-*/
-
-#include "gsmupriv.h"
-#include "Gsmumain.h"
-#include <exterror.h>
-
-//
-// TSmsPacker - packs and unpacks data encoded in an SMS alphabet
-//
-
-/**
- *  Constructor
- */
-TSmsAlphabetPacker::TSmsAlphabetPacker(TSmsDataCodingScheme::TSmsAlphabet aAlphabet,TBool aIsBinary,TInt aStartBit)
-	: iAlphabet(aAlphabet),iIsBinary(aIsBinary),iStartBit(aStartBit)
-	{
-	// NOP
-	} // TSmsAlphabetPacker::TSmsAlphabetPacker
-
-
-/**
- *  Packs user data units from aIn and appends to aOut.
- */
-TInt TSmsAlphabetPacker::PackL(TDes8& aOut,const TDesC8& aIn)
-	{
-	LOGGSMU1("TSmsAlphabetPacker::PackL()");
-
-	// Ensure we've got the right length
-	TInt packedOctetsRequired=PackedOctetsRequiredL(aIn.Length());
-	if (packedOctetsRequired>(aOut.MaxLength()-aOut.Length()))
-		User::Leave(KErrOverflow);
-	// Do the conversion
-	TInt elementSizeInBits=ElementSizeInBitsL();
-	if (elementSizeInBits==8)
-		{
-		// Straight copy here
-		aOut.Append(aIn);
-		}
-	else if (elementSizeInBits==7)
-		{
-		// Get raw pointers and do packing
-		TUint8* outPtr=(TUint8*)aOut.Ptr()+aOut.Length();
-		const TUint8* inPtr=aIn.Ptr();
-
-		outPtr[0]=0;
-		for (TInt i=0; i<aIn.Length(); i++)
-			{
-			TUint8 to=inPtr[i];
-			*outPtr|=(to<<iStartBit);
-			if (iStartBit)
-				{
-				outPtr++;
-				*outPtr=(TUint8) (to>>(8-iStartBit));
-				}
-			iStartBit=(iStartBit+7)%8;
-			}
-		// Increment the length for the packed data
-		aOut.SetLength(aOut.Length()+packedOctetsRequired);
-		}
-	else
-		{
-		__ASSERT_DEBUG(EFalse,Panic(KGsmuPanicPackAlphabetInvalid));
-		}
-	// Return number of bytes used
-	return packedOctetsRequired;
-	} // TSmsAlphabetPacker::PackL
-
-
-/**
- *  Unpacks user data units from aIn and appends to aOut.
- */
-TInt TSmsAlphabetPacker::UnpackL(const TDesC8& aIn,TDes8& aOut,TInt aNumUDUnits)
-	{
-	LOGGSMU1("TSmsAlphabetPacker::UnpackL()");
-
-	TInt length=aNumUDUnits;
-	// Ensure we've got enough input and output buffer
- 	// defect fix for
- 	// EDNOPMA-4YPJ34	Short message with alphanumeric address in From field is not received
- 	// aIn.length is constant (KSmsAddressMaxAddressValueLength = 10)
- 	// PackedOctetsRequiredL is dependant on aNumUDUnits
- 	// otheriwse if a short alphanumeric address is received GSMU leaves
- 	// and the smsprot returns protocol error to the service center
- 	// if (PackedOctetsRequiredL(aIn.Length())>aNumUDUnits)
- 	if (PackedOctetsRequiredL(aNumUDUnits)>aIn.Length())
-		User::Leave(KErrCorrupt);
-	if (aOut.Length()+length>aOut.MaxLength())
-		User::Leave(KErrCorrupt);
-	TInt elementSizeInBits=ElementSizeInBitsL();
-	if (elementSizeInBits==8)
-		{
-		aOut.Append(aIn);
-		}
-	else if (elementSizeInBits==7)
-		{
-		// Get raw pointers and do packing
-		TUint8* outPtr=(TUint8*)aOut.Ptr()+aOut.Length();
-		const TUint8* inPtr=aIn.Ptr();
-
-		for (TInt i=0; i<length; i++)
-			{
-			TInt from=(*inPtr>>iStartBit) & 0x7F;
-			if (iStartBit)
-				{
-				inPtr++;
-				from|=(*inPtr<<(8-iStartBit)) & 0x7F;
-				}
-			outPtr[i]=(TUint8) from;
-			iStartBit=(iStartBit+7)%8;
-			}
-		aOut.SetLength(aOut.Length()+length);
-		}
-	else
-		{
-		__ASSERT_DEBUG(EFalse,Panic(KGsmuPanicPackAlphabetInvalid));
-		}
-	return length;
-	} // TSmsAlphabetPacker::UnpackL
-
-
-/**
- *  Converts then packs the input data, aIn, and appends to aOut
- */
-TInt TSmsAlphabetPacker::ConvertAndPackL(CCnvCharacterSetConverter& aCharacterSetConverter,RFs& aFs,TDes8& aOut,const TDesC& aIn,TInt& aConvertedNumUDUnits)
-    {
-	LOGGSMU1("TSmsAlphabetPacker::ConvertAndPackL()");
-
-	// Do the conversion
-	// VEP Fix for defect EXT-568BMW, when length of alphanumeric destination address
-	// was set wrong and also special characters defined in 7-bit default aplhabet (ä,ö...)
-	// were converted incorrectly
-	CSmsAlphabetConverter* converter=CSmsAlphabetConverter::NewLC(aCharacterSetConverter,aFs,iAlphabet,iIsBinary);
-	TPtrC8 convertedPtr=converter->ConvertFromNativeL(aIn);
-	aConvertedNumUDUnits=convertedPtr.Length();
-	// Do the packing
-	TInt octetsUsed=PackL(aOut,convertedPtr);
-	// Cleanup and return
-	CleanupStack::PopAndDestroy(converter);
-	return octetsUsed;
-    } // TSmsAlphabetPacker::ConvertAndPackL
-
-
-/**
- *  Unpacks the converts the input data, aIn, and appends to aOut
- */
-TInt TSmsAlphabetPacker::UnpackAndConvertL(CCnvCharacterSetConverter& aCharacterSetConverter,RFs& aFs,const TDesC8& aIn,TDes& aOut,TInt aNumUDUnits)
-	{
-	LOGGSMU1("TSmsAlphabetPacker::UnpackAndConvertL()");
-
-	// Unpack first
-	HBufC8* unpackedBuffer=HBufC8::NewLC(aNumUDUnits);
-	TPtr8 unpackedBufferPtr(unpackedBuffer->Des());
-	UnpackL(aIn,unpackedBufferPtr,aNumUDUnits);
-	// Convert
-	CSmsAlphabetConverter* converter=CSmsAlphabetConverter::NewLC(aCharacterSetConverter,aFs,iAlphabet,iIsBinary);
-	TPtrC convertedPtr=converter->ConvertToNativeL(*unpackedBuffer);
-	if (convertedPtr.Length()>(aOut.MaxLength()-aOut.Length()))
-		User::Leave(KErrCorrupt);
-	// Cleanup and return
-	aOut.Append(convertedPtr);
-	CleanupStack::PopAndDestroy(2);	// unpackedBuffer,converter
-	return aNumUDUnits;
-	} // TSmsAlphabetPacker::UnpackAndConvertL
-
-
-/**
- *  Returns the number of octets needed to pack the specified number of
- */
-TInt TSmsAlphabetPacker::PackedOctetsRequiredL(TInt aNumUDUnits) const
-	{
-	LOGGSMU1("TSmsAlphabetPacker::PackedOctetsRequiredL()");
-
-	TInt octetsRequired=0;
-	TInt elementSizeInBits=ElementSizeInBitsL();
-	if (elementSizeInBits==8)
-		octetsRequired=aNumUDUnits;
-	else
-		octetsRequired=(iStartBit+aNumUDUnits*elementSizeInBits + 7)/8;	// Rounds up
-	return octetsRequired;
-	} // TSmsAlphabetPacker::PackedOctetsRequiredL
-
-/**
- * Returns the number of UD units that are packed in the specified number of octets
- */
-TInt TSmsAlphabetPacker::NumUDUnitsL(TInt aOctets) const
-	{
-	TInt numUD=0;
-	TInt elementSizeInBits=ElementSizeInBitsL();
-	if (elementSizeInBits==8)
-		numUD=aOctets;
-	else
-		numUD=(8*aOctets - iStartBit)/elementSizeInBits;
-	return numUD;
-	}
-
-/**
- *  Returns the size in bits of a UDL element for the alphabet.  Leaves if
- *  invalid data coding scheme.
- */
-TInt TSmsAlphabetPacker::ElementSizeInBitsL() const
-	{
-	LOGGSMU1("TSmsAlphabetPacker::ElementSizeInBitsL()");
-
-    TInt ret = 8;
-
-	if (iIsBinary)
-		return ret;
-	switch (iAlphabet)
-		{
-		case TSmsDataCodingScheme::ESmsAlphabet7Bit:
-			{
-			ret = 7;
-            break;
-			}
-		case TSmsDataCodingScheme::ESmsAlphabet8Bit:
-		case TSmsDataCodingScheme::ESmsAlphabetUCS2:
-			{
-			ret = 8;
-            break;
-			}
-		default:
-			{
-            User::Leave(KErrGsmSMSDataCodingSchemeNotSupported);
-			}
-		}
-    return ret;
-	} // TSmsAlphabetPacker::ElementSizeInBitsL
+// 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:
+// Implements utility classes private to the GSMU dll
+// 
+//
+
+/**
+ @file
+*/
+
+#include "gsmupriv.h"
+#include "Gsmumain.h"
+#include <exterror.h>
+
+//
+// TSmsPacker - packs and unpacks data encoded in an SMS alphabet
+//
+
+/**
+ *  Constructor
+ */
+TSmsAlphabetPacker::TSmsAlphabetPacker(TSmsDataCodingScheme::TSmsAlphabet aAlphabet,TBool aIsBinary,TInt aStartBit)
+	: iAlphabet(aAlphabet),iIsBinary(aIsBinary),iStartBit(aStartBit)
+	{
+	// NOP
+	} // TSmsAlphabetPacker::TSmsAlphabetPacker
+
+
+/**
+ *  Packs user data units from aIn and appends to aOut.
+ */
+TInt TSmsAlphabetPacker::PackL(TDes8& aOut,const TDesC8& aIn)
+	{
+	LOGGSMU1("TSmsAlphabetPacker::PackL()");
+
+	// Ensure we've got the right length
+	TInt packedOctetsRequired=PackedOctetsRequiredL(aIn.Length());
+	if (packedOctetsRequired>(aOut.MaxLength()-aOut.Length()))
+		User::Leave(KErrOverflow);
+	// Do the conversion
+	TInt elementSizeInBits=ElementSizeInBitsL();
+	if (elementSizeInBits==8)
+		{
+		// Straight copy here
+		aOut.Append(aIn);
+		}
+	else if (elementSizeInBits==7)
+		{
+		// Get raw pointers and do packing
+		TUint8* outPtr=(TUint8*)aOut.Ptr()+aOut.Length();
+		const TUint8* inPtr=aIn.Ptr();
+
+		outPtr[0]=0;
+		for (TInt i=0; i<aIn.Length(); i++)
+			{
+			TUint8 to=inPtr[i];
+			*outPtr|=(to<<iStartBit);
+			if (iStartBit)
+				{
+				outPtr++;
+				*outPtr=(TUint8) (to>>(8-iStartBit));
+				}
+			iStartBit=(iStartBit+7)%8;
+			}
+		// Increment the length for the packed data
+		aOut.SetLength(aOut.Length()+packedOctetsRequired);
+		}
+	else
+		{
+		__ASSERT_DEBUG(EFalse,Panic(KGsmuPanicPackAlphabetInvalid));
+		}
+	// Return number of bytes used
+	return packedOctetsRequired;
+	} // TSmsAlphabetPacker::PackL
+
+
+/**
+ *  Unpacks user data units from aIn and appends to aOut.
+ */
+TInt TSmsAlphabetPacker::UnpackL(const TDesC8& aIn,TDes8& aOut,TInt aNumUDUnits)
+	{
+	LOGGSMU1("TSmsAlphabetPacker::UnpackL()");
+
+	TInt length=aNumUDUnits;
+	// Ensure we've got enough input and output buffer
+ 	// defect fix for
+ 	// EDNOPMA-4YPJ34	Short message with alphanumeric address in From field is not received
+ 	// aIn.length is constant (KSmsAddressMaxAddressValueLength = 10)
+ 	// PackedOctetsRequiredL is dependant on aNumUDUnits
+ 	// otheriwse if a short alphanumeric address is received GSMU leaves
+ 	// and the smsprot returns protocol error to the service center
+ 	// if (PackedOctetsRequiredL(aIn.Length())>aNumUDUnits)
+ 	if (PackedOctetsRequiredL(aNumUDUnits)>aIn.Length())
+		User::Leave(KErrCorrupt);
+	if (aOut.Length()+length>aOut.MaxLength())
+		User::Leave(KErrCorrupt);
+	TInt elementSizeInBits=ElementSizeInBitsL();
+	if (elementSizeInBits==8)
+		{
+		aOut.Append(aIn);
+		}
+	else if (elementSizeInBits==7)
+		{
+		// Get raw pointers and do packing
+		TUint8* outPtr=(TUint8*)aOut.Ptr()+aOut.Length();
+		const TUint8* inPtr=aIn.Ptr();
+
+		for (TInt i=0; i<length; i++)
+			{
+			TInt from=(*inPtr>>iStartBit) & 0x7F;
+			if (iStartBit)
+				{
+				inPtr++;
+				from|=(*inPtr<<(8-iStartBit)) & 0x7F;
+				}
+			outPtr[i]=(TUint8) from;
+			iStartBit=(iStartBit+7)%8;
+			}
+		aOut.SetLength(aOut.Length()+length);
+		}
+	else
+		{
+		__ASSERT_DEBUG(EFalse,Panic(KGsmuPanicPackAlphabetInvalid));
+		}
+	return length;
+	} // TSmsAlphabetPacker::UnpackL
+
+
+/**
+ *  Converts then packs the input data, aIn, and appends to aOut
+ */
+TInt TSmsAlphabetPacker::ConvertAndPackL(CCnvCharacterSetConverter& aCharacterSetConverter,RFs& aFs,TDes8& aOut,const TDesC& aIn,TInt& aConvertedNumUDUnits)
+    {
+	LOGGSMU1("TSmsAlphabetPacker::ConvertAndPackL()");
+
+	// Do the conversion
+	// VEP Fix for defect EXT-568BMW, when length of alphanumeric destination address
+	// was set wrong and also special characters defined in 7-bit default aplhabet (ä,ö...)
+	// were converted incorrectly
+	CSmsAlphabetConverter* converter=CSmsAlphabetConverter::NewLC(aCharacterSetConverter,aFs,iAlphabet,iIsBinary);
+	TPtrC8 convertedPtr=converter->ConvertFromNativeL(aIn);
+	aConvertedNumUDUnits=convertedPtr.Length();
+	// Do the packing
+	TInt octetsUsed=PackL(aOut,convertedPtr);
+	// Cleanup and return
+	CleanupStack::PopAndDestroy(converter);
+	return octetsUsed;
+    } // TSmsAlphabetPacker::ConvertAndPackL
+
+
+/**
+ *  Unpacks the converts the input data, aIn, and appends to aOut
+ */
+TInt TSmsAlphabetPacker::UnpackAndConvertL(CCnvCharacterSetConverter& aCharacterSetConverter,RFs& aFs,const TDesC8& aIn,TDes& aOut,TInt aNumUDUnits)
+	{
+	LOGGSMU1("TSmsAlphabetPacker::UnpackAndConvertL()");
+
+	// Unpack first
+	HBufC8* unpackedBuffer=HBufC8::NewLC(aNumUDUnits);
+	TPtr8 unpackedBufferPtr(unpackedBuffer->Des());
+	UnpackL(aIn,unpackedBufferPtr,aNumUDUnits);
+	// Convert
+	CSmsAlphabetConverter* converter=CSmsAlphabetConverter::NewLC(aCharacterSetConverter,aFs,iAlphabet,iIsBinary);
+	TPtrC convertedPtr=converter->ConvertToNativeL(*unpackedBuffer);
+	if (convertedPtr.Length()>(aOut.MaxLength()-aOut.Length()))
+		User::Leave(KErrCorrupt);
+	// Cleanup and return
+	aOut.Append(convertedPtr);
+	CleanupStack::PopAndDestroy(2);	// unpackedBuffer,converter
+	return aNumUDUnits;
+	} // TSmsAlphabetPacker::UnpackAndConvertL
+
+
+/**
+ *  Returns the number of octets needed to pack the specified number of
+ */
+TInt TSmsAlphabetPacker::PackedOctetsRequiredL(TInt aNumUDUnits) const
+	{
+	LOGGSMU1("TSmsAlphabetPacker::PackedOctetsRequiredL()");
+
+	TInt octetsRequired=0;
+	TInt elementSizeInBits=ElementSizeInBitsL();
+	if (elementSizeInBits==8)
+		octetsRequired=aNumUDUnits;
+	else
+		octetsRequired=(iStartBit+aNumUDUnits*elementSizeInBits + 7)/8;	// Rounds up
+	return octetsRequired;
+	} // TSmsAlphabetPacker::PackedOctetsRequiredL
+
+/**
+ * Returns the number of UD units that are packed in the specified number of octets
+ */
+TInt TSmsAlphabetPacker::NumUDUnitsL(TInt aOctets) const
+	{
+	TInt numUD=0;
+	TInt elementSizeInBits=ElementSizeInBitsL();
+	if (elementSizeInBits==8)
+		numUD=aOctets;
+	else
+		numUD=(8*aOctets - iStartBit)/elementSizeInBits;
+	return numUD;
+	}
+
+/**
+ *  Returns the size in bits of a UDL element for the alphabet.  Leaves if
+ *  invalid data coding scheme.
+ */
+TInt TSmsAlphabetPacker::ElementSizeInBitsL() const
+	{
+	LOGGSMU1("TSmsAlphabetPacker::ElementSizeInBitsL()");
+
+    TInt ret = 8;
+
+	if (iIsBinary)
+		return ret;
+	switch (iAlphabet)
+		{
+		case TSmsDataCodingScheme::ESmsAlphabet7Bit:
+			{
+			ret = 7;
+            break;
+			}
+		case TSmsDataCodingScheme::ESmsAlphabet8Bit:
+		case TSmsDataCodingScheme::ESmsAlphabetUCS2:
+			{
+			ret = 8;
+            break;
+			}
+		default:
+			{
+            User::Leave(KErrGsmSMSDataCodingSchemeNotSupported);
+			}
+		}
+    return ret;
+	} // TSmsAlphabetPacker::ElementSizeInBitsL