phonebookui/Phonebook2/UIControls/src/CPbk2DefaultAttributeProcess.cpp
changeset 0 e686773b3f54
--- /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