diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/Commands/src/CPbk2SetToneCmd.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/Commands/src/CPbk2SetToneCmd.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,307 @@ +/* +* 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: A command for setting ringing tone. +* +*/ + + +// INCLUDE FILES +#include "CPbk2SetToneCmd.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "CPbk2RingingToneFetch.h" + +#include +#include + +#include + +// ============================ LOCAL FUNCTIONS ============================= + +namespace + { + #ifdef _DEBUG + enum TPanicCode + { + EPanicLogic_ReadFieldTypeL, + EPanicLogic_ContactCommitCompelete, + EPanicPreCond_RelocationProcessCompleteL + }; + + void Panic(TInt aReason) + { + _LIT(KPanicText, "CPbk2SetToneCmd"); + User::Panic(KPanicText, aReason); + } + #endif // _DEBUG + } + +// ============================ MEMBER FUNCTIONS ============================ + +// -------------------------------------------------------------------------- +// CPbk2SetToneCmd::CPbk2SetToneCmd +// C++ default constructor can NOT contain any code, that +// might leave. +// -------------------------------------------------------------------------- +// +CPbk2SetToneCmd::CPbk2SetToneCmd( + MPbk2ContactUiControl& aUiControl ) : + CPbk2SetToneBase( aUiControl ) + { + // Do nothing + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneCmd::~CPbk2SetToneCmd +// -------------------------------------------------------------------------- +// +CPbk2SetToneCmd::~CPbk2SetToneCmd() + { + delete iFieldFocusHelper; + iFieldFocusHelper = NULL; + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneCmd::NewL +// Two-phased constructor. +// -------------------------------------------------------------------------- +// +CPbk2SetToneCmd* CPbk2SetToneCmd::NewL( + MPbk2ContactUiControl& aUiControl) + { + CPbk2SetToneCmd* self = + new( ELeave ) CPbk2SetToneCmd( aUiControl ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneCmd::ConstructL +// Symbian 2nd phase constructor can leave. +// -------------------------------------------------------------------------- +// +void CPbk2SetToneCmd::ConstructL() + { + BaseConstructL(); + iFieldFocusHelper = CPbk2FieldFocusHelper::NewL( + *iUiControl, + Phonebook2::Pbk2AppUi()->ApplicationServices().FieldProperties() ); + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneCmd::ContactRelocatedL +// -------------------------------------------------------------------------- +// +void CPbk2SetToneCmd::ContactRelocatedL( + MVPbkStoreContact* aRelocatedContact) + { + // Takes ownership of the aRelocatedContact + delete iStoreContact; + iStoreContact = aRelocatedContact; + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneCmd::ContactRelocationFailed +// -------------------------------------------------------------------------- +// +void CPbk2SetToneCmd::ContactRelocationFailed( + TInt aReason, MVPbkStoreContact* aContact) + { + // We got the ownership of aContact + delete aContact; + if ( aReason == KErrCancel ) + { + // No error note is to be shown to the user when she + // manually cancels the relocation process, therefore + // the error code must be converted + aReason = KErrNone; + } + ProcessDismissed( aReason ); + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneCmd::ContactRelocationFailed +// -------------------------------------------------------------------------- +// +void CPbk2SetToneCmd::ContactsRelocationFailed( + TInt /*aReason*/, CVPbkContactLinkArray* /*aContacts*/ ) + { + // Do nothing + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneCmd::RelocationProcessComplete +// -------------------------------------------------------------------------- +// +void CPbk2SetToneCmd::RelocationProcessComplete() + { + __ASSERT_DEBUG( iStoreContact, + Panic( EPanicPreCond_RelocationProcessCompleteL ) ); + // Lock contact for setting tone + TRAPD( res, iStoreContact->LockL( *this ) ); + if ( res != KErrNone ) + { + ProcessDismissed( res ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneCmd::RelocationProcessCompleteL +// -------------------------------------------------------------------------- +// +void CPbk2SetToneCmd::VPbkSingleContactOperationComplete( + MVPbkContactOperationBase& /*aOperation*/, + MVPbkStoreContact* aContact) + { + delete iRetrieveOperation; + iRetrieveOperation = NULL; + + delete iStoreContact; + iStoreContact = aContact; + + if ( !ContactHasRingToneField( iStoreContact ) && iToneFilename.Length() <=0 ) + { + // User has selected 'no personal ringtone' for contact which + // does not have ring tone field, so we can quit now + ProcessDismissed( KErrNone ); + } + else + { + TBool contactNeedsRelocation = EFalse; + TInt err = KErrNone; + TRAP( err, contactNeedsRelocation = + RelocateContactL( iStoreContact ) ); + + if (err != KErrNone) + { + ProcessDismissed( err ); + } + + if ( !contactNeedsRelocation ) + { + TRAP( err, iStoreContact->LockL( *this ) ); + if ( err != KErrNone ) + { + ProcessDismissed( err ); + } + } + else + { + // Relocator has taken the ownership of the contact + iStoreContact = NULL; + } + } + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneCmd::RelocationProcessCompleteL +// -------------------------------------------------------------------------- +// +void CPbk2SetToneCmd::VPbkSingleContactOperationFailed( + MVPbkContactOperationBase& /*aOperation*/, + TInt aError ) + { + ProcessDismissed( aError ); + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneCmd::RelocationProcessCompleteL +// -------------------------------------------------------------------------- +// +void CPbk2SetToneCmd::ContactOperationCompleted( + TContactOpResult aResult) + { + if ( aResult.iOpCode == EContactLock ) + { + // We have to save the initially focused field, so that we can put + // it back focused after setting and committing ringingtone. + // If leaves the focus will not be set. + TRAP_IGNORE( iFieldFocusHelper->SaveInitiallyFocusedFieldL + ( *iStoreContact ) ); + TRAPD( err, SetToneAndCommitL( iStoreContact ) ); + if ( err != KErrNone ) + { + CCoeEnv::Static()->HandleError( err ); + ProcessDismissed( err ); + } + } + else if ( aResult.iOpCode == EContactCommit ) + { + // Set the original field focused after command execution + TRAP_IGNORE( iFieldFocusHelper->RestoreSavedFieldL() ); + // Now, its time to exit the command + IssueStopRequest(); + } + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneCmd::RelocationProcessCompleteL +// -------------------------------------------------------------------------- +// +void CPbk2SetToneCmd::ContactOperationFailed( + TContactOp /*aOpCode*/, + TInt aErrorCode, + TBool /*aErrorNotified*/) + { + if ( aErrorCode != KErrNone ) + { + CCoeEnv::Static()->HandleError( aErrorCode ); + } + + ProcessDismissed( aErrorCode ); + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneCmd::ContactHasRingToneField +// -------------------------------------------------------------------------- +// +inline TBool CPbk2SetToneCmd::ContactHasRingToneField( + MVPbkStoreContact* aContact ) + { + TBool ret( ETrue ); + + TPbk2StoreContactAnalyzer analyzer + ( Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager(), + aContact ); + TInt fieldIndex( KErrNotFound ); + // No harm done if field finding leaves + // it just might produce unnecessary relocation note but nothing more + TRAP_IGNORE( fieldIndex = analyzer.HasFieldL( R_PHONEBOOK2_RINGTONE_SELECTOR ) ); + if ( fieldIndex == KErrNotFound ) + { + ret = EFalse; + } + + return ret; + } + +// End of File