cbsref/telephonyrefplugins/atltsy/atcommand/sms/src/smsatutil.cpp
branchRCL_3
changeset 66 07a122eea281
parent 65 630d2f34d719
child 67 4eff64595c44
child 70 4814c5a49428
--- a/cbsref/telephonyrefplugins/atltsy/atcommand/sms/src/smsatutil.cpp	Tue Aug 31 16:23:08 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,447 +0,0 @@
-// Copyright (c) 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:
-// @file smsatutil.cpp
-// This contains SmsAtUtil which is util for Sms At command
-// 
-
-// user include
-#include "smsatutil.h"
-#include "ltsycommondefine.h"
-#include "panic.h"
-
-/**
- * Receive PDU example 
- * 0891683108200805F0040D91683188902848F4000850208151754500108FD9662F4E0067616D4B8BD577ED4FE1
- * 08 ocet length including 91
- * 91 Identify Address Type
- * 683108200805F0 SCA address
- * 04
- * 0D91683188902848F4
- * 00
- * 08
- * 50208151754500
- * 10   
- * 8FD9662F4E0067616D4B8BD577ED4FE1
- */
-// ---------------------------------------------------------------------------
-// SmsAtUtil::ConvertAsciiToBinary
-// other items were commented in a header
-// ---------------------------------------------------------------------------
-TInt SmsAtUtil::ConvertAsciiToBinary(const TDesC8& aAscii,TDes8& aData)
-	{
-	aData.Zero();
-	TLex8 lex;
-	TUint8 val;
-	TInt ret;
-	const TInt count(aAscii.Length());
-	for(TInt i = 0;i < count;i = i + 2)
-		{
-		lex = aAscii.Mid(i,2);
-		ret = lex.Val(val,EHex);
-		if(ret != KErrNone)
-			{
-			return ret;
-			}
-		aData.Append(val);
-		}
-	return KErrNone;
-	}
-
-// -------------------------------------------------------------------------------
-// SmsAtUtil::AppendAddressToAscii
-// other items were commented in a header
-// -------------------------------------------------------------------------------
-TInt SmsAtUtil::AppendAddressToAscii(TDes8& aAscii,
-		                             const RMobilePhone::TMobileAddress& aAddress)
-	{
-	// Duplicate tel number, removing all the weird chars
-	TBuf<RMobilePhone::KMaxMobileTelNumberSize> telNumber;
-	const TInt count(aAddress.iTelNumber.Length());
-	// Validate the size of the supplied SCA
-    if(count >= RMobilePhone::KMaxMobileTelNumberSize)
-    	{
-    	return KErrOverflow;
-    	}
-	TInt i;
-	for(i = 0;i < count;++i)
-		{
-		if(IsAddressChar(TChar(aAddress.iTelNumber[i])))
-			telNumber.Append(aAddress.iTelNumber[i]);
-		}
-
-	const TInt telNumberLength(telNumber.Length());
-	
-	// Code Address-Length
-	AppendOctet(1 + (telNumberLength/2) + (telNumberLength%2),aAscii);
-
-	// Code Type-Of-Address
-	TInt typeOfNumber = ConvertTypeOfNumber(aAddress.iTypeOfNumber);
-	TInt numberingPlan = ConvertNumberingPlan(aAddress.iNumberPlan);
-	AppendOctet(0x80+(typeOfNumber<<4) + (numberingPlan),aAscii);
-
-	// Code Address-Value
-	TInt highSemiOctet;
-	TInt lowSemiOctet;
-	const TInt octets(telNumberLength/2);	// This division will be rounded down
-	for(i = 0; i < octets; ++i)
-		{
-		// See ETSI 03.40 section 9.1.2.3
-		// Address digits are coded into octets as pairs.
-		lowSemiOctet = ConvertAddressChar(TChar(telNumber[i*2]));
-		highSemiOctet = ConvertAddressChar(TChar(telNumber[(i*2)+1]));
-		AppendOctet((highSemiOctet<<4)+lowSemiOctet,aAscii);
-		}
-				
-	// If number of semi octects is odd then process the final octet
-	if(telNumberLength%2 == 1)		
-		{
-		lowSemiOctet = ConvertAddressChar(TChar(telNumber[telNumberLength-1]));
-		AppendOctet(0xf0+lowSemiOctet,aAscii);
-		}
-				
-	__ASSERT_DEBUG(aAscii.Length()%2 == 0,Panic(EATSmsUtilsOddNumberOfSemiOctets));
-	return KErrNone;
-	}
-
-
-// ---------------------------------------------------------------------------
-// SmsAtUtil::AppendDataToAscii
-// other items were commented in a header
-// ---------------------------------------------------------------------------
-void SmsAtUtil::AppendDataToAscii(TDes8& aAscii,const TDesC8& aData)
- 	{
-	const TInt count(aData.Length());
-	__ASSERT_DEBUG((aAscii.MaxLength()-aAscii.MaxLength())<=(count*2),Panic(EATSmsUtilsDescriptorOverflow));
-
-	for(TInt i = 0; i < count; ++i)
-		{
-		AppendOctet(aData[i],aAscii);
-		}
-		
-	__ASSERT_DEBUG(aAscii.Length()%2==0,Panic(EATSmsUtilsOddNumberOfSemiOctets));
-	}
-
-// ----------------------------------------------------------------------------------
-// SmsAtUtil::ReadAndRemoveAddressFromAscii
-// other items were commented in a header
-// ----------------------------------------------------------------------------------
-TInt SmsAtUtil::ReadAndRemoveAddressFromAscii(TDes8& aAscii,
-		                                      RMobilePhone::TMobileAddress& aAddress)
-	{
-	__ASSERT_DEBUG(aAscii.Length()%2==0,Panic(EATSmsUtilsOddNumberOfSemiOctets));
-	TInt ret(KErrNone);
-
-	ret = ReadAddressFromAscii(aAscii,aAddress);
-	
-	if(ret==KErrNone)
-		{
-		// Delete address from aAscii (using Address-length at start of string)
-		TLex8 lex(aAscii.Mid(0,2));
-		TUint val;
-		ret=lex.Val(val,EHex);
-		if(ret == KErrNone)
-			{
-			// +1 to include 1 octect of Address-Length 
-			val = val+1;		
-			
-			// double value to change from 'octets used' to 'ASCII chars used'
-			val = val*2;
-			
-			aAscii.Delete(0,val);		
-			__ASSERT_DEBUG(aAscii.Length()%2==0,Panic(EATSmsUtilsOddNumberOfSemiOctets));
-			}
-		}
-	return ret;
-	}
-
-// ---------------------------------------------------------------------------
-// SmsAtUtil::ReadAddressFromAscii
-// other items were commented in a header
-// ---------------------------------------------------------------------------
-TInt SmsAtUtil::ReadAddressFromAscii(const TDesC8& aAscii,
-		                             RMobilePhone::TMobileAddress& aAddress)
-	{
-	TLex8 lex;
-	TInt ret;
-	TUint8 val;
-	
-	// get address length + 1 octet Address Type(91)
-	lex = aAscii.Mid(0,2);
-	ret = lex.Val(val,EHex);
-	if(ret != KErrNone)
-		{
-		return ret;
-		}
-		
-	// we exclude the Address Type as address should not include this 
-	TInt addrLen = val-1;
-
-	// Type-Of-Number (see example above as 9)
-	lex = aAscii.Mid(2,1);
-	ret = lex.Val(val,EHex);
-	if(ret != KErrNone)
-		{
-		return ret;
-		}
-	
-	// Highest bit is not part of Type-Of-Number
-	aAddress.iTypeOfNumber = ConvertTypeOfNumber(val&0x07);	
-
-	// Number-Plan
-	lex = aAscii.Mid(3,1);
-	ret = lex.Val(val,EHex);
-	if(ret != KErrNone)
-		{
-		return ret;
-		}
-	
-	// we got Number-Plan which should be compatiable with Symbian defination
-	aAddress.iNumberPlan = ConvertNumberingPlan(val);
-	
-	// Address (loop for each octet ie. two hex chars from aAscii)
-	aAddress.iTelNumber.Zero();
-	for(TInt i = 0; i < addrLen; ++i)		
-		{
-		// Process semi-octet
-		lex = aAscii.Mid((i*2)+5,1);
-		ret = lex.Val(val,EHex);
-		if(ret != KErrNone)
-			{
-			return ret;
-			}
-		// 0xF is consider a pedding when the address length is odd number, so we do not need to append it to address field
-		if(val < 0xF)
-			aAddress.iTelNumber.Append(ConvertAddressChar(val));
-
-		// Process semi-octet
-		lex = aAscii.Mid((i*2)+4,1);
-		ret = lex.Val(val,EHex);
-		if(ret != KErrNone)
-			{
-			return ret;
-			}
-		
-		// 0xF is consider a pedding when the address length is odd number, so we do not need to append it to address field
-		if(val < 0xF)
-			aAddress.iTelNumber.Append(ConvertAddressChar(val));
-		}
-	return KErrNone;
-	}
-
-// ----------------------------------------------------------------------------------------
-// SmsAtUtil::ReadAndRemoveAddressFromPdu
-// other items were commented in a header
-// ----------------------------------------------------------------------------------------
-void SmsAtUtil::ReadAndRemoveAddressFromPdu(TPtrC8& aPdu, 
-		                                    RMobilePhone::TMobileAddress& aGsmServiceCentre)
-	{
-	const TUint8 KTONBitMask = 0x70;
-	const TUint8 KNPIBitMask = 0x0f;
-	const TUint8 KTONBitShift = 4;
-	const TUint8 KNPIBitShift = 0;
-	_LIT(KInternationalPrefix,"+");
-
-	aGsmServiceCentre.iTypeOfNumber = (RMobilePhone::TMobileTON)0;
-	aGsmServiceCentre.iNumberPlan = (RMobilePhone::TMobileNPI)0;
-	aGsmServiceCentre.iTelNumber.Zero();
-	
-	TUint8 len = aPdu[0];
-	
-	if(len == 0)
-		{
-		// A zero length SCA has been prepended - just strip this first byte off
-		aPdu.Set(aPdu.Mid(len+1));
-		return;
-		}
-
-	TUint8 numDes = aPdu[1];
-	aGsmServiceCentre.iTypeOfNumber = (RMobilePhone::TMobileTON)((numDes&KTONBitMask)>>KTONBitShift);
-	aGsmServiceCentre.iNumberPlan = (RMobilePhone::TMobileNPI)((numDes&KNPIBitMask)>>KNPIBitShift);
-
-	if(aGsmServiceCentre.iTypeOfNumber == RMobilePhone::EInternationalNumber)
-		aGsmServiceCentre.iTelNumber.Append(KInternationalPrefix);
-
-	TInt i;
-	TUint16 digit;
-	for(i = 2;i<(len+1);i++)
-		{
-		digit = (TUint16)((aPdu[i]&0x0f) + 0x30);
-		aGsmServiceCentre.iTelNumber.Append(digit);
-		digit = (TUint16)(((aPdu[i]&0xf0)>>4) + 0x30);
-		if(digit == 0x003f)		// 'F' is the padding digit at the end of a number
-			break;
-		aGsmServiceCentre.iTelNumber.Append(digit);
-		}
-	aPdu.Set(aPdu.Mid(len + 1));
-	}
-
-// ---------------------------------------------------------------------------
-// SmsAtUtil::IsAddressChar
-// other items were commented in a header
-// ---------------------------------------------------------------------------
-TBool SmsAtUtil::IsAddressChar(TChar aChar)
- 	{
-	if(aChar.IsDigit())
-		{
-		return ETrue;
-		}
-	if(aChar == TChar('*') ||
-	   aChar == TChar('#') ||
-	   aChar == TChar('a') ||
-	   aChar == TChar('b') ||
-	   aChar == TChar('c'))
-		{
-		return ETrue;
-		}
-	return EFalse;
-	}
-
-// ---------------------------------------------------------------------------
-// SmsAtUtil::ConvertNumberingPlan
-// other items were commented in a header
-// ---------------------------------------------------------------------------
-RMobilePhone::TMobileNPI SmsAtUtil::ConvertNumberingPlan(TInt aValue)
-	{
-	switch(aValue)
-		{
-		// The below 'magic numbers' come from the ETSI 03.40
-		// specification for Address Fields (section 9.1.2.5)
-	case 1:
-		return RMobilePhone::EIsdnNumberPlan;
-	case 3:
-		return RMobilePhone::EDataNumberPlan;
-	case 4:
-		return RMobilePhone::ETelexNumberPlan;
-	case 8:
-		return RMobilePhone::ENationalNumberPlan;
-	case 9:
-		return RMobilePhone::EPrivateNumberPlan;
-	default:
-		return RMobilePhone::EUnknownNumberingPlan;
-		}
-	}
-
-// ---------------------------------------------------------------------------
-// SmsAtUtil::ConvertTypeOfNumber
-// other items were commented in a header
-// ---------------------------------------------------------------------------
-RMobilePhone::TMobileTON SmsAtUtil::ConvertTypeOfNumber(TInt aValue) 
-	{
-	switch(aValue)
-		{
-		// The below 'magic numbers' come from the ETSI 03.40
-		// specification for Address Fields (section 9.1.2.5)
-	case 0:		
-		return RMobilePhone::EUnknownNumber;
-	case 1:		
-		return RMobilePhone::EInternationalNumber;
-	case 2:
-		return RMobilePhone::ENationalNumber;
-	case 3:
-		return RMobilePhone::ENetworkSpecificNumber;
-	case 4:
-		return RMobilePhone::ESubscriberNumber;
-	default:
-		return RMobilePhone::EUnknownNumber;
-		}
-	}
-
-// ---------------------------------------------------------------------------
-// SmsAtUtil::AppendOctet
-// other items were commented in a header
-// ---------------------------------------------------------------------------
-void SmsAtUtil::AppendOctet(TInt aOctet,TDes8& aAscii)
-	{
-	// Ensure client has only passed us a octet (ie. low 8 bits only)
-	aOctet = aOctet&0xff;
-	// Append octet 
-	// (prefix '0' if the octets value only uses one digit as final 
-    //  octet coding must use two digits)
-	if(aOctet <= 0x0f)
-		{
-		aAscii.Append(TChar('0'));
-		}
-	
-	aAscii.AppendNum(aOctet,EHex);
-	}
-
-// ---------------------------------------------------------------------------
-// SmsAtUtil::ConvertAddressChar
-// other items were commented in a header
-// ---------------------------------------------------------------------------
-TInt SmsAtUtil::ConvertAddressChar(TChar aChar)
- 	{
-	aChar.LowerCase();
-	if(aChar-TChar('0') <= 9)
-		{
-		// it should be digital number from 0~9
-		return aChar-TChar('0');
-		}
-	else if(aChar == TChar('*'))
-		{
-		return 10;
-		}
-	else if(aChar == TChar('#'))
-		{
-		return 11;
-		}
-	else if(aChar == TChar('a'))
-		{
-		return 12;
-		}
-	else if(aChar == TChar('b'))
-		{
-		return 13;
-		}
-	else if(aChar == TChar('c'))
-		{
-		return 14;
-		}
-	return 15;
-	}	
-
-// ---------------------------------------------------------------------------
-// SmsAtUtil::ConvertAddressChar
-// other items were commented in a header
-// ---------------------------------------------------------------------------
-TChar SmsAtUtil::ConvertAddressChar(TInt aBinary)
-	{
-	if(aBinary >= 0 && aBinary <= 9)
-		{
-		return aBinary + TChar('0');  	// Assumes digit characters are one after each other
-		}
-	else if(aBinary == 10)
-		{
-		return TChar('*');
-		}
-	else if(aBinary == 11)
-		{
-		return TChar('#');
-		}
-	else if(aBinary == 12)
-		{
-		return TChar('a');
-		}
-	else if(aBinary == 13)
-		{
-		return TChar('b');
-		}
-	else if(aBinary == 14)
-		{
-		return TChar('c');
-		}
-	return TChar(0);		// This is the cloest I can find to a NULL char 
-	}
-
-// End of file