/**
 * 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
 *
 * XSECSOAPRequestor:= Interface class used by the XKMS client code to
 *                     perform a SOAP request and receive response.
 *
 *
 * $Id$
 *
 */

#ifndef XSECSOAPREQUESTOR_INCLUDE
#define XSECSOAPREQUESTOR_INCLUDE

#include <xsec/framework/XSECDefs.hpp>

#ifdef XSEC_XKMS_ENABLED

XSEC_DECLARE_XERCES_CLASS(DOMDocument);

/**
 * @brief Interface for SOAP Requests
 * @ingroup interfaces
 *
 * The XKMS client code needs to be able to call on a SOAP requestor
 * implementation that will handle wrapping the request in a SOAP msg
 * and transporting it to the SOAP server.  This class defines the
 * interface used by the client code to make this happen.
 *
 * Implementors need to wrap the passed in DOM document in a SOAP 1.1
 * or SOAP 1.2 msg.  E.g. (SOAP 1.2)
 * \verbatim
   <?xml version='1.0' encoding="utf-8"?>
   <env:Envelope xmlns:env="http://www.w3.org/2002/06/soap-envelope"> 
    <env:Header>
     <env:Body>
       XKMS Request Message element 
     </env:Body>
    </env:Header>
   </env:Envelope>
\endverbatim
 * 
 * SOAP implentors may want/need to add other headers.
 *
 */


class XSEC_EXPORT XSECSOAPRequestor {

public :

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

	XSECSOAPRequestor() {}
	virtual ~XSECSOAPRequestor() {}

	//@}

	/** @name Interface methods */

	/**
	 * \brief Do a SOAP request
	 *
	 * Performs a request based on the passed in DOM document and
	 * the indicated URI.  The function is expected to return a pointer
	 * to the parsed result message (with the SOAP envelope removed)
	 *
	 * The implementing object is expected to know how to get the
	 * wrapped message to the server that will process the request
	 *
	 * @param request The DOM document containing the message to be 
	 * wrapped and sent.
	 * @returns The DOM document representing the result, with all
	 * SOAP headers removed
	 */

	virtual XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *
		doRequest(XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * request) = 0;

};

#endif /* XSEC_XKMS_ENABLED */
#endif /* XSECSOAPREQUESTOR_INCLUDE */
