blob: ba7b8067838bfa1b9d1c4e4df7904da9e4a9bca7 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* XSEC
*
* XSECC14n20010315 := Canonicaliser object to process XML document in line with
* RFC 3076
*
* Author(s): Berin Lautenbach
*
* $Id$
*
*/
#ifndef XSECC14n20010315_INCLUDE
#define XSECC14n20010315_INCLUDE
//XSEC includes
#include <xsec/framework/XSECDefs.hpp>
#include <xsec/utils/XSECSafeBuffer.hpp>
#include <xsec/utils/XSECXPathNodeList.hpp>
#include <xsec/canon/XSECCanon.hpp>
#include <xsec/canon/XSECXMLNSStack.hpp>
#include <xercesc/framework/XMLFormatter.hpp>
// General includes
#include <memory.h>
#include <vector>
XSEC_USING_XERCES(XMLFormatter);
XSEC_USING_XERCES(XMLFormatTarget);
class XSECSafeBufferFormatter;
// --------------------------------------------------------------------------------
// Simple structure for holding a list of nodes
// --------------------------------------------------------------------------------
// NOTE: We don't use NamedNodeMap or DOMNodeList as we are unsure what might happen
// to them in the future. Also, to add items we would have to delve into the inards
// of Xerces (and use the "...impl" classes). Such an approach might not be supported
// in the future.
struct XSECNodeListElt {
XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *element; // Element referred to
safeBuffer sortString; // The string that is used to sort the nodes
XSECNodeListElt *next,
*last; // For the list
};
// Used for the sorting function
#define XMLNS_PREFIX "a"
#define ATTRIBUTE_PREFIX "b"
#define NOURI_PREFIX "a"
#define HAVEURI_PREFIX "b"
// --------------------------------------------------------------------------------
// XSECC14n20010315 Object definition
// --------------------------------------------------------------------------------
class XSEC_EXPORT XSECC14n20010315 : public XSECCanon {
#if defined(XALAN_NO_NAMESPACES)
typedef vector<char *> CharListVectorType;
#else
typedef std::vector<char *> CharListVectorType;
#endif
#if defined(XALAN_SIZE_T_IN_NAMESPACE_STD)
typedef std::size_t size_type;
#else
typedef size_t size_type;
#endif
public:
// Constructors
XSECC14n20010315();
XSECC14n20010315(XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *newDoc);
XSECC14n20010315(XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *newDoc,
XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *newStartNode);
virtual ~XSECC14n20010315();
// XPath processor
int XPathSelectNodes(const char * XPathExpr);
void setXPathMap(const XSECXPathNodeList & map);
// Comments processing
void setCommentsProcessing(bool onoff);
bool getCommentsProcessing(void);
// Exclusive processing
void setExclusive(void);
void setExclusive(char * xmlnsList);
// Inclusive 1.1 processing
void setInclusive11(void);
// Namespace processing
void setUseNamespaceStack(bool flag) {m_useNamespaceStack = flag;}
protected:
// Implementation of virtual function
XMLSize_t processNextNode();
// Test whether a name space is in the non-exclusive list
bool inNonExclNSList(safeBuffer &ns);
private:
void init();
bool checkRenderNameSpaceNode(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *e,
XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *a);
void stackInit(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * n);
// For formatting the buffers
XSECSafeBufferFormatter * mp_formatter;
safeBuffer m_formatBuffer;
// For holding state whilst walking the DOM tree
XSECNodeListElt * mp_attributes, // Start of list
* mp_currentAttribute, // Where we currently are in list
* mp_firstNonNsAttribute; // First NON XMLNS element in list
XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * mp_attributeParent; // To return up the tree
bool m_returnedFromChild; // Did we get to this node from below?
XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * mp_firstElementNode; // The root element of the document
bool m_firstElementProcessed; // Has the first node been handled?
// For XPath evaluation
bool m_XPathSelection; // Are we doing an XPath?
XSECXPathNodeList m_XPathMap; // The elements in the XPath
// For comment processing
bool m_processComments; // Whether comments are in or out (in by default)
// For exclusive canonicalisation
CharListVectorType m_exclNSList;
bool m_exclusive;
bool m_exclusiveDefault;
// For Inclusive 1.1 support
bool m_incl11;
// How do we handle namespaces?
// Use the namespace stack if name space expansion has not been run on the document.
// NOTE : Using the name space stack *will* cause problems if a full XPath expression
// has been run to select the input nodeset. Otherwise we should be fine.
bool m_useNamespaceStack;
XSECXMLNSStack m_nsStack;
};
#endif /* XSECC14n20010315_INCLUDE */