diff -r 5b6f26637ad3 -r f4a778e096c2 phonebookui/Phonebook2/UIControls/src/CPbk2DefaultAttributeProcess.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2DefaultAttributeProcess.cpp Wed Sep 01 12:29:52 2010 +0100 @@ -0,0 +1,416 @@ +/* +* Copyright (c) 2005-2007 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: Phonebook 2 default attribute modification processor. +* +*/ + + +#include "CPbk2DefaultAttributeProcess.h" + +// Phonebook 2 +#include + +// Virtual Phonebook +#include +#include +#include +#include +#include + +// Debugging headers +#include + + +/// Unnamed namespace for local definitions +namespace { + +const TInt KGranularity = 4; + +#ifdef _DEBUG + +enum TPanicCode_Process + { + EPanicLogic_AttributeOperationComplete, + EPanicLogic_AttributeOperationFailed, + EPanicPreCond_SetDefaultsL, + EPanicPreCond_RemoveDefaultsL, + }; + +static void Panic( TPanicCode_Process aReason ) + { + _LIT(KPanicText, "CPbk2DefaultAttributeProcess"); + User::Panic(KPanicText, aReason); + } + +#endif // _DEBUG + +} /// namespace + +// -------------------------------------------------------------------------- +// CPbk2DefaultAttributeProcess::CPbk2DefaultAttributeProcess +// -------------------------------------------------------------------------- +// +CPbk2DefaultAttributeProcess::CPbk2DefaultAttributeProcess + ( CVPbkContactManager& aManager, MVPbkStoreContact& aContact, + MPbk2DefaultAttributeProcessObserver& aObserver ): + iManager( aManager ), iContact( aContact ), + iObserver( aObserver ) + { + } + +// -------------------------------------------------------------------------- +// CPbk2DefaultAttributeProcess::CPbk2DefaultAttributeProcess +// -------------------------------------------------------------------------- +// +CPbk2DefaultAttributeProcess::~CPbk2DefaultAttributeProcess() + { + delete iDefaultAttributes; + delete iSetAttributeOperation; + delete iRemoveAttributeOperation; + delete iRemovePreviousAttributeOperation; + delete iRemoveAttributeField; + } + +// -------------------------------------------------------------------------- +// CPbk2DefaultAttributeProcess::NewL +// -------------------------------------------------------------------------- +// +EXPORT_C CPbk2DefaultAttributeProcess* CPbk2DefaultAttributeProcess::NewL + ( CVPbkContactManager& aManager, MVPbkStoreContact& aContact, + MPbk2DefaultAttributeProcessObserver& aObserver ) + { + CPbk2DefaultAttributeProcess* self = + new ( ELeave ) CPbk2DefaultAttributeProcess + ( aManager, aContact, aObserver ); + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2DefaultAttributeProcess::SetDefaultL +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2DefaultAttributeProcess::SetDefaultL + ( TVPbkDefaultType aDefaultType, MVPbkStoreContactField& aField ) + { + iAttributeType = aDefaultType; + iSetAttributeField = &aField; + + delete iDefaultAttributes; + iDefaultAttributes = NULL; + iDefaultAttributes = + new( ELeave ) CArrayFixFlat( KGranularity ); + iDefaultAttributes->AppendL( aDefaultType ); + + SetNextL(); + } + +// -------------------------------------------------------------------------- +// CPbk2DefaultAttributeProcess::RemoveDefaultL +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2DefaultAttributeProcess::RemoveDefaultL + ( TVPbkDefaultType aDefaultType ) + { + iAttributeType = aDefaultType; + + delete iDefaultAttributes; + iDefaultAttributes = NULL; + iDefaultAttributes = + new( ELeave ) CArrayFixFlat( KGranularity ); + iDefaultAttributes->AppendL( aDefaultType ); + + + RemoveNextL(); + } + +// -------------------------------------------------------------------------- +// CPbk2DefaultAttributeProcess::SetDefaultsL +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2DefaultAttributeProcess::SetDefaultsL + ( CArrayFixFlat* aDefaultProperties, + MVPbkStoreContactField& aField ) + { + __ASSERT_DEBUG( aDefaultProperties->Count() > 0, + Panic( EPanicPreCond_SetDefaultsL ) ); + + iSetAttributeField = &aField; + + // Take ownership + delete iDefaultAttributes; + iDefaultAttributes = aDefaultProperties; + + SetNextL(); + } + +// -------------------------------------------------------------------------- +// CPbk2DefaultAttributeProcess::RemoveDefaultsL +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2DefaultAttributeProcess::RemoveDefaultsL + ( CArrayFixFlat* aDefaultProperties ) + { + __ASSERT_DEBUG( aDefaultProperties->Count() > 0, + Panic( EPanicPreCond_RemoveDefaultsL ) ); + + // Take ownership + delete iDefaultAttributes; + iDefaultAttributes = aDefaultProperties; + + RemoveNextL(); + } + +// -------------------------------------------------------------------------- +// CPbk2DefaultAttributeProcess::AttributeOperationComplete +// -------------------------------------------------------------------------- +// +void CPbk2DefaultAttributeProcess::AttributeOperationComplete + ( MVPbkContactOperationBase& aOperation ) + { + __ASSERT_DEBUG( &aOperation == iSetAttributeOperation || + &aOperation == iRemoveAttributeOperation || + &aOperation == iRemovePreviousAttributeOperation, + Panic( EPanicLogic_AttributeOperationComplete ) ); + + TInt err = KErrNone; + + if ( &aOperation == iSetAttributeOperation ) + { + // Move to next attribute + TRAP( err, SetNextL() ); + } + else if ( &aOperation == iRemoveAttributeOperation ) + { + // Move to next attribute + TRAP( err, RemoveNextL() ); + } + else if ( &aOperation == iRemovePreviousAttributeOperation ) + { + // Previous attribute was removed, set the new attribute + TRAP( err, DoSetL( iAttributeType ) ); + } + + // Handle error + if ( err != KErrNone ) + { + iObserver.AttributeProcessFailed( err ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2DefaultAttributeProcess::AttributeOperationFailed +// -------------------------------------------------------------------------- +// +void CPbk2DefaultAttributeProcess::AttributeOperationFailed + ( MVPbkContactOperationBase& aOperation, TInt aError ) + { + __ASSERT_DEBUG( &aOperation == iSetAttributeOperation || + &aOperation == iRemoveAttributeOperation || + &aOperation == iRemovePreviousAttributeOperation, + Panic( EPanicLogic_AttributeOperationFailed ) ); + + iObserver.AttributeProcessFailed( aError ); + } + +// -------------------------------------------------------------------------- +// CPbk2DefaultAttributeProcess::FindContactFieldWithAttributeL +// -------------------------------------------------------------------------- +// +MVPbkStoreContactField* + CPbk2DefaultAttributeProcess::FindContactFieldWithAttributeL + ( TVPbkDefaultType aDefaultType ) + { + MVPbkStoreContactField* field = NULL; + + // Loop through contact's fields and find the specified field + const TInt fieldCount = iContact.Fields().FieldCount(); + CVPbkDefaultAttribute* attr = + CVPbkDefaultAttribute::NewL( aDefaultType ); + CleanupStack::PushL( attr ); + + for ( TInt i=0; i < fieldCount; ++i ) + { + MVPbkStoreContactField* candidate = + iContact.Fields().FieldAtLC( i ); + + // Check if field has default attribute defaultType + if ( iManager.ContactAttributeManagerL().HasFieldAttributeL + ( *attr, *candidate ) ) + { + field = candidate; + CleanupStack::Pop(); // candicate + break; + } + else + { + CleanupStack::PopAndDestroy(); // candidate + } + } + + CleanupStack::PopAndDestroy( attr ); + return field; + } + +// -------------------------------------------------------------------------- +// CPbk2DefaultAttributeProcess::DoSetL +// -------------------------------------------------------------------------- +// +void CPbk2DefaultAttributeProcess::DoSetL( TVPbkDefaultType aDefaultType ) + { + // Set given attribute to given field + CVPbkDefaultAttribute* attr = + CVPbkDefaultAttribute::NewL( aDefaultType ); + CleanupStack::PushL( attr ); + + delete iSetAttributeOperation; + iSetAttributeOperation = NULL; + iSetAttributeOperation = + iManager.ContactAttributeManagerL().SetFieldAttributeL + ( *iSetAttributeField, *attr, *this ); + + CleanupStack::PopAndDestroy( attr ); + } + +// -------------------------------------------------------------------------- +// CPbk2DefaultAttributeProcess::DoRemoveL +// -------------------------------------------------------------------------- +// +TBool CPbk2DefaultAttributeProcess::DoRemoveL + ( TVPbkDefaultType aDefaultType ) + { + TBool found = EFalse; + + delete iRemoveAttributeField; + iRemoveAttributeField = NULL; + iRemoveAttributeField = FindContactFieldWithAttributeL( aDefaultType ); + + if ( iRemoveAttributeField ) + { + found = ETrue; + + CVPbkDefaultAttribute* attr = + CVPbkDefaultAttribute::NewL( aDefaultType ); + CleanupStack::PushL( attr ); + + delete iRemoveAttributeOperation; + iRemoveAttributeOperation = NULL; + iRemoveAttributeOperation = iManager.ContactAttributeManagerL(). + RemoveFieldAttributeL( *iRemoveAttributeField, *attr, *this ); + + CleanupStack::PopAndDestroy( attr ); + } + + return found; + } + +// -------------------------------------------------------------------------- +// CPbk2DefaultAttributeProcess::DoRemovePreviousL +// -------------------------------------------------------------------------- +// +TBool CPbk2DefaultAttributeProcess::DoRemovePreviousL + ( TVPbkDefaultType aDefaultType ) + { + TBool found = EFalse; + + delete iRemoveAttributeField; + iRemoveAttributeField = NULL; + iRemoveAttributeField = FindContactFieldWithAttributeL( aDefaultType ); + + if ( iRemoveAttributeField ) + { + found = ETrue; + + CVPbkDefaultAttribute* attr = + CVPbkDefaultAttribute::NewL( aDefaultType ); + CleanupStack::PushL( attr ); + + delete iRemovePreviousAttributeOperation; + iRemovePreviousAttributeOperation = NULL; + iRemovePreviousAttributeOperation = + iManager.ContactAttributeManagerL().RemoveFieldAttributeL + ( *iRemoveAttributeField, *attr, *this ); + + CleanupStack::PopAndDestroy( attr ); + } + + return found; + } + +// -------------------------------------------------------------------------- +// CPbk2DefaultAttributeProcess::SetNextL +// -------------------------------------------------------------------------- +// +void CPbk2DefaultAttributeProcess::SetNextL() + { + TVPbkDefaultType attributeType = NextAttribute(); + if ( attributeType != EVPbkDefaultTypeUndefined ) + { + iAttributeType = attributeType; + // Remove previous, if any + if ( !DoRemovePreviousL( attributeType ) ) + { + DoSetL( attributeType ); + } + } + else + { + // Finished + iObserver.AttributeProcessCompleted(); + } + } + +// -------------------------------------------------------------------------- +// CPbk2DefaultAttributeProcess::RemoveNextL +// -------------------------------------------------------------------------- +// +void CPbk2DefaultAttributeProcess::RemoveNextL() + { + TVPbkDefaultType attributeType = NextAttribute(); + if ( attributeType != EVPbkDefaultTypeUndefined ) + { + if ( !DoRemoveL( attributeType ) ) + { + RemoveNextL(); + } + } + else + { + // Finished + iObserver.AttributeProcessCompleted(); + } + } + +// -------------------------------------------------------------------------- +// CPbk2DefaultAttributeProcess::NextAttribute +// Gets next attribute from the array. The array is processed backwards. +// -------------------------------------------------------------------------- +// +inline TVPbkDefaultType CPbk2DefaultAttributeProcess::NextAttribute() + { + TVPbkDefaultType attribute = EVPbkDefaultTypeUndefined; + TInt count = 0; + if ( iDefaultAttributes ) + { + count = iDefaultAttributes->Count(); + } + + if ( count > 0 ) + { + attribute = iDefaultAttributes->At( count - 1 ); // zero-based + iDefaultAttributes->Delete( count -1 ); // zero-based + } + return attribute; + } + +// End of File