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

//_________________________________________________________________________________________________________________
//	my own includes
//_________________________________________________________________________________________________________________

#include <services/frame.hxx>

//_________________________________________________________________________________________________________________
//	interface includes
//_________________________________________________________________________________________________________________
#include <com/sun/star/mozilla/XPluginInstance.hpp>
#include <com/sun/star/mozilla/XPluginInstancePeer.hpp>
#include <com/sun/star/mozilla/XPluginWindowPeer.hpp>
#include <com/sun/star/io/XInputStream.hpp>
#include <com/sun/star/lang/XInitialization.hpp>
#include <com/sun/star/awt/XWindow.hpp>
#include <com/sun/star/frame/XDispatchResultListener.hpp>
#include <com/sun/star/frame/FeatureStateEvent.hpp>
#include <com/sun/star/lang/EventObject.hpp>

//_________________________________________________________________________________________________________________
//	other includes
//_________________________________________________________________________________________________________________

#ifndef _VCL_ATOM_HXX
#include <vcl/threadex.hxx>
#endif
#include <unotools/cmdoptions.hxx>


//_________________________________________________________________________________________________________________
//	namespace
//_________________________________________________________________________________________________________________

namespace framework{

//_________________________________________________________________________________________________________________
//	exported const
//_________________________________________________________________________________________________________________

//_________________________________________________________________________________________________________________
//	exported definitions
//_________________________________________________________________________________________________________________

/*-************************************************************************************************************//**
	@short		implements an special frame - a plugin frame
	@descr		-

	@implements	XInitialization
				XPluginInstance
                XDispatchResultListener
    @base       Frame
*//*-*************************************************************************************************************/

class PlugInFrame   :   public css::lang::XInitialization           ,
                        public css::mozilla::XPluginInstance        ,
                        public css::frame::XDispatchResultListener  ,   // => XEVENTLISTENER
                        public Frame                                    // Order of baseclasses is necessary for right initialization!
{
	//-------------------------------------------------------------------------------------------------------------
	//	public methods
	//-------------------------------------------------------------------------------------------------------------

	public:

		//---------------------------------------------------------------------------------------------------------
		//	constructor / destructor
		//---------------------------------------------------------------------------------------------------------

		/*-****************************************************************************************************//**
			@short		standard constructor to create instance
			@descr		This constructor initialize a new instance of this class,
						and will be set valid values on his member and baseclasses.

			@seealso	-

			@param		-
			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

	 	PlugInFrame( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory );

		/*-****************************************************************************************************//**
			@short		standard destructor
			@descr		This method destruct an instance of this class and clear some member.

			@seealso	-

			@param		-
			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

		virtual	~PlugInFrame();

		//---------------------------------------------------------------------------------------------------------
		//	XInterface, XTypeProvider, XServiceInfo
		//---------------------------------------------------------------------------------------------------------

		DECLARE_XINTERFACE
		DECLARE_XTYPEPROVIDER
		DECLARE_XSERVICEINFO

		//---------------------------------------------------------------------------------------------------------
		//	XInitialization
		//---------------------------------------------------------------------------------------------------------

		void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& seqArguments ) throw(	css::uno::Exception			,
					 																				css::uno::RuntimeException	);

		//---------------------------------------------------------------------------------------------------------
		//	XPluginInstance
		//---------------------------------------------------------------------------------------------------------

		void SAL_CALL start			() throw( css::uno::RuntimeException );
		void SAL_CALL implcb_start	() throw( css::uno::RuntimeException );
		void SAL_CALL stop			() throw( css::uno::RuntimeException );
		void SAL_CALL implcb_stop	() throw( css::uno::RuntimeException );
		void SAL_CALL destroy		() throw( css::uno::RuntimeException );
		void SAL_CALL implcb_destroy() throw( css::uno::RuntimeException );
		void SAL_CALL createWindow			(	const	css::uno::Any&		aPlatformWindowHandle	,
														sal_Bool			bEmbedded				) throw( css::uno::RuntimeException );
		void SAL_CALL implcb_createWindow	(	const	css::uno::Any&		aPlatformWindowHandle	,
														sal_Bool			bEmbedded				) throw( css::uno::RuntimeException );
		void SAL_CALL newStream		(	const	::rtl::OUString&								sMIMEDescription,
										const	::rtl::OUString&								sURL			,
										const	::rtl::OUString&								sFilter			,
										const	css::uno::Reference< css::io::XInputStream >&	xStream			,
										const	css::uno::Any&									aSessionId		) throw( css::uno::RuntimeException );
	    void SAL_CALL implcb_newStream
		                            (	const	::rtl::OUString&								sMIMEDescription,
										const	::rtl::OUString&								sURL			,
										const	::rtl::OUString&								sFilter			,
										const	css::uno::Reference< css::io::XInputStream >&	xStream			,
										const	css::uno::Any&									aSessionId		) throw( css::uno::RuntimeException );
		void SAL_CALL newURL		(	const	::rtl::OUString&	sMIMEDescription,
										const	::rtl::OUString&	sURL			,
										const	::rtl::OUString&	sFilter			,
										const	css::uno::Any&		aSessionId		) throw( css::uno::RuntimeException );
		void SAL_CALL implcb_newURL	(	const	::rtl::OUString&	sMIMEDescription,
										const	::rtl::OUString&	sURL			,
										const	::rtl::OUString&	sFilter			,
										const	css::uno::Any&		aSessionId		) throw( css::uno::RuntimeException );
    	virtual void SAL_CALL getHttpServerURL(	::rtl::OUString&	sHost	,
												sal_uInt16&			nPort	,
												::rtl::OUString&	sPrefix	) throw( css::uno::RuntimeException );

		//---------------------------------------------------------------------------------------------------------
		//	 XDispatchProvider
		//---------------------------------------------------------------------------------------------------------

		virtual css::uno::Reference< css::frame::XDispatch > SAL_CALL queryDispatch(	const	css::util::URL&	 	aURL			,
																						const	::rtl::OUString&	sTargetFrameName,
																								sal_Int32			nSearchFlags	) throw( css::uno::RuntimeException );
		virtual css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > SAL_CALL queryDispatches( const css::uno::Sequence< css::frame::DispatchDescriptor >& seqDescripts ) throw( css::uno::RuntimeException );

		//---------------------------------------------------------------------------------------------------------
        //   XDispatchResultListener
		//---------------------------------------------------------------------------------------------------------

        virtual void SAL_CALL dispatchFinished      ( const css::frame::DispatchResultEvent&                    aEvent     ) throw( css::uno::RuntimeException );

		//---------------------------------------------------------------------------------------------------------
		//	 XEventListener
		//---------------------------------------------------------------------------------------------------------

		void SAL_CALL disposing( const css::lang::EventObject& aEvent ) throw( css::uno::RuntimeException );

	//-------------------------------------------------------------------------------------------------------------
	//	protected methods
	//-------------------------------------------------------------------------------------------------------------

	protected:

	//-------------------------------------------------------------------------------------------------------------
	//	private methods
	//-------------------------------------------------------------------------------------------------------------

	private:

		void impl_tryToLoadDocument();
        sal_Bool impl_registerRemoteFactories( const css::uno::Reference< css::lang::XMultiServiceFactory >& xRemoteServiceManager );

	//-------------------------------------------------------------------------------------------------------------
	//	debug methods
	//	(should be private everyway!)
	//-------------------------------------------------------------------------------------------------------------

		/*-****************************************************************************************************//**
			@short		debug-method to check incoming parameter of some other methods of this class
			@descr		The following methods are used to check parameters for other methods
						of this class. The return value is used directly for an ASSERT(...).

			@seealso	ASSERTs in implementation!

			@param		references to checking variables
			@return		sal_False on invalid parameter<BR>
						sal_True  otherway

			@onerror	-
		*//*-*****************************************************************************************************/

	#ifdef ENABLE_ASSERTIONS

	private:

		static sal_Bool impldbg_checkParameter_initialize			(	const	css::uno::Sequence< css::uno::Any >&					seqArguments			);
		static sal_Bool impldbg_checkParameter_createWindow			(	const	css::uno::Any&											aPlatformWindowHandle	,
																				sal_Bool												bEmbedded				);
		static sal_Bool impldbg_checkParameter_newStream			(	const	::rtl::OUString&										sMIMEDescription		,
																		const	::rtl::OUString&										sURL					,
																		const	::rtl::OUString&										sFilter					,
																		const	css::uno::Reference< css::io::XInputStream >&			xStream					);
		static sal_Bool impldbg_checkParameter_newURL				(	const	::rtl::OUString&										sMIMEDescription		,
																		const	::rtl::OUString&										sURL					,
																		const	::rtl::OUString&										sFilter					);
    	static sal_Bool impldbg_checkParameter_getHttpServerURL		(			::rtl::OUString&										sHost					,
																				sal_uInt16&												nPort					,
																				::rtl::OUString&										sPrefix					);
		static sal_Bool impldbg_checkParameter_queryDispatch		(	const	css::util::URL&	 										aURL					,
																		const	::rtl::OUString&										sTargetFrameName		,
																				sal_Int32												nSearchFlags			);
		static sal_Bool impldbg_checkParameter_queryDispatches		(	const	css::uno::Sequence< css::frame::DispatchDescriptor >&	seqDescripts			);
		static sal_Bool impldbg_checkParameter_statusChanged		(	const	css::frame::FeatureStateEvent&							aEvent					);
		static sal_Bool impldbg_checkParameter_disposing			(	const	css::lang::EventObject&									aEvent					);

	#endif	// #ifdef ENABLE_ASSERTIONS

	//-------------------------------------------------------------------------------------------------------------
	//	variables
	//	(should be private everyway!)
	//-------------------------------------------------------------------------------------------------------------

	private:

		css::uno::Reference< css::mozilla::XPluginInstancePeer >			m_xPlugInInstancePeer	;	/// Reference to UNO interface of PlugIn dll for communication with browser
		css::uno::Reference< css::mozilla::XPluginWindowPeer >				m_xPlugInWindowPeer		;	/// Reference to set child window at plugin window
		css::uno::Sequence< css::beans::PropertyValue >						m_seqProperties			;	/// Sequence of properties as arguments for load document
		css::util::URL														m_aURL					;	/// URL for document to load
		sal_Bool															m_bILoad				;	/// PlugInFrame has a valid loader which load the document and wait for finished/cancelled
		sal_Bool															m_bIHaveDocument		;	/// We have a document loaded successful.
		css::uno::Reference< css::frame::XDispatchProvider >				m_xPlugInDispatcher		;	/// Dispatcher to forward dispatches to browser
        static sal_Bool                                                     m_bRemoteFactoriesExist ;   /// indicates, if remote factories was already registered (necessary one times only!)
		SvtCommandOptions													m_aCommandOptions		;	/// ref counted class to support disabling commands defined by configuration file

};		//	class PlugInFrame

/*-************************************************************************************************************//**
	@short		used to forward all asynchronous calls which use VCL internal to the main thread
	@descr		We need this asynchronous mechanism to prevent us against dead locks. Sometimes our main thread
				can call us for event handling like FOCUS, ACTIVATE and something else. But at the same time we will call
				the main thread to CREATE A WINDOW, SET IT VISIBLE ... Then we have a problem. We must send us himself a event
				to run our code synchronized with our main thread!

	@implements
	@base		-
*//*-*************************************************************************************************************/

enum eIMPL_PluginCommand
{
	START			,
	STOP			,
	CREATEWINDOW	,
	DESTROY         ,
	NEWSTREAM       ,
	NEWURL
};

class cIMPL_MainThreadExecutorRequest
{
	public:
		cIMPL_MainThreadExecutorRequest(	eIMPL_PluginCommand								eCommand				,
											PlugInFrame*									pPluginInstance			);

		cIMPL_MainThreadExecutorRequest(	eIMPL_PluginCommand								eCommand				,
											PlugInFrame*									pPluginInstance			,
									const	css::uno::Any&									aPlatformWindowHandle	,
											sal_Bool										bEmbedded				);

	    cIMPL_MainThreadExecutorRequest(	eIMPL_PluginCommand								eCommand				,
											PlugInFrame*									pPluginInstance			,
									const   ::rtl::OUString&								sMIMEDescription		,
									const	::rtl::OUString&								sURL		    		,
									const	::rtl::OUString&								sFilter		    		,
									const	css::uno::Reference< css::io::XInputStream >&	xStream     			,
									const	css::uno::Any&									aSessionId				);

		/*-****************************************************************************************************//**
			@short		-
			@descr		-

			@seealso	-

			@param		-
			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

		virtual long doIt();

	//-------------------------------------------------------------------------------------------------------------
	//	private variables
	//-------------------------------------------------------------------------------------------------------------
	private:

		eIMPL_PluginCommand								m_eCommand				;	/// switch to specify forward function
		PlugInFrame*									m_pPluginInstance		;	/// instance which has started this swicth mechanism and wish to called back from us
		css::uno::Reference< css::uno::XInterface >		m_xPluginInstance		;	/// reference to our plugin frame to prevent that plugin frame dies before we call back
		css::uno::Any									m_aPlatformWindowHandle	;	///	parameter for XPluginInstance->createWindow()
		sal_Bool										m_bEmbedded				;	///	parameter for XPluginInstance->createWindow()
	    ::rtl::OUString				    				m_sMIMEDescription		;	/// parameter for XPluginInstance->newStream()/newURL()
		::rtl::OUString			        				m_sURL					;	/// parameter for XPluginInstance->newStream()/newURL()
		::rtl::OUString									m_sFilter				;	/// parameter for XPluginInstance->newStream()/newURL()
		css::uno::Reference< css::io::XInputStream >	m_xStream				;	/// parameter for XPluginInstance->newStream()/newURL()
		css::uno::Any      								m_aSessionId			;	/// parameter for XPluginInstance->newStream()/newURL()
};

class cIMPL_MainThreadExecutor
{
	//-------------------------------------------------------------------------------------------------------------
	//	public methods
	//-------------------------------------------------------------------------------------------------------------
	public:
		static void execute( cIMPL_MainThreadExecutorRequest* pRequest );

		/*-****************************************************************************************************//**
			@short		-
			@descr		-

			@seealso	-

			@param		-
			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/
		DECL_STATIC_LINK( cIMPL_MainThreadExecutor, worker, cIMPL_MainThreadExecutorRequest* );
};

}		//	namespace framework

#endif	//	#ifndef __FRAMEWORK_SERVICES_PLUGINFRAME_HXX_
