[Libreoffice-commits] .: bridges/prj bridges/source

Tor Lillqvist tml at kemper.freedesktop.org
Sun Jan 16 17:54:38 PST 2011


 bridges/prj/build.lst                                |    1 
 bridges/source/cpp_uno/msvc_win32_intel/makefile.mk  |    2 
 bridges/source/cpp_uno/msvc_win32_x86-64/cpp2uno.cxx |  491 ++++++++++++++
 bridges/source/cpp_uno/msvc_win32_x86-64/dllinit.cxx |   61 +
 bridges/source/cpp_uno/msvc_win32_x86-64/except.cxx  |  634 +++++++++++++++++++
 bridges/source/cpp_uno/msvc_win32_x86-64/makefile.mk |   83 ++
 bridges/source/cpp_uno/msvc_win32_x86-64/mscx.hxx    |   59 +
 bridges/source/cpp_uno/msvc_win32_x86-64/uno2cpp.cxx |  468 ++++++++++++++
 8 files changed, 1798 insertions(+), 1 deletion(-)

New commits:
commit deb324226a741a95f65736e34e4ab184598f204e
Author: Tor Lillqvist <tlillqvist at novell.com>
Date:   Mon Jan 17 03:52:12 2011 +0200

    Commit 64-bit Win32 C++ bridge files
    
    Just copies of the 32-bit ones so far, so obviously don't compile
    even. No in-line assembly in 64-bit MSVC for instance.

diff --git a/bridges/prj/build.lst b/bridges/prj/build.lst
index 34eda8a..444e8f3 100644
--- a/bridges/prj/build.lst
+++ b/bridges/prj/build.lst
@@ -7,6 +7,7 @@ br	bridges\source\remote\urp				nmake	-	all	br_rem_urp br_rem_static br_inc NULL
 br	bridges\source\remote\context			nmake	-	all	br_rcon br_unotypes br_inc NULL
 br	bridges\source\cpp_uno\mingw_intel	nmake	-	w	br_gcc3i br_cppuno_shared br_unotypes br_inc NULL
 br	bridges\source\cpp_uno\msvc_win32_intel	nmake	-	w	br_msci br_cppuno_shared br_unotypes br_inc NULL
+br	bridges\source\cpp_uno\msvc_win32_x86-64	nmake	-	w	br_mscx br_cppuno_shared br_unotypes br_inc NULL
 br	bridges\source\cpp_uno\gcc3_linux_intel	nmake	-	u	br_gcc3li br_cppuno_shared br_unotypes br_inc NULL
 br	bridges\source\cpp_uno\gcc3_os2_intel	nmake	-	p	br_gcc3os br_cppuno_shared br_unotypes br_inc NULL
 br	bridges\source\cpp_uno\gcc3_linux_x86-64	nmake	-	u	br_gcc3lx br_cppuno_shared br_unotypes br_inc NULL
diff --git a/bridges/source/cpp_uno/msvc_win32_intel/makefile.mk b/bridges/source/cpp_uno/msvc_win32_intel/makefile.mk
index 194d8d6..b4608cc 100644
--- a/bridges/source/cpp_uno/msvc_win32_intel/makefile.mk
+++ b/bridges/source/cpp_uno/msvc_win32_intel/makefile.mk
@@ -37,7 +37,7 @@ ENABLE_EXCEPTIONS=TRUE
 .INCLUDE :  settings.mk
 
 # --- Files --------------------------------------------------------
-.IF "$(COM)" == "MSC"
+.IF "$(COM)$(CPU)" == "MSCI"
 
 .IF "$(debug)" != ""
 CFLAGS += -Ob0
diff --git a/bridges/source/cpp_uno/msvc_win32_x86-64/cpp2uno.cxx b/bridges/source/cpp_uno/msvc_win32_x86-64/cpp2uno.cxx
new file mode 100644
index 0000000..708cf8c
--- /dev/null
+++ b/bridges/source/cpp_uno/msvc_win32_x86-64/cpp2uno.cxx
@@ -0,0 +1,491 @@
+/* -*- 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_bridges.hxx"
+
+#include <malloc.h>
+
+#include <com/sun/star/uno/genfunc.hxx>
+#include <uno/data.h>
+#include <typelib/typedescription.hxx>
+
+#include "bridges/cpp_uno/shared/bridge.hxx"
+#include "bridges/cpp_uno/shared/cppinterfaceproxy.hxx"
+#include "bridges/cpp_uno/shared/types.hxx"
+#include "bridges/cpp_uno/shared/vtablefactory.hxx"
+
+#include "mscx.hxx"
+
+using namespace ::com::sun::star::uno;
+
+namespace
+{
+
+//==================================================================================================
+static inline typelib_TypeClass cpp2uno_call(
+    bridges::cpp_uno::shared::CppInterfaceProxy * pThis,
+    const typelib_TypeDescription * pMemberTypeDescr,
+    typelib_TypeDescriptionReference * pReturnTypeRef, // 0 indicates void return
+    sal_Int32 nParams, typelib_MethodParameter * pParams,
+    void ** pCallStack,
+    sal_Int64 * pRegisterReturn /* space for register return */ )
+{
+    // pCallStack: ret, this, [complex return ptr], params
+    char * pCppStack = (char *)(pCallStack +2);
+
+    // return
+    typelib_TypeDescription * pReturnTypeDescr = 0;
+    if (pReturnTypeRef)
+    {
+        TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef );
+    }
+
+    void * pUnoReturn = 0;
+    void * pCppReturn = 0; // complex return ptr: if != 0 && != pUnoReturn, reconversion need
+
+    if (pReturnTypeDescr)
+    {
+        if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr ))
+        {
+            pUnoReturn = pRegisterReturn; // direct way for simple types
+        }
+        else // complex return via ptr (pCppReturn)
+        {
+            pCppReturn = *(void **)pCppStack;
+            pCppStack += sizeof(void *);
+
+            pUnoReturn = (bridges::cpp_uno::shared::relatesToInterfaceType(
+                              pReturnTypeDescr )
+                          ? alloca( pReturnTypeDescr->nSize )
+                          : pCppReturn); // direct way
+        }
+    }
+
+    // stack space
+    OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" );
+    // parameters
+    void ** pUnoArgs = (void **)alloca( 4 * sizeof(void *) * nParams );
+    void ** pCppArgs = pUnoArgs + nParams;
+    // indizes of values this have to be converted (interface conversion cpp<=>uno)
+    sal_Int32 * pTempIndizes = (sal_Int32 *)(pUnoArgs + (2 * nParams));
+    // type descriptions for reconversions
+    typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pUnoArgs + (3 * nParams));
+
+    sal_Int32 nTempIndizes = 0;
+
+    for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos )
+    {
+        const typelib_MethodParameter & rParam = pParams[nPos];
+        typelib_TypeDescription * pParamTypeDescr = 0;
+        TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
+
+        if (!rParam.bOut
+            && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ))
+            // value
+        {
+            pCppArgs[nPos] = pCppStack;
+            pUnoArgs[nPos] = pCppStack;
+            switch (pParamTypeDescr->eTypeClass)
+            {
+            case typelib_TypeClass_HYPER:
+            case typelib_TypeClass_UNSIGNED_HYPER:
+            case typelib_TypeClass_DOUBLE:
+                pCppStack += sizeof(sal_Int32); // extra long
+                break;
+            default:
+                break;
+            }
+            // no longer needed
+            TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+        }
+        else // ptr to complex value | ref
+        {
+            pCppArgs[nPos] = *(void **)pCppStack;
+
+            if (! rParam.bIn) // is pure out
+            {
+                // uno out is unconstructed mem!
+                pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize );
+                pTempIndizes[nTempIndizes] = nPos;
+                // will be released at reconversion
+                ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+            }
+            // is in/inout
+            else if (bridges::cpp_uno::shared::relatesToInterfaceType(
+                         pParamTypeDescr ))
+            {
+                ::uno_copyAndConvertData(
+                    pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize ),
+                    *(void **)pCppStack, pParamTypeDescr,
+                    pThis->getBridge()->getCpp2Uno() );
+                pTempIndizes[nTempIndizes] = nPos; // has to be reconverted
+                // will be released at reconversion
+                ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+            }
+            else // direct way
+            {
+                pUnoArgs[nPos] = *(void **)pCppStack;
+                // no longer needed
+                TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+            }
+        }
+        pCppStack += sizeof(sal_Int32); // standard parameter length
+    }
+
+    // ExceptionHolder
+    uno_Any aUnoExc; // Any will be constructed by callee
+    uno_Any * pUnoExc = &aUnoExc;
+
+    // invoke uno dispatch call
+    (*pThis->getUnoI()->pDispatcher)(
+        pThis->getUnoI(), pMemberTypeDescr, pUnoReturn, pUnoArgs, &pUnoExc );
+
+    // in case an exception occurred...
+    if (pUnoExc)
+    {
+        // destruct temporary in/inout params
+        while (nTempIndizes--)
+        {
+            sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+
+            if (pParams[nIndex].bIn) // is in/inout => was constructed
+            {
+                ::uno_destructData( pUnoArgs[nIndex], ppTempParamTypeDescr[nTempIndizes], 0 );
+            }
+            TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndizes] );
+        }
+        if (pReturnTypeDescr)
+        {
+            TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+        }
+
+        CPPU_CURRENT_NAMESPACE::mscx_raiseException(
+            &aUnoExc, pThis->getBridge()->getUno2Cpp() );
+            // has to destruct the any
+        // is here for dummy
+        return typelib_TypeClass_VOID;
+    }
+    else // else no exception occurred...
+    {
+        // temporary params
+        while (nTempIndizes--)
+        {
+            sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+            typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndizes];
+
+            if (pParams[nIndex].bOut) // inout/out
+            {
+                // convert and assign
+                ::uno_destructData(
+                    pCppArgs[nIndex], pParamTypeDescr, cpp_release );
+                ::uno_copyAndConvertData(
+                    pCppArgs[nIndex], pUnoArgs[nIndex], pParamTypeDescr,
+                    pThis->getBridge()->getUno2Cpp() );
+            }
+            // destroy temp uno param
+            ::uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 );
+
+            TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+        }
+        // return
+        if (pCppReturn) // has complex return
+        {
+            if (pUnoReturn != pCppReturn) // needs reconversion
+            {
+                ::uno_copyAndConvertData(
+                    pCppReturn, pUnoReturn, pReturnTypeDescr,
+                    pThis->getBridge()->getUno2Cpp() );
+                // destroy temp uno return
+                ::uno_destructData(
+                    pUnoReturn, pReturnTypeDescr, 0 );
+            }
+            // complex return ptr is set to eax
+            *(void **)pRegisterReturn = pCppReturn;
+        }
+        if (pReturnTypeDescr)
+        {
+            typelib_TypeClass eRet = (typelib_TypeClass)pReturnTypeDescr->eTypeClass;
+            TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+            return eRet;
+        }
+        else
+            return typelib_TypeClass_VOID;
+    }
+}
+
+//==================================================================================================
+static typelib_TypeClass __cdecl cpp_mediate(
+    void ** pCallStack, sal_Int32 nFunctionIndex, sal_Int32 nVtableOffset,
+    sal_Int64 * pRegisterReturn /* space for register return */ )
+{
+    OSL_ENSURE( sizeof(sal_Int32)==sizeof(void *), "### unexpected!" );
+
+    // pCallStack: ret adr, this, [ret *], params
+    void * pThis = static_cast< char * >(pCallStack[1]) - nVtableOffset;
+    bridges::cpp_uno::shared::CppInterfaceProxy * pCppI
+        = bridges::cpp_uno::shared::CppInterfaceProxy::castInterfaceToProxy(
+            pThis);
+
+    typelib_InterfaceTypeDescription * pTypeDescr = pCppI->getTypeDescr();
+    OSL_ENSURE( nFunctionIndex < pTypeDescr->nMapFunctionIndexToMemberIndex,
+                 "### illegal vtable index!" );
+    if (nFunctionIndex >= pTypeDescr->nMapFunctionIndexToMemberIndex)
+    {
+        throw RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("illegal vtable index!") ),
+                                (XInterface *)pThis );
+    }
+
+    // determine called method
+    sal_Int32 nMemberPos = pTypeDescr->pMapFunctionIndexToMemberIndex[nFunctionIndex];
+    OSL_ENSURE( nMemberPos < pTypeDescr->nAllMembers, "### illegal member index!" );
+
+    TypeDescription aMemberDescr( pTypeDescr->ppAllMembers[nMemberPos] );
+
+    typelib_TypeClass eRet;
+    switch (aMemberDescr.get()->eTypeClass)
+    {
+    case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+    {
+        if (pTypeDescr->pMapMemberIndexToFunctionIndex[nMemberPos] == nFunctionIndex)
+        {
+            // is GET method
+            eRet = cpp2uno_call(
+                pCppI, aMemberDescr.get(),
+                ((typelib_InterfaceAttributeTypeDescription *)aMemberDescr.get())->pAttributeTypeRef,
+                0, 0, // no params
+                pCallStack, pRegisterReturn );
+        }
+        else
+        {
+            // is SET method
+            typelib_MethodParameter aParam;
+            aParam.pTypeRef =
+                ((typelib_InterfaceAttributeTypeDescription *)aMemberDescr.get())->pAttributeTypeRef;
+            aParam.bIn		= sal_True;
+            aParam.bOut		= sal_False;
+
+            eRet = cpp2uno_call(
+                pCppI, aMemberDescr.get(),
+                0, // indicates void return
+                1, &aParam,
+                pCallStack, pRegisterReturn );
+        }
+        break;
+    }
+    case typelib_TypeClass_INTERFACE_METHOD:
+    {
+        // is METHOD
+        switch (nFunctionIndex)
+        {
+            // standard XInterface vtable calls
+        case 1: // acquire()
+            pCppI->acquireProxy(); // non virtual call!
+            eRet = typelib_TypeClass_VOID;
+            break;
+        case 2: // release()
+            pCppI->releaseProxy(); // non virtual call!
+            eRet = typelib_TypeClass_VOID;
+            break;
+        case 0: // queryInterface() opt
+        {
+            typelib_TypeDescription * pTD = 0;
+            TYPELIB_DANGER_GET( &pTD, reinterpret_cast< Type * >( pCallStack[3] )->getTypeLibType() );
+            if (pTD)
+            {
+                XInterface * pInterface = 0;
+                (*pCppI->getBridge()->getCppEnv()->getRegisteredInterface)(
+                    pCppI->getBridge()->getCppEnv(),
+                    (void **)&pInterface, pCppI->getOid().pData,
+                    (typelib_InterfaceTypeDescription *)pTD );
+
+                if (pInterface)
+                {
+                    ::uno_any_construct(
+                        reinterpret_cast< uno_Any * >( pCallStack[2] ),
+                        &pInterface, pTD, cpp_acquire );
+                    pInterface->release();
+                    TYPELIB_DANGER_RELEASE( pTD );
+                    *(void **)pRegisterReturn = pCallStack[2];
+                    eRet = typelib_TypeClass_ANY;
+                    break;
+                }
+                TYPELIB_DANGER_RELEASE( pTD );
+            }
+        } // else perform queryInterface()
+        default:
+            eRet = cpp2uno_call(
+                pCppI, aMemberDescr.get(),
+                ((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->pReturnTypeRef,
+                ((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->nParams,
+                ((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->pParams,
+                pCallStack, pRegisterReturn );
+        }
+        break;
+    }
+    default:
+    {
+        throw RuntimeException(
+            rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("no member description found!") ),
+            (XInterface *)pThis );
+        // is here for dummy
+        eRet = typelib_TypeClass_VOID;
+    }
+    }
+
+    return eRet;
+}
+
+//==================================================================================================
+/**
+ * is called on incoming vtable calls
+ * (called by asm snippets)
+ */
+static __declspec(naked) void __cdecl cpp_vtable_call(void)
+{
+__asm
+    {
+        sub		esp, 8		// space for immediate return type
+        push	esp
+        push    edx         // vtable offset
+        push	eax			// function index
+        mov		eax, esp
+        add		eax, 20
+        push	eax			// original stack ptr
+
+        call	cpp_mediate
+        add		esp, 16
+
+        cmp		eax, typelib_TypeClass_FLOAT
+        je		Lfloat
+        cmp		eax, typelib_TypeClass_DOUBLE
+        je		Ldouble
+        cmp		eax, typelib_TypeClass_HYPER
+        je		Lhyper
+        cmp		eax, typelib_TypeClass_UNSIGNED_HYPER
+        je		Lhyper
+        // rest is eax
+        pop		eax
+        add		esp, 4
+        ret
+Lhyper:
+        pop		eax
+        pop		edx
+        ret
+Lfloat:
+        fld		dword ptr [esp]
+        add		esp, 8
+        ret
+Ldouble:
+        fld		qword ptr [esp]
+        add		esp, 8
+        ret
+    }
+}
+
+//==================================================================================================
+int const codeSnippetSize = 16;
+
+unsigned char * codeSnippet(
+    unsigned char * code, sal_Int32 functionIndex, sal_Int32 vtableOffset)
+{
+    unsigned char * p = code;
+    OSL_ASSERT(sizeof (sal_Int32) == 4);
+    // mov eax, functionIndex:
+    *p++ = 0xB8;
+    *reinterpret_cast< sal_Int32 * >(p) = functionIndex;
+    p += sizeof (sal_Int32);
+    // mov edx, vtableOffset:
+    *p++ = 0xBA;
+    *reinterpret_cast< sal_Int32 * >(p) = vtableOffset;
+    p += sizeof (sal_Int32);
+    // jmp rel32 cpp_vtable_call:
+    *p++ = 0xE9;
+    *reinterpret_cast< sal_Int32 * >(p)
+        = ((unsigned char *) cpp_vtable_call) - p - sizeof (sal_Int32);
+    p += sizeof (sal_Int32);
+    OSL_ASSERT(p - code <= codeSnippetSize);
+    return code + codeSnippetSize;
+}
+
+}
+
+struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
+
+bridges::cpp_uno::shared::VtableFactory::Slot *
+bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
+{
+    return static_cast< Slot * >(block) + 1;
+}
+
+sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize(
+    sal_Int32 slotCount)
+{
+    return (slotCount + 1) * sizeof (Slot) + slotCount * codeSnippetSize;
+}
+
+bridges::cpp_uno::shared::VtableFactory::Slot *
+bridges::cpp_uno::shared::VtableFactory::initializeBlock(
+    void * block, sal_Int32 slotCount)
+{
+    struct Rtti {
+        sal_Int32 n0, n1, n2;
+        type_info * rtti;
+        Rtti():
+            n0(0), n1(0), n2(0),
+            rtti(CPPU_CURRENT_NAMESPACE::mscx_getRTTI(
+                     rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
+                                       "com.sun.star.uno.XInterface"))))
+        {}
+    };
+    static Rtti rtti;
+
+    Slot * slots = mapBlockToVtable(block);
+    slots[-1].fn = &rtti;
+    return slots + slotCount;
+}
+
+unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
+    Slot ** slots, unsigned char * code,
+    typelib_InterfaceTypeDescription const *, sal_Int32 functionOffset,
+    sal_Int32 functionCount, sal_Int32 vtableOffset)
+{
+    (*slots) -= functionCount;
+    Slot * s = *slots;
+    for (sal_Int32 i = 0; i < functionCount; ++i) {
+        (s++)->fn = code;
+        code = codeSnippet(code, functionOffset++, vtableOffset);
+    }
+    return code;
+}
+
+void bridges::cpp_uno::shared::VtableFactory::flushCode(
+    unsigned char const *, unsigned char const *)
+{}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/bridges/source/cpp_uno/msvc_win32_x86-64/dllinit.cxx b/bridges/source/cpp_uno/msvc_win32_x86-64/dllinit.cxx
new file mode 100644
index 0000000..4505157
--- /dev/null
+++ b/bridges/source/cpp_uno/msvc_win32_x86-64/dllinit.cxx
@@ -0,0 +1,61 @@
+/* -*- 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_bridges.hxx"
+
+
+#pragma warning(push,1) // disable warnings within system headers
+#include <windows.h>
+#pragma warning(pop)
+
+ 
+void dso_init(void);
+void dso_exit(void);
+
+
+extern "C" BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpvReserved)
+{
+    switch(dwReason) {
+    case DLL_PROCESS_ATTACH:
+        DisableThreadLibraryCalls(hModule);
+
+        dso_init();
+        break;
+
+    case DLL_PROCESS_DETACH:
+        if (!lpvReserved)
+            dso_exit();
+        break;
+    }
+
+    return TRUE;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/bridges/source/cpp_uno/msvc_win32_x86-64/except.cxx b/bridges/source/cpp_uno/msvc_win32_x86-64/except.cxx
new file mode 100644
index 0000000..409cb95
--- /dev/null
+++ b/bridges/source/cpp_uno/msvc_win32_x86-64/except.cxx
@@ -0,0 +1,634 @@
+/* -*- 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_bridges.hxx"
+
+#pragma warning( disable : 4237 )
+#include <hash_map>
+#include <sal/config.h>
+#include <malloc.h>
+#include <new.h>
+#include <typeinfo.h>
+#include <signal.h>
+
+#include "rtl/alloc.h"
+#include "rtl/strbuf.hxx"
+#include "rtl/ustrbuf.hxx"
+
+#include "com/sun/star/uno/Any.hxx"
+
+#include "mscx.hxx"
+
+
+#pragma pack(push, 8)
+
+using namespace ::com::sun::star::uno;
+using namespace ::std;
+using namespace ::osl;
+using namespace ::rtl;
+
+namespace CPPU_CURRENT_NAMESPACE
+{
+
+//==================================================================================================
+static inline OUString toUNOname( OUString const & rRTTIname ) throw ()
+{
+    OUStringBuffer aRet( 64 );
+    OUString aStr( rRTTIname.copy( 4, rRTTIname.getLength()-4-2 ) ); // filter .?AUzzz at yyy@xxx@@
+    sal_Int32 nPos = aStr.getLength();
+    while (nPos > 0)
+    {
+        sal_Int32 n = aStr.lastIndexOf( '@', nPos );
+        aRet.append( aStr.copy( n +1, nPos -n -1 ) );
+        if (n >= 0)
+        {
+            aRet.append( (sal_Unicode)'.' );
+        }
+        nPos = n;
+    }
+    return aRet.makeStringAndClear();
+}
+//==================================================================================================
+static inline OUString toRTTIname( OUString const & rUNOname ) throw ()
+{
+    OUStringBuffer aRet( 64 );
+    aRet.appendAscii( RTL_CONSTASCII_STRINGPARAM(".?AV") ); // class ".?AV"; struct ".?AU"
+    sal_Int32 nPos = rUNOname.getLength();
+    while (nPos > 0)
+    {
+        sal_Int32 n = rUNOname.lastIndexOf( '.', nPos );
+        aRet.append( rUNOname.copy( n +1, nPos -n -1 ) );
+        aRet.append( (sal_Unicode)'@' );
+        nPos = n;
+    }
+    aRet.append( (sal_Unicode)'@' );
+    return aRet.makeStringAndClear();
+}
+
+
+//##################################################################################################
+//#### RTTI simulation #############################################################################
+//##################################################################################################
+
+
+typedef hash_map< OUString, void *, OUStringHash, equal_to< OUString > > t_string2PtrMap;
+
+//==================================================================================================
+class RTTInfos
+{
+    Mutex				_aMutex;
+    t_string2PtrMap		_allRTTI;
+
+    static OUString toRawName( OUString const & rUNOname ) throw ();
+public:
+    type_info * getRTTI( OUString const & rUNOname ) throw ();
+
+    RTTInfos();
+    ~RTTInfos();
+};
+
+//==================================================================================================
+class __type_info
+{
+    friend type_info * RTTInfos::getRTTI( OUString const & ) throw ();
+    friend int mscx_filterCppException(
+        LPEXCEPTION_POINTERS, uno_Any *, uno_Mapping * );
+
+public:
+    virtual ~__type_info() throw ();
+
+    inline __type_info( void * m_data, const char * m_d_name ) throw ()
+        : _m_data( m_data )
+        { ::strcpy( _m_d_name, m_d_name ); } // #100211# - checked
+
+private:
+    void * _m_data;
+    char _m_d_name[1];
+};
+//__________________________________________________________________________________________________
+__type_info::~__type_info() throw ()
+{
+}
+//__________________________________________________________________________________________________
+type_info * RTTInfos::getRTTI( OUString const & rUNOname ) throw ()
+{
+    // a must be
+    OSL_ENSURE( sizeof(__type_info) == sizeof(type_info), "### type info structure size differ!" );
+
+    MutexGuard aGuard( _aMutex );
+    t_string2PtrMap::const_iterator const iFind( _allRTTI.find( rUNOname ) );
+
+    // check if type is already available
+    if (iFind == _allRTTI.end())
+    {
+        // insert new type_info
+        OString aRawName( OUStringToOString( toRTTIname( rUNOname ), RTL_TEXTENCODING_ASCII_US ) );
+        __type_info * pRTTI = new( ::rtl_allocateMemory( sizeof(__type_info) + aRawName.getLength() ) )
+            __type_info( NULL, aRawName.getStr() );
+
+        // put into map
+        pair< t_string2PtrMap::iterator, bool > insertion(
+            _allRTTI.insert( t_string2PtrMap::value_type( rUNOname, pRTTI ) ) );
+        OSL_ENSURE( insertion.second, "### rtti insertion failed?!" );
+
+        return (type_info *)pRTTI;
+    }
+    else
+    {
+        return (type_info *)iFind->second;
+    }
+}
+//__________________________________________________________________________________________________
+RTTInfos::RTTInfos() throw ()
+{
+}
+//__________________________________________________________________________________________________
+RTTInfos::~RTTInfos() throw ()
+{
+#if OSL_DEBUG_LEVEL > 1
+    OSL_TRACE( "> freeing generated RTTI infos... <\n" );
+#endif
+
+    MutexGuard aGuard( _aMutex );
+    for ( t_string2PtrMap::const_iterator iPos( _allRTTI.begin() );
+          iPos != _allRTTI.end(); ++iPos )
+    {
+        __type_info * pType = (__type_info *)iPos->second;
+        pType->~__type_info(); // obsolete, but good style...
+        ::rtl_freeMemory( pType );
+    }
+}
+
+
+//##################################################################################################
+//#### Exception raising ###########################################################################
+//##################################################################################################
+
+
+//==================================================================================================
+struct ObjectFunction
+{
+    char somecode[12];
+    typelib_TypeDescription * _pTypeDescr; // type of object
+
+    inline static void * operator new ( size_t nSize );
+    inline static void operator delete ( void * pMem );
+    
+    ObjectFunction( typelib_TypeDescription * pTypeDescr, void * fpFunc ) throw ();
+    ~ObjectFunction() throw ();
+};
+
+inline void * ObjectFunction::operator new ( size_t nSize ) 
+{
+    void * pMem = rtl_allocateMemory( nSize );
+    if (pMem != 0)
+    {
+        DWORD old_protect;
+#if OSL_DEBUG_LEVEL > 0
+        BOOL success =
+#endif
+        VirtualProtect( pMem, nSize, PAGE_EXECUTE_READWRITE, &old_protect );
+        OSL_ENSURE( success, "VirtualProtect() failed!" );
+    }
+    return pMem;
+}
+
+inline void ObjectFunction::operator delete ( void * pMem )
+{
+    rtl_freeMemory( pMem );
+}
+
+//__________________________________________________________________________________________________
+ObjectFunction::ObjectFunction( typelib_TypeDescription * pTypeDescr, void * fpFunc ) throw ()
+    : _pTypeDescr( pTypeDescr )
+{
+    ::typelib_typedescription_acquire( _pTypeDescr );
+
+    unsigned char * pCode = (unsigned char *)somecode;
+    // a must be!
+    OSL_ENSURE( (void *)this == (void *)pCode, "### unexpected!" );
+
+    // push ObjectFunction this
+    *pCode++ = 0x68;
+    *(void **)pCode = this;
+    pCode += sizeof(void *);
+    // jmp rel32 fpFunc
+    *pCode++ = 0xe9;
+    *(sal_Int32 *)pCode = ((unsigned char *)fpFunc) - pCode - sizeof(sal_Int32);
+}
+//__________________________________________________________________________________________________
+ObjectFunction::~ObjectFunction() throw ()
+{
+    ::typelib_typedescription_release( _pTypeDescr );
+}
+
+//==================================================================================================
+static void * __cdecl __copyConstruct( void * pExcThis, void * pSource, ObjectFunction * pThis )
+    throw ()
+{
+    ::uno_copyData( pExcThis, pSource, pThis->_pTypeDescr, cpp_acquire );
+    return pExcThis;
+}
+//==================================================================================================
+static void * __cdecl __destruct( void * pExcThis, ObjectFunction * pThis )
+    throw ()
+{
+    ::uno_destructData( pExcThis, pThis->_pTypeDescr, cpp_release );
+    return pExcThis;
+}
+
+// these are non virtual object methods; there is no this ptr on stack => ecx supplies _this_ ptr
+
+//==================================================================================================
+static __declspec(naked) void copyConstruct() throw ()
+{
+    __asm
+    {
+        // ObjectFunction this already on stack
+        push [esp+8]  // source exc object this
+        push ecx	  // exc object
+        call __copyConstruct
+        add  esp, 12  // + ObjectFunction this
+        ret  4
+    }
+}
+//==================================================================================================
+static __declspec(naked) void destruct() throw ()
+{
+    __asm
+    {
+        // ObjectFunction this already on stack
+        push ecx	// exc object
+        call __destruct
+        add  esp, 8 // + ObjectFunction this
+        ret
+    }
+}
+
+//==================================================================================================
+struct ExceptionType
+{
+    sal_Int32			_n0;
+    type_info *			_pTypeInfo;
+    sal_Int32			_n1, _n2, _n3, _n4;
+    ObjectFunction *	_pCopyCtor;
+    sal_Int32			_n5;
+
+    inline ExceptionType( typelib_TypeDescription * pTypeDescr ) throw ()
+        : _n0( 0 )
+        , _n1( 0 )
+        , _n2( -1 )
+        , _n3( 0 )
+        , _n4( pTypeDescr->nSize )
+        , _pCopyCtor( new ObjectFunction( pTypeDescr, copyConstruct ) )
+        , _n5( 0 )
+        { _pTypeInfo = mscx_getRTTI( pTypeDescr->pTypeName ); }
+    inline ~ExceptionType() throw ()
+        { delete _pCopyCtor; }
+};
+//==================================================================================================
+struct RaiseInfo
+{
+    sal_Int32			_n0;
+    ObjectFunction *	_pDtor;
+    sal_Int32			_n2;
+    void *				_types;
+    sal_Int32			_n3, _n4;
+
+    RaiseInfo( typelib_TypeDescription * pTypeDescr ) throw ();
+    ~RaiseInfo() throw ();
+};
+//__________________________________________________________________________________________________
+RaiseInfo::RaiseInfo( typelib_TypeDescription * pTypeDescr ) throw ()
+    : _n0( 0 )
+    , _pDtor( new ObjectFunction( pTypeDescr, destruct ) )
+    , _n2( 0 )
+    , _n3( 0 )
+    , _n4( 0 )
+{
+    // a must be
+    OSL_ENSURE( sizeof(sal_Int32) == sizeof(ExceptionType *), "### pointer size differs from sal_Int32!" );
+
+    typelib_CompoundTypeDescription * pCompTypeDescr;
+
+    // info count
+    sal_Int32 nLen = 0;
+    for ( pCompTypeDescr = (typelib_CompoundTypeDescription*)pTypeDescr;
+          pCompTypeDescr; pCompTypeDescr = pCompTypeDescr->pBaseTypeDescription )
+    {
+        ++nLen;
+    }
+
+    // info count accompanied by type info ptrs: type, base type, base base type, ...
+    _types = ::rtl_allocateMemory( sizeof(sal_Int32) + (sizeof(ExceptionType *) * nLen) );
+    *(sal_Int32 *)_types = nLen;
+
+    ExceptionType ** ppTypes = (ExceptionType **)((sal_Int32 *)_types + 1);
+
+    sal_Int32 nPos = 0;
+    for ( pCompTypeDescr = (typelib_CompoundTypeDescription*)pTypeDescr;
+          pCompTypeDescr; pCompTypeDescr = pCompTypeDescr->pBaseTypeDescription )
+    {
+        ppTypes[nPos++] = new ExceptionType( (typelib_TypeDescription *)pCompTypeDescr );
+    }
+}
+//__________________________________________________________________________________________________
+RaiseInfo::~RaiseInfo() throw ()
+{
+    ExceptionType ** ppTypes = (ExceptionType **)((sal_Int32 *)_types + 1);
+    for ( sal_Int32 nTypes = *(sal_Int32 *)_types; nTypes--; )
+    {
+        delete ppTypes[nTypes];
+    }
+    ::rtl_freeMemory( _types );
+
+    delete _pDtor;
+}
+
+//==================================================================================================
+class ExceptionInfos
+{
+    Mutex			_aMutex;
+    t_string2PtrMap	_allRaiseInfos;
+
+public:
+    static void * getRaiseInfo( typelib_TypeDescription * pTypeDescr ) throw ();
+
+    ExceptionInfos() throw ();
+    ~ExceptionInfos() throw ();
+};
+//__________________________________________________________________________________________________
+ExceptionInfos::ExceptionInfos() throw ()
+{
+}
+//__________________________________________________________________________________________________
+ExceptionInfos::~ExceptionInfos() throw ()
+{
+#if OSL_DEBUG_LEVEL > 1
+    OSL_TRACE( "> freeing exception infos... <\n" );
+#endif
+    
+    MutexGuard aGuard( _aMutex );
+    for ( t_string2PtrMap::const_iterator iPos( _allRaiseInfos.begin() );
+          iPos != _allRaiseInfos.end(); ++iPos )
+    {
+        delete (RaiseInfo *)iPos->second;
+    }
+}
+//__________________________________________________________________________________________________
+void * ExceptionInfos::getRaiseInfo( typelib_TypeDescription * pTypeDescr ) throw ()
+{
+    static ExceptionInfos * s_pInfos = 0;
+    if (! s_pInfos)
+    {
+        MutexGuard aGuard( Mutex::getGlobalMutex() );
+        if (! s_pInfos)
+        {
+#ifdef LEAK_STATIC_DATA
+            s_pInfos = new ExceptionInfos();
+#else
+            static ExceptionInfos s_allExceptionInfos;
+            s_pInfos = &s_allExceptionInfos;
+#endif
+        }
+    }
+
+    OSL_ASSERT( pTypeDescr &&
+                (pTypeDescr->eTypeClass == typelib_TypeClass_STRUCT ||
+                 pTypeDescr->eTypeClass == typelib_TypeClass_EXCEPTION) );
+
+    void * pRaiseInfo;
+
+    OUString const & rTypeName = *reinterpret_cast< OUString * >( &pTypeDescr->pTypeName );
+    MutexGuard aGuard( s_pInfos->_aMutex );
+    t_string2PtrMap::const_iterator const iFind(
+        s_pInfos->_allRaiseInfos.find( rTypeName ) );
+    if (iFind == s_pInfos->_allRaiseInfos.end())
+    {
+        pRaiseInfo = new RaiseInfo( pTypeDescr );
+        // put into map
+        pair< t_string2PtrMap::iterator, bool > insertion(
+            s_pInfos->_allRaiseInfos.insert( t_string2PtrMap::value_type( rTypeName, pRaiseInfo ) ) );
+        OSL_ENSURE( insertion.second, "### raise info insertion failed?!" );
+    }
+    else
+    {
+        // reuse existing info
+        pRaiseInfo = iFind->second;
+    }
+
+    return pRaiseInfo;
+}
+
+
+//##################################################################################################
+//#### exported ####################################################################################
+//##################################################################################################
+
+
+//##################################################################################################
+type_info * mscx_getRTTI( OUString const & rUNOname )
+{
+    static RTTInfos * s_pRTTIs = 0;
+    if (! s_pRTTIs)
+    {
+        MutexGuard aGuard( Mutex::getGlobalMutex() );
+        if (! s_pRTTIs)
+        {
+#ifdef LEAK_STATIC_DATA
+            s_pRTTIs = new RTTInfos();
+#else
+            static RTTInfos s_aRTTIs;
+            s_pRTTIs = &s_aRTTIs;
+#endif
+        }
+    }
+    return s_pRTTIs->getRTTI( rUNOname );
+}
+
+//##################################################################################################
+void mscx_raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
+{
+    // no ctor/dtor in here: this leads to dtors called twice upon RaiseException()!
+    // thus this obj file will be compiled without opt, so no inling of
+    // ExceptionInfos::getRaiseInfo()
+
+    // construct cpp exception object
+    typelib_TypeDescription * pTypeDescr = 0;
+    TYPELIB_DANGER_GET( &pTypeDescr, pUnoExc->pType );
+
+    void * pCppExc = alloca( pTypeDescr->nSize );
+    ::uno_copyAndConvertData( pCppExc, pUnoExc->pData, pTypeDescr, pUno2Cpp );
+
+    // a must be
+    OSL_ENSURE(
+        sizeof(sal_Int32) == sizeof(void *),
+        "### pointer size differs from sal_Int32!" );
+    DWORD arFilterArgs[3];
+    arFilterArgs[0] = MSVC_magic_number;
+    arFilterArgs[1] = (DWORD)pCppExc;
+    arFilterArgs[2] = (DWORD)ExceptionInfos::getRaiseInfo( pTypeDescr );
+
+    // destruct uno exception
+    ::uno_any_destruct( pUnoExc, 0 );
+    TYPELIB_DANGER_RELEASE( pTypeDescr );
+
+    // last point to release anything not affected by stack unwinding
+    RaiseException( MSVC_ExceptionCode, EXCEPTION_NONCONTINUABLE, 3, arFilterArgs );
+}
+
+//##############################################################################
+int mscx_filterCppException(
+    EXCEPTION_POINTERS * pPointers, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno )
+{
+    if (pPointers == 0)
+        return EXCEPTION_CONTINUE_SEARCH;
+    EXCEPTION_RECORD * pRecord = pPointers->ExceptionRecord;
+    // handle only C++ exceptions:
+    if (pRecord == 0 || pRecord->ExceptionCode != MSVC_ExceptionCode)
+        return EXCEPTION_CONTINUE_SEARCH;
+    
+#if _MSC_VER < 1300 // MSVC -6
+    bool rethrow = (pRecord->NumberParameters < 3 ||
+                    pRecord->ExceptionInformation[ 2 ] == 0);
+#else
+    bool rethrow = __CxxDetectRethrow( &pRecord );
+    OSL_ASSERT( pRecord == pPointers->ExceptionRecord );
+#endif
+    if (rethrow && pRecord == pPointers->ExceptionRecord)
+    {
+        // hack to get msvcrt internal _curexception field:
+        pRecord = *reinterpret_cast< EXCEPTION_RECORD ** >(
+            reinterpret_cast< char * >( __pxcptinfoptrs() ) +
+            // as long as we don't demand msvcr source as build prerequisite
+            // (->platform sdk), we have to code those offsets here.
+            //
+            // crt\src\mtdll.h:
+            // offsetof (_tiddata, _curexception) -
+            // offsetof (_tiddata, _tpxcptinfoptrs):
+#if _MSC_VER < 1300
+            0x18 // msvcrt,dll
+#elif _MSC_VER < 1310
+            0x20 // msvcr70.dll
+#elif _MSC_VER < 1400
+            0x24 // msvcr71.dll
+#else
+            0x28 // msvcr80.dll
+#endif
+            );
+    }
+    // rethrow: handle only C++ exceptions:
+    if (pRecord == 0 || pRecord->ExceptionCode != MSVC_ExceptionCode)
+        return EXCEPTION_CONTINUE_SEARCH;
+    
+    if (pRecord->NumberParameters == 3 &&
+//  		pRecord->ExceptionInformation[ 0 ] == MSVC_magic_number &&
+        pRecord->ExceptionInformation[ 1 ] != 0 &&
+        pRecord->ExceptionInformation[ 2 ] != 0)
+    {
+        void * types = reinterpret_cast< RaiseInfo * >(
+            pRecord->ExceptionInformation[ 2 ] )->_types;
+        if (types != 0 && *reinterpret_cast< DWORD * >( types ) > 0) // count
+        {
+            ExceptionType * pType = *reinterpret_cast< ExceptionType ** >(
+                reinterpret_cast< DWORD * >( types ) + 1 );
+            if (pType != 0 && pType->_pTypeInfo != 0)
+            {
+                OUString aRTTIname(
+                    OStringToOUString(
+                        reinterpret_cast< __type_info * >(
+                            pType->_pTypeInfo )->_m_d_name,
+                        RTL_TEXTENCODING_ASCII_US ) );
+                OUString aUNOname( toUNOname( aRTTIname ) );
+                
+                typelib_TypeDescription * pExcTypeDescr = 0;
+                typelib_typedescription_getByName(
+                    &pExcTypeDescr, aUNOname.pData );
+                if (pExcTypeDescr == 0)
+                {
+                    OUStringBuffer buf;
+                    buf.appendAscii(
+                        RTL_CONSTASCII_STRINGPARAM(
+                            "[mscx_uno bridge error] UNO type of "
+                            "C++ exception unknown: \"") );
+                    buf.append( aUNOname );
+                    buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(
+                                         "\", RTTI-name=\"") );
+                    buf.append( aRTTIname );
+                    buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\"!") );
+                    RuntimeException exc(
+                        buf.makeStringAndClear(), Reference< XInterface >() );
+                    uno_type_any_constructAndConvert(
+                        pUnoExc, &exc,
+                        ::getCppuType( &exc ).getTypeLibType(), pCpp2Uno );
+#if _MSC_VER < 1400 // msvcr80.dll cleans up, different from former msvcrs
+                    // if (! rethrow):
+                    // though this unknown exception leaks now, no user-defined
+                    // exception is ever thrown thru the binary C-UNO dispatcher
+                    // call stack.
+#endif
+                }
+                else
+                {
+                    // construct uno exception any
+                    uno_any_constructAndConvert(
+                        pUnoExc, (void *) pRecord->ExceptionInformation[1],
+                        pExcTypeDescr, pCpp2Uno );
+#if _MSC_VER < 1400 // msvcr80.dll cleans up, different from former msvcrs
+                    if (! rethrow)
+                    {
+                        uno_destructData(
+                            (void *) pRecord->ExceptionInformation[1],
+                            pExcTypeDescr, cpp_release );
+                    }
+#endif
+                    typelib_typedescription_release( pExcTypeDescr );
+                }
+                
+                return EXCEPTION_EXECUTE_HANDLER;
+            }
+        }
+    }
+    // though this unknown exception leaks now, no user-defined exception
+    // is ever thrown thru the binary C-UNO dispatcher call stack.
+    RuntimeException exc(
+        OUString( RTL_CONSTASCII_USTRINGPARAM(
+                      "[mscx_uno bridge error] unexpected "
+                      "C++ exception occurred!") ),
+        Reference< XInterface >() );
+    uno_type_any_constructAndConvert(
+        pUnoExc, &exc, ::getCppuType( &exc ).getTypeLibType(), pCpp2Uno );
+    return EXCEPTION_EXECUTE_HANDLER;
+}
+
+}
+
+#pragma pack(pop)
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/bridges/source/cpp_uno/msvc_win32_x86-64/makefile.mk b/bridges/source/cpp_uno/msvc_win32_x86-64/makefile.mk
new file mode 100644
index 0000000..d8e760c
--- /dev/null
+++ b/bridges/source/cpp_uno/msvc_win32_x86-64/makefile.mk
@@ -0,0 +1,83 @@
+#*************************************************************************
+#
+# 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.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=bridges
+TARGET=msci_uno
+LIBTARGET=no
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE :  settings.mk
+
+# --- Files --------------------------------------------------------
+.IF "$(COM)$(CPU)" == "MSCX"
+
+.IF "$(debug)" != ""
+CFLAGS += -Ob0
+.ENDIF
+
+.IF "$(cppu_no_leak)" == ""
+.IF "$(bndchk)" == ""
+CFLAGS += -DLEAK_STATIC_DATA
+.ENDIF
+.ENDIF
+
+
+SLOFILES= \
+    $(SLO)$/cpp2uno.obj		\
+    $(SLO)$/uno2cpp.obj		\
+    $(SLO)$/dllinit.obj		\
+    $(SLO)$/except.obj
+
+NOOPTFILES= \
+    $(SLO)$/except.obj
+
+SHL1TARGET= $(TARGET)
+
+SHL1DEF=$(MISC)$/$(SHL1TARGET).def
+SHL1IMPLIB=i$(TARGET)
+SHL1VERSIONMAP=..$/..$/bridge_exports.map
+SHL1RPATH=URELIB
+
+SHL1OBJS = $(SLOFILES)
+SHL1LIBS = $(SLB)$/cpp_uno_shared.lib
+
+SHL1STDLIBS= \
+    $(CPPULIB)			\
+    $(SALLIB)
+
+DEF1NAME=$(SHL1TARGET)
+
+.ENDIF
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE :  target.mk
+
diff --git a/bridges/source/cpp_uno/msvc_win32_x86-64/mscx.hxx b/bridges/source/cpp_uno/msvc_win32_x86-64/mscx.hxx
new file mode 100644
index 0000000..abf99f7
--- /dev/null
+++ b/bridges/source/cpp_uno/msvc_win32_x86-64/mscx.hxx
@@ -0,0 +1,59 @@
+/* -*- 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.
+ *
+ ************************************************************************/
+
+#pragma warning(push, 1)
+#include <windows.h>
+#pragma warning(pop)
+
+#include "rtl/ustring.hxx"
+
+
+class type_info;
+typedef struct _uno_Any uno_Any;
+typedef struct _uno_Mapping uno_Mapping;
+
+namespace CPPU_CURRENT_NAMESPACE
+{
+
+const DWORD MSVC_ExceptionCode = 0xe06d7363;
+const long MSVC_magic_number = 0x19930520L;
+
+//==============================================================================
+type_info * mscx_getRTTI( ::rtl::OUString const & rUNOname );
+ 
+//==============================================================================
+int mscx_filterCppException(
+    EXCEPTION_POINTERS * pPointers, uno_Any * pUnoExc, uno_Mapping * pCpp2Uno );
+
+//==============================================================================
+void mscx_raiseException(
+    uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/bridges/source/cpp_uno/msvc_win32_x86-64/uno2cpp.cxx b/bridges/source/cpp_uno/msvc_win32_x86-64/uno2cpp.cxx
new file mode 100644
index 0000000..8e8d2df
--- /dev/null
+++ b/bridges/source/cpp_uno/msvc_win32_x86-64/uno2cpp.cxx
@@ -0,0 +1,468 @@
+/* -*- 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_bridges.hxx"
+
+#include <malloc.h>
+
+#include <com/sun/star/uno/genfunc.hxx>
+#include <uno/data.h>
+
+#include "bridges/cpp_uno/shared/bridge.hxx"
+#include "bridges/cpp_uno/shared/types.hxx"
+#include "bridges/cpp_uno/shared/unointerfaceproxy.hxx"
+#include "bridges/cpp_uno/shared/vtables.hxx"
+
+#include "mscx.hxx"
+
+using namespace ::rtl;
+using namespace ::com::sun::star::uno;
+
+namespace
+{
+
+//==================================================================================================
+inline static void callVirtualMethod(
+    void * pAdjustedThisPtr, sal_Int32 nVtableIndex,
+    void * pRegisterReturn, typelib_TypeClass eReturnTypeClass,
+    sal_Int32 * pStackLongs, sal_Int32 nStackLongs )
+{
+    // parameter list is mixed list of * and values
+    // reference parameters are pointers
+
+    OSL_ENSURE( pStackLongs && pAdjustedThisPtr, "### null ptr!" );
+    OSL_ENSURE( (sizeof(void *) == 4) &&
+                 (sizeof(sal_Int32) == 4), "### unexpected size of int!" );
+    
+__asm
+    {
+        mov		eax, nStackLongs
+        test	eax, eax
+        je		Lcall
+        // copy values
+        mov		ecx, eax
+        shl		eax, 2			 // sizeof(sal_Int32) == 4
+        add		eax, pStackLongs // params stack space
+Lcopy:	sub		eax, 4
+        push	dword ptr [eax]
+        dec		ecx
+        jne		Lcopy
+Lcall:
+        // call
+        mov		ecx, pAdjustedThisPtr
+        push	ecx				// this ptr
+        mov		edx, [ecx]		// pvft
+        mov		eax, nVtableIndex
+        shl		eax, 2			// sizeof(void *) == 4
+        add		edx, eax
+        call	[edx]			// interface method call must be __cdecl!!!
+
+        // register return
+        mov		ecx, eReturnTypeClass
+        cmp		ecx, typelib_TypeClass_VOID
+        je		Lcleanup
+        mov		ebx, pRegisterReturn
+// int32
+        cmp		ecx, typelib_TypeClass_LONG
+        je		Lint32
+        cmp		ecx, typelib_TypeClass_UNSIGNED_LONG
+        je		Lint32
+        cmp		ecx, typelib_TypeClass_ENUM
+        je		Lint32
+// int8
+        cmp		ecx, typelib_TypeClass_BOOLEAN
+        je		Lint8
+        cmp		ecx, typelib_TypeClass_BYTE
+        je		Lint8
+// int16
+        cmp		ecx, typelib_TypeClass_CHAR
+        je		Lint16
+        cmp		ecx, typelib_TypeClass_SHORT
+        je		Lint16
+        cmp		ecx, typelib_TypeClass_UNSIGNED_SHORT
+        je		Lint16
+// float
+        cmp		ecx, typelib_TypeClass_FLOAT
+        je		Lfloat
+// double
+        cmp		ecx, typelib_TypeClass_DOUBLE
+        je		Ldouble
+// int64
+        cmp		ecx, typelib_TypeClass_HYPER
+        je		Lint64
+        cmp		ecx, typelib_TypeClass_UNSIGNED_HYPER
+          je		Lint64
+        jmp		Lcleanup // no simple type
+Lint8:
+        mov		byte ptr [ebx], al
+        jmp		Lcleanup
+Lint16:
+        mov		word ptr [ebx], ax
+        jmp		Lcleanup
+Lfloat:
+        fstp	dword ptr [ebx]
+        jmp		Lcleanup
+Ldouble:
+        fstp	qword ptr [ebx]
+        jmp		Lcleanup
+Lint64:
+        mov		dword ptr [ebx], eax
+        mov		dword ptr [ebx+4], edx
+        jmp		Lcleanup
+Lint32:
+        mov		dword ptr [ebx], eax
+        jmp		Lcleanup
+Lcleanup:
+        // cleanup stack (obsolete though because of function)
+        mov		eax, nStackLongs
+        shl		eax, 2			// sizeof(sal_Int32) == 4
+        add		eax, 4			// this ptr
+        add		esp, eax
+    }
+}
+
+//==================================================================================================
+static void cpp_call(
+    bridges::cpp_uno::shared::UnoInterfaceProxy * pThis,
+    bridges::cpp_uno::shared::VtableSlot aVtableSlot,
+    typelib_TypeDescriptionReference * pReturnTypeRef,
+    sal_Int32 nParams, typelib_MethodParameter * pParams,
+    void * pUnoReturn, void * pUnoArgs[], uno_Any ** ppUnoExc ) throw ()
+{
+    // max space for: [complex ret ptr], values|ptr ...
+    char * pCppStack		= (char *)alloca( sizeof(sal_Int32) + (nParams * sizeof(sal_Int64)) );
+    char * pCppStackStart	= pCppStack;
+    
+    // return
+    typelib_TypeDescription * pReturnTypeDescr = 0;
+    TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef );
+    OSL_ENSURE( pReturnTypeDescr, "### expected return type description!" );
+    
+    void * pCppReturn = 0; // if != 0 && != pUnoReturn, needs reconversion
+    
+    if (pReturnTypeDescr)
+    {
+        if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr ))
+        {
+            pCppReturn = pUnoReturn; // direct way for simple types
+        }
+        else
+        {
+            // complex return via ptr
+            pCppReturn = *(void **)pCppStack
+                = (bridges::cpp_uno::shared::relatesToInterfaceType(
+                       pReturnTypeDescr )
+                   ? alloca( pReturnTypeDescr->nSize )
+                   : pUnoReturn); // direct way
+            pCppStack += sizeof(void *);
+        }
+    }
+
+    // stack space
+
+    OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" );
+    // args
+    void ** pCppArgs  = (void **)alloca( 3 * sizeof(void *) * nParams );
+    // indizes of values this have to be converted (interface conversion cpp<=>uno)
+    sal_Int32 * pTempIndizes = (sal_Int32 *)(pCppArgs + nParams);
+    // type descriptions for reconversions
+    typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pCppArgs + (2 * nParams));
+    
+    sal_Int32 nTempIndizes   = 0;
+    
+    for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos )
+    {
+        const typelib_MethodParameter & rParam = pParams[nPos];
+        typelib_TypeDescription * pParamTypeDescr = 0;
+        TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
+        
+        if (!rParam.bOut
+            && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ))
+        {
+            ::uno_copyAndConvertData(
+                pCppArgs[nPos] = pCppStack, pUnoArgs[nPos], pParamTypeDescr,
+                pThis->getBridge()->getUno2Cpp() );
+            
+            switch (pParamTypeDescr->eTypeClass)
+            {
+            case typelib_TypeClass_HYPER:
+            case typelib_TypeClass_UNSIGNED_HYPER:
+            case typelib_TypeClass_DOUBLE:
+                pCppStack += sizeof(sal_Int32); // extra long
+                break;
+            default:
+                break;
+            }
+            // no longer needed
+            TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+        }
+        else // ptr to complex value | ref
+        {
+            if (! rParam.bIn) // is pure out
+            {
+                // cpp out is constructed mem, uno out is not!
+                ::uno_constructData(
+                    *(void **)pCppStack = pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
+                    pParamTypeDescr );
+                pTempIndizes[nTempIndizes] = nPos; // default constructed for cpp call
+                // will be released at reconversion
+                ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+            }
+            // is in/inout
+            else if (bridges::cpp_uno::shared::relatesToInterfaceType(
+                         pParamTypeDescr ))
+            {
+                ::uno_copyAndConvertData(
+                    *(void **)pCppStack = pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
+                    pUnoArgs[nPos], pParamTypeDescr,
+                    pThis->getBridge()->getUno2Cpp() );
+                
+                pTempIndizes[nTempIndizes] = nPos; // has to be reconverted
+                // will be released at reconversion
+                ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr;
+            }
+            else // direct way
+            {
+                *(void **)pCppStack = pCppArgs[nPos] = pUnoArgs[nPos];
+                // no longer needed
+                TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+            }
+        }
+        pCppStack += sizeof(sal_Int32); // standard parameter length
+    }
+
+    __try
+    {
+        // pCppI is mscx this pointer
+        callVirtualMethod(
+            reinterpret_cast< void ** >(pThis->getCppI()) + aVtableSlot.offset,
+            aVtableSlot.index,
+            pCppReturn, pReturnTypeDescr->eTypeClass,
+            (sal_Int32 *)pCppStackStart,
+            (pCppStack - pCppStackStart) / sizeof(sal_Int32) );
+    }
+    __except (CPPU_CURRENT_NAMESPACE::mscx_filterCppException(
+                  GetExceptionInformation(),
+                  *ppUnoExc, pThis->getBridge()->getCpp2Uno() ))
+   {
+        // *ppUnoExc was constructed by filter function
+        // temporary params
+        while (nTempIndizes--)
+        {
+            sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+            // destroy temp cpp param => cpp: every param was constructed
+            ::uno_destructData(
+                pCppArgs[nIndex], ppTempParamTypeDescr[nTempIndizes],
+                cpp_release );
+            TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndizes] );
+        }
+        // return type
+        if (pReturnTypeDescr)
+        {
+            TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+        }
+        // end here
+        return;
+    }
+    
+    // NO exception occurred
+    *ppUnoExc = 0;
+    
+    // reconvert temporary params
+    while (nTempIndizes--)
+    {
+        sal_Int32 nIndex = pTempIndizes[nTempIndizes];
+        typelib_TypeDescription * pParamTypeDescr =
+            ppTempParamTypeDescr[nTempIndizes];
+        
+        if (pParams[nIndex].bIn)
+        {
+            if (pParams[nIndex].bOut) // inout
+            {
+                ::uno_destructData(
+                    pUnoArgs[nIndex], pParamTypeDescr, 0 ); // destroy uno value
+                ::uno_copyAndConvertData(
+                    pUnoArgs[nIndex], pCppArgs[nIndex], pParamTypeDescr,
+                    pThis->getBridge()->getCpp2Uno() );
+            }
+        }
+        else // pure out
+        {
+            ::uno_copyAndConvertData(
+                pUnoArgs[nIndex], pCppArgs[nIndex], pParamTypeDescr,
+                pThis->getBridge()->getCpp2Uno() );
+        }
+        // destroy temp cpp param => cpp: every param was constructed
+        ::uno_destructData(
+            pCppArgs[nIndex], pParamTypeDescr, cpp_release );
+        
+        TYPELIB_DANGER_RELEASE( pParamTypeDescr );
+    }
+    // return value
+    if (pCppReturn && pUnoReturn != pCppReturn)
+    {
+        ::uno_copyAndConvertData(
+            pUnoReturn, pCppReturn, pReturnTypeDescr,
+            pThis->getBridge()->getCpp2Uno() );
+        ::uno_destructData(
+            pCppReturn, pReturnTypeDescr, cpp_release );
+    }
+    // return type
+    if (pReturnTypeDescr)
+    {
+        TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
+    }
+}
+
+}
+
+namespace bridges { namespace cpp_uno { namespace shared {
+
+void unoInterfaceProxyDispatch(
+    uno_Interface * pUnoI, const typelib_TypeDescription * pMemberDescr,
+    void * pReturn, void * pArgs[], uno_Any ** ppException )
+{
+    // is my surrogate
+    bridges::cpp_uno::shared::UnoInterfaceProxy * pThis
+        = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy * >(pUnoI);
+    
+    switch (pMemberDescr->eTypeClass)
+    {
+    case typelib_TypeClass_INTERFACE_ATTRIBUTE:
+    {
+        VtableSlot aVtableSlot(
+            getVtableSlot(
+                reinterpret_cast<
+                    typelib_InterfaceAttributeTypeDescription const * >(
+                        pMemberDescr)));
+        if (pReturn)
+        {
+            // dependent dispatch
+            cpp_call(
+                pThis, aVtableSlot,
+                ((typelib_InterfaceAttributeTypeDescription *)pMemberDescr)->pAttributeTypeRef,
+                0, 0, // no params
+                pReturn, pArgs, ppException );
+        }
+        else
+        {
+            // is SET
+            typelib_MethodParameter aParam;
+            aParam.pTypeRef =
+                ((typelib_InterfaceAttributeTypeDescription *)pMemberDescr)->pAttributeTypeRef;
+            aParam.bIn		= sal_True;
+            aParam.bOut		= sal_False;
+            
+            typelib_TypeDescriptionReference * pReturnTypeRef = 0;
+            OUString aVoidName( RTL_CONSTASCII_USTRINGPARAM("void") );
+            typelib_typedescriptionreference_new(
+                &pReturnTypeRef, typelib_TypeClass_VOID, aVoidName.pData );
+            
+            // dependent dispatch
+            aVtableSlot.index += 1; // get, then set method
+            cpp_call(
+                pThis, aVtableSlot,
+                pReturnTypeRef,
+                1, &aParam,
+                pReturn, pArgs, ppException );
+            
+            typelib_typedescriptionreference_release( pReturnTypeRef );
+        }
+        
+        break;
+    }
+    case typelib_TypeClass_INTERFACE_METHOD:
+    {
+        VtableSlot aVtableSlot(
+            getVtableSlot(
+                reinterpret_cast<
+                    typelib_InterfaceMethodTypeDescription const * >(
+                        pMemberDescr)));
+        switch (aVtableSlot.index)
+        {
+            // standard calls
+        case 1: // acquire uno interface
+            (*pUnoI->acquire)( pUnoI );
+            *ppException = 0;
+            break;
+        case 2: // release uno interface
+            (*pUnoI->release)( pUnoI );
+            *ppException = 0;
+            break;
+        case 0: // queryInterface() opt
+        {
+            typelib_TypeDescription * pTD = 0;
+            TYPELIB_DANGER_GET( &pTD, reinterpret_cast< Type * >( pArgs[0] )->getTypeLibType() );
+            if (pTD)
+            {
+                uno_Interface * pInterface = 0;
+                (*pThis->pBridge->getUnoEnv()->getRegisteredInterface)(
+                    pThis->pBridge->getUnoEnv(),
+                    (void **)&pInterface, pThis->oid.pData, (typelib_InterfaceTypeDescription *)pTD );
+            
+                if (pInterface)
+                {
+                    ::uno_any_construct(
+                        reinterpret_cast< uno_Any * >( pReturn ),
+                        &pInterface, pTD, 0 );
+                    (*pInterface->release)( pInterface );
+                    TYPELIB_DANGER_RELEASE( pTD );
+                    *ppException = 0;
+                    break;
+                }
+                TYPELIB_DANGER_RELEASE( pTD );
+            }
+        } // else perform queryInterface()
+        default:
+            // dependent dispatch
+            cpp_call(
+                pThis, aVtableSlot,
+                ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->pReturnTypeRef,
+                ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->nParams,
+                ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->pParams,
+                pReturn, pArgs, ppException );
+        }
+        break;
+    }
+    default:
+    {
+        ::com::sun::star::uno::RuntimeException aExc(
+            OUString( RTL_CONSTASCII_USTRINGPARAM("illegal member type description!") ),
+            ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >() );
+        
+        Type const & rExcType = ::getCppuType( &aExc );
+        // binary identical null reference
+        ::uno_type_any_construct( *ppException, &aExc, rExcType.getTypeLibType(), 0 );
+    }
+    }
+}
+
+} } }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list