phonebookui/Phonebook2/Commands/src/CPbk2SetToneCmd.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /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 <MPbk2CommandObserver.h>
+#include <CVPbkContactManager.h>
+#include <MPbk2ContactUiControl.h>
+#include <TVPbkFieldTypeMapping.h>
+#include <MVPbkContactLinkArray.h>
+#include <MVPbkContactFieldTextData.h>
+#include <MVPbkStoreContactField.h>
+#include <MVPbkStoreContact.h>
+#include <CPbk2ContactRelocator.h>
+#include <TPbk2StoreContactAnalyzer.h>
+#include <MVPbkContactOperationBase.h>
+#include <CPbk2PresentationContact.h>
+#include <CPbk2FieldPropertyArray.h>
+#include <CPbk2PresentationContactFieldCollection.h>
+#include <CPbk2FieldFocusHelper.h>
+#include <MPbk2ApplicationServices.h>
+#include <MPbk2AppUi.h>
+#include "CPbk2RingingToneFetch.h"
+
+#include <Pbk2UIControls.rsg>
+#include <coemain.h>
+
+#include <Pbk2Debug.h>
+
+// ============================ 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