diff -r 5b6f26637ad3 -r f4a778e096c2 phonebookui/Phonebook2/CommandsExtension/src/CPbk2RemoveSpeedDialCmd.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include + +// From Virtual Phonebook +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/// 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& appUi = static_cast&> + ( *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( 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