diff -r 000000000000 -r e35f40988205 xml/xmldomandxpath/src/xmlenginedom/xmlengxpathevaluator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/xmldomandxpath/src/xmlenginedom/xmlengxpathevaluator.cpp Thu Dec 17 09:29:21 2009 +0200 @@ -0,0 +1,137 @@ +// Copyright (c) 2005-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: +// XPath evaluator functions +// + +#include "xmlengdomdefs.h" +#include +#include +#include +#include +#include +#include +#include +#include +// Default constructor +// -------------------------------------------------------------------------------------------- +// +EXPORT_C TXmlEngXPathEvaluator::TXmlEngXPathEvaluator() : iInstanceTrees(NULL) + { + } + +// -------------------------------------------------------------------------------------------- +// Precompiles and stores an XPath expression, which is returned to caller. +// +// @param[in] aExpression The expression as a string. +// @param[in] aResolver An object that can resolve of namespace prefixes into namespace URIs +// @return Compiled XPath expression. +// +// May leave with KErrXPath code +// -------------------------------------------------------------------------------------------- +// +EXPORT_C RXmlEngXPathExpression TXmlEngXPathEvaluator::CreateExpressionL( + const TDesC8& aExpression, + const MXmlEngNamespaceResolver* /* aResolver */) + { + xmlChar* exp = xmlCharFromDesC8L(aExpression); + xmlXPathCompExprPtr cExpr = xmlXPathCtxtCompile(NULL, exp); + delete exp; + if(xmlOOMFlag()) + { + xmlXPathFreeCompExpr(cExpr); + OOM_HAPPENED; + } + if(!cExpr) + { + XmlEngLeaveL(KXmlEngErrXPathSyntax); + } + + return RXmlEngXPathExpression(cExpr, iInstanceTrees); + } + +// -------------------------------------------------------------------------------------------- +// Evaluates the XPath expression given as parameter. The result is returned. +// +// @param[in] aExpression The expression as a string. +// @param[in] aContextNode The node relative to which the expression is evaluated. +// @param[in] aResolver (for future use) +// @return Result of evaluation as an RXmlEngXPathResult object. +// May leave with KXmlEngErrXPathSyntax code for invalid XPathExpression and KXmlEngErrXPathResult +// for undefined result of evaluation. +// -------------------------------------------------------------------------------------------- +// +EXPORT_C RXmlEngXPathResult TXmlEngXPathEvaluator::EvaluateL( + const TDesC8& aExpression, + const TXmlEngNode aContextNode, + const MXmlEngNamespaceResolver* /* aResolver */ ) + { + RXmlEngXPathExpression expr = CreateExpressionL(aExpression, NULL); + CleanupClosePushL(expr); + + RXmlEngXPathResult result = expr.EvaluateL(aContextNode); + CleanupStack::PopAndDestroy(&expr); + return result; + } + +// -------------------------------------------------------------------------------------------- +// Does the same as #evaluate, but as a side-effect calculates the dependency list of the +// expression. This is meant to be used by the XForms engine. +// +// @param[in] aExpression The expression as a string. +// @param[in] aContextNode The node relative to which the expression is evaluated. +// @param[in] aResolver (for future use) +// @param[in,out] aDependents After the method has returned, contains set of nodes that +// the expression is dependent on. +// @return Result of evaluation as an RXmlEngXPathResult object. +// +// May leave with KXmlEngErrXPathResult or KXmlEngErrXPathSyntax codes. +// -------------------------------------------------------------------------------------------- +// +EXPORT_C RXmlEngXPathResult TXmlEngXPathEvaluator::EvaluateWithDependenciesL( + const TDesC8& aExpression, + const TXmlEngNode aContextNode, + const MXmlEngNamespaceResolver* /* aResolver */, + RXmlEngNodeSet& aDependents ) + { + RXmlEngXPathExpression expr = CreateExpressionL(aExpression, NULL); + CleanupClosePushL(expr); + RXmlEngXPathResult result = expr.EvaluateWithDependenciesL(aContextNode, aDependents); + CleanupStack::PopAndDestroy(&expr); + return result; + } + +// -------------------------------------------------------------------------------------------- +// Registers the instance map to be used when evaluating XForms expressions. The map +// contains DOM Documents and their names. For example, when evaluating the expression +// "instance('a')" the evaluator looks up a Document that has the name "a" from the map. +// Method does not take owership, caller has to free the map. +// +// @param[in] aInstanceTrees The instance map. +// -------------------------------------------------------------------------------------------- +// +EXPORT_C void TXmlEngXPathEvaluator::SetInstanceMap( + CXmlEngXFormsInstanceMap* aInstanceTrees ) + { + iInstanceTrees = aInstanceTrees; + } + +// ----------------------------------------------------------------------------- +// Returns the registered instance map. +// @return pointer instance map or NULL if not registered. +// ----------------------------------------------------------------------------- +// +EXPORT_C CXmlEngXFormsInstanceMap* TXmlEngXPathEvaluator::InstanceMap() + { + return iInstanceTrees; + }