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

