diff options
Diffstat (limited to 'rdbmaker/inc/codemaker')
-rw-r--r-- | rdbmaker/inc/codemaker/dependency.hxx | 170 | ||||
-rw-r--r-- | rdbmaker/inc/codemaker/global.hxx | 138 | ||||
-rw-r--r-- | rdbmaker/inc/codemaker/options.hxx | 98 | ||||
-rw-r--r-- | rdbmaker/inc/codemaker/registry.hxx | 208 | ||||
-rw-r--r-- | rdbmaker/inc/codemaker/typemanager.hxx | 172 |
5 files changed, 786 insertions, 0 deletions
diff --git a/rdbmaker/inc/codemaker/dependency.hxx b/rdbmaker/inc/codemaker/dependency.hxx new file mode 100644 index 000000000000..138aad46999b --- /dev/null +++ b/rdbmaker/inc/codemaker/dependency.hxx @@ -0,0 +1,170 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CODEMAKER_DEPENDENCY_HXX_ +#define _CODEMAKER_DEPENDENCY_HXX_ + +#include <hash_map> +#include <registry/registry.hxx> +#ifndef __REGISTRY_REFLREAD_HXX__ +#include <registry/reflread.hxx> +#endif +#include <codemaker/typemanager.hxx> +#include <codemaker/global.hxx> +#include <osl/diagnose.h> + +#define TYPEUSE_NORMAL 0x0001 +#define TYPEUSE_SUPER 0x0002 +#define TYPEUSE_MEMBER 0x0004 +#define TYPEUSE_INPARAM 0x0008 +#define TYPEUSE_OUTPARAM 0x0010 +#define TYPEUSE_INOUTPARAM 0x0020 +#define TYPEUSE_RETURN 0x0040 +#define TYPEUSE_EXCEPTION 0x0080 +#define TYPEUSE_SCOPE 0x0100 + +/** + * Flag shows the state of the code generation. If the Flag is set + * the code for this type is generated. + */ +#define CODEGEN_DEFAULT 0x0001 + +struct TypeUsing +{ + TypeUsing(const ::rtl::OString& type, sal_uInt16 use) + : m_type(type) + , m_use(use) + {} + + ::rtl::OString m_type; + sal_uInt16 m_use; + + sal_Bool operator == (const TypeUsing & typeUsing) const + { + OSL_ASSERT(0); + return m_type == typeUsing.m_type && m_use == typeUsing.m_use; + } +}; + +struct LessTypeUsing +{ + sal_Bool operator()(const TypeUsing& tuse1, const TypeUsing& tuse2) const + { + return (tuse1.m_type < tuse2.m_type); + } +}; + +typedef ::std::set< TypeUsing, LessTypeUsing > TypeUsingSet; + + +#if (defined( _MSC_VER ) && ( _MSC_VER < 1200 )) +typedef ::std::__hash_map__ +< + ::rtl::OString, + TypeUsingSet, + HashString, + EqualString, + NewAlloc +> DependencyMap; + +typedef ::std::__hash_map__ +< + ::rtl::OString, + sal_uInt16, + HashString, + EqualString, + NewAlloc +> GenerationMap; +#else +typedef ::std::hash_map +< + ::rtl::OString, + TypeUsingSet, + HashString, + EqualString +> DependencyMap; + +typedef ::std::hash_map +< + ::rtl::OString, + sal_uInt16, + HashString, + EqualString +> GenerationMap; + +#endif + +struct TypeDependencyImpl +{ + TypeDependencyImpl() + : m_refCount(0) + {} + + sal_Int32 m_refCount; + DependencyMap m_dependencies; + GenerationMap m_generatedTypes; +}; + +class TypeDependency +{ +public: + TypeDependency(); + ~TypeDependency(); + + TypeDependency( const TypeDependency& value ) + : m_pImpl( value.m_pImpl ) + { + acquire(); + } + + TypeDependency& operator = ( const TypeDependency& value ) + { + release(); + m_pImpl = value.m_pImpl; + acquire(); + return *this; + } + + sal_Bool insert(const ::rtl::OString& type, const ::rtl::OString& depend, sal_uInt16); + TypeUsingSet getDependencies(const ::rtl::OString& type); + sal_Bool hasDependencies(const ::rtl::OString& type); + + void setGenerated(const ::rtl::OString& type, sal_uInt16 genFlag=CODEGEN_DEFAULT); + sal_Bool isGenerated(const ::rtl::OString& type, sal_uInt16 genFlag=CODEGEN_DEFAULT); + + sal_Int32 getSize() { return m_pImpl->m_generatedTypes.size(); } +protected: + void acquire(); + void release(); + +protected: + TypeDependencyImpl* m_pImpl; +}; + +sal_Bool checkTypeDependencies(TypeManager& typeMgr, TypeDependency& dependencies, const ::rtl::OString& type, sal_Bool bDepend = sal_False); + +#endif // _CODEMAKER_DEPENDENCY_HXX_ diff --git a/rdbmaker/inc/codemaker/global.hxx b/rdbmaker/inc/codemaker/global.hxx new file mode 100644 index 000000000000..dc12fd833811 --- /dev/null +++ b/rdbmaker/inc/codemaker/global.hxx @@ -0,0 +1,138 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CODEMAKER_GLOBAL_HXX_ +#define _CODEMAKER_GLOBAL_HXX_ + +#include <list> +#include <vector> +#include <set> + +#include <stdio.h> +#include <rtl/ustring.hxx> +#include <rtl/strbuf.hxx> + +struct EqualString +{ + sal_Bool operator()(const ::rtl::OString& str1, const ::rtl::OString& str2) const + { + return (str1 == str2); + } +}; + +struct HashString +{ + size_t operator()(const ::rtl::OString& str) const + { + return str.hashCode(); + } +}; + +struct LessString +{ + sal_Bool operator()(const ::rtl::OString& str1, const ::rtl::OString& str2) const + { + return (str1 < str2); + } +}; + +#if defined(_MSC_VER) && _MSC_VER < 1200 +typedef ::std::new_alloc NewAlloc; +#endif + + +typedef ::std::list< ::rtl::OString > StringList; +typedef ::std::vector< ::rtl::OString > StringVector; +typedef ::std::set< ::rtl::OString, LessString > StringSet; + +::rtl::OString makeTempName(); + +const ::rtl::OString inGlobalSet(const ::rtl::OUString & r); + +::rtl::OUString convertToFileUrl(const ::rtl::OString& fileName); + +//************************************************************************* +// FileStream +//************************************************************************* +enum FileAccessMode +{ + FAM_READ, // "r" + FAM_WRITE, // "w" + FAM_APPEND, // "a" + FAM_READWRITE_EXIST, // "r+" + FAM_READWRITE, // "w+" + FAM_READAPPEND // "a+" +}; + +class FileStream //: public ofstream +{ +public: + FileStream(); + virtual ~FileStream(); + + sal_Bool isValid(); + + void open(const ::rtl::OString& name, FileAccessMode nMode = FAM_READWRITE); + void close(); + + ::rtl::OString getName() { return m_name; } + + // friend functions + friend FileStream &operator<<(FileStream& o, sal_uInt32 i) + { fprintf(o.m_pFile, "%lu", sal::static_int_cast< unsigned long >(i)); + return o; + } + friend FileStream &operator<<(FileStream& o, char const * s) + { fprintf(o.m_pFile, "%s", s); + return o; + } + friend FileStream &operator<<(FileStream& o, ::rtl::OString* s) + { fprintf(o.m_pFile, "%s", s->getStr()); + return o; + } + friend FileStream &operator<<(FileStream& o, const ::rtl::OString& s) + { fprintf(o.m_pFile, "%s", s.getStr()); + return o; + } + friend FileStream &operator<<(FileStream& o, ::rtl::OStringBuffer* s) + { fprintf(o.m_pFile, "%s", s->getStr()); + return o; + } + friend FileStream &operator<<(FileStream& o, const ::rtl::OStringBuffer& s) + { fprintf(o.m_pFile, "%s", s.getStr()); + return o; + } + +protected: + const sal_Char* checkAccessMode(FileAccessMode mode); + + FILE* m_pFile; + ::rtl::OString m_name; +}; + +#endif // _CODEMAKER_GLOBAL_HXX_ + diff --git a/rdbmaker/inc/codemaker/options.hxx b/rdbmaker/inc/codemaker/options.hxx new file mode 100644 index 000000000000..a4e6d53981c9 --- /dev/null +++ b/rdbmaker/inc/codemaker/options.hxx @@ -0,0 +1,98 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CODEMAKER_OPTIONS_HXX_ +#define _CODEMAKER_OPTIONS_HXX_ + +#include <hash_map> +#include <codemaker/global.hxx> + +#if defined( _MSC_VER ) && ( _MSC_VER < 1200 ) +typedef ::std::__hash_map__ +< + ::rtl::OString, + ::rtl::OString, + HashString, + EqualString, + NewAlloc +> OptionMap; +#else +typedef ::std::hash_map +< + ::rtl::OString, + ::rtl::OString, + HashString, + EqualString +> OptionMap; +#endif + +class CannotDumpException +{ +public: + CannotDumpException(const ::rtl::OString& msg) + : m_message(msg) {} + + ::rtl::OString m_message; +}; + + +class IllegalArgument +{ +public: + IllegalArgument(const ::rtl::OString& msg) + : m_message(msg) {} + + ::rtl::OString m_message; +}; + + +class Options +{ +public: + Options(); + virtual ~Options(); + + virtual sal_Bool initOptions(int ac, char* av[], sal_Bool bCmdFile=sal_False) + throw( IllegalArgument ) = 0; + + virtual ::rtl::OString prepareHelp() = 0; + + const ::rtl::OString& getProgramName() const; + sal_Bool isValid(const ::rtl::OString& option); + const ::rtl::OString getOption(const ::rtl::OString& option) + throw( IllegalArgument ); + + const StringVector& getInputFiles(); + +protected: + ::rtl::OString m_program; + StringVector m_inputFiles; + OptionMap m_options; +}; + +#endif // _CODEMAKER_OPTIONS_HXX_ + diff --git a/rdbmaker/inc/codemaker/registry.hxx b/rdbmaker/inc/codemaker/registry.hxx new file mode 100644 index 000000000000..09030a77026a --- /dev/null +++ b/rdbmaker/inc/codemaker/registry.hxx @@ -0,0 +1,208 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CODEMAKER_REGISTRY_HXX_ +#define _CODEMAKER_REGISTRY_HXX_ + +#include <rtl/alloc.h> +#include <osl/interlck.h> +#include <registry/registry.hxx> +#include "registry/reader.hxx" +#include "registry/version.h" +#include <codemaker/options.hxx> + +struct TypeReader_Impl +{ + TypeReader_Impl(const sal_uInt8* buffer, + sal_uInt32 bufferLen, + sal_Bool copyData) + : m_refCount(0) + , m_copyData(copyData) + , m_blopSize(bufferLen) + , m_pBlop(buffer) + { + if (copyData) + { + m_pBlop = (sal_uInt8*)rtl_allocateMemory(bufferLen); + rtl_copyMemory((void*)m_pBlop, buffer, bufferLen); + } else + { + m_blopSize = bufferLen; + m_pBlop = buffer; + } + + m_pReader = new typereg::Reader( + m_pBlop, m_blopSize, false, TYPEREG_VERSION_1); + } + + ~TypeReader_Impl() + { + if (m_copyData && m_pReader) + { + delete m_pReader; + } + } + + sal_Int32 m_refCount; + sal_Bool m_copyData; + sal_Int32 m_blopSize; + const sal_uInt8* m_pBlop; + typereg::Reader* m_pReader; +}; + +class TypeReader +{ +/* + inline TypeReader(const RegistryTypeReader_Api* pApi, + const sal_uInt8* buffer, + sal_uInt32 bufferLen, + sal_Bool copyData); +*/ +public: + inline TypeReader() + : m_pImpl(NULL) + {} + + inline TypeReader( const sal_uInt8* buffer, + sal_uInt32 bufferLen, + sal_Bool copyData) + { + m_pImpl = new TypeReader_Impl(buffer, bufferLen, copyData); + acquire(); + } + + inline TypeReader(const TypeReader& toCopy) + : m_pImpl(toCopy.m_pImpl) + { + acquire(); + } + + inline ~TypeReader() + { + release(); + } + + inline void acquire() + { + if (m_pImpl) + osl_incrementInterlockedCount(&m_pImpl->m_refCount); + } + + inline void release() + { + if (m_pImpl && 0 == osl_decrementInterlockedCount(&m_pImpl->m_refCount)) + { + delete m_pImpl; + } + } + + inline TypeReader& operator = ( const TypeReader& value ) + { + release(); + m_pImpl = value.m_pImpl; + acquire(); + return *this; + } + + inline sal_Bool isValid() const + { + if (m_pImpl) + return m_pImpl->m_pReader->isValid(); + else + return sal_False; + } + + inline RTTypeClass getTypeClass() const + { return m_pImpl->m_pReader->getTypeClass(); } + inline const ::rtl::OString getTypeName() const + { return inGlobalSet( m_pImpl->m_pReader->getTypeName() ); } + inline sal_uInt16 getSuperTypeCount() const + { return m_pImpl->m_pReader->getSuperTypeCount(); } + inline const ::rtl::OString getSuperTypeName(sal_uInt16 index) const + { return inGlobalSet( m_pImpl->m_pReader->getSuperTypeName(index) ); } + inline const ::rtl::OString getDoku() const + { return inGlobalSet( m_pImpl->m_pReader->getDocumentation() ); } + inline const ::rtl::OString getFileName() const + { return inGlobalSet( m_pImpl->m_pReader->getFileName() ); } + inline sal_uInt32 getFieldCount() const + { return m_pImpl->m_pReader->getFieldCount(); } + inline const ::rtl::OString getFieldName( sal_uInt16 index ) const + { return inGlobalSet( m_pImpl->m_pReader->getFieldName(index) ); } + inline const ::rtl::OString getFieldType( sal_uInt16 index ) const + { return inGlobalSet( m_pImpl->m_pReader->getFieldTypeName(index) ); } + inline RTFieldAccess getFieldAccess( sal_uInt16 index ) const + { return m_pImpl->m_pReader->getFieldFlags(index); } + inline RTConstValue getFieldConstValue( sal_uInt16 index ) const + { return m_pImpl->m_pReader->getFieldValue(index); } + inline const ::rtl::OString getFieldDoku( sal_uInt16 index ) const + { return inGlobalSet( m_pImpl->m_pReader->getFieldDocumentation(index) ); } + inline const ::rtl::OString getFieldFileName( sal_uInt16 index ) const + { return inGlobalSet( m_pImpl->m_pReader->getFieldFileName(index) ); } + inline sal_uInt32 getMethodCount() const + { return m_pImpl->m_pReader->getMethodCount(); } + inline const ::rtl::OString getMethodName( sal_uInt16 index ) const + { return inGlobalSet( m_pImpl->m_pReader->getMethodName(index) ); } + inline sal_uInt32 getMethodParamCount( sal_uInt16 index ) const + { return m_pImpl->m_pReader->getMethodParameterCount(index); } + inline const ::rtl::OString getMethodParamType( sal_uInt16 index, sal_uInt16 paramIndex ) const + { return inGlobalSet( m_pImpl->m_pReader->getMethodParameterTypeName(index,paramIndex) ); } + inline const ::rtl::OString getMethodParamName( sal_uInt16 index, sal_uInt16 paramIndex ) const + { return inGlobalSet( m_pImpl->m_pReader->getMethodParameterName(index,paramIndex) ); } + inline RTParamMode getMethodParamMode( sal_uInt16 index, sal_uInt16 paramIndex ) const + { return m_pImpl->m_pReader->getMethodParameterFlags(index,paramIndex); } + inline sal_uInt32 getMethodExcCount( sal_uInt16 index ) const + { return m_pImpl->m_pReader->getMethodExceptionCount(index); } + inline const ::rtl::OString getMethodExcType( sal_uInt16 index, sal_uInt16 excIndex ) const + { return inGlobalSet( m_pImpl->m_pReader->getMethodExceptionTypeName(index,excIndex) ); } + inline const ::rtl::OString getMethodReturnType( sal_uInt16 index ) const + { return inGlobalSet( m_pImpl->m_pReader->getMethodReturnTypeName(index) ); } + inline RTMethodMode getMethodMode( sal_uInt16 index ) const + { return m_pImpl->m_pReader->getMethodFlags(index); } + inline const ::rtl::OString getMethodDoku( sal_uInt16 index ) const + { return inGlobalSet( m_pImpl->m_pReader->getMethodDocumentation(index) ); } + + inline sal_uInt32 getReferenceCount() const + { return m_pImpl->m_pReader->getReferenceCount(); } + inline const ::rtl::OString getReferenceName( sal_uInt16 index ) const + { return inGlobalSet( m_pImpl->m_pReader->getReferenceTypeName(index) ); } + inline RTReferenceType getReferenceType( sal_uInt16 index ) const + { return m_pImpl->m_pReader->getReferenceSort(index); } + inline const ::rtl::OString getReferenceDoku( sal_uInt16 index ) const + { return inGlobalSet( m_pImpl->m_pReader->getReferenceDocumentation(index) ); } + + inline sal_uInt32 getBlopSize() const + { return m_pImpl->m_blopSize; } + + inline const sal_uInt8* getBlop() const + { return m_pImpl->m_pBlop; } + +private: + TypeReader_Impl* m_pImpl; +}; + + +#endif // _CODEMAKER_REGISTRY_HXX_ diff --git a/rdbmaker/inc/codemaker/typemanager.hxx b/rdbmaker/inc/codemaker/typemanager.hxx new file mode 100644 index 000000000000..a776865e677f --- /dev/null +++ b/rdbmaker/inc/codemaker/typemanager.hxx @@ -0,0 +1,172 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#include <hash_map> + +#ifndef _CODEMAKER_TYPEMANAGER_HXX_ +#define _CODEMAKER_TYPEMANAGER_HXX_ +#include <codemaker/registry.hxx> + +typedef ::std::list< Registry* > RegistryList; + +#if defined( _MSC_VER ) && ( _MSC_VER < 1200 ) +typedef ::std::__hash_map__ +< + ::rtl::OString, // Typename + RTTypeClass, // TypeClass + HashString, + EqualString, + NewAlloc +> T2TypeClassMap; +#else +typedef ::std::hash_map +< + ::rtl::OString, // Typename + RTTypeClass, // TypeClass + HashString, + EqualString +> T2TypeClassMap; +#endif + +struct TypeManagerImpl +{ + TypeManagerImpl() + : m_refCount(0) + {} + + sal_Int32 m_refCount; +}; + +class TypeManager +{ +public: + TypeManager(); + virtual ~TypeManager(); + + TypeManager( const TypeManager& value ) + : m_pImpl( value.m_pImpl ) + { + acquire(); + } + + TypeManager& operator = ( const TypeManager& value ) + { + release(); + m_pImpl = value.m_pImpl; + acquire(); + return *this; + } + + virtual sal_Bool init(sal_Bool /*bMerge*/, const StringVector& /*regFiles*/) + { return sal_False; } + virtual sal_Bool init(const ::rtl::OString& /*registryName*/) + { return sal_False; } + + virtual sal_Bool isValidType(const ::rtl::OString& /*name*/) + { return sal_False; } + + virtual RegistryKey getTypeKey(const ::rtl::OString& /*name*/) + { return RegistryKey(); } + virtual TypeReader getTypeReader(const ::rtl::OString& /*name*/) + { return TypeReader(); } + virtual RTTypeClass getTypeClass(const ::rtl::OString& /*name*/) + { return RT_TYPE_INVALID; } + + virtual void setBase(const ::rtl::OString& /*base*/) {} + virtual ::rtl::OString getBase() { return ::rtl::OString(); } + + virtual sal_Int32 getSize() { return 0; } + +protected: + sal_Int32 acquire(); + sal_Int32 release(); + +protected: + TypeManagerImpl* m_pImpl; +}; + +struct RegistryTypeManagerImpl +{ + RegistryTypeManagerImpl() + : m_pMergedRegistry(NULL) + , m_base("/") + , m_isMerged(sal_False) + {} + + T2TypeClassMap m_t2TypeClass; + RegistryList m_registries; + Registry* m_pMergedRegistry; + ::rtl::OString m_base; + sal_Bool m_isMerged; +}; + +class RegistryTypeManager : public TypeManager +{ +public: + RegistryTypeManager(); + virtual ~RegistryTypeManager(); + + RegistryTypeManager( const RegistryTypeManager& value ) + : TypeManager(value) + , m_pImpl( value.m_pImpl ) + { + acquire(); + } +/* + RegistryTypeManager& operator = ( const RegistryTypeManager& value ) + { + release(); + m_pImpl = value.m_pImpl; + acquire(); + return *this; + } +*/ + using TypeManager::init; + sal_Bool init(sal_Bool bMerge, const StringVector& regFiles); + + sal_Bool isValidType(const ::rtl::OString& name) + { return searchTypeKey(name).isValid(); } + RegistryKey getTypeKey(const ::rtl::OString& name) + { return searchTypeKey(name); } + TypeReader getTypeReader(const ::rtl::OString& name); + RTTypeClass getTypeClass(const ::rtl::OString& name); + + void setBase(const ::rtl::OString& base); + ::rtl::OString getBase() { return m_pImpl->m_base; } + + sal_Int32 getSize() { return m_pImpl->m_t2TypeClass.size(); } +protected: + RegistryKey searchTypeKey(const ::rtl::OString& name); + void freeRegistries(); + + void acquire(); + void release(); + +protected: + RegistryTypeManagerImpl* m_pImpl; +}; + +#endif // _CODEMAKER_TYPEMANAGER_HXX_ |