/**
 * 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
 *
 * DSIGTransform := Base (virtual) class that defines a DSIG Transform
 *
 * Author(s): Berin Lautenbach
 *
 * $Id$
 *
 */

#ifndef DSIGTRANSFORM_INCLUDE
#define DSIGTRANSFORM_INCLUDE

#include <xsec/dsig/DSIGConstants.hpp>
#include <xsec/framework/XSECDefs.hpp>

XSEC_DECLARE_XERCES_CLASS(DOMNode);
XSEC_DECLARE_XERCES_CLASS(DOMElement);
XSEC_DECLARE_XERCES_CLASS(DOMDocument);

#include <stdio.h>

class XSECEnv;
class TXFMChain;

/**
 * @ingroup pubsig
 */

/**
 * @brief The base class for transforms.
 *
 * The DSIGTransform class is the base class used to hold \<Transform\> elements
 * within a document.
 *
 * It does not in actually perform any transformations - only hold the information
 * about a transform in a \<Signature\> structure.
 *
 * @see TXFMBase
 *
 */


class XSEC_EXPORT DSIGTransform {

public:

	/** @name Constructors and Destructors */
    //@{
	
    /**
	 * \brief Contructor used for existing XML signatures.
	 *
	 * The Node structure already exists, so this type of Transform constructor
	 * will generally read the nodes in.
	 *
	 * @note DSIGTransform structures should only ever be created via calls to a
	 * DSIGTransformList object.
	 *
	 * @param env The environment in which this transform operates
	 * @param node The DOM node (within doc) that is to be used as the base of the Transform.
	 * @see #load
	 */

	DSIGTransform(const XSECEnv * env, XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * node) : 
		  mp_txfmNode(node),
		  mp_env(env) {};

    /**
	 * \brief Contructor used for new signatures.
	 *
	 * The Node structure will have to be created by the implementation class
	 *
	 * @note DSIGTransform structures should only ever be created via calls to a
	 * DSIGTransformList object.
	 *
	 * @param env The environment descriptor for the object
	 *
	 */

	DSIGTransform(const XSECEnv * env) : 
		  mp_txfmNode(NULL),
		  mp_env(env) {};

		  
	/**
	 * \brief Destructor.
	 *
	 * Destroy the DSIGSignature elements.
	 *
	 * Does not destroy any associated DOM Nodes
	 */
		  
	virtual ~DSIGTransform() {};
	
	//@}

	/** @name Interface Methods */

	//@{

	/**
	 * \brief Create the transformer element and append to an existing Chain.
	 *
	 * Implemented by each Transform class and used by the DSIGSignature
	 * to construct a complete Transform chain (TXFMChain).
	 */

	virtual void appendTransformer(TXFMChain * input) = 0;

	/**
	 * \brief Construct a new transform.
	 *
	 * Instruct the implementation to create the required
	 * transform and return the newly constructed DOMNode structure
	 */

	virtual XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * 
		createBlankTransform(XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * parentDoc) = 0;

	/**
	 * \brief Load a DOM structure
	 *
	 * Take the original node and load any sub nodes in the transform
	 * (if necessary)
	 */

	virtual void load(void) = 0;

	//@}

protected:

	/** @name Utility Functions */

	//@{

	/**
	 * \brief Create the basic node structure of a transform
	 *
	 */

	XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * createTransformNode();


	XERCES_CPP_NAMESPACE_QUALIFIER DOMNode					
							* mp_txfmNode;			// The node that we read from
	const XSECEnv			* mp_env;	// Owning signature

private:

	DSIGTransform();
	DSIGTransform(const DSIGTransform &theOther);

};



#endif /* #define DSIGTRANSFORM_INCLUDE */
