/**************************************************************
 *
 * 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.
 *
 *************************************************************/



#ifndef _DECRYPTORIMPL_HXX
#define _DECRYPTORIMPL_HXX

#include <com/sun/star/xml/crypto/sax/XDecryptionResultBroadcaster.hpp>
#include <com/sun/star/xml/crypto/sax/XDecryptionResultListener.hpp>
#include <com/sun/star/xml/crypto/XXMLSecurityContext.hpp>
#include <com/sun/star/lang/XInitialization.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <cppuhelper/implbase3.hxx>

#include "encryptionengine.hxx"

class DecryptorImpl : public cppu::ImplInheritanceHelper3
<
	EncryptionEngine,
	com::sun::star::xml::crypto::sax::XDecryptionResultBroadcaster,
	com::sun::star::lang::XInitialization,
	com::sun::star::lang::XServiceInfo
>
/****** DecryptorImpl.hxx/CLASS DecryptorImpl *********************************
 *
 *   NAME
 *	DecryptorImpl -- decrypts an encryption
 *
 *   FUNCTION
 *	Collects all resources for decrypting an encryption, then decrypts the
 *	encryption by invoking a xmlsec-based encryption bridge component.
 *
 *   HISTORY
 *	05.01.2004 -	Interface supported: XDecryptionResultBroadcaster,
 *	            	XInitialization, XServiceInfo
 *
 *   AUTHOR
 *	Michael Mi
 *	Email: michael.mi@sun.com
 ******************************************************************************/
{
private:
	/*
	 * the Id of the encryption, which is used for the result listener to
	 * identify the encryption.
	 */
	sal_Int32 m_nEncryptionId;

	/*
	 * the decryption result,
	 * remembers whether the decryption succeeds.
	 */
	bool      m_bDecryptionSucceed;

	com::sun::star::uno::Reference<
		com::sun::star::xml::crypto::XXMLSecurityContext > m_xXMLSecurityContext;

	virtual void notifyResultListener() const
		throw (com::sun::star::uno::Exception, com::sun::star::uno::RuntimeException);
	virtual bool checkReady() const;
	virtual void startEngine( const com::sun::star::uno::Reference<
		com::sun::star::xml::crypto::XXMLEncryptionTemplate >&
		xEncryptionTemplate)
		throw (com::sun::star::uno::Exception, com::sun::star::uno::RuntimeException);

public:
	explicit DecryptorImpl( const com::sun::star::uno::Reference<
		com::sun::star::lang::XMultiServiceFactory >& rxMSF);
	virtual ~DecryptorImpl();

	/* XDecryptionResultBroadcaster */
	virtual void SAL_CALL addDecryptionResultListener(
		const com::sun::star::uno::Reference<
			com::sun::star::xml::crypto::sax::XDecryptionResultListener >&
			listener )
    		throw (com::sun::star::uno::Exception, com::sun::star::uno::RuntimeException);
    	virtual void SAL_CALL removeDecryptionResultListener(
    		const com::sun::star::uno::Reference<
    			com::sun::star::xml::crypto::sax::XDecryptionResultListener >&
    			listener )
    		throw (com::sun::star::uno::RuntimeException);

	/* XInitialization */
	virtual void SAL_CALL initialize(
		const com::sun::star::uno::Sequence< com::sun::star::uno::Any >& aArguments )
		throw (com::sun::star::uno::Exception, com::sun::star::uno::RuntimeException);

	/* XServiceInfo */
	virtual rtl::OUString SAL_CALL getImplementationName(  )
		throw (com::sun::star::uno::RuntimeException);
	virtual sal_Bool SAL_CALL supportsService( const rtl::OUString& ServiceName )
		throw (com::sun::star::uno::RuntimeException);
	virtual com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(  )
		throw (com::sun::star::uno::RuntimeException);
};

rtl::OUString DecryptorImpl_getImplementationName()
	throw ( com::sun::star::uno::RuntimeException );

sal_Bool SAL_CALL DecryptorImpl_supportsService( const rtl::OUString& ServiceName )
	throw ( com::sun::star::uno::RuntimeException );

com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL DecryptorImpl_getSupportedServiceNames(  )
	throw ( com::sun::star::uno::RuntimeException );

com::sun::star::uno::Reference< com::sun::star::uno::XInterface >
SAL_CALL DecryptorImpl_createInstance(
	const com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >&
		rSMgr)
	throw ( com::sun::star::uno::Exception );

#endif
