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

#include <sal/types.h>

#ifdef __cplusplus
extern "C"
{
#endif

struct _typelib_TypeDescriptionReference;
struct _typelib_TypeDescription;
struct _typelib_InterfaceTypeDescription;
struct _uno_Mapping;

/** Generic function pointer declaration to query for an interface.

	@param pInterface interface
	@param pTypedemanded interface type
	@return interface pointer
*/
typedef void * (SAL_CALL * uno_QueryInterfaceFunc)(
	void * pInterface, struct _typelib_TypeDescriptionReference * pType );
/** Generic function pointer declaration to acquire an interface.

	@param pInterface interface to be acquired
*/
typedef void (SAL_CALL * uno_AcquireFunc)(
	void * pInterface );
/** Generic function pointer declaration to release an interface.

	@param pInterface interface to be release
*/
typedef void (SAL_CALL * uno_ReleaseFunc)(
	void * pInterface );

/** Tests if two values are equal. May compare different types (e.g., short to long).

	@param pVal1			pointer to a value
	@param pVal1TypeDescr	type description of pVal1
	@param pVal2			pointer to another value
	@param pVal2TypeDescr	type description of pVal2
	@param queryInterface	function called each time two interfaces are tested whether they belong
							to the same object; defaults (0) to uno
	@param release			function to release queried interfaces; defaults (0) to uno
	@return true if values are equal
*/
sal_Bool SAL_CALL uno_equalData(
	void * pVal1, struct _typelib_TypeDescription * pVal1TypeDescr,
	void * pVal2, struct _typelib_TypeDescription * pVal2TypeDescr,
	uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
	SAL_THROW_EXTERN_C();
/** Tests if two values are equal. May compare different types (e.g., short to long).

	@param pVal1			pointer to a value
	@param pVal1Type		type of pVal1
	@param pVal2			pointer to another value
	@param pVal2Type		type of pVal2
	@param queryInterface	function called each time two interfaces are tested whether they belong
							to the same object; defaults (0) to uno
	@param release			function to release queried interfaces; defaults (0) to uno
	@return true if values are equal
*/
sal_Bool SAL_CALL uno_type_equalData(
	void * pVal1, struct _typelib_TypeDescriptionReference * pVal1Type,
	void * pVal2, struct _typelib_TypeDescriptionReference * pVal2Type,
	uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
	SAL_THROW_EXTERN_C();

/** Copy construct memory with given value. The size of the destination value must be larger
    or equal to the size of the source value.

	@param pDest			pointer to destination value memory
	@param pSource			pointer to source value
	@param pTypeDescr		type description of source
	@param acquire			function called each time an interface needs to be acquired;
                            defaults (0) to uno
*/
void SAL_CALL uno_copyData(
	void * pDest, void * pSource,
	struct _typelib_TypeDescription * pTypeDescr, uno_AcquireFunc acquire )
	SAL_THROW_EXTERN_C();
/** Copy construct memory with given value. The size of the destination value must be larger
    or equal to the size of the source value.

	@param pDest			pointer to destination value memory
	@param pSource			pointer to source value
	@param pType			type of source
	@param acquire			function called each time an interface needs to be acquired;
                            defaults (0) to uno
*/
void SAL_CALL uno_type_copyData(
	void * pDest, void * pSource,
	struct _typelib_TypeDescriptionReference * pType, uno_AcquireFunc acquire )
	SAL_THROW_EXTERN_C();

/** Copy construct memory with given value. The size of the destination value must be larger
    or equal to the size of the source value. Interfaces are converted/ mapped by mapping parameter.

	@param pDest			pointer to destination value memory
	@param pSource			pointer to source value
	@param pTypeDescr		type description of source
	@param mapping			mapping to convert/ map interfaces
*/
void SAL_CALL uno_copyAndConvertData(
	void * pDest, void * pSource,
	struct _typelib_TypeDescription * pTypeDescr, struct _uno_Mapping * mapping )
	SAL_THROW_EXTERN_C();
/** Copy construct memory with given value. The size of the destination value must be larger
    or equal to the size of the source value. Interfaces are converted/ mapped by mapping parameter.

	@param pDest			pointer to destination value memory
	@param pSource			pointer to source value
	@param pType			type of source
	@param mapping			mapping to convert/ map interfaces
*/
void SAL_CALL uno_type_copyAndConvertData(
	void * pDest, void * pSource,
	struct _typelib_TypeDescriptionReference * pType, struct _uno_Mapping * mapping )
	SAL_THROW_EXTERN_C();

/** Destructs a given value; does NOT free its memory!

	@param pValue			value to be destructed
	@param pTypeDescr		type description of value
	@param release			function called each time an interface pointer needs to be released;
                            defaults (0) to uno
*/
void SAL_CALL uno_destructData(
	void * pValue, struct _typelib_TypeDescription * pTypeDescr, uno_ReleaseFunc release )
	SAL_THROW_EXTERN_C();
/** Destructs a given value; does NOT free its memory!

	@param pValue			value to be destructed
	@param pType			type of value
	@param release			function called each time an interface pointer needs to be released;
                            defaults (0) to uno
*/
void SAL_CALL uno_type_destructData(
	void * pValue, struct _typelib_TypeDescriptionReference * pType, uno_ReleaseFunc release )
	SAL_THROW_EXTERN_C();

/** Default constructs a value. All simple types are set to 0, enums are set to their default value.

	@param pMem				pointer to memory of value to be constructed
	@param pTypeDescr		type description of value to be constructed
*/
void SAL_CALL uno_constructData(
	void * pMem, struct _typelib_TypeDescription * pTypeDescr )
	SAL_THROW_EXTERN_C();
/** Default constructs a value. All simple types are set to 0, enums are set to their default value.

	@param pMem				pointer to memory of value to be constructed
	@param pType			type of value to be constructed
*/
void SAL_CALL uno_type_constructData(
	void * pMem, struct _typelib_TypeDescriptionReference * pType )
	SAL_THROW_EXTERN_C();

/** Assigns a destination value with a source value.
    Widening conversion WITHOUT data loss is allowed (e.g., assigning a long with a short).
    Querying for demanded interface type is allowed.
    Assignment from any value to a value of type Any and vice versa is allowed.

	@param pDest			pointer to destination value
	@param pDestTypeDescr	type description of destination value
	@param pSource			pointer to source value; if 0, then destination value will be assigned
                            to default value
	@param pSourceTypeDescr	type destination of source value
	@param queryInterface	function called each time an interface needs to be queried;
                            defaults (0) to uno
	@param acquire			function called each time an interface needs to be acquired;
                            defaults (0) to uno
	@param release			function called each time an interface needs to be released;
                            defaults (0) to uno
	@return true if destination has been successfully assigned
*/
sal_Bool SAL_CALL uno_assignData(
	void * pDest, struct _typelib_TypeDescription * pDestTypeDescr,
	void * pSource, struct _typelib_TypeDescription * pSourceTypeDescr,
	uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
	SAL_THROW_EXTERN_C();
/** Assigns a destination value with a source value.
    Widening conversion WITHOUT data loss is allowed (e.g., assigning a long with a short).
    Querying for demanded interface type is allowed.
    Assignment from any value to a value of type Any and vice versa is allowed.

	@param pDest			pointer to destination value
	@param pDestType		type of destination value
	@param pSource			pointer to source value; if 0, then destination value will be assigned
                            to default value
	@param pSourceType		type of source value
	@param queryInterface	function called each time an interface needs to be queried;
                            defaults (0) to uno
	@param acquire			function called each time an interface needs to be acquired;
                            defaults (0) to uno
	@param release			function called each time an interface needs to be released;
                            defaults (0) to uno
	@return true if destination has been successfully assigned
*/
sal_Bool SAL_CALL uno_type_assignData(
	void * pDest, struct _typelib_TypeDescriptionReference * pDestType,
	void * pSource, struct _typelib_TypeDescriptionReference * pSourceType,
	uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
	SAL_THROW_EXTERN_C();

/** Tests whether a value of given type is assignable from given value.
    Widening conversion WITHOUT data loss is allowed (e.g., assigning a long with a short).
    Querying for demanded interface type is allowed.
    Assignment from any value to a value of type Any and vice versa is allowed.

	@param pAssignable      type
	@param pFrom			pointer to value
	@param pFromType		type of value
	@param queryInterface	function called each time an interface needs to be queried;
                            defaults (0) to uno
	@param release			function called each time an interface needs to be released;
                            defaults (0) to uno
	@return true if value is destination has been successfully assigned
*/
sal_Bool SAL_CALL uno_type_isAssignableFromData(
    struct _typelib_TypeDescriptionReference * pAssignable,
	void * pFrom, struct _typelib_TypeDescriptionReference * pFromType,
	uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
	SAL_THROW_EXTERN_C();

#ifdef __cplusplus
}
#endif

#endif
