/**
 * 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
 *
 * XKMSMessageFactory := Interface for the factory used to produce XKMS msgs
 *
 * $Id: XKMSMessageFactory.hpp 1833340 2018-06-11 15:40:13Z scantor $
 *
 */

#ifndef XKMSMESSAGEFACTORY_INCLUDE
#define XKMSMESSAGEFACTORY_INCLUDE

// XSEC Includes

#include <xsec/framework/XSECDefs.hpp>

#ifdef XSEC_XKMS_ENABLED

#include <xsec/xkms/XKMSMessageAbstractType.hpp>
#include <xsec/xkms/XKMSResultType.hpp>

class DSIGSignature;
class XKMSCompoundRequest;
class XKMSCompoundResult;
class XKMSLocateRequest;
class XKMSLocateResult;
class XKMSRequestAbstractType;
class XKMSResult;
class XKMSValidateRequest;
class XKMSValidateResult;
class XKMSPendingRequest;
class XKMSStatusRequest;
class XKMSStatusResult;
class XKMSRegisterRequest;
class XKMSRegisterResult;
class XKMSRevokeResult;
class XKMSRevokeRequest;
class XKMSRecoverResult;
class XKMSRecoverRequest;
class XKMSReissueResult;
class XKMSReissueRequest;

XSEC_DECLARE_XERCES_CLASS(DOMElement);

/**
 * @defgroup xkms XML Key Management System Implementation
 *
 * <p>The classes in this group implement the W3C XKMS 2.0
 * specification.  Users should interact with these classes
 * via the XKMSMessageFactory class (for consuming and producing
 * XKMS messages) and the XKMSClient class (for actually
 * performing XKMS calls to a server)</p>
 *
 */
/*@{*/

/**
 * @brief Interface definition for the XKMSMessageFactory class
 *
 * The XKMSMessageFactory classes are used to provide an interface
 * to applicataions to produce and consume XKMS messages.  No logic
 * is defined within the class, other than that necessary to (for
 * example) generate a response message using a request message as
 * a base.
 *
 * Client apps that wish to make use of XKMS should generally use
 * the XKMSClient class.
 */


class XSEC_EXPORT XKMSMessageFactory {

	/** @name Constructors and Destructors */
	//@{

protected:

	XKMSMessageFactory() {};

public:

	virtual ~XKMSMessageFactory() {};

	/** @name Methods to build XKMS message objects from existing XML  */
	//@{

	/**
	 * \brief Load a message from an existing XML document
	 *
	 * Reads in the XML document and produces the corresponding XKMS
	 * message object.  Callers should make use of the ::getMessageType
	 * method to determine what type of message they are actually
	 * working with.
	 *
	 * @param elt The element at the head of the XKMS structure
	 */

	virtual XKMSMessageAbstractType * newMessageFromDOM(
		XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * elt) = 0;


	//@}

	/** @name Methods for building new X-KISS messages from scratch */
	//@{

	/**
	 * \brief Create a new \<CompoundRequest\> message.
	 * 
	 * Generates a new CompoundRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Document to create the DOM structure within.  The caller
	 * will need to embed the DOM structure at the appropriate place in the
	 * document (using a call to getElement to find the top level element)
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSCompoundRequest structure
	 */

	virtual XKMSCompoundRequest * createCompoundRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		const XMLCh * id = NULL) = 0;
		
	/**
	 * \brief Create a new \<CompoundRequest\> message and surrounding document
	 * 
	 * Generates a new CompoundRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSCompoundRequest structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleteing the CompoundRequest object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSCompoundRequest * createCompoundRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<LocateRequest\> message.
	 * 
	 * Generates a new LocateRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Document to create the DOM structure within.  The caller
	 * will need to embed the DOM structure at the appropriate place in the
	 * document (using a call to getElement to find the top level element)
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSLocateRequest structure
	 */

	virtual XKMSLocateRequest * createLocateRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		const XMLCh * id = NULL) = 0;
		
	/**
	 * \brief Create a new \<LocateRequest\> message and surrounding document
	 * 
	 * Generates a new LocateRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSLocateRequest structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleteing the LocateRequest object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSLocateRequest * createLocateRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<ValidateRequest\> message.
	 * 
	 * Generates a new ValidateRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Document to create the DOM structure within.  The caller
	 * will need to embed the DOM structure at the appropriate place in the
	 * document (using a call to getElement to find the top level element)
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSValidateRequest structure
	 */

	virtual XKMSValidateRequest * createValidateRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		const XMLCh * id = NULL) = 0;
		
	/**
	 * \brief Create a new \<ValidateRequest\> message and surrounding document
	 * 
	 * Generates a new ValidateRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSValidateRequest structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleting the LocateRequest object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSValidateRequest * createValidateRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<PendingRequest\> message.
	 * 
	 * Generates a new PendingRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Document to create the DOM structure within.  The caller
	 * will need to embed the DOM structure at the appropriate place in the
	 * document (using a call to getElement to find the top level element)
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSPendingRequest structure
	 */

	virtual XKMSPendingRequest * createPendingRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		const XMLCh * id = NULL) = 0;
		
	/**
	 * \brief Create a new \<PendingRequest\> message and surrounding document
	 * 
	 * Generates a new PendingRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSPendingRequest structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleting the PendingRequest object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSPendingRequest * createPendingRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<StatusRequest\> message.
	 * 
	 * Generates a new StatusRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Document to create the DOM structure within.  The caller
	 * will need to embed the DOM structure at the appropriate place in the
	 * document (using a call to getElement to find the top level element)
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSStatusRequest structure
	 */

	virtual XKMSStatusRequest * createStatusRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		const XMLCh * id = NULL) = 0;
		
	/**
	 * \brief Create a new \<StatusRequest\> message and surrounding document
	 * 
	 * Generates a new StatusRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSStatusRequest structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleting the StatusRequest object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSStatusRequest * createStatusRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<LocateResult\> message.
	 * 
	 * Generates a new LocateResult message from scratch, building the DOM
	 * as it goes.  The response will be based on a input LocateRequest message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new XKMSLocateResponse structure
	 */

	virtual XKMSLocateResult * createLocateResult(
		XKMSLocateRequest * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<LocateResult\> message and surrounding document
	 * 
	 * Generates a new LocateResult message from scratch, building the DOM
	 * as it goes.  The response will be based on a input LocateRequest message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new XKMSLocateResponse structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleteing the LocateRequest object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSLocateResult * createLocateResult(
		XKMSLocateRequest * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<ValidateResult\> message.
	 * 
	 * Generates a new ValidateResult message from scratch, building the DOM
	 * as it goes.  The response will be based on a input ValidateRequest message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new XKMSLocateResponse structure
	 */

	virtual XKMSValidateResult * createValidateResult(
		XKMSValidateRequest * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<ValidateResult\> message and surrounding document
	 * 
	 * Generates a new ValidateResult message from scratch, building the DOM
	 * as it goes.  The response will be based on a input ValidateRequest message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new XKMSValidateResponse structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleteing the ValidateRequest object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSValidateResult * createValidateResult(
		XKMSValidateRequest * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<CompoundResult\> message.
	 * 
	 * Generates a new CompoundResult message from scratch, building the DOM
	 * as it goes.  The response will be based on a input CompoundRequest message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new XKMSLocateResponse structure
	 */

	virtual XKMSCompoundResult * createCompoundResult(
		XKMSCompoundRequest * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<CompoundResult\> message and surrounding document
	 * 
	 * Generates a new CompoundResult message from scratch, building the DOM
	 * as it goes.  The response will be based on a input ValidateRequest message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new XKMSCompoundResponse structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleteing the ValidateRequest object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSCompoundResult * createCompoundResult(
		XKMSCompoundRequest * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<Result\> message.
	 * 
	 * Generates a new Result message from scratch, building the DOM
	 * as it goes.  The response will be based on an input Request message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new XKMSResult structure
	 */

	virtual XKMSResult * createResult(
		XKMSRequestAbstractType * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<Result\> message and surrounding document
	 * 
	 * Generates a new Result message from scratch, building the DOM
	 * as it goes.  The response will be based on a input Request message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new Response structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleting the Request object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSResult * createResult(
		XKMSRequestAbstractType * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<StatusResult\> message.
	 * 
	 * Generates a new StatusResult message from scratch, building the DOM
	 * as it goes.  The response will be based on a input StatusRequest message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new XKMSStatusRessult structure
	 */

	virtual XKMSStatusResult * createStatusResult(
		XKMSStatusRequest * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<StatusResult\> message and surrounding document
	 * 
	 * Generates a new StatusResult message from scratch, building the DOM
	 * as it goes.  The response will be based on a input StatusRequest message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new XKMSStatusResult structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleting the StatusResult object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSStatusResult * createStatusResult(
		XKMSStatusRequest * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	//@}

	/** @name Methods for building new X-KRSS messages from scratch */
	//@{

	/**
	 * \brief Create a new \<RegisterRequest\> message.
	 * 
	 * Generates a new RegisterRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Document to create the DOM structure within.  The caller
	 * will need to embed the DOM structure at the appropriate place in the
	 * document (using a call to getElement to find the top level element)
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSRegisterRequest structure
	 */

	virtual XKMSRegisterRequest * createRegisterRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		const XMLCh * id = NULL) = 0;
		
	/**
	 * \brief Create a new \<RegisterRequest\> message and surrounding document
	 * 
	 * Generates a new RegisterRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSRegisterRequest structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleting the RegisterRequest object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSRegisterRequest * createRegisterRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<RegisterResult\> message.
	 * 
	 * Generates a new RegisterResult message from scratch, building the DOM
	 * as it goes.  The response will be based on a input ValidateRequest message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new XKMSRegisterResponse structure
	 */

	virtual XKMSRegisterResult * createRegisterResult(
		XKMSRegisterRequest * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<RegisterResult\> message and surrounding document
	 * 
	 * Generates a new RegisterResult message from scratch, building the DOM
	 * as it goes.  The response will be based on a input ValidateRequest message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new XKMSRegisterResponse structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleting the RegisterRequest object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSRegisterResult * createRegisterResult(
		XKMSRegisterRequest * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<RevokeRequest\> message.
	 * 
	 * Generates a new RevokeRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Document to create the DOM structure within.  The caller
	 * will need to embed the DOM structure at the appropriate place in the
	 * document (using a call to getElement to find the top level element)
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSRevokeRequest structure
	 */

	virtual XKMSRevokeRequest * createRevokeRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		const XMLCh * id = NULL) = 0;
		
	/**
	 * \brief Create a new \<RevokeRequest\> message and surrounding document
	 * 
	 * Generates a new RevokeRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSRevokeRequest structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleting the RevokeRequest object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSRevokeRequest * createRevokeRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<RevokeResult\> message.
	 * 
	 * Generates a new RevokeResult message from scratch, building the DOM
	 * as it goes.  The response will be based on a input RevokeRequest message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new XKMSRevokeResponse structure
	 */

	virtual XKMSRevokeResult * createRevokeResult(
		XKMSRevokeRequest * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<RevokeResult\> message and surrounding document
	 * 
	 * Generates a new RevokeResult message from scratch, building the DOM
	 * as it goes.  The response will be based on a input RevokeRequest message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new XKMSRevokeResponse structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleting the RevokeRequest object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSRevokeResult * createRevokeResult(
		XKMSRevokeRequest * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<RecoverRequest\> message.
	 * 
	 * Generates a new RecoverRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Document to create the DOM structure within.  The caller
	 * will need to embed the DOM structure at the appropriate place in the
	 * document (using a call to getElement to find the top level element)
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSRecoverRequest structure
	 */

	virtual XKMSRecoverRequest * createRecoverRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		const XMLCh * id = NULL) = 0;
		
	/**
	 * \brief Create a new \<RecoverRequest\> message and surrounding document
	 * 
	 * Generates a new RecoverRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSRecoverRequest structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleting the RecoverRequest object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSRecoverRequest * createRecoverRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<RecoverResult\> message.
	 * 
	 * Generates a new RecoverResult message from scratch, building the DOM
	 * as it goes.  The response will be based on a input RecoverRequest message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new XKMSRecoverResponse structure
	 */

	virtual XKMSRecoverResult * createRecoverResult(
		XKMSRecoverRequest * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<RecoverResult\> message and surrounding document
	 * 
	 * Generates a new RecoverResult message from scratch, building the DOM
	 * as it goes.  The response will be based on a input RecoverRequest message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new XKMSRecoverResponse structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleting the RecoverRequest object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSRecoverResult * createRecoverResult(
		XKMSRecoverRequest * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<ReissueRequest\> message.
	 * 
	 * Generates a new ReissueRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Document to create the DOM structure within.  The caller
	 * will need to embed the DOM structure at the appropriate place in the
	 * document (using a call to getElement to find the top level element)
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSReissueRequest structure
	 */

	virtual XKMSReissueRequest * createReissueRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		const XMLCh * id = NULL) = 0;
		
	/**
	 * \brief Create a new \<ReissueRequest\> message and surrounding document
	 * 
	 * Generates a new ReissueRequest message from scratch, building the DOM
	 * as it goes.
	 *
	 * @param service URI
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSReissueRequest structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleting the ReissueRequest object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSReissueRequest * createReissueRequest(
		const XMLCh * service,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<ReissueResult\> message.
	 * 
	 * Generates a new ReissueResult message from scratch, building the DOM
	 * as it goes.  The response will be based on a input ReissueRequest message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new XKMSReissueResponse structure
	 */

	virtual XKMSReissueResult * createReissueResult(
		XKMSReissueRequest * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	/**
	 * \brief Create a new \<ReissueResult\> message and surrounding document
	 * 
	 * Generates a new ReissueResult message from scratch, building the DOM
	 * as it goes.  The response will be based on a input ReissueRequest message
	 * which is used to provide Id etc.
	 *
	 * @param request Request to base response on
	 * @param doc Will be used to return the newly created document element in.
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
     * @param rmaj Major result code
     * @param rmin Minor result code
	 * @returns the new XKMSReissueResponse structure
	 * @note Like all the xsec library functions, the document is owned by
	 * the calling application.  Deleting the ReissueRequest object will not
	 * delete the DOM document as well.
	 */

	virtual XKMSReissueResult * createReissueResult(
		XKMSReissueRequest * request,
		XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument **doc,
		XKMSResultType::ResultMajor rmaj,
		XKMSResultType::ResultMinor rmin = XKMSResultType::NoneMinor,
		const XMLCh * id = NULL) = 0;

	//@}

	/** @name Environment Manipulation Functions */
	//@{

	/**
	  * \brief Set the prefix be used for the DSIG namespace.
	  *
	  * @param prefix The UTF-16 encoided NS prefix to use for the XML 
	  * Digital Signature nodes
	  */

	virtual void setDSIGNSPrefix(const XMLCh * prefix) = 0;

	/**
	  * \brief Set the prefix be used for the Exclusive Canonicalisation namespace.
	  *
	  * The Exclusive Canonicalisation specification defines a new namespace for the
	  * InclusiveNamespaces node.  This function can be used to set the prefix
	  * that the library will use when creating nodes within this namespace.
	  *
	  * <p>xmlns:ds="http://www.w3.org/2001/10/xml-exc-c14n#"</p>
	  *
	  * If no prefix is set, the default namespace will be used
	  *
	  * @param prefix The UTF-16 encoided NS prefix to use for the XML 
	  * Exclusive Canonicalisation nodes
	  */

	virtual void setECNSPrefix(const XMLCh * prefix) = 0;

	/**
	  * \brief Set the prefix be used for the XPath-Filter2 namespace.
	  *
	  * The XPathFilter definition uses its own namespace.  This
	  * method can be used to set the prefix that the library will use
	  * when creating elements in this namespace
	  *
	  * <p>xmlns:ds="http://www.w3.org/2002/06/xmldsig-filter2"</p>
	  *
	  * If no prefix is set, the default namespace will be used
	  *
	  * @param prefix The UTF-16 encoided NS prefix to use for the XPath
	  * filter nodes
	  */

	virtual void setXPFNSPrefix(const XMLCh * prefix) = 0;

	/**
	  * \brief Set the prefix be used for the XML Encryption namespace.
	  *
	  * @param prefix The UTF-16 encoided NS prefix to use for the XML
	  * Encryption nodes
	  */

	virtual void setXENCNSPrefix(const XMLCh * prefix) = 0;

	/**
	  * \brief Set the prefix be used for the XKMS Namespace
	  *
	  * @param prefix The UTF-16 encoided NS prefix to use for the XKMS
	  * nodes
	  */

	virtual void setXKMSNSPrefix(const XMLCh * prefix) = 0;

	//@}

	/** @name Message Conversions */
	//@{

	/**
	 * \brief Convert to a Request type
	 *
	 * Used to convert a MessageAbstractType to a RequestAbstractType
	 *
	 * @param msg The message to convert
	 * @return the same message typecast to a RequestAbstractType (if NULL otherwise)
	 * otherwise
	 */

	virtual XKMSRequestAbstractType * toRequestAbstractType(XKMSMessageAbstractType *msg) = 0;

	/**
	 * \brief Convert to a Result type
	 *
	 * Used to convert a MessageAbstractType to a ResultType
	 *
	 * @param msg The message to convert
	 * @return the same message typecast to a ResultType (if OK - NULL otherwise)
	 * otherwise
	 */

	virtual XKMSResultType * toResultType(XKMSMessageAbstractType *msg) = 0;

	//@}
private:

	// Unimplemented
	XKMSMessageFactory(const XKMSMessageFactory &);
	XKMSMessageFactory & operator = (const XKMSMessageFactory &);

};

#endif /* XSEC_XKMS_ENABLED */

#endif /* XKMSMESSAGEFACTORY_INCLUDE */
