diff -r 000000000000 -r ff3b6d0fd310 telutils/phoneparser/src/CPhoneGsmPhoneNumberParser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telutils/phoneparser/src/CPhoneGsmPhoneNumberParser.cpp Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,329 @@ +/* +* Copyright (c) 2002 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: Parser for phone numbers. +* +*/ + + +// INCLUDE FILES +#include "CPhoneGsmPhoneNumberParser.h" +#include "CPhoneGsmParserResult.h" +#include "CPhoneGsmOptionContainer.h" +#include "CPhoneVoipNumberParser.h" +#include "CPhoneParserFeatures.h" +#include "phoneParserCommon.h" +// CONSTANTS +_LIT( KPhoneClirSuppress, "*31#" ); +_LIT( KPhoneClirInvoke, "#31#" ); + +const TInt KPhoneNumberOne = '1'; + +const TInt KPhoneNumberMaxLength = 80; + +const TInt KPhoneShortStringMinLength = 1; // Must be positive. +const TInt KPhoneShortStringMaxLength = 2; // Must be positive. +const TInt KPhoneHashStringMinLength = 2; +const TInt KPhoneTwoDigitStringLength = 2; + +// If there is one of the characters in the string, then the string +// is considered as phone number. +_LIT( KPhoneMustPhoneNumberChars, "pw" ); +_LIT( KPhoneHashChar, "#" ); +_LIT( KPhoneNumberZero, "0" ); + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPhoneGsmPhoneNumberParser::CPhoneGsmPhoneNumberParser +// ----------------------------------------------------------------------------- +// +CPhoneGsmPhoneNumberParser::CPhoneGsmPhoneNumberParser() + { + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmPhoneNumberParser::NewLC +// ----------------------------------------------------------------------------- +// +CPhoneGsmPhoneNumberParser* CPhoneGsmPhoneNumberParser::NewLC() + { + CPhoneGsmPhoneNumberParser* self = + new ( ELeave ) CPhoneGsmPhoneNumberParser; + + CleanupStack::PushL( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmPhoneNumberParser::ParseL +// +// Phone number can contain following parts: supplementary +// service prefix, main part and dtmf postfix. +// +// ----------------------------------------------------------------------------- +// +TBool CPhoneGsmPhoneNumberParser::ParseL( + const TDesC& aString, + CPhoneGsmParserResult& aResult, + CPhoneGsmOptionContainerBase& aOptions ) + { + aResult.ClearL(); + + TBool result = DoParseL( + aString, + aResult, + static_cast( aOptions ) ); + + if ( !result ) + { + aResult.ClearL(); + } + + return result; + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmPhoneNumberParser::DoParseL +// +// Phone number can contain following parts: supplementary +// service prefix, main part and dtmf postfix. +// ----------------------------------------------------------------------------- +// +TBool CPhoneGsmPhoneNumberParser::DoParseL( + const TDesC& aString, + CPhoneGsmParserResult& aResult, + CPhoneGsmOptionContainer& aOptions ) + { + TBool result = EFalse; + + if ( !aOptions.FindOptionStatus( KPhoneOptionSend )) + { + return EFalse; + } + if ( !ContainsPauseOrWaitChars( aString )) // p or w --> always phone number + { + if ( IsHashString( aString )) + { + return EFalse; + } + if ( aString.Length() >= KPhoneShortStringMinLength && + aString.Length() <= KPhoneShortStringMaxLength ) + { + if ( !IsZeroDialling( aString, aOptions ) && + !IsTwoDigitDialling( aString ) && !Is1xDialling( aString, aOptions )) + { + return EFalse; + } + } + } + TLex input( aString ); + + if ( !HandleServicePrefix( input, aResult ) ) + { + aResult.SetAuxInformation( KPhoneDialDefaultClir ); + } + + // Take number part and add it to result. + result = TakeNumberPartL( input, aResult ); + + if ( result ) + { + if ( !aOptions.FindOptionStatus( KPhoneOptionVoipCall ) ) + { + aResult.SetUid( KPhoneUidPhoneNumber ); + } + + // Add rest of string( dtmf postfix ) to result. + if ( !TakeDtmfPostfixL( input, aResult ) ) + { + aResult.AddParameterL( KNullDesC ); + } + } + + return result; + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmPhoneNumberParser::HandleServicePrefix +// +// Checks if there is clir suppress/invoke prefix in the +// string. +// ----------------------------------------------------------------------------- +// +TBool CPhoneGsmPhoneNumberParser::HandleServicePrefix( + TLex& aLex, + CPhoneGsmParserResult& aResult ) + { + TBool result = EFalse; + TPtrC remainder( aLex.Remainder() ); + + if ( EqualsLeft( remainder, KPhoneClirSuppress ) ) + { + aLex.Inc( KPhoneClirSuppress().Length() ); + aResult.SetAuxInformation( KPhoneDialSuppressClir ); + result = ETrue; + } + else if ( EqualsLeft( remainder, KPhoneClirInvoke ) ) + { + aLex.Inc( KPhoneClirSuppress().Length() ); + aResult.SetAuxInformation( KPhoneDialInvokeClir ); + result = ETrue; + } + + return result; + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmPhoneNumberParser::TakeNumberPartL +// +// Takes a main part of the phone number. And add +// it to the aReturn parameter with or without optional international prefix. +// ----------------------------------------------------------------------------- +// +TBool CPhoneGsmPhoneNumberParser::TakeNumberPartL( + TLex& aLex, + CPhoneGsmParserResult& aResult ) + { + TBool result = EFalse; + + TLexMark start; + aLex.Mark( start ); + + TInt maxLength = KPhoneNumberMaxLength; + + // Checks is first char optional international prefix + // and if its increments to the next char position. + if ( aLex.Peek() == KPhonePlus ) + { + aLex.Inc(); + maxLength++; + } + + // Check possible 'p','w' or '+' marks. + while ( ( aLex.Peek().IsDigit() ) || + ( aLex.Peek() == KPhoneNumberAsterisk ) || + ( aLex.Peek() == KPhoneNumberHash ) ) + { + aLex.Inc(); + } + + // Add parsing string to result parameter + TPtrC mainpart( aLex.MarkedToken( start ) ); + const TInt length = mainpart.Length(); + if ( length <= maxLength ) + { + result = ETrue; + aResult.AddParameterL( mainpart ); + } + + return result; + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmPhoneNumberParser::TakeDtmfPostfixL +// ----------------------------------------------------------------------------- +// +TBool CPhoneGsmPhoneNumberParser::TakeDtmfPostfixL( + TLex& aLex, + CPhoneGsmParserResult& aResult ) + { + // Add rest of string( after TLex16::iNext ) to result. + aResult.AddParameterL( aLex.Remainder() ); + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmPhoneNumberParser::EqualsLeft +// ----------------------------------------------------------------------------- +// +TBool CPhoneGsmPhoneNumberParser::EqualsLeft( + const TDesC& aDesc, + const TDesC& aLeft ) + { + return IsPrefixOf( aDesc, aLeft ); + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmPhoneNumberParser::ContainsPauseOrWaitChars +// ----------------------------------------------------------------------------- +// +TBool CPhoneGsmPhoneNumberParser::ContainsPauseOrWaitChars( + const TDesC& aString ) const + { + + TBool result = EFalse; + TPtrC chs( KPhoneMustPhoneNumberChars ); + for ( TInt index = 0; index < chs.Length(); index++ ) + { + if ( aString.Locate( chs[ index ] ) != KErrNotFound ) + { + result = ETrue; + break; + } + } + + return result; + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmPhoneNumberParser::IsHashString +// ----------------------------------------------------------------------------- +// +TBool CPhoneGsmPhoneNumberParser::IsHashString( + const TDesC& aString ) const + { + return aString.Length() >= KPhoneHashStringMinLength && + // Rightmost character must be # + aString.Right( 1 ) == KPhoneHashChar; + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmPhoneNumberParser::IsZeroDialling +// ----------------------------------------------------------------------------- +// +TBool CPhoneGsmPhoneNumberParser::IsZeroDialling( + const TDesC& aString, CPhoneGsmOptionContainer& aOptions ) const + { + return !aOptions.FindOptionStatus( KPhoneOptionInCall ) && + !aString.Compare( KPhoneNumberZero ) && + CPhoneParserFeatures::IsZeroDialEnabled(); + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmPhoneNumberParser::IsTwoDigitDialling +// ----------------------------------------------------------------------------- +// +TBool CPhoneGsmPhoneNumberParser::IsTwoDigitDialling( + const TDesC& aString ) const + { + return CPhoneParserFeatures::TwoDigitCallingEnabled() && + aString.Length()== KPhoneTwoDigitStringLength; + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmPhoneNumberParser::Is1xDialling +// ----------------------------------------------------------------------------- +// +TBool CPhoneGsmPhoneNumberParser::Is1xDialling( + const TDesC& aString, CPhoneGsmOptionContainer& aOptions ) const + { + return !aOptions.FindOptionStatus( KPhoneOptionInCall ) && + aString.Length()== KPhoneShortStringMaxLength && + aString[0] == KPhoneNumberOne && + TChar( aString[1] ).IsDigit(); + } + +// End of File