/**************************************************************
 * 
 * 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 _SECURITYENGINE_HXX
#define _SECURITYENGINE_HXX

#include <com/sun/star/xml/crypto/sax/XReferenceResolvedListener.hpp>
#include <com/sun/star/xml/crypto/sax/XReferenceResolvedBroadcaster.hpp>
#include <com/sun/star/xml/crypto/sax/XKeyCollector.hpp>
#include <com/sun/star/xml/crypto/sax/XMissionTaker.hpp>
#include <com/sun/star/xml/crypto/sax/XSAXEventKeeper.hpp>
#include <com/sun/star/xml/crypto/XXMLSignature.hpp>
                                       
#include <cppuhelper/implbase3.hxx>

class SecurityEngine : public cppu::WeakImplHelper3
< 
	com::sun::star::xml::crypto::sax::XReferenceResolvedListener,
	com::sun::star::xml::crypto::sax::XKeyCollector,
	com::sun::star::xml::crypto::sax::XMissionTaker
>
/****** securityengine.hxx/CLASS SecurityEngine *******************************
 *
 *   NAME
 *	SecurityEngine -- Base class of SignatureEngine and EncryptionEngine
 *
 *   FUNCTION
 *	Maintains common members and methods related with security engine
 *	operation.
 *
 *   HISTORY
 *	05.01.2004 -	Interface supported: XReferenceResolvedListener,
 * 			XKeyCollector, and XMissionTaker
 *
 *   AUTHOR
 *	Michael Mi
 *	Email: michael.mi@sun.com
 ******************************************************************************/
{
protected:
	com::sun::star::uno::Reference< 
		com::sun::star::lang::XMultiServiceFactory > mxMSF;

	/*
	 * A SAXEventKeeper internally maintians all resources that a security
	 * operation needs. The m_xSAXEventKeeper member is used to release 
	 * those resources when the security operation finishes.
	 */
	com::sun::star::uno::Reference< 
		com::sun::star::xml::crypto::sax::XSAXEventKeeper > m_xSAXEventKeeper;
	
	/*
	 * the id of ElementCollector of the template element.
	 * For a signature, the template element is the Signature element,
	 * for a encryption, the EncryptedData/EncryptedKey element is.
	 */	
	sal_Int32 m_nIdOfTemplateEC;
	
	/*
	 * remembers how many referenced elements have been bufferred completely,
	 * including the key element, template element, and referenced element of
	 * signature.
	 */
	sal_Int32 m_nNumOfResolvedReferences;
	
	/*
	 * the id of ElementCollector of the key element.
	 * If a Signature element or EncryptedData/EncryptedKey element has
	 * an internal key sub-element, then this member should be -1
	 */
	sal_Int32 m_nIdOfKeyEC;
	
	/*
	 * remembers whether the current opertion has finished.
	 */
	bool      m_bMissionDone;

	/*
	 * the Id of the security entity, a signature or encryption, which is used for
	 * the result listener to identify the entity.
	 */
	sal_Int32 m_nSecurityId;
	
	/*
	 * the status of the operation
	 */
	//bool      m_bOperationSucceed;
	com::sun::star::xml::crypto::SecurityOperationStatus m_nStatus;
	
	/*
	 * the result listener, which will receives the security operation result.
	 */
	com::sun::star::uno::Reference<
		com::sun::star::uno::XInterface >
		m_xResultListener;

protected:
	explicit SecurityEngine( const com::sun::star::uno::Reference< 
		com::sun::star::lang::XMultiServiceFactory >& rxMSF = NULL );
	virtual ~SecurityEngine() {};
	
	/* 
	 * perform the security operation.
	 * Any derived class will implement this method respectively.
	 */
	virtual void tryToPerform( )
		throw (com::sun::star::uno::Exception, com::sun::star::uno::RuntimeException){};
		
	/*
	 * clear up all resources used by this operation.
	 * This method is called after the operation finishes, or a End-Your-Mission
	 * message is received.
	 * Any derived class will implement this method respectively.
	 */
	virtual void clearUp( ) const {};	
        
        /*
         * notifies any possible result listener.
         * When verify a signature or conduct a decryption, the operation result will
         * be transferred to a listener by this method.
	 * Any derived class will implement this method respectively.
         */
	virtual void notifyResultListener() const
		throw (com::sun::star::uno::Exception, com::sun::star::uno::RuntimeException)
		{};

	/*
	 * checks whether everything is ready.
	 * Any derived class will implement this method respectively.
	 */
	virtual bool checkReady() const { return true; };
	
public:
	/* XReferenceResolvedListener */
	virtual void SAL_CALL referenceResolved( sal_Int32 referenceId )
    		throw (com::sun::star::uno::Exception, com::sun::star::uno::RuntimeException);

	/* XKeyCollector */
	virtual void SAL_CALL setKeyId( sal_Int32 id )
    		throw (com::sun::star::uno::Exception, com::sun::star::uno::RuntimeException);
    	
    	/* XMissionTaker */
    	virtual sal_Bool SAL_CALL endMission(  )
    		throw (com::sun::star::uno::RuntimeException);
};

#endif

