telephonyserverplugins/simtsy/src/utils.cpp
changeset 0 3553901f7fa8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/simtsy/src/utils.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,345 @@
+// Copyright (c) 2001-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:
+// Contains a number of utility classes that are of general use
+// thoughout the TSY.
+// 
+//
+
+/**
+ @file
+*/
+
+#include "utils.h"
+#include "CSimPhone.h"
+
+
+RCall::THookStatus ConvertStateToHook(RMobileCall::TMobileCallStatus aStatus)
+/**
+	Convert a call state to a hook state.
+*/
+	{
+	if(aStatus==RMobileCall::EStatusUnknown)
+		return RCall::EHookStatusUnknown;
+	if((aStatus==RMobileCall::EStatusIdle)||
+	   (aStatus==RMobileCall::EStatusRinging))
+	   return RCall::EHookStatusOn;
+	return RCall::EHookStatusOff;
+	}
+
+RPhone::TMode ConvertStateToMode(RMobileCall::TMobileCallStatus aStatus)
+/**
+	Convert a call state to a RPhone::TMode state.
+	Note that the mapping table is not entirely clear here.
+	The following mappings have been used here:
+		EStatusUnknown		=>	EModeUnknown
+		EStatusIdle			=>	EModeIdle
+		EStatusDialling		=>	EModeEstablishingLink
+		EStatusRinging		=>	EModeEstablishingLink
+		EStatusAnswering	=>	EModeEstablishingLink
+		EStatusConnecting	=>	EModeEstablishingLink
+		EStatusConnected	=>	EModeOnlineData
+		EStatusHold			=>	EModeOnlineData
+		EStatusHangingUp	=>	EModeOnlineData
+
+  There is currently no mapping for EModeOnlineCommand, so this mode state will
+  never be returned.
+*/
+	{
+	if(aStatus==RMobileCall::EStatusUnknown)
+		return RPhone::EModeUnknown;
+	if(aStatus==RMobileCall::EStatusIdle)
+		return RPhone::EModeIdle;
+	if((aStatus==RMobileCall::EStatusDialling) ||
+		(aStatus==RMobileCall::EStatusAnswering) ||
+		(aStatus==RMobileCall::EStatusRinging) ||
+		(aStatus==RMobileCall::EStatusConnecting))
+		return RPhone::EModeEstablishingLink;
+	if(aStatus==RMobileCall::EStatusConnected)
+		return RPhone::EModeOnlineData;
+	if(aStatus==RMobileCall::EStatusDisconnecting)
+		return RPhone::EModeOnlineData;
+	if(aStatus==RMobileCall::EStatusHold)
+		return RPhone::EModeOnlineData;
+	return RPhone::EModeUnknown;		// Dummy final return value.
+	}
+
+TBool IsStateActive(RMobileCall::TMobileCallStatus aStatus)
+	{
+	if((aStatus==RMobileCall::EStatusUnknown) ||
+	   (aStatus==RMobileCall::EStatusIdle) ||
+	   (aStatus==RMobileCall::EStatusRinging))
+	   return EFalse;
+	return ETrue;
+	}
+
+void ConvertAsciiSms(const TDesC8& aAsciiPdu, TDes8& aOctetPdu)
+/**
+ * Populate the SMS PDU from an ASCII representation, such as that stored in the configuration file.
+ * This simply involves converting the ASCII representation in the configuration file
+ * into a hex representation to complete the request.
+ */
+	{
+	// Check that the ASCII PDU length is even
+	__ASSERT_ALWAYS((aAsciiPdu.Length()&0x1)==0x0,SimPanic(EIllegalOddNumberOfCharactersInConfigFilePdu));
+
+	TUint8 digit;
+	TInt i;
+	for(i=0;i<aAsciiPdu.Length();i+=2)
+		{
+		TLex8 lex(aAsciiPdu.Mid(i,2));
+		TInt ret=lex.Val(digit,EHex);
+		__ASSERT_ALWAYS(ret==KErrNone,SimPanic(EIllegalHexCharacterInConfigFilePdu));
+		aOctetPdu.Append(&digit,1);
+		}
+	}
+
+/**
+Converts a buffer containing string of the hexadecimal characters,
+representing the binary data, into this binary data!
+
+@param aSrc The buffer containing text representation.
+@param aDst Binary data will be written to this buffer.
+*/
+void ConvertTextToBinary(const TDesC& aSrc, TDes8& aDst)
+	{
+	// Check that the ASCII PDU length is even
+	__ASSERT_ALWAYS((aSrc.Length()&0x1)==0x0, SimPanic(EInvalidParameterFormatInConfigFile));
+
+	aDst.SetLength(aSrc.Length() / 2);
+
+	for (TInt ii = 0; ii < aSrc.Length(); ii += 2)
+		{
+		TInt val = 0;
+		if ((aSrc[ii] >= '0') && (aSrc[ii] <= '9'))
+			{
+			val = ((aSrc[ii] - '0') << 4);
+			}
+		else if ((aSrc[ii] >= 'A') && (aSrc[ii] <= 'F'))
+			{
+			val = ((aSrc[ii] - 'A' + 10) << 4);
+			}
+
+		if ((aSrc[ii+1] >= '0') && (aSrc[ii+1] <= '9'))
+			{
+			val += (aSrc[ii+1] - '0');
+			}
+		else if ((aSrc[ii+1] >= 'A') && (aSrc[ii+1] <= 'F'))
+			{
+			val += (aSrc[ii+1] - 'A' + 10);
+			}
+
+		aDst[ii/2] = (TUint8) val;
+		}
+	}
+
+TInt AsciiToNum(const TPtrC8 aParam, TUint8& aVal)
+/**
+* Converts a hexadecimal or decimal value stored in a TPtrC to its TUint value
+*
+* @param aParam		TPtr pointing to the hexadecimal or decimal number to convert.
+* @param aVal		TUint reference to the val converted.
+* @return TInt		Standard error return.
+*/
+	{
+	_LIT8(KHexPrefix,"0x");
+	TInt ret=KErrNone;
+	if(aParam.Left(2).Compare(KHexPrefix)==0)
+		{
+		TLex8 lex(aParam.Mid(2));
+		ret=lex.Val(aVal,EHex);
+		}
+	else
+		{
+		TLex8 lex(aParam);
+		ret=lex.Val(aVal,EDecimal);
+		}
+	return ret;
+	}
+
+TInt AsciiToNum(const TPtrC8 aParam, TUint16& aVal)
+/**
+* Converts a hexadecimal or decimal value stored in a TPtrC to its TUint value
+*
+* @param aParam		TPtr pointing to the hexadecimal or decimal number to convert.
+* @param aVal		TUint reference to the val converted.
+* @return TInt		Standard error return.
+*/
+	{
+	_LIT8(KHexPrefix,"0x");
+	TInt ret=KErrNone;
+	if(aParam.Left(2).Compare(KHexPrefix)==0)
+		{
+		TLex8 lex(aParam.Mid(2));
+		ret=lex.Val(aVal,EHex);
+		}
+	else
+		{
+		TLex8 lex(aParam);
+		ret=lex.Val(aVal,EDecimal);
+		}
+	return ret;
+	}
+
+TInt AsciiToNum(const TPtrC8 aParam, TUint32& aVal)
+/**
+* Converts a hexadecimal or decimal value stored in a TPtrC to its TUint value
+*
+* @param aParam		TPtr pointing to the hexadecimal or decimal number to convert
+* @param aVal		TUint reference to the val converted.
+* @return TInt		Standard error return.
+*/
+	{
+	_LIT8(KHexPrefix,"0x");
+	TInt ret=KErrNone;
+	if(aParam.Left(2).Compare(KHexPrefix)==0)
+		{
+		TLex8 lex(aParam.Mid(2));
+		ret=lex.Val(aVal,EHex);
+		}
+	else
+		{
+		TLex8 lex(aParam);
+		ret=lex.Val(aVal,EDecimal);
+		}
+	return ret;
+	}
+
+TInt AsciiToNum(const TPtrC8 aParam, TInt32& aVal)
+/**
+* Converts a hexadecimal or decimal value stored in a TPtrC to its TUint value
+*
+* @param aParam		TPtr pointing to the hexadecimal or decimal number to convert
+* @param aVal		TUint reference to the val converted.
+* @return TInt		Standard error return.
+*/
+	{
+	_LIT8(KHexPrefix,"0x");
+	TInt ret=KErrNone;
+	if(aParam.Left(2).Compare(KHexPrefix)==0)
+		{
+		TLex8 lex(aParam.Mid(2));
+		ret=lex.Val(aVal,EHex);
+		}
+	else
+		{
+		TLex8 lex(aParam);
+		ret=lex.Val(aVal,EDecimal);
+		}
+	return ret;
+	}
+	
+TInt ParseMixedBinaryAsciiDataL(TDes8& aTextToConvert)
+/**
+Parses aTextToConvert based on the following rules:
+'\\' (double backslash) is used to denote a single '\'
+(single backslash)
+'\xnn' denote a byte of binary data where nn is in hex-decimal.
+The '\xnn' in aTextToConvert is replaced by the binary byte
+that it represents.
+
+For example: If aTextToConvert contains "abc\\def\xFF",
+after parsing, it will contain "abc\def?" where ? = 0xFF.
+
+@param aTextToConvert Modifiable buffer which will be parsed. 
+
+@return KErrNone if aTextToConvert is in valid
+        EAdditionalParamDataFormatMixedBinaryAndAscii format.
+        KErrArgument if aTextToConvert is in an incorrect format.
+
+@panic KErrNoMemory if there is not enough memory to do the parsing.
+*/
+	{
+	// Pointer to unparsed portion of additionalParamDataBuffer
+	HBufC8* resultBuffer = HBufC8::NewLC(aTextToConvert.Length());
+
+	__ASSERT_ALWAYS(resultBuffer, PanicClient(KErrNoMemory));
+	
+	TPtr8 result(resultBuffer->Des());
+	
+	// Position of backslash
+	TInt pos = 0;
+
+	while ((pos = aTextToConvert.Locate('\\')) != KErrNotFound)
+		{
+		// Check that the backslash is followed by at least one more character
+		if ((pos+1) >= aTextToConvert.Length())
+			{
+			return KErrArgument;
+			}
+
+		TUint8 modifier = aTextToConvert[pos+1];
+
+		// Parse depending on character after the backslash
+		switch (modifier)
+			{
+		case '\\':
+			// Next character after the '\' is another '\'.
+			// Replace it with a single '\' and move
+			// on.
+			result.Append(aTextToConvert.Left(pos+1));
+			aTextToConvert.Delete(0, pos+2);
+			break;
+		case 'x':
+			// Next character is an 'x' so check that there are three 
+			// characters after the backslash (one for the x and two
+			// characters of HEX.
+			if ((pos+3) >= aTextToConvert.Length()) 
+				{
+				return KErrArgument;
+				}
+			// Convert those to HEX and replace '\xNN' with this.
+			result.Append(aTextToConvert.Left(pos));
+			TUint8 hexAsInt;
+			if (AsciiHexToNum(aTextToConvert.MidTPtr(pos+2,2), hexAsInt) != KErrNone)
+				{
+				return KErrArgument;
+				}
+			// Append the raw byte to the result
+			result.SetLength(result.Length()+1);
+			result[result.Length()-1] = hexAsInt;
+			aTextToConvert.Delete(0, pos+4);
+			break;		
+			}
+		} // End while
+	aTextToConvert.Insert(0, result);
+	
+	CleanupStack::PopAndDestroy(resultBuffer);
+	return KErrNone;
+	}
+
+/**
+Returns the numerical value that corresponds to the numeric character
+of its parameter (in base 17).
+
+@param aDigit A char between '0' to '9' or between 'A' to 'G'
+*/
+TInt CharToSeptNumL(const TChar& aChar)
+	{
+	TInt ret = 0;
+
+	if((aChar >= '0') && (aChar <= '9'))
+		{
+		ret = TUint(aChar) - '0';
+		}
+	else if((aChar >= 'A') && (aChar <= 'G'))
+		{
+		ret = TUint(aChar) - 'A' + 10;
+		}
+	else
+		{
+		User::Leave(KErrArgument);
+		}
+
+	return ret;
+	}