xref: /AOO41X/main/codemaker/source/bonobowrappermaker/corbatype.cxx (revision 9d8e7fba6924780c2093139852107433cac37537)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_codemaker.hxx"
26 
27 #include <stdio.h>
28 #include    <rtl/alloc.h>
29 #include    <rtl/ustring.hxx>
30 #include    <rtl/strbuf.hxx>
31 
32 #include    "corbatype.hxx"
33 #include    "corbaoptions.hxx"
34 
35 #include <hash_set>
36 #include <list>
37 
38 using namespace rtl;
39 
40 
41 //*************************************************************************
42 // CorbaType
43 //*************************************************************************
CorbaType(TypeReader & typeReader,const OString & typeName,const TypeManager & typeMgr,const TypeDependency & typeDependencies,TypeSet * generatedConversions)44 CorbaType::CorbaType(TypeReader& typeReader,
45         const OString& typeName,
46         const TypeManager& typeMgr,
47         const TypeDependency& typeDependencies,
48         TypeSet* generatedConversions)
49     : m_inheritedMemberCount(0)
50     , m_indentLength(0)
51     , m_typeName(typeName)
52     , m_reader(typeReader)
53     , m_typeMgr((TypeManager&)typeMgr)
54     , m_dependencies(typeDependencies)
55     , m_generatedConversions(generatedConversions)
56 {
57     sal_Int32 i = typeName.lastIndexOf('/');
58     m_name = typeName.copy( i != -1 ? i+1 : 0 );
59 }
60 
~CorbaType()61 CorbaType::~CorbaType()
62 {
63 
64 }
65 
isNestedTypeByName(const::rtl::OString & type)66 sal_Bool CorbaType::isNestedTypeByName(const ::rtl::OString& type)
67 {
68     sal_Bool ret = sal_False;
69 
70     sal_Int32 i = type.lastIndexOf('/');
71 
72     if (i >= 0)
73     {
74         OString outerTypeName(type.copy(0, i));
75         ret = (m_typeMgr.getTypeClass(outerTypeName) == RT_TYPE_INTERFACE);
76     }
77 
78     return ret;
79 }
80 
dump(CorbaOptions * pOptions,FileStream & o,TypeSet * allreadyDumped)81 sal_Bool CorbaType::dump(CorbaOptions* pOptions, FileStream& o, TypeSet* allreadyDumped)
82     throw( CannotDumpException )
83 {
84     sal_Bool ret = sal_False;
85 
86     ret = dumpConversionFunctions(o, allreadyDumped);
87 
88     return ret;
89 }
90 
dumpDependedTypes(CorbaOptions * pOptions,FileStream & o,TypeSet * allreadyDumped)91 sal_Bool CorbaType::dumpDependedTypes(CorbaOptions* pOptions, FileStream& o, TypeSet* allreadyDumped)
92     throw( CannotDumpException )
93 {
94     sal_Bool ret = sal_True;
95 
96     TypeUsingSet usingSet(m_dependencies.getDependencies(m_typeName));
97 
98     TypeUsingSet::const_iterator iter = usingSet.begin();
99     OString typeName;
100     sal_uInt32 index = 0;
101     while (iter != usingSet.end())
102     {
103         typeName = (*iter).m_type;
104         if ((index = typeName.lastIndexOf(']')) > 0)
105             typeName = typeName.copy(index + 1);
106 
107         if ( getUnoBaseType(typeName).isEmpty() )
108         {
109             if (!produceType(typeName,
110                 m_typeMgr,
111                 m_dependencies,
112                 pOptions,
113                 o, allreadyDumped, m_generatedConversions))
114             {
115     fprintf(stderr, "%s ERROR: %s\n",
116             pOptions->getProgramName().getStr(),
117             OString("cannot dump Type '" + typeName + "'").getStr());
118     exit(99);
119             }
120         }
121         ++iter;
122     }
123 
124     return ret;
125 }
126 
dumpConversionFunctions(FileStream & o,TypeSet * allreadyDumped)127 sal_Bool CorbaType::dumpConversionFunctions(FileStream& o, TypeSet* allreadyDumped)
128     throw( CannotDumpException )
129 {
130     if (m_typeName.lastIndexOf(']') < 0)
131     {
132         dumpInclude(o, allreadyDumped, m_typeName, "hpp", sal_False);
133         dumpDepIncludes(o, allreadyDumped, m_typeName, "hpp");
134 
135         dumpFunctions(o);
136     }
137 
138     return sal_True;
139 }
140 
141 
dumpDefaultHxxIncludes(FileStream & o)142 void CorbaType::dumpDefaultHxxIncludes(FileStream& o)
143 {
144     o << "#ifndef _OSL_MUTEX_HXX_\n"
145       << "#include <osl/mutex.hxx>\n"
146       << "#endif\n\n";
147 
148     o << "#ifndef _RTL_USTRING_HXX_\n"
149       << "#include <rtl/ustring.hxx>\n"
150       << "#endif\n\n";
151 
152     o << "#ifndef _COM_SUN_STAR_UNO_TYPE_HXX_\n"
153       << "#include <com/sun/star/uno/Type.hxx>\n"
154       << "#endif\n";
155 
156     o << "#ifndef _COM_SUN_STAR_UNO_ANY_HXX_\n"
157       << "#include <com/sun/star/uno/Any.hxx>\n"
158       << "#endif\n";
159 
160     o << "#ifndef _COM_SUN_STAR_UNO_REFERENCE_HXX_\n"
161       << "#include <com/sun/star/uno/Reference.hxx>\n"
162       << "#endif\n";
163 
164     o << "#ifndef _COM_SUN_STAR_UNO_XINTERFACE_HPP_\n"
165       << "#include <com/sun/star/uno/XInterface.hpp>\n"
166       << "#endif\n";
167 
168     o << "#ifndef _BONOBO_NULLINTERFACE_HPP_\n"
169       << "#include <Bonobo/NullInterface.hpp>\n"
170       << "#endif\n";
171 
172     o << "#ifndef _COM_SUN_STAR_UNO_EXCEPTION_HPP_\n"
173       << "#include <com/sun/star/uno/Exception.hpp>\n"
174       << "#endif\n";
175 
176     o << "#ifndef _COM_SUN_STAR_UNO_RUNTIMEEXCEPTION_HPP_\n"
177       << "#include <com/sun/star/uno/RuntimeException.hpp>\n"
178       << "#endif\n";
179 
180     o << "#ifndef _COM_SUN_STAR_UNO_SEQUENCE_HXX_\n"
181       << "#include <com/sun/star/uno/Sequence.hxx>\n"
182       << "#endif\n";
183 }
184 
185 
dumpInclude(FileStream & o,TypeSet * allreadyDumped,const OString & typeName,sal_Char * prefix,sal_Bool bExtended,sal_Bool bCaseSensitive)186 void CorbaType::dumpInclude(FileStream& o, TypeSet* allreadyDumped, const OString& typeName, sal_Char* prefix, sal_Bool bExtended, sal_Bool bCaseSensitive)
187 {
188     OString realTypeName = checkRealBaseType( typeName );
189 
190     if (!isNestedTypeByName(typeName) &&
191         (BT_INVALID == isBaseType(realTypeName)) &&
192         !realTypeName.equals("Bonobo/NullInterface") &&
193         !realTypeName.equals("com/sun/star/uno/XInterface") &&
194         !realTypeName.equals("com/sun/star/uno/TypeClass") &&
195         !realTypeName.equals("com/sun/star/uno/Type") &&
196         !realTypeName.equals("com/sun/star/uno/Exception") &&
197         !realTypeName.equals("com/sun/star/uno/RuntimeException"))
198     {
199         TypeSet::const_iterator iter = allreadyDumped->find(realTypeName);
200 
201         if (iter == allreadyDumped->end())
202         {
203             allreadyDumped->insert(realTypeName);
204 
205             sal_uInt32 length = 3+ m_typeName.getLength() + strlen(prefix);
206 
207             if (bExtended)
208                 length += m_name.getLength() + 1;
209 
210             OStringBuffer tmpBuf(length);
211 
212             tmpBuf.append('_');
213             tmpBuf.append(typeName);
214             tmpBuf.append('_');
215             if (bExtended)
216             {
217                 tmpBuf.append(m_name);
218                 tmpBuf.append('_');
219             }
220             tmpBuf.append(prefix);
221             tmpBuf.append('_');
222 
223             OString tmp(tmpBuf.makeStringAndClear().replace('/', '_').toAsciiUpperCase());
224 
225             length = 1 + typeName.getLength() + strlen(prefix);
226             if (bExtended)
227                 length += m_name.getLength() + 1;
228 
229             tmpBuf.ensureCapacity(length);
230             tmpBuf.append(typeName);
231             if (bExtended)
232             {
233                 tmpBuf.append('/');
234                 tmpBuf.append(m_name);
235             }
236             tmpBuf.append('.');
237             tmpBuf.append(prefix);
238 
239             o << "#ifndef " << tmp << "\n#include <";
240             if (bCaseSensitive)
241             {
242                 o << tmpBuf.makeStringAndClear();
243             } else
244             {
245                 o << tmpBuf.makeStringAndClear();
246             }
247 
248             o << ">\n";
249             o << "#endif\n";
250 
251             o << "namespace bonobobridge {\n\n";
252 
253             std::list<OString> nestedTypes;
254 
255             do
256             {
257                 if ((realTypeName.lastIndexOf(']') < 0) &&
258                     (BT_INVALID == isBaseType(realTypeName)) &&
259                     !realTypeName.equals("Bonobo/NullInterface") &&
260                     !realTypeName.equals("com/sun/star/uno/XInterface") &&
261                     !realTypeName.equals("com/sun/star/uno/TypeClass") &&
262                     !realTypeName.equals("com/sun/star/uno/Type") &&
263                     !realTypeName.equals("com/sun/star/uno/Exception") &&
264                     !realTypeName.equals("com/sun/star/uno/RuntimeException") &&
265                     !realTypeName.equals("com/sun/star/uno/TypeClass"))
266                 {
267                     o << "inline sal_Bool cpp_convert_b2u(";
268                     dumpUnoType(o, realTypeName, sal_False, sal_True);
269                     o << " u, ";
270                     dumpCorbaType(o, realTypeName, sal_True, sal_True);
271                     o << " b, const ::vos::ORef< ::bonobobridge::Bridge >& bridge);\n";
272                     o << "inline sal_Bool cpp_convert_u2b(";
273                     dumpCorbaType(o, realTypeName, sal_False, sal_True);
274                     o << " b, ";
275                     dumpUnoType(o, realTypeName, sal_True, sal_True);
276                     o << " u, const ::vos::ORef< ::bonobobridge::Bridge >& bridge);\n";
277                 }
278 
279                 RegistryKey key = m_typeMgr.getTypeKey(realTypeName);
280                 RegistryKeyNames nestedTypeNames;
281                 key.getKeyNames(OUString(), nestedTypeNames);
282                 for (sal_uInt32 i = 0; i < nestedTypeNames.getLength(); i++)
283                 {
284                     OString nTypeName(OUStringToOString(nestedTypeNames.getElement(i), RTL_TEXTENCODING_UTF8));
285 
286                     nTypeName = checkRealBaseType(nTypeName.copy(5));
287 
288                     if (BT_INVALID == isBaseType(nTypeName))
289                     {
290                         allreadyDumped->insert(nTypeName);
291                         nestedTypes.push_back(nTypeName);
292                     }
293                 }
294 
295                 if (nestedTypes.size() > 0)
296                 {
297                     realTypeName = nestedTypes.front();
298                     nestedTypes.pop_front();
299                 }
300                 else
301                 {
302                     realTypeName = "";
303                 }
304             }
305             while ( !realTypeName.isEmpty() );
306 
307             o << "}; // namespace bonobobridge\n";
308         }
309     }
310 }
311 
dumpDepIncludes(FileStream & o,TypeSet * allreadyDumped,const OString & typeName,sal_Char * prefix)312 void CorbaType::dumpDepIncludes(FileStream& o, TypeSet* allreadyDumped, const OString& typeName, sal_Char* prefix)
313 {
314     TypeUsingSet usingSet(m_dependencies.getDependencies(typeName));
315 
316     TypeUsingSet::const_iterator iter = usingSet.begin();
317 
318     OString     sPrefix(OString(prefix).toAsciiUpperCase());
319     sal_Bool    bSequenceDumped = sal_False;
320     sal_Bool    bInterfaceDumped = sal_False;
321     sal_uInt32  index = 0;
322     sal_uInt32  seqNum = 0;
323     OString     relType;
324     while (iter != usingSet.end())
325     {
326         index = (*iter).m_type.lastIndexOf(']');
327         seqNum = (index > 0 ? ((index+1) / 2) : 0);
328 
329         relType = (*iter).m_type;
330         if (index > 0)
331             relType = relType.copy(index+1);
332 
333         if (!isNestedTypeByName(relType))
334         {
335             OString defPrefix("HXX");
336             if (sPrefix.equals("HDL"))
337                 defPrefix = "H";
338 
339             if (seqNum > 0 && !bSequenceDumped)
340             {
341                 bSequenceDumped = sal_True;
342             }
343 
344             if ( getUnoBaseType(relType).isEmpty() &&
345                  m_typeName != relType)
346             {
347                 if (m_typeMgr.getTypeClass(relType) == RT_TYPE_INTERFACE
348                     && sPrefix.equals("HDL"))
349                 {
350                     if (!bInterfaceDumped)
351                     {
352                         bInterfaceDumped = sal_True;
353                     }
354 
355                     if (!((*iter).m_use & TYPEUSE_SUPER))
356                     {
357                         o << "\n";
358                         dumpNameSpace(o, sal_True, sal_False, relType);
359                         o << "\nclass " << scopedName(m_typeName, relType, sal_True) << ";\n";
360                         dumpNameSpace(o, sal_False, sal_False, relType);
361                         o << "\n\n";
362                     } else
363                     {
364                         dumpInclude(o, allreadyDumped, relType, prefix);
365                     }
366                 } else
367                 {
368                     dumpInclude(o, allreadyDumped, relType, prefix);
369                 }
370             }
371         }
372         ++iter;
373     }
374 }
375 
dumpNameSpace(FileStream & o,sal_Bool bOpen,sal_Bool bFull,const OString & type)376 void CorbaType::dumpNameSpace(FileStream& o, sal_Bool bOpen, sal_Bool bFull, const OString& type)
377 {
378     OString typeName(type);
379     sal_Bool bOneLine = sal_True;
380     if ( typeName.isEmpty() )
381     {
382         typeName = m_typeName;
383         bOneLine = sal_False;
384     }
385 
386     if (typeName == "/")
387         return;
388 
389     if (typeName.indexOf( '/' ) == -1 && !bFull)
390         return;
391 
392     if (!bFull)
393         typeName = typeName.copy( 0, typeName.lastIndexOf( '/' ) );
394 
395     if (bOpen)
396     {
397         sal_Int32 nIndex = 0;
398         do
399         {
400             o << "namespace " << typeName.getToken(0, '/', nIndex);
401             if (bOneLine)
402                 o << " { ";
403             else
404                 o << "\n{\n";
405         } while( nIndex != -1 );
406     } else
407     {
408         sal_Int32 nPos = 0;
409         do
410         {
411             nPos = typeName.lastIndexOf( '/' );
412             o << "}";
413             if( bOneLine )
414                 o << " ";
415             else
416                 o << " // " << typeName.copy( nPos+1 ) << "\n";
417             if( nPos != -1 )
418                 typeName = typeName.copy( 0, nPos );
419         } while( nPos != -1 );
420     }
421 }
422 
423 
getMemberCount()424 sal_uInt32 CorbaType::getMemberCount()
425 {
426     sal_uInt32 count = m_reader.getMethodCount();
427 
428     sal_uInt32 fieldCount = m_reader.getFieldCount();
429     RTFieldAccess access = RT_ACCESS_INVALID;
430     for (sal_uInt16 i=0; i < fieldCount; i++)
431     {
432         access = m_reader.getFieldAccess(i);
433 
434         if (access != RT_ACCESS_CONST && access != RT_ACCESS_INVALID)
435             count++;
436     }
437     return count;
438 }
439 
checkInheritedMemberCount(const TypeReader * pReader)440 sal_uInt32 CorbaType::checkInheritedMemberCount(const TypeReader* pReader)
441 {
442     sal_Bool bSelfCheck = sal_True;
443     if (!pReader)
444     {
445         bSelfCheck = sal_False;
446         pReader = &m_reader;
447     }
448 
449     sal_uInt32 count = 0;
450     OString superType(pReader->getSuperTypeName());
451     if ( !superType.isEmpty() )
452     {
453         TypeReader aSuperReader(m_typeMgr.getTypeReader(superType));
454         if ( aSuperReader.isValid() )
455         {
456             count = checkInheritedMemberCount(&aSuperReader);
457         }
458     }
459 
460     if (bSelfCheck)
461     {
462         count += pReader->getMethodCount();
463         sal_uInt32 fieldCount = pReader->getFieldCount();
464         RTFieldAccess access = RT_ACCESS_INVALID;
465         for (sal_uInt16 i=0; i < fieldCount; i++)
466         {
467             access = pReader->getFieldAccess(i);
468 
469             if (access != RT_ACCESS_CONST && access != RT_ACCESS_INVALID)
470                 count++;
471         }
472     }
473 
474     return count;
475 }
476 
getInheritedMemberCount()477 sal_uInt32 CorbaType::getInheritedMemberCount()
478 {
479     if (m_inheritedMemberCount == 0)
480     {
481         m_inheritedMemberCount = checkInheritedMemberCount(0);
482     }
483 
484     return m_inheritedMemberCount;
485 }
486 
getTypeClass(const OString & type,sal_Bool bCStyle)487 OString CorbaType::getTypeClass(const OString& type, sal_Bool bCStyle)
488 {
489     OString     typeName = ( !type.isEmpty() ? type : m_typeName);
490     RTTypeClass rtTypeClass = RT_TYPE_INVALID;
491 
492     if ( !type.isEmpty() )
493     {
494         typeName = type;
495         rtTypeClass = m_typeMgr.getTypeClass(typeName);
496     } else
497     {
498         typeName = m_typeName;
499         rtTypeClass = m_reader.getTypeClass();
500     }
501 
502     if (typeName.lastIndexOf(']') > 0)
503         return bCStyle ? "typelib_TypeClass_SEQUENCE" : "::com::sun::star::uno::TypeClass_SEQUENCE";
504 
505     switch (rtTypeClass)
506     {
507         case RT_TYPE_INTERFACE:
508             return bCStyle ? "typelib_TypeClass_INTERFACE" : "::com::sun::star::uno::TypeClass_INTERFACE";
509             break;
510         case RT_TYPE_MODULE:
511             return bCStyle ? "typelib_TypeClass_MODULE" : "::com::sun::star::uno::TypeClass_MODULE";
512             break;
513         case RT_TYPE_STRUCT:
514             return bCStyle ? "typelib_TypeClass_STRUCT" : "::com::sun::star::uno::TypeClass_STRUCT";
515             break;
516         case RT_TYPE_ENUM:
517             return bCStyle ? "typelib_TypeClass_ENUM" : "::com::sun::star::uno::TypeClass_ENUM";
518             break;
519         case RT_TYPE_EXCEPTION:
520             return bCStyle ? "typelib_TypeClass_EXCEPTION" : "::com::sun::star::uno::TypeClass_EXCEPTION";
521             break;
522         case RT_TYPE_TYPEDEF:
523             {
524     OString realType = checkRealBaseType( typeName );
525     return getTypeClass( realType, bCStyle );
526             }
527 //          return bCStyle ? "typelib_TypeClass_TYPEDEF" : "::com::sun::star::uno::TypeClass_TYPEDEF";
528             break;
529         case RT_TYPE_SERVICE:
530             return bCStyle ? "typelib_TypeClass_SERVICE" : "::com::sun::star::uno::TypeClass_SERVICE";
531             break;
532         case RT_TYPE_INVALID:
533             {
534                 if (type.equals("long"))
535                     return bCStyle ? "typelib_TypeClass_LONG" : "::com::sun::star::uno::TypeClass_LONG";
536                 if (type.equals("short"))
537                     return bCStyle ? "typelib_TypeClass_SHORT" : "::com::sun::star::uno::TypeClass_SHORT";
538                 if (type.equals("hyper"))
539                     return bCStyle ? "typelib_TypeClass_HYPER" : "::com::sun::star::uno::TypeClass_HYPER";
540                 if (type.equals("string"))
541                     return bCStyle ? "typelib_TypeClass_STRING" : "::com::sun::star::uno::TypeClass_STRING";
542                 if (type.equals("boolean"))
543                     return bCStyle ? "typelib_TypeClass_BOOLEAN" : "::com::sun::star::uno::TypeClass_BOOLEAN";
544                 if (type.equals("char"))
545                     return bCStyle ? "typelib_TypeClass_CHAR" : "::com::sun::star::uno::TypeClass_CHAR";
546                 if (type.equals("byte"))
547                     return bCStyle ? "typelib_TypeClass_BYTE" : "::com::sun::star::uno::TypeClass_BYTE";
548                 if (type.equals("any"))
549                     return bCStyle ? "typelib_TypeClass_ANY" : "::com::sun::star::uno::TypeClass_ANY";
550                 if (type.equals("type"))
551                     return bCStyle ? "typelib_TypeClass_TYPE" : "::com::sun::star::uno::TypeClass_TYPE";
552                 if (type.equals("float"))
553                     return bCStyle ? "typelib_TypeClass_FLOAT" : "::com::sun::star::uno::TypeClass_FLOAT";
554                 if (type.equals("double"))
555                     return bCStyle ? "typelib_TypeClass_DOUBLE" : "::com::sun::star::uno::TypeClass_DOUBLE";
556                 if (type.equals("void"))
557                     return bCStyle ? "typelib_TypeClass_VOID" : "::com::sun::star::uno::TypeClass_VOID";
558                 if (type.equals("unsigned long"))
559                     return bCStyle ? "typelib_TypeClass_UNSIGNED_LONG" : "::com::sun::star::uno::TypeClass_UNSIGNED_LONG";
560                 if (type.equals("unsigned short"))
561                     return bCStyle ? "typelib_TypeClass_UNSIGNED_SHORT" : "::com::sun::star::uno::TypeClass_UNSIGNED_SHORT";
562                 if (type.equals("unsigned hyper"))
563                     return bCStyle ? "typelib_TypeClass_UNSIGNED_HYPER" : "::com::sun::star::uno::TypeClass_UNSIGNED_HYPER";
564             }
565             break;
566     }
567 
568     return bCStyle ? "typelib_TypeClass_UNKNOWN" : "::com::sun::star::uno::TypeClass_UNKNOWN";
569 }
570 
printUnoType(const OString & type,sal_Bool bConst,sal_Bool bRef,sal_Bool bNative)571 OString CorbaType::printUnoType(const OString& type, sal_Bool bConst, sal_Bool bRef, sal_Bool bNative)
572     throw( CannotDumpException )
573 {
574     OStringBuffer ret(1024);
575     OString sType(checkRealBaseType(type, sal_True));
576     sal_uInt32 index = sType.lastIndexOf(']');
577     sal_uInt32 seqNum = (index > 0 ? ((index+1) / 2) : 0);
578 
579     OString relType = (index > 0 ? (sType).copy(index+1) : type);
580 
581     RTTypeClass typeClass = m_typeMgr.getTypeClass(relType);
582 
583     if (bConst) ret.append("const ");
584 
585     sal_uInt32 i;
586     for (i=0; i < seqNum; i++)
587     {
588         ret.append("::com::sun::star::uno::Sequence< ");
589     }
590 
591     switch (typeClass)
592     {
593     case RT_TYPE_INTERFACE:
594         if (bNative)
595             ret.append(scopedName(m_typeName, relType));
596         else
597             ret.append("::com::sun::star::uno::Reference< ").append(scopedName(m_typeName, relType)).append(" >");
598         break;
599     case RT_TYPE_INVALID:
600     {
601         OString tmp(getUnoBaseType(relType));
602         if ( !tmp.isEmpty() )
603         {
604             ret.append(getUnoBaseType(relType));
605         } else
606             throw CannotDumpException("Unknown type '" + relType + "', incomplete type library. ("+type+")");
607     }
608     break;
609     case RT_TYPE_STRUCT:
610     case RT_TYPE_ENUM:
611     case RT_TYPE_TYPEDEF:
612     case RT_TYPE_EXCEPTION:
613         ret.append(scopedName(m_typeName, relType));
614         break;
615     }
616 
617     for (i=0; i < seqNum; i++)
618     {
619         ret.append(" >");
620     }
621 
622     if (bRef) ret.append("&");
623     return ret.makeStringAndClear();
624 }
625 
dumpUnoType(FileStream & o,const OString & type,sal_Bool bConst,sal_Bool bRef,sal_Bool bNative)626 void CorbaType::dumpUnoType(FileStream& o, const OString& type,
627             sal_Bool bConst, sal_Bool bRef, sal_Bool bNative)
628     throw( CannotDumpException )
629 {
630     OString ret = printUnoType(type, bConst, bRef, bNative);
631     o << ret;
632 }
633 
printCorbaType(const OString & type,sal_Bool bConst,sal_Bool bRef)634 OString CorbaType::printCorbaType(const OString& type, sal_Bool bConst, sal_Bool bRef)
635     throw( CannotDumpException )
636 {
637     OStringBuffer ret(1024);
638 
639     OString sType(type);
640 
641     sal_uInt32 index = sType.lastIndexOf(']');
642     sal_uInt32 seqNum = (index > 0 ? ((index+1) / 2) : 0);
643 
644     OString relType = (index > 0 ? (sType).copy(index+1) : type);
645 
646     RTTypeClass typeClass = m_typeMgr.getTypeClass(relType);
647 
648     if (relType.equals("com/sun/star/uno/XInterface"))
649         relType = "Bonobo/Unknown";
650 
651     if (relType.equals("com/sun/star/uno/TypeClass"))
652         relType = "CORBA_TypeCode";
653 
654     if (relType.equals("com/sun/star/uno/RuntimeException"))
655         relType = "CORBA_SystemException";
656 
657     if (relType.equals("com/sun/star/uno/Exception"))
658         relType = "CORBA_any";
659 
660     if (bConst) ret.append("const ");
661 
662 
663     sal_uInt32 i;
664     for (i=0; i < seqNum; i++)
665     {
666         ret.append("CORBA_sequence_");
667     }
668 
669     switch (typeClass)
670     {
671     case RT_TYPE_INTERFACE:
672         ret.append(relType.replace('/', '_'));
673         break;
674     case RT_TYPE_INVALID:
675     {
676         OString tmp(getUnoBaseType(relType));
677         if ( !tmp.isEmpty() )
678             ret.append(getCorbaBaseType(relType));
679         else
680             throw CannotDumpException("Unknown type '" + relType + "', incomplete type library. ("+type+")");
681     }
682     break;
683     case RT_TYPE_STRUCT:
684     case RT_TYPE_ENUM:
685     case RT_TYPE_TYPEDEF:
686     case RT_TYPE_EXCEPTION:
687         ret.append(relType.replace('/', '_'));
688         break;
689     }
690 
691     if (bRef) ret.append("&");
692 
693     return ret.makeStringAndClear();
694 }
695 
isPassedAsPointer(const OString & type)696 sal_Bool CorbaType::isPassedAsPointer(const OString& type)
697 {
698     sal_Bool ret = sal_False;
699 
700     OString sType(checkSpecialCorbaType(type));
701 
702     sal_Int32 index = sType.lastIndexOf(']');
703     sal_Int32 seqNum = (index > 0 ? ((index+1) / 2) : 0);
704 
705     OString relType = (index > 0 ? (sType).copy(index+1) : type);
706 
707     if (index > 0)
708     {
709         OString fakeTest;
710 
711         sal_Int32 j = type.lastIndexOf('/');
712         if (j >= 0)
713             fakeTest = type.copy(0, j+1)+"_faked_array_"+type.copy(j+1);
714         else
715             fakeTest = "_faked_array_"+sType;
716 
717         TypeReader fakeTestReader = m_typeMgr.getTypeReader(fakeTest);
718 
719         if (fakeTestReader.isValid())
720             ret = sal_False;
721         else
722             ret = sal_True;
723     }
724     else
725     {
726         RTTypeClass typeClass = m_typeMgr.getTypeClass(sType);
727 
728         switch (typeClass)
729         {
730         case RT_TYPE_STRUCT:
731         case RT_TYPE_EXCEPTION:
732             ret = sal_True;
733             break;
734 
735         case RT_TYPE_INTERFACE:
736         case RT_TYPE_ENUM:
737         case RT_TYPE_INVALID:
738             if (sType.equals("any"))
739                 ret = sal_True;
740             else
741                 ret = sal_False;
742             break;
743         }
744     }
745 
746     return ret;
747 }
748 
isDerivedFromUnknown(const::rtl::OString & typeName)749 sal_Bool CorbaType::isDerivedFromUnknown(const ::rtl::OString& typeName)
750 {
751     sal_Bool ret = sal_True;
752     if ( typeName.isEmpty() )
753         ret = sal_False;
754     else if (typeName.equals("Bonobo/NullInterface"))
755         ret = sal_False;
756     else if (typeName.equals("com/sun/star/uno/XInterface"))
757         ret = sal_True;
758     else
759     {
760         TypeReader reader(m_typeMgr.getTypeReader(typeName));
761         if (reader.isValid())
762             ret = isDerivedFromUnknown(reader.getSuperTypeName());
763         else
764             ret = sal_False;
765     }
766     return ret;
767 }
768 
769 
isArray(const OString & type)770 sal_Bool CorbaType::isArray(const OString& type)
771 {
772     sal_Bool ret = sal_False;
773 
774     OString sType(checkSpecialCorbaType(type));
775 
776     sal_Int32 index = sType.lastIndexOf(']');
777     sal_Int32 seqNum = (index > 0 ? ((index+1) / 2) : 0);
778 
779     OString relType = (index > 0 ? (sType).copy(index+1) : type);
780 
781     if (index > 0)
782     {
783         OString fakeTest;
784 
785         sal_Int32 j = type.lastIndexOf('/');
786         if (j >= 0)
787             fakeTest = type.copy(0, j+1)+"_faked_array_"+type.copy(j+1);
788         else
789             fakeTest = "_faked_array_"+sType;
790 
791         TypeReader fakeTestReader = m_typeMgr.getTypeReader(fakeTest);
792 
793         if (fakeTestReader.isValid())
794             ret = sal_True;
795     }
796 
797     return ret;
798 }
799 
printCorbaParameter(const OString & type,sal_Bool bOut)800 OString CorbaType::printCorbaParameter(const OString& type, sal_Bool bOut)
801     throw( CannotDumpException )
802 {
803     OStringBuffer ret(1024);
804 
805     OString sType(type);
806     sal_Int32 index = sType.lastIndexOf(']');
807     sal_Int32 seqNum = (index > 0 ? ((index+1) / 2) : 0);
808 
809     OString relType = (index > 0 ? (sType).copy(index+1) : type);
810 
811     RTTypeClass typeClass = m_typeMgr.getTypeClass(relType);
812 
813     if (relType.equals("Bonobo/NullInterface"))
814         relType = "CORBA_Object";
815 
816     if (relType.equals("com/sun/star/uno/XInterface"))
817         relType = "Bonobo/Unknown";
818 
819     if (relType.equals("com/sun/star/uno/TypeClass"))
820         relType = "CORBA_TypeCode";
821 
822     if (relType.equals("com/sun/star/uno/RuntimeException"))
823         relType = "CORBA_SystemException";
824 
825     if (relType.equals("com/sun/star/uno/Exception"))
826         relType = "CORBA_any";
827 
828     int i;
829     for (i=0; i < seqNum; i++)
830     {
831         ret.append("CORBA_sequence_");
832     }
833 
834     switch (typeClass)
835     {
836     case RT_TYPE_INTERFACE:
837         ret.append(relType.replace('/', '_'));
838         break;
839     case RT_TYPE_INVALID:
840     {
841         OString tmp(getUnoBaseType(relType));
842         if ( !tmp.isEmpty() )
843         {
844             ret.append(getCorbaBaseType(relType));
845         } else
846             throw CannotDumpException("Unknown type '" + relType + "', incomplete type library. ("+type+")");
847     }
848     break;
849     case RT_TYPE_STRUCT:
850     case RT_TYPE_EXCEPTION:
851     case RT_TYPE_ENUM:
852     case RT_TYPE_TYPEDEF:
853         ret.append(relType.replace('/', '_'));
854         break;
855     }
856 
857     return ret.makeStringAndClear();
858 }
859 
dumpCorbaType(FileStream & o,const OString & type,sal_Bool bConst,sal_Bool bRef)860 void CorbaType::dumpCorbaType(FileStream& o, const OString& type,
861             sal_Bool bConst, sal_Bool bRef)
862     throw( CannotDumpException )
863 {
864     OString ret = printCorbaType(type, bConst, bRef);
865     o << ret;
866 }
867 
getUnoBaseType(const OString & type)868 OString CorbaType::getUnoBaseType(const OString& type)
869 {
870     if (type.equals("long"))
871         return "sal_Int32";
872     if (type.equals("short"))
873         return "sal_Int16";
874     if (type.equals("hyper"))
875         return "sal_Int64";
876     if (type.equals("string"))
877         return "::rtl::OUString";
878     if (type.equals("boolean"))
879         return "sal_Bool";
880     if (type.equals("char"))
881         return "sal_Unicode";
882     if (type.equals("byte"))
883         return "sal_Int8";
884     if (type.equals("any"))
885         return "::com::sun::star::uno::Any";
886     if (type.equals("type"))
887         return "::com::sun::star::uno::Type";
888     if (type.equals("float"))
889         return "float";
890     if (type.equals("double"))
891         return "double";
892     if (type.equals("octet"))
893         return "sal_Int8";
894     if (type.equals("void"))
895         return type;
896     if (type.equals("unsigned long"))
897         return "sal_uInt32";
898     if (type.equals("unsigned short"))
899         return "sal_uInt16";
900     if (type.equals("unsigned hyper"))
901         return "sal_uInt64";
902 
903     return OString();
904 }
905 
getCorbaBaseType(const OString & type)906 OString CorbaType::getCorbaBaseType(const OString& type)
907 {
908     if (type.equals("long"))
909         return "CORBA_long";
910     if (type.equals("short"))
911         return "CORBA_short";
912     if (type.equals("hyper"))
913         return "CORBA_long_long";
914     if (type.equals("string"))
915         return "CORBA_char*";
916     if (type.equals("boolean"))
917         return "CORBA_boolean";
918     if (type.equals("char"))
919         return "CORBA_char";
920     if (type.equals("byte"))
921         return "CORBA_octet";
922     if (type.equals("any"))
923         return "CORBA_any";
924     if (type.equals("type"))
925         return "CORBA_TypeCode";
926     if (type.equals("float"))
927         return "CORBA_float";
928     if (type.equals("double"))
929         return "CORBA_double";
930     if (type.equals("octet"))
931         return "CORBA_octet";
932     if (type.equals("void"))
933         return type;
934     if (type.equals("unsigned long"))
935         return "CORBA_unsigned_long";
936     if (type.equals("unsigned short"))
937         return "CORBA_unsigned_short";
938     if (type.equals("unsigned hyper"))
939         return "CORBA_unsigned_long_long";
940 
941     return OString();
942 }
943 
944 
dumpTypeInit(FileStream & o,const OString & typeName)945 void CorbaType::dumpTypeInit(FileStream& o, const OString& typeName)
946 {
947     OString type(checkSpecialCorbaType(typeName));
948 
949     BASETYPE baseType = isBaseType(type);
950 
951     switch (baseType)
952     {
953         case BT_BOOLEAN:
954             o << "(sal_False)";
955             return;
956             break;
957         case BT_ANY:
958         case BT_STRING:
959             o << "()";
960             return;
961             break;
962         case BT_INVALID:
963             break;
964         default:
965             o << "((";
966             dumpUnoType(o, type);
967             o << ")" << "0)";
968             return;
969     }
970 
971     RTTypeClass typeClass = m_typeMgr.getTypeClass(type);
972 
973     if (typeClass == RT_TYPE_ENUM)
974     {
975         RegistryTypeReaderLoader aReaderLoader;
976 
977         if (aReaderLoader.isLoaded())
978         {
979             TypeReader reader(m_typeMgr.getTypeReader(type));
980 
981             if ( reader.isValid() )
982             {
983                 sal_Int32 nPos = type.lastIndexOf( '/' );
984                 o << "(" << shortScopedName("", type, sal_False)
985                   << "::" << type.copy( nPos != -1 ? nPos+1 : 0 )
986                   << "_" << reader.getFieldName(0) << ")";
987                 return;
988             }
989         }
990     }
991 
992     o << "()";
993 }
994 
isBaseType(const OString & type)995 BASETYPE CorbaType::isBaseType(const OString& type)
996 {
997     if (type.equals("long"))
998         return BT_LONG;
999     if (type.equals("short"))
1000         return BT_SHORT;
1001     if (type.equals("hyper"))
1002         return BT_HYPER;
1003     if (type.equals("string"))
1004         return BT_STRING;
1005     if (type.equals("boolean"))
1006         return BT_BOOLEAN;
1007     if (type.equals("char"))
1008         return BT_CHAR;
1009     if (type.equals("byte"))
1010         return BT_BYTE;
1011     if (type.equals("any"))
1012         return BT_ANY;
1013     if (type.equals("float"))
1014         return BT_FLOAT;
1015     if (type.equals("double"))
1016         return BT_DOUBLE;
1017     if (type.equals("void"))
1018         return BT_VOID;
1019     if (type.equals("unsigned long"))
1020         return BT_UNSIGNED_LONG;
1021     if (type.equals("unsigned short"))
1022         return BT_UNSIGNED_SHORT;
1023     if (type.equals("unsigned hyper"))
1024         return BT_UNSIGNED_HYPER;
1025 
1026     return BT_INVALID;
1027 }
1028 
typeToIdentifier(const OString & type)1029 OString CorbaType::typeToIdentifier(const OString& type)
1030 {
1031     sal_uInt32 index = type.lastIndexOf(']');
1032     sal_uInt32 seqNum = (index > 0 ? ((index+1) / 2) : 0);
1033 
1034     OString relType = (index > 0 ? ((OString)type).copy(index+1) : type);
1035     OString sIdentifier;
1036 
1037     while( seqNum > 0 )
1038     {
1039         sIdentifier += OString("seq");
1040 
1041         if ( --seqNum == 0 )
1042         {
1043             sIdentifier += OString("_");
1044         }
1045     }
1046 
1047     if ( isBaseType(relType) )
1048     {
1049         sIdentifier += relType.replace(' ', '_');
1050     } else
1051     {
1052         sIdentifier += relType.replace('/', '_');
1053     }
1054 
1055 
1056     return sIdentifier;
1057 }
1058 
checkSpecialCorbaType(const OString & type)1059 OString CorbaType::checkSpecialCorbaType(const OString& type)
1060 {
1061     OString baseType(type);
1062 
1063     RegistryTypeReaderLoader & rReaderLoader = getRegistryTypeReaderLoader();
1064 
1065     RegistryKey     key;
1066     sal_uInt8*      pBuffer=NULL;
1067     RTTypeClass     typeClass;
1068     sal_Bool        isTypeDef = (m_typeMgr.getTypeClass(baseType) == RT_TYPE_TYPEDEF);
1069     TypeReader      reader;
1070 
1071     while (isTypeDef)
1072     {
1073         reader = m_typeMgr.getTypeReader(baseType);
1074 
1075         if (reader.isValid())
1076         {
1077             typeClass = reader.getTypeClass();
1078 
1079             if (typeClass == RT_TYPE_TYPEDEF)
1080                 baseType = reader.getSuperTypeName();
1081             else
1082                 isTypeDef = sal_False;
1083         } else
1084             break;
1085     }
1086 
1087     return baseType;
1088 }
1089 
checkRealBaseType(const OString & type,sal_Bool bResolveTypeOnly)1090 OString CorbaType::checkRealBaseType(const OString& type, sal_Bool bResolveTypeOnly)
1091 {
1092     sal_uInt32 index = type.lastIndexOf(']');
1093     OString baseType = (index > 0 ? ((OString)type).copy(index+1) : type);
1094     OString seqPrefix = (index > 0 ? ((OString)type).copy(0, index+1) : OString());
1095 
1096     RegistryTypeReaderLoader & rReaderLoader = getRegistryTypeReaderLoader();
1097 
1098     RegistryKey     key;
1099     sal_uInt8*      pBuffer=NULL;
1100     RTTypeClass     typeClass;
1101     sal_Bool        mustBeChecked = (m_typeMgr.getTypeClass(baseType) == RT_TYPE_TYPEDEF);
1102     TypeReader      reader;
1103 
1104     while (mustBeChecked)
1105     {
1106         reader = m_typeMgr.getTypeReader(baseType);
1107 
1108         if (reader.isValid())
1109         {
1110             typeClass = reader.getTypeClass();
1111 
1112             if (typeClass == RT_TYPE_TYPEDEF)
1113             {
1114                 baseType = reader.getSuperTypeName();
1115                 index = baseType.lastIndexOf(']');
1116                 if (index > 0)
1117                 {
1118                     seqPrefix += baseType.copy(0, index+1);
1119                     baseType = baseType.copy(index+1);
1120                 }
1121             } else
1122                 mustBeChecked = sal_False;
1123         } else
1124             break;
1125     }
1126 
1127     if ( bResolveTypeOnly )
1128         baseType = seqPrefix + baseType;
1129 
1130     return baseType;
1131 }
1132 
1133 
inc(sal_uInt32 num)1134 void CorbaType::inc(sal_uInt32 num)
1135 {
1136     m_indentLength += num;
1137 }
1138 
dec(sal_uInt32 num)1139 void CorbaType::dec(sal_uInt32 num)
1140 {
1141     if (m_indentLength - num < 0)
1142         m_indentLength = 0;
1143     else
1144         m_indentLength -= num;
1145 }
1146 
indent()1147 OString CorbaType::indent()
1148 {
1149     OStringBuffer tmp(m_indentLength);
1150 
1151     for (sal_uInt32 i=0; i < m_indentLength; i++)
1152     {
1153         tmp.append(' ');
1154     }
1155     return tmp.makeStringAndClear();
1156 }
1157 
indent(sal_uInt32 num)1158 OString CorbaType::indent(sal_uInt32 num)
1159 {
1160     OStringBuffer tmp(m_indentLength + num);
1161 
1162     for (sal_uInt32 i=0; i < m_indentLength + num; i++)
1163     {
1164         tmp.append(' ');
1165     }
1166     return tmp.makeStringAndClear();
1167 }
1168 
1169 //*************************************************************************
1170 // InterfaceType
1171 //*************************************************************************
InterfaceType(TypeReader & typeReader,const OString & typeName,const TypeManager & typeMgr,const TypeDependency & typeDependencies,TypeSet * generatedConversions)1172 InterfaceType::InterfaceType(TypeReader& typeReader,
1173                                 const OString& typeName,
1174                                 const TypeManager& typeMgr,
1175                                 const TypeDependency& typeDependencies,
1176                                 TypeSet* generatedConversions)
1177     : CorbaType(typeReader, typeName, typeMgr, typeDependencies, generatedConversions)
1178 {
1179     m_inheritedMemberCount = 0;
1180     m_hasAttributes = sal_False;
1181     m_hasMethods = sal_False;
1182 }
1183 
~InterfaceType()1184 InterfaceType::~InterfaceType()
1185 {
1186 
1187 }
1188 
1189 
dumpUnoMethods(FileStream & o,sal_Bool bDeclOnly,sal_Bool bDelegateToSuper)1190 void InterfaceType::dumpUnoMethods(FileStream& o, sal_Bool bDeclOnly, sal_Bool bDelegateToSuper)
1191 {
1192     OString superName(m_reader.getSuperTypeName());
1193     if (bDeclOnly &&
1194         !superName.equals("Bonobo/NullInterface") &&
1195         !superName.equals("com/sun/star/uno/XInterface"))
1196     {
1197         TypeReader reader(m_typeMgr.getTypeReader(superName));
1198         InterfaceType iType(reader, superName, m_typeMgr, TypeDependency(), m_generatedConversions);
1199         iType.inc();
1200         iType.dumpUnoMethods(o, bDeclOnly, sal_True);
1201     }
1202 
1203     sal_uInt32 methodCount = m_reader.getMethodCount();
1204     sal_Bool first=sal_True;
1205 
1206     OString methodName, returnType, paramType, paramName;
1207     sal_uInt32 paramCount = 0;
1208     sal_uInt32 excCount = 0;
1209     RTMethodMode methodMode = RT_MODE_INVALID;
1210     RTParamMode  paramMode = RT_PARAM_INVALID;
1211 
1212     sal_Bool bRef = sal_False;
1213     sal_Bool bConst = sal_False;
1214     sal_Bool bWithRunTimeExcp = sal_True;
1215 
1216     for (sal_uInt16 i=0; i < methodCount; i++)
1217     {
1218         methodName = m_reader.getMethodName(i);
1219         returnType = m_reader.getMethodReturnType(i);
1220         paramCount = m_reader.getMethodParamCount(i);
1221         excCount = m_reader.getMethodExcCount(i);
1222         methodMode = m_reader.getMethodMode(i);
1223 
1224         if ( methodName.equals("acquire") || methodName.equals("release") )
1225             bWithRunTimeExcp = sal_False;
1226 
1227         if (first)
1228         {
1229             first = sal_False;
1230             o << "\n" << indent() << "// Methods\n";
1231         }
1232 
1233         o << indent();
1234         if (bDeclOnly)
1235             o << "virtual ";
1236         dumpUnoType(o, returnType);
1237         o << " SAL_CALL ";
1238         if (!bDeclOnly)
1239         {
1240             o << "bonobobridge::BonoboWrapper_";
1241             dumpCorbaType(o, m_typeName, sal_False, sal_False);
1242             o << "::";
1243         }
1244 
1245         o << methodName << "( ";
1246 
1247         sal_uInt16 j;
1248         for (j=0; j < paramCount; j++)
1249         {
1250             paramName = m_reader.getMethodParamName(i, j);
1251             paramType = m_reader.getMethodParamType(i, j);
1252             paramMode = m_reader.getMethodParamMode(i, j);
1253 
1254             switch (paramMode)
1255             {
1256             case RT_PARAM_IN:
1257             {
1258                 OString relType = checkSpecialCorbaType(paramType);
1259                 if (m_typeMgr.getTypeClass(relType) == RT_TYPE_ENUM ||
1260                     (isBaseType(relType) && !relType.equals("string") && !relType.equals("any")))
1261                 {
1262                     bConst = sal_False;
1263                     bRef = sal_False;
1264                 } else
1265                 {
1266                     bConst = sal_True;
1267                     bRef = sal_True;
1268                 }
1269                 break;
1270             }
1271             case RT_PARAM_OUT:
1272             case RT_PARAM_INOUT:
1273                 bConst = sal_False;
1274                 bRef = sal_True;
1275                 break;
1276             }
1277 
1278             dumpUnoType(o, paramType, bConst, bRef);
1279             o << " " << paramName;
1280 
1281             if (j+1 < paramCount) o << ", ";
1282         }
1283         o << "  )";
1284 
1285         o << "   throw(";
1286         OString excpName;
1287         for (j=0; j < excCount; j++)
1288         {
1289             excpName = m_reader.getMethodExcType(i, j);
1290             if (excpName != "com/sun/star/uno/RuntimeException")
1291                 o << scopedName(m_typeName, excpName);
1292             if (bWithRunTimeExcp)
1293                 o << ", ";
1294         }
1295 
1296         if ( bWithRunTimeExcp )
1297         {
1298             o << "  ::com::sun::star::uno::RuntimeException";
1299         }
1300 
1301         if (bDeclOnly && bDelegateToSuper)
1302         {
1303             o << " ) {\n";
1304             if (returnType.equals("void"))
1305                 o << indent() << "  ";
1306             else
1307                 o << indent() << "  return ";
1308             o << "BonoboWrapper_";
1309             dumpCorbaType(o, m_typeName, sal_False, sal_False);
1310             o << "::" << methodName << "( ";
1311             for (j = 0; j < paramCount; j++)
1312             {
1313                 paramName = m_reader.getMethodParamName(i, j);
1314                 o << paramName;
1315                 if (j < (paramCount-1))
1316                     o << ", ";
1317             }
1318             o << " );\n"
1319                     << indent() << "}\n";
1320         }
1321         else if (!bDeclOnly)
1322         {
1323             o << " ) {\n";
1324 
1325             OStringBuffer preBuffer(1024);
1326             OStringBuffer callBuffer(1024);
1327             OStringBuffer postBuffer(1024);
1328 
1329             callBuffer.append("    ");
1330 
1331             if (!returnType.equals("void"))
1332             {
1333                 preBuffer.append("    ");
1334                 preBuffer.append(printCorbaParameter(returnType));
1335                 if (isPassedAsPointer(returnType))
1336                     preBuffer.append("*");
1337                 preBuffer.append(" _b_ret;\n");
1338                 preBuffer.append("    ");
1339                 preBuffer.append(printUnoType(returnType, sal_False, sal_False));
1340                 preBuffer.append(" _u_ret;\n");
1341 
1342                 callBuffer.append("_b_ret = ");
1343             }
1344 
1345             callBuffer.append(printCorbaType(m_typeName, sal_False, sal_False));
1346             callBuffer.append("_");
1347             if (methodName.indexOf("_reserved_identifier_") == 0)
1348                 callBuffer.append(methodName.copy(OString("_reserved_identifier_").getLength()));
1349             else
1350                 callBuffer.append(methodName);
1351 
1352             callBuffer.append("( m_corbaObject");
1353 
1354             for (j=0; j < paramCount; j++)
1355             {
1356                 paramName = m_reader.getMethodParamName(i, j);
1357                 paramType = m_reader.getMethodParamType(i, j);
1358                 paramMode = m_reader.getMethodParamMode(i, j);
1359 
1360                 preBuffer.append("    ");
1361                 preBuffer.append(printCorbaParameter(paramType));
1362                 if (isPassedAsPointer(paramType) && (paramMode == RT_PARAM_OUT))
1363                 {
1364                     preBuffer.append("* _b_");
1365                     preBuffer.append(paramName);
1366                     preBuffer.append(";\n");
1367                 }
1368                 else
1369                 {
1370                     preBuffer.append(" _b_");
1371                     preBuffer.append(paramName);
1372                     preBuffer.append(";\n");
1373                 }
1374 
1375                 switch (paramMode) {
1376                 case RT_PARAM_IN:
1377 
1378                     if (isArray(paramType))
1379                         preBuffer.append("    // fix me: conversion of array types!\n");
1380                     else
1381                     {
1382                         preBuffer.append("    cpp_convert_u2b(");
1383                         preBuffer.append("_b_");
1384                         preBuffer.append(paramName);
1385                         preBuffer.append(", ");
1386                         preBuffer.append(paramName);
1387                         preBuffer.append(", m_bridge);\n");
1388                     }
1389 
1390                     if (isPassedAsPointer(paramType))
1391                         callBuffer.append(", &_b_");
1392                     else
1393                         callBuffer.append(", _b_");
1394                     break;
1395                 case RT_PARAM_INOUT:
1396 
1397                     if (isArray(paramType))
1398                         preBuffer.append("    // fix me: conversion of array types!\n");
1399                     else
1400                     {
1401                         preBuffer.append("    cpp_convert_u2b(");
1402                         if (isPassedAsPointer(paramType))
1403                             preBuffer.append("_b_");
1404                         else
1405                             preBuffer.append("_b_");
1406                         preBuffer.append(paramName);
1407                         preBuffer.append(", ");
1408                         preBuffer.append(paramName);
1409                         preBuffer.append(", m_bridge);\n");
1410                     }
1411 
1412                     callBuffer.append(", &_b_");
1413 
1414                     if (isArray(paramType))
1415                         postBuffer.append("    // fix me: conversion of array types!\n");
1416                     else
1417                     {
1418                         postBuffer.append("    cpp_convert_b2u(");
1419                         postBuffer.append(paramName);
1420                         postBuffer.append(", _b_");
1421                         postBuffer.append(paramName);
1422                         postBuffer.append(", m_bridge);\n");
1423                     }
1424 
1425                     break;
1426                 case RT_PARAM_OUT:
1427 
1428                     callBuffer.append(", &_b_");
1429 
1430                     if (isArray(paramType))
1431                         postBuffer.append("    // fix me: conversion of array types!\n");
1432                     else
1433                     {
1434                         postBuffer.append("    cpp_convert_b2u(");
1435                         postBuffer.append(paramName);
1436                         if (isPassedAsPointer(paramType))
1437                             postBuffer.append(", *_b_");
1438                         else
1439                             postBuffer.append(", _b_");
1440                         postBuffer.append(paramName);
1441                         postBuffer.append(", m_bridge);\n");
1442                     }
1443 
1444                     break;
1445                 }
1446 
1447 
1448                 callBuffer.append(paramName);
1449             }
1450 
1451             callBuffer.append(", &_ev );\n");
1452 
1453             if (!returnType.equals("void"))
1454             {
1455                 if (isArray(returnType))
1456                 {
1457                     postBuffer.append("    // fix me: conversion of array types!\n");
1458                 }
1459                 else
1460                 {
1461                     if (isPassedAsPointer(returnType))
1462                         postBuffer.append("    cpp_convert_b2u(_u_ret, *_b_ret, m_bridge);\n");
1463                     else
1464                         postBuffer.append("    cpp_convert_b2u(_u_ret, _b_ret, m_bridge);\n");
1465                 }
1466                 postBuffer.append("    return _u_ret;\n");
1467             }
1468 
1469             o << "    ::osl::MutexGuard guard(m_bridge->getORBLock());\n"
1470                     << "    CORBA_Environment _ev;\n"
1471                     << "    CORBA_exception_init (&_ev);\n";
1472 
1473             o << preBuffer;
1474             o << callBuffer;
1475 
1476             o << "    if (_ev._major != CORBA_NO_EXCEPTION) {\n"
1477               << "        ::com::sun::star::uno::RuntimeException _ex(::rtl::OUString::createFromAscii(\"exception raised in bonobobridge\"), NULL);\n"
1478               << "        CORBA_exception_free (&_ev);\n"
1479               << "        throw _ex;\n"
1480               << "    }\n"
1481               << "    CORBA_exception_free (&_ev);\n";
1482 
1483             o << postBuffer;
1484 
1485             o << indent() << "}\n";
1486         }
1487         else
1488             o << "  );\n";
1489     }
1490 }
1491 
dumpCorbaMethods(FileStream & o,sal_Bool bDeclOnly)1492 void InterfaceType::dumpCorbaMethods(FileStream& o, sal_Bool bDeclOnly)
1493 {
1494     OString superName(m_reader.getSuperTypeName());
1495 
1496     sal_uInt32 methodCount = m_reader.getMethodCount();
1497 
1498     OString methodName, returnType, paramType, paramName;
1499     sal_uInt32 paramCount = 0;
1500     sal_uInt32 excCount = 0;
1501     RTMethodMode methodMode = RT_MODE_INVALID;
1502     RTParamMode  paramMode = RT_PARAM_INVALID;
1503 
1504     sal_Bool bRef = sal_False;
1505     sal_Bool bConst = sal_False;
1506     sal_Bool bWithRunTimeExcp = sal_True;
1507 
1508     for (sal_uInt16 i=0; i < methodCount; i++)
1509     {
1510         methodName = m_reader.getMethodName(i);
1511         returnType = m_reader.getMethodReturnType(i);
1512         paramCount = m_reader.getMethodParamCount(i);
1513         excCount = m_reader.getMethodExcCount(i);
1514         methodMode = m_reader.getMethodMode(i);
1515 
1516         o << indent()
1517           << "extern \"C\" "
1518           << printCorbaParameter(returnType);
1519 
1520         if (isPassedAsPointer(returnType))
1521             o << "*";
1522 
1523         o << " bonobobridge_";
1524         dumpCorbaType(o, m_typeName, sal_False, sal_False);
1525         o << "_" << methodName << "( PortableServer_Servant _servant, ";
1526 
1527         sal_uInt16 j;
1528         for (j=0; j < paramCount; j++)
1529         {
1530             paramName = m_reader.getMethodParamName(i, j);
1531             paramType = m_reader.getMethodParamType(i, j);
1532             paramMode = m_reader.getMethodParamMode(i, j);
1533 
1534             if ((isPassedAsPointer(paramType) || paramType.equals("string") || isArray(paramType)) &&
1535                 (paramMode == RT_PARAM_IN))
1536                 o << "const ";
1537 
1538             o << printCorbaParameter(paramType);
1539 
1540             if (isPassedAsPointer(paramType))
1541             {
1542                 if (paramMode == RT_PARAM_OUT)
1543                     o << "**";
1544                 else
1545                     o << "*";
1546             }
1547             else
1548             {
1549                 if (paramMode != RT_PARAM_IN)
1550                     o << "*";
1551             }
1552 
1553 
1554             o << " " << paramName << ", ";
1555         }
1556 
1557         o << "CORBA_Environment * _ev)";
1558 
1559         if (bDeclOnly)
1560             o << ";\n";
1561         else
1562         {
1563             o << " {\n";
1564             OStringBuffer preBuffer(1024);
1565             OStringBuffer callBuffer(1024);
1566             OStringBuffer postBuffer(1024);
1567 
1568             callBuffer.append("    ");
1569 
1570             preBuffer.append("    ");
1571             preBuffer.append(printUnoType(m_typeName, sal_False, sal_False));
1572             preBuffer.append(" rThis((");
1573             preBuffer.append(printUnoType(m_typeName, sal_False, sal_False, sal_True));
1574             preBuffer.append(" *)((bonobobridge::UNO_POA_com_sun_star_uno_XInterface*)_servant)->pThis->getUnoObject());\n");
1575 
1576             if (!returnType.equals("void"))
1577             {
1578                 preBuffer.append("    ");
1579                 preBuffer.append(printCorbaParameter(returnType));
1580                 if (isPassedAsPointer(returnType))
1581                 {
1582                     preBuffer.append("* _b_ret = ");
1583                     preBuffer.append(printCorbaType(returnType, sal_False, sal_False));
1584                     preBuffer.append("__alloc();\n");
1585 
1586                 }
1587                 else
1588                 {
1589                     preBuffer.append(" _b_ret;\n");
1590                 }
1591                 preBuffer.append("    ");
1592                 preBuffer.append(printUnoType(returnType, sal_False, sal_False));
1593                 preBuffer.append(" _u_ret;\n");
1594 
1595                 callBuffer.append("_u_ret = ");
1596             }
1597 
1598             callBuffer.append("rThis->");
1599             callBuffer.append(methodName);
1600             callBuffer.append("( ");
1601 
1602             for (j=0; j < paramCount; j++)
1603             {
1604                 paramName = m_reader.getMethodParamName(i, j);
1605                 paramType = m_reader.getMethodParamType(i, j);
1606                 paramMode = m_reader.getMethodParamMode(i, j);
1607 
1608                 preBuffer.append("    ");
1609                 preBuffer.append(printUnoType(paramType, sal_False, sal_False));
1610                 preBuffer.append(" _u_");
1611                 preBuffer.append(paramName);
1612                 preBuffer.append(";\n");
1613 
1614                 callBuffer.append("_u_");
1615                 callBuffer.append(paramName);
1616 
1617                 if (j < (paramCount-1))
1618                     callBuffer.append(", ");
1619 
1620                 switch (paramMode) {
1621                 case RT_PARAM_IN:
1622 
1623                     if (isArray(paramType))
1624                         preBuffer.append("    // fix me: conversion of array types!\n");
1625                     else
1626                     {
1627                         preBuffer.append("    cpp_convert_b2u(");
1628                         preBuffer.append("_u_");
1629                         preBuffer.append(paramName);
1630                         preBuffer.append(", ");
1631                         if (isPassedAsPointer(paramType))
1632                             preBuffer.append("*");
1633                         preBuffer.append(paramName);
1634                         preBuffer.append(", ((bonobobridge::UNO_POA_com_sun_star_uno_XInterface*)_servant)->pThis->getBridge());\n");
1635                     }
1636                     break;
1637                 case RT_PARAM_INOUT:
1638 
1639                     if (isArray(paramType))
1640                     {
1641                         preBuffer.append("    // fix me: conversion of array types!\n");
1642                         postBuffer.append("    // fix me: conversion of array types!\n");
1643                     }
1644                     else
1645                     {
1646                         preBuffer.append("    cpp_convert_b2u(");
1647                         preBuffer.append("_u_");
1648                         preBuffer.append(paramName);
1649                         preBuffer.append(", ");
1650                         if (isPassedAsPointer(paramType))
1651                             preBuffer.append("*");
1652                         preBuffer.append(paramName);
1653                         preBuffer.append(", ((bonobobridge::UNO_POA_com_sun_star_uno_XInterface*)_servant)->pThis->getBridge());\n");
1654 
1655                         postBuffer.append("    cpp_convert_u2b(");
1656                         if (isPassedAsPointer(paramType))
1657                             postBuffer.append("*");
1658                         postBuffer.append(paramName);
1659                         postBuffer.append(", _u_");
1660                         postBuffer.append(paramName);
1661                         postBuffer.append(", ((bonobobridge::UNO_POA_com_sun_star_uno_XInterface*)_servant)->pThis->getBridge());\n");
1662                     }
1663                     break;
1664                 case RT_PARAM_OUT:
1665 
1666                     if (isArray(paramType))
1667                         preBuffer.append("    // fix me: conversion of array types!\n");
1668                     else
1669                     {
1670                         postBuffer.append("    cpp_convert_u2b(");
1671                         if (isPassedAsPointer(paramType))
1672                             postBuffer.append("**");
1673                         else
1674                             postBuffer.append("*");
1675                         postBuffer.append(paramName);
1676                         postBuffer.append(", _u_");
1677                         postBuffer.append(paramName);
1678                         postBuffer.append(", ((bonobobridge::UNO_POA_com_sun_star_uno_XInterface*)_servant)->pThis->getBridge());\n");
1679                     }
1680                     break;
1681                 }
1682             }
1683 
1684             callBuffer.append(" );\n");
1685 
1686             if (!returnType.equals("void"))
1687             {
1688                 if (isArray(returnType))
1689                     postBuffer.append("    // fix me: conversion of array types!\n");
1690                 else
1691                 {
1692                     if (isPassedAsPointer(returnType))
1693                         postBuffer.append("    cpp_convert_u2b(*_b_ret, _u_ret, ((bonobobridge::UNO_POA_com_sun_star_uno_XInterface*)_servant)->pThis->getBridge());\n");
1694                     else
1695                         postBuffer.append("    cpp_convert_u2b(_b_ret, _u_ret, ((bonobobridge::UNO_POA_com_sun_star_uno_XInterface*)_servant)->pThis->getBridge());\n");
1696                 }
1697 
1698                 postBuffer.append("    return _b_ret;\n");
1699             }
1700 
1701             o << preBuffer;
1702             o << callBuffer;
1703             o << postBuffer;
1704 
1705             o << "}\n";
1706         }
1707     }
1708 }
1709 
dumpFunctions(FileStream & o)1710 void InterfaceType::dumpFunctions(FileStream& o)
1711 {
1712     if (m_typeName.equals("com/sun/star/uno/XInterface") ||
1713         m_typeName.equals("Bonobo/NullInterface"))
1714         return;
1715 
1716     m_generatedConversions->insert(m_typeName);
1717 
1718     o << "namespace bonobobridge {\n\n";
1719 
1720     /* bonobo implementation class */
1721     o << "class BonoboWrapper_";
1722     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1723 
1724     OString superName(m_reader.getSuperTypeName());
1725     o << " : public BonoboWrapper< BonoboWrapper_";
1726     dumpCorbaType(o, superName, sal_False, sal_False);
1727     o << ", ";
1728     dumpUnoType(o, m_typeName, sal_False, sal_False, sal_True);
1729     o << " > {\n";
1730 
1731     o << "public:   \n"
1732       << "    BonoboWrapper_";
1733     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1734     o << "(";
1735     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1736     o << " corbaObject,"
1737       << "const vos::ORef<bonobobridge::Bridge>& bridge)\n";
1738 
1739     o << "      : BonoboWrapper< "
1740       << "BonoboWrapper_";
1741     dumpCorbaType(o, superName, sal_False, sal_False);
1742     o << ", ";
1743     dumpUnoType(o, m_typeName, sal_False, sal_False, sal_True);
1744     o << " >(corbaObject, bridge) {\n";
1745 
1746     if (isDerivedFromUnknown(m_typeName))
1747     {
1748         o << "      m_bridge->registerObjectWrapper(::getCppuType((";
1749         dumpUnoType(o, m_typeName, sal_False, sal_False);
1750         o << "*)NULL), m_corbaObject, (";
1751         dumpUnoType(o, m_typeName, sal_False, sal_False, sal_True);
1752         o << "*)this);\n";
1753     }
1754 
1755     o << "    }\n";
1756 
1757     o << "    virtual ~BonoboWrapper_";
1758     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1759     o << "() {\n";
1760     if (isDerivedFromUnknown(m_typeName))
1761     {
1762         o << "      m_bridge->unregisterObjectWrapper(::getCppuType((";
1763         dumpUnoType(o, m_typeName, sal_False, sal_False);
1764         o << "*)NULL), m_corbaObject, (";
1765         dumpUnoType(o, m_typeName, sal_False, sal_False, sal_True);
1766         o << "*)this);\n";
1767     }
1768     o   << "    }\n";
1769     inc();
1770     dumpUnoMethods(o, sal_True, sal_False);
1771     dec();
1772 
1773     o  << "};\n\n";
1774 
1775     o << "}; // namespace bonobobridge\n";
1776 
1777     dumpUnoMethods(o, sal_False, sal_False);
1778 
1779     /* convert function bonobo to uno */
1780     o << "static sal_Bool convert_b2u_" << m_typeName.replace('/', '_')
1781       << "(void* pOut, const void* pIn, const ::com::sun::star::uno::Type& type, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n"
1782       << "  sal_Bool ret = sal_True;\n  ";
1783     dumpUnoType(o, m_typeName, sal_False, sal_False);
1784     o << "& _u = *(";
1785     dumpUnoType(o, m_typeName, sal_False, sal_False);
1786     o << "*) pOut;\n  const ";
1787     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1788     o << "& _b = *(const ";
1789     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1790     o << "*) pIn;\n\n"
1791       << "  _u = new bonobobridge::BonoboWrapper_";
1792     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1793     o << "(_b, bridge);\n"
1794       << "  return ret;\n";
1795 
1796     o   << "}\n\n";
1797 
1798     /* POA implementation class */
1799     dumpCorbaMethods(o, sal_True);
1800     o << "static POA_";
1801     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1802     o << "__epv bonobobridge_";
1803     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1804     o << "_epv = {\n";
1805     sal_uInt32      methodCount = m_reader.getMethodCount();
1806     OString         methodName;
1807 
1808     o << "    NULL,\n";
1809 
1810     for (sal_uInt16 i=0; i < methodCount; i++)
1811     {
1812         methodName = m_reader.getMethodName(i);
1813         o << "    bonobobridge_";
1814         dumpCorbaType(o, m_typeName, sal_False, sal_False);
1815         o << "_" << methodName;
1816 
1817         if (i < (methodCount-1))
1818             o << ",\n";
1819         else
1820             o << "\n};\n";
1821     }
1822 
1823     OStringBuffer initBuffer(1024);
1824 
1825     initBuffer.insert(0, OString("&bonobobridge_") + printCorbaType(m_typeName, sal_False, sal_False) + OString("_epv"));
1826 
1827     while( !superName.isEmpty() )
1828     {
1829         if (superName.equals("Bonobo/NullInterface"))
1830         {
1831             superName = "";
1832         }
1833         else
1834         {
1835             if (superName.equals("com/sun/star/uno/XInterface"))
1836             {
1837                 initBuffer.insert(0, OString("&bonobobridge_com_sun_star_uno_XInterface_epv, "));
1838             }
1839             else
1840             {
1841                 initBuffer.insert(0, OString("&bonobobridge_") + printCorbaType(superName, sal_False, sal_False) + OString("_epv, "));
1842             }
1843             TypeReader reader(m_typeMgr.getTypeReader(superName));
1844             superName = reader.getSuperTypeName();
1845         }
1846     }
1847 
1848     initBuffer.insert(0, OString("NULL, "));
1849 
1850     o << "static POA_";
1851     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1852     o << "__vepv bonobobridge_";
1853     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1854     o << "__vepv = {";
1855     o << initBuffer.makeStringAndClear();
1856     o << " };\n";
1857 
1858     superName = m_reader.getSuperTypeName();
1859 
1860     o << "namespace bonobobridge {\n\n";
1861 
1862     o << "class UnoServant_";
1863     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1864     o << " : public UnoServant_com_sun_star_uno_XInterface {\n";
1865 
1866     o << "public:\n"
1867             << " UnoServant_";
1868 
1869     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1870     o << "(";
1871     dumpUnoType(o, m_typeName, sal_False, sal_False, sal_True);
1872     o << "* unoObject,"
1873       << " const ::vos::ORef<bonobobridge::Bridge>& bridge,"
1874       << " CORBA_Environment *ev,"
1875       << " sal_Bool bInitPoa)\n"
1876       << "    : UnoServant_com_sun_star_uno_XInterface(unoObject, bridge, ev, sal_False) {\n"
1877       << "    if (bInitPoa) {\n"
1878       << "        memset(&m_POAUnknown, 0, sizeof(m_POAUnknown));\n"
1879       << "        POA_";
1880     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1881     o << "__init((PortableServer_Servant) &(m_POAUnknown.poa), ev);\n"
1882       << "        m_POAUnknown.pThis = (UnoServant_com_sun_star_uno_XInterface*)this;\n"
1883       << "        m_POAUnknown.poa.vepv = (POA_Bonobo_Unknown__vepv*)&bonobobridge_";
1884     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1885     o << "__vepv;\n"
1886       << "    }\n"
1887       << "  }\n"
1888       << "};\n"
1889       << "}; // namespace bonobobridge\n";
1890 
1891     dumpCorbaMethods(o, sal_False);
1892 
1893     /* convert function uno to bonobo */
1894     o << "static sal_Bool convert_u2b_" << m_typeName.replace('/', '_')
1895             << "(void* pOut, const void* pIn,   const ::com::sun::star::uno::Type& type,    const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n";
1896     o   << "  sal_Bool ret = sal_True;\n  const ";
1897     dumpUnoType(o, m_typeName, sal_False, sal_False);
1898     o << "& _u = *(const ";
1899     dumpUnoType(o, m_typeName, sal_False, sal_False);
1900     o << "*) pIn;\n  ";
1901     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1902     o << "& _b = *(";
1903     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1904     o << "*) pOut;\n\n"
1905       << "  if (_u.is()) {\n"
1906       << "    bonobobridge::UnoServant_";
1907     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1908     o << " *uno_servant;\n"
1909       << "    POA_";
1910     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1911     o << " *poa;\n"
1912       << "          CORBA_Environment ev;\n"
1913       << "    CORBA_exception_init (&ev);\n"
1914       << "          uno_servant = new bonobobridge::UnoServant_";
1915     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1916     o << "(_u.get(), bridge, &ev, sal_True);\n"
1917       << "    poa = (POA_";
1918     dumpCorbaType(o, m_typeName, sal_False, sal_False);
1919     o << "*)uno_servant->getPOA();\n"
1920       << "    if (ev._major != CORBA_NO_EXCEPTION) {\n"
1921       << "      delete uno_servant;\n"
1922       << "          CORBA_exception_free (&ev);\n"
1923       << "          _b = CORBA_OBJECT_NIL;\n"
1924       << "          ret = sal_False;\n"
1925       << "    }\n"
1926       << "  else {\n"
1927       << "      CORBA_free(PortableServer_POA_activate_object(bridge->getPOA(), poa, &ev));\n"
1928       << "          _b = PortableServer_POA_servant_to_reference (bridge->getPOA(), poa, &ev);\n"
1929       << "          uno_servant->corbaObjectRegistered(_b, getCppuType((";
1930     dumpUnoType(o, m_typeName, sal_False, sal_False);
1931     o << "*)NULL)";
1932 
1933     if (!isDerivedFromUnknown(m_typeName))
1934         o << ", sal_False";
1935 
1936     o << ");\n"
1937       << "    }\n"
1938       << "  CORBA_exception_free (&ev);\n"
1939       << "  }\n"
1940       << "  return ret;\n"
1941       << "}\n\n";
1942 
1943     o << "inline sal_Bool bonobobridge::cpp_convert_b2u(";
1944     dumpUnoType(o, m_typeName, sal_False, sal_True);
1945     o << " u, ";
1946     dumpCorbaType(o, m_typeName, sal_True, sal_True);
1947     o << " b, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n"
1948       << "  return bridge->convertB2U(&u, &b, ::getCppuType(&u));\n"
1949       << "};\n\n";
1950 
1951     o << "inline sal_Bool bonobobridge::cpp_convert_u2b(";
1952     dumpCorbaType(o, m_typeName, sal_False, sal_True);
1953     o << " b, ";
1954     dumpUnoType(o, m_typeName, sal_True, sal_True);
1955     o << " u, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n"
1956       << "  return bridge->convertU2B(&b, &u, ::getCppuType(&u));\n"
1957       << "};\n\n";
1958 
1959     return;
1960 }
1961 
1962 
1963 
1964 
getMemberCount()1965 sal_uInt32 InterfaceType::getMemberCount()
1966 {
1967     sal_uInt32 count = m_reader.getMethodCount();
1968 
1969     if (count)
1970         m_hasMethods = sal_True;
1971 
1972     sal_uInt32 fieldCount = m_reader.getFieldCount();
1973     RTFieldAccess access = RT_ACCESS_INVALID;
1974     for (sal_uInt16 i=0; i < fieldCount; i++)
1975     {
1976         access = m_reader.getFieldAccess(i);
1977 
1978         if (access != RT_ACCESS_CONST && access != RT_ACCESS_INVALID)
1979         {
1980             m_hasAttributes = sal_True;
1981             count++;
1982         }
1983     }
1984     return count;
1985 }
1986 
checkInheritedMemberCount(const TypeReader * pReader)1987 sal_uInt32 InterfaceType::checkInheritedMemberCount(const TypeReader* pReader)
1988 {
1989     sal_uInt32 cout = 0;
1990     sal_Bool bSelfCheck = sal_True;
1991     if (!pReader)
1992     {
1993         bSelfCheck = sal_False;
1994         pReader = &m_reader;
1995     }
1996 
1997     sal_uInt32 count = 0;
1998     OString superType(pReader->getSuperTypeName());
1999     if ( !superType.isEmpty() )
2000     {
2001         TypeReader aSuperReader(m_typeMgr.getTypeReader(superType));
2002         if (aSuperReader.isValid())
2003         {
2004             count = checkInheritedMemberCount(&aSuperReader);
2005         }
2006     }
2007 
2008     if (bSelfCheck)
2009     {
2010         count += pReader->getMethodCount();
2011         sal_uInt32 fieldCount = pReader->getFieldCount();
2012         RTFieldAccess access = RT_ACCESS_INVALID;
2013         for (sal_uInt16 i=0; i < fieldCount; i++)
2014         {
2015             access = pReader->getFieldAccess(i);
2016 
2017             if (access != RT_ACCESS_CONST && access != RT_ACCESS_INVALID)
2018                 count++;
2019         }
2020     }
2021 
2022     return count;
2023 }
2024 
getInheritedMemberCount()2025 sal_uInt32 InterfaceType::getInheritedMemberCount()
2026 {
2027     if (m_inheritedMemberCount == 0)
2028     {
2029         m_inheritedMemberCount = checkInheritedMemberCount(0);
2030     }
2031 
2032     return m_inheritedMemberCount;
2033 }
2034 
2035 
2036 
2037 
2038 //*************************************************************************
2039 // ModuleType
2040 //*************************************************************************
ModuleType(TypeReader & typeReader,const OString & typeName,const TypeManager & typeMgr,const TypeDependency & typeDependencies,TypeSet * generatedConversions)2041 ModuleType::ModuleType(TypeReader& typeReader,
2042                                 const OString& typeName,
2043                                 const TypeManager& typeMgr,
2044                                 const TypeDependency& typeDependencies,
2045                                 TypeSet* generatedConversions)
2046     : CorbaType(typeReader, typeName, typeMgr, typeDependencies, generatedConversions)
2047 {
2048 }
2049 
~ModuleType()2050 ModuleType::~ModuleType()
2051 {
2052 
2053 }
2054 
2055 
hasConstants()2056 sal_Bool ModuleType::hasConstants()
2057 {
2058     sal_uInt32      fieldCount = m_reader.getFieldCount();
2059     RTFieldAccess   access = RT_ACCESS_INVALID;
2060 
2061     for (sal_uInt16 i=0; i < fieldCount; i++)
2062     {
2063         access = m_reader.getFieldAccess(i);
2064 
2065         if (access == RT_ACCESS_CONST)
2066             return sal_True;
2067     }
2068 
2069     return sal_False;
2070 }
2071 
dumpFunctions(FileStream & o)2072 void ModuleType::dumpFunctions(FileStream& o)
2073 {
2074 };
2075 
dumpConversionFunctions(FileStream & o,TypeSet * allreadyDumped)2076 sal_Bool ModuleType::dumpConversionFunctions(FileStream& o, TypeSet* allreadyDumped)
2077     throw( CannotDumpException )
2078 {
2079     sal_Bool bSpecialDefine = sal_True;
2080 
2081     if (m_reader.getTypeClass() == RT_TYPE_CONSTANTS)
2082     {
2083         bSpecialDefine = sal_False;
2084     }
2085 
2086     dumpInclude(o, allreadyDumped, m_typeName, "hpp", bSpecialDefine);
2087 
2088     return sal_True;
2089 }
2090 
2091 //*************************************************************************
2092 // ConstantsType
2093 //*************************************************************************
ConstantsType(TypeReader & typeReader,const OString & typeName,const TypeManager & typeMgr,const TypeDependency & typeDependencies,TypeSet * generatedConversions)2094 ConstantsType::ConstantsType(TypeReader& typeReader,
2095                                 const OString& typeName,
2096                                 const TypeManager& typeMgr,
2097                                 const TypeDependency& typeDependencies,
2098                                 TypeSet* generatedConversions)
2099     : ModuleType(typeReader, typeName, typeMgr, typeDependencies, generatedConversions)
2100 {
2101 }
2102 
~ConstantsType()2103 ConstantsType::~ConstantsType()
2104 {
2105 
2106 }
2107 
dumpFunctions(FileStream & o)2108 void ConstantsType::dumpFunctions(FileStream& o)
2109 {
2110 };
2111 
2112 //*************************************************************************
2113 // StructureType
2114 //*************************************************************************
StructureType(TypeReader & typeReader,const OString & typeName,const TypeManager & typeMgr,const TypeDependency & typeDependencies,TypeSet * generatedConversions)2115 StructureType::StructureType(TypeReader& typeReader,
2116                                 const OString& typeName,
2117                                 const TypeManager& typeMgr,
2118                                 const TypeDependency& typeDependencies,
2119                                 TypeSet* generatedConversions)
2120     : CorbaType(typeReader, typeName, typeMgr, typeDependencies, generatedConversions)
2121 {
2122 }
2123 
~StructureType()2124 StructureType::~StructureType()
2125 {
2126 
2127 }
2128 
dumpFunctions(FileStream & o)2129 void StructureType::dumpFunctions(FileStream& o)
2130 {
2131     m_generatedConversions->insert(m_typeName);
2132 
2133     OString superType(m_reader.getSuperTypeName());
2134 
2135     o << "static sal_Bool convert_b2u_" << m_typeName.replace('/', '_')
2136       << "(void* pOut, const void* pIn, const ::com::sun::star::uno::Type& type, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n"
2137       << "  sal_Bool ret = sal_True;\n  ";
2138     dumpUnoType(o, m_typeName, sal_False, sal_False);
2139     o << "& _u = *(";
2140     dumpUnoType(o, m_typeName, sal_False, sal_False);
2141     o << "*) pOut;\n  const ";
2142     dumpCorbaType(o, m_typeName, sal_False, sal_False);
2143     o << "& _b = *(const ";
2144     dumpCorbaType(o, m_typeName, sal_False, sal_False);
2145     o << "*) pIn;\n\n";
2146 
2147     sal_uInt32      fieldCount = m_reader.getFieldCount();
2148     OString         fieldName;
2149     OString         fieldType;
2150     sal_uInt16      i=0;
2151     sal_Int32       cIndex;
2152     OString         corbaFieldName;
2153 
2154     sal_Bool bIsUnion = sal_False;
2155 
2156     for (i=0; !bIsUnion && (i < fieldCount); i++)
2157         bIsUnion = OString("_union_fake_tag").equals(m_reader.getFieldName(i));
2158 
2159     if (bIsUnion)
2160     {
2161         o << "  // fix me: union !!!!\n  ret = sal_False;\n";
2162     }
2163     else
2164     {
2165         if ( !superType.isEmpty() )
2166         {
2167             o << "  ret = bonobobridge::cpp_convert_b2u((";
2168             dumpUnoType(o, superType, sal_False, sal_False);
2169             o << "&) _u, (const ";
2170             dumpCorbaType(o, superType, sal_False, sal_False);
2171             o << "&) _b, bridge);\n";
2172         }
2173 
2174         for (i=0; i < fieldCount; i++)
2175         {
2176             fieldName = m_reader.getFieldName(i);
2177             fieldType = m_reader.getFieldType(i);
2178             cIndex = fieldName.indexOf("_reserved_identifier_");
2179 
2180             if (cIndex == 0)
2181                 corbaFieldName = fieldName.copy(OString("_reserved_identifier_").getLength());
2182             else
2183                 corbaFieldName = fieldName;
2184 
2185             if (isArray(fieldType))
2186                 o << "  // fix me: no conversion of array types!\n";
2187             else
2188                 o << "  if (ret)\n"
2189                   << "    ret = bonobobridge::cpp_convert_b2u("
2190                   << "_u." << fieldName.getStr()
2191                   << "  , _b." << corbaFieldName.getStr()
2192                   << ", bridge);\n";
2193         }
2194     }
2195     o << "  return ret;\n"
2196       << "}\n\n"
2197       << "static sal_Bool convert_u2b_" << m_typeName.replace('/', '_')
2198       << "(void* pOut, const void* pIn, const ::com::sun::star::uno::Type& type, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n"
2199       << "  sal_Bool ret = sal_True;\n  const ";
2200     dumpUnoType(o, m_typeName, sal_False, sal_False);
2201     o << "& _u = *(const ";
2202     dumpUnoType(o, m_typeName, sal_False, sal_False);
2203     o << "*) pIn;\n  ";
2204     dumpCorbaType(o, m_typeName, sal_False, sal_False);
2205     o << "& _b = *(";
2206     dumpCorbaType(o, m_typeName, sal_False, sal_False);
2207     o << "*) pOut;\n\n";
2208 
2209     if (bIsUnion)
2210         o << "  // fix me: union !!!!\n  ret = sal_False;\n";
2211     else
2212     {
2213         if ( !superType.isEmpty() )
2214         {
2215             o << "  ret = bonobobridge::cpp_convert_u2b((";
2216             dumpCorbaType(o, superType, sal_False, sal_False);
2217             o << "&) _u, (const ";
2218             dumpUnoType(o, superType, sal_False, sal_False);
2219             o << "&) _b, bridge);\n";
2220         }
2221 
2222         for (i=0; i < fieldCount; i++)
2223         {
2224             fieldName = m_reader.getFieldName(i);
2225             fieldType = m_reader.getFieldType(i);
2226 
2227             cIndex = fieldName.indexOf("_reserved_identifier_");
2228 
2229             if (cIndex == 0)
2230                 corbaFieldName = fieldName.copy(OString("_reserved_identifier_").getLength());
2231             else
2232                 corbaFieldName = fieldName;
2233 
2234             if (isArray(fieldType))
2235                 o << "  // fix me: no conversion of array types!\n";
2236             else
2237                 o << "  if (ret)\n"
2238                   << "    ret = bonobobridge::cpp_convert_u2b("
2239                   << "_b." << corbaFieldName.getStr()
2240                   << ", _u." << fieldName.getStr()
2241                   << ", bridge);\n";
2242         }
2243     }
2244 
2245     o   << "  return ret;\n"
2246         << "}\n\n";
2247 
2248     o << "inline sal_Bool bonobobridge::cpp_convert_b2u(";
2249     dumpUnoType(o, m_typeName, sal_False, sal_True);
2250     o << " u    , ";
2251     dumpCorbaType(o, m_typeName, sal_True, sal_True);
2252     o << " b,   const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n"
2253       << "  return convert_b2u_" << m_typeName.replace('/', '_')
2254       << "(&u, &b, ::getCppuType(&u), bridge);\n"
2255       << "};\n\n";
2256 
2257     o << "inline sal_Bool bonobobridge::cpp_convert_u2b(";
2258     dumpCorbaType(o, m_typeName, sal_False, sal_True);
2259     o << " b, ";
2260     dumpUnoType(o, m_typeName, sal_True, sal_True);
2261     o << " u,   const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n"
2262       << "  return convert_u2b_" << m_typeName.replace('/', '_')
2263       << "(&b, &u, ::getCppuType(&u), bridge);\n"
2264       << "};\n\n";
2265 }
2266 
dumpSuperMember(FileStream & o,const OString & superType,sal_Bool bWithType)2267 sal_Bool StructureType::dumpSuperMember(FileStream& o, const OString& superType, sal_Bool bWithType)
2268 {
2269     sal_Bool hasMember = sal_False;
2270 
2271     if ( !superType.isEmpty() )
2272     {
2273         TypeReader aSuperReader(m_typeMgr.getTypeReader(superType));
2274 
2275         if (aSuperReader.isValid())
2276         {
2277             hasMember = dumpSuperMember(o, aSuperReader.getSuperTypeName(), bWithType);
2278 
2279             sal_uInt32      fieldCount = aSuperReader.getFieldCount();
2280             RTFieldAccess   access = RT_ACCESS_INVALID;
2281             OString         fieldName;
2282             OString         fieldType;
2283             for (sal_uInt16 i=0; i < fieldCount; i++)
2284             {
2285                 access = aSuperReader.getFieldAccess(i);
2286 
2287                 if (access == RT_ACCESS_CONST || access == RT_ACCESS_INVALID)
2288                     continue;
2289 
2290                 fieldName = aSuperReader.getFieldName(i);
2291                 fieldType = aSuperReader.getFieldType(i);
2292 
2293                 if (hasMember)
2294                 {
2295                     o << ", ";
2296                 } else
2297                 {
2298                     hasMember = (fieldCount > 0);
2299                 }
2300 
2301                 if (bWithType)
2302                 {
2303                     dumpUnoType(o, fieldType, sal_True, sal_True);
2304                     o << " ";
2305                 }
2306                 o << "__" << fieldName;
2307             }
2308         }
2309     }
2310 
2311     return hasMember;
2312 }
2313 
2314 //*************************************************************************
2315 // ExceptionType
2316 //*************************************************************************
ExceptionType(TypeReader & typeReader,const OString & typeName,const TypeManager & typeMgr,const TypeDependency & typeDependencies,TypeSet * generatedConversions)2317 ExceptionType::ExceptionType(TypeReader& typeReader,
2318                                 const OString& typeName,
2319                                 const TypeManager& typeMgr,
2320                                 const TypeDependency& typeDependencies,
2321                                 TypeSet* generatedConversions)
2322     : CorbaType(typeReader, typeName, typeMgr, typeDependencies, generatedConversions)
2323 {
2324 }
2325 
~ExceptionType()2326 ExceptionType::~ExceptionType()
2327 {
2328 
2329 }
2330 
dumpFunctions(FileStream & o)2331 void ExceptionType::dumpFunctions(FileStream& o)
2332 {
2333     if (m_typeName.equals("com/sun/star/uno/Exception"))
2334         return;
2335 
2336     if (m_typeName.equals("com/sun/star/uno/RuntimeException"))
2337         return;
2338 
2339     m_generatedConversions->insert(m_typeName);
2340 
2341     OString superType(m_reader.getSuperTypeName());
2342 
2343     o << "static sal_Bool convert_b2u_" << m_typeName.replace('/', '_')
2344       << "(void* pOut, const void* pIn, const ::com::sun::star::uno::Type& type, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n"
2345       << "  sal_Bool ret = sal_True;\n";
2346     dumpUnoType(o, m_typeName, sal_False, sal_False);
2347     o << "& _u = *(";
2348     dumpUnoType(o, m_typeName, sal_False, sal_False);
2349     o << "*) pOut;\n  const ";
2350     dumpCorbaType(o, m_typeName, sal_False, sal_False);
2351     o << "& _b = *(const ";
2352     dumpCorbaType(o, m_typeName, sal_False, sal_False);
2353     o << "*) pIn;\n\n";
2354 
2355     sal_uInt32      fieldCount = m_reader.getFieldCount();
2356     OString         fieldName;
2357     OString         fieldType;
2358     sal_uInt16      i=0;
2359     sal_Int32    cIndex;
2360     OString      corbaFieldName;
2361 
2362     if ( !superType.isEmpty() )
2363     {
2364         o << "  ret = bonobobridge::cpp_convert_b2u((";
2365         dumpUnoType(o, superType, sal_False, sal_False);
2366         o << "&) _u, (const ";
2367         dumpCorbaType(o, superType, sal_False, sal_False);
2368         o << "&) _b, bridge);\n";
2369     }
2370 
2371     for (i=0; i < fieldCount; i++)
2372     {
2373         fieldName = m_reader.getFieldName(i);
2374         fieldType = m_reader.getFieldType(i);
2375         cIndex = fieldName.indexOf("_reserved_identifier_");
2376 
2377         if (cIndex == 0)
2378             corbaFieldName = fieldName.copy(OString("_reserved_identifier_").getLength());
2379         else
2380             corbaFieldName = fieldName;
2381 
2382         if (isArray(fieldType))
2383             o << "  // fix me: no conversion of array types!\n";
2384         else
2385             o << "  if (ret)\n"
2386               << "    ret = bonobobridge::cpp_convert_b2u("
2387               << "_u." << fieldName.getStr()
2388               << ", _b." << corbaFieldName.getStr()
2389               << ", bridge);\n";
2390     }
2391     o << "  return ret;\n"
2392       << "}\n\n";
2393 
2394 
2395     o << "static sal_Bool convert_u2b_" << m_typeName.replace('/', '_')
2396       << "(void* pOut, const void* pIn, const ::com::sun::star::uno::Type& type, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n"
2397       << "  sal_Bool ret = sal_True;\n  const ";
2398     dumpUnoType(o, m_typeName, sal_False, sal_False);
2399     o << "& _u = *(const ";
2400     dumpUnoType(o, m_typeName, sal_False, sal_False);
2401     o << "*) pIn;\n  ";
2402     dumpCorbaType(o, m_typeName, sal_False, sal_False);
2403     o << "& _b = *(";
2404     dumpCorbaType(o, m_typeName, sal_False, sal_False);
2405     o << "*) pOut;\n\n";
2406 
2407     if ( !superType.isEmpty() )
2408     {
2409         o << "  ret = bonobobridge::cpp_convert_u2b((";
2410         dumpCorbaType(o, superType, sal_False, sal_False);
2411         o << "&) _u, (const ";
2412         dumpUnoType(o, superType, sal_False, sal_False);
2413         o << "&) _b, bridge);\n";
2414     }
2415 
2416     for (i=0; i < fieldCount; i++)
2417     {
2418         fieldName = m_reader.getFieldName(i);
2419         fieldType = m_reader.getFieldType(i);
2420 
2421         cIndex = fieldName.indexOf("_reserved_identifier_");
2422 
2423         if (cIndex == 0)
2424             corbaFieldName = fieldName.copy(OString("_reserved_identifier_").getLength());
2425         else
2426             corbaFieldName = fieldName;
2427 
2428         if (isArray(fieldType))
2429             o << "  // fix me: no conversion of array types!\n";
2430         else
2431             o << "  if (ret)\n"
2432               << "    ret = bonobobridge::cpp_convert_u2b("
2433               << "_b." << corbaFieldName.getStr()
2434               << ", _u." << fieldName.getStr()
2435               << ", bridge);\n";
2436     }
2437 
2438     o   << "  return ret;\n"
2439         << "}\n\n";
2440 
2441     o << "inline sal_Bool bonobobridge::cpp_convert_b2u(";
2442     dumpUnoType(o, m_typeName, sal_False, sal_True);
2443     o << " u    , ";
2444     dumpCorbaType(o, m_typeName, sal_True, sal_True);
2445     o << " b,   const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n"
2446       << "  return convert_b2u_" << m_typeName.replace('/', '_')
2447       << "(&u, &b, ::getCppuType(&u), bridge);\n"
2448       << "};\n\n";
2449 
2450     o << "inline sal_Bool bonobobridge::cpp_convert_u2b(";
2451     dumpCorbaType(o, m_typeName, sal_False, sal_True);
2452     o << " b, ";
2453     dumpUnoType(o, m_typeName, sal_True, sal_True);
2454     o << " u,   const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n"
2455       << "  return convert_u2b_" << m_typeName.replace('/', '_')
2456       << "(&b, &u, ::getCppuType(&u), bridge);\n"
2457       << "};\n\n";
2458 }
2459 
2460 
2461 
dumpSuperMember(FileStream & o,const OString & superType,sal_Bool bWithType)2462 sal_Bool ExceptionType::dumpSuperMember(FileStream& o, const OString& superType, sal_Bool bWithType)
2463 {
2464     sal_Bool hasMember = sal_False;
2465 
2466     if ( !superType.isEmpty() )
2467     {
2468         TypeReader aSuperReader(m_typeMgr.getTypeReader(superType));
2469 
2470         if (aSuperReader.isValid())
2471         {
2472             hasMember = dumpSuperMember(o, aSuperReader.getSuperTypeName(), bWithType);
2473 
2474             sal_uInt32      fieldCount = aSuperReader.getFieldCount();
2475             RTFieldAccess   access = RT_ACCESS_INVALID;
2476             OString         fieldName;
2477             OString         fieldType;
2478             for (sal_uInt16 i=0; i < fieldCount; i++)
2479             {
2480                 access = aSuperReader.getFieldAccess(i);
2481 
2482                 if (access == RT_ACCESS_CONST || access == RT_ACCESS_INVALID)
2483                     continue;
2484 
2485                 fieldName = aSuperReader.getFieldName(i);
2486                 fieldType = aSuperReader.getFieldType(i);
2487 
2488                 if (hasMember)
2489                 {
2490                     o << ", ";
2491                 } else
2492                 {
2493                     hasMember = (fieldCount > 0);
2494                 }
2495 
2496                 if (bWithType)
2497                 {
2498                     dumpUnoType(o, fieldType, sal_True, sal_True);
2499                     o << " ";
2500                 }
2501                 o << "__" << fieldName;
2502             }
2503         }
2504     }
2505 
2506     return hasMember;
2507 }
2508 
2509 //*************************************************************************
2510 // EnumType
2511 //*************************************************************************
EnumType(TypeReader & typeReader,const OString & typeName,const TypeManager & typeMgr,const TypeDependency & typeDependencies,TypeSet * generatedConversions)2512 EnumType::EnumType(TypeReader& typeReader,
2513                             const OString& typeName,
2514                             const TypeManager& typeMgr,
2515                             const TypeDependency& typeDependencies,
2516                             TypeSet* generatedConversions)
2517     : CorbaType(typeReader, typeName, typeMgr, typeDependencies, generatedConversions)
2518 {
2519 }
2520 
~EnumType()2521 EnumType::~EnumType()
2522 {
2523 
2524 }
2525 
dumpFunctions(FileStream & o)2526 void EnumType::dumpFunctions(FileStream& o)
2527 {
2528     if (m_typeName.equals("com/sun/star/uno/TypeClass"))
2529         return;
2530 
2531     m_generatedConversions->insert(m_typeName);
2532 
2533     o << "static sal_Bool convert_b2u_" << m_typeName.replace('/', '_')
2534       << "(void* pOut, const void* pIn, const ::com::sun::star::uno::Type& type, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n"
2535       << "  *(";
2536     dumpUnoType(o, m_typeName, sal_False, sal_False);
2537     o << "*) pOut = (";
2538     dumpUnoType(o, m_typeName, sal_False, sal_False);
2539     o << ") *(const ";
2540     dumpCorbaType(o, m_typeName, sal_False, sal_False);
2541     o << "*) pIn;\n\n"
2542       << "  return sal_True;\n"
2543       << "}\n\n";
2544 
2545     o << "static sal_Bool convert_u2b_" << m_typeName.replace('/', '_')
2546       << "(void* pOut, const void* pIn, const ::com::sun::star::uno::Type& type, const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n"
2547       << "  *(";
2548     dumpCorbaType(o, m_typeName, sal_False, sal_False);
2549     o << "*) pOut = (";
2550     dumpCorbaType(o, m_typeName, sal_False, sal_False);
2551     o << ") *(const ";
2552     dumpUnoType(o, m_typeName, sal_False, sal_False);
2553     o << "*) pIn;\n\n"
2554       << "  return sal_True;\n"
2555       << "}\n\n";
2556 
2557     o << "inline sal_Bool bonobobridge::cpp_convert_b2u(";
2558     dumpUnoType(o, m_typeName, sal_False, sal_True);
2559     o << " u    , ";
2560     dumpCorbaType(o, m_typeName, sal_True, sal_True);
2561     o << " b,   const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n"
2562       << "  return convert_b2u_" << m_typeName.replace('/', '_')
2563       << "(&u, &b, ::getCppuType(&u), bridge);\n"
2564       << "};\n\n";
2565 
2566     o << "inline sal_Bool bonobobridge::cpp_convert_u2b(";
2567     dumpCorbaType(o, m_typeName, sal_False, sal_True);
2568     o << " b, ";
2569     dumpUnoType(o, m_typeName, sal_True, sal_True);
2570     o << " u,   const ::vos::ORef< ::bonobobridge::Bridge >& bridge) {\n"
2571       << "  return convert_u2b_" << m_typeName.replace('/', '_')
2572       << "(&b, &u, ::getCppuType(&u), bridge);\n"
2573       << "};\n\n";
2574 
2575     return;
2576 }
2577 
2578 
2579 //*************************************************************************
2580 // TypeDefType
2581 //*************************************************************************
TypeDefType(TypeReader & typeReader,const OString & typeName,const TypeManager & typeMgr,const TypeDependency & typeDependencies,TypeSet * generatedConversions)2582 TypeDefType::TypeDefType(TypeReader& typeReader,
2583                             const OString& typeName,
2584                             const TypeManager& typeMgr,
2585                             const TypeDependency& typeDependencies,
2586                             TypeSet* generatedConversions)
2587     : CorbaType(typeReader, typeName, typeMgr, typeDependencies, generatedConversions)
2588 {
2589 }
2590 
~TypeDefType()2591 TypeDefType::~TypeDefType()
2592 {
2593 
2594 }
2595 
dumpFunctions(FileStream & o)2596 void TypeDefType::dumpFunctions(FileStream& o)
2597 {
2598 }
2599 
2600 
2601 
2602 //*************************************************************************
2603 // produceType
2604 //*************************************************************************
produceType(const OString & typeName,TypeManager & typeMgr,TypeDependency & typeDependencies,CorbaOptions * pOptions,FileStream & o,TypeSet * allreadyDumped,TypeSet * generatedConversions)2605 sal_Bool produceType(const OString& typeName,
2606                         TypeManager& typeMgr,
2607                         TypeDependency& typeDependencies,
2608                         CorbaOptions* pOptions,
2609                         FileStream& o, TypeSet* allreadyDumped,
2610                         TypeSet* generatedConversions)
2611     throw( CannotDumpException )
2612 {
2613     sal_Bool bNewTypeSet = (allreadyDumped == NULL);
2614     sal_Bool ret = sal_True;
2615 
2616     if (bNewTypeSet)
2617         allreadyDumped = new TypeSet();
2618 
2619 
2620     if (!typeDependencies.isGenerated(typeName))
2621     {
2622        TypeReader reader(typeMgr.getTypeReader(typeName));
2623 
2624         if (!reader.isValid() && !typeName.equals("/"))
2625                 ret = sal_False;
2626 
2627         if( ret && !checkTypeDependencies(typeMgr, typeDependencies, typeName))
2628             ret = sal_False;
2629 
2630         if (ret)
2631         {
2632             RTTypeClass typeClass = reader.getTypeClass();
2633 
2634             switch (typeClass)
2635             {
2636                 case RT_TYPE_INTERFACE:
2637                 {
2638                     InterfaceType iType(reader, typeName, typeMgr, typeDependencies, generatedConversions);
2639                     ret = iType.dump(pOptions, o, allreadyDumped);
2640                     if (ret) typeDependencies.setGenerated(typeName);
2641                     ret = iType.dumpDependedTypes(pOptions, o, allreadyDumped);
2642                 }
2643                 break;
2644                 case RT_TYPE_MODULE:
2645                 {
2646                     ModuleType mType(reader, typeName, typeMgr, typeDependencies, generatedConversions);
2647                     if (mType.hasConstants())
2648                     {
2649                         ret = mType.dump(pOptions, o, allreadyDumped);
2650                         if (ret) typeDependencies.setGenerated(typeName);
2651                     } else
2652                     {
2653                         typeDependencies.setGenerated(typeName);
2654                         ret = sal_True;
2655                     }
2656                 }
2657                 break;
2658                 case RT_TYPE_STRUCT:
2659                 {
2660                     StructureType sType(reader, typeName, typeMgr, typeDependencies, generatedConversions);
2661                     ret = sType.dump(pOptions, o, allreadyDumped);
2662                     if (ret) typeDependencies.setGenerated(typeName);
2663                     ret = sType.dumpDependedTypes(pOptions, o, allreadyDumped);
2664                 }
2665                 break;
2666                 case RT_TYPE_ENUM:
2667                 {
2668                     EnumType enType(reader, typeName, typeMgr, typeDependencies, generatedConversions);
2669                     ret = enType.dump(pOptions, o, allreadyDumped);
2670                     if (ret) typeDependencies.setGenerated(typeName);
2671                     ret = enType.dumpDependedTypes(pOptions, o, allreadyDumped);
2672                 }
2673                 break;
2674                 case RT_TYPE_EXCEPTION:
2675                 {
2676                     ExceptionType eType(reader, typeName, typeMgr, typeDependencies, generatedConversions);
2677                     ret = eType.dump(pOptions, o, allreadyDumped);
2678                     if (ret) typeDependencies.setGenerated(typeName);
2679                     ret = eType.dumpDependedTypes(pOptions, o, allreadyDumped);
2680                 }
2681                 break;
2682                 case RT_TYPE_TYPEDEF:
2683                 {
2684                     TypeDefType tdType(reader, typeName, typeMgr, typeDependencies, generatedConversions);
2685                     ret = tdType.dump(pOptions, o, allreadyDumped);
2686                     if (ret) typeDependencies.setGenerated(typeName);
2687                     ret = tdType.dumpDependedTypes(pOptions, o, allreadyDumped);
2688                 }
2689                 break;
2690                 case RT_TYPE_CONSTANTS:
2691                 {
2692                     ConstantsType cType(reader, typeName, typeMgr, typeDependencies, generatedConversions);
2693                     if (cType.hasConstants())
2694                     {
2695                         ret = cType.dump(pOptions, o, allreadyDumped);
2696                         if (ret) typeDependencies.setGenerated(typeName);
2697                     } else
2698                     {
2699                         typeDependencies.setGenerated(typeName);
2700                         ret = sal_True;
2701                     }
2702                 }
2703                 break;
2704                 case RT_TYPE_SERVICE:
2705                 case RT_TYPE_OBJECT:
2706                     ret = sal_True;
2707                     break;
2708             }
2709         }
2710     }
2711 
2712     if (bNewTypeSet)
2713         delete allreadyDumped;
2714 
2715     return ret;
2716 }
2717 
2718 //*************************************************************************
2719 // scopedName
2720 //*************************************************************************
scopedName(const OString & scope,const OString & type,sal_Bool bNoNameSpace)2721 OString scopedName(const OString& scope, const OString& type,
2722        sal_Bool bNoNameSpace)
2723 {
2724     sal_Int32 nPos = type.lastIndexOf( '/' );
2725     if (nPos == -1)
2726         return type;
2727 
2728     if (bNoNameSpace)
2729         return type.copy(nPos+1);
2730 
2731     OStringBuffer tmpBuf(type.getLength()*2);
2732     nPos = 0;
2733     do
2734     {
2735         tmpBuf.append("::");
2736         tmpBuf.append(type.getToken(0, '/', nPos));
2737     } while( nPos != -1 );
2738 
2739     return tmpBuf.makeStringAndClear();
2740 }
2741 
2742 //*************************************************************************
2743 // shortScopedName
2744 //*************************************************************************
shortScopedName(const OString & scope,const OString & type,sal_Bool bNoNameSpace)2745 OString shortScopedName(const OString& scope, const OString& type,
2746             sal_Bool bNoNameSpace)
2747 {
2748     sal_Int32 nPos = type.lastIndexOf( '/' );
2749     if( nPos == -1 )
2750         return OString();
2751 
2752     if (bNoNameSpace)
2753         return OString();
2754 
2755     // scoped name only if the namespace is not equal
2756     if (scope.lastIndexOf('/') > 0)
2757     {
2758         OString tmpScp(scope.copy(0, scope.lastIndexOf('/')));
2759         OString tmpScp2(type.copy(0, nPos));
2760 
2761         if (tmpScp == tmpScp2)
2762             return OString();
2763     }
2764 
2765     OString aScope( type.copy( 0, nPos ) );
2766     OStringBuffer tmpBuf(aScope.getLength()*2);
2767 
2768     nPos = 0;
2769     do
2770     {
2771         tmpBuf.append("::");
2772         tmpBuf.append(aScope.getToken(0, '/', nPos));
2773     } while( nPos != -1 );
2774 
2775     return tmpBuf.makeStringAndClear();
2776 }
2777 
2778 
2779