diff -r 000000000000 -r 094583676ce7 PECengine/ListLibrary2/ContactListSrc/CPEngContactListTransactionManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/ListLibrary2/ContactListSrc/CPEngContactListTransactionManager.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,871 @@ +/* +* Copyright (c) 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: Contact list transaction manager +* +*/ + + +// INCLUDE FILES +#include "CPEngContactListTransactionManager.h" + +#include "PEngListLibraryFactory.h" +#include "MPEngListLibFactory.h" +#include "PEngPresenceEngineConsts2.h" + +#include "CPEngContactListModBase.h" +#include "CPEngContactListSettings.h" +#include "CPEngContactListModChangeMonitor.h" + +#include "CPEngContactListMngTransAddId.h" +#include "CPEngContactListMngTransRemoveId.h" +#include "CPEngContactListMngTransProperties.h" +#include "CPEngContactListMngTransSubcription.h" +#include "CPEngContactListDeleteTrans.h" +#include "CPEngGetWatchersTransaction.h" +#include "CPEngStartSyncTransaction.h" + +#include "CPEngContactListTransCreate.h" +#include "CPEngContactListTransSync.h" + +#include "PEngContactIdsTools.h" +#include "PEngListLibTools.h" + +#include "MPEngStorageManager.h" +#include "PEngMessagePacker.h" + +#include "CPEngSessionSlotId.h" + +#include "PresenceDebugPrint.h" +#include + + +// CONSTANTS +_LIT( KPEngUnsubscribe, "UNSUB" ); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::CPEngContactListTransactionManager() +// ----------------------------------------------------------------------------- +// +CPEngContactListTransactionManager::CPEngContactListTransactionManager( + MPEngListLibFactory& aFactory, + TPEngWVCspVersion& aCSPVersion ) + : CPEngContactListManagerBase( aFactory ), + iCSPVersion( aCSPVersion ) + { + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::ConstructL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransactionManager::ConstructL( + const CPEngSessionSlotId& aSessionSlot ) + { + CPEngContactListManagerBase::ConstructL( aSessionSlot ); + InitializePlainUserId(); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::NewL() +// ----------------------------------------------------------------------------- +// +CPEngContactListTransactionManager* CPEngContactListTransactionManager::NewLC( + MPEngListLibFactory& aFactory, + const CPEngSessionSlotId& aSessionSlot, + TPEngWVCspVersion& aCSPVersion ) + { + CPEngContactListTransactionManager* self = + new ( ELeave ) CPEngContactListTransactionManager( aFactory, + aCSPVersion ); + + CleanupClosePushL( *self ); + self->ConstructL( aSessionSlot ); + + return self; + } + + +// Destructor +CPEngContactListTransactionManager::~CPEngContactListTransactionManager() + { + } + + + +// ============================================================================= +// ===============Function from MPEngTransactionFactory ====================== +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::Release() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransactionManager::Close() + { + iAccessCount--; + if ( iAccessCount == 0 ) + { + iFactory.RemoveCntListTransManager( this ); + delete this; + } + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::GetIncomingNwTransactionHandlersL() +// ----------------------------------------------------------------------------- +// +MPEngIncomingTransactionHandler* CPEngContactListTransactionManager::IncomingTransactionHandlerL( + const TDesC8& /* aIncomingRequest */ ) + { + return NULL; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::GetOutgoingNwTransactionHandlersL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransactionManager::OutgoingTransactionHandlerL( + TInt aOperation, + const TDesC& aData, + RPointerArray& aHandlers ) + { + PENG_DP( D_PENG_LIT( "CPEngContactListTransactionManager::OutgoingTransactionHandlerL() [%d]" ), + aOperation ); + + switch ( aOperation ) + { + case EPEngTransOpCntListUpdateList: + case EPEngTransOpCntListSyncList: + { + if ( !iEnviromentSynchronized ) + { + User::Leave( KErrNotReady ); + } + + //Create handlers + GetOutGoingTransactionHandlersL( aData, + aHandlers, + aOperation ); + break; + } + + + case EPEngTransOpCntListBaseSync: + { + if ( iEnviromentSynchronized ) + { + // already done, no need for it + return; + } + + TBool needToUnsubscribe( EFalse ); + if ( aData.Compare( KPEngUnsubscribe ) == 0 ) + { + needToUnsubscribe = ETrue; + } + + CPEngStartSyncTransaction* startSync = + CPEngStartSyncTransaction::NewLC( *this, + iCSPVersion, + aOperation, + needToUnsubscribe ); + + aHandlers.AppendL( startSync ); + CleanupStack::Pop(); //newHandler + + break; + } + + default: + { + } + } + } + + +// ============================================================================= +// =============== from MPEngContactListTransactionManager ===================== +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::CompleteEnviromentSyncL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransactionManager::CompleteEnviromentSyncL( + CDesCArray& aExistingLists, + const TDesC& aDefaultList, + TBool aListsUnsubscribed ) + { + //Generate array of plain list names + //+1 to prevent having count 0 + const TInt existingCount = aExistingLists.Count(); + CPtrCArray* planeNames = new ( ELeave ) CPtrCArray( existingCount + 1 ); + CleanupStack::PushL( planeNames ); + + for ( TInt i( 0 ) ; i < existingCount ; ++i ) + { + TPtrC name( aExistingLists[ i ] ); + NContactListIdsTools::ExtractPureContactListName( name, + iPlainUserName ); + planeNames->AppendL( name ); + } + + + //Process all known contact list settings, + //wether thay exist on the server or not + for ( TInt x( iContactListSettings.Count() - 1 ) ; x >= 0 ; --x ) + { + // For future: what if is it master and default + // Update is needed + CPEngContactListSettings* sett = iContactListSettings[ x ]; + + sett->DeletePropertyL( KPEngCntLstDefault, + KPEngCntLstPropertyNativePermanent ); + sett->DeletePropertyL( KPEngHasBeenSynchronized, + KPEngCntLstPropertyNativeCached ); + + + //Try locate list from plain names array + //If list is found, remove it from plain names and parameter array + TInt cn( planeNames->Count() - 1 ); + for ( ; cn >= 0 ; --cn ) + { + if ( KErrNone == NContactListIdsTools::CompareContactListIds( sett->Name(), + ( *planeNames )[ cn ] ) ) + { + sett->SetPropertyL( KPEngListExistsOnServer, + KPEngCntLstPropertyNativeCached, + ETrue ); + if ( aListsUnsubscribed ) + { + sett->DeletePropertyL( KPEngCntLstSubscribe, + KPEngCntLstPropertyNativePermanent ); + + sett->DeletePropertyL( KPEngSubcriptionUpdate, + KPEngCntLstPropertyNativeCached ); + } + aExistingLists.Delete( cn ); + planeNames->Delete( cn ); + break; + } + } + + + //Process the case that list was not among server lists + if ( cn == -1 ) + { + //List was not found from plain names + if ( !sett->Property( KPEngCntLstSyncMaster, KPEngCntLstPropertyNativePermanent ) && + sett->Property( KPEngCntLstMustExistOnServer, KPEngCntLstPropertyNativePermanent ) ) + { + CompleteCntListDeletionL( sett->Name() ); + } + else + { + sett->DeletePropertyL( KPEngListExistsOnServer, KPEngCntLstPropertyNativeCached ); + } + } + } + + + //Process those lists which were left over in the existing lists array + //=> those are new ones that needs to be registered to local system + const TInt remainingCount( aExistingLists.Count() ); + for ( TInt y( 0 ) ; y < remainingCount ; ++y ) + { + CPEngContactListSettings* sett = + CPEngContactListSettings::NewServerLC( ( *planeNames )[ y ], + aExistingLists[ y ], + *this ); + + CPEngContactListManagerBase::InsertContactListSettingsL( *sett ); + CleanupStack::Pop( sett ); + + sett->SetPropertyL( KPEngListExistsOnServer, + KPEngCntLstPropertyNativeCached, + ETrue ); + } + + + //List of lists handled + CleanupStack::PopAndDestroy(); // planeNames + iEnviromentSynchronized = ETrue; + + + + // Handle the default contact list + TPtrC defaultList( aDefaultList ); + NContactListIdsTools::ExtractPureContactListName( defaultList, + iPlainUserName ); + + CPEngContactListSettings* sett = ContactListSettingsOrNull( defaultList ); + if ( sett ) + { + sett->SetPropertyL( KPEngCntLstDefault, + KPEngCntLstPropertyNativePermanent, + ETrue ); + } + else + { + //Force store of contact list manager, + //to distribute the enviroment sync state + StoreL(); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::UserDomain() +// ----------------------------------------------------------------------------- +// +const TDesC& CPEngContactListTransactionManager::UserDomain() + { + return iUserDomain; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::DefaultCntListSettingsOrNull() +// ----------------------------------------------------------------------------- +// +CPEngContactListSettings* CPEngContactListTransactionManager::DefaultCntListSettingsOrNull() + { + return CPEngContactListManagerBase::DefaultCntListSettingsOrNull(); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::CompleteCntListDeletionL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransactionManager::CompleteCntListDeletionL( + const TDesC& aContactList ) + { + DeleteContactListSettingsL( aContactList ); + } + + + +// ============================================================================= +// =============== From main class ============================================= +// ============================================================================= + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::GetOutGoingTransactionHandlersL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransactionManager::GetOutGoingTransactionHandlersL( + const TDesC& aData, + RPointerArray& aHandlers, + TInt aOperationId ) + { + PENG_DP( D_PENG_LIT( "CPEngContactListTransactionManager::GetOutGoingTransactionHandlersL()" ) ); + if ( aData.Length() == 0 ) + { + return; + } + + // unpack SIDs, creates sIds and its count + CDesC16Array* sIds = PEngMessagePacker::UnpackDesArrayLC( aData ); + TInt countStoreIDs( sIds->Count() ); + + // loop going through all requested Store IDs + for ( TInt x( 0 ) ; x < countStoreIDs ; x++ ) + { + // try to load contact list from store + CPEngContactListModBase* volatile model = NULL; + TRAPD( e, model = &( LoadContactListModelL( sIds->MdcaPoint( x ), + ETrue, + ETrue ) ) ); + + // if list does not exists, continue for next SID + if ( e == KErrNotFound ) + { + continue; + } + + User::LeaveIfError( e ); + CleanupClosePushL( *model ); + + // is update already in progress? + if ( model->UpdateInProgress() ) + { + User::Leave( KErrInUse ); + } + + // clean change monitor + model->ChangeMonitor().Reset(); + model->StoreEntryL(); + + + // is it watcher list? + if ( KErrNone == sIds->MdcaPoint( x ).CompareF( KPEngWatcherList ) ) + { + GetWatcherListHandlerL( *model, + aHandlers, + aOperationId ); + CleanupStack::PopAndDestroy(); // model + continue; + } + + + // is this delete contact list request + if ( model->Settings().Property( KPEngContactListDeleteNeeded, + KPEngCntLstPropertyNativeCached ) ) + { + GetDeleteCntListHandlerL( *model, + aHandlers, + aOperationId ); + CleanupStack::PopAndDestroy(); // model + continue; + } + + + // is list synchronized + if ( model->Settings().Synchronized() ) + { + GetContactListsUpdateHandlersL( *model, + aHandlers, + aOperationId ); + } + else + { + GetContactListsSyncHandlersL( *model, + aHandlers, + aOperationId ); + } + CleanupStack::PopAndDestroy(); // model + } + + CleanupStack::PopAndDestroy( sIds ); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::GetContactListUpdateHandlersL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransactionManager::GetContactListsUpdateHandlersL( + CPEngContactListModBase& aContactList, + RPointerArray& aHandlers, + TInt aOperationId ) + { + CPEngContactListSettings& settings = aContactList.Settings(); + if ( settings.Property( KPEngListExistsOnServer, + KPEngCntLstPropertyNativeCached ) ) + { + GetUpdateHandlersForExistingCntListL( aContactList, + aHandlers, + aOperationId ); + + // check if subscription needs some update + if ( settings.Property( KPEngSubcriptionUpdate, + KPEngCntLstPropertyNativeCached ) ) + { + GetSubscriptionUpdateHandlerL( aContactList, + aHandlers, + aOperationId ); + } + + // is property update needed + if ( settings.Property( KPEngPropertiesUpdateNeeded, + KPEngCntLstPropertyNativeCached ) ) + { + GetUpdateCntListPropertiesHandlerL( aContactList, + aHandlers, + aOperationId ); + } + } + + else + { + GetUpdateHandlersForNotExistingCntListL( aContactList, + aHandlers, + aOperationId ); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::GetContactListSyncHandlersL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransactionManager::GetContactListsSyncHandlersL( + CPEngContactListModBase& aContactList, + RPointerArray& aHandlers, + TInt aOperationId ) + { + // check if there is need to created any handler + CPEngContactListSettings& settings = aContactList.Settings(); + + if ( // list must exists on the server -> need transaction + ( settings.Property( KPEngCntLstMustExistOnServer, + KPEngCntLstPropertyNativePermanent ) ) + || + // list exists on the server -> need of transaction + ( settings.Property( KPEngListExistsOnServer, + KPEngCntLstPropertyNativeCached ) ) + || + // is anything in the contact list -> sync it + ( aContactList.Count() != 0 ) ) + { + // create sync handler + CleanContactListSettingsForListCreationL( aContactList.Settings() ); + GetSynchronizeOneCntListHandlerL( aContactList, + aHandlers, + aOperationId ); + } + else + { + // there was no need to create sync transaction for + // the contact list, set it as synchronized + settings.SetPropertyL( KPEngHasBeenSynchronized, + KPEngCntLstPropertyNativeCached, + ETrue ); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::GetDeleteCntListHandlerL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransactionManager::GetDeleteCntListHandlerL( + CPEngContactListModBase& aModel, + RPointerArray& aHandlers, + TInt aOperationId ) + { + // check if contact list exists on the presence server, can be that it is just + // lazy initialized + if ( aModel.Settings().Property( KPEngListExistsOnServer, + KPEngCntLstPropertyNativeCached ) ) + { + // handler is needed, create it here + CreateHandler2ParamL < CPEngContactListDeleteTrans, + CPEngContactListModBase&, + MPEngContactListTransactionManager& > ( aHandlers, + aModel, + *this, + iCSPVersion, + aOperationId ); + } + else + { + // no need to create handler, just commit change on the store + CompleteCntListDeletionL( aModel.Settings().Name() ); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::GetUpdateCntListPropertiesHandlerL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransactionManager::GetUpdateCntListPropertiesHandlerL( + CPEngContactListModBase& aModel, + RPointerArray& aHandlers, + TInt aOperationId ) + { + CreateHandler2ParamL < CPEngContactListMngTransProperties, + CPEngContactListModBase&, + MPEngContactListTransactionManager& > ( aHandlers, + aModel, + *this, + iCSPVersion, + aOperationId ); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::GetUpdateHandlersForExistingCntListL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransactionManager::GetUpdateHandlersForExistingCntListL( + CPEngContactListModBase& aModel, + RPointerArray& aHandlers, + TInt aOperationId ) + { + RPointerArray nickList; + CleanupClosePushL( nickList ); + + // check is there is something to update + aModel.FillAddNickListL( nickList ); + if ( 0 != nickList.Count() ) + { + // something to update => create update handler + CreateHandler2ParamL < CPEngContactListMngTransAddId, + CPEngContactListModBase&, + CPEngSessionSlotId& > ( aHandlers, + aModel, + *iSessionId, + iCSPVersion, + aOperationId ); + } + + + nickList.Reset(); + aModel.FillRemoveNickListL( nickList ); + if ( 0 != nickList.Count() ) + { + // something to update => create update handler + CreateHandler2ParamL < CPEngContactListMngTransRemoveId, + CPEngContactListModBase&, + CPEngSessionSlotId& > ( aHandlers, + aModel, + *iSessionId, + iCSPVersion, + aOperationId ); + } + + CleanupStack::PopAndDestroy(); // nickList + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::GetUpdateHandlersForNotExistingCntListL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransactionManager::GetUpdateHandlersForNotExistingCntListL( + CPEngContactListModBase& aModel, + RPointerArray& aHandlers, + TInt aOperationId ) + { + // delete properties which are not needed + CleanContactListSettingsForListCreationL( aModel.Settings() ); + + if ( aModel.Count() != 0 ) + { + // something to update => create update handler + CreateHandler3ParamL < CPEngContactListTransCreate, + CPEngContactListModBase&, + CPEngSessionSlotId&, + MPEngContactListTransactionManager& > ( aHandlers, + aModel, + *iSessionId, + *this, + iCSPVersion, + aOperationId ); + } + else + { + // Harmonize default contact list settings if list was configured as new one + NListLibTools::HarmonizeDefaultContactListSettingsL( aModel.Settings(), *this ); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::GetWatcherListHandlerL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransactionManager::GetWatcherListHandlerL( + CPEngContactListModBase& aModel, + RPointerArray& aHandlers, + TInt aOperationId ) + { + CreateHandler1ParamL < CPEngGetWatchersTransaction, + CPEngContactListModBase& > ( aHandlers, + aModel, + iCSPVersion, + aOperationId ); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::GetSynchronizeOneCntListHandlerL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransactionManager::GetSynchronizeOneCntListHandlerL( + CPEngContactListModBase& aModel, + RPointerArray& aHandlers, + TInt aOperationId ) + { + + if ( aModel.Settings().Property( KPEngListExistsOnServer, + KPEngCntLstPropertyNativeCached ) ) + { + CreateHandler3ParamL < CPEngContactListTransSync, + CPEngContactListModBase&, + CPEngSessionSlotId&, + MPEngContactListTransactionManager& > ( aHandlers, + aModel, + *iSessionId, + *this, + iCSPVersion, + aOperationId ); + + } + + else + { + CreateHandler3ParamL < CPEngContactListTransCreate, + CPEngContactListModBase&, + CPEngSessionSlotId&, + MPEngContactListTransactionManager& > ( aHandlers, + aModel, + *iSessionId, + *this, + iCSPVersion, + aOperationId ); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::GetSubscriptionUpdateHandlerL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransactionManager::GetSubscriptionUpdateHandlerL( + CPEngContactListModBase& aModel, + RPointerArray& aHandlers, + TInt aOperationId ) + { + CreateHandler2ParamL < CPEngContactListMngTransSubcription, + CPEngContactListModBase&, + CPEngSessionSlotId& > ( aHandlers, + aModel, + *iSessionId, + iCSPVersion, + aOperationId ); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::CreateHandler1ParamL() +// ----------------------------------------------------------------------------- +// +template < class THandlerClass, +class TParam1 > +void CPEngContactListTransactionManager::CreateHandler1ParamL( + RPointerArray& aHandlers, + TParam1 aParam1, + TPEngWVCspVersion& aParam2, + TInt aParam3 ) + { + // create start synchronization handler + THandlerClass* newHandler = THandlerClass::NewLC( aParam1, + aParam2, + aParam3 ); + + aHandlers.AppendL( newHandler ); + CleanupStack::Pop(); // newHandler + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::CreateHandler2ParamL() +// ----------------------------------------------------------------------------- +// +template < class THandlerClass, +class TParam1, +class TParam2 > +void CPEngContactListTransactionManager::CreateHandler2ParamL( + RPointerArray& aHandlers, + TParam1 aParam1, + TParam2 aParam2, + TPEngWVCspVersion& aParam3, + TInt aParam4 ) + { + THandlerClass* newHandler = THandlerClass::NewLC( aParam1, + aParam2, + aParam3, + aParam4 ); + + aHandlers.AppendL( newHandler ); + CleanupStack::Pop(); //newHandler + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::CreateHandler3ParamL() +// ----------------------------------------------------------------------------- +// +template < class THandlerClass, +class TParam1, +class TParam2, +class TParam3 > +void CPEngContactListTransactionManager::CreateHandler3ParamL( + RPointerArray& aHandlers, + TParam1 aParam1, + TParam2 aParam2, + TParam3 aParam3, + TPEngWVCspVersion& aParam4, + TInt aParam5 ) + { + THandlerClass* newHandler = THandlerClass::NewLC( aParam1, + aParam2, + aParam3, + aParam4, + aParam5 ); + + aHandlers.AppendL( newHandler ); + CleanupStack::Pop(); // newHandler + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::InitializePlainUserId() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransactionManager::InitializePlainUserId() + { + TChar add( '@' ); + TInt offset( iSessionId->UserId().Locate( add ) ); + // remove domain + if ( KErrNotFound != offset ) + { + iPlainUserName.Set( iSessionId->UserId().Left( offset ) ); + } + else + { + iPlainUserName.Set( iSessionId->UserId() ); + } + + // remove wv ID begining wv: + if ( KErrNone == iPlainUserName.Left( KPEngWVIDPrefixLength + ).CompareF( KPEngWVIDPrefix ) ) + { + iPlainUserName.Set( iPlainUserName.Mid( KPEngWVIDPrefixLength ) ); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransactionManager::CleanContactListSettingsForListCreationL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransactionManager::CleanContactListSettingsForListCreationL( + CPEngContactListSettings& aSettings ) + { + // Clean contact list settings which are not needed when contact + // list will be created + aSettings.DeletePropertyL( KPEngSubcriptionUpdate, + KPEngCntLstPropertyNativeCached ); + aSettings.DeletePropertyL( KPEngPropertiesUpdateNeeded, + KPEngCntLstPropertyNativeCached ); + } + +// End of File + + + + +