/**
 * 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
 *
 * XKMSStatusResultImpl := Implementation of StatusResult Messages
 *
 * $Id$
 *
 */

#ifndef XKMSSTATUSRESULTIMPL_INCLUDE
#define XKMSSTATUSRESULTIMPL_INCLUDE

// XSEC Includes

#include <xsec/framework/XSECDefs.hpp>
#include <xsec/xkms/XKMSStatusResult.hpp>

#ifdef XSEC_XKMS_ENABLED

#include "XKMSResultTypeImpl.hpp"

#include <vector>

class XKMSUnverifiedKeyBindingImpl;


class XKMSStatusResultImpl : public XKMSStatusResult {

public:
	XKMSResultTypeImpl m_result;
	XKMSMessageAbstractTypeImpl &m_msg;
public:

	XKMSStatusResultImpl(
		const XSECEnv * env
	);

	XKMSStatusResultImpl(
		const XSECEnv * env, 
		XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * node
	);

	virtual ~XKMSStatusResultImpl();

	// Load elements
	void load();

	// Creation
	XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * 
		createBlankStatusResult(
		const XMLCh * service,
		const XMLCh * id,
		ResultMajor rmaj,
		ResultMinor rmin);

	// Interface methods
	virtual int getSuccessCount(void) const;
	virtual int getFailureCount(void) const;
	virtual int getPendingCount(void) const;
	virtual void setSuccessCount(int count);
	virtual void setFailureCount(int count);
	virtual void setPendingCount(int count);

	/* Implemented from MessageAbstractType */
	virtual messageType getMessageType(void);

	/* Forced inheritance from XKMSMessageAbstractTypeImpl */
	XKMS_MESSAGEABSTRACTYPE_IMPL_METHODS

	/* Forced inheritance from XKMSResultTypeImpl */
	XKMS_RESULTTYPE_IMPL_METHODS

private:

	XERCES_CPP_NAMESPACE_QUALIFIER  DOMAttr
						* mp_successAttr;
	XERCES_CPP_NAMESPACE_QUALIFIER  DOMAttr
						* mp_failureAttr;
	XERCES_CPP_NAMESPACE_QUALIFIER  DOMAttr
						* mp_pendingAttr;

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

};

#endif /* XSEC_XKMS_ENABLED */
#endif /* XKMSSTATUSRESULTIMPL_INCLUDE */
