phonebookui/Phonebook2/GroupExtension/src/CPguSetToneCmd.cpp
changeset 0 e686773b3f54
child 68 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/GroupExtension/src/CPguSetToneCmd.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,368 @@
+/*
+* Copyright (c) 2002-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 "CPguSetToneCmd.h"
+
+// Phonebook 2
+#include <CPbk2ContactRelocator.h>
+#include <MPbk2ContactUiControl.h>
+#include <Pbk2GroupUIRes.rsg>
+#include <Pbk2CommonUi.rsg>
+
+// Virtual Phonebook
+#include <CVPbkContactManager.h>
+#include <MVPbkStoreContact.h>
+#include <MVPbkContactOperationBase.h>
+#include <CVPbkContactLinkArray.h>
+#include <MVPbkContactGroup.h>
+#include <MVPbkContactLink.h>
+
+// System includes
+#include <barsread.h>
+#include <barsc.h>
+#include <coemain.h>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+
+// Debugging headers
+#include <Pbk2Debug.h>
+
+// ============================ LOCAL FUNCTIONS =============================
+
+namespace 
+    {
+    const TInt KFirstElement( 0 );
+    
+    #ifdef _DEBUG
+    	enum TPanicCode
+    	    {
+    	    EPanicLogic_ReadFieldTypeL,
+    	    EPanicLogic_ContactCommitCompelete,
+    	    EPanicPreCond_RelocationProcessCompleteL
+    	    };
+
+    	void Panic(TInt aReason)
+    	    {
+    	    _LIT(KPanicText, "CPguSetToneCmd");
+    	    User::Panic(KPanicText, aReason);
+    	    }
+    #endif // _DEBUG	    
+    }
+
+// ============================ MEMBER FUNCTIONS ============================
+
+// --------------------------------------------------------------------------
+// CPguSetToneCmd::CPguSetToneCmd
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// --------------------------------------------------------------------------
+//
+CPguSetToneCmd::CPguSetToneCmd(
+        MPbk2ContactUiControl& aUiControl ) :  
+    CPbk2SetToneBase( aUiControl ),
+    iIsStarted( EFalse )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPguSetToneCmd::~CPguSetToneCmd
+// --------------------------------------------------------------------------
+//
+CPguSetToneCmd::~CPguSetToneCmd()
+    {
+    if ( iContacts )
+        {
+        iContacts->ResetAndDestroy();
+        }
+    delete iContacts;
+    delete iCurrentContact;
+    }
+
+// --------------------------------------------------------------------------
+// CPguSetToneCmd::NewL
+// Two-phased constructor.
+// --------------------------------------------------------------------------
+//
+CPguSetToneCmd* CPguSetToneCmd::NewL(
+    MPbk2ContactUiControl& aUiControl)
+    {
+    CPguSetToneCmd* self = 
+        new( ELeave ) CPguSetToneCmd( aUiControl );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPguSetToneCmd::ConstructL
+// Symbian 2nd phase constructor can leave.
+// --------------------------------------------------------------------------
+//
+void CPguSetToneCmd::ConstructL()
+    {    
+    BaseConstructL();
+    }
+	
+// --------------------------------------------------------------------------
+// CPguSetToneCmd::ContactRelocatedL
+// --------------------------------------------------------------------------
+//
+void CPguSetToneCmd::ContactRelocatedL
+    ( MVPbkStoreContact* aRelocatedContact )
+    {
+    // Takes ownership of the aRelocatedContact
+    delete iCurrentContact;
+    iCurrentContact = aRelocatedContact;
+    }
+
+// --------------------------------------------------------------------------
+// CPguSetToneCmd::ContactRelocationFailed
+// --------------------------------------------------------------------------
+//
+void CPguSetToneCmd::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 );
+    }
+
+// --------------------------------------------------------------------------
+// CPguSetToneCmd::ContactRelocationFailed
+// --------------------------------------------------------------------------
+//
+void CPguSetToneCmd::ContactsRelocationFailed
+        ( TInt /*aReason*/, CVPbkContactLinkArray* /*aContacts*/ )
+    {
+    // Do nothing
+    }
+
+// --------------------------------------------------------------------------
+// CPguSetToneCmd::RelocationProcessComplete
+// --------------------------------------------------------------------------
+//
+void CPguSetToneCmd::RelocationProcessComplete()
+    {
+    __ASSERT_DEBUG( iCurrentContact, 
+        Panic( EPanicPreCond_RelocationProcessCompleteL ) );
+    // Lock contact for setting ringingtone
+    TRAPD( res, iCurrentContact->LockL( *this ) );
+    if ( res != KErrNone )
+        {
+        ProcessDismissed( res );
+        }
+    }
+	
+// --------------------------------------------------------------------------
+// CPguSetToneCmd::RelocationProcessCompleteL
+// --------------------------------------------------------------------------
+//
+void CPguSetToneCmd::VPbkSingleContactOperationComplete(
+        MVPbkContactOperationBase& /*aOperation*/,
+        MVPbkStoreContact* aContact)
+    {
+    delete iRetrieveOperation;
+    iRetrieveOperation = NULL;
+
+    if ( !iStoreContact )
+        {
+        // This is the main (group) contact
+       	iStoreContact = aContact;        
+       	iGroup = iStoreContact->Group(); 
+       	// If leaves the iContacts will be not created
+       	TRAP_IGNORE(
+       	    {
+           	CreateLinkArrayL( iGroup->ItemsContainedLC() );       	    
+           	CleanupStack::PopAndDestroy(); // group items
+       	    });
+       	
+       	if ( iContacts && iContacts->Count() > 0 )
+       	    {
+            TRAPD( err, RetrieveContactL( iContacts->At( KFirstElement ) ) );
+            if ( err )
+                {
+                ProcessDismissed( err );
+                }
+       	    }
+       	else
+       	    {
+       	    // There is no contacts linked to group.
+       	    // Stop the process
+            // Show note
+            // If leave occurs the note just go on and exit the command
+            TRAP_IGNORE( ConfirmationL() );
+            // Now, its time to exit the command
+            IssueStopRequest();                   	    
+       	    }
+        }
+    else
+        {
+        // Here we are retrieved a contact from group
+        delete iCurrentContact;
+        iCurrentContact = NULL;
+        
+        iCurrentContact = aContact;
+        
+        TInt err = KErrNone;
+        if ( !iIsStarted )
+            {
+            iIsStarted = ETrue;
+            }
+            
+        TBool contactNeedsRelocation = EFalse;
+        TRAP( err, contactNeedsRelocation = RelocateContactL( iCurrentContact ) );
+        if (err != KErrNone)
+            {
+            ProcessDismissed( err );
+            }
+
+        if ( !contactNeedsRelocation )
+            {
+            TRAP( err, iCurrentContact->LockL( *this ) );
+            if ( err != KErrNone )
+                {
+                ProcessDismissed( err );
+                }
+            }
+        else
+            {
+            // Relocator has taken the ownership of the contact
+            iCurrentContact = NULL;
+            }   	                
+        }   	
+    }
+
+// --------------------------------------------------------------------------
+// CPguSetToneCmd::RelocationProcessCompleteL
+// --------------------------------------------------------------------------
+//
+void CPguSetToneCmd::VPbkSingleContactOperationFailed(
+        MVPbkContactOperationBase& /*aOperation*/, 
+        TInt aError )
+    {
+    ProcessDismissed( aError );
+    }
+      
+// --------------------------------------------------------------------------
+// CPguSetToneCmd::RelocationProcessCompleteL
+// --------------------------------------------------------------------------
+//
+void CPguSetToneCmd::ContactOperationCompleted( TContactOpResult aResult )
+    {
+    if ( aResult.iOpCode == EContactLock )
+        {
+        TRAPD( err, SetToneAndCommitL( iCurrentContact ) );        
+        if ( err != KErrNone )
+            {
+            ProcessDismissed( err );
+            }
+        }
+    else if ( aResult.iOpCode == EContactCommit )
+        {
+        // Remove first item 'cause it has already been gone through
+        iContacts->Delete( KFirstElement );
+        if ( iContacts->Count() > 0 )
+            {
+            TRAPD( err, RetrieveContactL( iContacts->At( KFirstElement ) ) );
+            if ( err )
+                {
+                ProcessDismissed( err );
+                }
+            }
+        else
+            {
+            // Show note
+            TRAP_IGNORE( ConfirmationL() );
+            // Now, its time to exit the command
+            IssueStopRequest();            
+            }
+        }    
+    }
+
+// --------------------------------------------------------------------------
+// CPguSetToneCmd::RelocationProcessCompleteL
+// --------------------------------------------------------------------------
+//
+void CPguSetToneCmd::ContactOperationFailed
+    (TContactOp /*aOpCode*/, TInt aErrorCode, TBool /*aErrorNotified*/)
+    {
+    ProcessDismissed( aErrorCode );
+    }
+
+// --------------------------------------------------------------------------
+// CPguSetToneCmd::CreateLinkArrayL
+// --------------------------------------------------------------------------
+//
+void CPguSetToneCmd::CreateLinkArrayL( MVPbkContactLinkArray* aArray )
+    {
+    if ( iContacts )
+        {
+        iContacts->ResetAndDestroy();
+        delete iContacts;
+        iContacts = NULL;
+        }
+    
+    iContacts = CVPbkContactLinkArray::NewL();
+    TInt count( aArray->Count() );
+    for ( TInt i = 0; i < count; ++i )
+        {
+        iContacts->AppendL( ( *aArray )[i].CloneLC() );
+        CleanupStack::Pop(); // clone
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPguSetToneCmd::ConfirmationNoteL
+// --------------------------------------------------------------------------
+//
+void CPguSetToneCmd::ConfirmationL()
+	{
+    TParse toneName;
+    toneName.Set( iToneFilename, NULL, NULL );	
+    HBufC* noteText = NULL;
+    if ( toneName.Name().Length() == 0 )
+        {
+        HBufC* defaultName = CCoeEnv::Static()->AllocReadResourceLC
+            ( R_QTN_PHOP_SELI_DEFAULT_RTONE );
+        noteText = StringLoader::LoadL(
+            R_QTN_PHOB_NOTE_RTONE_SET_TO_GRP, *defaultName );
+        CleanupStack::PopAndDestroy(); // defaultName
+        CleanupStack::PushL(noteText);
+        }
+    else
+        {
+        noteText = StringLoader::LoadLC(
+            R_QTN_PHOB_NOTE_RTONE_SET_TO_GRP, toneName.Name() );
+        }
+
+    CAknConfirmationNote* noteDlg = 
+        new (ELeave) CAknConfirmationNote( ETrue );
+    noteDlg->ExecuteLD( *noteText );
+    CleanupStack::PopAndDestroy(); // notetext	
+	}
+
+//  End of File