diff -r 000000000000 -r 3553901f7fa8 telephonyserverplugins/simtsy/src/utils.cpp --- /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= '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; + }