diff -r 34879f5cfc63 -r 2666d9724c76 phonebookengines/VirtualPhonebook/VPbkVCardEng/src/CVPbkImportToContactsMergeOperation.cpp --- a/phonebookengines/VirtualPhonebook/VPbkVCardEng/src/CVPbkImportToContactsMergeOperation.cpp Mon Jun 21 15:24:27 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkVCardEng/src/CVPbkImportToContactsMergeOperation.cpp Thu Jul 15 18:22:55 2010 +0300 @@ -28,22 +28,26 @@ #include #include #include +#include +#include #include +#include "CVPbkDefaultAttribute.h" +const TInt KGranularity = 4; namespace{ - #ifdef _DEBUG + #ifdef _DEBUG - enum TPanic - { - EPanicInvalidState = 1, - EPanicInvalidToRetrieve, - EPanicInvalidToLock, - EPanicInvalidToCommit, - EPanicInvalidToUpdate, + enum TPanic + { + EPanicInvalidState = 1, + EPanicInvalidToRetrieve, + EPanicInvalidToLock, + EPanicInvalidToCommit, + EPanicInvalidToUpdate, }; void Panic(TPanic aPanic) - { + { _LIT(KPanicCat, "CVPbkImportToContactsMergeOperation"); User::Panic(KPanicCat, aPanic); } @@ -56,15 +60,15 @@ // --------------------------------------------------------------------------- // CVPbkImportToContactsMergeOperation::CVPbkImportToContactsMergeOperation( - const MVPbkContactLink& aReplaceContact, - MVPbkSingleContactOperationObserver& aObserver, - MVPbkContactStore& aTargetStore, - CVPbkVCardData& aData - ) + const MVPbkContactLink& aReplaceContact, + MVPbkSingleContactOperationObserver& aObserver, + MVPbkContactStore& aTargetStore, + CVPbkVCardData& aData + ) : CActive( EPriorityStandard ), - iState ( EImport ), - iTargetStore( aTargetStore ), - iReplaceContact( aReplaceContact ), + iState ( EImport ), + iTargetStore( aTargetStore ), + iReplaceContact( aReplaceContact ), iObserver( aObserver ), iData(aData) { @@ -134,7 +138,16 @@ } if(iVPbkOperation) delete iVPbkOperation; - + if( iSetAttributeOperation ) + { + delete iSetAttributeOperation; + iSetAttributeOperation = NULL; + } + if( iDefaultAttributes ) + { + delete iDefaultAttributes; + iDefaultAttributes = NULL; + } iImportedContacts.ResetAndDestroy(); CActive::Cancel(); @@ -168,56 +181,65 @@ // --------------------------------------------------------------------------- // 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) ); - } - } - } + { + if ( iStatus == KErrNone) + { + switch( iState ) + { + case ERetrieve: + { + RetrieveContactL(); + break; + } + case ELock: + { + LockContactL(); + break; + } + case EUpdateContact: + { + UpdateContactL(); + break; + } + case EReplaceFields: + { + ReplaceFieldL( *(iImportedContacts[0]), *iContact ); + break; + } + case ESetAttributes: + { + SetNextL(); + 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 @@ -225,10 +247,10 @@ // --------------------------------------------------------------------------- // TInt CVPbkImportToContactsMergeOperation::RunError( TInt aError ) - { - HandleError( aError ); - return KErrNone; - } + { + HandleError( aError ); + return KErrNone; + } // --------------------------------------------------------------------------- // CVPbkImportToContactsMergeOperation::DoCancel @@ -236,10 +258,10 @@ // --------------------------------------------------------------------------- // void CVPbkImportToContactsMergeOperation::DoCancel() - { - delete iOperationImpl; - iOperationImpl = NULL; - } + { + delete iOperationImpl; + iOperationImpl = NULL; + } // --------------------------------------------------------------------------- // From class MVPbkImportOperationObserver @@ -359,25 +381,25 @@ // --------------------------------------------------------------------------- // 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) ); - } - } + TContactOpResult aResult) + { + delete aResult.iStoreContact; + switch( iState ) + { + case ELock: + { + NextState( EUpdateContact ); + break; + } + case ECommit: + { + NextState( EReRetrieve ); + break; + } + default: + __ASSERT_DEBUG( EFalse, Panic(EPanicInvalidState) ); + } + } // --------------------------------------------------------------------------- // CVPbkImportToContactsMergeOperation::ContactOperationFailed @@ -385,112 +407,135 @@ // --------------------------------------------------------------------------- // void CVPbkImportToContactsMergeOperation::ContactOperationFailed( - TContactOp /*aOpCode*/, TInt aErrorCode, TBool /*aErrorNotified*/) - { - HandleError( aErrorCode ); - } + TContactOp /*aOpCode*/, TInt aErrorCode, TBool /*aErrorNotified*/) + { + HandleError( aErrorCode ); + } // --------------------------------------------------------------------------- // CVPbkImportToContactsMergeOperation::HandleError // --------------------------------------------------------------------------- // void CVPbkImportToContactsMergeOperation::HandleError(TInt aError) - { - iObserver.VPbkSingleContactOperationFailed( *this, aError ); - } + { + iObserver.VPbkSingleContactOperationFailed( *this, aError ); + } // --------------------------------------------------------------------------- // CVPbkImportToContactsMergeOperation::RetrieveContactL // --------------------------------------------------------------------------- // inline void CVPbkImportToContactsMergeOperation::RetrieveContactL() - { - iVPbkOperation = iData.GetContactManager().RetrieveContactL(iReplaceContact,*this ); - } + { + 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(); - } + { + __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 ); - } + { + __ASSERT_DEBUG( iContact, Panic(EPanicInvalidToLock) ); + iContact->LockL( *this ); + } // --------------------------------------------------------------------------- // CVPbkImportToContactsMergeOperation::CommitContactL // --------------------------------------------------------------------------- // inline void CVPbkImportToContactsMergeOperation::CommitContactL() - { - __ASSERT_DEBUG( iContact, Panic(EPanicInvalidToCommit) ); - - iContact->CommitL( *this ); - } + { + __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 ); - } - } + { + __ASSERT_DEBUG( iContact, Panic(EPanicInvalidToUpdate) ); + __ASSERT_DEBUG( iImportedContacts.Count()>0, Panic(EPanicInvalidToUpdate) ); + __ASSERT_DEBUG( iImportedContacts[0], Panic(EPanicInvalidToUpdate) ); + iContact->RemoveAllFields(); + iCurrentFieldIndex = 0; + iFieldCount = iImportedContacts[0]->Fields().FieldCount(); + + ReplaceFieldL( *(iImportedContacts[0]), *iContact ); + } // --------------------------------------------------------------------------- // 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 ) +void CVPbkImportToContactsMergeOperation::ReplaceFieldL( + const MVPbkStoreContact& aSrc, + MVPbkStoreContact& aTarget ) + { + if( iCurrentFieldIndex < iFieldCount ) { - const MVPbkFieldType* type = - sourceFields.FieldAt(i).BestMatchingFieldType(); + const MVPbkStoreContactFieldCollection& sourceFields = aSrc.Fields(); + const MVPbkFieldType* type = sourceFields.FieldAt(iCurrentFieldIndex).BestMatchingFieldType(); if ( type ) { - CopyFieldL( sourceFields.FieldAt(i), *type, aTarget ); + TRAPD( err, + CopyFieldL( sourceFields.FieldAt(iCurrentFieldIndex), *type, aTarget ); + // Check whether the sorce field has attribute, + // If the sorce field has attribute, set attribute to the target contact's field + TInt type = EVPbkDefaultTypeUndefined + 1; + if( iData.AttributeManagerL().HasFieldAttributeL( CVPbkDefaultAttribute::Uid(), + sourceFields.FieldAt(iCurrentFieldIndex) ) ) + { + GetDefaultAttributsL( sourceFields.FieldAt(iCurrentFieldIndex) ); + if( iDefaultAttributes && iDefaultAttributes->Count() > 0 ) + { + SetNextL(); + } + } + else + { + if( ++iCurrentFieldIndex < iFieldCount ) + { + ReplaceFieldL(aSrc, aTarget); + } + else + { + delete iImportedContacts[0]; + iImportedContacts.Remove(0); + NextState( ECommit ); + } + } + ); + if( err != KErrNone ) + { + delete iImportedContacts[0]; + iImportedContacts.Remove(0); + HandleError( err ); + } } } + else + { + delete iImportedContacts[0]; + iImportedContacts.Remove(0); + NextState( ECommit ); + } } // --------------------------------------------------------------------------- @@ -513,8 +558,80 @@ } newField->FieldData().CopyL(aSourceField.FieldData()); aTargetContact.AddFieldL(newField); - CleanupStack::Pop(); // newField - } + CleanupStack::Pop(); // newField + } + +// -------------------------------------------------------------------------- +// CVPbkImportToContactsMergeOperation::GetDefaultAttributsL +// Gets the attributes from aField. +// -------------------------------------------------------------------------- +// +void CVPbkImportToContactsMergeOperation::GetDefaultAttributsL( const MVPbkStoreContactField& aField ) + { + delete iDefaultAttributes; + iDefaultAttributes = NULL; + iDefaultAttributes = new( ELeave ) CArrayFixFlat( KGranularity ); + TInt type = EVPbkDefaultTypeUndefined + 1; + while( EVPbkLastDefaultType != type ) + { + CVPbkDefaultAttribute* attr = CVPbkDefaultAttribute::NewL( (TVPbkDefaultType)type ); + CleanupStack::PushL( attr ); + + if( iData.AttributeManagerL().HasFieldAttributeL( *attr, aField ) ) + { + iDefaultAttributes->AppendL( (TVPbkDefaultType)type ); + } + + CleanupStack::PopAndDestroy( attr ); + type++; + } + } + +// -------------------------------------------------------------------------- +// CVPbkImportToContactsMergeOperation::NextAttribute +// Gets next attribute from the array. The array is processed backwards. +// -------------------------------------------------------------------------- +// +inline TVPbkDefaultType CVPbkImportToContactsMergeOperation::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; + } + +// -------------------------------------------------------------------------- +// CPbk2DefaultAttributeProcess::SetNextL +// -------------------------------------------------------------------------- +// +void CVPbkImportToContactsMergeOperation::SetNextL() + { + TVPbkDefaultType attributeType = NextAttribute(); + if ( attributeType != EVPbkDefaultTypeUndefined ) + { + delete iSetAttributeOperation; + iSetAttributeOperation = NULL; + CVPbkDefaultAttribute* attr = CVPbkDefaultAttribute::NewL( attributeType ); + CleanupStack::PushL( attr ); + iSetAttributeOperation = iData.AttributeManagerL().SetFieldAttributeL(iContact->Fields().FieldAt(iCurrentFieldIndex), *attr, *this); + CleanupStack::PopAndDestroy( attr ); + } + else + { + // Finished + ++iCurrentFieldIndex; + NextState( EReplaceFields ); + } + } // --------------------------------------------------------------------------- // CVPbkImportToContactsMergeOperation::NextState @@ -528,4 +645,32 @@ SetActive(); } +// -------------------------------------------------------------------------- +// CVPbkImportToContactsMergeOperation::AttributeOperationComplete +// -------------------------------------------------------------------------- +// +void CVPbkImportToContactsMergeOperation::AttributeOperationComplete( MVPbkContactOperationBase& aOperation ) + { + if( &aOperation == iSetAttributeOperation ) + { + NextState( ESetAttributes ); + } + } + +// -------------------------------------------------------------------------- +// CVPbkImportToContactsMergeOperation::AttributeOperationFailed +// -------------------------------------------------------------------------- +// +void CVPbkImportToContactsMergeOperation::AttributeOperationFailed( + MVPbkContactOperationBase& aOperation, + TInt aError ) + { + if( &aOperation == iSetAttributeOperation ) + { + delete iImportedContacts[0]; + iImportedContacts.Remove(0); + HandleError( aError ); + } + } + // End of file