metadataengine/client/src/mderelationcondition.cpp
changeset 0 c53acadfccc6
child 40 910a23996aa0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataengine/client/src/mderelationcondition.cpp	Mon Jan 18 20:34:07 2010 +0200
@@ -0,0 +1,341 @@
+/*
+* 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:  ?Description
+*
+*/
+
+#include "mderelationcondition.h"
+#include "mderelationdef.h"
+#include "mdelogiccondition.h"
+#include "mdscommoninternal.h"
+#include "mdcserializationbuffer.h"
+#include "mdcquery.h"
+
+CMdERelationCondition* CMdERelationCondition::NewL( TItemId aRelationId,
+		const RArray<TItemId>* aRelationIds, TRelationConditionSide aSide,
+		const CMdERelationDef* aRelationDef, 
+		const TMdEIntRange* aParameterRange )
+	{
+	CMdERelationCondition* self = CMdERelationCondition::NewLC(
+			aRelationId, aRelationIds, aSide, aRelationDef, aParameterRange );
+    CleanupStack::Pop( self );
+    return self;
+	}
+
+CMdERelationCondition* CMdERelationCondition::NewLC( TItemId aRelationId,
+		const RArray<TItemId>* aRelationIds, TRelationConditionSide aSide,
+		const CMdERelationDef* aRelationDef, 
+		const TMdEIntRange* aParameterRange )
+	{
+	CMdERelationCondition* self = new ( ELeave ) CMdERelationCondition( 
+			aRelationId, aSide, aRelationDef );
+    CleanupStack::PushL( self );
+    self->ConstructL( aRelationIds, aParameterRange );
+    return self;
+	}
+
+CMdERelationCondition::CMdERelationCondition( TItemId aRelationId, 
+		TRelationConditionSide aSide, const CMdERelationDef* aRelationDef )
+		: CMdECondition( EConditionTypeRelation ), iRelationId( aRelationId ),
+		  iRelationDef( aRelationDef ), iSide( aSide )
+	{
+	iRelationIds = NULL;
+	iParameterRange = NULL;
+	iRightCondition = NULL;
+	iLeftCondition = NULL;
+	}
+
+void CMdERelationCondition::ConstructL(const RArray<TItemId>* aRelationIds, 
+		const TMdEIntRange* aParameterRange)
+    {
+    // Base class construction.
+    ConditionConstruct();
+
+    if( aRelationIds )
+    	{
+    	iRelationIds = new (ELeave) RArray<TItemId>();
+    	
+    	const TInt relationIdCount = aRelationIds->Count();
+    	iRelationIds->ReserveL( relationIdCount );
+    	
+    	for( TInt i = 0; i < relationIdCount; i++ )
+    		{
+    		iRelationIds->AppendL( (*aRelationIds)[i] );
+    		}
+    	}
+
+    if( aParameterRange )
+        {
+        // Make a copy of the parameter range.
+        iParameterRange = new (ELeave) TMdEIntRange(*aParameterRange);
+        }
+    }
+
+CMdERelationCondition::~CMdERelationCondition()
+    {
+   	delete iLeftCondition;
+   	delete iRightCondition;
+   	delete iParameterRange;
+	delete iLastModifiedDateRange;
+
+	if( iRelationIds )
+		{
+		iRelationIds->Close();
+		delete iRelationIds;
+		}
+    }
+
+EXPORT_C TItemId CMdERelationCondition::RelationId() const
+    {   
+    return iRelationId;
+    }
+
+EXPORT_C const RArray<TItemId>* CMdERelationCondition::RelationIds() const
+	{   
+	return iRelationIds;
+	}
+
+EXPORT_C const CMdERelationDef* CMdERelationCondition::RelationDef() const
+    {   
+    return iRelationDef;
+    }
+
+EXPORT_C CMdELogicCondition& CMdERelationCondition::LeftL()
+    {
+    if ( !iLeftCondition )
+    	{
+    	iLeftCondition = CMdELogicCondition::NewL(ELogicConditionOperatorAnd);
+    	}
+    
+    return *iLeftCondition;
+    }
+
+EXPORT_C CMdELogicCondition& CMdERelationCondition::RightL()
+    {
+    if ( !iRightCondition )
+    	{
+    	iRightCondition = CMdELogicCondition::NewL(ELogicConditionOperatorAnd);
+    	}
+
+    return *iRightCondition;
+    }
+
+TRelationConditionSide CMdERelationCondition::Side() const
+	{
+	return iSide;
+	}
+
+EXPORT_C void CMdERelationCondition::SetSide(TRelationConditionSide aSide)
+    {
+    iSide = aSide;
+    }
+
+
+EXPORT_C const TMdEIntRange* CMdERelationCondition::ParameterRange() const
+    {
+    return iParameterRange;
+    }
+
+EXPORT_C void CMdERelationCondition::SetGuid(const TInt64& aGuidHigh, const TInt64& aGuidLow)
+	{
+	iGuidHigh = aGuidHigh;
+	iGuidLow = aGuidLow;
+	}
+
+EXPORT_C TBool CMdERelationCondition::Guid(TInt64& aGuidHigh, TInt64& aGuidLow) const
+	{
+	if( iGuidHigh == 0 && iGuidLow == 0 )
+		{
+		return EFalse;
+		}
+	
+	aGuidHigh = iGuidHigh;
+	aGuidLow = iGuidLow;
+	return ETrue;
+	}
+
+EXPORT_C void CMdERelationCondition::SetLastModifiedDateRangeL(const TMdETimeRange& aLastModifiedDateRange)
+	{
+	if( !iLastModifiedDateRange )
+		{
+		iLastModifiedDateRange = new (ELeave) TMdETimeRange( aLastModifiedDateRange );
+		}
+	}
+
+EXPORT_C TBool CMdERelationCondition::LastModifiedDateRange(TMdETimeRange& aLastModifiedDateRange) const
+	{
+	if( iLastModifiedDateRange )
+		{		
+		aLastModifiedDateRange.SetType( iLastModifiedDateRange->Type() );
+		aLastModifiedDateRange.SetMin( iLastModifiedDateRange->Min() );
+		aLastModifiedDateRange.SetMax( iLastModifiedDateRange->Max() );
+		return ETrue;
+		}
+	
+	return EFalse;
+	}
+
+TUint32 CMdERelationCondition::InternalQueryOptimizationFlags(TUint32& aFlags)
+	{
+	aFlags |= EContainsRelationCondition;
+	return EContainsRelationCondition;
+	}
+
+TUint32 CMdERelationCondition::RequiredBufferSize() const
+	{
+	TUint32 bufferSize = sizeof( TMdCRelationCondition );
+
+	if( iRelationIds )
+		{
+		// count and IDs
+		bufferSize += CMdCSerializationBuffer::KRequiredSizeForTUint32 + 
+			iRelationIds->Count() * CMdCSerializationBuffer::KRequiredSizeForTItemId;
+		}	
+
+	if( iGuidHigh != 0 || iGuidLow != 0 )
+		{
+		bufferSize += 2 * CMdCSerializationBuffer::KRequiredSizeForTInt64;
+		}
+
+	if ( iParameterRange )
+		{
+		bufferSize += iParameterRange->RequiredBufferSize();
+		}
+
+	if ( iLeftCondition && iLeftCondition->Count() > 0 )
+		{
+		bufferSize += iLeftCondition->RequiredBufferSize();
+		}
+
+	if ( iRightCondition && iRightCondition->Count() > 0  )
+		{
+		bufferSize += iRightCondition->RequiredBufferSize();
+		}
+
+	if( iLastModifiedDateRange )
+		{
+		bufferSize += iLastModifiedDateRange->RequiredBufferSize();
+		}
+
+	return bufferSize;
+	}
+
+void CMdERelationCondition::SerializeL(CMdCSerializationBuffer& aBuffer,
+		TMdCOffset& aFreespaceOffset) const
+	{
+	TMdCRelationCondition condition;
+
+	condition.iConditionType = iType;
+	condition.iNegated = iNegated;
+	condition.iObjectSide = iSide;
+
+	if( iRelationDef )
+		{
+		condition.iRelationDefId = iRelationDef->Id();
+		}
+	else
+		{
+		condition.iRelationDefId = KNoDefId;
+		}
+
+	condition.iRelationId = iRelationId;
+
+	// updated later, if relation IDs exists
+	condition.iRelationIds.iPtr.iCount = 0;
+	condition.iRelationIds.iPtr.iOffset = KNoOffset;
+	// updated later, if GUID exists
+	condition.iGuid = KNoOffset;
+	// updated later, if parameter range exists
+	condition.iParameterRange = KNoOffset;
+	// updated later, if left object condition exists
+	condition.iLeftObjectCondition = KNoOffset;
+	// updated later, if right object condition exists
+	condition.iRightObjectCondition = KNoOffset;
+	// updated later, if last modified date range exists
+	condition.iLastModifiedDateRange = KNoOffset;
+
+	const TUint32 conditionOffset = aBuffer.Position();
+
+	// get position after condition
+	aFreespaceOffset = conditionOffset + sizeof( TMdCRelationCondition );
+	aBuffer.PositionL( aFreespaceOffset );
+
+	if( iRelationIds )
+		{
+		condition.iRelationIds.iPtr.iCount = iRelationIds->Count();
+		condition.iRelationIds.iPtr.iOffset = aFreespaceOffset;
+		
+		const TInt relationIdCount = iRelationIds->Count();
+		for( TInt i = 0; i < relationIdCount; i++ )
+			{
+			const TItemId relationId = (*iRelationIds)[i];
+			aBuffer.InsertL( relationId );
+			}
+		
+		aFreespaceOffset = aBuffer.Position();
+		}
+	
+	if( iGuidHigh != 0 || iGuidLow != 0 )
+		{
+		condition.iGuid = aFreespaceOffset;
+
+		aBuffer.InsertL( iGuidHigh );
+		aBuffer.InsertL( iGuidLow );
+		
+		aFreespaceOffset = aBuffer.Position();
+		}
+
+	if ( iParameterRange )
+		{
+		condition.iParameterRange = aFreespaceOffset;
+
+		iParameterRange->SerializeL( aBuffer );
+
+		aFreespaceOffset = aBuffer.Position();
+		}
+
+	if ( iLeftCondition && iLeftCondition->Count() > 0  )
+		{
+		condition.iLeftObjectCondition = aFreespaceOffset;
+
+		iLeftCondition->SerializeL( aBuffer, aFreespaceOffset );
+
+		aFreespaceOffset = aBuffer.Position();
+		}
+
+	if ( iRightCondition && iRightCondition->Count() > 0  )
+		{
+		condition.iRightObjectCondition = aFreespaceOffset;
+
+		iRightCondition->SerializeL( aBuffer, aFreespaceOffset );
+
+		aFreespaceOffset = aBuffer.Position();
+		}
+
+	if ( iLastModifiedDateRange )
+		{
+		condition.iLastModifiedDateRange = aFreespaceOffset;
+
+		iLastModifiedDateRange->SerializeL( aBuffer );
+
+		aFreespaceOffset = aBuffer.Position();
+		}
+
+	aBuffer.PositionL( conditionOffset );
+	
+	condition.SerializeL( aBuffer );
+	
+	// move back to after sub condition
+	aBuffer.PositionL( aFreespaceOffset );
+	}