diff options
Diffstat (limited to 'codemaker/source/bonobowrappermaker/corbatype.cxx')
-rw-r--r-- | codemaker/source/bonobowrappermaker/corbatype.cxx | 2782 |
1 files changed, 0 insertions, 2782 deletions
diff --git a/codemaker/source/bonobowrappermaker/corbatype.cxx b/codemaker/source/bonobowrappermaker/corbatype.cxx deleted file mode 100644 index 417af55b326e..000000000000 --- a/codemaker/source/bonobowrappermaker/corbatype.cxx +++ /dev/null @@ -1,2782 +0,0 @@ -/************************************************************************* - * - * 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_codemaker.hxx" - -#include <stdio.h> -#include <rtl/alloc.h> -#include <rtl/ustring.hxx> -#include <rtl/strbuf.hxx> - -#include "corbatype.hxx" -#include "corbaoptions.hxx" - -#include <hash_set> -#include <list> - -using namespace rtl; - - -//************************************************************************* -// CorbaType -//************************************************************************* -CorbaType::CorbaType(TypeReader& typeReader, - const OString& typeName, - const TypeManager& typeMgr, - const TypeDependency& typeDependencies, - TypeSet* generatedConversions) - : m_inheritedMemberCount(0) - , m_indentLength(0) - , m_typeName(typeName) - , m_reader(typeReader) - , m_typeMgr((TypeManager&)typeMgr) - , m_dependencies(typeDependencies) - , m_generatedConversions(generatedConversions) -{ - sal_Int32 i = typeName.lastIndexOf('/'); - m_name = typeName.copy( i != -1 ? i+1 : 0 ); -} - -CorbaType::~CorbaType() -{ - -} - -sal_Bool CorbaType::isNestedTypeByName(const ::rtl::OString& type) -{ - sal_Bool ret = sal_False; - - sal_Int32 i = type.lastIndexOf('/'); - - if (i >= 0) - { - OString outerTypeName(type.copy(0, i)); - ret = (m_typeMgr.getTypeClass(outerTypeName) == RT_TYPE_INTERFACE); - } - - return ret; -} - -sal_Bool CorbaType::dump(CorbaOptions* pOptions, FileStream& o, TypeSet* allreadyDumped) - throw( CannotDumpException ) -{ - sal_Bool ret = sal_False; - - ret = dumpConversionFunctions(o, allreadyDumped); - - return ret; -} - -sal_Bool CorbaType::dumpDependedTypes(CorbaOptions* pOptions, FileStream& o, TypeSet* allreadyDumped) - throw( CannotDumpException ) -{ - sal_Bool ret = sal_True; - - TypeUsingSet usingSet(m_dependencies.getDependencies(m_typeName)); - - TypeUsingSet::const_iterator iter = usingSet.begin(); - OString typeName; - sal_uInt32 index = 0; - while (iter != usingSet.end()) - { - typeName = (*iter).m_type; - if ((index = typeName.lastIndexOf(']')) > 0) - typeName = typeName.copy(index + 1); - - if (getUnoBaseType(typeName).getLength() == 0) - { - if (!produceType(typeName, - m_typeMgr, - m_dependencies, - pOptions, - o, allreadyDumped, m_generatedConversions)) - { - fprintf(stderr, "%s ERROR: %s\n", - pOptions->getProgramName().getStr(), - OString("cannot dump Type '" + typeName + "'").getStr()); - exit(99); - } - } - ++iter; - } - - return ret; -} - -sal_Bool CorbaType::dumpConversionFunctions(FileStream& o, TypeSet* allreadyDumped) - throw( CannotDumpException ) -{ - if (m_typeName.lastIndexOf(']') < 0) - { - dumpInclude(o, allreadyDumped, m_typeName, "hpp", sal_False); - dumpDepIncludes(o, allreadyDumped, m_typeName, "hpp"); - - dumpFunctions(o); - } - - return sal_True; -} - - -void CorbaType::dumpDefaultHxxIncludes(FileStream& o) -{ - o << "#ifndef _OSL_MUTEX_HXX_\n" - << "#include <osl/mutex.hxx>\n" - << "#endif\n\n"; - - o << "#ifndef _RTL_USTRING_HXX_\n" - << "#include <rtl/ustring.hxx>\n" - << "#endif\n\n"; - - o << "#ifndef _COM_SUN_STAR_UNO_TYPE_HXX_\n" - << "#include <com/sun/star/uno/Type.hxx>\n" - << "#endif\n"; - - o << "#ifndef _COM_SUN_STAR_UNO_ANY_HXX_\n" - << "#include <com/sun/star/uno/Any.hxx>\n" - << "#endif\n"; - - o << "#ifndef _COM_SUN_STAR_UNO_REFERENCE_HXX_\n" - << "#include <com/sun/star/uno/Reference.hxx>\n" - << "#endif\n"; - - o << "#ifndef _COM_SUN_STAR_UNO_XINTERFACE_HPP_\n" - << "#include <com/sun/star/uno/XInterface.hpp>\n" - << "#endif\n"; - - o << "#ifndef _BONOBO_NULLINTERFACE_HPP_\n" - << "#include <Bonobo/NullInterface.hpp>\n" - << "#endif\n"; - - o << "#ifndef _COM_SUN_STAR_UNO_EXCEPTION_HPP_\n" - << "#include <com/sun/star/uno/Exception.hpp>\n" - << "#endif\n"; - - o << "#ifndef _COM_SUN_STAR_UNO_RUNTIMEEXCEPTION_HPP_\n" - << "#include <com/sun/star/uno/RuntimeException.hpp>\n" - << "#endif\n"; - - o << "#ifndef _COM_SUN_STAR_UNO_SEQUENCE_HXX_\n" - << "#include <com/sun/star/uno/Sequence.hxx>\n" - << "#endif\n"; -} - - -void CorbaType::dumpInclude(FileStream& o, TypeSet* allreadyDumped, const OString& typeName, sal_Char* prefix, sal_Bool bExtended, sal_Bool bCaseSensitive) -{ - OString realTypeName = checkRealBaseType( typeName ); - - if (!isNestedTypeByName(typeName) && - (BT_INVALID == isBaseType(realTypeName)) && - !realTypeName.equals("Bonobo/NullInterface") && - !realTypeName.equals("com/sun/star/uno/XInterface") && - !realTypeName.equals("com/sun/star/uno/TypeClass") && - !realTypeName.equals("com/sun/star/uno/Type") && - !realTypeName.equals("com/sun/star/uno/Exception") && - !realTypeName.equals("com/sun/star/uno/RuntimeException")) - { - TypeSet::const_iterator iter = allreadyDumped->find(realTypeName); - - if (iter == allreadyDumped->end()) - { - allreadyDumped->insert(realTypeName); - - sal_uInt32 length = 3+ m_typeName.getLength() + strlen(prefix); - - if (bExtended) - length += m_name.getLength() + 1; - - OStringBuffer tmpBuf(length); - - tmpBuf.append('_'); - tmpBuf.append(typeName); - tmpBuf.append('_'); - if (bExtended) - { - tmpBuf.append(m_name); - tmpBuf.append('_'); - } - tmpBuf.append(prefix); - tmpBuf.append('_'); - - OString tmp(tmpBuf.makeStringAndClear().replace('/', '_').toAsciiUpperCase()); - - length = 1 + typeName.getLength() + strlen(prefix); - if (bExtended) - length += m_name.getLength() + 1; - - tmpBuf.ensureCapacity(length); - tmpBuf.append(typeName); - if (bExtended) - { - tmpBuf.append('/'); - tmpBuf.append(m_name); - } - tmpBuf.append('.'); - tmpBuf.append(prefix); - - o << "#ifndef " << tmp << "\n#include <"; - if (bCaseSensitive) - { - o << tmpBuf.makeStringAndClear(); - } else - { - o << tmpBuf.makeStringAndClear(); - } - - o << ">\n"; - o << "#endif\n"; - - o << "namespace bonobobridge {\n\n"; - - std::list<OString> nestedTypes; - - do - { - if ((realTypeName.lastIndexOf(']') < 0) && - (BT_INVALID == isBaseType(realTypeName)) && - !realTypeName.equals("Bonobo/NullInterface") && - !realTypeName.equals("com/sun/star/uno/XInterface") && - !realTypeName.equals("com/sun/star/uno/TypeClass") && - !realTypeName.equals("com/sun/star/uno/Type") && - !realTypeName.equals("com/sun/star/uno/Exception") && - !realTypeName.equals("com/sun/star/uno/RuntimeException") && - !realTypeName.equals("com/sun/star/uno/TypeClass")) - { - o << "inline sal_Bool cpp_convert_b2u("; - dumpUnoType(o, realTypeName, sal_False, sal_True); - o << " u, "; - dumpCorbaType(o, realTypeName, sal_True, sal_True); - o << " b, const ::vos::ORef< ::bonobobridge::Bridge >& bridge);\n"; - o << "inline sal_Bool cpp_convert_u2b("; - dumpCorbaType(o, realTypeName, sal_False, sal_True); - o << " b, "; - dumpUnoType(o, realTypeName, sal_True, sal_True); - o << " u, const ::vos::ORef< ::bonobobridge::Bridge >& bridge);\n"; - } - - RegistryKey key = m_typeMgr.getTypeKey(realTypeName); - RegistryKeyNames nestedTypeNames; - key.getKeyNames(OUString(), nestedTypeNames); - for (sal_uInt32 i = 0; i < nestedTypeNames.getLength(); i++) - { - OString nTypeName(OUStringToOString(nestedTypeNames.getElement(i), RTL_TEXTENCODING_UTF8)); - - nTypeName = checkRealBaseType(nTypeName.copy(5)); - - if (BT_INVALID == isBaseType(nTypeName)) - { - allreadyDumped->insert(nTypeName); - nestedTypes.push_back(nTypeName); - } - } - - if (nestedTypes.size() > 0) - { - realTypeName = nestedTypes.front(); - nestedTypes.pop_front(); - } - else - { - realTypeName = ""; - } - } - while (realTypeName.getLength() > 0); - - o << "}; // namespace bonobobridge\n"; - } - } -} - -void CorbaType::dumpDepIncludes(FileStream& o, TypeSet* allreadyDumped, const OString& typeName, sal_Char* prefix) -{ - TypeUsingSet usingSet(m_dependencies.getDependencies(typeName)); - - TypeUsingSet::const_iterator iter = usingSet.begin(); - - OString sPrefix(OString(prefix).toAsciiUpperCase()); - sal_Bool bSequenceDumped = sal_False; - sal_Bool bInterfaceDumped = sal_False; - sal_uInt32 index = 0; - sal_uInt32 seqNum = 0; - OString relType; - while (iter != usingSet.end()) - { - index = (*iter).m_type.lastIndexOf(']'); - seqNum = (index > 0 ? ((index+1) / 2) : 0); - - relType = (*iter).m_type; - if (index > 0) - relType = relType.copy(index+1); - - if (!isNestedTypeByName(relType)) - { - OString defPrefix("HXX"); - if (sPrefix.equals("HDL")) - defPrefix = "H"; - - if (seqNum > 0 && !bSequenceDumped) - { - bSequenceDumped = sal_True; - } - - if (getUnoBaseType(relType).getLength() == 0 && - m_typeName != relType) - { - if (m_typeMgr.getTypeClass(relType) == RT_TYPE_INTERFACE - && sPrefix.equals("HDL")) - { - if (!bInterfaceDumped) - { - bInterfaceDumped = sal_True; - } - - if (!((*iter).m_use & TYPEUSE_SUPER)) - { - o << "\n"; - dumpNameSpace(o, sal_True, sal_False, relType); - o << "\nclass " << scopedName(m_typeName, relType, sal_True) << ";\n"; - dumpNameSpace(o, sal_False, sal_False, relType); - o << "\n\n"; - } else - { - dumpInclude(o, allreadyDumped, relType, prefix); - } - } else - { - dumpInclude(o, allreadyDumped, relType, prefix); - } - } - } - ++iter; - } -} - -void CorbaType::dumpNameSpace(FileStream& o, sal_Bool bOpen, sal_Bool bFull, const OString& type) -{ - OString typeName(type); - sal_Bool bOneLine = sal_True; - if (typeName.getLength() == 0) - { - typeName = m_typeName; - bOneLine = sal_False; - } - - if (typeName == "/") - return; - - if (typeName.indexOf( '/' ) == -1 && !bFull) - return; - - if (!bFull) - typeName = typeName.copy( 0, typeName.lastIndexOf( '/' ) ); - - if (bOpen) - { - sal_Int32 nIndex = 0; - do - { - o << "namespace " << typeName.getToken(0, '/', nIndex); - if (bOneLine) - o << " { "; - else - o << "\n{\n"; - } while( nIndex != -1 ); - } else - { - sal_Int32 nPos = 0; - do - { - nPos = typeName.lastIndexOf( '/' ); - o << "}"; - if( bOneLine ) - o << " "; - else - o << " // " << typeName.copy( nPos+1 ) << "\n"; - if( nPos != -1 ) - typeName = typeName.copy( 0, nPos ); - } while( nPos != -1 ); - } -} - - -sal_uInt32 CorbaType::getMemberCount() -{ - sal_uInt32 count = m_reader.getMethodCount(); - - sal_uInt32 fieldCount = m_reader.getFieldCount(); - RTFieldAccess access = RT_ACCESS_INVALID; - for (sal_uInt16 i=0; i < fieldCount; i++) - { - access = m_reader.getFieldAccess(i); - - if (access != RT_ACCESS_CONST && access != RT_ACCESS_INVALID) - count++; - } - return count; -} - -sal_uInt32 CorbaType::checkInheritedMemberCount(const TypeReader* pReader) -{ - sal_Bool bSelfCheck = sal_True; - if (!pReader) - { - bSelfCheck = sal_False; - pReader = &m_reader; - } - - sal_uInt32 count = 0; - OString superType(pReader->getSuperTypeName()); - if (superType.getLength() > 0) - { - TypeReader aSuperReader(m_typeMgr.getTypeReader(superType)); - if ( aSuperReader.isValid() ) - { - count = checkInheritedMemberCount(&aSuperReader); - } - } - - if (bSelfCheck) - { - count += pReader->getMethodCount(); - sal_uInt32 fieldCount = pReader->getFieldCount(); - RTFieldAccess access = RT_ACCESS_INVALID; - for (sal_uInt16 i=0; i < fieldCount; i++) - { - access = pReader->getFieldAccess(i); - - if (access != RT_ACCESS_CONST && access != RT_ACCESS_INVALID) - count++; - } - } - - return count; -} - -sal_uInt32 CorbaType::getInheritedMemberCount() -{ - if (m_inheritedMemberCount == 0) - { - m_inheritedMemberCount = checkInheritedMemberCount(0); - } - - return m_inheritedMemberCount; -} - -OString CorbaType::getTypeClass(const OString& type, sal_Bool bCStyle) -{ - OString typeName = (type.getLength() > 0 ? type : m_typeName); - RTTypeClass rtTypeClass = RT_TYPE_INVALID; - - if (type.getLength() > 0) - { - typeName = type; - rtTypeClass = m_typeMgr.getTypeClass(typeName); - } else - { - typeName = m_typeName; - rtTypeClass = m_reader.getTypeClass(); - } - - if (typeName.lastIndexOf(']') > 0) - return bCStyle ? "typelib_TypeClass_SEQUENCE" : "::com::sun::star::uno::TypeClass_SEQUENCE"; - - switch (rtTypeClass) - { - case RT_TYPE_INTERFACE: - return bCStyle ? "typelib_TypeClass_INTERFACE" : "::com::sun::star::uno::TypeClass_INTERFACE"; - break; - case RT_TYPE_MODULE: - return bCStyle ? "typelib_TypeClass_MODULE" : "::com::sun::star::uno::TypeClass_MODULE"; - break; - case RT_TYPE_STRUCT: - return bCStyle ? "typelib_TypeClass_STRUCT" : "::com::sun::star::uno::TypeClass_STRUCT"; - break; - case RT_TYPE_ENUM: - return bCStyle ? "typelib_TypeClass_ENUM" : "::com::sun::star::uno::TypeClass_ENUM"; - break; - case RT_TYPE_EXCEPTION: - return bCStyle ? "typelib_TypeClass_EXCEPTION" : "::com::sun::star::uno::TypeClass_EXCEPTION"; - break; - case RT_TYPE_TYPEDEF: - { - OString realType = checkRealBaseType( typeName ); - return getTypeClass( realType, bCStyle ); - } -// return bCStyle ? "typelib_TypeClass_TYPEDEF" : "::com::sun::star::uno::TypeClass_TYPEDEF"; - break; - case RT_TYPE_SERVICE: - return bCStyle ? "typelib_TypeClass_SERVICE" : "::com::sun::star::uno::TypeClass_SERVICE"; - break; - case RT_TYPE_INVALID: - { - if (type.equals("long")) - return bCStyle ? "typelib_TypeClass_LONG" : "::com::sun::star::uno::TypeClass_LONG"; - if (type.equals("short")) - return bCStyle ? "typelib_TypeClass_SHORT" : "::com::sun::star::uno::TypeClass_SHORT"; - if (type.equals("hyper")) - return bCStyle ? "typelib_TypeClass_HYPER" : "::com::sun::star::uno::TypeClass_HYPER"; - if (type.equals("string")) - return bCStyle ? "typelib_TypeClass_STRING" : "::com::sun::star::uno::TypeClass_STRING"; - if (type.equals("boolean")) - return bCStyle ? "typelib_TypeClass_BOOLEAN" : "::com::sun::star::uno::TypeClass_BOOLEAN"; - if (type.equals("char")) - return bCStyle ? "typelib_TypeClass_CHAR" : "::com::sun::star::uno::TypeClass_CHAR"; - if (type.equals("byte")) - return bCStyle ? "typelib_TypeClass_BYTE" : "::com::sun::star::uno::TypeClass_BYTE"; - if (type.equals("any")) - return bCStyle ? "typelib_TypeClass_ANY" : "::com::sun::star::uno::TypeClass_ANY"; - if (type.equals("type")) - return bCStyle ? "typelib_TypeClass_TYPE" : "::com::sun::star::uno::TypeClass_TYPE"; - if (type.equals("float")) - return bCStyle ? "typelib_TypeClass_FLOAT" : "::com::sun::star::uno::TypeClass_FLOAT"; - if (type.equals("double")) - return bCStyle ? "typelib_TypeClass_DOUBLE" : "::com::sun::star::uno::TypeClass_DOUBLE"; - if (type.equals("void")) - return bCStyle ? "typelib_TypeClass_VOID" : "::com::sun::star::uno::TypeClass_VOID"; - if (type.equals("unsigned long")) - return bCStyle ? "typelib_TypeClass_UNSIGNED_LONG" : "::com::sun::star::uno::TypeClass_UNSIGNED_LONG"; - if (type.equals("unsigned short")) - return bCStyle ? "typelib_TypeClass_UNSIGNED_SHORT" : "::com::sun::star::uno::TypeClass_UNSIGNED_SHORT"; - if (type.equals("unsigned hyper")) - return bCStyle ? "typelib_TypeClass_UNSIGNED_HYPER" : "::com::sun::star::uno::TypeClass_UNSIGNED_HYPER"; - } - break; - } - - return bCStyle ? "typelib_TypeClass_UNKNOWN" : "::com::sun::star::uno::TypeClass_UNKNOWN"; -} - -OString CorbaType::printUnoType(const OString& type, sal_Bool bConst, sal_Bool bRef, sal_Bool bNative) - throw( CannotDumpException ) -{ - OStringBuffer ret(1024); - OString sType(checkRealBaseType(type, sal_True)); - sal_uInt32 index = sType.lastIndexOf(']'); - sal_uInt32 seqNum = (index > 0 ? ((index+1) / 2) : 0); - - OString relType = (index > 0 ? (sType).copy(index+1) : type); - - RTTypeClass typeClass = m_typeMgr.getTypeClass(relType); - - if (bConst) ret.append("const "); - - sal_uInt32 i; - for (i=0; i < seqNum; i++) - { - ret.append("::com::sun::star::uno::Sequence< "); - } - - switch (typeClass) - { - case RT_TYPE_INTERFACE: - if (bNative) - ret.append(scopedName(m_typeName, relType)); - else - ret.append("::com::sun::star::uno::Reference< ").append(scopedName(m_typeName, relType)).append(" >"); - break; - case RT_TYPE_INVALID: - { - OString tmp(getUnoBaseType(relType)); - if (tmp.getLength() > 0) - { - ret.append(getUnoBaseType(relType)); - } else - throw CannotDumpException("Unknown type '" + relType + "', incomplete type library. ("+type+")"); - } - break; - case RT_TYPE_STRUCT: - case RT_TYPE_ENUM: - case RT_TYPE_TYPEDEF: - case RT_TYPE_EXCEPTION: - ret.append(scopedName(m_typeName, relType)); - break; - } - - for (i=0; i < seqNum; i++) - { - ret.append(" >"); - } - - if (bRef) ret.append("&"); - return ret.makeStringAndClear(); -} - -void CorbaType::dumpUnoType(FileStream& o, const OString& type, - sal_Bool bConst, sal_Bool bRef, sal_Bool bNative) - throw( CannotDumpException ) -{ - OString ret = printUnoType(type, bConst, bRef, bNative); - o << ret; -} - -OString CorbaType::printCorbaType(const OString& type, sal_Bool bConst, sal_Bool bRef) - throw( CannotDumpException ) -{ - OStringBuffer ret(1024); - - OString sType(type); - - sal_uInt32 index = sType.lastIndexOf(']'); - sal_uInt32 seqNum = (index > 0 ? ((index+1) / 2) : 0); - - OString relType = (index > 0 ? (sType).copy(index+1) : type); - - RTTypeClass typeClass = m_typeMgr.getTypeClass(relType); - - if (relType.equals("com/sun/star/uno/XInterface")) - relType = "Bonobo/Unknown"; - - if (relType.equals("com/sun/star/uno/TypeClass")) - relType = "CORBA_TypeCode"; - - if (relType.equals("com/sun/star/uno/RuntimeException")) - relType = "CORBA_SystemException"; - - if (relType.equals("com/sun/star/uno/Exception")) - relType = "CORBA_any"; - - if (bConst) ret.append("const "); - - - sal_uInt32 i; - for (i=0; i < seqNum; i++) - { - ret.append("CORBA_sequence_"); - } - - switch (typeClass) - { - case RT_TYPE_INTERFACE: - ret.append(relType.replace('/', '_')); - break; - case RT_TYPE_INVALID: - { - OString tmp(getUnoBaseType(relType)); - if (tmp.getLength() > 0) - ret.append(getCorbaBaseType(relType)); - else - throw CannotDumpException("Unknown type '" + relType + "', incomplete type library. ("+type+")"); - } - break; - case RT_TYPE_STRUCT: - case RT_TYPE_ENUM: - case RT_TYPE_TYPEDEF: - case RT_TYPE_EXCEPTION: - ret.append(relType.replace('/', '_')); - break; - } - - if (bRef) ret.append("&"); - - return ret.makeStringAndClear(); -} - -sal_Bool CorbaType::isPassedAsPointer(const OString& type) -{ - sal_Bool ret = sal_False; - - OString sType(checkSpecialCorbaType(type)); - - sal_Int32 index = sType.lastIndexOf(']'); - sal_Int32 seqNum = (index > 0 ? ((index+1) / 2) : 0); - - OString relType = (index > 0 ? (sType).copy(index+1) : type); - - if (index > 0) - { - OString fakeTest; - - sal_Int32 j = type.lastIndexOf('/'); - if (j >= 0) - fakeTest = type.copy(0, j+1)+"_faked_array_"+type.copy(j+1); - else - fakeTest = "_faked_array_"+sType; - - TypeReader fakeTestReader = m_typeMgr.getTypeReader(fakeTest); - - if (fakeTestReader.isValid()) - ret = sal_False; - else - ret = sal_True; - } - else - { - RTTypeClass typeClass = m_typeMgr.getTypeClass(sType); - - switch (typeClass) - { - case RT_TYPE_STRUCT: - case RT_TYPE_EXCEPTION: - ret = sal_True; - break; - - case RT_TYPE_INTERFACE: - case RT_TYPE_ENUM: - case RT_TYPE_INVALID: - if (sType.equals("any")) - ret = sal_True; - else - ret = sal_False; - break; - } - } - - return ret; -} - -sal_Bool CorbaType::isDerivedFromUnknown(const ::rtl::OString& typeName) -{ - sal_Bool ret = sal_True; - if (typeName.getLength() == 0) - ret = sal_False; - else if (typeName.equals("Bonobo/NullInterface")) - ret = sal_False; - else if (typeName.equals("com/sun/star/uno/XInterface")) - ret = sal_True; - else - { - TypeReader reader(m_typeMgr.getTypeReader(typeName)); - if (reader.isValid()) - ret = isDerivedFromUnknown(reader.getSuperTypeName()); - else - ret = sal_False; - } - return ret; -} - - -sal_Bool CorbaType::isArray(const OString& type) -{ - sal_Bool ret = sal_False; - - OString sType(checkSpecialCorbaType(type)); - - sal_Int32 index = sType.lastIndexOf(']'); - sal_Int32 seqNum = (index > 0 ? ((index+1) / 2) : 0); - - OString relType = (index > 0 ? (sType).copy(index+1) : type); - - if (index > 0) - { - OString fakeTest; - - sal_Int32 j = type.lastIndexOf('/'); - if (j >= 0) - fakeTest = type.copy(0, j+1)+"_faked_array_"+type.copy(j+1); - else - fakeTest = "_faked_array_"+sType; - - TypeReader fakeTestReader = m_typeMgr.getTypeReader(fakeTest); - - if (fakeTestReader.isValid()) - ret = sal_True; - } - - return ret; -} - -OString CorbaType::printCorbaParameter(const OString& type, sal_Bool bOut) - throw( CannotDumpException ) -{ - OStringBuffer ret(1024); - - OString sType(type); - sal_Int32 index = sType.lastIndexOf(']'); - sal_Int32 seqNum = (index > 0 ? ((index+1) / 2) : 0); - - OString relType = (index > 0 ? (sType).copy(index+1) : type); - - RTTypeClass typeClass = m_typeMgr.getTypeClass(relType); - - if (relType.equals("Bonobo/NullInterface")) - relType = "CORBA_Object"; - - if (relType.equals("com/sun/star/uno/XInterface")) - relType = "Bonobo/Unknown"; - - if (relType.equals("com/sun/star/uno/TypeClass")) - relType = "CORBA_TypeCode"; - - if (relType.equals("com/sun/star/uno/RuntimeException")) - relType = "CORBA_SystemException"; - - if (relType.equals("com/sun/star/uno/Exception")) - relType = "CORBA_any"; - - int i; - for (i=0; i < seqNum; i++) - { - ret.append("CORBA_sequence_"); - } - - switch (typeClass) - { - case RT_TYPE_INTERFACE: - ret.append(relType.replace('/', '_')); - break; - case RT_TYPE_INVALID: - { - OString tmp(getUnoBaseType(relType)); - if (tmp.getLength() > 0) - { - ret.append(getCorbaBaseType(relType)); - } else - throw CannotDumpException("Unknown type '" + relType + "', incomplete type library. ("+type+")"); - } - break; - case RT_TYPE_STRUCT: - case RT_TYPE_EXCEPTION: - case RT_TYPE_ENUM: - case RT_TYPE_TYPEDEF: - ret.append(relType.replace('/', '_')); - break; - } - - return ret.makeStringAndClear(); -} - -void CorbaType::dumpCorbaType(FileStream& o, const OString& type, - sal_Bool bConst, sal_Bool bRef) - throw( CannotDumpException ) -{ - OString ret = printCorbaType(type, bConst, bRef); - o << ret; -} - -OString CorbaType::getUnoBaseType(const OString& type) -{ - if (type.equals("long")) - return "sal_Int32"; - if (type.equals("short")) - return "sal_Int16"; - if (type.equals("hyper")) - return "sal_Int64"; - if (type.equals("string")) - return "::rtl::OUString"; - if (type.equals("boolean")) - return "sal_Bool"; - if (type.equals("char")) - return "sal_Unicode"; - if (type.equals("byte")) - return "sal_Int8"; - if (type.equals("any")) - return "::com::sun::star::uno::Any"; - if (type.equals("type")) - return "::com::sun::star::uno::Type"; - if (type.equals("float")) - return "float"; - if (type.equals("double")) - return "double"; - if (type.equals("octet")) - return "sal_Int8"; - if (type.equals("void")) - return type; - if (type.equals("unsigned long")) - return "sal_uInt32"; - if (type.equals("unsigned short")) - return "sal_uInt16"; - if (type.equals("unsigned hyper")) - return "sal_uInt64"; - - return OString(); -} - -OString CorbaType::getCorbaBaseType(const OString& type) -{ - if (type.equals("long")) - return "CORBA_long"; - if (type.equals("short")) - return "CORBA_short"; - if (type.equals("hyper")) - return "CORBA_long_long"; - if (type.equals("string")) - return "CORBA_char*"; - if (type.equals("boolean")) - return "CORBA_boolean"; - if (type.equals("char")) - return "CORBA_char"; - if (type.equals("byte")) - return "CORBA_octet"; - if (type.equals("any")) - return "CORBA_any"; - if (type.equals("type")) - return "CORBA_TypeCode"; - if (type.equals("float")) - return "CORBA_float"; - if (type.equals("double")) - return "CORBA_double"; - if (type.equals("octet")) - return "CORBA_octet"; - if (type.equals("void")) - return type; - if (type.equals("unsigned long")) - return "CORBA_unsigned_long"; - if (type.equals("unsigned short")) - return "CORBA_unsigned_short"; - if (type.equals("unsigned hyper")) - return "CORBA_unsigned_long_long"; - - return OString(); -} - - -void CorbaType::dumpTypeInit(FileStream& o, const OString& typeName) -{ - OString type(checkSpecialCorbaType(typeName)); - - BASETYPE baseType = isBaseType(type); - - switch (baseType) - { - case BT_BOOLEAN: - o << "(sal_False)"; - return; - break; - case BT_ANY: - case BT_STRING: - o << "()"; - return; - break; - case BT_INVALID: - break; - default: - o << "(("; - dumpUnoType(o, type); - o << ")" << "0)"; - return; - } - - RTTypeClass typeClass = m_typeMgr.getTypeClass(type); - - if (typeClass == RT_TYPE_ENUM) - { - RegistryTypeReaderLoader aReaderLoader; - - if (aReaderLoader.isLoaded()) - { - TypeReader reader(m_typeMgr.getTypeReader(type)); - - if ( reader.isValid() ) - { - sal_Int32 nPos = type.lastIndexOf( '/' ); - o << "(" << shortScopedName("", type, sal_False) - << "::" << type.copy( nPos != -1 ? nPos+1 : 0 ) - << "_" << reader.getFieldName(0) << ")"; - return; - } - } - } - - o << "()"; -} - -BASETYPE CorbaType::isBaseType(const OString& type) -{ - if (type.equals("long")) - return BT_LONG; - if (type.equals("short")) - return BT_SHORT; - if (type.equals("hyper")) - return BT_HYPER; - if (type.equals("string")) - return BT_STRING; - if (type.equals("boolean")) - return BT_BOOLEAN; - if (type.equals("char")) - return BT_CHAR; - if (type.equals("byte")) - return BT_BYTE; - if (type.equals("any")) - return BT_ANY; - if (type.equals("float")) - return BT_FLOAT; - if (type.equals("double")) - return BT_DOUBLE; - if (type.equals("void")) - return BT_VOID; - if (type.equals("unsigned long")) - return BT_UNSIGNED_LONG; - if (type.equals("unsigned short")) - return BT_UNSIGNED_SHORT; - if (type.equals("unsigned hyper")) - return BT_UNSIGNED_HYPER; - - return BT_INVALID; -} - -OString CorbaType::typeToIdentifier(const OString& type) -{ - sal_uInt32 index = type.lastIndexOf(']'); - sal_uInt32 seqNum = (index > 0 ? ((index+1) / 2) : 0); - - OString relType = (index > 0 ? ((OString)type).copy(index+1) : type); - OString sIdentifier; - - while( seqNum > 0 ) - { - sIdentifier += OString("seq"); - - if ( --seqNum == 0 ) - { - sIdentifier += OString("_"); - } - } - - if ( isBaseType(relType) ) - { - sIdentifier += relType.replace(' ', '_'); - } else - { - sIdentifier += relType.replace('/', '_'); - } - - - return sIdentifier; -} - -OString CorbaType::checkSpecialCorbaType(const OString& type) -{ - OString baseType(type); - - RegistryTypeReaderLoader & rReaderLoader = getRegistryTypeReaderLoader(); - - RegistryKey key; - sal_uInt8* pBuffer=NULL; - RTTypeClass typeClass; - sal_Bool isTypeDef = (m_typeMgr.getTypeClass(baseType) == RT_TYPE_TYPEDEF); - TypeReader reader; - - while (isTypeDef) - { - reader = m_typeMgr.getTypeReader(baseType); - - if (reader.isValid()) - { - typeClass = reader.getTypeClass(); - - if (typeClass == RT_TYPE_TYPEDEF) - baseType = reader.getSuperTypeName(); - else - isTypeDef = sal_False; - } else - break; - } - - return baseType; -} - -OString CorbaType::checkRealBaseType(const OString& type, sal_Bool bResolveTypeOnly) -{ - sal_uInt32 index = type.lastIndexOf(']'); - OString baseType = (index > 0 ? ((OString)type).copy(index+1) : type); - OString seqPrefix = (index > 0 ? ((OString)type).copy(0, index+1) : OString()); - - RegistryTypeReaderLoader & rReaderLoader = getRegistryTypeReaderLoader(); - - RegistryKey key; - sal_uInt8* pBuffer=NULL; - RTTypeClass typeClass; - sal_Bool mustBeChecked = (m_typeMgr.getTypeClass(baseType) == RT_TYPE_TYPEDEF); - TypeReader reader; - - while (mustBeChecked) - { - reader = m_typeMgr.getTypeReader(baseType); - - if (reader.isValid()) - { - typeClass = reader.getTypeClass(); - - if (typeClass == RT_TYPE_TYPEDEF) - { - baseType = reader.getSuperTypeName(); - index = baseType.lastIndexOf(']'); - if (index > 0) - { - seqPrefix += baseType.copy(0, index+1); - baseType = baseType.copy(index+1); - } - } else - mustBeChecked = sal_False; - } else - break; - } - - if ( bResolveTypeOnly ) - baseType = seqPrefix + baseType; - - return baseType; -} - - -void CorbaType::inc(sal_uInt32 num) -{ - m_indentLength += num; -} - -void CorbaType::dec(sal_uInt32 num) -{ - if (m_indentLength - num < 0) - m_indentLength = 0; - else - m_indentLength -= num; -} - -OString CorbaType::indent() -{ - OStringBuffer tmp(m_indentLength); - - for (sal_uInt32 i=0; i < m_indentLength; i++) - { - tmp.append(' '); - } - return tmp.makeStringAndClear(); -} - -OString CorbaType::indent(sal_uInt32 num) -{ - OStringBuffer tmp(m_indentLength + num); - - for (sal_uInt32 i=0; i < m_indentLength + num; i++) - { - tmp.append(' '); - } - return tmp.makeStringAndClear(); -} - -//************************************************************************* -// InterfaceType -//************************************************************************* -InterfaceType::InterfaceType(TypeReader& typeReader, - const OString& typeName, - const TypeManager& typeMgr, - const TypeDependency& typeDependencies, - TypeSet* generatedConversions) - : CorbaType(typeReader, typeName, typeMgr, typeDependencies, generatedConversions) -{ - m_inheritedMemberCount = 0; - m_hasAttributes = sal_False; - m_hasMethods = sal_False; -} - -InterfaceType::~InterfaceType() -{ - -} - - -void InterfaceType::dumpUnoMethods(FileStream& o, sal_Bool bDeclOnly, sal_Bool bDelegateToSuper) -{ - OString superName(m_reader.getSuperTypeName()); - if (bDeclOnly && - !superName.equals("Bonobo/NullInterface") && - !superName.equals("com/sun/star/uno/XInterface")) - { - TypeReader reader(m_typeMgr.getTypeReader(superName)); - InterfaceType iType(reader, superName, m_typeMgr, TypeDependency(), m_generatedConversions); - iType.inc(); - iType.dumpUnoMethods(o, bDeclOnly, sal_True); - } - - sal_uInt32 methodCount = m_reader.getMethodCount(); - sal_Bool first=sal_True; - - OString methodName, returnType, paramType, paramName; - sal_uInt32 paramCount = 0; - sal_uInt32 excCount = 0; - RTMethodMode methodMode = RT_MODE_INVALID; - RTParamMode paramMode = RT_PARAM_INVALID; - - sal_Bool bRef = sal_False; - sal_Bool bConst = sal_False; - sal_Bool bWithRunTimeExcp = sal_True; - - for (sal_uInt16 i=0; i < methodCount; i++) - { - methodName = m_reader.getMethodName(i); - returnType = m_reader.getMethodReturnType(i); - paramCount = m_reader.getMethodParamCount(i); - excCount = m_reader.getMethodExcCount(i); - methodMode = m_reader.getMethodMode(i); - - if ( methodName.equals("acquire") || methodName.equals("release") ) - bWithRunTimeExcp = sal_False; - - if (first) - { - first = sal_False; - o << "\n" << indent() << "// Methods\n"; - } - - o << indent(); - if (bDeclOnly) - o << "virtual "; - dumpUnoType(o, returnType); - o << " SAL_CALL "; - if (!bDeclOnly) - { - o << "bonobobridge::BonoboWrapper_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "::"; - } - - o << methodName << "( "; - - sal_uInt16 j; - for (j=0; j < paramCount; j++) - { - paramName = m_reader.getMethodParamName(i, j); - paramType = m_reader.getMethodParamType(i, j); - paramMode = m_reader.getMethodParamMode(i, j); - - switch (paramMode) - { - case RT_PARAM_IN: - { - OString relType = checkSpecialCorbaType(paramType); - if (m_typeMgr.getTypeClass(relType) == RT_TYPE_ENUM || - (isBaseType(relType) && !relType.equals("string") && !relType.equals("any"))) - { - bConst = sal_False; - bRef = sal_False; - } else - { - bConst = sal_True; - bRef = sal_True; - } - break; - } - case RT_PARAM_OUT: - case RT_PARAM_INOUT: - bConst = sal_False; - bRef = sal_True; - break; - } - - dumpUnoType(o, paramType, bConst, bRef); - o << " " << paramName; - - if (j+1 < paramCount) o << ", "; - } - o << " )"; - - o << " throw("; - OString excpName; - for (j=0; j < excCount; j++) - { - excpName = m_reader.getMethodExcType(i, j); - if (excpName != "com/sun/star/uno/RuntimeException") - o << scopedName(m_typeName, excpName); - if (bWithRunTimeExcp) - o << ", "; - } - - if ( bWithRunTimeExcp ) - { - o << " ::com::sun::star::uno::RuntimeException"; - } - - if (bDeclOnly && bDelegateToSuper) - { - o << " ) {\n"; - if (returnType.equals("void")) - o << indent() << " "; - else - o << indent() << " return "; - o << "BonoboWrapper_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "::" << methodName << "( "; - for (j = 0; j < paramCount; j++) - { - paramName = m_reader.getMethodParamName(i, j); - o << paramName; - if (j < (paramCount-1)) - o << ", "; - } - o << " );\n" - << indent() << "}\n"; - } - else if (!bDeclOnly) - { - o << " ) {\n"; - - OStringBuffer preBuffer(1024); - OStringBuffer callBuffer(1024); - OStringBuffer postBuffer(1024); - - callBuffer.append(" "); - - if (!returnType.equals("void")) - { - preBuffer.append(" "); - preBuffer.append(printCorbaParameter(returnType)); - if (isPassedAsPointer(returnType)) - preBuffer.append("*"); - preBuffer.append(" _b_ret;\n"); - preBuffer.append(" "); - preBuffer.append(printUnoType(returnType, sal_False, sal_False)); - preBuffer.append(" _u_ret;\n"); - - callBuffer.append("_b_ret = "); - } - - callBuffer.append(printCorbaType(m_typeName, sal_False, sal_False)); - callBuffer.append("_"); - if (methodName.indexOf("_reserved_identifier_") == 0) - callBuffer.append(methodName.copy(OString("_reserved_identifier_").getLength())); - else - callBuffer.append(methodName); - - callBuffer.append("( m_corbaObject"); - - for (j=0; j < paramCount; j++) - { - paramName = m_reader.getMethodParamName(i, j); - paramType = m_reader.getMethodParamType(i, j); - paramMode = m_reader.getMethodParamMode(i, j); - - preBuffer.append(" "); - preBuffer.append(printCorbaParameter(paramType)); - if (isPassedAsPointer(paramType) && (paramMode == RT_PARAM_OUT)) - { - preBuffer.append("* _b_"); - preBuffer.append(paramName); - preBuffer.append(";\n"); - } - else - { - preBuffer.append(" _b_"); - preBuffer.append(paramName); - preBuffer.append(";\n"); - } - - switch (paramMode) { - case RT_PARAM_IN: - - if (isArray(paramType)) - preBuffer.append(" // fix me: conversion of array types!\n"); - else - { - preBuffer.append(" cpp_convert_u2b("); - preBuffer.append("_b_"); - preBuffer.append(paramName); - preBuffer.append(", "); - preBuffer.append(paramName); - preBuffer.append(", m_bridge);\n"); - } - - if (isPassedAsPointer(paramType)) - callBuffer.append(", &_b_"); - else - callBuffer.append(", _b_"); - break; - case RT_PARAM_INOUT: - - if (isArray(paramType)) - preBuffer.append(" // fix me: conversion of array types!\n"); - else - { - preBuffer.append(" cpp_convert_u2b("); - if (isPassedAsPointer(paramType)) - preBuffer.append("_b_"); - else - preBuffer.append("_b_"); - preBuffer.append(paramName); - preBuffer.append(", "); - preBuffer.append(paramName); - preBuffer.append(", m_bridge);\n"); - } - - callBuffer.append(", &_b_"); - - if (isArray(paramType)) - postBuffer.append(" // fix me: conversion of array types!\n"); - else - { - postBuffer.append(" cpp_convert_b2u("); - postBuffer.append(paramName); - postBuffer.append(", _b_"); - postBuffer.append(paramName); - postBuffer.append(", m_bridge);\n"); - } - - break; - case RT_PARAM_OUT: - - callBuffer.append(", &_b_"); - - if (isArray(paramType)) - postBuffer.append(" // fix me: conversion of array types!\n"); - else - { - postBuffer.append(" cpp_convert_b2u("); - postBuffer.append(paramName); - if (isPassedAsPointer(paramType)) - postBuffer.append(", *_b_"); - else - postBuffer.append(", _b_"); - postBuffer.append(paramName); - postBuffer.append(", m_bridge);\n"); - } - - break; - } - - - callBuffer.append(paramName); - } - - callBuffer.append(", &_ev );\n"); - - if (!returnType.equals("void")) - { - if (isArray(returnType)) - { - postBuffer.append(" // fix me: conversion of array types!\n"); - } - else - { - if (isPassedAsPointer(returnType)) - postBuffer.append(" cpp_convert_b2u(_u_ret, *_b_ret, m_bridge);\n"); - else - postBuffer.append(" cpp_convert_b2u(_u_ret, _b_ret, m_bridge);\n"); - } - postBuffer.append(" return _u_ret;\n"); - } - - o << " ::osl::MutexGuard guard(m_bridge->getORBLock());\n" - << " CORBA_Environment _ev;\n" - << " CORBA_exception_init (&_ev);\n"; - - o << preBuffer; - o << callBuffer; - - o << " if (_ev._major != CORBA_NO_EXCEPTION) {\n" - << " ::com::sun::star::uno::RuntimeException _ex(::rtl::OUString::createFromAscii(\"exception raised in bonobobridge\"), NULL);\n" - << " CORBA_exception_free (&_ev);\n" - << " throw _ex;\n" - << " }\n" - << " CORBA_exception_free (&_ev);\n"; - - o << postBuffer; - - o << indent() << "}\n"; - } - else - o << " );\n"; - } -} - -void InterfaceType::dumpCorbaMethods(FileStream& o, sal_Bool bDeclOnly) -{ - OString superName(m_reader.getSuperTypeName()); - - sal_uInt32 methodCount = m_reader.getMethodCount(); - - OString methodName, returnType, paramType, paramName; - sal_uInt32 paramCount = 0; - sal_uInt32 excCount = 0; - RTMethodMode methodMode = RT_MODE_INVALID; - RTParamMode paramMode = RT_PARAM_INVALID; - - sal_Bool bRef = sal_False; - sal_Bool bConst = sal_False; - sal_Bool bWithRunTimeExcp = sal_True; - - for (sal_uInt16 i=0; i < methodCount; i++) - { - methodName = m_reader.getMethodName(i); - returnType = m_reader.getMethodReturnType(i); - paramCount = m_reader.getMethodParamCount(i); - excCount = m_reader.getMethodExcCount(i); - methodMode = m_reader.getMethodMode(i); - - o << indent() - << "extern \"C\" " - << printCorbaParameter(returnType); - - if (isPassedAsPointer(returnType)) - o << "*"; - - o << " bonobobridge_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "_" << methodName << "( PortableServer_Servant _servant, "; - - sal_uInt16 j; - for (j=0; j < paramCount; j++) - { - paramName = m_reader.getMethodParamName(i, j); - paramType = m_reader.getMethodParamType(i, j); - paramMode = m_reader.getMethodParamMode(i, j); - - if ((isPassedAsPointer(paramType) || paramType.equals("string") || isArray(paramType)) && - (paramMode == RT_PARAM_IN)) - o << "const "; - - o << printCorbaParameter(paramType); - - if (isPassedAsPointer(paramType)) - { - if (paramMode == RT_PARAM_OUT) - o << "**"; - else - o << "*"; - } - else - { - if (paramMode != RT_PARAM_IN) - o << "*"; - } - - - o << " " << paramName << ", "; - } - - o << "CORBA_Environment * _ev)"; - - if (bDeclOnly) - o << ";\n"; - else - { - o << " {\n"; - OStringBuffer preBuffer(1024); - OStringBuffer callBuffer(1024); - OStringBuffer postBuffer(1024); - - callBuffer.append(" "); - - preBuffer.append(" "); - preBuffer.append(printUnoType(m_typeName, sal_False, sal_False)); - preBuffer.append(" rThis(("); - preBuffer.append(printUnoType(m_typeName, sal_False, sal_False, sal_True)); - preBuffer.append(" *)((bonobobridge::UNO_POA_com_sun_star_uno_XInterface*)_servant)->pThis->getUnoObject());\n"); - - if (!returnType.equals("void")) - { - preBuffer.append(" "); - preBuffer.append(printCorbaParameter(returnType)); - if (isPassedAsPointer(returnType)) - { - preBuffer.append("* _b_ret = "); - preBuffer.append(printCorbaType(returnType, sal_False, sal_False)); - preBuffer.append("__alloc();\n"); - - } - else - { - preBuffer.append(" _b_ret;\n"); - } - preBuffer.append(" "); - preBuffer.append(printUnoType(returnType, sal_False, sal_False)); - preBuffer.append(" _u_ret;\n"); - - callBuffer.append("_u_ret = "); - } - - callBuffer.append("rThis->"); - callBuffer.append(methodName); - callBuffer.append("( "); - - for (j=0; j < paramCount; j++) - { - paramName = m_reader.getMethodParamName(i, j); - paramType = m_reader.getMethodParamType(i, j); - paramMode = m_reader.getMethodParamMode(i, j); - - preBuffer.append(" "); - preBuffer.append(printUnoType(paramType, sal_False, sal_False)); - preBuffer.append(" _u_"); - preBuffer.append(paramName); - preBuffer.append(";\n"); - - callBuffer.append("_u_"); - callBuffer.append(paramName); - - if (j < (paramCount-1)) - callBuffer.append(", "); - - switch (paramMode) { - case RT_PARAM_IN: - - if (isArray(paramType)) - preBuffer.append(" // fix me: conversion of array types!\n"); - else - { - preBuffer.append(" cpp_convert_b2u("); - preBuffer.append("_u_"); - preBuffer.append(paramName); - preBuffer.append(", "); - if (isPassedAsPointer(paramType)) - preBuffer.append("*"); - preBuffer.append(paramName); - preBuffer.append(", ((bonobobridge::UNO_POA_com_sun_star_uno_XInterface*)_servant)->pThis->getBridge());\n"); - } - break; - case RT_PARAM_INOUT: - - if (isArray(paramType)) - { - preBuffer.append(" // fix me: conversion of array types!\n"); - postBuffer.append(" // fix me: conversion of array types!\n"); - } - else - { - preBuffer.append(" cpp_convert_b2u("); - preBuffer.append("_u_"); - preBuffer.append(paramName); - preBuffer.append(", "); - if (isPassedAsPointer(paramType)) - preBuffer.append("*"); - preBuffer.append(paramName); - preBuffer.append(", ((bonobobridge::UNO_POA_com_sun_star_uno_XInterface*)_servant)->pThis->getBridge());\n"); - - postBuffer.append(" cpp_convert_u2b("); - if (isPassedAsPointer(paramType)) - postBuffer.append("*"); - postBuffer.append(paramName); - postBuffer.append(", _u_"); - postBuffer.append(paramName); - postBuffer.append(", ((bonobobridge::UNO_POA_com_sun_star_uno_XInterface*)_servant)->pThis->getBridge());\n"); - } - break; - case RT_PARAM_OUT: - - if (isArray(paramType)) - preBuffer.append(" // fix me: conversion of array types!\n"); - else - { - postBuffer.append(" cpp_convert_u2b("); - if (isPassedAsPointer(paramType)) - postBuffer.append("**"); - else - postBuffer.append("*"); - postBuffer.append(paramName); - postBuffer.append(", _u_"); - postBuffer.append(paramName); - postBuffer.append(", ((bonobobridge::UNO_POA_com_sun_star_uno_XInterface*)_servant)->pThis->getBridge());\n"); - } - break; - } - } - - callBuffer.append(" );\n"); - - if (!returnType.equals("void")) - { - if (isArray(returnType)) - postBuffer.append(" // fix me: conversion of array types!\n"); - else - { - if (isPassedAsPointer(returnType)) - postBuffer.append(" cpp_convert_u2b(*_b_ret, _u_ret, ((bonobobridge::UNO_POA_com_sun_star_uno_XInterface*)_servant)->pThis->getBridge());\n"); - else - postBuffer.append(" cpp_convert_u2b(_b_ret, _u_ret, ((bonobobridge::UNO_POA_com_sun_star_uno_XInterface*)_servant)->pThis->getBridge());\n"); - } - - postBuffer.append(" return _b_ret;\n"); - } - - o << preBuffer; - o << callBuffer; - o << postBuffer; - - o << "}\n"; - } - } -} - -void InterfaceType::dumpFunctions(FileStream& o) -{ - if (m_typeName.equals("com/sun/star/uno/XInterface") || - m_typeName.equals("Bonobo/NullInterface")) - return; - - m_generatedConversions->insert(m_typeName); - - o << "namespace bonobobridge {\n\n"; - - /* bonobo implementation class */ - o << "class BonoboWrapper_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - - OString superName(m_reader.getSuperTypeName()); - o << " : public BonoboWrapper< BonoboWrapper_"; - dumpCorbaType(o, superName, sal_False, sal_False); - o << ", "; - dumpUnoType(o, m_typeName, sal_False, sal_False, sal_True); - o << " > {\n"; - - o << "public: \n" - << " BonoboWrapper_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "("; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << " corbaObject," - << "const vos::ORef<bonobobridge::Bridge>& bridge)\n"; - - o << " : BonoboWrapper< " - << "BonoboWrapper_"; - dumpCorbaType(o, superName, sal_False, sal_False); - o << ", "; - dumpUnoType(o, m_typeName, sal_False, sal_False, sal_True); - o << " >(corbaObject, bridge) {\n"; - - if (isDerivedFromUnknown(m_typeName)) - { - o << " m_bridge->registerObjectWrapper(::getCppuType(("; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << "*)NULL), m_corbaObject, ("; - dumpUnoType(o, m_typeName, sal_False, sal_False, sal_True); - o << "*)this);\n"; - } - - o << " }\n"; - - o << " virtual ~BonoboWrapper_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "() {\n"; - if (isDerivedFromUnknown(m_typeName)) - { - o << " m_bridge->unregisterObjectWrapper(::getCppuType(("; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << "*)NULL), m_corbaObject, ("; - dumpUnoType(o, m_typeName, sal_False, sal_False, sal_True); - o << "*)this);\n"; - } - o << " }\n"; - inc(); - dumpUnoMethods(o, sal_True, sal_False); - dec(); - - o << "};\n\n"; - - o << "}; // namespace bonobobridge\n"; - - dumpUnoMethods(o, sal_False, sal_False); - - /* convert function bonobo to uno */ - o << "static sal_Bool convert_b2u_" << m_typeName.replace('/', '_') - << "(void* pOut, const void* pIn, const ::com::sun::star::uno::Type& type, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n" - << " sal_Bool ret = sal_True;\n "; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << "& _u = *("; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << "*) pOut;\n const "; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "& _b = *(const "; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "*) pIn;\n\n" - << " _u = new bonobobridge::BonoboWrapper_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "(_b, bridge);\n" - << " return ret;\n"; - - o << "}\n\n"; - - /* POA implementation class */ - dumpCorbaMethods(o, sal_True); - o << "static POA_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "__epv bonobobridge_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "_epv = {\n"; - sal_uInt32 methodCount = m_reader.getMethodCount(); - OString methodName; - - o << " NULL,\n"; - - for (sal_uInt16 i=0; i < methodCount; i++) - { - methodName = m_reader.getMethodName(i); - o << " bonobobridge_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "_" << methodName; - - if (i < (methodCount-1)) - o << ",\n"; - else - o << "\n};\n"; - } - - OStringBuffer initBuffer(1024); - - initBuffer.insert(0, OString("&bonobobridge_") + printCorbaType(m_typeName, sal_False, sal_False) + OString("_epv")); - - while(superName.getLength() != 0) - { - if (superName.equals("Bonobo/NullInterface")) - { - superName = ""; - } - else - { - if (superName.equals("com/sun/star/uno/XInterface")) - { - initBuffer.insert(0, OString("&bonobobridge_com_sun_star_uno_XInterface_epv, ")); - } - else - { - initBuffer.insert(0, OString("&bonobobridge_") + printCorbaType(superName, sal_False, sal_False) + OString("_epv, ")); - } - TypeReader reader(m_typeMgr.getTypeReader(superName)); - superName = reader.getSuperTypeName(); - } - } - - initBuffer.insert(0, OString("NULL, ")); - - o << "static POA_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "__vepv bonobobridge_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "__vepv = {"; - o << initBuffer.makeStringAndClear(); - o << " };\n"; - - superName = m_reader.getSuperTypeName(); - - o << "namespace bonobobridge {\n\n"; - - o << "class UnoServant_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << " : public UnoServant_com_sun_star_uno_XInterface {\n"; - - o << "public:\n" - << " UnoServant_"; - - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "("; - dumpUnoType(o, m_typeName, sal_False, sal_False, sal_True); - o << "* unoObject," - << " const ::vos::ORef<bonobobridge::Bridge>& bridge," - << " CORBA_Environment *ev," - << " sal_Bool bInitPoa)\n" - << " : UnoServant_com_sun_star_uno_XInterface(unoObject, bridge, ev, sal_False) {\n" - << " if (bInitPoa) {\n" - << " memset(&m_POAUnknown, 0, sizeof(m_POAUnknown));\n" - << " POA_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "__init((PortableServer_Servant) &(m_POAUnknown.poa), ev);\n" - << " m_POAUnknown.pThis = (UnoServant_com_sun_star_uno_XInterface*)this;\n" - << " m_POAUnknown.poa.vepv = (POA_Bonobo_Unknown__vepv*)&bonobobridge_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "__vepv;\n" - << " }\n" - << " }\n" - << "};\n" - << "}; // namespace bonobobridge\n"; - - dumpCorbaMethods(o, sal_False); - - /* convert function uno to bonobo */ - o << "static sal_Bool convert_u2b_" << m_typeName.replace('/', '_') - << "(void* pOut, const void* pIn, const ::com::sun::star::uno::Type& type, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n"; - o << " sal_Bool ret = sal_True;\n const "; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << "& _u = *(const "; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << "*) pIn;\n "; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "& _b = *("; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "*) pOut;\n\n" - << " if (_u.is()) {\n" - << " bonobobridge::UnoServant_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << " *uno_servant;\n" - << " POA_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << " *poa;\n" - << " CORBA_Environment ev;\n" - << " CORBA_exception_init (&ev);\n" - << " uno_servant = new bonobobridge::UnoServant_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "(_u.get(), bridge, &ev, sal_True);\n" - << " poa = (POA_"; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "*)uno_servant->getPOA();\n" - << " if (ev._major != CORBA_NO_EXCEPTION) {\n" - << " delete uno_servant;\n" - << " CORBA_exception_free (&ev);\n" - << " _b = CORBA_OBJECT_NIL;\n" - << " ret = sal_False;\n" - << " }\n" - << " else {\n" - << " CORBA_free(PortableServer_POA_activate_object(bridge->getPOA(), poa, &ev));\n" - << " _b = PortableServer_POA_servant_to_reference (bridge->getPOA(), poa, &ev);\n" - << " uno_servant->corbaObjectRegistered(_b, getCppuType(("; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << "*)NULL)"; - - if (!isDerivedFromUnknown(m_typeName)) - o << ", sal_False"; - - o << ");\n" - << " }\n" - << " CORBA_exception_free (&ev);\n" - << " }\n" - << " return ret;\n" - << "}\n\n"; - - o << "inline sal_Bool bonobobridge::cpp_convert_b2u("; - dumpUnoType(o, m_typeName, sal_False, sal_True); - o << " u, "; - dumpCorbaType(o, m_typeName, sal_True, sal_True); - o << " b, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n" - << " return bridge->convertB2U(&u, &b, ::getCppuType(&u));\n" - << "};\n\n"; - - o << "inline sal_Bool bonobobridge::cpp_convert_u2b("; - dumpCorbaType(o, m_typeName, sal_False, sal_True); - o << " b, "; - dumpUnoType(o, m_typeName, sal_True, sal_True); - o << " u, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n" - << " return bridge->convertU2B(&b, &u, ::getCppuType(&u));\n" - << "};\n\n"; - - return; -} - - - - -sal_uInt32 InterfaceType::getMemberCount() -{ - sal_uInt32 count = m_reader.getMethodCount(); - - if (count) - m_hasMethods = sal_True; - - sal_uInt32 fieldCount = m_reader.getFieldCount(); - RTFieldAccess access = RT_ACCESS_INVALID; - for (sal_uInt16 i=0; i < fieldCount; i++) - { - access = m_reader.getFieldAccess(i); - - if (access != RT_ACCESS_CONST && access != RT_ACCESS_INVALID) - { - m_hasAttributes = sal_True; - count++; - } - } - return count; -} - -sal_uInt32 InterfaceType::checkInheritedMemberCount(const TypeReader* pReader) -{ - sal_uInt32 cout = 0; - sal_Bool bSelfCheck = sal_True; - if (!pReader) - { - bSelfCheck = sal_False; - pReader = &m_reader; - } - - sal_uInt32 count = 0; - OString superType(pReader->getSuperTypeName()); - if (superType.getLength() > 0) - { - TypeReader aSuperReader(m_typeMgr.getTypeReader(superType)); - if (aSuperReader.isValid()) - { - count = checkInheritedMemberCount(&aSuperReader); - } - } - - if (bSelfCheck) - { - count += pReader->getMethodCount(); - sal_uInt32 fieldCount = pReader->getFieldCount(); - RTFieldAccess access = RT_ACCESS_INVALID; - for (sal_uInt16 i=0; i < fieldCount; i++) - { - access = pReader->getFieldAccess(i); - - if (access != RT_ACCESS_CONST && access != RT_ACCESS_INVALID) - count++; - } - } - - return count; -} - -sal_uInt32 InterfaceType::getInheritedMemberCount() -{ - if (m_inheritedMemberCount == 0) - { - m_inheritedMemberCount = checkInheritedMemberCount(0); - } - - return m_inheritedMemberCount; -} - - - - -//************************************************************************* -// ModuleType -//************************************************************************* -ModuleType::ModuleType(TypeReader& typeReader, - const OString& typeName, - const TypeManager& typeMgr, - const TypeDependency& typeDependencies, - TypeSet* generatedConversions) - : CorbaType(typeReader, typeName, typeMgr, typeDependencies, generatedConversions) -{ -} - -ModuleType::~ModuleType() -{ - -} - - -sal_Bool ModuleType::hasConstants() -{ - sal_uInt32 fieldCount = m_reader.getFieldCount(); - RTFieldAccess access = RT_ACCESS_INVALID; - - for (sal_uInt16 i=0; i < fieldCount; i++) - { - access = m_reader.getFieldAccess(i); - - if (access == RT_ACCESS_CONST) - return sal_True; - } - - return sal_False; -} - -void ModuleType::dumpFunctions(FileStream& o) -{ -}; - -sal_Bool ModuleType::dumpConversionFunctions(FileStream& o, TypeSet* allreadyDumped) - throw( CannotDumpException ) -{ - sal_Bool bSpecialDefine = sal_True; - - if (m_reader.getTypeClass() == RT_TYPE_CONSTANTS) - { - bSpecialDefine = sal_False; - } - - dumpInclude(o, allreadyDumped, m_typeName, "hpp", bSpecialDefine); - - return sal_True; -} - -//************************************************************************* -// ConstantsType -//************************************************************************* -ConstantsType::ConstantsType(TypeReader& typeReader, - const OString& typeName, - const TypeManager& typeMgr, - const TypeDependency& typeDependencies, - TypeSet* generatedConversions) - : ModuleType(typeReader, typeName, typeMgr, typeDependencies, generatedConversions) -{ -} - -ConstantsType::~ConstantsType() -{ - -} - -void ConstantsType::dumpFunctions(FileStream& o) -{ -}; - -//************************************************************************* -// StructureType -//************************************************************************* -StructureType::StructureType(TypeReader& typeReader, - const OString& typeName, - const TypeManager& typeMgr, - const TypeDependency& typeDependencies, - TypeSet* generatedConversions) - : CorbaType(typeReader, typeName, typeMgr, typeDependencies, generatedConversions) -{ -} - -StructureType::~StructureType() -{ - -} - -void StructureType::dumpFunctions(FileStream& o) -{ - m_generatedConversions->insert(m_typeName); - - OString superType(m_reader.getSuperTypeName()); - - o << "static sal_Bool convert_b2u_" << m_typeName.replace('/', '_') - << "(void* pOut, const void* pIn, const ::com::sun::star::uno::Type& type, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n" - << " sal_Bool ret = sal_True;\n "; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << "& _u = *("; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << "*) pOut;\n const "; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "& _b = *(const "; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "*) pIn;\n\n"; - - sal_uInt32 fieldCount = m_reader.getFieldCount(); - OString fieldName; - OString fieldType; - sal_uInt16 i=0; - sal_Int32 cIndex; - OString corbaFieldName; - - sal_Bool bIsUnion = sal_False; - - for (i=0; !bIsUnion && (i < fieldCount); i++) - bIsUnion = OString("_union_fake_tag").equals(m_reader.getFieldName(i)); - - if (bIsUnion) - { - o << " // fix me: union !!!!\n ret = sal_False;\n"; - } - else - { - if (superType.getLength() > 0) - { - o << " ret = bonobobridge::cpp_convert_b2u(("; - dumpUnoType(o, superType, sal_False, sal_False); - o << "&) _u, (const "; - dumpCorbaType(o, superType, sal_False, sal_False); - o << "&) _b, bridge);\n"; - } - - for (i=0; i < fieldCount; i++) - { - fieldName = m_reader.getFieldName(i); - fieldType = m_reader.getFieldType(i); - cIndex = fieldName.indexOf("_reserved_identifier_"); - - if (cIndex == 0) - corbaFieldName = fieldName.copy(OString("_reserved_identifier_").getLength()); - else - corbaFieldName = fieldName; - - if (isArray(fieldType)) - o << " // fix me: no conversion of array types!\n"; - else - o << " if (ret)\n" - << " ret = bonobobridge::cpp_convert_b2u(" - << "_u." << fieldName.getStr() - << " , _b." << corbaFieldName.getStr() - << ", bridge);\n"; - } - } - o << " return ret;\n" - << "}\n\n" - << "static sal_Bool convert_u2b_" << m_typeName.replace('/', '_') - << "(void* pOut, const void* pIn, const ::com::sun::star::uno::Type& type, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n" - << " sal_Bool ret = sal_True;\n const "; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << "& _u = *(const "; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << "*) pIn;\n "; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "& _b = *("; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "*) pOut;\n\n"; - - if (bIsUnion) - o << " // fix me: union !!!!\n ret = sal_False;\n"; - else - { - if (superType.getLength() > 0) - { - o << " ret = bonobobridge::cpp_convert_u2b(("; - dumpCorbaType(o, superType, sal_False, sal_False); - o << "&) _u, (const "; - dumpUnoType(o, superType, sal_False, sal_False); - o << "&) _b, bridge);\n"; - } - - for (i=0; i < fieldCount; i++) - { - fieldName = m_reader.getFieldName(i); - fieldType = m_reader.getFieldType(i); - - cIndex = fieldName.indexOf("_reserved_identifier_"); - - if (cIndex == 0) - corbaFieldName = fieldName.copy(OString("_reserved_identifier_").getLength()); - else - corbaFieldName = fieldName; - - if (isArray(fieldType)) - o << " // fix me: no conversion of array types!\n"; - else - o << " if (ret)\n" - << " ret = bonobobridge::cpp_convert_u2b(" - << "_b." << corbaFieldName.getStr() - << ", _u." << fieldName.getStr() - << ", bridge);\n"; - } - } - - o << " return ret;\n" - << "}\n\n"; - - o << "inline sal_Bool bonobobridge::cpp_convert_b2u("; - dumpUnoType(o, m_typeName, sal_False, sal_True); - o << " u , "; - dumpCorbaType(o, m_typeName, sal_True, sal_True); - o << " b, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n" - << " return convert_b2u_" << m_typeName.replace('/', '_') - << "(&u, &b, ::getCppuType(&u), bridge);\n" - << "};\n\n"; - - o << "inline sal_Bool bonobobridge::cpp_convert_u2b("; - dumpCorbaType(o, m_typeName, sal_False, sal_True); - o << " b, "; - dumpUnoType(o, m_typeName, sal_True, sal_True); - o << " u, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n" - << " return convert_u2b_" << m_typeName.replace('/', '_') - << "(&b, &u, ::getCppuType(&u), bridge);\n" - << "};\n\n"; -} - -sal_Bool StructureType::dumpSuperMember(FileStream& o, const OString& superType, sal_Bool bWithType) -{ - sal_Bool hasMember = sal_False; - - if (superType.getLength() > 0) - { - TypeReader aSuperReader(m_typeMgr.getTypeReader(superType)); - - if (aSuperReader.isValid()) - { - hasMember = dumpSuperMember(o, aSuperReader.getSuperTypeName(), bWithType); - - sal_uInt32 fieldCount = aSuperReader.getFieldCount(); - RTFieldAccess access = RT_ACCESS_INVALID; - OString fieldName; - OString fieldType; - for (sal_uInt16 i=0; i < fieldCount; i++) - { - access = aSuperReader.getFieldAccess(i); - - if (access == RT_ACCESS_CONST || access == RT_ACCESS_INVALID) - continue; - - fieldName = aSuperReader.getFieldName(i); - fieldType = aSuperReader.getFieldType(i); - - if (hasMember) - { - o << ", "; - } else - { - hasMember = (fieldCount > 0); - } - - if (bWithType) - { - dumpUnoType(o, fieldType, sal_True, sal_True); - o << " "; - } - o << "__" << fieldName; - } - } - } - - return hasMember; -} - -//************************************************************************* -// ExceptionType -//************************************************************************* -ExceptionType::ExceptionType(TypeReader& typeReader, - const OString& typeName, - const TypeManager& typeMgr, - const TypeDependency& typeDependencies, - TypeSet* generatedConversions) - : CorbaType(typeReader, typeName, typeMgr, typeDependencies, generatedConversions) -{ -} - -ExceptionType::~ExceptionType() -{ - -} - -void ExceptionType::dumpFunctions(FileStream& o) -{ - if (m_typeName.equals("com/sun/star/uno/Exception")) - return; - - if (m_typeName.equals("com/sun/star/uno/RuntimeException")) - return; - - m_generatedConversions->insert(m_typeName); - - OString superType(m_reader.getSuperTypeName()); - - o << "static sal_Bool convert_b2u_" << m_typeName.replace('/', '_') - << "(void* pOut, const void* pIn, const ::com::sun::star::uno::Type& type, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n" - << " sal_Bool ret = sal_True;\n"; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << "& _u = *("; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << "*) pOut;\n const "; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "& _b = *(const "; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "*) pIn;\n\n"; - - sal_uInt32 fieldCount = m_reader.getFieldCount(); - OString fieldName; - OString fieldType; - sal_uInt16 i=0; - sal_Int32 cIndex; - OString corbaFieldName; - - if (superType.getLength() > 0) - { - o << " ret = bonobobridge::cpp_convert_b2u(("; - dumpUnoType(o, superType, sal_False, sal_False); - o << "&) _u, (const "; - dumpCorbaType(o, superType, sal_False, sal_False); - o << "&) _b, bridge);\n"; - } - - for (i=0; i < fieldCount; i++) - { - fieldName = m_reader.getFieldName(i); - fieldType = m_reader.getFieldType(i); - cIndex = fieldName.indexOf("_reserved_identifier_"); - - if (cIndex == 0) - corbaFieldName = fieldName.copy(OString("_reserved_identifier_").getLength()); - else - corbaFieldName = fieldName; - - if (isArray(fieldType)) - o << " // fix me: no conversion of array types!\n"; - else - o << " if (ret)\n" - << " ret = bonobobridge::cpp_convert_b2u(" - << "_u." << fieldName.getStr() - << ", _b." << corbaFieldName.getStr() - << ", bridge);\n"; - } - o << " return ret;\n" - << "}\n\n"; - - - o << "static sal_Bool convert_u2b_" << m_typeName.replace('/', '_') - << "(void* pOut, const void* pIn, const ::com::sun::star::uno::Type& type, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n" - << " sal_Bool ret = sal_True;\n const "; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << "& _u = *(const "; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << "*) pIn;\n "; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "& _b = *("; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "*) pOut;\n\n"; - - if (superType.getLength() > 0) - { - o << " ret = bonobobridge::cpp_convert_u2b(("; - dumpCorbaType(o, superType, sal_False, sal_False); - o << "&) _u, (const "; - dumpUnoType(o, superType, sal_False, sal_False); - o << "&) _b, bridge);\n"; - } - - for (i=0; i < fieldCount; i++) - { - fieldName = m_reader.getFieldName(i); - fieldType = m_reader.getFieldType(i); - - cIndex = fieldName.indexOf("_reserved_identifier_"); - - if (cIndex == 0) - corbaFieldName = fieldName.copy(OString("_reserved_identifier_").getLength()); - else - corbaFieldName = fieldName; - - if (isArray(fieldType)) - o << " // fix me: no conversion of array types!\n"; - else - o << " if (ret)\n" - << " ret = bonobobridge::cpp_convert_u2b(" - << "_b." << corbaFieldName.getStr() - << ", _u." << fieldName.getStr() - << ", bridge);\n"; - } - - o << " return ret;\n" - << "}\n\n"; - - o << "inline sal_Bool bonobobridge::cpp_convert_b2u("; - dumpUnoType(o, m_typeName, sal_False, sal_True); - o << " u , "; - dumpCorbaType(o, m_typeName, sal_True, sal_True); - o << " b, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n" - << " return convert_b2u_" << m_typeName.replace('/', '_') - << "(&u, &b, ::getCppuType(&u), bridge);\n" - << "};\n\n"; - - o << "inline sal_Bool bonobobridge::cpp_convert_u2b("; - dumpCorbaType(o, m_typeName, sal_False, sal_True); - o << " b, "; - dumpUnoType(o, m_typeName, sal_True, sal_True); - o << " u, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n" - << " return convert_u2b_" << m_typeName.replace('/', '_') - << "(&b, &u, ::getCppuType(&u), bridge);\n" - << "};\n\n"; -} - - - -sal_Bool ExceptionType::dumpSuperMember(FileStream& o, const OString& superType, sal_Bool bWithType) -{ - sal_Bool hasMember = sal_False; - - if (superType.getLength() > 0) - { - TypeReader aSuperReader(m_typeMgr.getTypeReader(superType)); - - if (aSuperReader.isValid()) - { - hasMember = dumpSuperMember(o, aSuperReader.getSuperTypeName(), bWithType); - - sal_uInt32 fieldCount = aSuperReader.getFieldCount(); - RTFieldAccess access = RT_ACCESS_INVALID; - OString fieldName; - OString fieldType; - for (sal_uInt16 i=0; i < fieldCount; i++) - { - access = aSuperReader.getFieldAccess(i); - - if (access == RT_ACCESS_CONST || access == RT_ACCESS_INVALID) - continue; - - fieldName = aSuperReader.getFieldName(i); - fieldType = aSuperReader.getFieldType(i); - - if (hasMember) - { - o << ", "; - } else - { - hasMember = (fieldCount > 0); - } - - if (bWithType) - { - dumpUnoType(o, fieldType, sal_True, sal_True); - o << " "; - } - o << "__" << fieldName; - } - } - } - - return hasMember; -} - -//************************************************************************* -// EnumType -//************************************************************************* -EnumType::EnumType(TypeReader& typeReader, - const OString& typeName, - const TypeManager& typeMgr, - const TypeDependency& typeDependencies, - TypeSet* generatedConversions) - : CorbaType(typeReader, typeName, typeMgr, typeDependencies, generatedConversions) -{ -} - -EnumType::~EnumType() -{ - -} - -void EnumType::dumpFunctions(FileStream& o) -{ - if (m_typeName.equals("com/sun/star/uno/TypeClass")) - return; - - m_generatedConversions->insert(m_typeName); - - o << "static sal_Bool convert_b2u_" << m_typeName.replace('/', '_') - << "(void* pOut, const void* pIn, const ::com::sun::star::uno::Type& type, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n" - << " *("; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << "*) pOut = ("; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << ") *(const "; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "*) pIn;\n\n" - << " return sal_True;\n" - << "}\n\n"; - - o << "static sal_Bool convert_u2b_" << m_typeName.replace('/', '_') - << "(void* pOut, const void* pIn, const ::com::sun::star::uno::Type& type, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n" - << " *("; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << "*) pOut = ("; - dumpCorbaType(o, m_typeName, sal_False, sal_False); - o << ") *(const "; - dumpUnoType(o, m_typeName, sal_False, sal_False); - o << "*) pIn;\n\n" - << " return sal_True;\n" - << "}\n\n"; - - o << "inline sal_Bool bonobobridge::cpp_convert_b2u("; - dumpUnoType(o, m_typeName, sal_False, sal_True); - o << " u , "; - dumpCorbaType(o, m_typeName, sal_True, sal_True); - o << " b, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n" - << " return convert_b2u_" << m_typeName.replace('/', '_') - << "(&u, &b, ::getCppuType(&u), bridge);\n" - << "};\n\n"; - - o << "inline sal_Bool bonobobridge::cpp_convert_u2b("; - dumpCorbaType(o, m_typeName, sal_False, sal_True); - o << " b, "; - dumpUnoType(o, m_typeName, sal_True, sal_True); - o << " u, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n" - << " return convert_u2b_" << m_typeName.replace('/', '_') - << "(&b, &u, ::getCppuType(&u), bridge);\n" - << "};\n\n"; - - return; -} - - -//************************************************************************* -// TypeDefType -//************************************************************************* -TypeDefType::TypeDefType(TypeReader& typeReader, - const OString& typeName, - const TypeManager& typeMgr, - const TypeDependency& typeDependencies, - TypeSet* generatedConversions) - : CorbaType(typeReader, typeName, typeMgr, typeDependencies, generatedConversions) -{ -} - -TypeDefType::~TypeDefType() -{ - -} - -void TypeDefType::dumpFunctions(FileStream& o) -{ -} - - - -//************************************************************************* -// produceType -//************************************************************************* -sal_Bool produceType(const OString& typeName, - TypeManager& typeMgr, - TypeDependency& typeDependencies, - CorbaOptions* pOptions, - FileStream& o, TypeSet* allreadyDumped, - TypeSet* generatedConversions) - throw( CannotDumpException ) -{ - sal_Bool bNewTypeSet = (allreadyDumped == NULL); - sal_Bool ret = sal_True; - - if (bNewTypeSet) - allreadyDumped = new TypeSet(); - - - if (!typeDependencies.isGenerated(typeName)) - { - TypeReader reader(typeMgr.getTypeReader(typeName)); - - if (!reader.isValid() && !typeName.equals("/")) - ret = sal_False; - - if( ret && !checkTypeDependencies(typeMgr, typeDependencies, typeName)) - ret = sal_False; - - if (ret) - { - RTTypeClass typeClass = reader.getTypeClass(); - - switch (typeClass) - { - case RT_TYPE_INTERFACE: - { - InterfaceType iType(reader, typeName, typeMgr, typeDependencies, generatedConversions); - ret = iType.dump(pOptions, o, allreadyDumped); - if (ret) typeDependencies.setGenerated(typeName); - ret = iType.dumpDependedTypes(pOptions, o, allreadyDumped); - } - break; - case RT_TYPE_MODULE: - { - ModuleType mType(reader, typeName, typeMgr, typeDependencies, generatedConversions); - if (mType.hasConstants()) - { - ret = mType.dump(pOptions, o, allreadyDumped); - if (ret) typeDependencies.setGenerated(typeName); - } else - { - typeDependencies.setGenerated(typeName); - ret = sal_True; - } - } - break; - case RT_TYPE_STRUCT: - { - StructureType sType(reader, typeName, typeMgr, typeDependencies, generatedConversions); - ret = sType.dump(pOptions, o, allreadyDumped); - if (ret) typeDependencies.setGenerated(typeName); - ret = sType.dumpDependedTypes(pOptions, o, allreadyDumped); - } - break; - case RT_TYPE_ENUM: - { - EnumType enType(reader, typeName, typeMgr, typeDependencies, generatedConversions); - ret = enType.dump(pOptions, o, allreadyDumped); - if (ret) typeDependencies.setGenerated(typeName); - ret = enType.dumpDependedTypes(pOptions, o, allreadyDumped); - } - break; - case RT_TYPE_EXCEPTION: - { - ExceptionType eType(reader, typeName, typeMgr, typeDependencies, generatedConversions); - ret = eType.dump(pOptions, o, allreadyDumped); - if (ret) typeDependencies.setGenerated(typeName); - ret = eType.dumpDependedTypes(pOptions, o, allreadyDumped); - } - break; - case RT_TYPE_TYPEDEF: - { - TypeDefType tdType(reader, typeName, typeMgr, typeDependencies, generatedConversions); - ret = tdType.dump(pOptions, o, allreadyDumped); - if (ret) typeDependencies.setGenerated(typeName); - ret = tdType.dumpDependedTypes(pOptions, o, allreadyDumped); - } - break; - case RT_TYPE_CONSTANTS: - { - ConstantsType cType(reader, typeName, typeMgr, typeDependencies, generatedConversions); - if (cType.hasConstants()) - { - ret = cType.dump(pOptions, o, allreadyDumped); - if (ret) typeDependencies.setGenerated(typeName); - } else - { - typeDependencies.setGenerated(typeName); - ret = sal_True; - } - } - break; - case RT_TYPE_SERVICE: - case RT_TYPE_OBJECT: - ret = sal_True; - break; - } - } - } - - if (bNewTypeSet) - delete allreadyDumped; - - return ret; -} - -//************************************************************************* -// scopedName -//************************************************************************* -OString scopedName(const OString& scope, const OString& type, - sal_Bool bNoNameSpace) -{ - sal_Int32 nPos = type.lastIndexOf( '/' ); - if (nPos == -1) - return type; - - if (bNoNameSpace) - return type.copy(nPos+1); - - OStringBuffer tmpBuf(type.getLength()*2); - nPos = 0; - do - { - tmpBuf.append("::"); - tmpBuf.append(type.getToken(0, '/', nPos)); - } while( nPos != -1 ); - - return tmpBuf.makeStringAndClear(); -} - -//************************************************************************* -// shortScopedName -//************************************************************************* -OString shortScopedName(const OString& scope, const OString& type, - sal_Bool bNoNameSpace) -{ - sal_Int32 nPos = type.lastIndexOf( '/' ); - if( nPos == -1 ) - return OString(); - - if (bNoNameSpace) - return OString(); - - // scoped name only if the namespace is not equal - if (scope.lastIndexOf('/') > 0) - { - OString tmpScp(scope.copy(0, scope.lastIndexOf('/'))); - OString tmpScp2(type.copy(0, nPos)); - - if (tmpScp == tmpScp2) - return OString(); - } - - OString aScope( type.copy( 0, nPos ) ); - OStringBuffer tmpBuf(aScope.getLength()*2); - - nPos = 0; - do - { - tmpBuf.append("::"); - tmpBuf.append(aScope.getToken(0, '/', nPos)); - } while( nPos != -1 ); - - return tmpBuf.makeStringAndClear(); -} - - |