1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef INCLUDED_CODEMAKER_TYPEMANAGER_HXX 25 #define INCLUDED_CODEMAKER_TYPEMANAGER_HXX 26 27 #include "codemaker/global.hxx" 28 #include "registry/registry.hxx" 29 #include "registry/types.h" 30 31 #include <hash_map> 32 #include <list> 33 34 namespace typereg { class Reader; } 35 36 //typedef ::std::list< Registry* > RegistryList; 37 typedef ::std::vector< Registry* > RegistryList; 38 typedef ::std::pair< RegistryKey, sal_Bool > KeyPair; 39 typedef ::std::vector< KeyPair > RegistryKeyList; 40 41 #if defined( _MSC_VER ) && ( _MSC_VER < 1200 ) 42 typedef ::std::__hash_map__ 43 < 44 ::rtl::OString, // Typename 45 RTTypeClass, // TypeClass 46 HashString, 47 EqualString, 48 NewAlloc 49 > T2TypeClassMap; 50 #else 51 typedef ::std::hash_map 52 < 53 ::rtl::OString, // Typename 54 RTTypeClass, // TypeClass 55 HashString, 56 EqualString 57 > T2TypeClassMap; 58 #endif 59 60 struct TypeManagerImpl 61 { TypeManagerImplTypeManagerImpl62 TypeManagerImpl() 63 : m_refCount(0) 64 {} 65 66 sal_Int32 m_refCount; 67 }; 68 69 class TypeManager 70 { 71 public: 72 TypeManager(); 73 virtual ~TypeManager(); 74 TypeManager(const TypeManager & value)75 TypeManager( const TypeManager& value ) 76 : m_pImpl( value.m_pImpl ) 77 { 78 acquire(); 79 } 80 operator =(const TypeManager & value)81 TypeManager& operator = ( const TypeManager& value ) 82 { 83 release(); 84 m_pImpl = value.m_pImpl; 85 acquire(); 86 return *this; 87 } 88 isValidType(const::rtl::OString &) const89 virtual sal_Bool isValidType(const ::rtl::OString&) const 90 { return sal_False; } 91 getTypeName(RegistryKey &) const92 virtual ::rtl::OString getTypeName(RegistryKey&) const 93 { return ::rtl::OString(); } 94 getTypeKey(const::rtl::OString &,sal_Bool * =0) const95 virtual RegistryKey getTypeKey(const ::rtl::OString&, sal_Bool * = 0 ) const 96 { return RegistryKey(); } getTypeKeys(const::rtl::OString &) const97 virtual RegistryKeyList getTypeKeys(const ::rtl::OString&) const 98 { return RegistryKeyList(); } 99 virtual typereg::Reader getTypeReader( 100 const ::rtl::OString& name, sal_Bool * pIsExtraType = 0 ) const = 0; 101 virtual typereg::Reader getTypeReader(RegistryKey& rTypeKey) const = 0; getTypeClass(const::rtl::OString &) const102 virtual RTTypeClass getTypeClass(const ::rtl::OString&) const 103 { return RT_TYPE_INVALID; } getTypeClass(RegistryKey &) const104 virtual RTTypeClass getTypeClass(RegistryKey&) const 105 { return RT_TYPE_INVALID; } 106 setBase(const::rtl::OString &)107 virtual void setBase(const ::rtl::OString&) {} getBase() const108 virtual ::rtl::OString getBase() const { return ::rtl::OString(); } 109 getSize() const110 virtual sal_Int32 getSize() const { return 0; } 111 112 static sal_Bool isBaseType(const ::rtl::OString& name); 113 protected: 114 sal_Int32 acquire(); 115 sal_Int32 release(); 116 117 protected: 118 TypeManagerImpl* m_pImpl; 119 }; 120 121 struct RegistryTypeManagerImpl 122 { RegistryTypeManagerImplRegistryTypeManagerImpl123 RegistryTypeManagerImpl() 124 : m_base("/") 125 {} 126 127 T2TypeClassMap m_t2TypeClass; 128 RegistryList m_registries; 129 RegistryList m_extra_registries; 130 ::rtl::OString m_base; 131 }; 132 133 class RegistryTypeManager : public TypeManager 134 { 135 public: 136 RegistryTypeManager(); 137 virtual ~RegistryTypeManager(); 138 RegistryTypeManager(const RegistryTypeManager & value)139 RegistryTypeManager( const RegistryTypeManager& value ) 140 : TypeManager(value) 141 , m_pImpl( value.m_pImpl ) 142 { 143 acquire(); 144 } 145 146 sal_Bool init(const StringVector& regFiles, const StringVector& extraFiles = StringVector() ); 147 148 ::rtl::OString getTypeName(RegistryKey& rTypeKey) const; 149 isValidType(const::rtl::OString & name) const150 sal_Bool isValidType(const ::rtl::OString& name) const 151 { return searchTypeKey(name, 0).isValid(); } getTypeKey(const::rtl::OString & name,sal_Bool * pIsExtraType=0) const152 RegistryKey getTypeKey( 153 const ::rtl::OString& name, sal_Bool * pIsExtraType = 0 ) const 154 { return searchTypeKey(name, pIsExtraType); } 155 RegistryKeyList getTypeKeys(const ::rtl::OString& name) const; 156 typereg::Reader getTypeReader( 157 const ::rtl::OString& name, sal_Bool * pIsExtraType = 0 ) const; 158 typereg::Reader getTypeReader(RegistryKey& rTypeKey) const; 159 RTTypeClass getTypeClass(const ::rtl::OString& name) const; 160 RTTypeClass getTypeClass(RegistryKey& rTypeKey) const; 161 162 void setBase(const ::rtl::OString& base); getBase() const163 ::rtl::OString getBase() const { return m_pImpl->m_base; } 164 getSize() const165 sal_Int32 getSize() const { return m_pImpl->m_t2TypeClass.size(); } 166 protected: 167 RegistryKey searchTypeKey( 168 const ::rtl::OString& name, sal_Bool * pIsExtraType = 0 ) const; 169 void freeRegistries(); 170 171 void acquire(); 172 void release(); 173 174 protected: 175 RegistryTypeManagerImpl* m_pImpl; 176 }; 177 178 #endif // INCLUDED_CODEMAKER_TYPEMANAGER_HXX 179