diff -r 5b6f26637ad3 -r f4a778e096c2 phonebookui/Phonebook2/ServerApplication/src/CPbk2SingleAssignDataPhase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2SingleAssignDataPhase.cpp Wed Sep 01 12:29:52 2010 +0100 @@ -0,0 +1,565 @@ +/* +* 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 server app contact data assign phase. +* +*/ + + +#include "CPbk2SingleAssignDataPhase.h" + +// Phonebook 2 +#include "MPbk2ServicePhaseObserver.h" +#include "CPbk2ServerAppAppUi.h" +#include "MPbk2ContactAssigner.h" +#include "Pbk2ContactAssignerFactory.h" +#include "CPbk2ContactEditorOperator.h" +#include "MPbk2SelectFieldProperty.h" +#include "TPbk2AssignNoteService.h" +#include "Pbk2ServerApp.hrh" +#include +#include +#include +#include +#include +#include + +// Virtual Phonebook +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// System includes +#include + +using namespace AiwContactAssign; + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::CPbk2SingleAssignDataPhase +// -------------------------------------------------------------------------- +// +CPbk2SingleAssignDataPhase::CPbk2SingleAssignDataPhase + ( MPbk2ServicePhaseObserver& aObserver, + MVPbkStoreContact* aStoreContact, + MPbk2SelectFieldProperty* aSelectedFieldProperty, + TInt aSelectedFieldIndex, HBufC* aDataBuffer, TInt aMimeType, + TCoeHelpContext aHelpContext, + TUint aAssignFlags, TUint aNoteFlags ) : + iObserver( aObserver ), + iStoreContact( aStoreContact ), + iSelectedFieldIndex( aSelectedFieldIndex ), + iSelectedFieldProperty( aSelectedFieldProperty ), + iDataBuffer( aDataBuffer ), + iMimeType( aMimeType ), + iHelpContext( aHelpContext ), + iAssignFlags( aAssignFlags ), + iNoteFlags( aNoteFlags ), + iEikEnv( CEikonEnv::Static() ) + { + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::~CPbk2SingleAssignDataPhase +// -------------------------------------------------------------------------- +// +CPbk2SingleAssignDataPhase::~CPbk2SingleAssignDataPhase() + { + if ( iContactEditorEliminator ) + { + iContactEditorEliminator->ForceExit(); + } + delete iResults; + delete iContactDataAssigner; + delete iStoreContact; + + if ( iDestroyedPtr ) + { + *iDestroyedPtr = ETrue; + } + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::NewL +// -------------------------------------------------------------------------- +// +CPbk2SingleAssignDataPhase* CPbk2SingleAssignDataPhase::NewL + ( MPbk2ServicePhaseObserver& aObserver, + MVPbkStoreContact* aStoreContact, + MPbk2SelectFieldProperty* aSelectedFieldProperty, + TInt aSelectedFieldIndex, HBufC* aDataBuffer, TInt aMimeType, + TCoeHelpContext aHelpContext, + TUint aAssignFlags, TUint aNoteFlags ) + { + CPbk2SingleAssignDataPhase* self = + new ( ELeave ) CPbk2SingleAssignDataPhase + ( aObserver, aStoreContact, aSelectedFieldProperty, + aSelectedFieldIndex, aDataBuffer, aMimeType, aHelpContext, + aAssignFlags, aNoteFlags ); + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::LaunchServicePhaseL +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::LaunchServicePhaseL() + { + DoAssignDataL(); + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::CancelServicePhase +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::CancelServicePhase() + { + if ( iContactEditorEliminator ) + { + // Changes won't be saved here. + iContactEditorEliminator->ForceExit(); + } + // Notify observer to complete its message. + iObserver.PhaseCanceled( *this ); + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::RequestCancelL +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::RequestCancelL( TInt aExitCommandId ) + { + if ( iContactEditorEliminator ) + { + // Do not notify observer about abortion here, we must let + // contact editor to do it. Otherwise the changes would not be saved. + iContactEditorEliminator->RequestExitL( aExitCommandId ); + } + else + { + if ( aExitCommandId == EEikBidCancel ) + { + iObserver.PhaseAborted( *this ); + } + else + { + iObserver.PhaseCanceled( *this ); + } + } + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::AcceptDelayed +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::AcceptDelayedL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Nothing to do + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::DenyDelayed +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::DenyDelayedL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Nothing to do + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::Results +// -------------------------------------------------------------------------- +// +MVPbkContactLinkArray* CPbk2SingleAssignDataPhase::Results() const + { + return iResults; + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::ExtraResultData +// -------------------------------------------------------------------------- +// +TInt CPbk2SingleAssignDataPhase::ExtraResultData() const + { + return iSelectedFieldIndex; + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::TakeStoreContact +// -------------------------------------------------------------------------- +// +MVPbkStoreContact* CPbk2SingleAssignDataPhase::TakeStoreContact() + { + MVPbkStoreContact* contact = iStoreContact; + iStoreContact = NULL; + return contact; + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::FieldContent +// -------------------------------------------------------------------------- +// +HBufC* CPbk2SingleAssignDataPhase::FieldContent() const + { + return NULL; + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::AssignComplete +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::AssignComplete + ( MPbk2ContactAssigner& /*aAssigner*/, TInt aIndex ) + { + // aIndex is KErrNotSupported from CPbk2ContactEmptyDataAssigner + // but iSelectedFieldIndex may still be set previously. + if (aIndex == KErrNotSupported) + { + aIndex = iSelectedFieldIndex; + } + + TRAPD( err, HandleContactDataAssignedL( aIndex ) ); + if ( err != KErrNone ) + { + // HandleContactDataAssignedL will leave with KErrDied if + // this was destroyed, then we will not inform observer + // since iObserver is no more. Syslib's CBaActiveScheduler leaves + // with KLeaveExit (in certain situations, e.g. pressing End key + // with delete-dialog open when assigning empty contact. + if ( err != KErrDied && err != KLeaveExit ) + { + iObserver.PhaseError( *this, err ); + } + } + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::AssignFailed +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::AssignFailed + ( MPbk2ContactAssigner& /*aAssigner*/, TInt aErrorCode ) + { + iObserver.PhaseError( *this, aErrorCode ); + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::ContactOperationCompleted +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::ContactOperationCompleted + ( TContactOpResult aResult ) + { + TInt err = KErrNone; + + if ( aResult.iOpCode == EContactLock ) + { + TRAP( err, DoAssignDataL() ); + } + else if ( aResult.iOpCode == EContactCommit ) + { + TRAP( err, FinalizeL( iStoreContact ) ); + } + + if ( err != KErrNone ) + { + iObserver.PhaseError( *this, err ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::ContactOperationFailed +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::ContactOperationFailed + ( TContactOp /*aOpCode*/, TInt aErrorCode, TBool /*aErrorNotified*/ ) + { + // Locking or committing the contact failed + iObserver.PhaseError( *this, aErrorCode ); + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::ContactEditingComplete +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::ContactEditingComplete + ( MVPbkStoreContact* aEditedContact ) + { + delete iStoreContact; + iStoreContact = aEditedContact; + + TRAPD( err, FinalizeL( iStoreContact ) ); + + if ( err != KErrNone ) + { + iObserver.PhaseError( *this, err ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::ContactEditingDeletedContact +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::ContactEditingDeletedContact + ( MVPbkStoreContact* aEditedContact ) + { + delete iStoreContact; + iStoreContact = aEditedContact; + + // Reset note flags + iNoteFlags |= KPbk2NoteFlagContactDeleted; + + // Finalize, but with no results to append + TRAPD( err, FinalizeL( NULL ) ); + + if ( err != KErrNone ) + { + iObserver.PhaseError( *this, err ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::ContactEditingAborted +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::ContactEditingAborted() + { + iObserver.PhaseAborted( *this ); + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::OkToExitL +// -------------------------------------------------------------------------- +// +TBool CPbk2SingleAssignDataPhase::OkToExitL( TInt aCommandId ) + { + return iObserver.PhaseOkToExit( *this, aCommandId ); + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::DoAssignDataL +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::DoAssignDataL() + { + const MVPbkFieldType* fieldType = NULL; + MVPbkStoreContactField* field = NULL; + if ( iSelectedFieldProperty ) + { + fieldType = iSelectedFieldProperty->SelectedFieldType(); + if ( iSelectedFieldIndex >= KErrNone ) + { + field = &iStoreContact->Fields().FieldAt( iSelectedFieldIndex ); + } + } + + CPbk2ServerAppAppUi& appUi = static_cast + ( *iEikEnv->EikAppUi() ); + + delete iContactDataAssigner; + iContactDataAssigner = NULL; + iContactDataAssigner = + Pbk2ContactAssignerFactory::CreateContactDataAssignerL + ( *this, iMimeType, fieldType, + appUi.ApplicationServices().ContactManager(), + appUi.ApplicationServices().FieldProperties() ); + + iContactDataAssigner->AssignDataL + ( *iStoreContact, field, fieldType, iDataBuffer ); + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::HandleContactDataAssignedL +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::HandleContactDataAssignedL( TInt aIndex ) + { + TInt index = aIndex; + + // If desired, open editor + if ( !( iAssignFlags & EDoNotOpenEditor ) ) + { + if ( iAssignFlags & ECreateNewContact ) + { + // If we created a new contact, set focus to first field + index = KErrNotFound; + } + + TBool thisDestroyed = EFalse; + iDestroyedPtr = &thisDestroyed; + TPbk2DestructionIndicator indicator + ( &thisDestroyed, iDestroyedPtr ); + + CPbk2ContactEditorOperator* editorOperator = + CPbk2ContactEditorOperator::NewLC( *this, *this ); + iContactEditorEliminator = editorOperator; + iContactEditorEliminator->ResetWhenDestroyed + ( &iContactEditorEliminator ); + + editorOperator->OpenEditorL( + iStoreContact, index, iAssignFlags, iHelpContext ); + + // index is updated when editor is closed. + iSelectedFieldIndex = index; + + CleanupStack::PopAndDestroy(); // operator + + if ( thisDestroyed ) + { + // The calling code excepts us to leave with KErrDied if + // this was destroyed + User::Leave( KErrDied ); + } + } + else + { + iStoreContact->CommitL( *this ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::AppendResultL +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::AppendResultL + ( const MVPbkStoreContact* aStoreContact ) + { + if ( aStoreContact ) + { + // Add the contact link to the result array + MVPbkContactLink* link = aStoreContact->CreateLinkLC(); + if ( link ) + { + if ( !iResults ) + { + iResults = CVPbkContactLinkArray::NewL(); + } + + CleanupStack::Pop(); // aStoreContact->CreateLinkLC() + + iResults->AppendL( link ); + } + } + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::DisplayNotesL +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::DisplayNotesL() + { + TPbk2AssignNoteService noteService; + + CPbk2ServerAppAppUi& appUi = static_cast + ( *iEikEnv->EikAppUi() ); + + if ( !(iNoteFlags & KPbk2NoteFlagContactDeleted) + &&!(iAssignFlags & EskipInfoNotes) ) + { + // Show note if new contact was created + if ( iNoteFlags & KPbk2NoteFlagOneContactCreated ) + { + if ( IsContactInSelectedMemoryL( *iStoreContact ) ) + { + noteService.ShowInformationNoteL + ( R_QTN_PHOB_NOTE_CONTACT_CREATED ); + } + else + { + TVPbkContactStoreUriPtr contactUri = + iStoreContact->ParentStore().StoreProperties().Uri(); + + CPbk2StorePropertyArray& array = + appUi.ApplicationServices().StoreProperties(); + noteService.ShowInformationNoteL + ( R_QTN_PHOB_NOTE_CONTACT_HIDDEN, contactUri, array ); + } + } + // Show note if existing contact was updated + else + { + if ( iNoteFlags & KPbk2NoteFlagOneContactRelocated ) + { + CPbk2StorePropertyArray& array = + appUi.ApplicationServices().StoreProperties(); + TVPbkContactStoreUriPtr store + ( VPbkContactStoreUris::DefaultCntDbUri() ); + + noteService.ShowInformationNoteL + ( R_QTN_PHOB_NOTE_CONTACT_HIDDEN, store, array ); + } + else + { + noteService.ShowInformationNoteL + ( R_QTN_PHOB_NOTE_CONTACT_UPDATED ); + } + } + } + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::IsContactInSelectedMemoryL +// -------------------------------------------------------------------------- +// +TBool CPbk2SingleAssignDataPhase::IsContactInSelectedMemoryL + ( MVPbkStoreContact& aContact ) + { + TBool result( EFalse ); + + TVPbkContactStoreUriPtr contactUri = + aContact.ParentStore().StoreProperties().Uri(); + + CPbk2ServerAppAppUi& appUi = static_cast + ( *iEikEnv->EikAppUi() ); + + CVPbkContactStoreUriArray* currentConfig = + appUi.ApplicationServices().StoreConfiguration(). + CurrentConfigurationL(); + CleanupStack::PushL( currentConfig ); + + if ( currentConfig->IsIncluded( contactUri ) ) + { + result = ETrue; + } + + CleanupStack::PopAndDestroy( currentConfig ); + return result; + } + +// -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::FinalizeL +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::FinalizeL + ( const MVPbkStoreContact* aStoreContact ) + { + TBool thisDestroyed = EFalse; + iDestroyedPtr = &thisDestroyed; + + AppendResultL( aStoreContact ); + DisplayNotesL(); + + if ( !thisDestroyed ) + { + iObserver.NextPhase( *this ); + } + } + +// End of File