metadataengine/client/src/mdequerycriteriaserialization.cpp
changeset 0 c53acadfccc6
child 15 3cebc1a84278
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataengine/client/src/mdequerycriteriaserialization.cpp	Mon Jan 18 20:34:07 2010 +0200
@@ -0,0 +1,291 @@
+/*
+* Copyright (c) 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:  Serialize query criteria
+*
+*/
+
+
+#include "mdequerycriteriaserialization.h"
+#include "mdelogiccondition.h"
+#include "mdepropertydef.h"
+#include "mdenamespacedef.h"
+#include "mdeobjectdef.h"
+#include "mdcquery.h"
+#include "mdcserializationbuffer.h"
+
+
+CMdEQueryCriteriaSerialization* CMdEQueryCriteriaSerialization::NewL(
+	TQueryResultMode aResultMode, TQueryType aQueryType, 
+	CMdENamespaceDef& aNamespaceDef, 
+	CMdEObjectDef* aObjectDef, RPointerArray<CMdEObjectDef>* aObjectDefs, 
+	TUint32 aLimit, TUint32 aOffset, TUint32 aQueryOptimizationFlags,
+	CMdELogicCondition& aRootCondition, RArray<TMdEOrderRule>& aOrderRule, 
+	RPointerArray<CMdEPropertyDef>* aPropertyFilter)
+	{
+    CMdEQueryCriteriaSerialization* serialization = 
+    	CMdEQueryCriteriaSerialization::NewLC( aResultMode, aQueryType,
+    										   aNamespaceDef, aObjectDef, aObjectDefs, 
+    										   aLimit, aOffset, aQueryOptimizationFlags,
+    										   aRootCondition, aOrderRule,
+    										   aPropertyFilter );
+    CleanupStack::Pop( serialization );
+    return serialization;
+    }
+
+CMdEQueryCriteriaSerialization* CMdEQueryCriteriaSerialization::NewLC(
+	TQueryResultMode aResultMode, TQueryType aQueryType, 
+	CMdENamespaceDef& aNamespaceDef, 
+	CMdEObjectDef* aObjectDef, RPointerArray<CMdEObjectDef>* aObjectDefs, 
+	TUint32 aLimit, TUint32 aOffset, TUint32 aQueryOptimizationFlags, 
+	CMdELogicCondition& aRootCondition, RArray<TMdEOrderRule>& aOrderRule, 
+	RPointerArray<CMdEPropertyDef>* aPropertyFilter)
+	{
+    CMdEQueryCriteriaSerialization* serialization = 
+    	new( ELeave ) CMdEQueryCriteriaSerialization( ETrue ); // Owns serialized buffer
+    CleanupStack::PushL( serialization );
+    serialization->ConstructL( aResultMode, aQueryType,
+    						   aNamespaceDef, aObjectDef, aObjectDefs, 
+    						   aLimit, aOffset, aQueryOptimizationFlags,
+    						   aRootCondition, aOrderRule,
+    						   aPropertyFilter );
+    return serialization;
+	}
+
+CMdEQueryCriteriaSerialization* CMdEQueryCriteriaSerialization::NewL(
+	CMdCSerializationBuffer& aSerializationBuffer)
+	{
+    CMdEQueryCriteriaSerialization* serialization = 
+    	CMdEQueryCriteriaSerialization::NewLC( aSerializationBuffer );
+    CleanupStack::Pop( serialization );
+    return serialization;
+	}
+
+CMdEQueryCriteriaSerialization* CMdEQueryCriteriaSerialization::NewLC(
+	CMdCSerializationBuffer& aSerializationBuffer)
+	{
+    CMdEQueryCriteriaSerialization* serialization = 
+    	new( ELeave ) CMdEQueryCriteriaSerialization( EFalse ); // Doesn't own serialized buffer
+    CleanupStack::PushL( serialization );
+    serialization->iSerializedBuffer = &aSerializationBuffer;
+    return serialization;
+	}
+
+CMdEQueryCriteriaSerialization::~CMdEQueryCriteriaSerialization()
+	{
+	if( iOwnSerializedBuffer )
+		{
+		delete iSerializedBuffer;
+		}
+	}
+	
+TPtr8 CMdEQueryCriteriaSerialization::Buffer() const
+	{
+	return iSerializedBuffer->Buffer();
+	}
+
+const TPtr8* CMdEQueryCriteriaSerialization::BufferPtr() const
+	{
+	return iSerializedBuffer->BufferPtr();
+	}
+
+CMdCSerializationBuffer& CMdEQueryCriteriaSerialization::SerializationBuffer()
+	{
+	return *iSerializedBuffer;
+	}
+
+CMdEQueryCriteriaSerialization::CMdEQueryCriteriaSerialization(TBool aOwnSerializedBuffer)
+	: iSerializedBuffer( NULL ), iOwnSerializedBuffer( aOwnSerializedBuffer )
+	{
+	
+	}
+
+void CMdEQueryCriteriaSerialization::ConstructL(
+	TQueryResultMode aResultMode, TQueryType aQueryType, 
+	CMdENamespaceDef& aNamespaceDef, 
+	CMdEObjectDef* aObjectDef, RPointerArray<CMdEObjectDef>* aObjectDefs, 
+	TUint32 aLimit, TUint32 aOffset, TUint32 aQueryOptimizationFlags, 
+	CMdELogicCondition& aRootCondition, RArray<TMdEOrderRule>& aOrderRules, 
+	RPointerArray<CMdEPropertyDef>* aPropertyFilter)
+	{
+	// If aResultMode is EModeDistinctValues aQueryType must be CMdEQuery::ETypeObject
+	if( EQueryResultModeDistinctValues == aResultMode )
+		{
+		if( EQueryTypeObject != aQueryType )
+			{
+			User::Leave( KErrNotSupported );
+			}
+		else
+			{
+			// Order rules might also contain one order rule and it must be 
+			// same as defined in propery condition.
+			if( aOrderRules.Count() > 1 )
+				{
+				User::Leave( KErrCompletion );
+				}
+
+			// One property filter must exist and it must be same as property condition
+			if( aPropertyFilter )
+				{
+				if( aPropertyFilter->Count() != 1 )
+					{
+					User::Leave( KErrCompletion );
+					}
+				}
+			else
+				{
+				User::Leave( KErrCompletion);
+				}
+			}
+		}
+	
+	TUint32 criteriaBufferSize = sizeof( TMdCSearchCriteria );
+	
+	// Required size for object defs IDs
+	TUint32 objectDefIdCount = 0;
+	if( aObjectDefs )
+		{
+		objectDefIdCount = aObjectDefs->Count();
+
+		criteriaBufferSize += objectDefIdCount * 
+				CMdCSerializationBuffer::KRequiredSizeForTDefId;
+		}
+
+	// Required size for conditions
+	criteriaBufferSize += aRootCondition.RequiredBufferSize();
+
+	// Required size for order rule offsets
+	const TInt orderRuleCount = aOrderRules.Count();
+	criteriaBufferSize += orderRuleCount * 
+			CMdCSerializationBuffer::KRequiredSizeForTUint32;
+
+	// Required size for order rules
+	for( TInt i = 0; i < orderRuleCount; i++ )
+		{
+		criteriaBufferSize += aOrderRules[i].RequiredBufferSize();
+		}
+
+	// Required size for property filters
+	TUint32 propertyFilterCount = 0;
+	if( aPropertyFilter )
+		{
+		propertyFilterCount = aPropertyFilter->Count();
+		
+		criteriaBufferSize += propertyFilterCount * 
+			CMdCSerializationBuffer::KRequiredSizeForTDefId;
+		}
+
+	// Reserve buffer
+	iSerializedBuffer = CMdCSerializationBuffer::NewL( criteriaBufferSize );
+
+	// Insert data to search criteria
+
+	TMdCSearchCriteria criteria;
+	criteria.iQueryResultType = aResultMode;
+	criteria.iQueryType = aQueryType;
+	criteria.iNamespaceDefId = aNamespaceDef.Id();
+
+	if( aObjectDef )
+		{
+		criteria.iObjectDefId = aObjectDef->Id();
+		}
+	else
+		{
+		criteria.iObjectDefId = KNoDefId;
+		}
+
+	criteria.iObjectDefIds.iPtr.iCount = objectDefIdCount;
+	// init offset to "zero", will be updated later if needed
+	criteria.iObjectDefIds.iPtr.iOffset = KNoOffset;
+
+	criteria.iLimit = aLimit;
+	criteria.iOffset = aOffset;
+	criteria.iOptimizationFlags = aQueryOptimizationFlags;
+
+	// init offset to "zero", will be updated later
+	criteria.iRootCondition = KNoOffset;
+
+	criteria.iOrderRules.iPtr.iCount = orderRuleCount;
+	// init offset to "zero", will be updated later if needed
+	criteria.iOrderRules.iPtr.iOffset = KNoOffset;
+
+	criteria.iPropertyFilters.iPtr.iCount = propertyFilterCount;
+	// init offset to "zero", will be updated later if needed
+	criteria.iPropertyFilters.iPtr.iOffset = KNoOffset;
+
+	// Insert data to serialized buffer
+
+	// Position after search criteria
+	const TUint32 afterCriteriaOffset = sizeof( TMdCSearchCriteria );
+
+	// Move to position after search criteria
+	iSerializedBuffer->PositionL( afterCriteriaOffset );
+
+	if( aObjectDefs )
+		{
+		// Update object defs offset to search criteria
+		criteria.iObjectDefIds.iPtr.iOffset = afterCriteriaOffset;
+
+		// Update object defs count
+		for( TUint32 i = 0; i < objectDefIdCount; i++ )
+			{
+			TDefId defId = (*aObjectDefs)[i]->Id();
+			iSerializedBuffer->InsertL( defId );
+			}
+		}
+
+	// Update root condition offset to position after search criteria 
+	// (and possible object defs IDs)
+	criteria.iRootCondition = iSerializedBuffer->Position();
+
+	TUint32 offset = KNoOffset;
+	// Insert root condition to serialized buffer
+	aRootCondition.SerializeL( *iSerializedBuffer, offset );
+
+	// move position after conditions
+	iSerializedBuffer->PositionL( offset );
+	
+	if( orderRuleCount > 0 )
+		{
+		// Update order rule offset to position after search criteria 
+		// (and possible object defs IDs) and root condition
+		criteria.iOrderRules.iPtr.iOffset = iSerializedBuffer->Position();
+
+		for( TUint32 i = 0; i < orderRuleCount; i++)
+			{
+			// Insert current order rule
+			aOrderRules[i].SerializeL( *iSerializedBuffer, offset );
+			}
+		}
+
+	// move position after order rules
+	iSerializedBuffer->PositionL( offset );
+	
+	if( aPropertyFilter )
+		{
+		// Update order property filter offset to position after search 
+		// criteria (and possible object defs IDs), 
+		// root condition and order rules
+		criteria.iPropertyFilters.iPtr.iOffset = iSerializedBuffer->Position();
+
+		for( TUint32 i = 0; i < propertyFilterCount; i++ )
+			{
+			CMdEPropertyDef* propertyDef = (*aPropertyFilter)[i];
+			iSerializedBuffer->InsertL( propertyDef->Id() );
+			}
+		}
+
+	// move buffer to begin and serialize search criteria
+	iSerializedBuffer->PositionL( KNoOffset );
+	criteria.SerializeL( *iSerializedBuffer );
+	}