phonebookui/Phonebook2/Commands/src/CPbk2SetToneBase.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /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 <CPbk2RingingToneFetch.h>
+#include <CPbk2ContactRelocator.h>
+#include <MPbk2ContactUiControl.h>
+#include <MPbk2CommandObserver.h>
+#include <Pbk2ProcessDecoratorFactory.h>
+#include <TPbk2StoreContactAnalyzer.h>
+#include <MVPbkContactFieldTextData.h>
+#include <Pbk2Commands.rsg>
+#include <Pbk2UIControls.rsg>
+#include <CPbk2DriveSpaceCheck.h>
+#include <CPbk2AppUiBase.h>
+#include <MPbk2ApplicationServices.h>
+
+// VPbk includes
+#include <CVPbkContactLinkArray.h>
+#include <MVPbkContactOperationBase.h>
+#include <MVPbkStoreContact.h>
+#include <CVPbkContactManager.h>
+#include <TVPbkFieldTypeMapping.h>
+#include <MVPbkFieldType.h>
+#include <VPbkEng.rsg>
+
+// System includes
+#include <barsread.h>
+#include <coemain.h>
+
+/// 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