xref: /AOO41X/main/rdbmaker/inc/codemaker/typemanager.hxx (revision 976fe0bf2910aeab965f380cdb7267f53e179201)
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 #include    <hash_map>
24 
25 #ifndef _CODEMAKER_TYPEMANAGER_HXX_
26 #define _CODEMAKER_TYPEMANAGER_HXX_
27 #include    <codemaker/registry.hxx>
28 
29 typedef ::std::list< Registry* >    RegistryList;
30 
31 #if defined( _MSC_VER ) && ( _MSC_VER < 1200 )
32 typedef ::std::__hash_map__
33 <
34     ::rtl::OString, // Typename
35     RTTypeClass,    // TypeClass
36     HashString,
37     EqualString,
38     NewAlloc
39 > T2TypeClassMap;
40 #else
41 typedef ::std::hash_map
42 <
43     ::rtl::OString, // Typename
44     RTTypeClass,    // TypeClass
45     HashString,
46     EqualString
47 > T2TypeClassMap;
48 #endif
49 
50 struct TypeManagerImpl
51 {
TypeManagerImplTypeManagerImpl52     TypeManagerImpl()
53         : m_refCount(0)
54         {}
55 
56     sal_Int32       m_refCount;
57 };
58 
59 class TypeManager
60 {
61 public:
62     TypeManager();
63     virtual ~TypeManager();
64 
TypeManager(const TypeManager & value)65     TypeManager( const TypeManager& value )
66         : m_pImpl( value.m_pImpl )
67     {
68         acquire();
69     }
70 
operator =(const TypeManager & value)71     TypeManager& operator = ( const TypeManager& value )
72     {
73         release();
74         m_pImpl = value.m_pImpl;
75         acquire();
76         return *this;
77     }
78 
init(sal_Bool,const StringVector &)79     virtual sal_Bool init(sal_Bool /*bMerge*/, const StringVector& /*regFiles*/)
80         { return sal_False; }
init(const::rtl::OString &)81     virtual sal_Bool init(const ::rtl::OString& /*registryName*/)
82         { return sal_False; }
83 
isValidType(const::rtl::OString &)84     virtual sal_Bool isValidType(const ::rtl::OString& /*name*/)
85         { return sal_False; }
86 
getTypeKey(const::rtl::OString &)87     virtual RegistryKey getTypeKey(const ::rtl::OString& /*name*/)
88         { return RegistryKey(); }
getTypeReader(const::rtl::OString &)89     virtual TypeReader getTypeReader(const ::rtl::OString& /*name*/)
90         { return TypeReader(); }
getTypeClass(const::rtl::OString &)91     virtual RTTypeClass getTypeClass(const ::rtl::OString& /*name*/)
92         { return RT_TYPE_INVALID; }
93 
setBase(const::rtl::OString &)94     virtual void setBase(const ::rtl::OString& /*base*/) {}
getBase()95     virtual ::rtl::OString getBase() { return ::rtl::OString(); }
96 
getSize()97     virtual sal_Int32 getSize() { return 0; }
98 
99 protected:
100     sal_Int32 acquire();
101     sal_Int32 release();
102 
103 protected:
104     TypeManagerImpl* m_pImpl;
105 };
106 
107 struct RegistryTypeManagerImpl
108 {
RegistryTypeManagerImplRegistryTypeManagerImpl109     RegistryTypeManagerImpl()
110         : m_pMergedRegistry(NULL)
111         , m_base("/")
112         , m_isMerged(sal_False)
113         {}
114 
115     T2TypeClassMap  m_t2TypeClass;
116     RegistryList    m_registries;
117     Registry*       m_pMergedRegistry;
118     ::rtl::OString  m_base;
119     sal_Bool        m_isMerged;
120 };
121 
122 class RegistryTypeManager : public TypeManager
123 {
124 public:
125     RegistryTypeManager();
126     virtual ~RegistryTypeManager();
127 
RegistryTypeManager(const RegistryTypeManager & value)128     RegistryTypeManager( const RegistryTypeManager& value )
129         : TypeManager(value)
130         , m_pImpl( value.m_pImpl )
131     {
132         acquire();
133     }
134 /*
135     RegistryTypeManager& operator = ( const RegistryTypeManager& value )
136     {
137         release();
138         m_pImpl = value.m_pImpl;
139         acquire();
140         return *this;
141     }
142 */
143     using TypeManager::init;
144     sal_Bool init(sal_Bool bMerge, const StringVector& regFiles);
145 
isValidType(const::rtl::OString & name)146     sal_Bool    isValidType(const ::rtl::OString& name)
147         { return searchTypeKey(name).isValid(); }
getTypeKey(const::rtl::OString & name)148     RegistryKey getTypeKey(const ::rtl::OString& name)
149         { return searchTypeKey(name); }
150     TypeReader  getTypeReader(const ::rtl::OString& name);
151     RTTypeClass getTypeClass(const ::rtl::OString& name);
152 
153     void setBase(const ::rtl::OString& base);
getBase()154     ::rtl::OString getBase() { return m_pImpl->m_base; }
155 
getSize()156     sal_Int32 getSize() { return m_pImpl->m_t2TypeClass.size(); }
157 protected:
158     RegistryKey searchTypeKey(const ::rtl::OString& name);
159     void        freeRegistries();
160 
161     void acquire();
162     void release();
163 
164 protected:
165     RegistryTypeManagerImpl* m_pImpl;
166 };
167 
168 #endif // _CODEMAKER_TYPEMANAGER_HXX_
169