--- a/telephonyserverplugins/simtsy/src/utils.cpp Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/simtsy/src/utils.cpp Thu May 06 15:10:38 2010 +0100
@@ -1,345 +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;
- }
+// 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;
+ }