metadataengine/server/src/mdsfindengine.cpp
changeset 0 c53acadfccc6
child 14 646a02f170b9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataengine/server/src/mdsfindengine.cpp	Mon Jan 18 20:34:07 2010 +0200
@@ -0,0 +1,412 @@
+/*
+* 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:  Manages object search from database*
+*/
+
+#include "mdsfindengine.h"
+
+#include "mdcresult.h"
+#include "mdcitem.h"
+#include "mdsdbconnectionpool.h"
+#include "mdsobjectlocklist.h"
+#include "mdsserversession.h"
+#include "mdsfindsequence.h"
+#include "mdslogger.h"
+#include "mdcserializationbuffer.h"
+#include "mdsschema.h"
+#include "mdsserver.h"
+
+__USES_LOGGER
+
+
+
+// ---------------------------------------------------------------------------
+// NewL
+// ---------------------------------------------------------------------------
+//
+CMdSFindEngine* CMdSFindEngine::NewL(
+	TUint32 aQueryId, 
+    CMdSServerSession& aParent,
+    CMdSObjectLockList& aLockList,
+    CMdsSchema& aSchemaNew )
+    {
+    CMdSFindEngine* self = CMdSFindEngine::NewLC(
+        aQueryId, aParent, aLockList, aSchemaNew );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// NewLC
+// ---------------------------------------------------------------------------
+//
+CMdSFindEngine* CMdSFindEngine::NewLC(
+	TUint32 aQueryId, 
+    CMdSServerSession& aParent,
+    CMdSObjectLockList& aLockList,
+    CMdsSchema& aSchemaNew )
+    {
+    CMdSFindEngine* self = new ( ELeave ) CMdSFindEngine(
+        aQueryId, aParent, aLockList );
+    CleanupStack::PushL( self );
+    self->ConstructL( aSchemaNew );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Default constructor
+// ---------------------------------------------------------------------------
+//
+CMdSFindEngine::CMdSFindEngine(
+	TUint32 aQueryId, 
+    CMdSServerSession& aParent,
+    CMdSObjectLockList& aLockList )
+    : iQueryId( aQueryId )
+    , iParent( aParent )
+    , iLockList( aLockList )
+    , iSequence( NULL )
+    , iSerializedCriteria( NULL )
+    , iAsyncPending( EFalse )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void CMdSFindEngine::ConstructL( CMdsSchema& aSchema )
+    {
+    iSequence = CMdSFindSequence::NewL( iParent.GetServer(), aSchema, *this );
+    }
+
+// ---------------------------------------------------------------------------
+// QueryId
+// ---------------------------------------------------------------------------
+//
+TUint32 CMdSFindEngine::QueryId()
+	{
+	return iQueryId;
+	}
+
+// ---------------------------------------------------------------------------
+// SetFindParams
+// ---------------------------------------------------------------------------
+//
+void CMdSFindEngine::SetFindParams( TUint32 aNotifyCount )
+    {
+    iSequence->SetFindParams( aNotifyCount );
+    }
+
+// ---------------------------------------------------------------------------
+// SetFindCriteria
+// ---------------------------------------------------------------------------
+//
+void CMdSFindEngine::SetFindCriteria( CMdCSerializationBuffer* aSerializedCriteria )
+    {
+    iSerializedCriteria = aSerializedCriteria;
+    }
+
+// ---------------------------------------------------------------------------
+// CreateResultSetL
+// ---------------------------------------------------------------------------
+//
+void CMdSFindEngine::CreateResultSet(RMessage2 aMessage)
+    {
+    iMessage = aMessage;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CMdSFindEngine::~CMdSFindEngine()
+    {
+   	delete iSerializedCriteria;
+   	delete iSequence;
+    }
+
+// ---------------------------------------------------------------------------
+// FindL
+// ---------------------------------------------------------------------------
+//
+TInt CMdSFindEngine::FindL( TUserLevel aUserLevel )
+    {
+    const TInt result = iSequence->FindL( *iSerializedCriteria, aUserLevel );
+
+    if( result == KErrNone && iMessage.IsNull() == EFalse )
+    	{
+    	TPckgBuf<TInt> sizeBuf( iSequence->ResultsL().Size() );
+    	iMessage.WriteL( 2, sizeBuf );
+    	}
+    
+    return result;
+    }
+
+// ---------------------------------------------------------------------------
+// ContinueL
+// ---------------------------------------------------------------------------
+//
+TInt CMdSFindEngine::ContinueL()
+    {
+    const TInt result = iSequence->ContinueL();
+    
+    if( result == KErrNone && iMessage.IsNull() == EFalse )
+    	{
+    	TPckgBuf<TInt> sizeBuf( iSequence->ResultsL().Size() );
+    	iMessage.WriteL( 2, sizeBuf );
+    	}
+        
+    return result;
+    }
+
+// ---------------------------------------------------------------------------
+// FindAsyncL
+// ---------------------------------------------------------------------------
+//
+void CMdSFindEngine::FindAsyncL( TUserLevel aUserLevel )
+    {
+    iAsyncPending = ETrue;
+    iSequence->FindAsync( *iSerializedCriteria, aUserLevel );
+    }
+
+// ---------------------------------------------------------------------------
+// ContinueAsync
+// ---------------------------------------------------------------------------
+//
+void CMdSFindEngine::ContinueAsync()
+    {
+    iAsyncPending = ETrue;
+    iSequence->ContinueAsync();
+    }
+
+// ---------------------------------------------------------------------------
+// Cancel
+// ---------------------------------------------------------------------------
+//
+void CMdSFindEngine::Cancel( TInt aError )
+    {
+    TBool toComplete = iAsyncPending;
+    iAsyncPending = EFalse;
+    iSequence->Cancel();
+
+    if( iMessage.IsNull() == EFalse )
+    	{
+    	if ( toComplete ) 
+    		{
+    		iMessage.Complete( KErrCancel );
+    		}
+    	else 
+    		{
+    		iMessage.Complete( aError );
+    		}
+    	}
+    }
+
+// ---------------------------------------------------------------------------
+// SetComplete
+// ---------------------------------------------------------------------------
+//
+void CMdSFindEngine::SetComplete( TInt aError )
+    {
+    TBool toComplete = iAsyncPending;
+    __LOG1( ELogServer, "<- Find Set Complete (%d)", aError );
+
+    if( aError == KErrNone )
+        {
+        TUint32 resultSize = 0;
+
+        TInt err = KErrNone;
+
+        TRAP( err, resultSize = iSequence->ResultsL().Size() );
+
+       	if( err )
+       		{
+       		if ( toComplete && iMessage.IsNull() == EFalse ) 
+       			{
+       			iMessage.Complete( err );
+       			}
+       		return;
+       		}
+
+        iAsyncPending = EFalse;
+
+       	if ( iMessage.IsNull() == EFalse )
+       		{
+       		TPckgBuf<TInt> sizeBuf( resultSize );
+
+       		err = iMessage.Write( 2, sizeBuf );
+       		}
+
+       	if( err )
+       		{
+       		if ( toComplete && iMessage.IsNull() == EFalse ) 
+       			{
+       			iMessage.Complete( err );
+       			}
+       		return;
+       		}
+       	else
+       		{        	
+       		if ( toComplete && iMessage.IsNull() == EFalse ) 
+       			{
+       			iMessage.Complete( EAsyncFindSetReady );
+       			}
+       		}
+        }
+    else
+        {
+       	if ( toComplete && iMessage.IsNull() == EFalse ) 
+       		{
+       		iMessage.Complete( aError );
+       		}
+       	return;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// FindComplete
+// ---------------------------------------------------------------------------
+//
+void CMdSFindEngine::FindComplete( TInt aError )
+    {
+    TBool toComplete = iAsyncPending;
+    __LOG1( ELogServer, "<- Find Complete (%d)", aError );
+
+    if( aError == KErrNone )
+        {
+        TUint32 resultSize = 0;
+
+        TInt err = KErrNone;
+
+        TRAP( err, resultSize = iSequence->ResultsL().Size() );
+
+       	if( err )
+       		{
+       		if ( toComplete && iMessage.IsNull() == EFalse )
+       			{
+       			iMessage.Complete( err );
+       			}
+       		return;
+       		}
+
+        iAsyncPending = EFalse;
+        
+        if ( iMessage.IsNull() == EFalse )
+        	{
+        	TPckgBuf<TInt> sizeBuf( resultSize );    	
+
+        	err = iMessage.Write( 2, sizeBuf );
+        	}
+
+       	if( err )
+       		{
+       		if ( toComplete && iMessage.IsNull() == EFalse ) 
+       			{
+       			iMessage.Complete( err );
+       			}
+       		return;
+       		}
+       	else
+			{
+        	if ( toComplete && iMessage.IsNull() == EFalse ) 
+        		{
+        		iMessage.Complete( EAsyncFindComplete );
+        		}
+			}
+        }
+    else
+        {
+       	if ( toComplete && iMessage.IsNull() == EFalse ) 
+       		{
+       		iMessage.Complete( aError );
+       		}
+       	return;
+        }
+    }
+
+const CMdCSerializationBuffer& CMdSFindEngine::ResultsL() const
+	{
+	return iSequence->ResultsL();
+	}
+
+void CMdSFindEngine::SetResultMode( TBool aResultModeItems )
+	{
+	iLastResultModeItems = aResultModeItems;
+	}
+
+TBool CMdSFindEngine::IsComplete() const
+	{
+	if( iSequence )
+		{		
+		return iSequence->IsComplete();
+		}
+	else
+		{
+		return ETrue;
+		}
+	}
+	
+TBool CMdSFindEngine::IsQueryComplete()
+	{
+	if( iSequence )
+		{		
+		return iSequence->IsQueryComplete();
+		}
+	else
+		{
+		return ETrue;
+		}
+	}	
+
+CMdSServer& CMdSFindEngine::GetServer() const
+	{
+	return iParent.GetServer();
+	}
+
+void CMdSFindEngine::LockFindResultObjectsL( CMdSObjectLockList& aLockList )
+	{
+	if (!iLastResultModeItems)
+		{
+		return;
+		}
+
+	CMdsSchema& schema = iParent.GetServer().Schema();
+	CMdCSerializationBuffer& buffer = iSequence->ResultsL();
+	buffer.PositionL( KNoOffset );
+	TMdCItems items;
+	items.DeserializeL( buffer );
+
+	const CMdsNamespaceDef* namespaceDef = schema.GetNamespaceByIdL( items.iNamespaceDefId );
+
+	for(TInt32 i = 0; i < items.iObjects.iPtr.iCount; ++i)
+		{
+		buffer.PositionL( items.iObjects.iPtr.iOffset + i * sizeof(TMdCObject) );
+		TMdCObject object;
+		object.DeserializeL( buffer );
+
+		if ( aLockList.IsLocked( *namespaceDef, object.iId ) )
+			{
+			object.iFlags &= ~EMdEObjectFlagModOpen;
+			}
+		else
+			{
+			aLockList.LockObjectL( iParent, *namespaceDef, object.iId );
+			object.iFlags |= EMdEObjectFlagModOpen;
+			}
+
+		buffer.PositionL( items.iObjects.iPtr.iOffset + i * sizeof(TMdCObject) );
+		object.SerializeL( buffer );
+		}
+	}
+