/**************************************************************
 * 
 * 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_bridge_XBridgeSupplier2_idl__ 
#define __com_sun_star_bridge_XBridgeSupplier2_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
#ifndef __com_sun_star_lang_IllegalArgumentException_idl__ 
#include <com/sun/star/lang/IllegalArgumentException.idl> 
#endif 
 
 
//============================================================================= 
 
 module com {  module sun {  module star {  module bridge {  
 
//============================================================================= 
 
/** defines the interface for creating bridges to other object models.
	<p />
	<p>
	The created bridges are transparent to the user. That is, if one maps
	an interface into the target model, then the resulting target interface
	is a bridge implementation, that is not being noticed by an user. During
	a call on that interface, the bridge is invoked to convert the arguments
	and carry out a call according to the rules of the source model. 
	Return values are automatically mapped to the types of the target model.
	</p>
	<p>
	Simple types are mapped to simple target types. That is, there is no additional
	bridging code involved when those types are being used.
	</p>
	
	<p>Sometimes a bridge cannot be created, depending on whether a programm uses
	the XBridgeSupplier2 interface remotely. Assuming one wants to bridge an
	OLE Automation object to UNO by calling createBridge on a proxy, then the UNO remote
	bridge would not recognise that the Any argument contains an IDispatch interface.
	Therefore it cannot marshal it as COM requires it and the bridgeing would fail.
	To prevent this, implementations of this interface should be aware of this scenario and
	if necessary take the appropriate steps. The process ID argument to the createBridge
	function represents the calling process and may be used by the implementation to determine
	if it is being accessed remotely.
	</p>
	<p>All objects, whether they are part of the UNO object model or not, 
	are carried in an <atom>any</atom>.  The representation of this object 
	is heavily model-dependent and has to be specified in the following list: </p>
	
	<dl>
		<dt>UNO: </dt>
		<dd>The any carries normal UNO types, which can be any base type,
		struct, sequence, enum or interface.  </dd>

		<dt>OLE: 	</dt>
		<dd>The any carries an <atom>unsigned long</atom> (on 32-bit systems)
		or an <atom>unsigned hyper</atom> (on 64-bit systems), which is 
		interpreted as a variant pointer. The any does not control the 
		lifetime of the represented variant. That implies that the caller 
		has the responsibility of freeing the OLE resources represented 
		by the any value.  </dd>

		<dt>JAVA: 	</dt>
		<dd>not specified yet.  </dd>

		<dt>CORBA: </dt>
		<dd>not specified yet.  </dd>
	</dl>
	
	</p>
	<p>Any implementation can supply its own bridges to other object 
	models by implementing this interface and returning the bridge 
	when the method <member>XBridgeSupplier2::createBridge()</member>
	is called with itself as the first parameter.  </p>

	@see com::sun::star::bridge::OleBridgeSupplier2
 */
published interface XBridgeSupplier2: com::sun::star::uno::XInterface
{ 
	/** creates a bridge to provide an object of one object model with another.
	 */
	any createBridge( [in] any aModelDepObject, 
			 [in] sequence< byte > aProcessId, 
			 [in] short nSourceModelType, 
			 [in] short nDestModelType ) 
			raises( com::sun::star::lang::IllegalArgumentException ); 
 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
/*============================================================================= 
 
=============================================================================*/ 
#endif 
