diff -r 000000000000 -r ff3b6d0fd310 telutils/phoneparser/src/CPhoneGsmParser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telutils/phoneparser/src/CPhoneGsmParser.cpp Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,266 @@ +/* +* 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: Principal parsing process is defined by the CPhoneGsmParser +* class. +* +*/ + + +// INCLUDE FILES +#include + +#include "CPhoneGsmParser.h" +#include "CPhoneGsmParserResult.h" +#include "CPhoneGsmParserBase.h" +#include "CPhoneGsmDummyParser.h" +#include "CPhoneGsmOptionContainer.h" +#include "CPhoneParserFeatures.h" +#include "CPhoneGsmOptionContainerBase.h" + +// CONSTANTS + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPhoneGsmParser::NewL +// ----------------------------------------------------------------------------- +// +CPhoneGsmParser* CPhoneGsmParser::NewL( + CPhoneGsmParserBase* aSsProcedure, + CPhoneGsmParserBase* aSimControlProcedure, + CPhoneGsmParserBase* aPhoneNumber, + CPhoneGsmParserBase* aManufacturerSpecific, + CPhoneGsmParserBase* aEmergencyNumberParser, + CPhoneGsmParserBase* aVoipNumber, + CPhoneGsmParserBase* aImeiParser ) + { + // Ownership of these instances is transferred, thus + // creation of the instance must not leave. + + CPhoneGsmParser* self = + new CPhoneGsmParser( + aSsProcedure, + aSimControlProcedure, + aPhoneNumber, + aManufacturerSpecific, + aEmergencyNumberParser, + aVoipNumber, + aImeiParser ); + + if ( !self ) + { + delete aSsProcedure; + delete aSimControlProcedure; + delete aPhoneNumber; + delete aManufacturerSpecific; + delete aEmergencyNumberParser; + delete aVoipNumber; + delete aImeiParser; + + User::Leave( KErrNoMemory ); + } + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmParser::~CPhoneGsmParser +// ----------------------------------------------------------------------------- +// +CPhoneGsmParser::~CPhoneGsmParser() + { + delete iGsmSsProcedure; + delete iGsmSimControlProcedure; + delete iGsmPhoneNumber; + delete iGsmManufacturerProcedure; + delete iGsmEmergencyNumber; + delete iVoipNumber; + delete iImeiParser; + CPhoneParserFeatures::Free(); + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmParser::CPhoneGsmParser +// ----------------------------------------------------------------------------- +// +CPhoneGsmParser::CPhoneGsmParser( + CPhoneGsmParserBase* aSsProcedure, + CPhoneGsmParserBase* aSimControlProcedure, + CPhoneGsmParserBase* aPhoneNumber, + CPhoneGsmParserBase* aManufacturerSpecific, + CPhoneGsmParserBase* aEmergencyNumberParser, + CPhoneGsmParserBase* aVoipNumber, + CPhoneGsmParserBase* aImeiParser ) + : iGsmSsProcedure( aSsProcedure ), + iGsmSimControlProcedure( aSimControlProcedure ), + iGsmPhoneNumber( aPhoneNumber ), + iGsmManufacturerProcedure( aManufacturerSpecific ), + iGsmEmergencyNumber( aEmergencyNumberParser ), + iVoipNumber( aVoipNumber ), + iImeiParser( aImeiParser ) + { + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmParser::ConstructL +// ----------------------------------------------------------------------------- +// +void CPhoneGsmParser::ConstructL() + { + // If we didn't receive a parser for something, then create dummy. + + if ( !iGsmSsProcedure ) + { + iGsmSsProcedure = CPhoneGsmDummyParser::NewL(); + } + if ( !iGsmSimControlProcedure ) + { + iGsmSimControlProcedure = CPhoneGsmDummyParser::NewL(); + } + if ( !iGsmPhoneNumber ) + { + iGsmPhoneNumber = CPhoneGsmDummyParser::NewL(); + } + if ( !iGsmManufacturerProcedure ) + { + iGsmManufacturerProcedure = CPhoneGsmDummyParser::NewL(); + } + if ( !iGsmEmergencyNumber ) + { + iGsmEmergencyNumber = CPhoneGsmDummyParser::NewL(); + } + if ( !iVoipNumber ) + { + iVoipNumber = CPhoneGsmDummyParser::NewL(); + } + if ( !iImeiParser ) + { + iImeiParser = CPhoneGsmDummyParser::NewL(); + } + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmParser::ParseL +// ----------------------------------------------------------------------------- +// +TBool CPhoneGsmParser::ParseL( + const TDesC& aString, + CPhoneGsmParserResult& aResult, + CPhoneGsmOptionContainerBase& aOptions ) + { + TBool result = EFalse; + + result = DoParseL( + aString, + aResult, + static_cast( aOptions ) ); + + if ( !result ) + { + aResult.ClearL(); + } + + return result; + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmParser::DoParseL +// ----------------------------------------------------------------------------- +// +TBool CPhoneGsmParser::DoParseL( + const TDesC& aString, + CPhoneGsmParserResult& aResult, + CPhoneGsmOptionContainer& aOptions ) + { + TBool result = EFalse; + aResult.ClearL(); + + // We do not handle empty strings. + if ( !aString.Length() ) + { + return EFalse; + } + + TBool sendOperation = aOptions.FindOptionStatus( KPhoneOptionSend ); + + // Check if it is the only phone control string, show imei. + result = iImeiParser->ParseL( aString, aResult, aOptions ); + + // Check if emergency number. + if ( !result ) + { + result = iGsmEmergencyNumber->ParseL( aString, aResult, aOptions ); + } + + // First check if string is GSM ss procedure supported by MS. + if ( !result ) + { + result = iGsmSsProcedure->ParseL( aString, aResult, aOptions ); + } + + if ( !result ) + { + // Check if it is sim control procedure. + result = iGsmSimControlProcedure->ParseL( aString, aResult, aOptions ); + } + + if ( !result ) + { + // Check if it is manufacturer specific procedure. + result = + iGsmManufacturerProcedure->ParseL( aString, aResult, aOptions ); + } + if ( !result ) + { + // Check if it voip call. + result = iVoipNumber->ParseL( aString, aResult, aOptions ); + } + if ( !result ) + { + result = iGsmPhoneNumber->ParseL( aString, aResult, aOptions ); + } + if ( !result ) + { + result = DefineAsUssdL( aString, aResult, aOptions ); + } + + return result; + } + +// ----------------------------------------------------------------------------- +// CPhoneGsmParser::DefineAsUssd +// ----------------------------------------------------------------------------- +// +TBool CPhoneGsmParser::DefineAsUssdL( + const TDesC& aString, + CPhoneGsmParserResult& aResult, + CPhoneGsmOptionContainer& aOptions ) + { + aResult.ClearL(); + + TBool result = aOptions.FindOptionStatus( KPhoneOptionSend ); + if ( result ) + { + aResult.SetUid( KPhoneUidUnstructuredService ); + aResult.AddParameterL( aString ); + } + return result; + } + +// End of File