--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/UIControls/src/CPbk2DefaultAttributeProcess.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -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 <MPbk2DefaultAttributeProcessObserver.h>
+
+// Virtual Phonebook
+#include <MVPbkContactOperationBase.h>
+#include <MVPbkStoreContactField.h>
+#include <CVPbkDefaultAttribute.h>
+#include <CVPbkContactManager.h>
+#include <MVPbkStoreContact.h>
+
+// Debugging headers
+#include <Pbk2Debug.h>
+
+
+/// 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<TVPbkDefaultType>( KGranularity );
+ iDefaultAttributes->AppendL( aDefaultType );
+
+ SetNextL();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2DefaultAttributeProcess::RemoveDefaultL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2DefaultAttributeProcess::RemoveDefaultL
+ ( TVPbkDefaultType aDefaultType )
+ {
+ iAttributeType = aDefaultType;
+
+ delete iDefaultAttributes;
+ iDefaultAttributes = NULL;
+ iDefaultAttributes =
+ new( ELeave ) CArrayFixFlat<TVPbkDefaultType>( KGranularity );
+ iDefaultAttributes->AppendL( aDefaultType );
+
+
+ RemoveNextL();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2DefaultAttributeProcess::SetDefaultsL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2DefaultAttributeProcess::SetDefaultsL
+ ( CArrayFixFlat<TVPbkDefaultType>* 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<TVPbkDefaultType>* 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