diff -r 000000000000 -r ff3b6d0fd310 phoneclientserver/EnPolicy/Src/SosEnPolicy/CSosEnPolicyENListHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneclientserver/EnPolicy/Src/SosEnPolicy/CSosEnPolicyENListHandler.cpp Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,292 @@ +/* +* Copyright (c) 2004-2005 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: Shared Data Monitor +* +*/ + + +// INCLUDES +#include "CSosEnPolicyENListHandler.h" +#include +#include +#include +#include + +// FUNCTIONS + +// ----------------------------------------------------------------------------- +// CSosEnPolicyENListHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSosEnPolicyENListHandler* CSosEnPolicyENListHandler::NewL( + ) + { + CSosEnPolicyENListHandler* self = new ( ELeave ) + CSosEnPolicyENListHandler(); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CSosEnPolicyENListHandler::~CSosEnPolicyENListHandler() +// ----------------------------------------------------------------------------- +// +CSosEnPolicyENListHandler::~CSosEnPolicyENListHandler() + { + if ( iListener ) + { + iListener->StopListening(); + delete iListener; + } + delete iRepository; + + iProductSpecificList.Zero(); + iCurrentList.Zero(); + } + +// ----------------------------------------------------------------------------- +// CSosEnPolicyENListHandler::CSosEnPolicyENListHandler +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CSosEnPolicyENListHandler::CSosEnPolicyENListHandler( + ) + { + } + +// ----------------------------------------------------------------------------- +// CSosEnPolicyENListHandler::ConstructL +// Construction, 2nd phase. +// ----------------------------------------------------------------------------- +// +void CSosEnPolicyENListHandler::ConstructL() + { + ClearCurrentList(); + iRepository = CRepository::NewL( KCRUidDefaultEmergencyNumbers ); + iListener = CCenRepNotifyHandler::NewL( + *this, + *iRepository, + CCenRepNotifyHandler::EStringKey, + KDefaultEmergencyNumbersList); + + iListener->StartListeningL(); + } + + +// ----------------------------------------------------------------------------- +// CSosEnPolicyENListHandler::AddToList +// +// Adds number to list with separator. +// If numbers are set to permanent, also list start index is updated. +// Permanent numbers must be in the beginning of the list, +// so SIM numbers are removed before writing! +// ----------------------------------------------------------------------------- +// +void CSosEnPolicyENListHandler::AddToList( + const TDesC& aNumber, + TBool aPermanent ) + { + TInt length = aNumber.Length(); + if ( length > 0 ) // for null string do nothing + { + // Remove non permanent numbers + if ( aPermanent ) + { + ClearCurrentList(); + } + // Write new ones + + for ( TInt i = 0; i < length; i++ ) + { + iCurrentList[ iCurrentListPlace ] = aNumber[i]; + iCurrentListPlace++; + } + iCurrentListPlace++; + // Update starting point + if ( aPermanent ) + { + iCurrentListStart = iCurrentListPlace; + } + } + } + +// ----------------------------------------------------------------------------- +// CSosEnPolicyENListHandler::ClearCurrentList +// +// Clears list to be written to Central Repository. +// Does not clear permanent numbers, from the begining of list +// There is always 112 or 911 (WCDMA) and optionally product specific numbers. +// Basically only deleted numbers are SIM emergency numbers. +// ----------------------------------------------------------------------------- +// +void CSosEnPolicyENListHandler::ClearCurrentList() + { + iCurrentList.SetLength( KEnPolicySDEmergencyNumberListLength ); + iCurrentListPlace = iCurrentListStart; + for ( TInt i = iCurrentListStart; + i < KEnPolicySDEmergencyNumberListLength; + i++ ) + { + iCurrentList[i] = KEnPolicySDNumberSeparator; + } + } + +// ----------------------------------------------------------------------------- +// CSosEnPolicyENListHandler::IsInListByAdvancedMode +// +// Checks if the number is in list by advanced mode check. +// +// ----------------------------------------------------------------------------- +// +TBool CSosEnPolicyENListHandler::IsInListByAdvancedMode ( TDes& aNumber ) + { + TLex list( iCurrentList ); + TLexMark mark; + TPtrC token_candidate( KNullDesC() ); + + for ( TInt i = 0; i < KEnPolicySDEmergencyNumberListLength; i++ ) + { + list.Mark( mark ); + list.SkipCharacters(); + TPtrC token; + token.Set( list.MarkedToken( mark ) ); + if ( token.Length() && ( token == aNumber.Right( token.Length() ) ) ) + { + // _DDPRINT( 4, "ENPolicy.SDM.IsInListAdvanced.ok.", place ); + if( token_candidate == KNullDesC ) + { + token_candidate.Set( token ); + } + else + { + if( token.Length() > token_candidate.Length() ) + { + token_candidate.Set( token ); + } + } + } + list.Inc(); + } + + if( token_candidate != KNullDesC ) + { + aNumber = token_candidate; + return ETrue; + } + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CSosEnPolicyENListHandler::IsInListByNormalMode +// +// Checks if the number is in list by normal mode check. +// +// ----------------------------------------------------------------------------- +// +TBool CSosEnPolicyENListHandler::IsInListByNormalMode( + const TDesC& aNumber ) + { + TInt length = aNumber.Length(); + TInt place = iCurrentList.Find( aNumber ); // first number of aNumber + + // _DDPRINT( 4, "ENPolicy.SDM.IsInListNormal.ok.", place ); // debug print + + if ( place < 0 ) + { + // negative value is an error, not found! + // return immediately + return EFalse; + } + + TInt endOfMatch = place + length; // end of number + 1 + + // we check the begining + if ( place > 0 ) + { + // we are not in the begining of buffer, so we have to check + // char before that + if ( iCurrentList[ place -1 ] != KEnPolicySDNumberSeparator ) + { + // this was just a substring numbers before that + return EFalse; + } + } + + // beginning was ok, so we can continue + + // now checking the end + // there must be atleast one empty space in the end that + // we do the checking of number end. + if ( endOfMatch < ( iCurrentList.Length() - 2 ) ) + { + if ( iCurrentList[ endOfMatch ] != KEnPolicySDNumberSeparator ) + { + return EFalse; + } + } + + // if we get so far, its ok. + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CSosEnPolicyENListHandler::ReadProductSpecificNumbers +// +// Reads product specific values from Central Repository. +// ----------------------------------------------------------------------------- +// +const TDesC& CSosEnPolicyENListHandler::ReadProductSpecificNumbers() + { + // This is done only once in bootup phase. + iProductSpecificList.Zero(); + + TInt err = KErrNone; + err = iRepository->Get( KDefaultEmergencyNumbersList, + iProductSpecificList ); + + if ( err != KErrNone ) + { + iProductSpecificList.Zero(); + } + + // _DDPRINT( 4, "ENPolicy.SDM.ReadPSN.list", iProductSpecificList ); + + return iProductSpecificList; + } + +// ----------------------------------------------------------------------------- +// CDosEmergencyNumberPolicy::HandleNotifyString +// +// Inherited from MCenRepNotifyHandlerCallback. +// ----------------------------------------------------------------------------- +// +void CSosEnPolicyENListHandler::HandleNotifyString( + TUint32 aId, const TDesC16& aNewValue ) + { + if( aId == KDefaultEmergencyNumbersList ) + { + iProductSpecificList.Zero(); + iProductSpecificList.Copy( aNewValue ); + + ClearCurrentList(); + AddToList( iProductSpecificList ); + } + } + +// End of File