diff -r 000000000000 -r e35f40988205 xml/xmldomandxpath/src/xmlenginedom/xmlengxpathevaluationcontext_impl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/xmldomandxpath/src/xmlenginedom/xmlengxpathevaluationcontext_impl.cpp Thu Dec 17 09:29:21 2009 +0200 @@ -0,0 +1,144 @@ +// Copyright (c) 2006-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 evaluation context implementation +// + +#include "xmlengdomdefs.h" +#include "xmlengxpathevaluationcontext_impl.h" +#include +#include +#include +#include + +TUint TXmlEngXPathEvaluationContextImpl::ArgCount() + { + return iArgCount; + } + +const RXmlEngXPathResult TXmlEngXPathEvaluationContextImpl::Argument( + TUint aIndex ) + { + XE_ASSERT_DEBUG(aIndex < iArgCount); + // "Peeking" a value from a XPath-expression evaluation stack + return RXmlEngXPathResult(iContext->valueTab[iContext->valueNr - (iArgCount - aIndex)]); + } + +const RXmlEngXPathResult TXmlEngXPathEvaluationContextImpl::Result() + { + XE_ASSERT_DEBUG(iCurrentResult); + if (iCurrentResult->type != XPATH_NODESET && + iCurrentResult->nodesetval) + { + xmlXPathFreeNodeSet(iCurrentResult->nodesetval); + iCurrentResult->nodesetval = NULL; + } + if (iCurrentResult->type != XPATH_STRING && iCurrentResult->stringval) + { + xmlFree(iCurrentResult->stringval); + iCurrentResult->stringval = NULL; + } + return RXmlEngXPathResult(iCurrentResult); + } + +void TXmlEngXPathEvaluationContextImpl::InitializeNodeSetResult() + { + XE_ASSERT_DEBUG(iCurrentResult); + iCurrentResult->nodesetval = xmlXPathNodeSetCreate(NULL); + if(iCurrentResult->nodesetval) + { + iCurrentResult->type = XPATH_NODESET; + } + // else OOM happened and will be handled later + } + +void TXmlEngXPathEvaluationContextImpl::AppendToResult( + const TXmlEngNode aNode ) + { + if(OOM_FLAG) + return; // Do nothing in OOM + if (aNode.NodeType() != TXmlEngNode::ENamespaceDeclaration) + { + xmlXPathNodeSetAdd(iCurrentResult->nodesetval, INTERNAL_NODEPTR(*const_cast(&aNode))); + } + } +void TXmlEngXPathEvaluationContextImpl::AppendToResult( + const TXmlEngNamespace aAppendedNsNode, + const TXmlEngElement aNsParentNode) + { + XE_ASSERT_DEBUG(iCurrentResult); + + if(OOM_FLAG) + return; // Do nothing in OOM + // Add a copy of namespace node with special function + xmlXPathNodeSetAddNs(iCurrentResult->nodesetval, + INTERNAL_NODEPTR(*const_cast(&aNsParentNode)), + INTERNAL_NSPTR(*const_cast(&aAppendedNsNode))); + } + +void TXmlEngXPathEvaluationContextImpl::AppendToResult( + const RXmlEngNodeSet aNodeSet ) + { + if(OOM_FLAG) + return; // Do nothing in OOM + xmlXPathNodeSetMerge(iCurrentResult->nodesetval, INTERNAL_NODESETPTR(aNodeSet)); + iCurrentResult->type = XPATH_NODESET; + } + +void TXmlEngXPathEvaluationContextImpl::SetResult( + TReal aNumber ) + { + XE_ASSERT_DEBUG(iCurrentResult); + iCurrentResult->type = XPATH_NUMBER; + iCurrentResult->floatval = aNumber; + } + +void TXmlEngXPathEvaluationContextImpl::SetResult( + TBool aBoolean ) + { + XE_ASSERT_DEBUG(iCurrentResult); + iCurrentResult->type = XPATH_BOOLEAN; + iCurrentResult->boolval = (aBoolean != 0); + } + +void TXmlEngXPathEvaluationContextImpl::SetResultL( + const TDesC8& aString ) + { + // Note: OOM flag is checked later (otherwise, there are two checks in the function) + xmlChar* copy = xmlCharFromDesC8L(aString); + + iCurrentResult->type = XPATH_STRING; + if(iCurrentResult->stringval) + xmlFree(iCurrentResult->stringval); + iCurrentResult->stringval = copy; + } + +// --------------------------------------------- Impementation-specific methods +/** +Allocates memory for function result + +@return TRUE is succeeded, FALSE if OOM has happened +*/ +TBool TXmlEngXPathEvaluationContextImpl::Initialize() + { + iCurrentResult = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if(iCurrentResult) + memset(iCurrentResult, 0, (size_t)sizeof(xmlXPathObject)); + iCurrentResult->type = XPATH_STRING; + return (TBool)iCurrentResult; + } + +void* TXmlEngXPathEvaluationContextImpl::ExtendedContext() + { + return iContext->comp->extendedContext; + }