diff -r 000000000000 -r e686773b3f54 phonebookengines/VirtualPhonebook/VPbkSimStore/src/CCommitContactsOperation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/VirtualPhonebook/VPbkSimStore/src/CCommitContactsOperation.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,209 @@ +/* +* 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 contact operation for commtting multiple contacts +* +*/ + + +// INCLUDE FILES +#include "CCommitContactsOperation.h" + +#include +#include +#include "VPbkSimStoreError.h" + +namespace VPbkSimStore { + +// CONSTANTS + +// Contacts are commited 1 contact at a time +const TInt KStepSize = 1; + +// ============================= LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// SendStepFailed +// Send step failed event to given observer. +// ----------------------------------------------------------------------------- +// +inline TBool SendStepFailed( CCommitContactsOperation& aOperation, TInt aError, + MVPbkBatchOperationObserver& aObserver ) + { + return aObserver.StepFailed( aOperation, KStepSize, aError ); + } + +// ----------------------------------------------------------------------------- +// SendStepComplete +// Send step completed event to given observer. +// ----------------------------------------------------------------------------- +// +inline void SendStepComplete( CCommitContactsOperation& aOperation, + MVPbkBatchOperationObserver& aObserver ) + { + aObserver.StepComplete( aOperation, KStepSize ); + } + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CCommitContactsOperation::CCommitContactsOperation +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CCommitContactsOperation::CCommitContactsOperation( CContactStore& aStore, + MVPbkBatchOperationObserver& aObserver ) + : iStore( aStore ), + iObserver( aObserver ) + { + } + +// ----------------------------------------------------------------------------- +// CCommitContactsOperation::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CCommitContactsOperation::ConstructL( + const TArray& aContacts ) + { + const TInt count = aContacts.Count(); + for ( TInt i = 0; i < count; ++i ) + { + iStoreContacts.AppendL( aContacts[i] ); + } + } + +// ----------------------------------------------------------------------------- +// CCommitContactsOperation::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CCommitContactsOperation* CCommitContactsOperation::NewL( + CContactStore& aStore, + MVPbkBatchOperationObserver& aObserver, + const TArray& aContacts ) + { + CCommitContactsOperation* self = + new( ELeave ) CCommitContactsOperation( aStore, aObserver ); + CleanupStack::PushL( self ); + self->ConstructL( aContacts ); + CleanupStack::Pop( self ); + return self; + } + + +// Destructor +CCommitContactsOperation::~CCommitContactsOperation() + { + iStoreContacts.Close(); + } + +// ----------------------------------------------------------------------------- +// CCommitContactsOperation::StartL +// ----------------------------------------------------------------------------- +// +void CCommitContactsOperation::StartL() + { + __ASSERT_DEBUG( iStoreContacts.Count() > 0, + VPbkSimStore::Panic( VPbkSimStore::EZeroCommitContacts ) ); + iCommitCounter = 0; + User::LeaveIfError( NextCycle() ); + } + +// ----------------------------------------------------------------------------- +// CCommitContactsOperation::Cancel +// ----------------------------------------------------------------------------- +// +void CCommitContactsOperation::Cancel() + { + iCommitCounter = iStoreContacts.Count(); + } + +// ----------------------------------------------------------------------------- +// CCommitContactsOperation::ContactOperationCompleted +// ----------------------------------------------------------------------------- +// +void CCommitContactsOperation::ContactOperationCompleted( + TContactOpResult /*aResult*/ ) + { + if ( iCommitCounter >= iStoreContacts.Count() ) + { + iObserver.OperationComplete( *this ); + } + else + { + SendStepComplete( *this, iObserver ); + TryCommitNext(); + } + } + +// ----------------------------------------------------------------------------- +// CCommitContactsOperation::ContactOperationFailed +// ----------------------------------------------------------------------------- +// +void CCommitContactsOperation::ContactOperationFailed( TContactOp /*aOpCode*/, + TInt aErrorCode, TBool /*aErrorNotified*/ ) + { + if ( SendStepFailed( *this, aErrorCode, iObserver ) ) + { + // Continue only if ETrue is returned. Otherwise this operation might + // be already deleted. + TryCommitNext(); + } + } + +// ----------------------------------------------------------------------------- +// CCommitContactsOperation::NextCycle +// ----------------------------------------------------------------------------- +// +TInt CCommitContactsOperation::NextCycle() + { + TRAPD( result, iStoreContacts[iCommitCounter]->CommitL( *this ) ); + ++iCommitCounter; + return result; + } + +// ----------------------------------------------------------------------------- +// CCommitContactsOperation::TryCommitNext +// ----------------------------------------------------------------------------- +// +void CCommitContactsOperation::TryCommitNext() + { + const TInt totalCount = iStoreContacts.Count(); + TInt result = KErrNone; + TBool abortedByClient = EFalse; + do + { + result = NextCycle(); + if ( result != KErrNone ) + { + if ( !SendStepFailed( *this, result, iObserver ) ) + { + // Set aborted, we can't continue because this operation might + // be already deleted. + abortedByClient = ETrue; + } + } + } while ( !abortedByClient && // Client is not aborted this operation + result != KErrNone && + iCommitCounter < totalCount ); + + if ( !abortedByClient && result != KErrNone && iCommitCounter >= totalCount ) + { + iObserver.OperationComplete( *this ); + } + } +} // namespace VPbkSimStore +// End of File +