/**
 * 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
 *
 * XKMSNotBoundAuthentication := Interface for ValidityInterval elements
 *
 * $Id$
 *
 */

#ifndef XKMSNOTBOUNDAUTHENTICATION_INCLUDE
#define XKMSNOTBOUNDAUTHENTICATION_INCLUDE

// XSEC Includes

#include <xsec/framework/XSECDefs.hpp>

#ifdef XSEC_XKMS_ENABLED

/**
 * @ingroup xkms
 */

/**
 * @brief Interface definition for the NotBoundAuthentication elements
 *
 * The \<NotBoundAuthentication\> Element used within an \<Authentication\>
 * element to pass a pass phrase of some kind that authenticates the X-KRSS
 * request.
 *
 * The schema definition for NotBoundAuthentication is as follows :
 *
 * \verbatim
   <!-- NotBoundAuthentication -->
   <element name="NotBoundAuthentication" 
         type="xkms:NotBoundAuthenticationType"/>
   <complexType name="NotBoundAuthenticationType">
      <attribute name="Protocol" type="anyURI" use="required"/>
      <attribute name="Value" type="base64Binary" use="required"/>
   </complexType>
   <!-- /NotBoundAuthentication -->
\endverbatim
 */

class XSEC_EXPORT XKMSNotBoundAuthentication {

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

protected:

	XKMSNotBoundAuthentication() {};

public:

	virtual ~XKMSNotBoundAuthentication() {};

	//@}

	/** @name Get Methods */
	//@{

	/**
	 * \brief Get the protocol URI
	 *
	 * A \<XKMSNotBoundAuthentication\> has a protocol attribute defining the
	 * protocol being used to authenticate the request.
	 *
	 * @return The string holding the URI of the protocol
	 */

	virtual const XMLCh * getProtocol(void) const = 0;

	/**
	 * \brief Get the value
	 *
	 * Returns the authentication value.
	 *
	 * @return A string holding the base64 encoded authentication value
	 */

	virtual const XMLCh * getValue(void) const = 0;

	//@}

	/** @name Set Methods */
	//@{

	/**
	 * \brief Set the protocol
	 *
	 * @param uri String containing the URI to set as the protocol
	 */

	virtual void setProtocol(const XMLCh * uri) = 0;

	/**
	 * \brief Set the authentication value
	 *
	 * @param value Base64 encoded value to set as the authentication value
	 */

	virtual void setValue(const XMLCh * value) = 0;

	//@}

private:

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

};

#endif /* XSEC_XKMS_ENABLED */

#endif /* XKMSNOTBOUNDAUTHENTICATION_INCLUDE */
