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

#include <sal/types.h>
#include <rtl/ustring.h>

#include <stdarg.h>

#ifdef __cplusplus
extern "C"
{
#endif

struct _uno_ExtEnvironment;
struct _typelib_InterfaceTypeDescription;

#if defined( SAL_W32)
#pragma pack(push, 8)
#elif defined(SAL_OS2)
#pragma pack(push, 8)
#endif

/** The binary specification of an UNO environment.
*/
typedef struct _uno_Environment
{
	/** reserved for future use (0 if not used)
	*/
	void *				pReserved;

	/** type name of environment
	*/
	rtl_uString *		pTypeName;

	/** free context pointer to be used for specific classes of environments (e.g., a jvm pointer)
	*/
	void *				pContext;

	/** pointer to extended environment (interface registration functionality), if supported
	*/
	struct _uno_ExtEnvironment * pExtEnv;

	/** Acquires this environment.

		@param pEnv this environment
	*/
	void (SAL_CALL * acquire)( struct _uno_Environment * pEnv );

	/** Releases this environment; last release of environment will revoke the environment from
        runtime.

		@param pEnv this environment
	*/
	void (SAL_CALL * release)( struct _uno_Environment * pEnv );

	/** Acquires this environment weakly.  You can only harden a weakly held environment if it
        is still acquired hard (acquire()).

		@param pEnv this environment
	*/
	void (SAL_CALL * acquireWeak)( struct _uno_Environment * pEnv );

	/** Releases this environment weakly in correspondence to acquireWeak().

		@param pEnv this environment
	*/
	void (SAL_CALL * releaseWeak)( struct _uno_Environment * pEnv );

	/** Makes hard reference out of weak referenced environment. You can only harden a weakly
        held environment if it is still acquired hard (acquire()).

		@param ppHardEnv inout hard referenced environment (has to be released via release())
		@param pEnv environment (may be weak referenced)
	*/
	void (SAL_CALL * harden)(
		struct _uno_Environment ** ppHardEnv,
		struct _uno_Environment * pEnv );

	/** Call this function to EXPLICITLY dispose this environment (e.g., release all
        interfaces). You may want to call this function before shutting down due to a runtime error.

		@param pEnv this environment
	*/
	void (SAL_CALL * dispose)( struct _uno_Environment * pEnv );

	/* ===== the following part will be late initialized by a matching bridge ===== *
	 * ===== and is NOT for public use.										  ===== */

	/** CALLBACK function pointer: Disposing callback function pointer that can be set to get
                                   signalled before the environment is destroyed.

		@param pEnv environment that is being disposed
	*/
	void (SAL_CALL * environmentDisposing)( struct _uno_Environment * pEnv );
} uno_Environment;

/** Generic function pointer declaration to free a proxy object if it is not needed by the
    environment anymore.
	Any proxy object must register itself on first acquire() call and revoke itself on last
    release() call. This can happen several times because the environment caches proxy objects
	until the environment explicitly frees the proxy object calling this function.

	@param pEnv environment
	@param pProxy proxy pointer
*/
typedef void (SAL_CALL * uno_freeProxyFunc)( struct _uno_ExtEnvironment * pEnv, void * pProxy );

/** Generic function pointer declaration to allocate memory. Used with getRegisteredInterfaces().

	@param nBytes amount of memory in bytes
	@return pointer to allocated memory
*/
typedef void * (SAL_CALL * uno_memAlloc)( sal_Size nBytes );

/** The binary specification of an UNO environment supporting interface registration.
*/
typedef struct _uno_ExtEnvironment
{
	/** inherits all members of an uno_Environment
	*/
	uno_Environment aBase;

	/** Registers an interface of this environment.

		@param pEnv			this environment
		@param ppInterface	inout parameter of interface to be registered
		@param pOId			object id of interface
		@param pTypeDescr	type description of interface
	*/
	void (SAL_CALL * registerInterface)(
		struct _uno_ExtEnvironment * pEnv,
		void ** ppInterface,
		rtl_uString * pOId,
		struct _typelib_InterfaceTypeDescription * pTypeDescr );

	/** Registers a proxy interface of this environment that can be reanimated and is freed
        explicitly by this environment.

		@param pEnv			this environment
		@param ppInterface	inout parameter of interface to be registered
		@param freeProxy	function to free proxy object
		@param pOId			object id of interface
		@param pTypeDescr	type description of interface
	*/
	void (SAL_CALL * registerProxyInterface)(
		struct _uno_ExtEnvironment * pEnv,
		void ** ppProxy,
		uno_freeProxyFunc freeProxy,
		rtl_uString * pOId,
		struct _typelib_InterfaceTypeDescription * pTypeDescr );

	/** Revokes an interface from this environment. You have to revoke any interface that has
        been registered via this method.

		@param pEnv			this environment
		@param pInterface	interface to be revoked
	*/
	void (SAL_CALL * revokeInterface)(
		struct _uno_ExtEnvironment * pEnv,
		void * pInterface );

	/** Provides the object id of a given interface.

		@param ppOut		inout oid
		@param pInterface	interface of object
	*/
	void (SAL_CALL * getObjectIdentifier)(
		struct _uno_ExtEnvironment * pEnv,
		rtl_uString ** ppOId,
		void * pInterface );

	/** Retrieves an interface identified by its object id and type from this environment.
		Interfaces are retrieved in the same order as they are registered.

		@param pEnv			this environment
		@param ppInterface	inout parameter for the registered interface; (0) if none was found
		@param pOId			object id of interface to be retrieved
		@param pTypeDescr	type description of interface to be retrieved
	*/
	void (SAL_CALL * getRegisteredInterface)(
		struct _uno_ExtEnvironment * pEnv,
		void ** ppInterface,
		rtl_uString * pOId,
		struct _typelib_InterfaceTypeDescription * pTypeDescr );

	/** Returns all currently registered interfaces of this environment. The memory block
        allocated might be slightly larger than (*pnLen * sizeof(void *)).

		@param pEnv			this environment
		@param pppInterfaces out param; pointer to array of interface pointers
		@param pnLen		out param; length of array
		@param memAlloc		function for allocating memory that is passed back
	*/
	void (SAL_CALL * getRegisteredInterfaces)(
		struct _uno_ExtEnvironment * pEnv,
		void *** pppInterfaces,
		sal_Int32 * pnLen,
		uno_memAlloc memAlloc );

	/* ===== the following part will be late initialized by a matching bridge ===== */

	/** Computes an object id of the given interface; is called by the environment implementation.

		@param pEnv			corresponding environment
		@param ppOId		out param: computed id
		@param pInterface	an interface
	*/
	void (SAL_CALL * computeObjectIdentifier)(
		struct _uno_ExtEnvironment * pEnv,
		rtl_uString ** ppOId, void * pInterface );

	/** Function to acquire an interface.

		@param pEnv			corresponding environment
		@param pInterface	an interface
	*/
	void (SAL_CALL * acquireInterface)(
		struct _uno_ExtEnvironment * pEnv,
		void * pInterface );

	/** Function to release an interface.

		@param pEnv			corresponding environment
		@param pInterface	an interface
	*/
	void (SAL_CALL * releaseInterface)(
		struct _uno_ExtEnvironment * pEnv,
		void * pInterface );

} uno_ExtEnvironment;

#if defined( SAL_W32) ||  defined(SAL_OS2)
#pragma pack(pop)
#endif

/** Function exported by some bridge library providing acquireInterface(), releaseInterface();
    may set a disposing callback.

	@param pEnv environment to be initialized
*/
typedef void (SAL_CALL * uno_initEnvironmentFunc)( uno_Environment * pEnv );
#define UNO_INIT_ENVIRONMENT "uno_initEnvironment"

/** Gets a specific environment. If the specified environment does not exist, then a default one
    is created and registered. The environment revokes itself on last release() call.

	@param ppEnv		inout parameter of environment; given environment will be released
	@param pEnvDcp	    descriptor of environment
	@param pContext		some context pointer (e.g., to distinguish java vm; set 0 if not needed)
*/
void SAL_CALL uno_getEnvironment(
	uno_Environment ** ppEnv, rtl_uString * pEnvDcp, void * pContext )
	SAL_THROW_EXTERN_C();

/** Gets all specified environments. Caller has to release returned environments and free allocated
    memory.

	@param pppEnvs		out param; pointer to array of environments
	@param pnLen		out param; length of array
	@param memAlloc		function for allocating memory that is passed back
	@param pEnvDcp      descriptor of environments; 0 defaults to all
*/
void SAL_CALL uno_getRegisteredEnvironments(
	uno_Environment *** pppEnvs, sal_Int32 * pnLen, uno_memAlloc memAlloc,
	rtl_uString * pEnvDcp )
	SAL_THROW_EXTERN_C();

/** Creates an environment. The new environment is anonymous (NOT publicly registered/ accessible).

	@param ppEnv		out parameter of environment; given environment will be released
	@param pEnvDcp      descriptor of environment
	@param pContext		context pointer (e.g., to distinguish java vm); set 0 if not needed
*/
void SAL_CALL uno_createEnvironment(
	uno_Environment ** ppEnv, rtl_uString * pEnvDcp, void * pContext )
	SAL_THROW_EXTERN_C();

/** Dumps out environment information, i.e. registered interfaces.

	@param stream		output stream (FILE *)
	@param pEnv			environment to be dumped
	@param pFilter		if not null, filters output
*/
void SAL_CALL uno_dumpEnvironment(
	void * stream, uno_Environment * pEnv, const sal_Char * pFilter )
	SAL_THROW_EXTERN_C();
/** Dumps out environment information, i.e. registered interfaces.

	@param stream		output stream (FILE *)
	@param pEnvDcp      descritpro of environment to be dumped
	@param pFilter		if not null, filters output
*/
void SAL_CALL uno_dumpEnvironmentByName(
	void * stream, rtl_uString * pEnvDcp, const sal_Char * pFilter )
	SAL_THROW_EXTERN_C();



/** Returns the current Environment.
	In case no Environment has explicitly been entered, a purpose free
	default environment gets returned (e.g. the "uno" or "gcc3" Environment).

	@param ppEnv	  inout parameter; a given environment will be released
	@param pTypeName  the optional type of the environment, falls back to "uno"
    @since UDK 3.2.7
*/
void SAL_CALL uno_getCurrentEnvironment(uno_Environment ** ppEnv, rtl_uString * pTypeName)
	SAL_THROW_EXTERN_C();

/** Typedef for variable argument function.
 */
typedef void SAL_CALL uno_EnvCallee(va_list * pParam);

/** Invoke the passed function in the given environment.

    @param pEnv     the target environment
    @param pCallee  the function to call
    @param pParam   the parameter pointer passed to the function
    @since UDK 3.2.7
 */
void SAL_CALL uno_Environment_invoke_v(uno_Environment * pEnv, uno_EnvCallee * pCallee, va_list * pParam)
	SAL_THROW_EXTERN_C();

/** Invoke the passed function in the given environment.

    @param pEnv     the target environment
    @param pCallee  the function to call
    @param ...      the parameters passed to the function
    @since UDK 3.2.7
*/
void SAL_CALL uno_Environment_invoke (uno_Environment * pEnv, uno_EnvCallee * pCallee, ...)
	SAL_THROW_EXTERN_C();

/** Enter an environment explicitly.

	@param pEnv    the environment to enter; NULL leaves all environments
    @since UDK 3.2.7
*/
void SAL_CALL uno_Environment_enter(uno_Environment * pEnv)
	SAL_THROW_EXTERN_C();

/** Check if a particular environment is currently valid, so
	that objects of that environment might be called.

	@param pEnv                    the environment
    @param rtl_uString ** pReason  the reason, if it is not valid
	@return                        1 == valid, 0 == invalid
    @since UDK 3.2.7
*/
int SAL_CALL uno_Environment_isValid(uno_Environment * pEnv, rtl_uString ** pReason)
	SAL_THROW_EXTERN_C();



#ifdef __cplusplus
}
#endif

#endif
