diff options
Diffstat (limited to 'codemaker/source/cunomaker')
-rw-r--r-- | codemaker/source/cunomaker/cunomaker.cxx | 186 | ||||
-rw-r--r-- | codemaker/source/cunomaker/cunooptions.cxx | 330 | ||||
-rw-r--r-- | codemaker/source/cunomaker/cunooptions.hxx | 51 | ||||
-rw-r--r-- | codemaker/source/cunomaker/cunotype.cxx | 3533 | ||||
-rw-r--r-- | codemaker/source/cunomaker/cunotype.hxx | 309 | ||||
-rw-r--r-- | codemaker/source/cunomaker/makefile.mk | 61 |
6 files changed, 4470 insertions, 0 deletions
diff --git a/codemaker/source/cunomaker/cunomaker.cxx b/codemaker/source/cunomaker/cunomaker.cxx new file mode 100644 index 000000000000..56f20b0968c1 --- /dev/null +++ b/codemaker/source/cunomaker/cunomaker.cxx @@ -0,0 +1,186 @@ +/************************************************************************* + * + * 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 "sal/main.h" + +#include <codemaker/typemanager.hxx> +#include <codemaker/dependency.hxx> + +#include "cunooptions.hxx" +#include "cunotype.hxx" + +using namespace rtl; + +sal_Bool produceAllTypes(const OString& typeName, + TypeManager& typeMgr, + TypeDependency& typeDependencies, + CunoOptions* pOptions, + sal_Bool bFullScope) + throw( CannotDumpException ) +{ + if (!produceType(typeName, typeMgr, typeDependencies, pOptions)) + { + fprintf(stderr, "%s ERROR: %s\n", + pOptions->getProgramName().getStr(), + OString("cannot dump Type '" + typeName + "'").getStr()); + exit(99); + } + + RegistryKey typeKey = typeMgr.getTypeKey(typeName); + RegistryKeyNames subKeys; + + if (typeKey.getKeyNames(OUString(), subKeys)) + return sal_False; + + OString tmpName; + for (sal_uInt32 i=0; i < subKeys.getLength(); i++) + { + tmpName = OUStringToOString(subKeys.getElement(i), RTL_TEXTENCODING_UTF8); + + if (pOptions->isValid("-B")) + tmpName = tmpName.copy(tmpName.indexOf('/', 1) + 1); + else + tmpName = tmpName.copy(1); + + if (bFullScope) + { + if (!produceAllTypes(tmpName, typeMgr, typeDependencies, pOptions, sal_True)) + return sal_False; + } else + { + if (!produceType(tmpName, typeMgr, typeDependencies, pOptions)) + return sal_False; + } + } + + return sal_True; +} + +SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) +{ + CunoOptions options; + + try + { + if (!options.initOptions(argc, argv)) + { + exit(1); + } + } + catch( IllegalArgument& e) + { + fprintf(stderr, "Illegal option: %s\n", e.m_message.getStr()); + exit(99); + } + + RegistryTypeManager typeMgr; + TypeDependency typeDependencies; + + if (!typeMgr.init(!options.isValid("-T"), options.getInputFiles())) + { + fprintf(stderr, "%s : init registries failed, check your registry files.\n", options.getProgramName().getStr()); + exit(99); + } + + if (options.isValid("-B")) + { + typeMgr.setBase(options.getOption("-B")); + } + + try + { + if (options.isValid("-T")) + { + OString tOption(options.getOption("-T")); + + OString typeName, tmpName; + sal_Bool ret = sal_False; + sal_Int32 nIndex = 0; + do + { + typeName = tOption.getToken(0, ';', nIndex); + + sal_Int32 nPos = typeName.lastIndexOf( '.' ); + tmpName = typeName.copy( nPos != -1 ? nPos+1 : 0 ); + if (tmpName == "*") + { + // produce this type and his scope, but the scope is not recursively generated. + if (typeName.equals("*")) + { + tmpName = "/"; + } else + { + tmpName = typeName.copy(0, typeName.lastIndexOf('.')).replace('.', '/'); + if (tmpName.getLength() == 0) + tmpName = "/"; + else + tmpName.replace('.', '/'); + } + ret = produceAllTypes(tmpName, typeMgr, typeDependencies, &options, sal_False); + } else + { + // produce only this type + ret = produceType(typeName.replace('.', '/'), typeMgr, typeDependencies, &options); + } + + if (!ret) + { + fprintf(stderr, "%s ERROR: %s\n", + options.getProgramName().getStr(), + OString("cannot dump Type '" + typeName + "'").getStr()); + exit(99); + } + } while( nIndex != -1 ); + } else + { + // produce all types + if (!produceAllTypes("/", typeMgr, typeDependencies, &options, sal_True)) + { + fprintf(stderr, "%s ERROR: %s\n", + options.getProgramName().getStr(), + "an error occurs while dumping all types."); + exit(99); + } + } + } + catch( CannotDumpException& e) + { + fprintf(stderr, "%s ERROR: %s\n", + options.getProgramName().getStr(), + e.m_message.getStr()); + exit(99); + } + + return 0; +} + + diff --git a/codemaker/source/cunomaker/cunooptions.cxx b/codemaker/source/cunomaker/cunooptions.cxx new file mode 100644 index 000000000000..50a1223d004f --- /dev/null +++ b/codemaker/source/cunomaker/cunooptions.cxx @@ -0,0 +1,330 @@ +/************************************************************************* + * + * 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 "cunooptions.hxx" + +using namespace rtl; + +sal_Bool CunoOptions::initOptions(int ac, char* av[], sal_Bool bCmdFile) + throw( IllegalArgument ) +{ + sal_Bool ret = sal_True; + sal_uInt16 i=0; + + if (!bCmdFile) + { + bCmdFile = sal_True; + + m_program = av[0]; + + if (ac < 2) + { + fprintf(stderr, "%s", prepareHelp().getStr()); + ret = sal_False; + } + + i = 1; + } else + { + i = 0; + } + + char *s=NULL; + for (i; i < ac; i++) + { + if (av[i][0] == '-') + { + switch (av[i][1]) + { + case 'O': + if (av[i][2] == 'C') + { + if (av[i][3] == '\0') + { + if (i < ac - 1 && av[i+1][0] != '-') + { + i++; + s = av[i]; + } else + { + OString tmp("'-OC', please check"); + if (i <= ac - 1) + { + tmp += " your input '" + OString(av[i+1]) + "'"; + } + + throw IllegalArgument(tmp); + } + } else + { + s = av[i] + 3; + } + + m_options["-OC"] = OString(s); + break; + } else + if (av[i][2] == '\0') + { + if (i < ac - 1 && av[i+1][0] != '-') + { + i++; + s = av[i]; + } else + { + OString tmp("'-O', please check"); + if (i <= ac - 1) + { + tmp += " your input '" + OString(av[i+1]) + "'"; + } + + throw IllegalArgument(tmp); + } + } else + { + s = av[i] + 2; + } + + m_options["-O"] = OString(s); + break; + case 'B': + if (av[i][2] == '\0') + { + if (i < ac - 1 && av[i+1][0] != '-') + { + i++; + s = av[i]; + } else + { + OString tmp("'-B', please check"); + if (i <= ac - 1) + { + tmp += " your input '" + OString(av[i+1]) + "'"; + } + + throw IllegalArgument(tmp); + } + } else + { + s = av[i] + 2; + } + + m_options["-B"] = OString(s); + break; + case 'T': + if (av[i][2] == '\0') + { + if (i < ac - 1 && av[i+1][0] != '-') + { + i++; + s = av[i]; + } else + { + OString tmp("'-T', please check"); + if (i <= ac - 1) + { + tmp += " your input '" + OString(av[i+1]) + "'"; + } + + throw IllegalArgument(tmp); + } + } else + { + s = av[i] + 2; + } + + if (m_options.count("-T") > 0) + { + OString tmp(m_options["-T"]); + tmp = tmp + ";" + s; + m_options["-T"] = tmp; + } else + { + m_options["-T"] = OString(s); + } + break; + case 'U': + if (av[i][2] != '\0') + { + OString tmp("'-U', please check"); + if (i <= ac - 1) + { + tmp += " your input '" + OString(av[i]) + "'"; + } + + throw IllegalArgument(tmp); + } + + m_options["-U"] = OString(""); + break; +/* + case 'L': + if (av[i][2] != '\0') + { + OString tmp("'-L', please check"); + if (i <= ac - 1) + { + tmp += " your input '" + OString(av[i]) + "'"; + } + + throw IllegalArgument(tmp); + } + + if (isValid("-C") || isValid("-CS")) + { + OString tmp("'-L' could not be combined with '-C' or '-CS' option"); + throw IllegalArgument(tmp); + } + m_options["-L"] = OString(""); + break; +*/ + case 'C': + if (av[i][2] != '\0') + { + OString tmp("'-C', please check"); + if (i <= ac - 1) + { + tmp += " your input '" + OString(av[i]) + "'"; + } + + throw IllegalArgument(tmp); + } + + if (isValid("-L") || isValid("-CS")) + { + OString tmp("'-C' could not be combined with '-L' or '-CS' option"); + throw IllegalArgument(tmp); + } + m_options["-C"] = OString(""); + break; + case 'G': + if (av[i][2] == 'c') + { + if (av[i][3] != '\0') + { + OString tmp("'-Gc', please check"); + if (i <= ac - 1) + { + tmp += " your input '" + OString(av[i]) + "'"; + } + + throw IllegalArgument(tmp); + } + + m_options["-Gc"] = OString(""); + break; + } else + if (av[i][2] != '\0') + { + OString tmp("'-G', please check"); + if (i <= ac - 1) + { + tmp += " your input '" + OString(av[i]) + "'"; + } + + throw IllegalArgument(tmp); + } + + m_options["-G"] = OString(""); + break; + default: + throw IllegalArgument("the option is unknown" + OString(av[i])); + break; + } + } else + { + if (av[i][0] == '@') + { + FILE* cmdFile = fopen(av[i]+1, "r"); + if( cmdFile == NULL ) + { + fprintf(stderr, "%s", prepareHelp().getStr()); + ret = sal_False; + } else + { + int rargc=0; + char* rargv[512]; + char buffer[512]; + + while ( fscanf(cmdFile, "%s", buffer) != EOF ) + { + rargv[rargc]= strdup(buffer); + rargc++; + } + fclose(cmdFile); + + ret = initOptions(rargc, rargv, bCmdFile); + + for (long i=0; i < rargc; i++) + { + free(rargv[i]); + } + } + } else + { + m_inputFiles.push_back(av[i]); + } + } + } + + return ret; +} + +OString CunoOptions::prepareHelp() +{ + OString help("\nusing: "); + help += m_program + " [-options] file_1 ... file_n\nOptions:\n"; + help += " -O<path> = path describes the root directory for the generated output.\n"; + help += " The output directory tree is generated under this directory.\n"; + help += " -T<name> = name specifies a type or a list of types. The output for this\n"; + help += " [t1;...] type is generated. If no '-T' option is specified,\n"; + help += " then output for all types is generated.\n"; + help += " Example: 'com.sun.star.uno.XInterface' is a valid type.\n"; + help += " -B<name> = name specifies the base node. All types are searched under this\n"; + help += " node. Default is the root '/' of the registry files.\n"; + help += " -U = activate the generating of a getCppuType_<name> function.\n"; +// help += " -L = getCppuType function with a known leak.\n"; + help += " -C = getCppuType_<name> function keeps comprehensive type information.\n"; + help += " -G = generate only target files which does not exists.\n"; + help += " -Gc = generate only target files which content will be changed.\n"; + help += prepareVersion(); + + return help; +} + +OString CunoOptions::prepareVersion() +{ + OString version("\nSun Microsystems (R) "); + version += m_program + " Version 1.0\n\n"; + + return version; +} + + diff --git a/codemaker/source/cunomaker/cunooptions.hxx b/codemaker/source/cunomaker/cunooptions.hxx new file mode 100644 index 000000000000..ba47d6bcf1b9 --- /dev/null +++ b/codemaker/source/cunomaker/cunooptions.hxx @@ -0,0 +1,51 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef INCLUDED_CODEMAKER_SOURCE_CUNOMAKER_CUNOOPTIONS_HXX +#define INCLUDED_CODEMAKER_SOURCE_CUNOMAKER_CUNOOPTIONS_HXX + +#include <codemaker/options.hxx> + +class CunoOptions : public Options +{ +public: + CunoOptions() + : Options() {} + + ~CunoOptions() {} + + sal_Bool initOptions(int ac, char* av[], sal_Bool bCmdFile=sal_False) + throw( IllegalArgument ); + + ::rtl::OString prepareHelp(); + + ::rtl::OString prepareVersion(); + +protected: +}; + +#endif // INCLUDED_CODEMAKER_SOURCE_CUNOMAKER_CUNOOPTIONS_HXX diff --git a/codemaker/source/cunomaker/cunotype.cxx b/codemaker/source/cunomaker/cunotype.cxx new file mode 100644 index 000000000000..56e87300eebe --- /dev/null +++ b/codemaker/source/cunomaker/cunotype.cxx @@ -0,0 +1,3533 @@ +/************************************************************************* + * + * 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 "cunotype.hxx" +#include "cunooptions.hxx" + +using namespace rtl; + +//************************************************************************* +// CunoType +//************************************************************************* +CunoType::CunoType(TypeReader& typeReader, + const OString& typeName, + const TypeManager& typeMgr, + const TypeDependency& typeDependencies) + : m_inheritedMemberCount(0) + , m_cunoTypeLib(sal_False) + , m_cunoTypeLeak(sal_False) + , m_cunoTypeDynamic(sal_True) + , m_indentLength(0) + , m_typeName(typeName) +// , m_name(typeName.getToken(typeName.getTokenCount('/') - 1, '/')) + , m_name(typeName.replace('/', '_')) + , m_reader(typeReader) + , m_typeMgr((TypeManager&)typeMgr) + , m_dependencies(typeDependencies) + , m_bIsNestedType(sal_False) +{ + // check if this type is nested + sal_Int32 i = typeName.lastIndexOf('/'); + + if (i >= 0) + { + OString outerTypeName(typeName.copy(0, i)); + m_bIsNestedType = (m_typeMgr.getTypeClass(outerTypeName) == RT_TYPE_INTERFACE); + } + + // check if this type has nested types + RegistryKey key = m_typeMgr.getTypeKey(typeName); + + key.getKeyNames(OUString(), m_nestedTypeNames); +} + +CunoType::~CunoType() +{ + +} + +sal_Bool CunoType::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 CunoType::hasNestedType(const ::rtl::OString& type) +{ + sal_Bool ret = sal_False; + + if (m_nestedTypeNames.getLength() > 0) + { + OUString typeName(OStringToOUString(type, RTL_TEXTENCODING_UTF8)); + + for (sal_uInt32 i = 0; !ret && (i < m_nestedTypeNames.getLength()); i++) + ret = typeName.equals(m_nestedTypeNames.getElement(i).copy(5)); + } + + return ret; +} + +sal_Bool CunoType::dump(CunoOptions* pOptions) + throw( CannotDumpException ) +{ + sal_Bool ret = sal_False; + + if (isNestedType()) + return sal_True; + + if (pOptions->isValid("-U")) + m_cunoTypeLib = sal_True; + if (pOptions->isValid("-L")) + m_cunoTypeLeak = sal_True; + if (pOptions->isValid("-C")) + m_cunoTypeDynamic = sal_False; + + OString outPath; + if (pOptions->isValid("-O")) + outPath = pOptions->getOption("-O"); + + OString tmpFileName; + OString hFileName = createFileNameFromType(outPath, m_typeName, ".h"); + + sal_Bool bFileExists = sal_False; + sal_Bool bFileCheck = sal_False; + + if ( pOptions->isValid("-G") || pOptions->isValid("-Gc") ) + { + bFileExists = fileExists( hFileName ); + ret = sal_True; + } + + if ( bFileExists && pOptions->isValid("-Gc") ) + { + tmpFileName = createFileNameFromType(outPath, m_typeName, ".tmh"); + bFileCheck = sal_True; + } + + if ( !bFileExists || bFileCheck ) + { + FileStream hFile; + + if ( bFileCheck ) + hFile.open(tmpFileName); + else + hFile.open(hFileName); + + if(!hFile.isValid()) + { + OString message("cannot open "); + message += hFileName + " for writing"; + throw CannotDumpException(message); + } + + ret = dumpHFile(hFile); + + hFile.close(); + if (ret && bFileCheck) + { + ret = checkFileContent(hFileName, tmpFileName); + } + } + + if ( m_cunoTypeLib ) + { + bFileExists = sal_False; + bFileCheck = sal_False; + + if (pOptions->isValid("-OC")) + outPath = pOptions->getOption("-OC"); + else + outPath = OString(); + + OString cFileName = createFileNameFromType(outPath, m_typeName, ".c"); + + if ( pOptions->isValid("-G") || pOptions->isValid("-Gc") ) + { + bFileExists = fileExists( cFileName ); + ret = sal_True; + } + + if ( bFileExists && pOptions->isValid("-Gc") ) + { + tmpFileName = createFileNameFromType(outPath, m_typeName, ".tmc"); + bFileCheck = sal_True; + } + + if ( !bFileExists || bFileCheck ) + { + FileStream cFile; + + if ( bFileCheck ) + cFile.open(tmpFileName); + else + cFile.open(cFileName); + + if(!cFile.isValid()) + { + OString message("cannot open "); + message += cFileName + " for writing"; + throw CannotDumpException(message); + } + + ret = dumpCFile(cFile); + + cFile.close(); + if (ret && bFileCheck) + { + ret = checkFileContent(cFileName, tmpFileName); + } + } + } + return ret; +} +sal_Bool CunoType::dumpDependedTypes(CunoOptions* pOptions) + 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 (getBaseType(typeName).getLength() == 0) + { + if (!produceType(typeName, + m_typeMgr, + m_dependencies, + pOptions)) + { + fprintf(stderr, "%s ERROR: %s\n", + pOptions->getProgramName().getStr(), + OString("cannot dump Type '" + typeName + "'").getStr()); + exit(99); + } + } + ++iter; + } + + return ret; +} + +OString CunoType::dumpHeaderDefine(FileStream& o, sal_Char* prefix, sal_Bool bExtended) +{ + if (m_typeName.equals("/")) + { + bExtended = sal_False; + m_typeName = "global"; + } + + sal_uInt32 length = 3 + m_typeName.getLength() + strlen(prefix); + + if (bExtended) + length += m_name.getLength() + 1; + + OStringBuffer tmpBuf(length); + + tmpBuf.append('_'); + tmpBuf.append(m_typeName); + tmpBuf.append('_'); + if (bExtended) + { + tmpBuf.append(m_name); + tmpBuf.append('_'); + } + tmpBuf.append(prefix); + tmpBuf.append('_'); + + OString tmp(tmpBuf.makeStringAndClear().replace('/', '_').toAsciiUpperCase()); + + o << "#ifndef " << tmp << "\n#define " << tmp << "\n"; + + return tmp; +} + +void CunoType::dumpDefaultHIncludes(FileStream& o) +{ + o << "#ifndef _UNO_CUNO_H_\n" + << "#include <uno/cuno.h>\n" + << "#endif\n"; +/* + if (m_typeMgr.getTypeClass(m_typeName) == RT_TYPE_INTERFACE && + !m_typeName.equals("com/sun/star/uno/XInterface") ) + { + o << "#ifndef _COM_SUN_STAR_UNO_XINTERFACE_H_\n" + << "#include <com/sun/star/uno/XInterface.h>\n" + << "#endif\n"; + } +*/ +} + +void CunoType::dumpDefaultCIncludes(FileStream& o) +{ + o << "#ifndef _OSL_MUTEX_H_\n" + << "#include <osl/mutex.h>\n" + << "#endif\n\n"; +} + +void CunoType::dumpInclude(FileStream& o, const OString& typeName, sal_Char* prefix, sal_Bool bExtended, sal_Bool bCaseSensitive) +{ + 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#endif\n"; +} + +void CunoType::dumpDepIncludes(FileStream& o, 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_uInt32 index = 0; + sal_uInt32 seqNum = 0; + OString relType; + while (iter != usingSet.end()) + { + sal_Bool bDumpThisType = sal_True; + 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) && hasNestedType(relType)) + bDumpThisType = sal_False; + + if (bDumpThisType) + { + OString defPrefix("H"); + if (sPrefix.equals("H")) + defPrefix = "H"; + + if (seqNum > 0 && !bSequenceDumped) + { + bSequenceDumped = sal_True; + o << "#ifndef _UNO_SEQUENCE2_" << defPrefix + << "_\n#include <uno/sequence2." << defPrefix.toAsciiLowerCase() + << ">\n#endif\n"; + } + + if (getBaseType(relType).getLength() == 0 && + m_typeName != relType) + { + if (m_typeMgr.getTypeClass(relType) == RT_TYPE_INTERFACE + && sPrefix.equals("H")) + { + if (!((*iter).m_use & TYPEUSE_SUPER)) + { + if (isNestedTypeByName(relType)) + { + sal_Int32 iLastS = relType.lastIndexOf('/'); + + OString outerNamespace(relType.copy(0,iLastS)); + OString innerClass(relType.copy(iLastS+1)); + + iLastS = outerNamespace.lastIndexOf('/'); + OString outerClass(outerNamespace.copy(iLastS+1)); + +// o << "\n"; +// dumpNameSpace(o, sal_True, sal_False, outerNamespace); +// o << "\nclass " << outerClass << "::" << innerClass << ";\n"; +// dumpNameSpace(o, sal_False, sal_False, outerNamespace); +// o << "\n\n"; + } + else + { +// dumpInclude(o, relType, prefix); + OString type(relType.replace('/', '_')); + o << "\n#ifndef " << type.toAsciiUpperCase() << "\n"; + o << "#define " << type.toAsciiUpperCase() << "\n"; + o << "struct _" << type << ";\n" + << "typedef struct _" << type << "_ftab * " << type << ";\n"; + o << "#endif\n\n"; + } + } else + { + if (isNestedTypeByName(relType)) + { + sal_Int32 iLastS = relType.lastIndexOf('/'); + + OString outerNamespace(relType.copy(0,iLastS)); + + dumpInclude(o, outerNamespace, prefix); + } + else + dumpInclude(o, relType, prefix); + } + } else + { + if (isNestedTypeByName(relType)) + { + sal_Int32 iLastS = relType.lastIndexOf('/'); + + OString outerNamespace(relType.copy(0,iLastS)); + + dumpInclude(o, outerNamespace, prefix); + } + else + dumpInclude(o, relType, prefix); + } + } else + if (relType == "any") + { + o << "#ifndef _UNO_ANY2_H_\n" + << "#include <uno/any2.h>\n" + << "#endif\n"; + } else + if (relType == "type") + { + o << "#ifndef _TYPELIB_TYPEDESCRIPTION_H_\n" + << "#include <typelib/typedescription.h>\n" + << "#endif\n"; + } else + if (relType == "string" && sPrefix.equals("H")) + { + o << "#ifndef _RTL_USTRING_H_\n" + << "#include <rtl/ustring.h>\n" + << "#endif\n"; + } + } + ++iter; + } + if (m_typeName.equals(typeName) && (getNestedTypeNames().getLength() > 0)) + { + o << "// includes for nested types\n\n"; + + for (sal_uInt32 i = 0; i < getNestedTypeNames().getLength(); i++) + { + OUString s(getNestedTypeNames().getElement(i)); + + OString nestedName(s.getStr(), s.getLength(), RTL_TEXTENCODING_UTF8); + + dumpDepIncludes(o, nestedName, prefix); + } + } +} + +void CunoType::dumpOpenExternC(FileStream& o) +{ + o << "#ifdef __cplusplus\n" + << "extern \"C\" {\n" + << "#endif\n\n"; +} + +void CunoType::dumpCloseExternC(FileStream& o) +{ + o << "#ifdef __cplusplus\n" + << "}\n" + << "#endif\n\n"; +} + +void CunoType::dumpLGetCunoType(FileStream& o) +{ + OString typeName(m_typeName.replace('/', '_')); + + o << "#if (defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500))\n" + << "static typelib_TypeDescriptionReference * s_pType_" << typeName << " = 0;\n" + << "#endif\n\n"; + + if (m_reader.getTypeClass() == RT_TYPE_TYPEDEF) + { + o << "inline const ::com::sun::star::uno::Type& SAL_CALL get_" << typeName << "_Type( ) SAL_THROW( () )\n{\n"; + } else + { + o << "inline const ::com::sun::star::uno::Type& SAL_CALL getCunoType( "; + dumpType(o, m_typeName, sal_True, sal_False); + o << "* ) SAL_THROW( () )\n{\n"; + } + inc(); + + o << indent() << "#if ! (defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500))\n" + << indent() << "static typelib_TypeDescriptionReference * s_pType_" << typeName << " = 0;\n" + << indent() << "#endif\n\n"; + + o << indent() << "if ( !s_pType_" << typeName << " )\n" << indent() << "{\n"; + inc(); + o << indent() << "typelib_static_type_init( &s_pType_" << typeName << ", " + << getTypeClass(m_typeName, sal_True) << ", \"" << m_typeName.replace('/', '.') << "\" );\n"; + dec(); + o << indent() << "}\n"; + o << indent() << "return * reinterpret_cast< ::com::sun::star::uno::Type * >( &s_pType_" + << typeName <<" );\n"; + dec(); + o << indent() << "}\n"; + + return; +} + +void CunoType::dumpGetCunoType(FileStream& o) +{ + OString typeName(m_typeName.replace('/', '_')); + + if ( m_cunoTypeLeak ) + { + dumpLGetCunoType(o); + return; + } + if ( !m_cunoTypeDynamic ) + { + dumpCGetCunoType(o); + return; + } + + dumpOpenExternC(o); + + if ( !m_typeName.equals("com/sun/star/uno/Exception") ) + { + o << "#if (defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500))\n" + << "static typelib_TypeDescriptionReference * s_pType_" << typeName << " = 0;\n" + << "#endif\n\n"; + } + + o << "typelib_TypeDescriptionReference ** SAL_CALL getCUnoType_" << m_name << "() SAL_THROW_EXTERN_C( () )\n{\n"; + inc(); + + if ( m_typeName.equals("com/sun/star/uno/Exception") ) + { + o << indent() << "return typelib_static_type_getByTypeClass( typelib_TypeClass_EXCEPTION );\n"; + } else + { + o << indent() << "#if ! (defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500))\n" + << indent() << "static typelib_TypeDescriptionReference * s_pType_" << typeName << " = 0;\n" + << indent() << "#endif\n\n"; + + o << indent() << "if ( !s_pType_" << typeName << " )\n" << indent() << "{\n"; + inc(); + + OString superType(m_reader.getSuperTypeName()); + sal_Bool bIsBaseException = sal_False; + if (superType.getLength() > 0) + { + if ( superType.equals("com/sun/star/uno/Exception") ) + { + bIsBaseException = sal_True; + } else + { + o << indent() << "typelib_TypeDescriptionReference * pBaseType = 0;\n"; + } + } + + sal_uInt32 count = getMemberCount(); + if (count) + { + o << indent() << "typelib_TypeDescriptionReference * aMemberRefs[" << count << "];\n"; + } + + if ( !bIsBaseException ) + { + o << indent() << "typelib_typedescriptionreference_newByAsciiName(&pBaseType, typelib_TypeClass_INTERFACE, \"" + << superType.replace('/', '.') << "\" );\n"; + } + + if (count) + { + sal_uInt32 fieldCount = m_reader.getFieldCount(); + RTFieldAccess access = RT_ACCESS_INVALID; + OString fieldType, fieldName; + OString scope = m_typeName.replace('/', '.'); + sal_Bool bWithScope = sal_True; + OString modFieldType; + StringSet generatedTypeSet; + StringSet::iterator findIter; + + for (sal_uInt16 i=0; i < fieldCount; i++) + { + access = m_reader.getFieldAccess(i); + + if (access == RT_ACCESS_CONST || access == RT_ACCESS_INVALID) + continue; + + fieldName = m_reader.getFieldName(i); + fieldType = checkRealBaseType(m_reader.getFieldType(i), sal_True); + +// modFieldType = typeToIdentifier(fieldType); + + findIter = generatedTypeSet.find(fieldType); + if ( findIter == generatedTypeSet.end() ) + { + generatedTypeSet.insert(fieldType); + o << indent() << "typelib_typedescriptionreference_newByAsciiName(&aMemberRefs[" + << i << "], " << getTypeClass(fieldType, sal_True); + o << " , \"" << fieldType.replace('/', '.') << "\" );\n"; + } + } + o << "\n"; + } + + o << indent() << "typelib_static_compound_type_init( &s_pType_" << typeName << ", " + << getTypeClass(m_typeName, sal_True) << ", \"" << m_typeName.replace('/', '.') << "\", "; + if ( superType.getLength() > 0 || bIsBaseException ) + { + if ( bIsBaseException ) + { + o << "* typelib_static_type_getByTypeClass( typelib_TypeClass_EXCEPTION ), " + << count << ", "; + } else + { + o << "pBaseType, " << count << ", "; + } + } else + { + o << "0, " << count << ", "; + } + + if (count) + { + o << " aMemberRefs );\n"; + } else + { + o << " 0 );\n"; + } + dec(); + o << indent() << "}\n" + << indent() << "typelib_typedescriptionreference_acquire( s_pType_" << typeName << " );\n" + << indent() << "return &_pType_" << typeName <<" );\n"; + } + dec(); + o << indent() << "}\n"; + + dumpCloseExternC(o); +} + +void CunoType::dumpCGetCunoType(FileStream& o) +{ + OString typeName(m_typeName.replace('/', '_')); + + dumpOpenExternC(o); + + o << "#if (defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500))\n" + << "static typelib_TypeDescriptionReference * s_pType_" << typeName << " = 0;\n" + << "#endif\n\n"; + + o << "typelib_TypeDescriptionReference ** SAL_CALL getCUnoType_" << m_name << "() SAL_THROW_EXTERN_C( () )\n{\n"; + inc(); + + o << "#if ! (defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500))\n" + << indent() << "static typelib_TypeDescriptionReference * s_pType_" << typeName << " = 0;\n" + << "#endif\n\n"; + + o << indent() << "if ( !s_pType_" << typeName << " )\n" << indent() << "{\n"; + inc(); + o << indent() << "oslMutex * pMutex = osl_getGlobalMutex();\n" + << indent() << "osl_acquireMutex( pMutex );\n"; + + o << indent() << "if ( !s_pType_" << typeName << " )\n" << indent() << "{\n"; + inc(); + o << indent() << "rtl_uString * pTypeName = 0;\n" + << indent() << "typelib_TypeDescription * pTD = 0;\n"; + + OString superType(m_reader.getSuperTypeName()); + if (superType.getLength() > 0) + o << indent() << "typelib_TypeDescriptionReference * pSuperType = 0;\n"; + + sal_uInt32 count = getMemberCount(); + sal_uInt32 fieldCount = m_reader.getFieldCount(); + RTFieldAccess access = RT_ACCESS_INVALID; + if (count) + { + o << indent() << "typelib_CompoundMember_Init aMembers[" + << count << "];\n"; + + for (sal_uInt16 i=0; i < fieldCount; i++) + { + access = m_reader.getFieldAccess(i); + + if (access == RT_ACCESS_CONST || access == RT_ACCESS_INVALID) + continue; + + o << indent() << "rtl_uString * pMemberName" << i << " = 0;\n" + << indent() << "rtl_uString * pMemberType" << i << " = 0;\n"; + } + } + + o << indent() << "rtl_uString_newFromAscii( &pTypeName, \"" << m_typeName.replace('/', '.') << "\" );\n"; + + if (superType.getLength() > 0) + { + o << indent() << "typelib_typedescriptionreference_newByAsciiName(&pSuperType, typelib_TypeClass_INTERFACE, \"" + << superType.replace('/', '.') << "\" );\n"; + } + + dumpCppuGetTypeMemberDecl(o, CUNOTYPEDECL_ALLTYPES); + + if (count) + { + OString fieldType, fieldName; + OString scope = m_typeName.replace('/', '.'); + + for (sal_uInt16 i=0; i < fieldCount; i++) + { + access = m_reader.getFieldAccess(i); + + if (access == RT_ACCESS_CONST || access == RT_ACCESS_INVALID) + continue; + + fieldName = m_reader.getFieldName(i); + fieldType = checkRealBaseType(m_reader.getFieldType(i), sal_True); + + o << indent() << "rtl_uString_newFromAscii( &pMemberType" << i << ", \"" + << fieldType.replace('/', '.') << "\") );\n"; + o << indent() << "rtl_uString_newFromAscii( &pMemberName" << i << ", \""; + o << fieldName << "\") );\n"; + o << indent() << "aMembers[" << i << "].eTypeClass = " + << getTypeClass(fieldType, sal_True) << ";\n" + << indent() << "aMembers[" << i << "].pTypeName = pMemberType" << i << ";\n" + << indent() << "aMembers[" << i << "].pMemberName = pMemberName" << i << ";\n"; + } + + o << "\n" << indent() << "typelib_typedescription_new(\n"; + inc(); + o << indent() << "&pTD,\n" << indent() + << getTypeClass(OString(), sal_True) << ", pTypeName,\n"; + + if (superType.getLength() > 0) + o << indent() << "pSuperType,\n"; + else + o << indent() << "0,\n"; + + if ( count ) + { + o << indent() << count << ",\n" << indent() << "aMembers );\n\n"; + } else + { + o << indent() << count << ",\n" << indent() << "0 );\n\n"; + } + + dec(); + o << indent() << "typelib_typedescription_register( &pTD );\n\n"; + + o << indent() << "typelib_typedescriptionreference_new( &s_pType_ " << typeName + << getTypeClass(OString(), sal_True) << ", pTD);\n\n"; + + o << indent() << "typelib_typedescription_release( pTD );\n" + << indent() << "typelib_typedescriptionreference_release( pSuperType );\n" + << indent() << "rtl_uString_release( pTypeName );\n"; + + for (i=0; i < fieldCount; i++) + { + access = m_reader.getFieldAccess(i); + + if (access == RT_ACCESS_CONST || access == RT_ACCESS_INVALID) + continue; + + o << indent() << "rtl_uString_release( pMemberName" << i << " );\n" + << indent() << "rtl_uString_release( pMemberType" << i << " );\n"; + } + } + + dec(); + o << indent() << "}\n"; + o << indent() << "osl_releaseMutex( pMutex );\n"; + dec(); + o << indent() << "}\n" + << indent() << "typelib_typedescriptionreference_acquire( s_pType_" << typeName << " );\n" + << indent() << "return &s_pType_" << typeName <<" );\n"; + dec(); + o << "}\n"; + + dumpCloseExternC(o); +} + +void CunoType::dumpCppuGetTypeMemberDecl(FileStream& o, CunoTypeDecl eDeclFlag) +{ + sal_uInt32 fieldCount = m_reader.getFieldCount(); + RTFieldAccess access = RT_ACCESS_INVALID; + + if ( fieldCount ) + { + o << indent() << "{\n" << indent() << "typelib_TypeDescriptionReference ** ppTypeRef = 0;\n"; + + StringSet aFinishedTypes; + for (sal_uInt16 i=0; i < fieldCount; i++) + { + access = m_reader.getFieldAccess(i); + + if (access == RT_ACCESS_CONST || access == RT_ACCESS_INVALID) + continue; + + if (aFinishedTypes.count(m_reader.getFieldType(i)) == 0) + { + aFinishedTypes.insert(m_reader.getFieldType(i)); + dumpCppuGetType(o, m_reader.getFieldType(i), sal_True, eDeclFlag); + } + } + o << indent() << "}\n"; + } +} + +sal_uInt32 CunoType::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 CunoType::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 CunoType::getInheritedMemberCount() +{ + if (m_inheritedMemberCount == 0) + { + m_inheritedMemberCount = checkInheritedMemberCount(0); + } + + return m_inheritedMemberCount; +} + +void CunoType::dumpInheritedMembers(FileStream& o, rtl::OString& superType) +{ + TypeReader aSuperReader(m_typeMgr.getTypeReader(superType)); + + OString baseType(aSuperReader.getSuperTypeName()); + if (baseType.getLength() > 0) + { + dumpInheritedMembers(o, baseType); + } + + 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) + { + fieldName = aSuperReader.getFieldName(i); + fieldType = aSuperReader.getFieldType(i); + + o << indent(); + dumpType(o, fieldType); + o << " " << fieldName << ";\n"; + } + } +} + +OString CunoType::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"; +} + +void CunoType::dumpType(FileStream& o, const OString& type, + sal_Bool bConst, sal_Bool bPointer, sal_Bool bParam) + throw( CannotDumpException ) +{ + 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) o << "const "; + + if ( seqNum ) + { + o << "/*"; + sal_uInt32 i; + for (i=0; i < seqNum; i++) + { + o << "sequence< "; + } + o << relType.replace( '/', '.'); + for (i=0; i < seqNum; i++) + { + o << " >"; + } + o << "*/ uno_Sequence *"; + if (bPointer) o << "*"; + return; + } + switch (typeClass) + { + case RT_TYPE_INTERFACE: + o << relType.replace('/', '_') << " *"; + break; + case RT_TYPE_INVALID: + { + OString tmp(getBaseType(relType)); + if (tmp.getLength() > 0) + { + o << tmp.getStr(); + if ( bParam && !bPointer && relType.equals("any") ) + o << " *"; + } else + throw CannotDumpException("Unknown type '" + relType + "', incomplete type library."); + } + break; + case RT_TYPE_STRUCT: + case RT_TYPE_EXCEPTION: + o << relType.replace('/', '_'); + if ( bParam && !bPointer ) o << " *"; + break; + case RT_TYPE_ENUM: + case RT_TYPE_TYPEDEF: + o << relType.replace('/', '_'); + break; + } + + if (bPointer) o << "*"; +} + +OString CunoType::getBaseType(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_uString *"; + 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 "uno_Any"; + if (type.equals("type")) + return "typelib_TypeDescriptionReference *"; + 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(); +} + +void CunoType::dumpCppuGetType(FileStream& o, const OString& type, sal_Bool bDecl, CunoTypeDecl eDeclFlag) +{ + OString sType( checkRealBaseType(type, sal_True) ); + sal_uInt32 index = sType.lastIndexOf(']'); + OString relType = (index > 0 ? (sType).copy(index+1) : type); + + if (eDeclFlag == CUNOTYPEDECL_ONLYINTERFACES) + { + if (m_typeMgr.getTypeClass(relType) == RT_TYPE_INTERFACE) + { + if (bDecl) + o << indent() << "ppTypeRef = "; + else + o << indent(); + + o << "getCUnoType_" << type.replace('/', '_') << "()"; + + if (bDecl) + o << ";\n" << indent() << "typelib_typedescriptionreference_release( *ppTypeRef );\n"; + } + } else + { + if (isBaseType(type)) + { + return; + } else + { + if (eDeclFlag == CUNOTYPEDECL_NOINTERFACES && + m_typeMgr.getTypeClass(relType) == RT_TYPE_INTERFACE) + return; + + if ( type.equals("type") ) + return; + + if (bDecl) + o << indent() << "ppTypeRef = "; + else + o << indent(); + + o << indent() << "getCUnoType_" << type.replace('/', '_') << "()"; + } + if (bDecl) + o << ";\n" << indent() << "typelib_typedescriptionreference_release( *ppTypeRef );\n"; + } +} + +void CunoType::dumpTypeInit(FileStream& o, const OString& typeName) +{ + OString type(checkSpecialCunoType(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 << "(("; + dumpType(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 i = type.lastIndexOf('/'); + o << "(" << shortScopedName("", type, sal_False) + << "::" << type.copy( i != -1 ? i+1 :0 ) + << "_" << reader.getFieldName(0) << ")"; + return; + } + } + } + + o << "()"; +} + +BASETYPE CunoType::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 CunoType::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 CunoType::checkSpecialCunoType(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; +} + +sal_Bool CunoType::isSeqType(const OString& type, OString& baseType, OString& seqPrefix) +{ + if ( type.getStr()[0] == '[' ) + { + sal_uInt32 index = type.lastIndexOf(']'); + baseType = ((OString)type).copy(index+1); + seqPrefix = ((OString)type).copy(0, index+1); + return sal_True; + } else + { + baseType = type; + seqPrefix = OString(); + } + return sal_False; +} + +sal_Bool CunoType::isArrayType(const OString& type, OString& baseType, OString& arrayPrefix) +{ + if ( type.getStr()[type.getLength()-1] == ']' ) + { + sal_uInt32 index = type.indexOf('['); + baseType = ((OString)type).copy(0, index-1); + arrayPrefix = ((OString)type).copy(index); + return sal_True; + } else + { + baseType = type; + arrayPrefix = OString(); + } + return sal_False; +} + +OString CunoType::checkRealBaseType(const OString& type, sal_Bool bResolveTypeOnly) +{ + OString realType; + OString baseType; + OString completePrefix; + OString prefix; + sal_Bool bSeqType = sal_True; + + if ( !isSeqType(type, baseType, completePrefix) ) + isArrayType(type, baseType, completePrefix); + + 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) + { + realType = reader.getSuperTypeName(); + if ( isSeqType(realType, baseType, prefix) || + isArrayType(realType, baseType, prefix) ) + { + completePrefix += prefix; + } + } else + mustBeChecked = sal_False; + } else + { + break; + } + } + + if ( bResolveTypeOnly ) + { + if ( completePrefix.getLength() > 0 ) + { + baseType = bSeqType ? (completePrefix + baseType) : ( baseType + completePrefix); + } + } + return baseType; +} + +void CunoType::dumpConstantValue(FileStream& o, sal_uInt16 index) +{ + RTConstValue constValue = m_reader.getFieldConstValue(index); + + switch (constValue.m_type) + { + case RT_TYPE_BOOL: + if (constValue.m_value.aBool) + o << "sal_True"; + else + o << "sal_False"; + break; + case RT_TYPE_BYTE: + { + char tmp[16]; + snprintf(tmp, sizeof(tmp), "0x%x", (sal_Int8)constValue.m_value.aByte); + o << "(sal_Int8)" << tmp; + } + break; + case RT_TYPE_INT16: + o << "(sal_Int16)" << constValue.m_value.aShort; + break; + case RT_TYPE_UINT16: + o << "(sal_uInt16)" << constValue.m_value.aUShort; + break; + case RT_TYPE_INT32: + o << "(sal_Int32)" << constValue.m_value.aLong; + break; + case RT_TYPE_UINT32: + o << "(sal_uInt32)" << constValue.m_value.aULong; + break; + case RT_TYPE_INT64: + { + ::rtl::OString tmp( OString::valueOf(constValue.m_value.aHyper) ); + o << "(sal_Int64)" << tmp.getStr() << "L"; + } + break; + case RT_TYPE_UINT64: + { + ::rtl::OString tmp( OString::valueOf((sal_Int64)constValue.m_value.aUHyper) ); + o << "(sal_uInt64)" << tmp.getStr() << "L"; + } + break; + case RT_TYPE_FLOAT: + { + ::rtl::OString tmp( OString::valueOf(constValue.m_value.aFloat) ); + o << "(float)" << tmp.getStr(); + } + break; + case RT_TYPE_DOUBLE: + { + ::rtl::OString tmp( OString::valueOf(constValue.m_value.aDouble) ); + o << "(double)" << tmp.getStr(); + } + break; + case RT_TYPE_STRING: + { + ::rtl::OUString aUStr(constValue.m_value.aString); + ::rtl::OString aStr = ::rtl::OUStringToOString(aUStr, RTL_TEXTENCODING_ASCII_US); + o << "::rtl::OUString::createFromAscii(\"" << aStr.getStr() << "\")"; + } + break; + } +} + +void CunoType::inc(sal_uInt32 num) +{ + m_indentLength += num; +} + +void CunoType::dec(sal_uInt32 num) +{ + if (m_indentLength - num < 0) + m_indentLength = 0; + else + m_indentLength -= num; +} + +OString CunoType::indent() +{ + OStringBuffer tmp(m_indentLength); + + for (sal_uInt32 i=0; i < m_indentLength; i++) + { + tmp.append(' '); + } + return tmp.makeStringAndClear(); +} + +OString CunoType::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) + : CunoType(typeReader, typeName, typeMgr, typeDependencies) +{ + m_inheritedMemberCount = 0; + m_hasAttributes = sal_False; + m_hasMethods = sal_False; +} + +InterfaceType::~InterfaceType() +{ + +} + +sal_Bool InterfaceType::dumpHFile(FileStream& o) + throw( CannotDumpException ) +{ + OString headerDefine(dumpHeaderDefine(o, "H")); + o << "\n"; + + dumpDefaultHIncludes(o); + o << "\n"; + dumpDepIncludes(o, m_typeName, "h"); + o << "\n"; + dumpOpenExternC(o); + + o << "#ifndef " << m_name.toAsciiUpperCase() << "\n"; + o << "#define " << m_name.toAsciiUpperCase() << "\n"; + o << "struct _" << m_name << "_ftab;\n" + << "typedef struct _" << m_name << "_ftab * " << m_name << ";\n"; + o << "#endif\n\n"; + + dumpDeclaration(o); + + if ( m_cunoTypeLib ) + { + o << "#ifdef CUNO_TYPELIB\n" + << "typelib_TypeDescriptionReference * SAL_CALL getCUnoType_" << m_name << "() SAL_THROW( () );\n" + << "#endif\n\n"; + } + +/* + if (getNestedTypeNames().getLength() > 0) + { + o << indent() << "// nested types\n\n"; + for (sal_uInt32 i = 0; i < getNestedTypeNames().getLength(); i++) + { + OUString s(getNestedTypeNames().getElement(i)); + + OString nestedName(s.getStr(), s.getLength(), RTL_TEXTENCODING_UTF8); + + nestedName = checkRealBaseType(nestedName.copy(5)); + + if (nestedName.lastIndexOf(']') < 0) + { + o << "inline const ::com::sun::star::uno::Type& SAL_CALL getCunoType( "; + dumpType(o, nestedName, sal_True, sal_False); + o << "* ) SAL_THROW( () );\n\n"; + } + } + } +*/ + dumpCloseExternC(o); + + o << "#endif /* "<< headerDefine << " */\n"; + return sal_True; +} + +void InterfaceType::dumpInheritedFunctions(FileStream& o, rtl::OString& superType) +{ + TypeReader aSuperReader(m_typeMgr.getTypeReader(superType)); + + OString baseType(aSuperReader.getSuperTypeName()); + if (baseType.getLength() > 0) + { + dumpInheritedFunctions(o, baseType); + } + + dumpAttributes(o, superType.replace('/', '_'), aSuperReader); + dumpMethods(o, superType.replace('/', '_'), aSuperReader); +} + +sal_Bool InterfaceType::dumpDeclaration(FileStream& o) + throw( CannotDumpException ) +{ + o << "typedef struct _" << m_name << "_ftab\n" << indent() << "{"; + inc(); + + OString superType(m_reader.getSuperTypeName()); + if (superType.getLength() > 0) + dumpInheritedFunctions(o, superType); +/* + if (getNestedTypeNames().getLength() > 0) + { + inc(); + o << indent() << "// nested types\n\n"; + for (sal_uInt32 i = 0; i < getNestedTypeNames().getLength(); i++) + { + OUString s(getNestedTypeNames().getElement(i)); + + OString nestedName(s.getStr(), s.getLength(), RTL_TEXTENCODING_UTF8); + + nestedName = nestedName.copy(5); + + o << indent() << "// " << nestedName.getStr() << "\n"; + + TypeReader reader(m_typeMgr.getTypeReader(nestedName)); + + if (reader.isValid()) + { + RTTypeClass typeClass = reader.getTypeClass(); + switch (typeClass) { + case RT_TYPE_INTERFACE: + { + InterfaceType iType(reader, nestedName, m_typeMgr, m_dependencies); + iType.dumpDeclaration(o); + } + break; + case RT_TYPE_STRUCT: + { + StructureType sType(reader, nestedName, m_typeMgr, m_dependencies); + sType.dumpDeclaration(o); + } + break; + case RT_TYPE_ENUM: + { + EnumType enType(reader, nestedName, m_typeMgr, m_dependencies); + enType.dumpDeclaration(o); + } + break; + case RT_TYPE_EXCEPTION: + { + ExceptionType eType(reader, nestedName, m_typeMgr, m_dependencies); + eType.dumpDeclaration(o); + } + break; + case RT_TYPE_TYPEDEF: + { + TypeDefType tdType(reader, nestedName, m_typeMgr, m_dependencies); + tdType.dumpDeclaration(o); + } + break; + default: + break; + } + } + } + dec(); + } +*/ + dumpAttributes(o, m_name, m_reader); + dumpMethods(o, m_name, m_reader); + + dec(); + o << "} " << m_name << "_ftab;\n\n"; + + return sal_True; +} + +sal_Bool InterfaceType::dumpCFile(FileStream& o) + throw( CannotDumpException ) +{ + dumpInclude(o, m_typeName, "h"); + o << "\n"; + dumpDefaultCIncludes(o); + o << "\n"; + dumpDepIncludes(o, m_typeName, "h"); + o << "\n"; + dumpGetCunoType(o); +/* + if (getNestedTypeNames().getLength() > 0) + { + o << indent() << "// nested types\n\n"; + for (sal_uInt32 i = 0; i < getNestedTypeNames().getLength(); i++) + { + OUString s(getNestedTypeNames().getElement(i)); + + OString nestedName(s.getStr(), s.getLength(), RTL_TEXTENCODING_UTF8); + + nestedName = nestedName.copy(5); + + o << indent() << "// " << nestedName.getStr() << "\n"; + + TypeReader reader(m_typeMgr.getTypeReader(nestedName)); + + if (reader.isValid()) + { + RTTypeClass typeClass = reader.getTypeClass(); + switch (typeClass) { + case RT_TYPE_INTERFACE: + { + InterfaceType iType(reader, nestedName, m_typeMgr, m_dependencies); + iType.dumpGetCunoType(o); + } + break; + case RT_TYPE_STRUCT: + { + StructureType sType(reader, nestedName, m_typeMgr, m_dependencies); + sType.dumpGetCunoType(o); + } + break; + case RT_TYPE_ENUM: + { + EnumType enType(reader, nestedName, m_typeMgr, m_dependencies); + enType.dumpGetCunoType(o); + } + break; + case RT_TYPE_EXCEPTION: + { + ExceptionType eType(reader, nestedName, m_typeMgr, m_dependencies); + eType.dumpGetCunoType(o); + } + break; + case RT_TYPE_TYPEDEF: + { + TypeDefType tdType(reader, nestedName, m_typeMgr, m_dependencies); + tdType.dumpGetCunoType(o); + } + break; + default: + break; + } + } + } + } +*/ + return sal_True; +} + +void InterfaceType::dumpAttributes(FileStream& o, const OString& interfaceType, TypeReader& reader ) +{ + sal_uInt32 fieldCount = reader.getFieldCount(); + sal_Bool first=sal_True; + + RTFieldAccess access = RT_ACCESS_INVALID; + OString fieldName; + OString fieldType; + for (sal_uInt16 i=0; i < fieldCount; i++) + { + access = reader.getFieldAccess(i); + + if (access == RT_ACCESS_CONST || access == RT_ACCESS_INVALID) + continue; + + fieldName = reader.getFieldName(i); + fieldType = reader.getFieldType(i); + + if (first) + { + first = sal_False; + o << "\n" << indent() << "/* Attributes of " << interfaceType << " */\n"; + } + + o << indent() << "cuno_ErrorCode (SAL_CALL *get" << fieldName << ")( " + << interfaceType << " *, uno_Any *, "; + dumpType(o, fieldType, sal_False, sal_True); + o << " );\n"; + + if (access != RT_ACCESS_READONLY) + { + OString relType = checkSpecialCunoType(fieldType); + sal_Bool bParam = sal_False; + + if ( m_typeMgr.getTypeClass(relType) == RT_TYPE_STRUCT || + m_typeMgr.getTypeClass(relType) == RT_TYPE_EXCEPTION || + (isBaseType(relType) && relType.equals("any"))) + { + bParam = sal_True; + } else + { + bParam = sal_False; + } + + o << indent() << "cuno_ErrorCode (SAL_CALL *set" << fieldName << ")( " + << interfaceType << " *, uno_Any *, "; + dumpType(o, fieldType, sal_False, sal_False, bParam); + o << " );\n"; + } + } +} + +void InterfaceType::dumpMethods(FileStream& o, const OString& interfaceType, TypeReader& reader ) +{ + sal_uInt32 methodCount = 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 bPointer = sal_False; + sal_Bool bParam = sal_False; + sal_Bool bWithRunTimeExcp = sal_True; + + for (sal_uInt16 i=0; i < methodCount; i++) + { + methodName = reader.getMethodName(i); + returnType = reader.getMethodReturnType(i); + paramCount = reader.getMethodParamCount(i); + excCount = reader.getMethodExcCount(i); + methodMode = reader.getMethodMode(i); + + if ( methodName.equals("queryInterface") ) + { + first = sal_False; + o << "\n" << indent() << "/* Methods of " << interfaceType << " */\n"; + o << indent() << "cuno_ErrorCode (SAL_CALL *queryInterface)( com_sun_star_uno_XInterface *, " + << "uno_Any *, com_sun_star_uno_XInterface **, typelib_TypeDescriptionReference * );\n"; + continue; + } + + if ( methodName.equals("acquire") || methodName.equals("release") ) + { + bWithRunTimeExcp = sal_False; + } + + if (first) + { + first = sal_False; + o << "\n" << indent() << "/* Methods of " << interfaceType << " */\n"; + } + + o << indent() << "cuno_ErrorCode (SAL_CALL *" << methodName << ")( " + << interfaceType << " *"; + if ( excCount || bWithRunTimeExcp ) + { + o << ", uno_Any *"; + } + if ( !isVoid(returnType) ) + { + o << ", "; + dumpType(o, returnType, sal_False, sal_True); + } + + sal_uInt16 j; + for (j=0; j < paramCount; j++) + { + paramName = reader.getMethodParamName(i, j); + paramType = reader.getMethodParamType(i, j); + paramMode = reader.getMethodParamMode(i, j); + + if (j < (sal_uInt16)paramCount) o << ", "; + + switch (paramMode) + { + case RT_PARAM_IN: + { + OString relType = checkSpecialCunoType(paramType); + if (m_typeMgr.getTypeClass(relType) == RT_TYPE_STRUCT || + m_typeMgr.getTypeClass(relType) == RT_TYPE_EXCEPTION || + (isBaseType(relType) && relType.equals("any"))) + { + bParam = sal_True; + } else + { + bParam = sal_False; + } + break; + } + case RT_PARAM_OUT: + case RT_PARAM_INOUT: + bPointer = sal_True; + break; + } + + dumpType(o, paramType, sal_False, bPointer, bParam); + } + o << " );\n"; + } +} + +void InterfaceType::dumpGetCunoType(FileStream& o) +{ + OString typeName(m_typeName.replace('/', '_')); + + if ( m_cunoTypeLeak ) + { + dumpLGetCunoType(o); + return; + } + if ( !m_cunoTypeDynamic ) + { + dumpCGetCunoType(o); + return; + } + + dumpOpenExternC(o); + + if ( !m_typeName.equals("com/sun/star/uno/XInterface") ) + { + o << "#if (defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500))\n" + << "static typelib_TypeDescriptionReference * s_pType_" << typeName << " = 0;\n" + << "#endif\n\n"; + } + + o << "typelib_TypeDescriptionReference ** SAL_CALL getCUnoType_" << m_name << "() SAL_THROW_EXTERN_C( () )\n{\n"; + inc(); + + if ( m_typeName.equals("com/sun/star/uno/XInterface") ) + { + o << indent() << "return typelib_static_type_getByTypeClass( typelib_TypeClass_INTERFACE );\n"; + } else + { + o << indent() << "#if ! (defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500))\n" + << indent() << "static typelib_TypeDescriptionReference * s_pType_" << typeName << " = 0;\n" + << indent() << "#endif\n\n"; + + o << indent() << "if ( !s_pType_" << typeName << " )\n" << indent() << "{\n"; + inc(); + OString superType(m_reader.getSuperTypeName()); + sal_Bool bWithBase = sal_False; + if (superType.getLength() > 0 && !superType.equals("com/sun/star/uno/XInterface")) + { + bWithBase = sal_True; + o << indent() << "typelib_TypeDescriptionReference * pSuperType = 0;\n" + << indent() << "typelib_typedescriptionreference_newByAsciiName(&pSuperType, typelib_TypeClass_INTERFACE, \"" + << superType.replace('/', '.') << "\" );\n"; + } + + o << indent() << "typelib_static_interface_type_init( &s_pType_" << typeName + << ", \"" << m_typeName.replace('/', '.') << "\", "; + + if ( bWithBase ) + { + o << "pSuperType );\n"; + } else + { + o << "0 );\n"; + } + + dec(); + o << indent() << "}\n" + << indent() << "typelib_typedescriptionreference_acquire( s_pType_" << typeName << " );\n" + << indent() << "return &s_pType_" << typeName <<" );\n"; + } + dec(); + o << indent() << "}\n"; + + dumpCloseExternC(o); +} + +void InterfaceType::dumpCGetCunoType(FileStream& o) +{ + OString typeName(m_typeName.replace('/', '_')); + + dumpOpenExternC(o); + + o << "#if (defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500))\n" + << "static typelib_TypeDescriptionReference * s_pType_" << typeName << " = 0;\n" + << "#endif\n\n"; + + o << "typelib_TypeDescriptionReference ** SAL_CALL getCUnoType_" << m_name << "() SAL_THROW_EXTERN_C( () )\n{\n"; + inc(); + + o << "#if ! (defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500))\n" + << indent() << "static typelib_TypeDescriptionReference * s_pType_" << typeName << " = 0;\n" + << "#endif\n\n"; + + o << indent() << "if ( !s_pType_" << typeName << " )\n" << indent() << "{\n"; + inc(); + o << indent() << "oslMutex * pMutex = osl_getGlobalMutex();\n" + << indent() << "osl_acquireMutex( pMutex );\n"; + + o << indent() << "if ( !s_pType_" << typeName << " )\n" << indent() << "{\n"; + inc(); + o << indent() << "rtl_uString * pTypeName = 0;\n" + << indent() << "typelib_InterfaceTypeDescription * pTD = 0;\n"; + + OString superType(m_reader.getSuperTypeName()); + sal_uInt32 count = getMemberCount(); + + if (superType.getLength() > 0) + o << indent() << "typelib_TypeDescriptionReference * pSuperType = 0;\n"; + + if (count) + { + o << indent() << "typelib_TypeDescriptionReference * pMembers[" << count << "] = { "; + for (sal_uInt32 i = 0; i < count; i++) + { + o << "0"; + if (i+1 < count) + o << ","; + else + o << " };\n"; + } + + dumpCUnoAttributeTypeNames(o); + dumpCUnoMethodTypeNames(o); + } + + o << indent() << "rtl_uString_newFromAscii( &pTypeName, \"" << m_typeName.replace('/', '.') << "\" );\n"; + + if (superType.getLength() > 0) + { + o << indent() << "typelib_typedescriptionreference_newByAsciiName(&pSuperType, typelib_TypeClass_INTERFACE, \"" + << superType.replace('/', '.') << "\" );\n"; + } + + if (count) + { + sal_uInt32 index = 0; + dumpCUnoAttributeRefs(o, index); + dumpCUnoMethodRefs(o, index); + } + + o << "\n" << indent() << "typelib_typedescription_newInterface(\n"; + inc(); + o << indent() << "&pTD,\n" + << indent() << "pTypeName, "; + + RTUik uik; + m_reader.getUik(uik); + sal_Char buffer[53]; + snprintf(buffer, sizeof(buffer), "0x%.8x, 0x%.4x, 0x%.4x, 0x%.8x, 0x%.8x,\n", + uik.m_Data1, uik.m_Data2, uik.m_Data3, uik.m_Data4, uik.m_Data5); + o << buffer; + + if (superType.getLength() > 0) + o << indent() << "pSuperType,\n"; + else + o << indent() << "0,\n"; + + if ( count ) + { + o << indent() << count << ",\n" << indent() << "pMembers );\n\n"; + } else + { + o << indent() << count << ",\n" << indent() << "0 );\n\n"; + } + dec(); + + o << indent() << "typelib_typedescription_register( (typelib_TypeDescription**)&pTD );\n"; + if ( count ) + { + for (sal_uInt16 i=0; i < count; i++) + { + o << indent() << "typelib_typedescriptionreference_release( pMembers[" + << i << "] );\n"; + } + } + o << indent() << "typelib_typedescription_release( (typelib_TypeDescription*)pTD );\n"; + + if (superType.getLength() > 0) + o << indent() << "typelib_typedescription_release( pSuperType );\n\n"; + else + o << "\n"; + + o << indent() << "typelib_typedescriptionreference_new( &s_pType_ " << typeName + << "typelib_TypeClass_INTERFACE, (typelib_TypeDescription*)pTD);\n\n"; + + o << indent() << "typelib_TypeDescriptionReference ** ppTypeRef = 0;\n"; + StringSet aTypes; + // type for RuntimeException is always needed + OString sRunTimeExceptionType("com/sun/star/uno/RuntimeException"); + aTypes.insert(sRunTimeExceptionType); + dumpCppuGetType(o, sRunTimeExceptionType, sal_True, CUNOTYPEDECL_ALLTYPES); + + dumpAttributesCppuDecl(o, &aTypes, CUNOTYPEDECL_ALLTYPES); + dumpMethodsCppuDecl(o, &aTypes, CUNOTYPEDECL_ALLTYPES); + + if (count) + { + sal_uInt32 index = getInheritedMemberCount(); + dumpCUnoAttributes(o, index); + dumpCUnoMethods(o, index); + } + + // release strings for names + dumpCUnoAttributeTypeNames(o, sal_True); + dumpCUnoMethodTypeNames(o, sal_True); + + dec(); + o << indent() << "}\n"; + o << indent() << "osl_releaseMutex( pMutex );\n"; + dec(); + o << indent() << "}\n\n" + << indent() << "typelib_typedescriptionreference_acquire( s_pType_" << typeName << " );\n" + << indent() << "return &s_pType_" << typeName << ";\n"; + + dec(); + o << "}\n"; + + dumpCloseExternC(o); +} + +void InterfaceType::dumpCUnoAttributeTypeNames(FileStream&o, sal_Bool bRelease) +{ + 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) + continue; + if ( bRelease ) + { + o << indent() << "rtl_uString_release( pAttributeName" << i << " );\n"; + } else + { + o << indent() << "rtl_uString * pAttributeName" << i << " = 0;\n"; + } + } +} + +void InterfaceType::dumpCUnoMethodTypeNames(FileStream&o, sal_Bool bRelease) +{ + sal_uInt32 methodCount = m_reader.getMethodCount(); + + for (sal_uInt16 i = 0; i < methodCount; i++) + { + if ( bRelease ) + { + o << indent() << "rtl_uString_release( pMethodName" << i << " );\n"; + } else + { + o << indent() << "rtl_uString * pMethodName" << i << " = 0;\n"; + } + } +} + +void InterfaceType::dumpCUnoAttributeRefs(FileStream& o, sal_uInt32& index) +{ + sal_uInt32 fieldCount = m_reader.getFieldCount(); + RTFieldAccess access = RT_ACCESS_INVALID; + OString fieldName; + OString scope = m_typeName.replace('/', '.'); + + for (sal_uInt16 i=0; i < fieldCount; i++) + { + access = m_reader.getFieldAccess(i); + if (access == RT_ACCESS_CONST || access == RT_ACCESS_INVALID) + continue; + fieldName = m_reader.getFieldName(i); + + o << indent() << "rtl_uString_newFromAscii( &pAttributeName" << i << ", \"" + << scope << "::" << fieldName << "\" );\n"; + o << indent() << "typelib_typedescriptionreference_new( &pMembers[" + << index << "],\n"; + inc(38); + o << indent() << "typelib_TypeClass_INTERFACE_ATTRIBUTE,\n" + << indent() << "pAttributeName" << i << " );\n"; + dec(38); + index++; + } +} + +void InterfaceType::dumpCUnoMethodRefs(FileStream& o, sal_uInt32& index) +{ + sal_uInt32 methodCount = m_reader.getMethodCount(); + OString methodName; //, returnType, paramType, paramName; + OString scope = m_typeName.replace('/', '.'); + + for (sal_uInt16 i = 0; i < methodCount; i++) + { + methodName = m_reader.getMethodName(i); + + o << indent() << "rtl_uString_newFromAscii( &pMethodName" << i << ", \"" + << scope.replace('/', '.') << "::" << methodName << "\" );\n"; + o << indent() << "typelib_typedescriptionreference_new( &pMembers[" + << index << "],\n"; + inc(38); + o << indent() << "typelib_TypeClass_INTERFACE_METHOD,\n" + << indent() << "pMethodName" << i << " );\n"; + dec(38); + index++; + } +} + +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; +} + +void InterfaceType::dumpCUnoAttributes(FileStream& o, sal_uInt32& index) +{ + sal_uInt32 fieldCount = m_reader.getFieldCount(); + + RTFieldAccess access = RT_ACCESS_INVALID; + OString fieldType; + + sal_uInt32 absoluteIndex = index; + + if (m_hasAttributes) + { + o << "\n" << indent() << "{\n" << indent() << "typelib_InterfaceAttributeTypeDescription * pAttribute = 0;\n"; + + for (sal_uInt16 i=0; i < fieldCount; i++) + { + access = m_reader.getFieldAccess(i); + + if (access == RT_ACCESS_CONST || access == RT_ACCESS_INVALID) + continue; + + fieldType = checkRealBaseType(m_reader.getFieldType(i), sal_True); + o << indent() << "{\n"; + o << indent() << "rtl_uString * pAttributeType" << i << " = 0;\n"; + o << indent() << "rtl_uString_newFromAscii( &pAttributeType" << i << ", \"" + << fieldType.replace('/', '.') << "\" );\n"; + o << indent() << "typelib_typedescription_newInterfaceAttribute( &pAttribute,\n"; + inc(); + o << indent() << absoluteIndex++ << ", pAttributeName" << i << ",\n"; + o << indent() << getTypeClass(fieldType, sal_True) << ", pAttributeType" << i << ",\n"; + if (access == RT_ACCESS_READONLY) + o << indent() << "sal_True );\n"; + else + o << indent() << "sal_False );\n"; + dec(); + o << indent() << "typelib_typedescription_register( (typelib_TypeDescription**)&pAttribute );\n\n"; + o << indent() << "}\n"; + } + o << indent() << "typelib_typedescription_release( (typelib_TypeDescription*)pAttribute );\n"; + o << indent() << "}\n"; + index = absoluteIndex; + } +} + +void InterfaceType::dumpCUnoMethods(FileStream& o, sal_uInt32& index) +{ + 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 bWithRuntimeException = sal_True; + + sal_uInt32 absoluteIndex = index; + + if (m_hasMethods) + { + o << "\n" << indent() << "{\n" << indent() << "typelib_InterfaceMethodTypeDescription * pMethod = 0;\n"; + + for (sal_uInt16 i=0; i < methodCount; i++) + { + methodName = m_reader.getMethodName(i); + returnType = checkRealBaseType(m_reader.getMethodReturnType(i), sal_True); + paramCount = m_reader.getMethodParamCount(i); + excCount = m_reader.getMethodExcCount(i); + methodMode = m_reader.getMethodMode(i); + + if ( methodName.equals("acquire") || methodName.equals("release") ) + { + bWithRuntimeException = sal_False; + } + o << indent() << "{\n"; + inc(); + + if (paramCount) + { + o << indent() << "typelib_Parameter_Init pParameters[" << paramCount << "];\n"; + } + if ( excCount || bWithRuntimeException ) + { + o << indent() << "rtl_uString * pExceptions[" << excCount + 1 << "];\n"; + } + o << indent() << "rtl_uString * pReturnType" << i << " = 0;\n"; + + sal_uInt16 j; + for (j=0; j < paramCount; j++) + { + o << indent() << "rtl_uString * pParamName" << j << " = 0;\n" + << indent() << "rtl_uString * pParamType" << j << " = 0;\n"; + } + + for (j=0; j < excCount; j++) + { + o << indent() << "rtl_uString * pExceptionName" << j << " = 0;\n"; + } + if ( excCount || bWithRuntimeException ) + { + o << indent() << "rtl_uString * pExceptionName" << excCount << " = 0;\n"; + } + for (j=0; j < paramCount; j++) + { + paramName = m_reader.getMethodParamName(i, j); + paramType = checkRealBaseType(m_reader.getMethodParamType(i, j), sal_True); + paramMode = m_reader.getMethodParamMode(i, j); + o << indent() << "rtl_uString_newFromAscii( &pParamName" << j << ", \"" + << paramName << "\" );\n"; + o << indent() << "rtl_uString_newFromAscii( &pParamType" << j << ", \"" + << paramType.replace('/', '.') << "\" );\n"; + o << indent() << "pParameters[" << j << "].pParamName = pParamName" << j << ";\n"; + o << indent() << "pParameters[" << j << "].eTypeClass = " + << getTypeClass(paramType, sal_True) << ";\n"; + o << indent() << "pParameters[" << j << "].pTypeName = sParamType" << j << ";\n"; + + if (paramMode == RT_PARAM_IN || paramMode == RT_PARAM_INOUT) + o << indent() << "pParameters[" << j << "].bIn = sal_True;\n"; + else + o << indent() << "pParameters[" << j << "].bIn = sal_False;\n"; + + if (paramMode == RT_PARAM_OUT || paramMode == RT_PARAM_INOUT) + o << indent() << "pParameters[" << j << "].bOut = sal_True;\n"; + else + o << indent() << "pParameters[" << j << "].bOut = sal_False;\n"; + } + + for (j=0; j < excCount; j++) + { + if (!m_reader.getMethodExcType(i, j).equals("com/sun/star/uno/RuntimeException")) + { + o << indent() << "rtl_uString_newFromAscii( & pExceptionName" << j << ", \"" + << OString(m_reader.getMethodExcType(i, j)).replace('/', '.') << "\" );\n"; + o << indent() << "pExceptions[" << j << "] = pExceptionName" << j << ";\n"; + } + } + if ( excCount || bWithRuntimeException ) + { + o << indent() << "rtl_uString_newFromAscii( & pExceptionName" << excCount + << ", \"com.sun.star.uno.RuntimeException\") );\n"; + o << indent() << "pExceptions[" << excCount << "] = pExceptionName" << excCount << ";\n"; + } + o << indent() << "rtl_uString_newFromAscii( &pReturnType" << i << ", \"" + << returnType.replace('/', '.') << "\" );\n"; + o << indent() << "typelib_typedescription_newInterfaceMethod( &pMethod,\n"; + inc(); + o << indent() << absoluteIndex++ << ", "; + if (methodMode == RT_MODE_ONEWAY || methodMode == RT_MODE_ONEWAY_CONST) + o << "sal_True,\n"; + else + o << "sal_False,\n"; + o << indent() << "pMethodName" << i << ",\n"; + o << indent() << getTypeClass(returnType, sal_True) << ", pReturnType" << i << ",\n"; + if (paramCount) + o << indent() << paramCount << ", pParameters,\n"; + else + o << indent() << "0, 0,\n"; + + if ( excCount || bWithRuntimeException ) + { + o << indent() << excCount + 1 << ", pExceptions );\n"; + } else + { + o << indent() << "0, 0 );\n"; + } + + dec(); + o << indent() << "typelib_typedescription_register( (typelib_TypeDescription**)&pMethod );\n"; + + o << indent() << "rtl_uString_release( pReturnType );\n"; + for (j=0; j < paramCount; j++) + { + o << indent() << "rtl_uString_release( pParamName" << j << " );\n" + << indent() << "rtl_uString_release( pParamType" << j << " );\n"; + } + + for (j=0; j < excCount; j++) + { + o << indent() << "rtl_uString_release( pExceptionName" << j << " );\n"; + } + if ( excCount || bWithRuntimeException ) + { + o << indent() << "rtl_uString_release( pExceptionName" << excCount << " );\n"; + } + dec(); + o << indent() << "}\n"; + } + o << indent() << "typelib_typedescription_release( (typelib_TypeDescription*)pMethod );\n"; + + o << indent() << "}\n"; + index = absoluteIndex; + } +} + +void InterfaceType::dumpAttributesCppuDecl(FileStream& o, StringSet* pFinishedTypes, CunoTypeDecl eDeclFlag) +{ + sal_uInt32 fieldCount = m_reader.getFieldCount(); + + RTFieldAccess access = RT_ACCESS_INVALID; + OString fieldName; + OString fieldType; + for (sal_uInt16 i=0; i < fieldCount; i++) + { + access = m_reader.getFieldAccess(i); + + if (access == RT_ACCESS_CONST || access == RT_ACCESS_INVALID) + continue; + + fieldName = m_reader.getFieldName(i); + fieldType = m_reader.getFieldType(i); + + if (pFinishedTypes->count(fieldType) == 0) + { + pFinishedTypes->insert(fieldType); + dumpCppuGetType(o, fieldType, sal_True, eDeclFlag); + } + } +} + +void InterfaceType::dumpMethodsCppuDecl(FileStream& o, StringSet* pFinishedTypes, CunoTypeDecl eDeclFlag) +{ + sal_uInt32 methodCount = m_reader.getMethodCount(); + OString returnType, paramType, excType; + sal_uInt32 paramCount = 0; + sal_uInt32 excCount = 0; + + for (sal_uInt16 i=0; i < methodCount; i++) + { + returnType = m_reader.getMethodReturnType(i); + paramCount = m_reader.getMethodParamCount(i); + excCount = m_reader.getMethodExcCount(i); + + if (pFinishedTypes->count(returnType) == 0) + { + pFinishedTypes->insert(returnType); + dumpCppuGetType(o, returnType, sal_True, eDeclFlag); + } + sal_uInt16 j; + for (j=0; j < paramCount; j++) + { + paramType = m_reader.getMethodParamType(i, j); + + if (pFinishedTypes->count(paramType) == 0) + { + pFinishedTypes->insert(paramType); + dumpCppuGetType(o, paramType, sal_True, eDeclFlag); + } + } + + for (j=0; j < excCount; j++) + { + excType = m_reader.getMethodExcType(i, j); + if (pFinishedTypes->count(excType) == 0) + { + pFinishedTypes->insert(excType); + dumpCppuGetType(o, excType, sal_True, eDeclFlag); + } + } + } +} + +//************************************************************************* +// ModuleType +//************************************************************************* +ModuleType::ModuleType(TypeReader& typeReader, + const OString& typeName, + const TypeManager& typeMgr, + const TypeDependency& typeDependencies) + : CunoType(typeReader, typeName, typeMgr, typeDependencies) +{ +} + +ModuleType::~ModuleType() +{ + +} + +sal_Bool ModuleType::dump(CunoOptions* pOptions) + throw( CannotDumpException ) +{ + sal_Bool ret = sal_False; + + if (pOptions->isValid("-U")) + m_cunoTypeDynamic = sal_True; + + OString outPath; + if (pOptions->isValid("-O")) + outPath = pOptions->getOption("-O"); + + OString tmpName(m_typeName); + + if (tmpName.equals("/")) + tmpName = "global"; + else +// tmpName += "/" + m_typeName.getToken(m_typeName.getTokenCount('/') - 1, '/'); + tmpName += "/" + m_name; + + OString tmpFileName; + OString hFileName = createFileNameFromType(outPath, tmpName, ".hdl"); + + sal_Bool bFileExists = sal_False; + sal_Bool bFileCheck = sal_False; + + if ( pOptions->isValid("-G") || pOptions->isValid("-Gc") ) + { + bFileExists = fileExists( hFileName ); + ret = sal_True; + } + + if ( bFileExists && pOptions->isValid("-Gc") ) + { + tmpFileName = createFileNameFromType(outPath, m_typeName, ".tml"); + bFileCheck = sal_True; + } + + if ( !bFileExists || bFileCheck ) + { + FileStream hFile; + + if ( bFileCheck ) + hFile.open(tmpFileName); + else + hFile.open(hFileName); + + if(!hFile.isValid()) + { + OString message("cannot open "); + message += hFileName + " for writing"; + throw CannotDumpException(message); + } + + ret = dumpHFile(hFile); + + hFile.close(); + if (ret && bFileCheck) + { + ret = checkFileContent(hFileName, tmpFileName); + } + } +/* + bFileExists = sal_False; + bFileCheck = sal_False; + OString cFileName = createFileNameFromType(outPath, tmpName, ".c"); + + if ( pOptions->isValid("-G") || pOptions->isValid("-Gc") ) + { + bFileExists = fileExists( cFileName ); + ret = sal_True; + } + + if ( bFileExists && pOptions->isValid("-Gc") ) + { + tmpFileName = createFileNameFromType(outPath, m_typeName, ".tmc"); + bFileCheck = sal_True; + } + + + if ( !bFileExists || bFileCheck ) + { + FileStream hxxFile; + + if ( bFileCheck ) + cFile.open(tmpFileName); + else + cFile.open(cFileName); + + if(!cFile.isValid()) + { + OString message("cannot open "); + message += cFileName + " for writing"; + throw CannotDumpException(message); + } + + ret = dumpCFile(cFile); + + cFile.close(); + if (ret && bFileCheck) + { + ret = checkFileContent(cFileName, tmpFileName); + } + } +*/ + return ret; +} + +sal_Bool ModuleType::dumpHFile(FileStream& o) + throw( CannotDumpException ) +{ + sal_Bool bSpecialDefine = sal_True; + + if (m_reader.getTypeClass() == RT_TYPE_CONSTANTS) + { + bSpecialDefine = sal_False; + } + + OString headerDefine(dumpHeaderDefine(o, "H", bSpecialDefine)); + o << "\n"; + + dumpDefaultHIncludes(o); + o << "\n"; + dumpDepIncludes(o, m_typeName, "h"); + o << "\n"; + + dumpOpenExternC(o); + dumpDeclaration(o); + o << "\n"; + dumpCloseExternC(o); + + o << "\n#endif /* "<< headerDefine << " */\n"; + + return sal_True; +} + +sal_Bool ModuleType::dumpDeclaration(FileStream& o) + throw( CannotDumpException ) +{ + sal_uInt32 fieldCount = m_reader.getFieldCount(); + RTFieldAccess access = RT_ACCESS_INVALID; + OString fieldName; + OString fieldType; + for (sal_uInt16 i=0; i < fieldCount; i++) + { + access = m_reader.getFieldAccess(i); + + if (access == RT_ACCESS_CONST) + { + fieldName = m_reader.getFieldName(i); + fieldType = m_reader.getFieldType(i); + + o << "static const "; + dumpType(o, fieldType); + o << " " << m_name << "_" << fieldName << " = "; + dumpConstantValue(o, i); + o << ";\n"; + } + } + + return sal_True; +} + +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; +} + +sal_Bool ModuleType::dumpCFile(FileStream& o) + throw( CannotDumpException ) +{ + return sal_True; +} + +//************************************************************************* +// ConstantsType +//************************************************************************* +ConstantsType::ConstantsType(TypeReader& typeReader, + const OString& typeName, + const TypeManager& typeMgr, + const TypeDependency& typeDependencies) + : ModuleType(typeReader, typeName, typeMgr, typeDependencies) +{ +} + +ConstantsType::~ConstantsType() +{ + +} + +sal_Bool ConstantsType::dump(CunoOptions* pOptions) + throw( CannotDumpException ) +{ + sal_Bool ret = sal_False; + + if (pOptions->isValid("-U")) + m_cunoTypeDynamic = sal_True; + + OString outPath; + if (pOptions->isValid("-O")) + outPath = pOptions->getOption("-O"); + + OString tmpFileName; + OString hFileName = createFileNameFromType(outPath, m_typeName, ".h"); + + sal_Bool bFileExists = sal_False; + sal_Bool bFileCheck = sal_False; + + if ( pOptions->isValid("-G") || pOptions->isValid("-Gc") ) + { + bFileExists = fileExists( hFileName ); + ret = sal_True; + } + + if ( bFileExists && pOptions->isValid("-Gc") ) + { + tmpFileName = createFileNameFromType(outPath, m_typeName, ".tmh"); + bFileCheck = sal_True; + } + + if ( !bFileExists || bFileCheck ) + { + FileStream hFile; + + if ( bFileCheck ) + hFile.open(tmpFileName); + else + hFile.open(hFileName); + + if(!hFile.isValid()) + { + OString message("cannot open "); + message += hFileName + " for writing"; + throw CannotDumpException(message); + } + + ret = dumpHFile(hFile); + + hFile.close(); + if (ret && bFileCheck) + { + ret = checkFileContent(hFileName, tmpFileName); + } + } +/* + bFileExists = sal_False; + bFileCheck = sal_False; + OString cFileName = createFileNameFromType(outPath, m_typeName, ".c"); + + if ( pOptions->isValid("-G") || pOptions->isValid("-Gc") ) + { + bFileExists = fileExists( cFileName ); + ret = sal_True; + } + + if ( bFileExists && pOptions->isValid("-Gc") ) + { + tmpFileName = createFileNameFromType(outPath, m_typeName, ".tmc"); + bFileCheck = sal_True; + } + + if ( !bFileExists || bFileCheck ) + { + FileStream cFile; + + if ( bFileCheck ) + cFile.open(tmpFileName); + else + cFile.open(cFileName); + + if(!cFile.isValid()) + { + OString message("cannot open "); + message += cFileName + " for writing"; + throw CannotDumpException(message); + } + + ret = dumpCFile(cFile); + + cFile.close(); + if (ret && bFileCheck) + { + ret = checkFileContent(cFileName, tmpFileName); + } + } +*/ + return ret; +} + +//************************************************************************* +// StructureType +//************************************************************************* +StructureType::StructureType(TypeReader& typeReader, + const OString& typeName, + const TypeManager& typeMgr, + const TypeDependency& typeDependencies) + : CunoType(typeReader, typeName, typeMgr, typeDependencies) +{ +} + +StructureType::~StructureType() +{ + +} + +sal_Bool StructureType::dumpHFile(FileStream& o) + throw( CannotDumpException ) +{ + OString headerDefine(dumpHeaderDefine(o, "H")); + o << "\n"; + + dumpDefaultHIncludes(o); + o << "\n"; + dumpDepIncludes(o, m_typeName, "h"); + o << "\n"; + + dumpOpenExternC(o); + + dumpDeclaration(o); + + if ( m_cunoTypeLib ) + { + o << "#ifdef CUNO_TYPELIB\n" + << "typelib_TypeDescriptionReference ** SAL_CALL getCUnoType_" << m_name << "() SAL_THROW_EXTERN_C( () );\n" + << "#endif\n\n"; + } + + dumpCloseExternC(o); + + o << "#endif /* "<< headerDefine << " */\n"; + + return sal_True; +} + +sal_Bool StructureType::dumpDeclaration(FileStream& o) + throw( CannotDumpException ) +{ + o << "#ifdef SAL_W32\n" + << "# pragma pack(push, 8)\n" + << "#elif defined(SAL_OS2)\n" + << "# pragma pack(8)\n" + << "#endif\n\n"; + + o << "typedef struct _" << m_name << "\n{\n"; + inc(); + + OString superType(m_reader.getSuperTypeName()); + if (superType.getLength() > 0) + o << indent() << superType.replace('/', '_').getStr() << " _Base;\n"; + //dumpInheritedMembers(o, superType); + + sal_uInt32 fieldCount = m_reader.getFieldCount(); + RTFieldAccess access = RT_ACCESS_INVALID; + OString fieldName; + OString fieldType; + sal_uInt16 i=0; + + for (i=0; i < fieldCount; i++) + { + access = m_reader.getFieldAccess(i); + + if (access == RT_ACCESS_CONST || access == RT_ACCESS_INVALID) + continue; + + fieldName = m_reader.getFieldName(i); + fieldType = m_reader.getFieldType(i); + + o << indent(); + dumpType(o, fieldType); + o << " " << fieldName << ";\n"; + } + + dec(); + o << "} " << m_name << ";\n\n"; + + o << "#ifdef SAL_W32\n" + << "# pragma pack(pop)\n" + << "#elif defined(SAL_OS2)\n" + << "# pragma pack()\n" + << "#endif\n\n"; + + return sal_True; +} + +sal_Bool StructureType::dumpCFile(FileStream& o) + throw( CannotDumpException ) +{ + dumpInclude(o, m_typeName, "h"); + o << "\n"; + dumpDefaultCIncludes(o); + o << "\n"; + dumpDepIncludes(o, m_typeName, "h"); + o << "\n"; + + dumpGetCunoType(o); + + return sal_True; +} + +//************************************************************************* +// ExceptionType +//************************************************************************* +ExceptionType::ExceptionType(TypeReader& typeReader, + const OString& typeName, + const TypeManager& typeMgr, + const TypeDependency& typeDependencies) + : CunoType(typeReader, typeName, typeMgr, typeDependencies) +{ +} + +ExceptionType::~ExceptionType() +{ + +} + +sal_Bool ExceptionType::dumpHFile(FileStream& o) + throw( CannotDumpException ) +{ + OString headerDefine(dumpHeaderDefine(o, "H")); + o << "\n"; + + dumpDefaultHIncludes(o); + o << "\n"; + dumpDepIncludes(o, m_typeName, "h"); + o << "\n"; + + dumpOpenExternC(o); + + dumpDeclaration(o); + + if ( m_cunoTypeLib ) + { + o << "#ifdef CUNO_TYPELIB\n" + << "typelib_TypeDescriptionReference ** SAL_CALL getCUnoType_" << m_name << "() SAL_THROW_EXTERN_C( () );\n" + << "#endif\n\n"; + } + + dumpCloseExternC(o); + + o << "#endif /* "<< headerDefine << " */\n"; + + return sal_True; +} + +sal_Bool ExceptionType::dumpDeclaration(FileStream& o) + throw( CannotDumpException ) +{ + o << "#ifdef SAL_W32\n" + << "# pragma pack(push, 8)\n" + << "#elif defined(SAL_OS2)\n" + << "# pragma pack(8)\n" + << "#endif\n\n"; + + o << "\n/* Exception type */\ntypedef struct _" << m_name << "\n{\n"; + inc(); + + OString superType(m_reader.getSuperTypeName()); + if (superType.getLength() > 0) + o << indent() << superType.replace('/', '_').getStr() << " _Base;\n"; + //dumpInheritedMembers(o, superType); + + sal_uInt32 fieldCount = m_reader.getFieldCount(); + RTFieldAccess access = RT_ACCESS_INVALID; + OString fieldName; + OString fieldType; + sal_uInt16 i = 0; + + for (i=0; i < fieldCount; i++) + { + access = m_reader.getFieldAccess(i); + + if (access == RT_ACCESS_CONST || access == RT_ACCESS_INVALID) + continue; + + fieldName = m_reader.getFieldName(i); + fieldType = m_reader.getFieldType(i); + + o << indent(); + dumpType(o, fieldType); + o << " " << fieldName << ";\n"; + } + + dec(); + o << "} " << m_name << ";\n\n"; + + o << "#ifdef SAL_W32\n" + << "# pragma pack(pop)\n" + << "#elif defined(SAL_OS2)\n" + << "# pragma pack()\n" + << "#endif\n\n"; + + return sal_True; +} + +sal_Bool ExceptionType::dumpCFile(FileStream& o) + throw( CannotDumpException ) +{ + dumpInclude(o, m_typeName, "h"); + o << "\n"; + dumpDefaultCIncludes(o); + o << "\n"; + dumpDepIncludes(o, m_typeName, "h"); + o << "\n"; + + dumpGetCunoType(o); + + return sal_True; +} + + +//************************************************************************* +// EnumType +//************************************************************************* +EnumType::EnumType(TypeReader& typeReader, + const OString& typeName, + const TypeManager& typeMgr, + const TypeDependency& typeDependencies) + : CunoType(typeReader, typeName, typeMgr, typeDependencies) +{ +} + +EnumType::~EnumType() +{ + +} + +sal_Bool EnumType::dumpHFile(FileStream& o) + throw( CannotDumpException ) +{ + OString headerDefine(dumpHeaderDefine(o, "H")); + o << "\n"; + + dumpDefaultHIncludes(o); + o << "\n"; + dumpOpenExternC(o); + + dumpDeclaration(o); + + if ( m_cunoTypeLib ) + { + o << "#ifdef CUNO_TYPELIB\n" + << "typelib_TypeDescriptionReference ** SAL_CALL getCUnoType_" << m_name << "() SAL_THROW_EXTERN_C( () );\n" + << "#endif\n\n"; + } + + dumpCloseExternC(o); + + o << "#endif /* "<< headerDefine << " */\n"; + + return sal_True; +} + +sal_Bool EnumType::dumpDeclaration(FileStream& o) + throw( CannotDumpException ) +{ + o << "\ntypedef enum _" << m_name << "\n{\n"; + inc(); + + sal_uInt32 fieldCount = m_reader.getFieldCount(); + RTFieldAccess access = RT_ACCESS_INVALID; + RTConstValue constValue; + OString fieldName; + sal_Int32 value=0; + for (sal_uInt16 i=0; i < fieldCount; i++) + { + access = m_reader.getFieldAccess(i); + + if (access != RT_ACCESS_CONST) + continue; + + fieldName = m_reader.getFieldName(i); + constValue = m_reader.getFieldConstValue(i); + + if (constValue.m_type == RT_TYPE_INT32) + value = constValue.m_value.aLong; + else + value++; + + o << indent() << m_name << "_" << fieldName << " = " << value << ",\n"; + } + + o << indent() << m_name << "_MAKE_FIXED_SIZE = SAL_MAX_ENUM\n"; + + dec(); + o << "} " << m_name << ";\n\n"; + + return sal_True; +} + +sal_Bool EnumType::dumpCFile(FileStream& o) + throw( CannotDumpException ) +{ + dumpInclude(o, m_typeName, "h"); + o << "\n"; + dumpDefaultCIncludes(o); + o << "\n"; + dumpGetCunoType(o); + return sal_True; +} + +void EnumType::dumpGetCunoType(FileStream& o) +{ + OString typeName(m_typeName.replace('/', '_')); + + if ( m_cunoTypeLeak ) + { + dumpLGetCunoType(o); + return; + } + if ( !m_cunoTypeDynamic ) + { + dumpCGetCunoType(o); + return; + } + + dumpOpenExternC(o); + + o << "#if (defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500))\n" + << "static typelib_TypeDescriptionReference * s_pType_" << typeName << " = 0;\n" + << "#endif\n\n"; + + o << "typelib_TypeDescriptionReference ** SAL_CALL getCUnoType_" << m_name << "() SAL_THROW_EXTERN_C( () )\n{\n"; + inc(); + + o << indent() << "#if ! (defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500))\n" + << indent() << "static typelib_TypeDescriptionReference * s_pType_" << typeName << " = 0;\n" + << indent() << "#endif\n\n"; + + o << indent() << "if ( !s_pType_" << typeName << " )\n" << indent() << "{\n"; + inc(); + + o << indent() << "typelib_static_enum_type_init( &s_pType_" << typeName << ",\n"; + inc(31); + o << indent() << "\"" << m_typeName.replace('/', '.') << "\",\n" + << indent() << m_name << "_" << m_reader.getFieldName(0) << " );\n"; + dec(31); + dec(); + o << indent() << "}\n" + << indent() << "typelib_typedescriptionreference_acquire( s_pType_" << typeName <<" );\n" + << indent() << "return &s_pType_" << typeName <<" );\n"; + dec(); + o << indent() << "}\n"; + + dumpCloseExternC(o); +} + +void EnumType::dumpCGetCunoType(FileStream& o) +{ + OString typeName(m_typeName.replace('/', '_')); + + dumpOpenExternC(o); + + o << "#if (defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500))\n" + << "static typelib_TypeDescriptionReference * s_pType_" << typeName << " = 0;\n" + << "#endif\n\n"; + + o << "typelib_TypeDescriptionReference ** SAL_CALL getCUnoType_" << m_name << "() SAL_THROW_EXTERN_C( () )\n{\n"; + inc(); + + o << "#if ! (defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500))\n" + << indent() << "static typelib_TypeDescriptionReference * s_pType_" << typeName << " = 0;\n" + << "#endif\n\n"; + + o << indent() << "if ( !s_pType_" << typeName << " )\n" << indent() << "{\n"; + inc(); + o << indent() << "oslMutex * pMutex = osl_getGlobalMutex();\n" + << indent() << "osl_acquireMutex( pMutex );\n"; + + o << indent() << "if ( !s_pType_" << typeName << " )\n" << indent() << "{\n"; + inc(); + o << indent() << "rtl_uString * pTypeName = 0;\n" + << indent() << "_typelib_TypeDescription * pTD = 0;\n"; + + sal_uInt32 count = m_reader.getFieldCount(); + o << indent() << "rtl_uString* enumValueNames[" << count << "];\n" + << indent() << "sal_Int32 enumValues[" << count << "];\n"; + sal_uInt32 i; + for (i = 0; i < count; i++) + { + o << indent() << "rtl_uString * pEnumValue" << i << " = 0;\n"; + } + + o << indent() << "rtl_uString_newFromAscii( &pTypeName, \"" + << m_typeName.replace('/', '.') << "\") );\n\n"; + + for (i = 0; i < count; i++) + { + o << indent() << "rtl_uString_newFromAscii( &pEnumValue" << i << ", \"" + << m_reader.getFieldName((sal_uInt16)i) << "\" );\n"; + o << indent() << "enumValueNames[" << i << "] = pEnumValue" << i << ";\n"; + } + + RTConstValue constValue; + sal_Int32 value=0; + for (i = 0; i < count; i++) + { + o << indent() << "enumValues[" << i << "] = "; + constValue = m_reader.getFieldConstValue((sal_uInt16)i); + if (constValue.m_type == RT_TYPE_INT32) + value = constValue.m_value.aLong; + else + value++; + o << value << ";\n"; + } + + o << "\n" << indent() << "typelib_typedescription_newEnum( &pTD,\n"; + inc(); + o << indent() << "pTypeName,\n" + << indent() << "(sal_Int32)" << m_name << "_" << m_reader.getFieldName(0) << ",\n" + << indent() << count << ", enumValueNames, enumValues );\n\n"; + dec(); + + o << indent() << "typelib_typedescription_register( &pTD );\n"; + + o << indent() << "typelib_typedescriptionreference_new( &s_pType_ " << typeName + << getTypeClass(OString(), sal_True) << ", pTD);\n\n"; + + o << indent() << "typelib_typedescription_release( pTD );\n" + << indent() << "rtl_uString_release( pTypeName );\n"; + for (i = 0; i < count; i++) + { + o << indent() << "rtl_uString_release( pEnumValue" << i << " );\n"; + } + + dec(); + o << indent() << "}\n"; + o << indent() << "osl_releaseMutex( pMutex );\n"; + dec(); + o << indent() << "}\n\n" + << indent() << "typelib_typedescriptionreference_acquire( s_pType_" << typeName <<" );\n" + << indent() << "return &s_pType_" << typeName <<" );\n"; + + dec(); + o << "}\n"; + + dumpCloseExternC(o); +} + +//************************************************************************* +// TypeDefType +//************************************************************************* +TypeDefType::TypeDefType(TypeReader& typeReader, + const OString& typeName, + const TypeManager& typeMgr, + const TypeDependency& typeDependencies) + : CunoType(typeReader, typeName, typeMgr, typeDependencies) +{ +} + +TypeDefType::~TypeDefType() +{ + +} + +sal_Bool TypeDefType::dumpHFile(FileStream& o) + throw( CannotDumpException ) +{ + OString headerDefine(dumpHeaderDefine(o, "H")); + o << "\n"; + + dumpDefaultHIncludes(o); + o << "\n"; + dumpDepIncludes(o, m_typeName, "h"); + o << "\n"; + + dumpOpenExternC(o); + + dumpDeclaration(o); + + if ( m_cunoTypeLib ) + { + o << "#ifdef CUNO_TYPELIB\n" + << "typelib_TypeDescriptionReference ** SAL_CALL getCUnoType_" << m_name << "() SAL_THROW_EXTERN_C( () );\n" + << "#endif\n\n"; + } + + dumpCloseExternC(o); + + o << "#endif /* "<< headerDefine << " */\n"; + + return sal_True; +} + +sal_Bool TypeDefType::dumpDeclaration(FileStream& o) + throw( CannotDumpException ) +{ + o << "\ntypedef "; + dumpType(o, m_reader.getSuperTypeName()); + o << " " << m_name << ";\n\n"; + + return sal_True; +} + +sal_Bool TypeDefType::dumpCFile(FileStream& o) + throw( CannotDumpException ) +{ + dumpInclude(o, m_typeName, "h"); + o << "\n"; + dumpDefaultCIncludes(o); + o << "\n"; + dumpDepIncludes(o, m_typeName, "h"); + o << "\n"; + dumpGetCunoType(o); + return sal_True; +} + +void TypeDefType::dumpGetCunoType(FileStream& o) +{ + if ( m_cunoTypeLeak ) + { + dumpLGetCunoType(o); + return; + } + if ( !m_cunoTypeDynamic ) + { + dumpCGetCunoType(o); + return; + } +} + +void TypeDefType::dumpCGetCunoType(FileStream& o) +{ +} + +void TypeDefType::dumpLGetCunoType(FileStream& o) +{ +} + +//************************************************************************* +// produceType +//************************************************************************* +sal_Bool produceType(const OString& typeName, + TypeManager& typeMgr, + TypeDependency& typeDependencies, + CunoOptions* pOptions) + throw( CannotDumpException ) +{ + if (typeDependencies.isGenerated(typeName)) + return sal_True; + + TypeReader reader(typeMgr.getTypeReader(typeName)); + + if (!reader.isValid()) + { + if (typeName.equals("/")) + return sal_True; + else + return sal_False; + } + + if( !checkTypeDependencies(typeMgr, typeDependencies, typeName)) + return sal_False; + + RTTypeClass typeClass = reader.getTypeClass(); + sal_Bool ret = sal_False; + switch (typeClass) + { + case RT_TYPE_INTERFACE: + { + InterfaceType iType(reader, typeName, typeMgr, typeDependencies); + ret = iType.dump(pOptions); + if (ret) typeDependencies.setGenerated(typeName); + ret = iType.dumpDependedTypes(pOptions); + } + break; + case RT_TYPE_MODULE: + { + ModuleType mType(reader, typeName, typeMgr, typeDependencies); + if (mType.hasConstants()) + { + ret = mType.dump(pOptions); + if (ret) typeDependencies.setGenerated(typeName); +// ret = mType.dumpDependedTypes(pOptions); + } else + { + typeDependencies.setGenerated(typeName); + ret = sal_True; + } + } + break; + case RT_TYPE_STRUCT: + { + StructureType sType(reader, typeName, typeMgr, typeDependencies); + ret = sType.dump(pOptions); + if (ret) typeDependencies.setGenerated(typeName); + ret = sType.dumpDependedTypes(pOptions); + } + break; + case RT_TYPE_ENUM: + { + EnumType enType(reader, typeName, typeMgr, typeDependencies); + ret = enType.dump(pOptions); + if (ret) typeDependencies.setGenerated(typeName); + ret = enType.dumpDependedTypes(pOptions); + } + break; + case RT_TYPE_EXCEPTION: + { + ExceptionType eType(reader, typeName, typeMgr, typeDependencies); + ret = eType.dump(pOptions); + if (ret) typeDependencies.setGenerated(typeName); + ret = eType.dumpDependedTypes(pOptions); + } + break; + case RT_TYPE_TYPEDEF: + { + TypeDefType tdType(reader, typeName, typeMgr, typeDependencies); + ret = tdType.dump(pOptions); + if (ret) typeDependencies.setGenerated(typeName); + ret = tdType.dumpDependedTypes(pOptions); + } + break; + case RT_TYPE_CONSTANTS: + { + ConstantsType cType(reader, typeName, typeMgr, typeDependencies); + if (cType.hasConstants()) + { + ret = cType.dump(pOptions); + if (ret) typeDependencies.setGenerated(typeName); +// ret = cType.dumpDependedTypes(pOptions); + } else + { + typeDependencies.setGenerated(typeName); + ret = sal_True; + } + } + break; + case RT_TYPE_SERVICE: + case RT_TYPE_OBJECT: + ret = sal_True; + break; + } + + 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(); +} + + diff --git a/codemaker/source/cunomaker/cunotype.hxx b/codemaker/source/cunomaker/cunotype.hxx new file mode 100644 index 000000000000..81d55270833a --- /dev/null +++ b/codemaker/source/cunomaker/cunotype.hxx @@ -0,0 +1,309 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef INCLUDED_CODEMAKER_SOURCE_CUNOMAKER_CUNOTYPE_HXX_ +#define INCLUDED_CODEMAKER_SOURCE_CUNOMAKER_CUNOTYPE_HXX + +#include <codemaker/typemanager.hxx> +#include <codemaker/dependency.hxx> + +enum BASETYPE +{ + BT_INVALID, + BT_VOID, + BT_ANY, + BT_TYPE, + BT_BOOLEAN, + BT_CHAR, + BT_STRING, + BT_FLOAT, + BT_DOUBLE, + BT_OCTET, + BT_BYTE, + BT_SHORT, + BT_LONG, + BT_HYPER, + BT_UNSIGNED_SHORT, + BT_UNSIGNED_LONG, + BT_UNSIGNED_HYPER +}; + + +enum CunoTypeDecl +{ + CUNOTYPEDECL_ALLTYPES, + CUNOTYPEDECL_NOINTERFACES, + CUNOTYPEDECL_ONLYINTERFACES +}; + +class CunoOptions; +class FileStream; + +class CunoType +{ +public: + CunoType(TypeReader& typeReader, + const ::rtl::OString& typeName, + const TypeManager& typeMgr, + const TypeDependency& typeDependencies); + + virtual ~CunoType(); + + virtual sal_Bool dump(CunoOptions* pOptions) throw( CannotDumpException ); + virtual sal_Bool dumpDependedTypes(CunoOptions* pOptions) throw( CannotDumpException ); + virtual sal_Bool dumpHFile(FileStream& o) throw( CannotDumpException ) = 0; + virtual sal_Bool dumpCFile(FileStream& o) throw( CannotDumpException ) = 0; + + virtual ::rtl::OString dumpHeaderDefine(FileStream& o, sal_Char* prefix, sal_Bool bExtended=sal_False); + virtual void dumpDefaultHIncludes(FileStream& o); + virtual void dumpDefaultCIncludes(FileStream& o); + virtual void dumpInclude(FileStream& o, const ::rtl::OString& typeName, sal_Char* prefix, sal_Bool bExtended=sal_False, sal_Bool bCaseSensitive=sal_False); + virtual void dumpDepIncludes(FileStream& o, const ::rtl::OString& typeName, sal_Char* prefix); + + virtual void dumpOpenExternC(FileStream& o); + virtual void dumpCloseExternC(FileStream& o); + + virtual void dumpGetCunoType(FileStream& o); + virtual void dumpCGetCunoType(FileStream& o); + virtual void dumpLGetCunoType(FileStream& o); + + virtual void dumpType(FileStream& o, const ::rtl::OString& type, sal_Bool bConst=sal_False, + sal_Bool bPointer=sal_False, sal_Bool bParam=sal_False) + throw( CannotDumpException ); + ::rtl::OString getTypeClass(const ::rtl::OString& type="", sal_Bool bCStyle=sal_False); + ::rtl::OString getBaseType(const ::rtl::OString& type); + void dumpCppuGetType(FileStream& o, const ::rtl::OString& type, sal_Bool bDecl=sal_False, CunoTypeDecl eDeclFlag=CUNOTYPEDECL_ALLTYPES); + void dumpTypeInit(FileStream& o, const ::rtl::OString& type); + BASETYPE isBaseType(const ::rtl::OString& type); + + ::rtl::OString typeToIdentifier(const ::rtl::OString& type); + + void dumpConstantValue(FileStream& o, sal_uInt16 index); + + virtual sal_uInt32 getMemberCount(); + virtual sal_uInt32 getInheritedMemberCount(); + void dumpInheritedMembers(FileStream& o, rtl::OString& superType); + + sal_Bool isSeqType(const ::rtl::OString& type, ::rtl::OString& baseType, ::rtl::OString& seqPrefix); + sal_Bool isArrayType(const ::rtl::OString& type, ::rtl::OString& baseType, ::rtl::OString& arrayPrefix); + sal_Bool isVoid(const ::rtl::OString& type) + { return type.equals("void"); } + void inc(sal_uInt32 num=4); + void dec(sal_uInt32 num=4); + ::rtl::OString indent(); + ::rtl::OString indent(sal_uInt32 num); +protected: + virtual sal_uInt32 checkInheritedMemberCount(const TypeReader* pReader); + + ::rtl::OString checkSpecialCunoType(const ::rtl::OString& type); + ::rtl::OString checkRealBaseType(const ::rtl::OString& type, sal_Bool bResolveTypeOnly = sal_False); + void dumpCppuGetTypeMemberDecl(FileStream& o, CunoTypeDecl eDeclFlag); + + sal_Bool isNestedType() + { return m_bIsNestedType; }; + + RegistryKeyNames& getNestedTypeNames() + { return m_nestedTypeNames; }; + + sal_Bool isNestedTypeByName(const ::rtl::OString& type); + sal_Bool hasNestedType(const ::rtl::OString& type); + +protected: + sal_uInt32 m_inheritedMemberCount; + + sal_Bool m_cunoTypeLib; + sal_Bool m_cunoTypeLeak; + sal_Bool m_cunoTypeDynamic; + sal_uInt32 m_indentLength; + ::rtl::OString m_typeName; + ::rtl::OString m_name; + TypeReader m_reader; + TypeManager& m_typeMgr; + TypeDependency m_dependencies; + sal_Bool m_bIsNestedType; + RegistryKeyNames m_nestedTypeNames; +}; + +class InterfaceType : public CunoType +{ +public: + InterfaceType(TypeReader& typeReader, + const ::rtl::OString& typeName, + const TypeManager& typeMgr, + const TypeDependency& typeDependencies); + + virtual ~InterfaceType(); + + sal_Bool dumpDeclaration(FileStream& o) throw( CannotDumpException ); + sal_Bool dumpHFile(FileStream& o) throw( CannotDumpException ); + sal_Bool dumpCFile(FileStream& o) throw( CannotDumpException ); + + void dumpInheritedFunctions(FileStream& o, rtl::OString& superType); + void dumpAttributes(FileStream& o, const ::rtl::OString& interfaceType, TypeReader& reader ); + void dumpMethods(FileStream& o, const ::rtl::OString& interfaceType, TypeReader& reader ); + void dumpGetCunoType(FileStream& o); + void dumpCGetCunoType(FileStream& o); + void dumpCUnoAttributeTypeNames(FileStream& o, sal_Bool bRelease=sal_False); + void dumpCUnoMethodTypeNames(FileStream& o, sal_Bool bRelease=sal_False); + void dumpCUnoAttributeRefs(FileStream& o, sal_uInt32& index); + void dumpCUnoMethodRefs(FileStream& o, sal_uInt32& index); + void dumpCUnoAttributes(FileStream& o, sal_uInt32& index); + void dumpCUnoMethods(FileStream& o, sal_uInt32& index); + void dumpAttributesCppuDecl(FileStream& o, StringSet* pFinishedTypes, CunoTypeDecl eDeclFlag); + void dumpMethodsCppuDecl(FileStream& o, StringSet* pFinishedTypes, CunoTypeDecl eDeclFlag ); + + sal_uInt32 getMemberCount(); + sal_uInt32 getInheritedMemberCount(); + +protected: + sal_uInt32 checkInheritedMemberCount(const TypeReader* pReader); + +protected: + sal_uInt32 m_inheritedMemberCount; + sal_Bool m_hasAttributes; + sal_Bool m_hasMethods; +}; + +class ModuleType : public CunoType +{ +public: + ModuleType(TypeReader& typeReader, + const ::rtl::OString& typeName, + const TypeManager& typeMgr, + const TypeDependency& typeDependencies); + + virtual ~ModuleType(); + + virtual sal_Bool dump(CunoOptions* pOptions) throw( CannotDumpException ); + + sal_Bool dumpDeclaration(FileStream& o) throw( CannotDumpException ); + sal_Bool dumpHFile(FileStream& o) throw( CannotDumpException ); + sal_Bool dumpCFile(FileStream& o) throw( CannotDumpException ); + sal_Bool hasConstants(); +}; + +class ConstantsType : public ModuleType +{ +public: + ConstantsType(TypeReader& typeReader, + const ::rtl::OString& typeName, + const TypeManager& typeMgr, + const TypeDependency& typeDependencies); + + virtual ~ConstantsType(); + + virtual sal_Bool dump(CunoOptions* pOptions) throw( CannotDumpException ); +}; + +class StructureType : public CunoType +{ +public: + StructureType(TypeReader& typeReader, + const ::rtl::OString& typeName, + const TypeManager& typeMgr, + const TypeDependency& typeDependencies); + + virtual ~StructureType(); + + sal_Bool dumpDeclaration(FileStream& o) throw( CannotDumpException ); + sal_Bool dumpHFile(FileStream& o) throw( CannotDumpException ); + sal_Bool dumpCFile(FileStream& o) throw( CannotDumpException ); +}; + +class ExceptionType : public CunoType +{ +public: + ExceptionType(TypeReader& typeReader, + const ::rtl::OString& typeName, + const TypeManager& typeMgr, + const TypeDependency& typeDependencies); + + virtual ~ExceptionType(); + + sal_Bool dumpDeclaration(FileStream& o) throw( CannotDumpException ); + sal_Bool dumpHFile(FileStream& o) throw( CannotDumpException ); + sal_Bool dumpCFile(FileStream& o) throw( CannotDumpException ); +}; + +class EnumType : public CunoType +{ +public: + EnumType(TypeReader& typeReader, + const ::rtl::OString& typeName, + const TypeManager& typeMgr, + const TypeDependency& typeDependencies); + + virtual ~EnumType(); + + sal_Bool dumpDeclaration(FileStream& o) throw( CannotDumpException ); + sal_Bool dumpHFile(FileStream& o) throw( CannotDumpException ); + sal_Bool dumpCFile(FileStream& o) throw( CannotDumpException ); + + void dumpGetCunoType(FileStream& o); + void dumpCGetCunoType(FileStream& o); +}; + +class TypeDefType : public CunoType +{ +public: + TypeDefType(TypeReader& typeReader, + const ::rtl::OString& typeName, + const TypeManager& typeMgr, + const TypeDependency& typeDependencies); + + virtual ~TypeDefType(); + + sal_Bool dumpDeclaration(FileStream& o) throw( CannotDumpException ); + sal_Bool dumpHFile(FileStream& o) throw( CannotDumpException ); + sal_Bool dumpCFile(FileStream& o) throw( CannotDumpException ); + + void dumpGetCunoType(FileStream& o); + void dumpLGetCunoType(FileStream& o); + void dumpCGetCunoType(FileStream& o); +}; + + +sal_Bool produceType(const ::rtl::OString& typeName, + TypeManager& typeMgr, + TypeDependency& typeDependencies, + CunoOptions* pOptions) + throw( CannotDumpException ); + +/** + * This function returns a C++ scoped name, represents the namespace + * scoping of this type, e.g. com:.sun::star::uno::XInterface. If the scope of + * the type is equal scope, the relativ name will be used. + */ +::rtl::OString scopedName(const ::rtl::OString& scope, const ::rtl::OString& type, + sal_Bool bNoNameSpace=sal_False); + +::rtl::OString shortScopedName(const ::rtl::OString& scope, const ::rtl::OString& type, + sal_Bool bNoNameSpace=sal_False); + + +#endif // INCLUDED_CODEMAKER_SOURCE_CUNOMAKER_CUNOTYPE_HXX + diff --git a/codemaker/source/cunomaker/makefile.mk b/codemaker/source/cunomaker/makefile.mk new file mode 100644 index 000000000000..5cc3bc99db8f --- /dev/null +++ b/codemaker/source/cunomaker/makefile.mk @@ -0,0 +1,61 @@ +#************************************************************************* +# +# 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=codemaker +TARGET=cunomaker +TARGETTYPE=CUI +LIBTARGET=NO + +ENABLE_EXCEPTIONS=TRUE + +# --- Settings ----------------------------------------------------- +.INCLUDE : settings.mk + +# --- Files -------------------------------------------------------- + +CXXFILES= cunomaker.cxx \ + cunooptions.cxx \ + cunotype.cxx + + +APP1TARGET= $(TARGET) + +APP1OBJS= $(OBJ)$/cunomaker.obj \ + $(OBJ)$/cunooptions.obj \ + $(OBJ)$/cunotype.obj + +APP1STDLIBS= \ + $(SALLIB) \ + $(SALHELPERLIB) \ + $(REGLIB) \ + +APP1LIBS= \ + $(LB)$/codemaker.lib + +.INCLUDE : target.mk |