--- /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__