phonebookui/Phonebook2/CommandsExtension/src/CPbk2RemoveSpeedDialCmd.cpp
branchRCL_3
changeset 63 f4a778e096c2
child 64 c1e8ba0c2b16
child 68 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/CommandsExtension/src/CPbk2RemoveSpeedDialCmd.cpp	Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,424 @@
+/*
+* 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:  Remove speed dial command object.
+*
+*/
+
+
+#include "CPbk2RemoveSpeedDialCmd.h"
+
+// From Phonebook 2
+#include "MPbk2CommandObserver.h"
+#include <CPbk2ApplicationServices.h>
+#include <MPbk2AppUi.h>
+#include <MPbk2ContactUiControl.h>
+#include <CPbk2PresentationContact.h>
+#include <CPbk2FieldPropertyArray.h>
+#include <CPbk2PresentationContactFieldCollection.h>
+#include <Pbk2CmdExtRes.rsg>
+#include <CPbk2AppUiBase.h>
+
+// From Virtual Phonebook
+#include <CVPbkContactIdConverter.h>
+#include <TVPbkContactStoreUriPtr.h>
+#include <CVPbkContactManager.h>
+#include <MVPbkContactStoreList.h>
+#include <MVPbkBaseContact.h>
+#include <MVPbkContactAttributeManager.h>
+#include <CVPbkSpeedDialAttribute.h>
+#include <MVPbkContactOperationBase.h>
+#include <MVPbkStoreContact.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkContactLink.h>
+
+#include <coemain.h>
+#include <AknQueryDialog.h>
+
+/// Unnamed namespace for local definitons
+namespace {
+
+#ifdef _DEBUG
+    enum TPanicCode
+        {
+        EPanicPreCond_Null_Pointer
+        };
+
+    void Panic(TInt aReason)
+        {
+        _LIT(KPanicText, "CPbk2RemoveSpeedDialCmd");
+        User::Panic(KPanicText, aReason);
+        }
+#endif  // _DEBUG
+
+} // namespace
+
+// ============================== MEMBER FUNCTIONS ==========================
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::CPbk2RemoveSpeedDialCmd
+// --------------------------------------------------------------------------
+//
+CPbk2RemoveSpeedDialCmd::CPbk2RemoveSpeedDialCmd(
+        MPbk2ContactUiControl& aUiControl) :
+    iUiControl(&aUiControl)
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2RemoveSpeedDialCmd* CPbk2RemoveSpeedDialCmd::NewL(
+        MPbk2ContactUiControl& aUiControl)
+    {
+    CPbk2RemoveSpeedDialCmd* self = new(ELeave) CPbk2RemoveSpeedDialCmd(
+            aUiControl);
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::~CPbk2RemoveSpeedDialCmd
+// --------------------------------------------------------------------------
+//
+CPbk2RemoveSpeedDialCmd::~CPbk2RemoveSpeedDialCmd()
+    {
+    delete iStoreContact;
+    delete iOperation;
+    Release( iAppServices );
+    
+    delete iContactLink;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::ConstructL
+// --------------------------------------------------------------------------
+//
+inline void CPbk2RemoveSpeedDialCmd::ConstructL()
+    {
+    iAppServices = CPbk2ApplicationServices::InstanceL();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::ExecuteLD
+// --------------------------------------------------------------------------
+//    
+void CPbk2RemoveSpeedDialCmd::ExecuteLD()
+    {
+    CleanupStack::PushL(this);
+    
+    iContactLink = iUiControl->FocusedContactL()->CreateLinkLC();
+    CleanupStack::Pop(); // iContactLink
+    iContactLink->ContactStore().OpenL( *this );
+
+    iContactLink->ContactStore().Close( *this );
+    
+    if ( iUiControl )
+        {
+        iOperation = iAppServices->ContactManager().RetrieveContactL(
+                *iContactLink, *this);
+        }
+    else
+        {
+        FinishCommand( KErrNotFound );
+        }
+    
+    delete iContactLink;
+    iContactLink = NULL;
+
+    CleanupStack::Pop(this);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::AddObserver
+// --------------------------------------------------------------------------
+//    
+void CPbk2RemoveSpeedDialCmd::AddObserver(MPbk2CommandObserver& aObserver)
+    {
+    iCommandObserver = &aObserver;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::ResetUiControl
+// --------------------------------------------------------------------------
+//   
+void CPbk2RemoveSpeedDialCmd::ResetUiControl(
+        MPbk2ContactUiControl& aUiControl)
+    {
+    if (iUiControl == &aUiControl)
+        {
+        iUiControl = NULL;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::StoreReady
+// --------------------------------------------------------------------------
+//
+void CPbk2RemoveSpeedDialCmd::StoreReady( 
+		MVPbkContactStore& /*aContactStore*/ )
+	{
+	}
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::StoreUnavailable
+// --------------------------------------------------------------------------
+//
+void CPbk2RemoveSpeedDialCmd::StoreUnavailable( 
+		MVPbkContactStore& /*aContactStore*/, 
+        TInt /*aReason*/ )
+	{
+	}
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::HandleStoreEventL
+// --------------------------------------------------------------------------
+//
+void CPbk2RemoveSpeedDialCmd::HandleStoreEventL( 
+        MVPbkContactStore& /*aContactStore*/, 
+        TVPbkContactStoreEvent aStoreEvent )
+	{
+	if ( iContactLink && 
+		aStoreEvent.iContactLink->IsSame( *iContactLink ) )
+		{
+		switch( aStoreEvent.iEventType )
+			{
+			case TVPbkContactStoreEvent::EContactDeleted: // FALLTHROUGH
+			case TVPbkContactStoreEvent::EContactChanged: // FALLTHROUGH
+				
+			default:
+				break;
+			}
+		}
+	}
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::VPbkSingleContactOperationComplete
+// --------------------------------------------------------------------------
+//   
+void CPbk2RemoveSpeedDialCmd::VPbkSingleContactOperationComplete(
+        MVPbkContactOperationBase& /*aOperation*/,
+        MVPbkStoreContact* aContact)
+    {
+    delete iOperation;
+    iOperation = NULL;
+
+    delete iStoreContact;    
+    iStoreContact = aContact;
+    
+    TRAPD(error, iStoreContact->LockL(*this));
+    if (error != KErrNone)
+        {
+        FinishCommand(error);
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::VPbkSingleContactOperationFailed
+// --------------------------------------------------------------------------
+//    
+void CPbk2RemoveSpeedDialCmd::VPbkSingleContactOperationFailed(
+        MVPbkContactOperationBase& /*aOperation*/, 
+        TInt aError)
+    {
+    delete iOperation;
+    iOperation = NULL;
+    
+    FinishCommand(aError);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::ContactOperationCompleted
+// --------------------------------------------------------------------------
+//    
+void CPbk2RemoveSpeedDialCmd::ContactOperationCompleted
+    (TContactOpResult aResult)
+    {
+    if (aResult.iOpCode == EContactCommit)
+        {
+        FinishCommand(KErrNone);        
+        }
+    else if (aResult.iOpCode == EContactLock)
+        {    
+        TInt index = KErrNotFound;
+        TInt err = KErrNone;
+        
+        if (iUiControl)
+            {
+            index = iUiControl->FocusedFieldIndex();
+            }
+    
+        if ( index != KErrNotFound )
+            {
+            MVPbkStoreContactField& field = 
+                iStoreContact->Fields().FieldAt( index );            
+
+            TBool hasAttribute = EFalse;
+            TRAP(err, hasAttribute = 
+                iAppServices->ContactManager().
+                    ContactAttributeManagerL().
+                HasFieldAttributeL(CVPbkSpeedDialAttribute::Uid(), field));
+                
+            if (hasAttribute)
+                {
+                TRAP(err, iOperation = iAppServices->ContactManager().
+                    ContactAttributeManagerL().RemoveFieldAttributeL(
+                    field, CVPbkSpeedDialAttribute::Uid(), *this) );
+                }
+            else
+                {
+                FinishCommand( err );
+                }
+            }        
+            
+        if (err != KErrNone)
+            {
+            FinishCommand( err );
+            }        
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::ContactOperationFailed
+// --------------------------------------------------------------------------
+//    
+void CPbk2RemoveSpeedDialCmd::ContactOperationFailed
+    (TContactOp /*aOpCode*/, TInt aErrorCode, TBool /*aErrorNotified*/)
+    {
+    delete iOperation;
+    iOperation = NULL;
+    
+    FinishCommand(aErrorCode);    
+    }    
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::AttributeOperationComplete
+// --------------------------------------------------------------------------
+//
+void CPbk2RemoveSpeedDialCmd::AttributeOperationComplete(
+        MVPbkContactOperationBase& /*aOperation*/)
+    {
+    delete iOperation;
+    iOperation = NULL;
+
+    TRAP_IGNORE(iStoreContact->CommitL(*this));
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::AttributeOperationFailed
+// --------------------------------------------------------------------------
+//    
+void CPbk2RemoveSpeedDialCmd::AttributeOperationFailed(
+    MVPbkContactOperationBase& /*aOperation*/, TInt aError)
+    {
+    delete iOperation;
+    iOperation = NULL;
+    
+    FinishCommand(aError);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::FinishCommand
+// --------------------------------------------------------------------------
+//        
+void CPbk2RemoveSpeedDialCmd::FinishCommand(TInt aError)
+    {
+    __ASSERT_DEBUG(iCommandObserver, Panic(EPanicPreCond_Null_Pointer));
+    
+    TInt error( aError );
+    if (iUiControl && error == KErrNone)
+        {
+        CPbk2AppUiBase<CAknViewAppUi>& appUi = static_cast<CPbk2AppUiBase<CAknViewAppUi>&>
+                                               ( *CEikonEnv::Static()->EikAppUi() );
+        // If appUi is not in foreground, It means phonebook2 has hidden itself in background,
+        // no need to reload its contact, only phonebook2 in foreground case, need to reload
+        // call SetFocusedContactL        
+        if ( appUi.IsForeground() )
+            {
+            TRAP( error, 
+                 iUiControl->SetFocusedContactL(
+                      *iUiControl->FocusedStoreContact() ) );
+                
+            iUiControl->SetFocusedFieldIndex( iUiControl->FocusedFieldIndex() );
+            iUiControl->UpdateAfterCommandExecution();	
+            }
+        }
+
+    iCommandObserver->CommandFinished(*this);
+
+	if (error != KErrNone)	
+		{
+		CCoeEnv::Static()->HandleError(error);
+		}        
+    }    
+
+// --------------------------------------------------------------------------
+// CPbk2RemoveSpeedDialCmd::ToStoreFieldIndexL
+// --------------------------------------------------------------------------
+//  
+TInt CPbk2RemoveSpeedDialCmd::ToStoreFieldIndexL(
+		TInt aPresIndex,
+		const MVPbkStoreContact* aStoreContact )
+    {
+    // It is ok to remove const, we don't make any changes
+    MVPbkStoreContact* storeContact =
+        const_cast<MVPbkStoreContact*>( aStoreContact );
+
+    TInt index( KErrNotFound );
+    CPbk2PresentationContact* presentationContact = 
+        CPbk2PresentationContact::NewL( 
+            *storeContact,
+            iAppServices->FieldProperties() );
+    CleanupStack::PushL( presentationContact );
+
+    index = presentationContact->PresentationFields().StoreIndexOfField
+                ( aPresIndex );
+    
+    CleanupStack::PopAndDestroy( presentationContact );
+    
+    return index;
+    } 
+
+// --------------------------------------------------------------------------
+// CPbk2CommandHandler::HasSpeedDialL
+// --------------------------------------------------------------------------
+//
+TBool CPbk2RemoveSpeedDialCmd::HasSpeedDialL()
+    {
+    TBool hasAttribute(EFalse);
+
+    const MVPbkStoreContact* storeContact =
+            iUiControl->FocusedStoreContact();
+
+   
+    TInt index = iUiControl->FocusedFieldIndex();
+
+
+    if ( index != KErrNotFound )
+        {
+        const MVPbkStoreContactField& field =
+            storeContact->Fields().FieldAt( index );
+
+        hasAttribute =
+        	iAppServices->ContactManager().ContactAttributeManagerL().
+                HasFieldAttributeL(
+                    CVPbkSpeedDialAttribute::Uid(),
+                    field );
+        }
+    return hasAttribute;
+    }
+
+// End of File