xref: /AOO41X/main/codemaker/source/bonobowrappermaker/corbatype.hxx (revision 2037b4dea6c6e1d64a540d6f09020763cd429168)
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 _CORBAMAKER_CPPUTYPE_HXX_
25 #define _CORBAMAKER_CPPUTYPE_HXX_
26 
27 #include <codemaker/typemanager.hxx>
28 #include <codemaker/dependency.hxx>
29 
30 #include <hash_set>
31 
32 enum BASETYPE
33 {
34     BT_INVALID,
35     BT_VOID,
36     BT_ANY,
37     BT_TYPE,
38     BT_BOOLEAN,
39     BT_CHAR,
40     BT_STRING,
41     BT_FLOAT,
42     BT_DOUBLE,
43     BT_OCTET,
44     BT_BYTE,
45     BT_SHORT,
46     BT_LONG,
47     BT_HYPER,
48     BT_UNSIGNED_SHORT,
49     BT_UNSIGNED_LONG,
50     BT_UNSIGNED_HYPER
51 };
52 
53 
54 class CorbaOptions;
55 class FileStream;
56 
57 struct OStringEqual
58 {
operator ()OStringEqual59     sal_Bool operator() (const ::rtl::OString& lhs, const ::rtl::OString& rhs) const
60   { return lhs.equals( rhs );}
61 };
62 
63 struct OStringHash : public std::unary_function< const ::rtl::OString &, size_t >
64 {
operator ()OStringHash65     size_t operator()( const ::rtl::OString & rStr ) const
66         { return rStr.hashCode(); }
67 };
68 
69 typedef std::hash_set< ::rtl::OString, OStringHash, OStringEqual > TypeSet;
70 
71 class CorbaType
72 {
73 public:
74     CorbaType(TypeReader& typeReader,
75               const ::rtl::OString& typeName,
76               const TypeManager& typeMgr,
77               const TypeDependency& typeDependencies,
78               TypeSet* generatedConversion);
79 
80     virtual ~CorbaType();
81 
82     virtual sal_Bool dump(CorbaOptions* pOptions, FileStream& o, TypeSet* allreadyDumped) throw( CannotDumpException );
83     virtual sal_Bool dumpDependedTypes(CorbaOptions* pOptions, FileStream& o, TypeSet* allreadyDumped)  throw( CannotDumpException );
84     virtual sal_Bool dumpConversionFunctions(FileStream& o, TypeSet* allreadyDumped) throw( CannotDumpException );
85 
86     static  void dumpDefaultHxxIncludes(FileStream& o);
87 
88     virtual void dumpInclude(FileStream& o, TypeSet* allreadyDumped, const ::rtl::OString& typeName, sal_Char* prefix, sal_Bool bExtended=sal_False, sal_Bool bCaseSensitive=sal_False);
89     virtual void dumpDepIncludes(FileStream& o, TypeSet* allreadyDumped, const ::rtl::OString& typeName, sal_Char* prefix);
90 
91     virtual void dumpNameSpace(FileStream& o, sal_Bool bOpen = sal_True, sal_Bool bFull = sal_False, const ::rtl::OString& type="");
92     virtual void dumpFunctions(FileStream& o) = 0;
93 
94     virtual ::rtl::OString printUnoType( const ::rtl::OString& type,
95                                         sal_Bool bConst=sal_False,
96                                         sal_Bool bRef=sal_False,
97                                         sal_Bool bNative=sal_False)
98         throw( CannotDumpException );
99 
100     virtual void dumpUnoType(FileStream& o,
101                             const ::rtl::OString& type,
102                             sal_Bool bConst=sal_False,
103                             sal_Bool bRef=sal_False,
104                             sal_Bool bNative=sal_False)
105         throw( CannotDumpException );
106 
107      virtual ::rtl::OString printCorbaType(const ::rtl::OString& type,
108                                             sal_Bool bConst,
109                                             sal_Bool bRef)
110         throw( CannotDumpException );
111 
112     virtual void dumpCorbaType(FileStream& o,
113                                 const ::rtl::OString& type,
114                                 sal_Bool bConst=sal_False,
115                                 sal_Bool bRef=sal_False)
116         throw( CannotDumpException );
117 
118     sal_Bool isPassedAsPointer(const ::rtl::OString& type);
119     sal_Bool isArray(const ::rtl::OString& type);
120 
121     sal_Bool isDerivedFromUnknown(const ::rtl::OString& typeName);
122 
123 
124     ::rtl::OString printCorbaParameter(const ::rtl::OString& type,
125                                         sal_Bool bOut = sal_False)
126                                 throw( CannotDumpException );
127 
128     ::rtl::OString  getTypeClass(const ::rtl::OString& type="",
129                                 sal_Bool bCStyle=sal_False);
130     ::rtl::OString  getUnoBaseType(const ::rtl::OString& type);
131     ::rtl::OString  getCorbaBaseType(const ::rtl::OString& type);
132 
133     void    dumpTypeInit(FileStream& o, const ::rtl::OString& type);
134     BASETYPE isBaseType(const ::rtl::OString& type);
135 
136     ::rtl::OString typeToIdentifier(const ::rtl::OString& type);
137 
138     virtual sal_uInt32  getMemberCount();
139     virtual sal_uInt32  getInheritedMemberCount();
140 
141     sal_Bool isNestedTypeByName(const ::rtl::OString& type);
142 
143     void            inc(sal_uInt32 num=4);
144     void            dec(sal_uInt32 num=4);
145     ::rtl::OString  indent();
146     ::rtl::OString  indent(sal_uInt32 num);
147 protected:
148     virtual sal_uInt32  checkInheritedMemberCount(const TypeReader* pReader);
149 
150     ::rtl::OString  checkSpecialCorbaType(const ::rtl::OString& type);
151     ::rtl::OString  checkRealBaseType(const ::rtl::OString& type, sal_Bool bResolveTypeOnly = sal_False);
152 
153 protected:
154     sal_uInt32          m_inheritedMemberCount;
155     sal_uInt32          m_indentLength;
156     ::rtl::OString      m_typeName;
157     ::rtl::OString      m_name;
158     TypeReader          m_reader;
159     TypeManager&        m_typeMgr;
160     TypeDependency      m_dependencies;
161     TypeSet* m_generatedConversions;
162 };
163 
164 class InterfaceType : public CorbaType
165 {
166 public:
167     InterfaceType(TypeReader& typeReader,
168                 const ::rtl::OString& typeName,
169                 const TypeManager& typeMgr,
170                 const TypeDependency& typeDependencies,
171                 TypeSet* generatedConversion);
172 
173     virtual ~InterfaceType();
174 
175     void        dumpFunctions(FileStream& o);
176 
177     void        dumpUnoMethods(FileStream& o, sal_Bool bDeclOnly, sal_Bool bDelegateToSuper);
178     void        dumpCorbaMethods(FileStream& o, sal_Bool bDeclOnly);
179 
180     sal_uInt32  getMemberCount();
181     sal_uInt32  getInheritedMemberCount();
182 
183 protected:
184     sal_uInt32  checkInheritedMemberCount(const TypeReader* pReader);
185 
186 protected:
187     sal_uInt32  m_inheritedMemberCount;
188     sal_Bool    m_hasAttributes;
189     sal_Bool    m_hasMethods;
190 };
191 
192 class ModuleType : public CorbaType
193 {
194 public:
195     ModuleType(TypeReader& typeReader,
196                 const ::rtl::OString& typeName,
197                 const TypeManager& typeMgr,
198                 const TypeDependency& typeDependencies,
199                 TypeSet* generatedConversion);
200 
201     virtual ~ModuleType();
202 
203     sal_Bool    dumpConversionFunctions(FileStream& o, TypeSet* allreadyDumped) throw( CannotDumpException );
204     void        dumpFunctions(FileStream& o);
205     sal_Bool    hasConstants();
206 };
207 
208 class ConstantsType : public ModuleType
209 {
210 public:
211     ConstantsType(TypeReader& typeReader,
212                 const ::rtl::OString& typeName,
213                 const TypeManager& typeMgr,
214                 const TypeDependency& typeDependencies,
215                 TypeSet* generatedConversion);
216 
217     virtual ~ConstantsType();
218 
219     void dumpFunctions(FileStream& o);
220 };
221 
222 class StructureType : public CorbaType
223 {
224 public:
225     StructureType(TypeReader& typeReader,
226                 const ::rtl::OString& typeName,
227                 const TypeManager& typeMgr,
228                 const TypeDependency& typeDependencies,
229                 TypeSet* generatedConversion);
230 
231     virtual ~StructureType();
232 
233     void        dumpFunctions(FileStream& o);
234 
235     sal_Bool    dumpSuperMember(FileStream& o,  const ::rtl::OString& super, sal_Bool bWithType);
236 };
237 
238 class ExceptionType : public CorbaType
239 {
240 public:
241     ExceptionType(TypeReader& typeReader,
242                 const ::rtl::OString& typeName,
243                 const TypeManager& typeMgr,
244                 const TypeDependency& typeDependencies,
245                 TypeSet* generatedConversions);
246 
247     virtual ~ExceptionType();
248 
249     void        dumpFunctions(FileStream& o);
250 
251     sal_Bool    dumpSuperMember(FileStream& o, const ::rtl::OString& super, sal_Bool bWithType);
252 };
253 
254 class EnumType : public CorbaType
255 {
256 public:
257     EnumType(TypeReader& typeReader,
258             const ::rtl::OString& typeName,
259             const TypeManager& typeMgr,
260             const TypeDependency& typeDependencies,
261             TypeSet* generatedConversion);
262 
263     virtual ~EnumType();
264 
265     void        dumpFunctions(FileStream& o);
266 };
267 
268 class TypeDefType : public CorbaType
269 {
270 public:
271     TypeDefType(TypeReader& typeReader,
272                 const ::rtl::OString& typeName,
273                 const TypeManager& typeMgr,
274                 const TypeDependency& typeDependencies,
275                 TypeSet* generatedConversion);
276 
277     virtual ~TypeDefType();
278 
279     void dumpFunctions(FileStream& o);
280 };
281 
282 
283 sal_Bool produceType(const ::rtl::OString& typeName,
284                     TypeManager& typeMgr,
285                     TypeDependency& typeDependencies,
286                     CorbaOptions* pOptions,
287                     FileStream& o, TypeSet* allreadyDumped,
288                     TypeSet* generatedConversions)
289     throw( CannotDumpException );
290 
291 /**
292  * This function returns a C++ scoped name, represents the namespace
293  * scoping of this type, e.g. com:.sun::star::uno::XInterface. If the scope of
294  * the type is equal scope, the relativ name will be used.
295  */
296 ::rtl::OString scopedName(const ::rtl::OString& scope,
297                           const ::rtl::OString& type,
298                           sal_Bool bNoNameSpace=sal_False);
299 
300 ::rtl::OString shortScopedName(const ::rtl::OString& scope,
301                                const ::rtl::OString& type,
302                                sal_Bool bNoNameSpace=sal_False);
303 
304 
305 #endif // _CORBAMAKER_CPPUTYPE_HXX_
306 
307