diff -r fe894bb075c2 -r 79f826a55db2 mds_plat/metadata_engine_api/inc/mdelogiccondition.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mds_plat/metadata_engine_api/inc/mdelogiccondition.h Wed Oct 06 15:08:08 2010 +0300 @@ -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 + +#include +#include +#include +#include + + +/* 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& 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 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& 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 ETrue to lock; + * EFalse 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 iChildren; + + TUint32 iOptimizationFlags; + }; + +#endif // __MDELOGICCONDITION_H__