summaryrefslogtreecommitdiff
path: root/cppu/source/uno/data.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'cppu/source/uno/data.cxx')
-rw-r--r--cppu/source/uno/data.cxx610
1 files changed, 610 insertions, 0 deletions
diff --git a/cppu/source/uno/data.cxx b/cppu/source/uno/data.cxx
new file mode 100644
index 000000000000..f9b1903851c4
--- /dev/null
+++ b/cppu/source/uno/data.cxx
@@ -0,0 +1,610 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_cppu.hxx"
+
+#include <cstddef>
+#include <stdio.h>
+
+#include "cppu/macros.hxx"
+
+#include "osl/mutex.hxx"
+
+#include "constr.hxx"
+#include "destr.hxx"
+#include "copy.hxx"
+#include "assign.hxx"
+#include "eq.hxx"
+
+#include "boost/static_assert.hpp"
+
+
+using namespace ::cppu;
+using namespace ::rtl;
+using namespace ::osl;
+
+
+namespace cppu
+{
+
+// Sequence<>() (default ctor) relies on this being static:
+uno_Sequence g_emptySeq = { 1, 0, { 0 } };
+typelib_TypeDescriptionReference * g_pVoidType = 0;
+
+//--------------------------------------------------------------------------------------------------
+void * binuno_queryInterface( void * pUnoI, typelib_TypeDescriptionReference * pDestType )
+{
+ // init queryInterface() td
+ static typelib_TypeDescription * g_pQITD = 0;
+ if (0 == g_pQITD)
+ {
+ MutexGuard aGuard( Mutex::getGlobalMutex() );
+ if (0 == g_pQITD)
+ {
+ typelib_TypeDescriptionReference * type_XInterface =
+ * typelib_static_type_getByTypeClass( typelib_TypeClass_INTERFACE );
+ typelib_InterfaceTypeDescription * pTXInterfaceDescr = 0;
+ TYPELIB_DANGER_GET( (typelib_TypeDescription **) &pTXInterfaceDescr, type_XInterface );
+ OSL_ASSERT( pTXInterfaceDescr->ppAllMembers );
+ typelib_typedescriptionreference_getDescription(
+ &g_pQITD, pTXInterfaceDescr->ppAllMembers[ 0 ] );
+ TYPELIB_DANGER_RELEASE( (typelib_TypeDescription *) pTXInterfaceDescr );
+ }
+ }
+
+ uno_Any aRet, aExc;
+ uno_Any * pExc = &aExc;
+ void * aArgs[ 1 ];
+ aArgs[ 0 ] = &pDestType;
+ (*((uno_Interface *) pUnoI)->pDispatcher)(
+ (uno_Interface *) pUnoI, g_pQITD, &aRet, aArgs, &pExc );
+
+ uno_Interface * ret = 0;
+ if (0 == pExc)
+ {
+ typelib_TypeDescriptionReference * ret_type = aRet.pType;
+ switch (ret_type->eTypeClass)
+ {
+ case typelib_TypeClass_VOID: // common case
+ typelib_typedescriptionreference_release( ret_type );
+ break;
+ case typelib_TypeClass_INTERFACE:
+ // tweaky... avoiding acquire/ release pair
+ typelib_typedescriptionreference_release( ret_type );
+ ret = (uno_Interface *) aRet.pReserved; // serving acquired interface
+ break;
+ default:
+ _destructAny( &aRet, 0 );
+ break;
+ }
+ }
+ else
+ {
+#if OSL_DEBUG_LEVEL > 1
+ OUStringBuffer buf( 128 );
+ buf.appendAscii(
+ RTL_CONSTASCII_STRINGPARAM("### exception occurred querying for interface ") );
+ buf.append( * reinterpret_cast< OUString const * >( &pDestType->pTypeName ) );
+ buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(": [") );
+ buf.append( * reinterpret_cast< OUString const * >( &pExc->pType->pTypeName ) );
+ buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("] ") );
+ // Message is very first member
+ buf.append( * reinterpret_cast< OUString const * >( pExc->pData ) );
+ OString cstr(
+ OUStringToOString( buf.makeStringAndClear(), RTL_TEXTENCODING_ASCII_US ) );
+ OSL_FAIL( cstr.getStr() );
+#endif
+ uno_any_destruct( pExc, 0 );
+ }
+ return ret;
+}
+
+//==================================================================================================
+void defaultConstructStruct(
+ void * pMem,
+ typelib_CompoundTypeDescription * pCompType )
+ SAL_THROW( () )
+{
+ _defaultConstructStruct( pMem, pCompType );
+}
+//==================================================================================================
+void copyConstructStruct(
+ void * pDest, void * pSource,
+ typelib_CompoundTypeDescription * pTypeDescr,
+ uno_AcquireFunc acquire, uno_Mapping * mapping )
+ SAL_THROW( () )
+{
+ _copyConstructStruct( pDest, pSource, pTypeDescr, acquire, mapping );
+}
+//==================================================================================================
+void destructStruct(
+ void * pValue,
+ typelib_CompoundTypeDescription * pTypeDescr,
+ uno_ReleaseFunc release )
+ SAL_THROW( () )
+{
+ _destructStruct( pValue, pTypeDescr, release );
+}
+//==================================================================================================
+sal_Bool equalStruct(
+ void * pDest, void *pSource,
+ typelib_CompoundTypeDescription * pTypeDescr,
+ uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
+ SAL_THROW( () )
+{
+ return _equalStruct( pDest, pSource, pTypeDescr, queryInterface, release );
+}
+//==================================================================================================
+sal_Bool assignStruct(
+ void * pDest, void * pSource,
+ typelib_CompoundTypeDescription * pTypeDescr,
+ uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
+ SAL_THROW( () )
+{
+ return _assignStruct( pDest, pSource, pTypeDescr, queryInterface, acquire, release );
+}
+
+//==============================================================================
+uno_Sequence * copyConstructSequence(
+ uno_Sequence * pSource,
+ typelib_TypeDescriptionReference * pElementType,
+ uno_AcquireFunc acquire, uno_Mapping * mapping )
+{
+ return icopyConstructSequence( pSource, pElementType, acquire, mapping );
+}
+
+//==============================================================================
+void destructSequence(
+ uno_Sequence * pSequence,
+ typelib_TypeDescriptionReference * pType,
+ typelib_TypeDescription * pTypeDescr,
+ uno_ReleaseFunc release )
+{
+ idestructSequence( pSequence, pType, pTypeDescr, release );
+}
+
+//==================================================================================================
+sal_Bool equalSequence(
+ uno_Sequence * pDest, uno_Sequence * pSource,
+ typelib_TypeDescriptionReference * pElementType,
+ uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
+ SAL_THROW( () )
+{
+ return _equalSequence( pDest, pSource, pElementType, queryInterface, release );
+}
+
+extern "C"
+{
+//##################################################################################################
+void SAL_CALL uno_type_constructData(
+ void * pMem, typelib_TypeDescriptionReference * pType )
+ SAL_THROW_EXTERN_C()
+{
+ _defaultConstructData( pMem, pType, 0 );
+}
+//##################################################################################################
+void SAL_CALL uno_constructData(
+ void * pMem, typelib_TypeDescription * pTypeDescr )
+ SAL_THROW_EXTERN_C()
+{
+ _defaultConstructData( pMem, pTypeDescr->pWeakRef, pTypeDescr );
+}
+//##################################################################################################
+void SAL_CALL uno_type_destructData(
+ void * pValue, typelib_TypeDescriptionReference * pType,
+ uno_ReleaseFunc release )
+ SAL_THROW_EXTERN_C()
+{
+ _destructData( pValue, pType, 0, release );
+}
+//##################################################################################################
+void SAL_CALL uno_destructData(
+ void * pValue,
+ typelib_TypeDescription * pTypeDescr,
+ uno_ReleaseFunc release )
+ SAL_THROW_EXTERN_C()
+{
+ _destructData( pValue, pTypeDescr->pWeakRef, pTypeDescr, release );
+}
+//##################################################################################################
+void SAL_CALL uno_type_copyData(
+ void * pDest, void * pSource,
+ typelib_TypeDescriptionReference * pType,
+ uno_AcquireFunc acquire )
+ SAL_THROW_EXTERN_C()
+{
+ _copyConstructData( pDest, pSource, pType, 0, acquire, 0 );
+}
+//##################################################################################################
+void SAL_CALL uno_copyData(
+ void * pDest, void * pSource,
+ typelib_TypeDescription * pTypeDescr,
+ uno_AcquireFunc acquire )
+ SAL_THROW_EXTERN_C()
+{
+ _copyConstructData( pDest, pSource, pTypeDescr->pWeakRef, pTypeDescr, acquire, 0 );
+}
+//##################################################################################################
+void SAL_CALL uno_type_copyAndConvertData(
+ void * pDest, void * pSource,
+ typelib_TypeDescriptionReference * pType,
+ uno_Mapping * mapping )
+ SAL_THROW_EXTERN_C()
+{
+ _copyConstructData( pDest, pSource, pType, 0, 0, mapping );
+}
+//##################################################################################################
+void SAL_CALL uno_copyAndConvertData(
+ void * pDest, void * pSource,
+ typelib_TypeDescription * pTypeDescr,
+ uno_Mapping * mapping )
+ SAL_THROW_EXTERN_C()
+{
+ _copyConstructData( pDest, pSource, pTypeDescr->pWeakRef, pTypeDescr, 0, mapping );
+}
+//##################################################################################################
+sal_Bool SAL_CALL uno_type_equalData(
+ void * pVal1, typelib_TypeDescriptionReference * pVal1Type,
+ void * pVal2, typelib_TypeDescriptionReference * pVal2Type,
+ uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
+ SAL_THROW_EXTERN_C()
+{
+ return _equalData(
+ pVal1, pVal1Type, 0,
+ pVal2, pVal2Type,
+ queryInterface, release );
+}
+//##################################################################################################
+sal_Bool SAL_CALL uno_equalData(
+ void * pVal1, typelib_TypeDescription * pVal1TD,
+ void * pVal2, typelib_TypeDescription * pVal2TD,
+ uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
+ SAL_THROW_EXTERN_C()
+{
+ return _equalData(
+ pVal1, pVal1TD->pWeakRef, pVal1TD,
+ pVal2, pVal2TD->pWeakRef,
+ queryInterface, release );
+}
+//##################################################################################################
+sal_Bool SAL_CALL uno_type_assignData(
+ void * pDest, typelib_TypeDescriptionReference * pDestType,
+ void * pSource, typelib_TypeDescriptionReference * pSourceType,
+ uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
+ SAL_THROW_EXTERN_C()
+{
+ return _assignData(
+ pDest, pDestType, 0,
+ pSource, pSourceType, 0,
+ queryInterface, acquire, release );
+}
+//##################################################################################################
+sal_Bool SAL_CALL uno_assignData(
+ void * pDest, typelib_TypeDescription * pDestTD,
+ void * pSource, typelib_TypeDescription * pSourceTD,
+ uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
+ SAL_THROW_EXTERN_C()
+{
+ return _assignData(
+ pDest, pDestTD->pWeakRef, pDestTD,
+ pSource, pSourceTD->pWeakRef, pSourceTD,
+ queryInterface, acquire, release );
+}
+//##################################################################################################
+sal_Bool SAL_CALL uno_type_isAssignableFromData(
+ typelib_TypeDescriptionReference * pAssignable,
+ void * pFrom, typelib_TypeDescriptionReference * pFromType,
+ uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
+ SAL_THROW_EXTERN_C()
+{
+ if (::typelib_typedescriptionreference_isAssignableFrom( pAssignable, pFromType ))
+ return sal_True;
+ if (typelib_TypeClass_INTERFACE != pFromType->eTypeClass ||
+ typelib_TypeClass_INTERFACE != pAssignable->eTypeClass)
+ {
+ return sal_False;
+ }
+
+ // query
+ if (0 == pFrom)
+ return sal_False;
+ void * pInterface = *(void **)pFrom;
+ if (0 == pInterface)
+ return sal_False;
+
+ if (0 == queryInterface)
+ queryInterface = binuno_queryInterface;
+ void * p = (*queryInterface)( pInterface, pAssignable );
+ _release( p, release );
+ return (0 != p);
+}
+}
+
+
+//##################################################################################################
+//##################################################################################################
+//##################################################################################################
+
+
+#if OSL_DEBUG_LEVEL > 1
+
+#if defined( SAL_W32)
+#pragma pack(push, 8)
+#elif defined(SAL_OS2)
+#pragma pack(push, 4)
+#endif
+
+#if defined(INTEL) \
+ && (defined(__GNUC__) && (defined(LINUX) || defined(FREEBSD) || defined(OS2) \
+ || defined(NETBSD) || defined(OPENBSD)) || defined(MACOSX) || defined(DRAGONFLY) \
+ || defined(__SUNPRO_CC) && defined(SOLARIS))
+#define MAX_ALIGNMENT_4
+#endif
+
+#define OFFSET_OF( s, m ) reinterpret_cast< std::size_t >((char *)&((s *)16)->m -16)
+
+#define BINTEST_VERIFY( c ) \
+ if (! (c)) { fprintf( stderr, "### binary compatibility test failed: %s [line %d]!!!\n", #c, __LINE__ ); abort(); }
+#define BINTEST_VERIFYOFFSET( s, m, n ) \
+ if (OFFSET_OF(s, m) != n) { fprintf( stderr, "### OFFSET_OF(" #s ", " #m ") = %" SAL_PRI_SIZET "u instead of expected %d!!!\n", OFFSET_OF(s, m), n ); abort(); }
+
+#define BINTEST_VERIFYSIZE( s, n ) \
+ if (sizeof(s) != n) { fprintf( stderr, "### sizeof(" #s ") = %d instead of expected %d!!!\n", sizeof(s), n ); abort(); }
+
+struct C1
+{
+ sal_Int16 n1;
+};
+struct C2 : public C1
+{
+ sal_Int32 n2 CPPU_GCC3_ALIGN( C1 );
+};
+struct C3 : public C2
+{
+ double d3;
+ sal_Int32 n3;
+};
+struct C4 : public C3
+{
+ sal_Int32 n4 CPPU_GCC3_ALIGN( C3 );
+ double d4;
+};
+struct C5 : public C4
+{
+ sal_Int64 n5;
+ sal_Bool b5;
+};
+struct C6 : public C1
+{
+ C5 c6 CPPU_GCC3_ALIGN( C1 );
+ sal_Bool b6;
+};
+
+struct D
+{
+ sal_Int16 d;
+ sal_Int32 e;
+};
+struct E
+{
+ sal_Bool a;
+ sal_Bool b;
+ sal_Bool c;
+ sal_Int16 d;
+ sal_Int32 e;
+};
+
+struct M
+{
+ sal_Int32 n;
+ sal_Int16 o;
+};
+
+struct N : public M
+{
+ sal_Int16 p CPPU_GCC3_ALIGN( M );
+};
+struct N2
+{
+ M m;
+ sal_Int16 p;
+};
+
+struct O : public M
+{
+ double p;
+ sal_Int16 q;
+};
+struct O2 : public O
+{
+ sal_Int16 p2 CPPU_GCC3_ALIGN( O );
+};
+
+struct P : public N
+{
+ double p2;
+};
+
+struct empty
+{
+};
+struct second : public empty
+{
+ int a;
+};
+
+struct AlignSize_Impl
+{
+ sal_Int16 nInt16;
+ double dDouble;
+};
+
+struct Char1
+{
+ char c1;
+};
+struct Char2 : public Char1
+{
+ char c2 CPPU_GCC3_ALIGN( Char1 );
+};
+struct Char3 : public Char2
+{
+ char c3 CPPU_GCC3_ALIGN( Char2 );
+};
+struct Char4
+{
+ Char3 chars;
+ char c;
+};
+class Ref
+{
+ void * p;
+};
+enum Enum
+{
+ v = SAL_MAX_ENUM
+};
+
+
+class BinaryCompatible_Impl
+{
+public:
+ BinaryCompatible_Impl();
+};
+BinaryCompatible_Impl::BinaryCompatible_Impl()
+{
+ BOOST_STATIC_ASSERT( ((sal_Bool) true) == sal_True &&
+ (1 != 0) == sal_True );
+ BOOST_STATIC_ASSERT( ((sal_Bool) false) == sal_False &&
+ (1 == 0) == sal_False );
+#ifdef MAX_ALIGNMENT_4
+ // max alignment is 4
+ BINTEST_VERIFYOFFSET( AlignSize_Impl, dDouble, 4 );
+ BINTEST_VERIFYSIZE( AlignSize_Impl, 12 );
+#else
+ // max alignment is 8
+ BINTEST_VERIFYOFFSET( AlignSize_Impl, dDouble, 8 );
+ BINTEST_VERIFYSIZE( AlignSize_Impl, 16 );
+#endif
+
+ // sequence
+ BINTEST_VERIFY( (SAL_SEQUENCE_HEADER_SIZE % 8) == 0 );
+ // enum
+ BINTEST_VERIFY( sizeof( Enum ) == sizeof( sal_Int32 ) );
+ // any
+ BINTEST_VERIFY( sizeof(void *) >= sizeof(sal_Int32) );
+ BINTEST_VERIFY( sizeof( uno_Any ) == sizeof( void * ) * 3 );
+ BINTEST_VERIFYOFFSET( uno_Any, pType, 0 );
+ BINTEST_VERIFYOFFSET( uno_Any, pData, 1 * sizeof (void *) );
+ BINTEST_VERIFYOFFSET( uno_Any, pReserved, 2 * sizeof (void *) );
+ // interface
+ BINTEST_VERIFY( sizeof( Ref ) == sizeof( void * ) );
+ // string
+ BINTEST_VERIFY( sizeof( OUString ) == sizeof( rtl_uString * ) );
+ // struct
+ BINTEST_VERIFYSIZE( M, 8 );
+ BINTEST_VERIFYOFFSET( M, o, 4 );
+ BINTEST_VERIFYSIZE( N, 12 );
+ BINTEST_VERIFYOFFSET( N, p, 8 );
+ BINTEST_VERIFYSIZE( N2, 12 );
+ BINTEST_VERIFYOFFSET( N2, p, 8 );
+#ifdef MAX_ALIGNMENT_4
+ BINTEST_VERIFYSIZE( O, 20 );
+#else
+ BINTEST_VERIFYSIZE( O, 24 );
+#endif
+ BINTEST_VERIFYSIZE( D, 8 );
+ BINTEST_VERIFYOFFSET( D, e, 4 );
+ BINTEST_VERIFYOFFSET( E, d, 4 );
+ BINTEST_VERIFYOFFSET( E, e, 8 );
+
+ BINTEST_VERIFYSIZE( C1, 2 );
+ BINTEST_VERIFYSIZE( C2, 8 );
+ BINTEST_VERIFYOFFSET( C2, n2, 4 );
+
+#ifdef MAX_ALIGNMENT_4
+ BINTEST_VERIFYSIZE( C3, 20 );
+ BINTEST_VERIFYOFFSET( C3, d3, 8 );
+ BINTEST_VERIFYOFFSET( C3, n3, 16 );
+ BINTEST_VERIFYSIZE( C4, 32 );
+ BINTEST_VERIFYOFFSET( C4, n4, 20 );
+ BINTEST_VERIFYOFFSET( C4, d4, 24 );
+ BINTEST_VERIFYSIZE( C5, 44 );
+ BINTEST_VERIFYOFFSET( C5, n5, 32 );
+ BINTEST_VERIFYOFFSET( C5, b5, 40 );
+ BINTEST_VERIFYSIZE( C6, 52 );
+ BINTEST_VERIFYOFFSET( C6, c6, 4 );
+ BINTEST_VERIFYOFFSET( C6, b6, 48 );
+
+ BINTEST_VERIFYSIZE( O2, 24 );
+ BINTEST_VERIFYOFFSET( O2, p2, 20 );
+#else
+ BINTEST_VERIFYSIZE( C3, 24 );
+ BINTEST_VERIFYOFFSET( C3, d3, 8 );
+ BINTEST_VERIFYOFFSET( C3, n3, 16 );
+ BINTEST_VERIFYSIZE( C4, 40 );
+ BINTEST_VERIFYOFFSET( C4, n4, 24 );
+ BINTEST_VERIFYOFFSET( C4, d4, 32 );
+ BINTEST_VERIFYSIZE( C5, 56 );
+ BINTEST_VERIFYOFFSET( C5, n5, 40 );
+ BINTEST_VERIFYOFFSET( C5, b5, 48 );
+ BINTEST_VERIFYSIZE( C6, 72 );
+ BINTEST_VERIFYOFFSET( C6, c6, 8 );
+ BINTEST_VERIFYOFFSET( C6, b6, 64 );
+
+ BINTEST_VERIFYSIZE( O2, 32 );
+ BINTEST_VERIFYOFFSET( O2, p2, 24 );
+#endif
+
+ BINTEST_VERIFYSIZE( Char3, 3 );
+ BINTEST_VERIFYOFFSET( Char4, c, 3 );
+
+#ifdef MAX_ALIGNMENT_4
+ // max alignment is 4
+ BINTEST_VERIFYSIZE( P, 20 );
+#else
+ // alignment of P is 8, because of P[] ...
+ BINTEST_VERIFYSIZE( P, 24 );
+ BINTEST_VERIFYSIZE( second, sizeof( int ) );
+#endif
+}
+
+#ifdef SAL_W32
+# pragma pack(pop)
+#elif defined(SAL_OS2)
+# pragma pack()
+#endif
+
+static BinaryCompatible_Impl aTest;
+
+#endif
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */