diff -r 000000000000 -r e686773b3f54 phonebookengines/VirtualPhonebook/VPbkEng/src/CVPbkContactFindOperation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/VirtualPhonebook/VPbkEng/src/CVPbkContactFindOperation.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,135 @@ +/* +* 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: An implementation for find operation. Can be used e.g +* in store domain implementation to handle Find -operations +* from stores. +* +*/ + + +#include "CVPbkContactFindOperation.h" + +#include +#include + +CVPbkContactFindOperation::CVPbkContactFindOperation( + MVPbkContactFindObserver& aObserver) : + iObserver(aObserver) + { + } + +inline void CVPbkContactFindOperation::ConstructL() + { + } + +EXPORT_C CVPbkContactFindOperation* CVPbkContactFindOperation::NewLC( + MVPbkContactFindObserver& aObserver) + { + CVPbkContactFindOperation* self = new(ELeave) CVPbkContactFindOperation(aObserver); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CVPbkContactFindOperation::~CVPbkContactFindOperation() + { + delete iResults; + } + +void CVPbkContactFindOperation::HandleZeroSuboperations() + { + // If no suboperations then complete find with empty array. + // If completing leaves then call FindFailed + TRAPD( res, HandleZeroSuboperationsL() ); + if ( res != KErrNone ) + { + iObserver.FindFailed( res ); + } + } + +void CVPbkContactFindOperation::FindCompleteL(MVPbkContactLinkArray* aResults) + { + ++iCompleteCount; + + // take ownership of aResults immediately + MVPbkContactLinkArray* passedResults = aResults; + CleanupDeletePushL(passedResults); + + // lazy creation of result array + if (!iResults) + { + iResults = CVPbkContactLinkArray::NewL(); + } + + if (aResults) + { + // append results to this operations array + for (TInt i = aResults->Count() - 1; i >= 0; --i) + { + MVPbkContactLink* link = aResults->At(i).CloneLC(); + iResults->AppendL(link); + CleanupStack::Pop(); // link + } + } + CleanupStack::PopAndDestroy(passedResults); + + // notify clients if all suboperations have completed + if (iCompleteCount >= SubOperationCount()) + { + // takes ownership of results + CVPbkContactLinkArray* results = iResults; + iResults = NULL; + iObserver.FindCompleteL(results); + } + } + +void CVPbkContactFindOperation::FindFailed(TInt aError) + { + ++iCompleteCount; + + // notify clients if all suboperations have completed + if (iCompleteCount >= SubOperationCount()) + { + // if there are results give them to the client + if (iResults) + { + // the observer takes ownership of results + CVPbkContactLinkArray* results = iResults; + iResults = NULL; + TRAPD(err, iObserver.FindCompleteL(results)); + if (err) + { + // client must take ownership of results before it can leave + iObserver.FindFailed(aError); + } + } + else + { + // otherwise inform find failure + iObserver.FindFailed(aError); + } + } + } + +// ----------------------------------------------------------------------------- +// CVPbkContactFindOperation::HandleZeroSuboperationsL +// ----------------------------------------------------------------------------- +// +void CVPbkContactFindOperation::HandleZeroSuboperationsL() + { + CVPbkContactLinkArray* emptyResults = CVPbkContactLinkArray::NewL(); + // Client takes the ownership of the results + iObserver.FindCompleteL( emptyResults ); + } +// End of File