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

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

#ifndef __com_sun_star_io_XInputStream_idl__
#include <com/sun/star/io/XInputStream.idl>
#endif

//=============================================================================

 module com {  module sun {  module star {  module mozilla {

//=============================================================================


// DocMerge from xml: method com::sun::star::mozilla::XPluginInstance::start
/** Allows to controll an office side plugin instance and to communicate with it.
	This interface is oriented for communication with browsers plugins.
 */
published interface XPluginInstance: com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------


	// DocMerge from xml: method com::sun::star::mozilla::XPluginInstance::start
	/** Starts plugin operation. This is called after a plugin instance is
		created.
	 */
	[oneway] void start();

	//-------------------------------------------------------------------------


	// DocMerge from xml: method com::sun::star::mozilla::XPluginInstance::stop
	/** Stops plugin operation. This is called when the user goes to another web
		page. The <member>XPluginInstance::destroy</member> method is directly called
		afterwards.
	 */
	[oneway] void stop();

	//-------------------------------------------------------------------------


	// DocMerge from xml: method com::sun::star::mozilla::XPluginInstance::destroy
	/** Destroy the plugin instance. This method is called when it is no
		longer possible to return to the plugin instance, because it was
		destroyed by the browser (e.g., window close).
	 */
	[oneway] void destroy();

	//-------------------------------------------------------------------------


	// DocMerge from xml: method com::sun::star::mozilla::XPluginInstance::createWindow
	/** Creates a new window for plugin operation.

		@param PlatformParentData	[in]:	platform dependent window data
		@param embedded				[in]:	selects embedded or full page plugin mode

	 */
	[oneway] void createWindow( [in] any PlatformParentData, [in] boolean embedded );

	//-------------------------------------------------------------------------


	// DocMerge from xml: method com::sun::star::mozilla::XPluginInstance::newStream
	/** Notifies the plugin of a new stream to display.

		@param MIMEDesc		[in]:	the MIMEtype of the data stream
		@param theURL		[in]:	the URL that denotes the stream
		@param filter		[in]:	a filter string to suggest a component that should handle the document
		@param stream		[in]:	the data stream
		@param sessiondata	[in]:	the data specifying the current session

	 */
	[oneway] void newStream(
		[in] string MIMEDesc,
		[in] string theURL,
		[in] string filter,
		[in] ::com::sun::star::io::XInputStream stream ,
		[in] any sessionData
	);

	//-------------------------------------------------------------------------


	// DocMerge from xml: method com::sun::star::mozilla::XPluginInstance::newURL
	/** Notifies the plugin of a new url to open as document.

		@param MIMEDesc		[in]:	the MIMEtype of the data stream
		@param theURL		[in]:	the URL to be openend
		@param filter		[in]:	a filter string to suggest a component that should handle the document
		@param sessiondata	[in]:	the data specifying the current session

	 */
	[oneway] void newURL( [in] string MIMEDesc, [in] string theURL, [in] string filter, [in] any sessionData );

	//-------------------------------------------------------------------------


	// DocMerge from idl: method com::sun::star::mozilla::XPluginInstance::getHttpServerURL
	/** Retrieves the URL of the HTTP Loadbalancing Slave.

		@param aURL		[out]:	the full qualified host name of the LBS
		@param aPort	[out]:	the port number
		@param aPrefix	[out]:	the url prefix to the portal

	 */
	void getHttpServerURL( [out] string aHost, [out] unsigned short aPort,
						   [out] string aPrefix);
};

//=============================================================================

}; }; }; };

#endif 
