/**
 * 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
 *
 * XSECXMLNSStack := NS Stack for simple canonicalisation
 *
 * $Id$
 *
 */

#ifndef XSECXMLNSSTACK_INCLUDE
#define XSECXMLNSSTACK_INCLUDE

// XSEC
#include <xsec/framework/XSECDefs.hpp>

// Xerces

XSEC_DECLARE_XERCES_CLASS(DOMNode)

// General

#include <vector>
#include <stack>

// --------------------------------------------------------------------------------
//           Holder structures
// --------------------------------------------------------------------------------

struct XSECNSHolderStruct;
struct XSECNSElementStruct;

typedef struct XSECNSHolderStruct XSECNSHolder;
typedef struct XSECNSElementStruct XSECNSElement;

#if defined(XSEC_NO_NAMESPACES)
	typedef vector<XSECNSHolder *>				XSECNSHolderVectorType;
	typedef stack<XSECNSElement *>              XSECNSElementStackType;
#else
	typedef std::vector<XSECNSHolder *>			XSECNSHolderVectorType;
	typedef std::stack<XSECNSElement *>         XSECNSElementStackType;
#endif


// --------------------------------------------------------------------------------
//           The stack
// --------------------------------------------------------------------------------


class XSECXMLNSStack {

public:

	XSECXMLNSStack();
	~XSECXMLNSStack();

	// Stack functions
	void pushElement(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * elt);
	void popElement();

	// NS Functions
	void addNamespace(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * ns);
	XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *
		getFirstNamespace(void);
	XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *
		getNextNamespace(void);
	// Mark the namespace as printed
	void printNamespace(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * ns, 
		XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * elt);
	// Return whether the stack includes xmlns="something"
	bool isNonEmptyDefaultNS(void);

private:

	// The stack holds all the elements, with a linked list of NS nodes
	// THat were pushed in for each element
	XSECNSElementStackType m_elements;
	// The vector holds all the "currently visible" namespaces for this element
	XSECNSHolderVectorType m_currentNS;
	// Hold a pointer into the visible namespace list for the current element
	XSECNSHolderVectorType::iterator m_currentNSIterator;

};


#endif /* XSECXMLNSSTACK_INCLUDE */

