mds_plat/metadata_engine_api/inc/mdelogiccondition.h
changeset 0 c53acadfccc6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mds_plat/metadata_engine_api/inc/mdelogiccondition.h	Mon Jan 18 20:34:07 2010 +0200
@@ -0,0 +1,656 @@
+/*
+* 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
+*
+*/
+
+
+#ifndef __MDELOGICCONDITION_H__
+#define __MDELOGICCONDITION_H__
+
+
+#include <e32std.h>
+
+#include <mdecondition.h>
+#include <mderange.h>
+#include <mderangepropertycondition.h>
+#include <mdetextpropertycondition.h>
+
+
+/* Forward declarations. */
+class CMdEBoolPropertyCondition;
+class CMdEObjectDef;
+class CMdEPropertyDef;
+class CMdERelationDef;
+class CMdEEventDef;
+class CMdCSerializationBuffer;
+class CMdEEventCondition;
+class CMdEObjectCondition;
+class CMdEPropertyCondition;
+class CMdERelationCondition;
+
+/**
+ * Logic conditions are used for combining other conditions with boolean
+ * AND or OR operators. Each logic condition can have an unlimited number of
+ * child conditions. The same operator is applied to all of the child 
+ * conditions: (X and Y and Z), (X or Y or Z).
+ *
+ * CMdELogicCondition provides a number of factory methods for creating and
+ * adding new nodes as children of the logic condition node. Always use the
+ * factory methods when constructing a query condition tree.
+ *
+ * A logic condition node owns all of its children.
+ */
+NONSHARABLE_CLASS(CMdELogicCondition) : public CMdECondition
+	{
+public:
+
+	/* Constructors and destructor. */
+
+    /**
+     * Constructs a new logic condition node.
+     *
+     * @param aOperator  Operator to use for the child conditions.
+     */
+    IMPORT_C static CMdELogicCondition* NewL(TLogicConditionOperator aOperator);
+
+    /**
+     * Constructs a new logic condition node, leaving the node on the 
+     * cleanup stack.
+     *
+     * @param aOperator  Operator to use for the child conditions.
+     */
+    IMPORT_C static CMdELogicCondition* NewLC(TLogicConditionOperator aOperator);
+
+
+	/**
+	 * Destructor.
+	 */
+	virtual ~CMdELogicCondition();
+
+
+	/* Methods. */
+
+    /**
+     * Returns the operator of the logic condition.
+     *
+     * @return  Logic operator.
+     */
+    IMPORT_C TLogicConditionOperator Operator() const;
+
+    /**
+     * Changes the operator of the logic condition.
+     *
+     * @param aLogicOperator  The new logic operator for the condition.
+     *
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C void SetOperator(TLogicConditionOperator aLogicOperator);
+
+    /**
+     * Determines the number of child conditions.
+     *
+     * @return  Number of conditions in the logic operation.
+     */
+    IMPORT_C TInt Count() const;
+
+    /**
+     * Returns a child condition node.
+     *
+     * @param aIndex  Index of the condition to return.
+     *
+     * @return  Condition node at the specified index.
+     */
+    IMPORT_C CMdECondition& Condition(TInt aIndex) const;
+
+    /**
+     * Removes a condition node from the logic condition.
+     *
+     * @param aIndex  Index of the condition to remove.
+     *
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C void Remove(TInt aIndex);
+    
+
+    /* Factory methods for creating and adding new condition nodes into 
+     * the tree. */
+
+    /** 
+     * Creates a new logic condition and makes it a child condition of this
+     * logic condition node.
+     *
+     * @param aLogicOperator  Operator of the new logic condition.
+     *
+     * @return  Reference to the new condition node.
+     *
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdELogicCondition& AddLogicConditionL(TLogicConditionOperator aLogicOperator);
+
+    /** 
+     * Creates a new object condition and makes it a child condition of this
+     * logic condition node. The object condition node sets a requirement for
+     * the object class.
+     *
+     * Example:
+     *   // We want the condition to match with image objects.
+     *   CMdELogicCondition* condition = CMdELogicCondition::NewL( ELogicConditionOperatorAnd );
+     *   CleanupStack::PushL( condition );
+     *
+     *   CMdENamespaceDef& defaultNamespace = iMdeSession->GetDefaultNamespaceDefL();
+     *   CMdEObjectDef& imageDef = defaultNamespace.GetObjectDefL( MdeConstants::Image::KImageObject );
+     *   condition->AddObjectConditionL( imageDef );
+     * 
+     * @param aObjectDef     Object definition.
+     *
+     * @return  Reference to the new condition node.
+     *
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdEObjectCondition& 
+        AddObjectConditionL(const CMdEObjectDef& aObjectDef);
+
+    /**
+     * Creates a new object condition and makes it a child condition of this
+     * logic condition node. The object condition node sets a requirement for
+     * the object's ID number.
+     *
+     * Example:
+     *   CMdERelationQuery* relationQuery = iMdeSession->NewRelationQueryL( defNamespace, this );
+     *   CMdERelationCondition& filterCond = relationQuery->Conditions().
+     *	     AddRelationConditionL( ERelationConditionSideRight );
+     *   // Left object in relation must have this ID.
+     *   filterCond.LeftL().AddObjectConditionL( aObjectId );
+     * 
+     * @param aObjectId  ID number of the object.
+     *
+     * @return  Reference to the new condition node.
+     *
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdEObjectCondition& AddObjectConditionL(TItemId aObjectId);
+
+    /**
+     * Creates a new object condition and makes it a child condition of this
+     * logic condition node. The object condition node sets a requirement for
+     * the objects' ID numbers.
+     *
+     * @param aObjectId  ID numbers of objects.
+     *
+     * @return  Reference to the new condition node.
+     *
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     * 
+     */
+    IMPORT_C CMdEObjectCondition& AddObjectConditionL(
+    		const RArray<TItemId>& aObjectIds);
+
+    /**
+     * Creates a new object condition and makes it a child condition of this
+     * logic condition node. The object condition node sets a requirement for
+     * the object's GUID.
+     *
+     * @param aObjectGuidHigh  GUID high part of the object.
+     * @param aObjectGuidLow  GUID low part of the object.
+     *
+     * @return  Reference to the new condition node.
+     *
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdEObjectCondition& AddObjectConditionL(
+    		TInt64 aObjectGuidHigh, TInt64 aObjectGuidLow);
+
+    /**
+     * Creates a new object condition and makes it a child condition of this
+     * logic condition node. 
+     *
+     * @param aCompareMethod  Comparison method.
+     * @param aString         Text string to look for.
+     *
+     * @return  Reference to the new condition node.
+     *
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdEObjectCondition& AddObjectConditionL(
+    		TObjectConditionCompareMethod aCompareMethod, 
+    		const TDesC& aString);
+
+    /**
+     * Creates a new object condition and makes it a child condition of this
+     * logic condition node. 
+     *
+     * @param aRange  range for usage count
+     *
+     * @return  Reference to the new condition node.
+     *
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdEObjectCondition& AddObjectConditionL(
+    		const TMdEUintRange& aRange);
+
+    /**
+     * Creates a new property condition and makes it a child condition of this
+     * logic condition node. The property condition tests if a property 
+     * exists in an object.
+     *	
+     * Example:
+	 *   CMdEPropertyDef& commentDef = objDef.GetPropertyDefL( MdeConstants::MediaObject::KCommentProperty );
+	 *   iQuery->Conditions().AddPropertyConditionL( commentDef );				
+	 *
+     * @param aPropertyDef  The property to look for.
+     *
+     * @return  Reference to the new condition node.
+     *
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdEPropertyCondition& AddPropertyConditionL(
+    		const CMdEPropertyDef& aPropertyDef);
+
+    /**
+     * Creates a new boolean property condition and makes it a child 
+     * condition of this logic condition node. The property condition
+     * tests the value of a boolean property.
+     *
+     * Example:
+	 *   CMdEPropertyDef& commentDef = objDef.GetPropertyDefL( MdeConstants::MediaObject::KProtectedProperty );
+	 *   iQuery->Conditions().AddPropertyConditionL( commentDef, ETrue );	
+     * 
+     * @param aPropertyDef  Property definition.
+     * @param aBoolValue    Boolean value.
+     *
+     * @return  Reference to the new condition node.
+     *
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdEBoolPropertyCondition& AddPropertyConditionL(
+    		const CMdEPropertyDef& aPropertyDef, TBool aBoolValue);
+
+    /**
+     * Creates a new integer property condition and makes it a child 
+     * condition of this logic condition node. The property condition defines
+     * a range of integer values. If the property's value is within the range
+     * the condition evaluates to True.
+     *
+     * Example:
+	 *   CMdEPropertyDef& frameCountDef = objDef.GetPropertyDefL( MdeConstants::Image::FrameCount );
+	 *   iQuery->Conditions().AddPropertyConditionL( frameCountDef, TMdEIntRange(0, 5, rangeType) );
+     *
+     * @param aPropertyDef  Property definition.
+     * @param aIntRange     Range of integer values.
+     *
+     * @return  Reference to the new condition node.
+     *
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdEIntRangePropertyCondition& AddPropertyConditionL(
+    		const CMdEPropertyDef& aPropertyDef, 
+    		const TMdEIntRange& aIntRange);
+
+    /**
+     * Creates a new 64 bit integer property condition and makes it a child 
+     * condition of this logic condition node. The property condition defines
+     * a range of integer values. If the property's value is within the range
+     * the condition evaluates to True.
+     *
+     * @param aPropertyDef  Property definition.
+     * @param aInt64Range     Range of 64 bit integer values.
+     *
+     * @return  Reference to the new condition node.
+     *
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdEInt64RangePropertyCondition& AddPropertyConditionL(
+    		const CMdEPropertyDef& aPropertyDef,
+    		const TMdEInt64Range& aIntRange);
+
+    /**
+     * Creates a new unsigned integer property condition and makes it a child 
+     * condition of this logic condition node. The property condition defines
+     * a range of unsigned integer values. If the property's value is within 
+     * the range the condition evaluates to True.
+     *
+     * @param aPropertyDef  Property definition.
+     * @param aUintRange    Range of unsigned integer values.
+     *
+     * @return  Reference to the new condition node.
+     *
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdEUintRangePropertyCondition& AddPropertyConditionL(
+    		const CMdEPropertyDef& aPropertyDef,
+            const TMdEUintRange& aUintRange);
+
+    /**
+     * Creates a new floating-point property condition and makes it a child 
+     * condition of this logic condition node. The property condition defines
+     * a range of floating-point values. If the property's value is within 
+     * the range the condition evaluates to True.
+     *
+     * @param aPropertyDef  Property definition.
+     * @param aRealRange    Range of floating-point values.
+     *
+     * @return  Reference to the new condition node.
+     *
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdERealRangePropertyCondition& AddPropertyConditionL(
+    		const CMdEPropertyDef& aPropertyDef,
+            const TMdERealRange& aRealRange);
+
+    /**
+     * Creates a new time property condition and makes it a child 
+     * condition of this logic condition node. The property condition defines
+     * a range of time values. If the property's value is within the range
+     * the condition evaluates to True.
+     *
+     * @param aPropertyDef  Property definition.
+     * @param aTimeRange    Range of time values.
+     *
+     * @return  Reference to the new condition node.
+     *
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdETimeRangePropertyCondition& AddPropertyConditionL(
+    		const CMdEPropertyDef& aPropertyDef,
+            const TMdETimeRange& aTimeRange);
+
+    /**
+     * Creates a new text property condition and makes it a child condition 
+     * of this logic condition node.
+     *
+     * @param aPropertyDef   Property definition.
+     * @param aCompareMethod Comparison method.
+     * @param aText          Text string to look for.
+     * 
+     * @return Reference to the new condition node.
+     * 
+     * @panic TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdETextPropertyCondition& AddPropertyConditionL(
+    		const CMdEPropertyDef& aPropertyDef,
+    		TTextPropertyConditionCompareMethod aCompareMethod,
+            const TDesC& aText);
+
+    /**
+     * Creates a new relation condition and makes it a child condition of this
+     * logic condition node. The new relation condition contains no parameters
+     * by default. It is assumed that the relation condition is augmented
+     * with further conditions for the objects to which the relation is 
+     * attached.
+     *
+     * Example:
+     *   TItemId relationId( 1 );
+     *   CMdERelationCondition& relationCond = relationQuery->Conditions().
+     *		AddRelationConditionL( relationId, ERelationConditionSideRight );
+     * 
+     * @param aRelationId  Relation ID.
+     * @param aSide The side on which an object must be.
+     * 
+     * @return Reference to the new condition node.
+     * 
+     * @panic TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdERelationCondition& AddRelationConditionL(TItemId aRelationId, 
+    		TRelationConditionSide aSide = ERelationConditionSideEither);
+
+    /**
+     * Creates a new relation condition and makes it a child condition of this
+     * logic condition node. The new relation condition contains no parameters
+     * by default. It is assumed that the relation condition is augmented
+     * with further conditions for the objects to which the relation is 
+     * attached.
+     * 
+     * Example:
+     *   RArray<TItemId> arrayOfIds;
+     *   arrayOfIds.Append( TItemId( 1 ) );
+     *   arrayOfIds.Append( TItemId( 2 ) );
+     *   CMdERelationCondition& relationCond = relationQuery->Conditions().
+     *		AddRelationConditionL( arrayOfIds, ERelationConditionSideRight );
+     *
+     * @param aRelationIds Array of Relation IDs.
+     * @param aSide The side on which an object must be.
+     * 
+     * @return Reference to the new condition node.
+     * 
+     * @panic TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdERelationCondition& AddRelationConditionL(
+    		RArray<TItemId>& aRelationIds, 
+        	TRelationConditionSide aSide = ERelationConditionSideEither);
+    
+    /**
+     * Creates a new relation condition and makes it a child condition of this
+     * logic condition node. The new relation condition contains no parameters
+     * by default. It is assumed that the relation condition is augmented
+     * with further conditions for the objects to which the relation is 
+     * attached.
+     * 
+     * Example:
+     *   CMdERelationCondition& relationCond = relationQuery->Conditions().
+     *		AddRelationConditionL( ERelationConditionSideRight );
+     *
+     * @param aSide The side on which an object must be.
+     *
+     * @return Reference to the new condition node.
+     * 
+     * @panic TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdERelationCondition& AddRelationConditionL(
+        		TRelationConditionSide aSide = ERelationConditionSideEither);
+
+    /**
+     * Creates a new relation condition and makes it a child condition of this
+     * logic condition node. The new relation condition tests the relation's 
+     * type. The relation condition can be augmented with further conditions
+     * for the objects to which the relation is attached.
+     *
+	 * @param aRelationDef  relation definition
+     * @param aSide The side on which an object must be. Defaults to 
+     *              ERelationConditionSideEither.
+     * 
+     * @return Reference to the new condition node.
+     * 
+     * @panic TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdERelationCondition& AddRelationConditionL(
+    		const CMdERelationDef& aRelationDef, 
+    		TRelationConditionSide aSide = ERelationConditionSideEither);
+
+    /**
+     * Creates a new relation condition and makes it a child condition of this
+     * logic condition node. The new relation condition tests the relation's 
+     * type. The relation condition can be augmented with further conditions
+     * for the objects to which the relation is attached.
+     *
+	 * @param aRelationDef  relation definition
+     * @param aIntRange parameter range conditions
+     * @param aSide  The side on which an object must be.
+     * 
+     * @return  Reference to the new condition node.
+     * 
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdERelationCondition& AddRelationConditionL(
+    		const CMdERelationDef& aRelationDef, const TMdEIntRange& aIntRange,
+    		TRelationConditionSide aSide = ERelationConditionSideEither);
+
+
+    /**
+     * Creates a new event condition and makes it a child condition of this
+     * logic condition node. The new event condition contains no parameters
+     * by default. It is assumed that the event condition is augmented
+     * with further conditions for the object to which the event is attached.
+     * 
+     * @return  Reference to the new condition node.
+     * 
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdEEventCondition& AddEventConditionL();
+
+    /**
+     * Creates a new event condition and makes it a child condition of this
+     * logic condition node. The new event condition tests the event's type.
+     * The event condition can be augmented with further conditions
+     * for the object to which the event is attached.
+     * 
+     * @param aEventId  Event ID.
+     *
+     * @return  Reference to the new condition node.
+     * 
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdEEventCondition& AddEventConditionL(TItemId aEventId);
+
+    /**
+     * Creates a new event condition and makes it a child condition of this
+     * logic condition node. The new event condition tests the event's type.
+     * The event condition can be augmented with further conditions
+     * for the object to which the event is attached.
+     * 
+     * @param aEventDef  Event definition.
+     *
+     * @return  Reference to the new condition node.
+     * 
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdEEventCondition& AddEventConditionL(
+    		const CMdEEventDef& aEventDef);
+
+    /**
+     * Creates a new event condition and makes it a child condition of this
+     * logic condition node. The new event condition tests the event's 
+     * creation time. The event condition can be augmented with further 
+     * conditions for the object to which the event is attached.
+     * 
+     * @param aCreationTimeRange  Time range.
+     *
+     * @return  Reference to the new condition node.
+     * 
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdEEventCondition& AddEventConditionL(
+    		const TMdETimeRange& aCreationTimeRange);
+
+    /**
+     * Creates a new event condition and makes it a child condition of this
+     * logic condition node. The new event condition tests the event's 
+     * source or participant. The event condition can be augmented with 
+     * further conditions for the object to which the event is attached.
+     * 
+     * @param aCompareMethod  Comparison method.
+     * @param aString         Text string to look for.
+     *
+     * @return  Reference to the new condition node.
+     * 
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdEEventCondition& AddEventConditionL(
+    		TEventConditionCompareMethod aCompareMethod, const TDesC& aString);
+
+    /**
+     * Creates a new event condition and makes it a child condition of this
+     * logic condition node. The new event condition tests the event's 
+     * creation time. The new event condition also tests the event's 
+     * source or participant. The event condition can be augmented with 
+     * further conditions for the object to which the event is attached.
+     * 
+     * @param aCreationTimeRange  Time range.
+     * @param aCompareMethod      Comparison method.
+     * @param aString             Text string to look for.
+     *
+     * @return  Reference to the new condition node.
+     * 
+     * @panic  TMdEPanic::EConditionLocked  Condition node is locked.
+     */
+    IMPORT_C CMdEEventCondition& AddEventConditionL(
+    		const TMdETimeRange& aCreationTimeRange,
+            TEventConditionCompareMethod aCompareMethod, const TDesC& aString);
+
+    /**
+     * Locking a logic condition causes all children to be locked as well.
+     * Attempting to modify a locked condition causes a panic.
+     *
+     * @param aLocked  <code>ETrue</code> to lock; 
+     *                 <code>EFalse</code> to unlock.
+     */
+    void SetLocked(TBool aLocked = ETrue);
+    
+    /**
+     * Get possible query's internal optimization flags from condition.
+     *
+     * @param aFlaga query's internal optimization flags
+     * @return last level internal optimization flags
+     */
+    TUint32 InternalQueryOptimizationFlags(TUint32& aFlags);
+
+    /**
+     * Get required size of serialized buffer when this is serialized.
+     *
+     * @return required size of serialized buffer
+     */
+    TUint32 RequiredBufferSize() const;
+
+    /**
+     * Serialize own data to serialized buffer (correct position must be set 
+     * before calling).
+	 *
+     * @param aBuffer  serialized buffer.
+     */
+    void SerializeL(CMdCSerializationBuffer& aBuffer, 
+    		TMdCOffset& aFreespaceOffset) const;
+
+protected:
+
+	/* Constructors. */
+
+	/**
+	 * Constructor. 
+	 *
+	 * @param aOperator  Logic operator.
+	 */
+	CMdELogicCondition(TLogicConditionOperator aOperator);
+
+	/**
+	 * Second-phase constructor.
+	 */
+	void ConstructL();
+
+
+	/* Utility methods. */
+
+    /**
+     * Makes an existing condition node a child node of this logic condition.
+     * The logic condition takes ownership of the node.
+     *
+     * @param aCondition  Condition node.
+     *
+     * @return  Reference to the added node (aCondition).
+     */
+    CMdECondition& AddL(CMdECondition* aCondition);
+
+
+private:
+
+    /** Type of the condition. */
+    TLogicConditionOperator iOperator;
+
+    /** Children of the condition. The logic condition owns all the 
+        child nodes. */
+    RPointerArray<CMdECondition> iChildren;
+
+	TUint32 iOptimizationFlags;
+    };
+
+#endif  // __MDELOGICCONDITION_H__