diff -r 000000000000 -r c53acadfccc6 metadataengine/client/src/mdeasynchronousfindao.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/metadataengine/client/src/mdeasynchronousfindao.cpp Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,397 @@ +/* +* Copyright (c) 2005-2009 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: Asynchronous query active object +* +*/ + + +// INCLUDE FILES +#include "mdeasynchronousfindao.h" +#include "mdequeryimpl.h" + +#include "mdeenginesession.h" +#include "mdelogiccondition.h" +#include "mdesessionimpl.h" +#include "mdequerycriteriaserialization.h" +#include "mdeinstanceitem.h" + +// ========================= MEMBER FUNCTIONS ================================== + +CMdEAsynchronousFindAO* CMdEAsynchronousFindAO::NewL( CMdEQuery& aQuery, + CMdESessionImpl& aSessionImpl, RMdEEngineSession& aSession ) + { + CMdEAsynchronousFindAO* self = CMdEAsynchronousFindAO::NewLC( aQuery, aSessionImpl, aSession ); + CleanupStack::Pop( self ); + return self; + } + +CMdEAsynchronousFindAO* CMdEAsynchronousFindAO::NewLC( CMdEQuery& aQuery, + CMdESessionImpl& aSessionImpl, RMdEEngineSession& aSession ) + { + CMdEAsynchronousFindAO* self = + new ( ELeave ) CMdEAsynchronousFindAO( aQuery, aSessionImpl, aSession ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +void CMdEAsynchronousFindAO::ConstructL() + { + } + +CMdEAsynchronousFindAO::CMdEAsynchronousFindAO( CMdEQuery& aQuery, + CMdESessionImpl& aSessionImpl, RMdEEngineSession& aSession ) + : CActive( CActive::EPriorityStandard ) + , iQuery( aQuery ) + , iSessionImpl ( aSessionImpl ) + , iSession( aSession ) + , iCountResult( 0 ) + , iConditionBuffer( NULL ) + , iDistinctResults( NULL ) + { + CActiveScheduler::Add( this ); + } + + +void CMdEAsynchronousFindAO::DoFindL( TUint aMaxCount, TUint aNotifyCount ) + { + CMdEObjectDef* objectDef = NULL; + + RPointerArray* objectDefs = NULL; + + RPointerArray* propertyFilter = NULL; + + // get query's internal optimization flags + TUint32 queryOptimizationFlags = 0; + iQuery.Conditions().InternalQueryOptimizationFlags(queryOptimizationFlags); + + TQueryResultMode resultMode = iQuery.ResultMode(); + + // set property filter and distinct + if( EQueryTypeObject == iQuery.Type() ) + { + CMdEObjectQuery& objectQuery = (CMdEObjectQuery&)iQuery; + + objectDef = &objectQuery.ObjectDef(); + + objectDefs = objectQuery.ObjectDefs(); + + // if result mode is objects with freetext + // change it to normal items for server + // (freetext including to results is in query optimization flags) + if( EQueryResultModeObjectWithFreetexts == resultMode ) + { + resultMode = EQueryResultModeItem; + queryOptimizationFlags |= EContainsFreetextCondition; + } + + if( EQueryResultModeItem == resultMode || + EQueryResultModeDistinctValues == resultMode ) + { + if( objectQuery.PropertyFilter().Count() > 0 ) + { + propertyFilter = &objectQuery.PropertyFilter(); + } + } + } + + iConditionBuffer = + CMdEQueryCriteriaSerialization::NewLC( resultMode, iQuery.Type(), + iQuery.NamespaceDef(), + objectDef, + objectDefs, + aMaxCount, + 0, // 0 offset because it's not used currently + queryOptimizationFlags, + iQuery.Conditions(), iQuery.OrderRules(), + propertyFilter ); + CleanupStack::Pop(); + iSession.DoFindAsync( + iQuery.GetQueryId(), + *iConditionBuffer, + &iResultSize, + iStatus, + aNotifyCount ); + + SetActive(); + } + + +CMdEAsynchronousFindAO::~CMdEAsynchronousFindAO() + { + Cancel(); // Causes call to DoCancel() + + delete iDistinctResults; + + delete iConditionBuffer; + + iResultList.ResetAndDestroy(); + iResultList.Close(); + + iIdResultList.Close(); + } + + +void CMdEAsynchronousFindAO::RunL() + { + // condition buffer can be safely removed now + if( iConditionBuffer ) + { + delete iConditionBuffer; + iConditionBuffer = NULL; + } + + // check if client side query is in error state (for example cancelled) + if( iQuery.State() == CMdEQuery::EStateError ) + { + TRAP_IGNORE( iSession.DoFindCancelL( &iQuery ) ); + return; + } + + const TInt status = iStatus.Int(); + switch ( status ) + { + case EAsyncFindSetReady: + case EAsyncFindComplete: + { + // fetch results from server + CMdCSerializationBuffer* results = CMdCSerializationBuffer::NewLC(iResultSize()); + + iSession.DoGetDataL( &iQuery, results, status ); + + const TQueryResultMode resultMode = iQuery.ResultMode(); + + if ( resultMode == EQueryResultModeItem || resultMode == EQueryResultModeObjectWithFreetexts ) + { + iSessionImpl.DeserializeQueryResultL( *results, iResultList ); + } + else if ( resultMode == EQueryResultModeId ) + { + iSessionImpl.GetItemIdL( results, iIdResultList ); + } + else if ( resultMode == EQueryResultModeCount ) + { + iSessionImpl.GetCountL( results, iCountResult ); + } + else if ( resultMode == EQueryResultModeDistinctValues ) + { + if( iDistinctResults ) + { + delete iDistinctResults; + iDistinctResults = NULL; + } + + iDistinctResults = new (ELeave) CDesCArrayFlat( 16 ); + iSessionImpl.GetDistinctValuesL( *results, *iDistinctResults ); + } + + CleanupStack::PopAndDestroy( results ); + + // notify the results + DoNotifyL( ETrue, status ); + + if ( status == EAsyncFindSetReady ) + { + iResultSize = 0; + + // continue find, fetch next set + iSession.DoFindContinue( &iQuery, &iResultSize, iStatus ); + SetActive(); + } + } + break; + + default: + { + // notify of an error + DoNotifyL( EFalse, status ); + } + break; + } + } + +TInt CMdEAsynchronousFindAO::RunError(TInt aError) + { + // in error cases make sure that results are cleaned + iResultList.Reset(); + + iIdResultList.Reset(); + + delete iDistinctResults; + iDistinctResults = NULL; + + if( aError == KErrServerTerminated ) + { + iSessionImpl.NotifyError( aError ); + } + else + { + // cancel query if it's still running + if( iQuery.State() != EAsyncFindComplete ) + { + TRAP_IGNORE( iSession.DoFindCancelL( &iQuery ) ); + } + } + + const TQueryType mode = iQuery.Type(); + + if ( mode == EQueryTypeObject ) + { + CMdEObjectQueryImpl& qi = (CMdEObjectQueryImpl&)iQuery; + qi.DoNotifyCompleted( aError ); + } + else if ( mode == EQueryTypeRelation ) + { + CMdERelationQueryImpl& qi = (CMdERelationQueryImpl&)iQuery; + qi.DoNotifyCompleted( aError ); + } + else if ( mode == EQueryTypeEvent ) + { + CMdEEventQueryImpl& qi = (CMdEEventQueryImpl&)iQuery; + qi.DoNotifyCompleted( aError ); + } + + return KErrNone; + } + +void CMdEAsynchronousFindAO::DoNotifyResultsL( TInt aStatus ) + { + // Notify result instances + if ( ( aStatus == EAsyncFindSetReady || + aStatus == EAsyncFindComplete ) && + iResultList.Count() > 0) + { + const TQueryType mode = iQuery.Type(); + + if ( mode == EQueryTypeObject ) + { + CMdEObjectQueryImpl& qi = (CMdEObjectQueryImpl&)iQuery; + qi.DoNotifyResultsL( iResultList ); + } + else if ( mode == EQueryTypeRelation ) + { + CMdERelationQueryImpl& qi = (CMdERelationQueryImpl&)iQuery; + qi.DoNotifyResultsL( iResultList ); + } + else if ( mode == EQueryTypeEvent ) + { + CMdEEventQueryImpl& qi = (CMdEEventQueryImpl&)iQuery; + qi.DoNotifyResultsL( iResultList ); + } + + // get rid of local results list + iResultList.Reset(); + } + // Notify result ids + else if ( ( aStatus == EAsyncFindSetReady || + aStatus == EAsyncFindComplete ) && + iIdResultList.Count() > 0) + { + const TQueryType mode = iQuery.Type(); + + if ( mode == EQueryTypeObject ) + { + CMdEObjectQueryImpl& qi = (CMdEObjectQueryImpl&)iQuery; + qi.DoNotifyResultsL( iIdResultList ); + } + else if ( mode == EQueryTypeRelation ) + { + CMdERelationQueryImpl& qi = (CMdERelationQueryImpl&)iQuery; + qi.DoNotifyResultsL( iIdResultList ); + } + else if ( mode == EQueryTypeEvent ) + { + CMdEEventQueryImpl& qi = (CMdEEventQueryImpl&)iQuery; + qi.DoNotifyResultsL( iIdResultList ); + } + + // get rid of local results list + iIdResultList.Reset(); + } + else if ( iQuery.ResultMode() == EQueryResultModeCount ) + { + const TQueryType mode = iQuery.Type(); + + if ( mode == EQueryTypeObject ) + { + CMdEObjectQueryImpl& qi = (CMdEObjectQueryImpl&)iQuery; + qi.DoNotifyResults( iCountResult ); + } + else if ( mode == EQueryTypeRelation ) + { + CMdERelationQueryImpl& qi = (CMdERelationQueryImpl&)iQuery; + qi.DoNotifyResults( iCountResult ); + } + else if ( mode == EQueryTypeEvent ) + { + CMdEEventQueryImpl& qi = (CMdEEventQueryImpl&)iQuery; + qi.DoNotifyResults( iCountResult ); + } + } + else if ( ( aStatus == EAsyncFindSetReady || + aStatus == EAsyncFindComplete ) && + iDistinctResults && iQuery.ResultMode() == EQueryResultModeDistinctValues ) + { + CMdEObjectQueryImpl& qi = (CMdEObjectQueryImpl&)iQuery; + qi.DoNotifyResultsL( *iDistinctResults ); + + delete iDistinctResults; + iDistinctResults = NULL; + } + } + +void CMdEAsynchronousFindAO::DoNotifyL( TBool aNewResults, TInt aStatus ) + { + if( aNewResults ) + { + DoNotifyResultsL( aStatus ); + } + + // Notify complete + if ( aStatus != EAsyncFindSetReady ) + { + const TInt code = ( aStatus == EAsyncFindComplete ? KErrNone : aStatus ); + + const TQueryType mode = iQuery.Type(); + + if ( mode == EQueryTypeObject ) + { + CMdEObjectQueryImpl& qi = (CMdEObjectQueryImpl&)iQuery; + qi.DoNotifyCompleted( code ); + } + else if ( mode == EQueryTypeRelation ) + { + CMdERelationQueryImpl& qi = (CMdERelationQueryImpl&)iQuery; + qi.DoNotifyCompleted( code ); + } + else if ( mode == EQueryTypeEvent ) + { + CMdEEventQueryImpl& qi = (CMdEEventQueryImpl&)iQuery; + qi.DoNotifyCompleted( code ); + } + } + + if( aStatus == KErrServerTerminated ) + { + iSessionImpl.NotifyError( aStatus ); + } + } + + +void CMdEAsynchronousFindAO::DoCancel() + { + TRAP_IGNORE( iSession.DoFindCancelL( &iQuery ) ); + } + +// End of File