| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // 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).isEmpty() ) |
| { |
| 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).isEmpty() && |
| 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.isEmpty() ) |
| { |
| 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.isEmpty() || 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.isEmpty() ) |
| 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.isEmpty() ) |
| { |
| 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.isEmpty() ) |
| 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.isEmpty() ) |
| { |
| 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.isEmpty() ) |
| { |
| 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.isEmpty() ? type : m_typeName ); |
| RTTypeClass rtTypeClass = RT_TYPE_INVALID; |
| |
| if ( !type.isEmpty() ) |
| { |
| 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.isEmpty() ) |
| { |
| 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.isEmpty() ) |
| { |
| 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.isEmpty() ) |
| { |
| 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.isEmpty() ) |
| 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.isEmpty() && !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.isEmpty() ) |
| 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.isEmpty() ) |
| { |
| 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.isEmpty() ) |
| 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.isEmpty() ) |
| 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.isEmpty() ) |
| { |
| 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.isEmpty() ) |
| 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.isEmpty() ) |
| 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(); |
| } |
| |
| |