phonebookengines/VirtualPhonebook/VPbkVCardEng/src/CVPbkImportToContactsMergeOperation.cpp
changeset 0 e686773b3f54
child 57 2666d9724c76
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkVCardEng/src/CVPbkImportToContactsMergeOperation.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,531 @@
+/*
+* Copyright (c) 2007-2008 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:  An operation for importing and updating contacts to the store
+*
+*/
+
+
+#include "CVPbkImportToContactsMergeOperation.h"
+#include "VPbkVCardEngError.h"
+#include "CVPbkVCardImporter.h"
+
+// Virtual Phonebook
+#include <MVPbkStoreContact.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkContactLink.h>
+#include <CVPbkVCardEng.h>
+#include <CVPbkContactManager.h>
+#include <MVPbkFieldType.h>
+#include <MVPbkContactFieldData.h>
+#include <MVPbkSingleContactOperationObserver.h>
+
+namespace{
+	#ifdef _DEBUG
+       
+	enum TPanic
+		{
+		EPanicInvalidState = 1,
+		EPanicInvalidToRetrieve,
+		EPanicInvalidToLock,
+		EPanicInvalidToCommit,
+		EPanicInvalidToUpdate,
+        };
+
+    void Panic(TPanic aPanic)
+    	{
+        _LIT(KPanicCat, "CVPbkImportToContactsMergeOperation");
+        User::Panic(KPanicCat, aPanic);
+        }
+    
+    #endif // _DEBUG
+} //namespace
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::CVPbkImportToContactsMergeOperation
+// ---------------------------------------------------------------------------
+//
+CVPbkImportToContactsMergeOperation::CVPbkImportToContactsMergeOperation(
+		const MVPbkContactLink& aReplaceContact,
+		MVPbkSingleContactOperationObserver& aObserver,
+		MVPbkContactStore& aTargetStore,
+		CVPbkVCardData& aData
+		)
+        :   CActive( EPriorityStandard ),
+        	iState ( EImport ),
+        	iTargetStore( aTargetStore ),
+        	iReplaceContact( aReplaceContact ),
+            iObserver( aObserver ),
+            iData(aData)
+    {
+    CActiveScheduler::Add(this);
+    iGroupcardHandler = NULL;
+    iOperationImpl = NULL;
+    iVPbkOperation = NULL;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CVPbkImportToContactsMergeOperation::ConstructL( TVPbkImportCardType aType, RReadStream& aSourceStream)
+    {
+
+    if ( aType == EVCard )
+        {
+        iOperationImpl = CVPbkVCardImporter::NewL(iImportedContacts, aSourceStream, iTargetStore, iData );
+        }
+    else
+        {
+        User::Leave( KErrArgument );
+        }    
+    iGroupcardHandler = CVPbkGroupCardHandler::NewL(iData);   
+    }
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::NewL
+// ---------------------------------------------------------------------------
+//
+CVPbkImportToContactsMergeOperation * CVPbkImportToContactsMergeOperation::NewL( 
+             TVPbkImportCardType aType,
+             CVPbkVCardData& aData, 
+             const MVPbkContactLink& aReplaceContact, 
+             MVPbkContactStore& aTargetStore, 
+             RReadStream& aSourceStream, 
+             MVPbkSingleContactOperationObserver& aObserver )
+    {
+    CVPbkImportToContactsMergeOperation* self =
+    new( ELeave ) CVPbkImportToContactsMergeOperation( aReplaceContact,aObserver, aTargetStore, aData);
+    CleanupStack::PushL( self );
+    self->ConstructL( aType, aSourceStream);
+    CleanupStack::Pop( self );
+    return self;
+
+    }
+
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::~CVPbkImportToContactsMergeOperation
+// ---------------------------------------------------------------------------
+//
+CVPbkImportToContactsMergeOperation::~CVPbkImportToContactsMergeOperation()
+    {
+
+    if(iOperationImpl)
+        {
+        delete iOperationImpl;
+        iOperationImpl = NULL;
+        }
+    if (iGroupcardHandler)
+        {
+        delete iGroupcardHandler;
+        iGroupcardHandler = NULL;
+        }
+    if(iVPbkOperation)
+        delete iVPbkOperation;
+
+    iImportedContacts.ResetAndDestroy();
+
+    CActive::Cancel();
+    }
+
+void CVPbkImportToContactsMergeOperation::StartL()
+    {
+    __ASSERT_DEBUG( iOperationImpl, VPbkVCardEngError::Panic(
+        VPbkVCardEngError::EPreCond_CVPbkImportToStoreOperation_StartL ) );
+
+    iOperationImpl->SetObserver( *this );
+    iOperationImpl->StartL();
+    }
+
+// ---------------------------------------------------------------------------
+// From class MVPbkContactOperation
+// CVPbkImportToStoreOperation::Cancel
+// ---------------------------------------------------------------------------
+//
+
+void CVPbkImportToContactsMergeOperation::Cancel()
+    {
+    if(iOperationImpl)
+    delete iOperationImpl;
+    iOperationImpl = NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::RunL
+// from CActive
+// ---------------------------------------------------------------------------
+//
+void CVPbkImportToContactsMergeOperation::RunL()
+	{
+	if ( iStatus == KErrNone)
+		{
+		switch( iState )
+			{
+			case ERetrieve:
+				{
+				RetrieveContactL();
+				break;
+				}				
+			case ELock:
+				{
+				LockContactL();
+				break;
+				}
+			case EReplaceFields:
+				{
+				UpdateContactL();
+				break;
+				}						
+			case ECommit:
+				{
+				CommitContactL();
+				break;
+				}
+			case EReRetrieve:
+				{
+				ReRetrieveContactL();
+				break;
+				}				
+			case EComplete:
+			    {
+
+			    if(iGroupcardHandler && ((CVPbkVCardImporter *)iOperationImpl)->IsGroupcard())
+			        {
+			        iGroupcardHandler->BuildContactGroupsHashMapL(iContact->ParentStore());
+			        const MVPbkContactLink* contact = iContact->CreateLinkLC();
+			        iGroupcardHandler->GetContactGroupStoreL(*contact);
+			        CleanupStack::PopAndDestroy(); // For contact
+			        iGroupcardHandler->DecodeContactGroupInVCardL(((CVPbkVCardImporter *)iOperationImpl)->GetGroupcardvalue());
+			        }
+			    iObserver.VPbkSingleContactOperationComplete( *this, iContact );
+			    iContact = NULL;
+			    break;
+			    }
+			default:
+				__ASSERT_DEBUG( EFalse, Panic(EPanicInvalidState) );
+			}
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::RunError
+// from CActive
+// ---------------------------------------------------------------------------
+//
+TInt CVPbkImportToContactsMergeOperation::RunError( TInt aError )
+	{
+	HandleError( aError );
+	return KErrNone;
+	}
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::DoCancel
+// from CActive
+// ---------------------------------------------------------------------------
+//
+void CVPbkImportToContactsMergeOperation::DoCancel()
+	{
+	delete iOperationImpl;
+	iOperationImpl = NULL;
+	}
+
+// ---------------------------------------------------------------------------
+// From class MVPbkImportOperationObserver
+// CVPbkImportToStoreOperation::ContactsImported
+// ---------------------------------------------------------------------------
+//
+void CVPbkImportToContactsMergeOperation::ContactsImported()
+    {
+    if (iVPbkOperation)
+        delete iVPbkOperation;
+    iVPbkOperation = NULL;
+
+    //At the Start of contact replace,aContact will be Null, it will be retrived later
+    HandleContactReplacing(NULL); 
+    }
+
+// ---------------------------------------------------------------------------
+// From class MVPbkImportOperationObserver
+// CVPbkImportToStoreOperation::ContactsImportedCompleted
+// ---------------------------------------------------------------------------
+//
+void CVPbkImportToContactsMergeOperation::ContactsImportingCompleted()
+    {
+    //not used
+    }
+
+// ---------------------------------------------------------------------------
+// From class MVPbkImportOperationObserver
+// CVPbkImportToStoreOperation::ContactImportingFailed
+// ---------------------------------------------------------------------------
+//
+void CVPbkImportToContactsMergeOperation::ContactImportingFailed( TInt aError )
+    {
+    if(iVPbkOperation)
+        delete iVPbkOperation;
+    iVPbkOperation = NULL;
+
+    HandleError( aError );
+    }
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::HandleContactReplacing
+// To initiate and start contact replacing
+// ---------------------------------------------------------------------------
+//
+void CVPbkImportToContactsMergeOperation::HandleContactReplacing(MVPbkStoreContact* aContact)
+    {
+    switch( iState )
+        {
+        case EImport:
+            {
+            // initiate contact replacing
+            if ( iImportedContacts.Count() == 1 )
+                {
+                NextState( ERetrieve );
+                }
+            else
+                {
+                // invalid arguments
+                HandleError( KErrArgument );
+                }
+            break;
+            }
+        case ERetrieve:
+            {
+            delete iContact;
+            iContact = aContact;
+            NextState( ELock );
+            break;
+            }
+        case EReRetrieve:
+            {
+            delete iContact;
+            iContact = aContact;
+            NextState( EComplete );
+            break;
+            }
+        default:
+            __ASSERT_DEBUG( EFalse, Panic(EPanicInvalidState) );
+            HandleError( KErrGeneral );
+        }
+    }
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::VPbkSingleContactOperationComplete
+// from class MVPbkSingleContactOperationObserver
+// ---------------------------------------------------------------------------
+//
+void CVPbkImportToContactsMergeOperation::VPbkSingleContactOperationComplete(
+                MVPbkContactOperationBase& /*aOperation*/,
+                MVPbkStoreContact* aContact )
+    {
+    if (iVPbkOperation)
+        delete iVPbkOperation;
+    iVPbkOperation = NULL;
+
+    HandleContactReplacing(aContact);
+    }
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::VPbkSingleContactOperationFailed
+// from class MVPbkSingleContactOperationObserver
+// ---------------------------------------------------------------------------
+//
+void CVPbkImportToContactsMergeOperation::VPbkSingleContactOperationFailed(
+                MVPbkContactOperationBase& /*aOperation*/, 
+                TInt aError )
+    {
+    delete iVPbkOperation;
+    iVPbkOperation = NULL;
+
+    HandleError( aError );
+    }
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::ContactOperationCompleted
+// from class MVPbkContactObserver
+// ---------------------------------------------------------------------------
+//
+void CVPbkImportToContactsMergeOperation::ContactOperationCompleted(
+		TContactOpResult aResult)
+	{
+	delete aResult.iStoreContact;
+	switch( iState )
+		{
+		case ELock:
+			{
+			NextState( EReplaceFields );
+			break;
+			}
+		case ECommit:
+			{
+			NextState( EReRetrieve );
+			break;
+			}			
+		default:
+			__ASSERT_DEBUG( EFalse, Panic(EPanicInvalidState) );
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::ContactOperationFailed
+// from class MVPbkContactObserver
+// ---------------------------------------------------------------------------
+//
+void CVPbkImportToContactsMergeOperation::ContactOperationFailed(
+		TContactOp /*aOpCode*/, TInt aErrorCode, TBool /*aErrorNotified*/)
+	{
+	HandleError( aErrorCode );
+	}
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::HandleError
+// ---------------------------------------------------------------------------
+//
+void CVPbkImportToContactsMergeOperation::HandleError(TInt aError)
+	{
+	iObserver.VPbkSingleContactOperationFailed( *this, aError );
+	}
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::RetrieveContactL
+// ---------------------------------------------------------------------------
+//
+inline void CVPbkImportToContactsMergeOperation::RetrieveContactL()
+	{
+	iVPbkOperation = iData.GetContactManager().RetrieveContactL(iReplaceContact,*this );
+	}
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::ReRetrieveContactL
+// ---------------------------------------------------------------------------
+//
+inline void CVPbkImportToContactsMergeOperation::ReRetrieveContactL()
+	{
+	__ASSERT_DEBUG( iContact, Panic(EPanicInvalidToRetrieve) );
+	
+	MVPbkContactLink* link = iContact->CreateLinkLC(); 
+	iVPbkOperation = iData.GetContactManager().RetrieveContactL( *link, *this );
+	CleanupStack::PopAndDestroy();
+	}
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::LockContactL
+// ---------------------------------------------------------------------------
+//
+inline void CVPbkImportToContactsMergeOperation::LockContactL()
+	{
+	__ASSERT_DEBUG( iContact, Panic(EPanicInvalidToLock) );
+	iContact->LockL( *this );
+	}
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::CommitContactL
+// ---------------------------------------------------------------------------
+//
+inline void CVPbkImportToContactsMergeOperation::CommitContactL()
+	{
+	__ASSERT_DEBUG( iContact, Panic(EPanicInvalidToCommit) );
+	
+	iContact->CommitL( *this );
+	}
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::UpdateContactL
+// ---------------------------------------------------------------------------
+//
+inline void CVPbkImportToContactsMergeOperation::UpdateContactL()
+	{
+	__ASSERT_DEBUG( iContact, Panic(EPanicInvalidToUpdate) );
+	__ASSERT_DEBUG( iImportedContacts.Count()>0, Panic(EPanicInvalidToUpdate) );
+	__ASSERT_DEBUG( iImportedContacts[0], Panic(EPanicInvalidToUpdate) );
+	
+	TRAPD( err, ReplaceContactL( *(iImportedContacts[0]), *iContact ));
+	
+	
+	// whether commit succeds or fails, we continue,
+	// update iImportedContacts right away
+	delete iImportedContacts[0];
+	iImportedContacts.Remove(0);	
+	
+	if ( err != KErrNone )
+		{
+		HandleError( err );
+		}
+	else
+		{
+		NextState( ECommit );
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// From class MVPbkImportOperationObserver
+// ---------------------------------------------------------------------------
+//
+inline void CVPbkImportToContactsMergeOperation::ReplaceContactL(
+		const MVPbkStoreContact& aSrc,
+		MVPbkStoreContact& aTarget )
+	{
+	aTarget.RemoveAllFields();
+	
+	const MVPbkStoreContactFieldCollection& sourceFields = aSrc.Fields();
+    const TInt sourceFieldCount = sourceFields.FieldCount();
+    for ( TInt i = 0; i < sourceFieldCount; ++i )
+        {
+        const MVPbkFieldType* type = 
+            sourceFields.FieldAt(i).BestMatchingFieldType();
+        if ( type )
+            {
+            CopyFieldL( sourceFields.FieldAt(i), *type, aTarget );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::CopyFieldL
+// ---------------------------------------------------------------------------
+//
+inline void CVPbkImportToContactsMergeOperation::CopyFieldL( 
+        const MVPbkStoreContactField& aSourceField,
+        const MVPbkFieldType& aType,
+        MVPbkStoreContact& aTargetContact )
+    {
+    MVPbkStoreContactField* newField = aTargetContact.CreateFieldLC( aType );
+    if ( newField->SupportsLabel() )
+        {
+        TPtrC fieldLabel = aSourceField.FieldLabel();
+        if (fieldLabel.Length() > 0)
+            {
+            newField->SetFieldLabelL(fieldLabel);
+            }
+        }
+    newField->FieldData().CopyL(aSourceField.FieldData());
+    aTargetContact.AddFieldL(newField);
+    CleanupStack::Pop(); // newField	
+	}
+
+// ---------------------------------------------------------------------------
+// CVPbkImportToContactsMergeOperation::NextState
+// ---------------------------------------------------------------------------
+//
+void CVPbkImportToContactsMergeOperation::NextState( TState aNextState )
+    {
+    iState = aNextState;
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete( status, KErrNone );
+    SetActive();
+    }
+
+// End of file