diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/Commands/src/CPbk2SetToneBase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/Commands/src/CPbk2SetToneBase.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,451 @@ +/* +* 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 set ringing tone command base. +* +*/ + + +// INCLUDES +#include "CPbk2SetToneBase.h" + +// Phonebook 2 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// VPbk includes +#include +#include +#include +#include +#include +#include +#include + +// System includes +#include +#include + +/// Unnamed namespace for local definitions +namespace { + +const TInt KFirstElement = 0; + +#ifdef _DEBUG + +enum TPanicCode + { + EPanicPreCond_NULL_Pointer = 1 + }; + +void Panic( TPanicCode aPanic ) + { + _LIT( KPanicCat, "CPbk2SetToneBase" ); + User::Panic( KPanicCat, aPanic ); + } + +#endif // _DEBUG + +} /// namespace + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::CPbk2SetToneBase +// -------------------------------------------------------------------------- +// +EXPORT_C CPbk2SetToneBase::CPbk2SetToneBase( + MPbk2ContactUiControl& aUiControl ): + CActive( CActive::EPriorityIdle ), + iUiControl( &aUiControl ) + { + CActiveScheduler::Add( this ); + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::~CPbk2SetToneBase +// -------------------------------------------------------------------------- +// +EXPORT_C CPbk2SetToneBase::~CPbk2SetToneBase() + { + Cancel(); + if( iUiControl ) + { + iUiControl->RegisterCommand( NULL ); + } + delete iToneFetch; + delete iContactRelocator; + delete iSelectedContacts; + delete iRetrieveOperation; + delete iStoreContact; + } + + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::BaseConstructL +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2SetToneBase::BaseConstructL() + { + CPbk2DriveSpaceCheck* driveSpaceCheck = CPbk2DriveSpaceCheck::NewL( + CCoeEnv::Static()->FsSession() ); + CleanupStack::PushL( driveSpaceCheck ); + // check FFS situation + driveSpaceCheck->DriveSpaceCheckL(); + CleanupStack::PopAndDestroy( driveSpaceCheck ); + iToneFetch = CPbk2RingingToneFetch::NewL(); + iUiControl->RegisterCommand( this ); + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::RunL +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2SetToneBase::RunL() + { + switch( iState ) + { + case EFetchingRingingTone: + { + TBool retval = EFalse; + retval = FetchRingingToneL(); + if ( retval ) + { + // User has selected a ringing tone + iState = ERetrievingContact; + IssueRequest(); + } + else + { + // User has pressed cancel + IssueStopRequest(); + } + break; + } + + case ERetrievingContact: + { + if (iUiControl) + { + iSelectedContacts = + iUiControl->SelectedContactsOrFocusedContactL(); + + if ( iSelectedContacts ) + { + const MVPbkContactLink& link = + iSelectedContacts->At( KFirstElement ); + RetrieveContactL( link ); + } + else + { + ProcessDismissed( KErrNotFound ); + } + } + else + { + // dismiss process + ProcessDismissed( KErrNotFound ); + } + break; + } + + case EStopping: + { + ProcessDismissed( KErrNone ); + break; + } + + default:; + } + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::DoCancel +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2SetToneBase::DoCancel() + { + delete iRetrieveOperation; + iRetrieveOperation = NULL; + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::RunError +// -------------------------------------------------------------------------- +// +EXPORT_C TInt CPbk2SetToneBase::RunError( + TInt aError ) + { + TInt ret = aError; + + if ( aError != KLeaveExit ) + { + ProcessDismissed( aError ); + + // ProcessDismissed handled errors + ret = KErrNone; + } + + return ret; + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::ExecuteLD +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2SetToneBase::ExecuteLD() + { + // Start the command process + IssueRequest(); + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::ResetUiControl +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2SetToneBase::ResetUiControl( + MPbk2ContactUiControl& aUiControl) + { + if (iUiControl == & aUiControl) + { + iUiControl = NULL; + } + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::AddObserver +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2SetToneBase::AddObserver( + MPbk2CommandObserver& aObserver ) + { + iCommandObserver = &aObserver; + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::ProcessDismissed +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2SetToneBase::ProcessDismissed( + TInt aCancelCode ) + { + __ASSERT_DEBUG( iCommandObserver, Panic(EPanicPreCond_NULL_Pointer)); + + if ( aCancelCode != KErrCancel && iUiControl) + { + // Don't remove list markings if user canceled + iUiControl->SetBlank( EFalse ); + iUiControl->UpdateAfterCommandExecution(); + } + + // Notify command owner that the command has finished + iCommandObserver->CommandFinished( *this ); + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::RetrieveContactL +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2SetToneBase::RetrieveContactL + ( const MVPbkContactLink& aLink ) + { + delete iRetrieveOperation; + iRetrieveOperation = NULL; + + iRetrieveOperation = + Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager(). + RetrieveContactL( aLink, *this ); + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::RelocateContactL +// -------------------------------------------------------------------------- +// +EXPORT_C TBool CPbk2SetToneBase::RelocateContactL + ( MVPbkStoreContact* aContact ) + { + TBool ret = EFalse; + + delete iContactRelocator; + iContactRelocator = NULL; + iContactRelocator = CPbk2ContactRelocator::NewL(); + + if ( !iContactRelocator->IsPhoneMemoryContact( *aContact ) && + iContactRelocator->IsPhoneMemoryInConfigurationL() ) + { + // Asynchronously relocate contact + iContactRelocator->RelocateContactL( aContact, *this, + Pbk2ContactRelocator::EPbk2DisplayStoreDoesNotSupportQuery, + CPbk2ContactRelocator::EPbk2RelocatorExistingContact ); + // relocator has taken the ownership + aContact = NULL; + ret = ETrue; // Indicate that contact needs relocating + } + + return ret; + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::SetToneAndCommitL +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2SetToneBase::SetToneAndCommitL + ( MVPbkStoreContact* aContact ) + { + MVPbkStoreContactField* field = NULL; + // First check if the field is available already + TInt fieldIndex = KErrNotFound; + TPbk2StoreContactAnalyzer analyzer( + Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager(), + aContact ); + fieldIndex = analyzer.HasFieldL( R_PHONEBOOK2_RINGTONE_SELECTOR ); + + if ( fieldIndex != KErrNotFound) + { + // Check if the iToneFilename is set + if (iToneFilename.Length() <= 0) + { + // If filename is not set and the contact has the field + // field can be removed. + aContact->RemoveField( fieldIndex ); + } + else + { + // If filename has been set and the contact has the field + // field should be updated. + field = &aContact->Fields().FieldAt( fieldIndex ); + MVPbkContactFieldTextData::Cast( field->FieldData() ). + SetTextL( iToneFilename ); + } + } + else + { + // Contact does not have the field, so create new one. + if ( iToneFilename.Length() > 0 ) + { + if ( !iFieldType ) + { + ReadFieldTypeL(); + } + // iToneFilename is set + field = aContact->CreateFieldLC( *iFieldType ); + MVPbkContactFieldTextData::Cast( field->FieldData() ). + SetTextL( iToneFilename ); + aContact->AddFieldL( field ); + CleanupStack::Pop(); // field + } + } + + aContact->CommitL( *this ); + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::IssueRequest +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2SetToneBase::IssueRequest() + { + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + SetActive(); + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::IssueStopRequest +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2SetToneBase::IssueStopRequest() + { + iState = EStopping; + if (!IsActive()) + { + IssueRequest(); + } + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::FetchRingingToneL +// -------------------------------------------------------------------------- +// +TBool CPbk2SetToneBase::FetchRingingToneL() + { + TBool retval = EFalse; + RetrieveExistingRingingToneFilenameL( iToneFilename ); + if ( iToneFetch->FetchRingingToneL( iToneFilename ) ) + { + retval = ETrue; + } + return retval; + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::RetrieveExistingRingingToneFilenameL +// -------------------------------------------------------------------------- +// +void CPbk2SetToneBase::RetrieveExistingRingingToneFilenameL( + TFileName& aFilename ) + { + if (iUiControl) + { + const MVPbkStoreContact* contact = iUiControl->FocusedStoreContact(); + if ( contact ) + { + TInt fieldCount = contact->Fields().FieldCount(); + for ( TInt i = 0; i < fieldCount; ++i ) + { + const MVPbkStoreContactField& field = + contact->Fields().FieldAt( i ); + const MVPbkFieldType* fieldType = field.BestMatchingFieldType(); + if ( fieldType && ( fieldType->FieldTypeResId() + == R_VPBK_FIELD_TYPE_RINGTONE ) ) + { + aFilename.Copy + ( MVPbkContactFieldTextData::Cast( field.FieldData() ). + Text() ); + break; + } + } + } + } + } + +// -------------------------------------------------------------------------- +// CPbk2SetToneBase::ReadFieldType +// -------------------------------------------------------------------------- +// +void CPbk2SetToneBase::ReadFieldTypeL() + { + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, R_RTONE_FIELD_TYPE ); + const TInt count = reader.ReadInt16(); + + TVPbkFieldTypeMapping mapping(reader); + iFieldType = mapping.FindMatch + (Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager(). + FieldTypes()); + if (!iFieldType) + { + User::Leave(KErrNotFound); + } + CleanupStack::PopAndDestroy(); // CreateResourceReaderLC + } + +// End of File