diff -r 000000000000 -r e686773b3f54 phonebookengines/VirtualPhonebook/VPbkEng/src/CVPbkContactEasyManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/VirtualPhonebook/VPbkEng/src/CVPbkContactEasyManager.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,203 @@ +/* +* 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: Easy management of contacts. +* +*/ + + +// INCLUDES + +#include "CVPbkContactEasyManager.h" + +#include +#include +#include +#include +#include + +CVPbkContactEasyManager* CVPbkContactEasyManager::NewL( + CVPbkContactManager& aContactManager ) + { + CVPbkContactEasyManager* self = + new (ELeave) CVPbkContactEasyManager(aContactManager); + return self; + } + +CVPbkContactEasyManager::~CVPbkContactEasyManager() + { + delete iOperation; + delete iContactLinks; + } + +void CVPbkContactEasyManager::RetrieveAndLockContactsL( + const MVPbkContactLinkArray& aContactLinks, + RPointerArray& aRetrievedContacts, + MVPbkOperationObserver& aObserver, + MVPbkOperationErrorObserver& aErrorObserver ) + { + iCancelled = EFalse; + iObserver = & aObserver; + iErrorObserver = &aErrorObserver; + iContacts = &aRetrievedContacts; // owned externally + delete iContactLinks; + iContactLinks = NULL; + iContactLinks = CloneLinkArrayL( aContactLinks ); + delete iOperation; + iOperation = NULL; + // Retrieve the first contact. + // The next contacts are retrieved when the previous one completes. + if ( iContactLinks->Count() > 0 ) + { + iOperation = iContactManager.RetrieveContactL( iContactLinks->At( 0 ), *this ); + iContactLinks->Delete( 0 ); + // Now waiting for callback. + } + } + +void CVPbkContactEasyManager::Cancel() + { + iCancelled = ETrue; + delete iOperation; + iOperation = NULL; + delete iContactLinks; + iContactLinks = NULL; + } + +// --------------------------------------------------------------- +// These are from MVPbkSingleContactOperationObserver +// They are related to the contact retrieving. + +void CVPbkContactEasyManager::VPbkSingleContactOperationComplete( + MVPbkContactOperationBase& /*aOperation*/, + MVPbkStoreContact* aContact ) + { + TRAPD( error, DoSingleContactOperationCompleteL( aContact ) ); + if ( error != KErrNone ) + { + delete iOperation; + iOperation = NULL; + iErrorObserver->VPbkOperationFailed( this, error ); + } + } + +void CVPbkContactEasyManager::VPbkSingleContactOperationFailed( + MVPbkContactOperationBase& /*aOperation*/, + TInt aError ) + { + iErrorObserver->VPbkOperationFailed( this, aError ); + delete iOperation; + iOperation = NULL; + } + +// ---------------------------------------------------------------- +// These are from from MVPbkContactObserver +// They are related to the contact locking. + +void CVPbkContactEasyManager::ContactOperationCompleted( + MVPbkContactObserver::TContactOpResult /*aResult*/ ) + { + // Locking of a contact has completed. + TRAPD( error, DoContactOperationCompletedL() ); + if ( error != KErrNone ) + { + iErrorObserver->VPbkOperationFailed( this, error ); + } + } + +void CVPbkContactEasyManager::ContactOperationFailed( + TContactOp /*aOpCode*/, TInt aErrorCode, TBool /*aErrorNotified*/) + { + if ( !iCancelled ) + { + iErrorObserver->VPbkOperationFailed( this, aErrorCode ); + // No more processing after this. + } + } + +// ------------------------------------------------------------------ + + +/// Implementation which is called from VPbkSingleContactOperationComplete(). +void CVPbkContactEasyManager::DoSingleContactOperationCompleteL( + MVPbkStoreContact* aContact ) + { + // Retrieving of a contact has completed. + + iContacts->AppendL( aContact ); // Ownership is given to array. + delete iOperation; + iOperation = NULL; + + if ( iContactLinks->Count() > 0 ) + { + // Start to retrieve contacts one by one. The rest of the contact + // retrievals are started from the callback. + + iOperation = iContactManager.RetrieveContactL( + iContactLinks->At( 0 ), *this ); + iContactLinks->Delete( 0 ); + // Now waiting for callback. + } + else + { + // No more contacts to retrieve. + // Now lock the retrieved contacts one by one. + iNextContactToLock = 0; + (*iContacts)[ iNextContactToLock ]->LockL( *this ); + } + } + +/// Implementation which is called from ContactOperationCompleted(). +void CVPbkContactEasyManager::DoContactOperationCompletedL() + { + // Locking of a contact has completed. + if ( !iCancelled ) + { + ++iNextContactToLock; + if ( iNextContactToLock < iContacts->Count() ) + { + // Still some contacts that need to be locked. + (*iContacts)[ iNextContactToLock ]->LockL( *this ); + } + else + { + // All contacts have been retrieved & locked. + delete iContactLinks; + iContactLinks = NULL; + iObserver->VPbkOperationCompleted( this ); + } + } + } + +CVPbkContactLinkArray* CVPbkContactEasyManager::CloneLinkArrayL( + const MVPbkContactLinkArray& aArray ) + { + CVPbkContactLinkArray* newArray = CVPbkContactLinkArray::NewLC(); + const TInt count = aArray.Count(); + for ( TInt n = 0; n < count; ++n ) + { + MVPbkContactLink* link = aArray.At(n).CloneLC(); + newArray->AppendL( link ); + CleanupStack::Pop(); // link + } + CleanupStack::Pop( newArray ); + return newArray; + } + +CVPbkContactEasyManager::CVPbkContactEasyManager( + CVPbkContactManager& aContactManager ) + : iContactManager( aContactManager ) + { + } + +// end of file