Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "codemaker/commonjava.hxx"
21 :
22 : #include "skeletoncommon.hxx"
23 : #include "skeletonjava.hxx"
24 :
25 : using namespace ::rtl;
26 :
27 : namespace skeletonmaker { namespace java {
28 :
29 : void printType(std::ostream & o,
30 : ProgramOptions const & options, TypeManager const & manager,
31 : OString const & type, bool referenceType,
32 : bool defaultvalue);
33 :
34 0 : void printType(std::ostream & o,
35 : ProgramOptions const & options, TypeManager const & manager,
36 : codemaker::UnoType::Sort sort, RTTypeClass typeClass,
37 : OString const & name, sal_Int32 rank,
38 : std::vector< OString > const & arguments, bool referenceType,
39 : bool defaultvalue)
40 : {
41 0 : if ( defaultvalue && rank == 0 && sort <= codemaker::UnoType::SORT_CHAR ) {
42 0 : switch (sort)
43 : {
44 : case codemaker::UnoType::SORT_BOOLEAN:
45 0 : o << "false";
46 : return;
47 : case codemaker::UnoType::SORT_CHAR:
48 : case codemaker::UnoType::SORT_BYTE:
49 : case codemaker::UnoType::SORT_SHORT:
50 : case codemaker::UnoType::SORT_UNSIGNED_SHORT:
51 : case codemaker::UnoType::SORT_LONG:
52 : case codemaker::UnoType::SORT_UNSIGNED_LONG:
53 : case codemaker::UnoType::SORT_HYPER:
54 : case codemaker::UnoType::SORT_UNSIGNED_HYPER:
55 : case codemaker::UnoType::SORT_FLOAT:
56 : case codemaker::UnoType::SORT_DOUBLE:
57 0 : o << "0";
58 : return;
59 : case codemaker::UnoType::SORT_VOID:
60 : case codemaker::UnoType::SORT_STRING:
61 : case codemaker::UnoType::SORT_TYPE:
62 : case codemaker::UnoType::SORT_ANY:
63 : case codemaker::UnoType::SORT_COMPLEX:
64 0 : break;
65 : }
66 : }
67 :
68 0 : if ( defaultvalue ) {
69 0 : if ( sort == codemaker::UnoType::SORT_COMPLEX &&
70 : typeClass == RT_TYPE_INTERFACE ) {
71 0 : o << "null";
72 : return;
73 0 : } else if ( sort == codemaker::UnoType::SORT_ANY && rank==0 ) {
74 0 : o << "com.sun.star.uno.Any.VOID";
75 : return;
76 0 : } else if ( sort == codemaker::UnoType::SORT_TYPE && rank==0 ) {
77 0 : o << "com.sun.star.uno.Type.VOID";
78 : return;
79 : } else
80 0 : if ( typeClass != RT_TYPE_ENUM || rank > 0 )
81 0 : o << "new ";
82 : }
83 :
84 : OString sType(codemaker::java::translateUnoToJavaType(
85 0 : sort, typeClass, name, referenceType && rank==0).replace('/', '.'));
86 0 : if ( sType.indexOf("java.lang.") == 0 )
87 0 : sType = sType.copy(10);
88 0 : o << sType.getStr();
89 0 : if ( !arguments.empty() && options.java5 ) {
90 0 : o << '<';
91 0 : for ( std::vector< OString >::const_iterator i(arguments.begin());
92 0 : i != arguments.end(); ++i )
93 : {
94 0 : if ( i != arguments.begin() ) {
95 0 : o << ", ";
96 : }
97 :
98 0 : printType(o, options, manager, *i, true, false);
99 : }
100 0 : o << '>';
101 : }
102 0 : for ( sal_Int32 i = 0; i < rank; ++i ) {
103 0 : if ( defaultvalue )
104 0 : o << "[0]";
105 : else
106 0 : o << "[]";
107 : }
108 :
109 0 : if ( defaultvalue && sort > codemaker::UnoType::SORT_CHAR && rank == 0 ) {
110 0 : if ( typeClass == RT_TYPE_ENUM )
111 0 : o << ".getDefault()";
112 : else
113 0 : o << "()";
114 0 : }
115 : }
116 :
117 0 : void printType(std::ostream & o,
118 : ProgramOptions const & options, TypeManager const & manager,
119 : OString const & type, bool referenceType, bool defaultvalue)
120 : {
121 : RTTypeClass typeClass;
122 0 : OString name;
123 : sal_Int32 rank;
124 0 : std::vector< OString > arguments;
125 : codemaker::UnoType::Sort sort = codemaker::decomposeAndResolve(
126 0 : manager, type, true, true, true, &typeClass, &name, &rank, &arguments);
127 : printType(o,
128 : options, manager, sort, typeClass, name, rank, arguments,
129 0 : referenceType, defaultvalue);
130 0 : }
131 :
132 0 : bool printConstructorParameters(std::ostream & o,
133 : ProgramOptions const & options, TypeManager const & manager,
134 : typereg::Reader const & reader, typereg::Reader const & outerReader,
135 : std::vector< OString > const & arguments)
136 : {
137 0 : bool previous = false;
138 0 : if ( reader.getSuperTypeCount() != 0 ) {
139 : OString super(
140 0 : codemaker::convertString(reader.getSuperTypeName(0)));
141 0 : typereg::Reader superReader(manager.getTypeReader(super));
142 0 : if ( !superReader.isValid() ) {
143 0 : throw CannotDumpException("Bad type library entity " + super);
144 : }
145 : previous = printConstructorParameters(o,
146 0 : options, manager, superReader, outerReader, arguments);
147 : }
148 0 : for ( sal_uInt16 i = 0; i < reader.getFieldCount(); ++i ) {
149 0 : if ( previous ) {
150 0 : o << ", ";
151 : }
152 0 : previous = true;
153 0 : if ( (reader.getFieldFlags(i) & RT_ACCESS_PARAMETERIZED_TYPE) == 0 ) {
154 : printType(o,
155 : options, manager,
156 : codemaker::convertString(reader.getFieldTypeName(i)),
157 0 : false);
158 0 : } else if ( arguments.empty() ) {
159 0 : o << "java.lang.Object";
160 : } else {
161 0 : sal_uInt16 tparam = 0;
162 0 : while ( outerReader.getReferenceTypeName(tparam)
163 0 : != reader.getFieldTypeName(i) )
164 : {
165 0 : ++tparam;
166 : OSL_ASSERT(tparam < outerReader.getReferenceCount());
167 : }
168 : // assume std::vector< OString >::size_type is at least as
169 : // large as sal_uInt16:
170 0 : printType(o, options, manager, arguments[tparam], true);
171 : }
172 : o
173 0 : << ' '
174 : << (codemaker::java::translateUnoToJavaIdentifier(
175 : codemaker::convertString(reader.getFieldName(i)),
176 : "param").
177 0 : getStr());
178 : }
179 0 : return previous;
180 : }
181 :
182 0 : void printConstructor(std::ostream & o,
183 : ProgramOptions const & options, TypeManager const & manager,
184 : typereg::Reader const & reader,
185 : std::vector< OString > const & arguments)
186 : {
187 0 : OString type(codemaker::convertString(reader.getTypeName()));
188 0 : o << "public " << type.copy(type.lastIndexOf('/') + 1) << '(';
189 0 : printConstructorParameters(o, options, manager, reader, reader, arguments);
190 0 : o << ");\n";
191 0 : }
192 :
193 0 : void printMethodParameters(std::ostream & o,
194 : ProgramOptions const & options, TypeManager const & manager,
195 : typereg::Reader const & reader, sal_uInt16 method, bool previous,
196 : bool withtype)
197 : {
198 0 : for ( sal_uInt16 i = 0; i < reader.getMethodParameterCount(method); ++i ) {
199 0 : if ( previous )
200 0 : o << ", ";
201 : else
202 0 : previous = true;
203 :
204 0 : if ( withtype ) {
205 : printType(o, options, manager,
206 : codemaker::convertString(
207 : reader.getMethodParameterTypeName(method, i)),
208 0 : false);
209 0 : if ( reader.getMethodParameterFlags(method, i) == RT_PARAM_OUT
210 0 : || reader.getMethodParameterFlags(method, i) == RT_PARAM_INOUT )
211 : {
212 0 : o << "[]";
213 0 : } else if ( (reader.getMethodParameterFlags(method, i) & RT_PARAM_REST )
214 : != 0)
215 : {
216 0 : o << (options.java5 ? "..." : "[]");
217 : }
218 0 : o << ' ';
219 : }
220 : o << (codemaker::java::translateUnoToJavaIdentifier(
221 : codemaker::convertString(
222 : reader.getMethodParameterName(method, i)),
223 : "param").
224 0 : getStr());
225 : }
226 0 : }
227 :
228 0 : void printExceptionSpecification(std::ostream & o,
229 : ProgramOptions const & options, TypeManager const & manager,
230 : typereg::Reader const & reader, sal_uInt16 method)
231 : {
232 0 : if ( reader.getMethodExceptionCount(method) > 0 ) {
233 0 : o << " throws ";
234 0 : for ( sal_uInt16 i = 0; i < reader.getMethodExceptionCount(method); ++i )
235 : {
236 0 : if ( i != 0 ) {
237 0 : o << ", ";
238 : }
239 : printType(o,
240 : options, manager,
241 : codemaker::convertString(
242 : reader.getMethodExceptionTypeName(method, i)),
243 0 : false);
244 : }
245 : }
246 0 : }
247 :
248 :
249 0 : void printSetPropertyMixinBody(std::ostream & o,
250 : typereg::Reader const & reader,
251 : sal_uInt16 field,
252 : sal_uInt16 method,
253 : OString const & indentation)
254 : {
255 0 : RTFieldAccess propFlags = checkAdditionalPropertyFlags(reader, field, method);
256 0 : OString fieldname = codemaker::convertString(reader.getFieldName(field));
257 0 : bool bound = (reader.getFieldFlags(field) & RT_ACCESS_BOUND ? true : false);
258 :
259 0 : o << "\n" << indentation << "{\n";
260 :
261 0 : if ( bound ) {
262 0 : o << indentation << " PropertySetMixin.BoundListeners l = "
263 0 : "new PropertySetMixin.BoundListeners();\n\n";
264 : }
265 :
266 0 : o << indentation << " m_prophlp.prepareSet(\""
267 0 : << fieldname << "\", ";
268 0 : if ( propFlags & RT_ACCESS_CONSTRAINED ) {
269 0 : OString fieldtype = codemaker::convertString(reader.getFieldTypeName(field));
270 :
271 0 : sal_Int32 index = fieldtype.lastIndexOf('<');
272 0 : sal_Int32 nPos=0;
273 0 : bool single = true;
274 0 : bool optional = false;
275 0 : OStringBuffer buffer1(64);
276 0 : OStringBuffer buffer2(64);
277 0 : do
278 : {
279 0 : OString s(fieldtype.getToken(0, '<', nPos));
280 0 : OStringBuffer buffer(16);
281 0 : buffer.append("((");
282 0 : buffer.append(s.copy(s.lastIndexOf('/')+1));
283 0 : buffer.append(')');
284 0 : OString t = buffer.makeStringAndClear();
285 :
286 0 : if ( t.equals("((Optional)") ) {
287 0 : optional=true;
288 0 : if (single) {
289 0 : single=false;
290 0 : buffer1.append("the_value.IsPresent");
291 0 : buffer2.append("the_value.Value");
292 : } else {
293 0 : buffer1.insert(0, t);
294 0 : buffer1.append(").IsPresent");
295 0 : buffer2.insert(0, t);
296 0 : buffer2.append(").Value");
297 : }
298 : } else {
299 0 : if ( single ) {
300 0 : single=false;
301 0 : if ( !optional ) {
302 0 : buffer1.append("the_value.Value");
303 : }
304 0 : buffer2.append("the_value.Value");
305 : } else {
306 0 : if ( !optional ) {
307 0 : buffer1.insert(0, t);
308 0 : buffer1.append(").Value");
309 : }
310 0 : buffer2.insert(0, t);
311 0 : buffer2.append(").Value");
312 : }
313 0 : }
314 : } while( nPos <= index );
315 :
316 0 : o << "Any.VOID,\n" << indentation << " ";
317 0 : if ( optional )
318 0 : o << "(";
319 0 : o << buffer1.makeStringAndClear();
320 0 : if ( optional )
321 0 : o << ") ? " << buffer2.makeStringAndClear() << " : Any.VOID,\n"
322 0 : << indentation << " ";
323 : else
324 0 : o << ", ";
325 : }
326 :
327 0 : if ( bound )
328 0 : o << "l";
329 : else
330 0 : o << "null";
331 0 : o << ");\n";
332 :
333 0 : o << indentation << " synchronized (this) {\n"
334 0 : << indentation << " m_" << fieldname
335 0 : << " = the_value;\n" << indentation << " }\n";
336 :
337 0 : if ( bound ) {
338 0 : o << indentation << " l.notifyListeners();\n";
339 : }
340 0 : o << indentation << "}\n\n";
341 0 : }
342 :
343 : void generateXPropertySetBodies(std::ostream& o);
344 : void generateXFastPropertySetBodies(std::ostream& o);
345 : void generateXPropertyAccessBodies(std::ostream& o);
346 :
347 0 : void printMethods(std::ostream & o,
348 : ProgramOptions const & options, TypeManager const & manager,
349 : typereg::Reader const & reader,
350 : codemaker::GeneratedTypeSet & generated,
351 : OString const & delegate, OString const & indentation,
352 : bool defaultvalue, bool usepropertymixin)
353 : {
354 0 : OString type(codemaker::convertString(reader.getTypeName()));
355 0 : if ( generated.contains(type) || type == "com/sun/star/uno/XInterface" ||
356 : ( defaultvalue &&
357 0 : ( type.equals("com/sun/star/lang/XComponent") ||
358 0 : type.equals("com/sun/star/lang/XTypeProvider") ||
359 0 : type.equals("com/sun/star/uno/XWeak") ) ) ) {
360 : return;
361 : }
362 :
363 0 : if ( usepropertymixin ) {
364 0 : if ( type.equals("com/sun/star/beans/XPropertySet") ) {
365 0 : generated.add(type);
366 0 : generateXPropertySetBodies(o);
367 : return;
368 0 : } else if ( type.equals("com/sun/star/beans/XFastPropertySet") ) {
369 0 : generated.add(type);
370 0 : generateXFastPropertySetBodies(o);
371 : return;
372 0 : } else if ( type.equals("com/sun/star/beans/XPropertyAccess") ) {
373 0 : generated.add(type);
374 0 : generateXPropertyAccessBodies(o);
375 : return;
376 : }
377 : }
378 :
379 0 : static OString sd(RTL_CONSTASCII_STRINGPARAM("_"));
380 0 : bool body = !delegate.isEmpty();
381 0 : bool defaultbody = ((delegate.equals(sd)) ? true : false);
382 :
383 0 : generated.add(type);
384 0 : if ( options.all || defaultvalue ) {
385 0 : for (sal_uInt16 i = 0; i < reader.getSuperTypeCount(); ++i) {
386 : typereg::Reader super(
387 : manager.getTypeReader(
388 : codemaker::convertString(
389 0 : reader.getSuperTypeName(i))));
390 0 : if ( !super.isValid() ) {
391 : throw CannotDumpException(
392 : "Bad type library entity "
393 : + codemaker::convertString(
394 0 : reader.getSuperTypeName(i)));
395 : }
396 : printMethods(o, options, manager, super, generated, delegate,
397 0 : indentation, defaultvalue, usepropertymixin);
398 0 : }
399 0 : if ( reader.getFieldCount() > 0 || reader.getMethodCount() > 0 ) {
400 0 : o << indentation << "// ";
401 0 : printType(o, options, manager, type, false);
402 0 : o << ":\n";
403 : }
404 : }
405 0 : sal_uInt16 method = 0;
406 0 : for ( sal_uInt16 i = 0; i < reader.getFieldCount(); ++i ) {
407 : // OString fieldName(
408 : // codemaker::convertString(reader.getFieldName(i)).
409 : // replace('/', '.'));
410 : // OString fieldType(
411 : // codemaker::convertString(reader.getFieldTypeName(i)).
412 : // replace('/', '.'));
413 : // attributes.insert(StringPairHashMap::value_type(fieldName,
414 : // std::pair<OString, sal_Int16>(
415 : // fieldType, reader.getFieldFlags(i))));
416 :
417 0 : o << indentation << "public ";
418 : printType(o,
419 : options, manager,
420 0 : codemaker::convertString(reader.getFieldTypeName(i)), false);
421 0 : o << " get"
422 0 : << codemaker::convertString(reader.getFieldName(i)).getStr()
423 0 : << "()";
424 :
425 0 : OUString mn = reader.getMethodName(method);
426 0 : OUString fn = reader.getFieldName(i);
427 :
428 0 : if ( method < reader.getMethodCount()
429 0 : && reader.getMethodFlags(method) == RT_MODE_ATTRIBUTE_GET
430 0 : && reader.getMethodName(method) == reader.getFieldName(i) )
431 : {
432 0 : printExceptionSpecification(o, options, manager, reader, method++);
433 : }
434 0 : if ( body ) {
435 0 : if ( defaultbody ) {
436 0 : if ( usepropertymixin ) {
437 0 : o << "\n" << indentation << "{\n" << indentation
438 0 : << " return m_"
439 0 : << codemaker::convertString(reader.getFieldName(i)).getStr()
440 0 : << ";\n" << indentation << "}\n\n";
441 : } else {
442 0 : o << "\n" << indentation << "{\n" << indentation
443 0 : << " return ";
444 : printType(o,
445 : options, manager,
446 : codemaker::convertString(reader.getFieldTypeName(i)),
447 0 : false, true);
448 0 : o << ";\n" << indentation << "}\n\n";
449 : }
450 : } else {
451 0 : o << "\n" << indentation << "{\n" << indentation <<
452 0 : " return "
453 0 : << delegate.getStr() << "get"
454 0 : << codemaker::convertString(reader.getFieldName(i)).getStr()
455 0 : << "();\n" << indentation << "}\n\n";
456 : }
457 : } else {
458 0 : o << ";\n";
459 : }
460 :
461 : // REMOVE next line
462 0 : OUString tmp = reader.getFieldName(i);
463 0 : bool setAttrMethod = false;
464 0 : if ( (reader.getFieldFlags(i) & RT_ACCESS_READONLY) == 0 ) {
465 0 : o << indentation << "public void set"
466 : << (codemaker::convertString(reader.getFieldName(i)).
467 0 : getStr())
468 0 : << '(';
469 : printType(o,
470 : options, manager,
471 : codemaker::convertString(reader.getFieldTypeName(i)),
472 0 : false);
473 0 : o << " the_value)";
474 0 : if ( method < reader.getMethodCount()
475 0 : && reader.getMethodFlags(method) == RT_MODE_ATTRIBUTE_SET
476 0 : && reader.getMethodName(method) == reader.getFieldName(i) )
477 : {
478 0 : setAttrMethod=true;
479 0 : printExceptionSpecification(o, options, manager, reader, method);
480 : }
481 0 : if ( body ) {
482 0 : if ( defaultbody ) {
483 0 : if ( usepropertymixin ) {
484 : printSetPropertyMixinBody(o, reader, i, method,
485 0 : indentation);
486 : } else {
487 0 : o << "\n" << indentation << "{\n\n" << indentation
488 0 : << "}\n\n";
489 : }
490 : } else {
491 0 : o << "\n" << indentation << "{\n" << indentation
492 0 : << " " << delegate.getStr() << "set"
493 0 : << codemaker::convertString(reader.getFieldName(i)).getStr()
494 0 : << "(the_value);\n" << indentation << "}\n\n";
495 : }
496 : } else {
497 0 : o << ";\n";
498 : }
499 0 : if (setAttrMethod) ++method;
500 : }
501 0 : }
502 0 : for ( ; method < reader.getMethodCount(); ++method ) {
503 0 : o << indentation << "public ";
504 : printType(o,
505 : options, manager,
506 : codemaker::convertString(
507 : reader.getMethodReturnTypeName(method)),
508 0 : false);
509 :
510 0 : const OString methodName(codemaker::convertString(reader.getMethodName(method)));
511 :
512 0 : o << ' ' << methodName.getStr() << '(';
513 0 : printMethodParameters(o, options, manager, reader, method, false, true);
514 0 : o << ')';
515 0 : printExceptionSpecification(o, options, manager, reader, method);
516 0 : if ( body ) {
517 0 : static OUString s(RTL_CONSTASCII_USTRINGPARAM("void"));
518 0 : if ( defaultbody ) {
519 0 : o << "\n" << indentation << "{\n";
520 0 : if ( !reader.getMethodReturnTypeName(method).equals(s) ) {
521 0 : o << indentation << " // TODO: Exchange the default return "
522 0 : << "implementation for \"" << methodName << "\" !!!\n";
523 0 : o << indentation << " // NOTE: "
524 : "Default initialized polymorphic structs can cause problems"
525 0 : "\n" << indentation << " // because of missing default "
526 0 : "initialization of primitive types of\n" << indentation
527 : << " // some C++ compilers or different Any initialization"
528 0 : " in Java and C++\n" << indentation
529 0 : << " // polymorphic structs.\n" << indentation
530 0 : << " return ";
531 : printType(o,
532 : options, manager,
533 : codemaker::convertString(
534 : reader.getMethodReturnTypeName(method)),
535 0 : false, true);
536 0 : o << ";";
537 : } else {
538 0 : o << indentation << " // TODO: Insert your implementation for \""
539 0 : << methodName << "\" here.";
540 : }
541 0 : o << "\n" << indentation << "}\n\n";
542 : } else {
543 0 : o << "\n" << indentation << "{\n" << indentation << " ";
544 0 : if ( !reader.getMethodReturnTypeName(method).equals(s) )
545 0 : o << "return ";
546 0 : o << delegate.getStr()
547 : << (codemaker::convertString(
548 0 : reader.getMethodName(method)).getStr())
549 0 : << '(';
550 : printMethodParameters(o, options, manager, reader, method,
551 0 : false, false);
552 0 : o << ");\n" << indentation << "}\n\n";
553 : }
554 : } else {
555 0 : o << ";\n";
556 : }
557 0 : }
558 : }
559 :
560 0 : void printConstructionMethods(std::ostream & o,
561 : ProgramOptions const & options, TypeManager const & manager,
562 : typereg::Reader const & reader)
563 : {
564 0 : for ( sal_uInt16 i = 0; i < reader.getMethodCount(); ++i ) {
565 0 : o << "public static ";
566 : printType(o,
567 : options, manager,
568 0 : codemaker::convertString(reader.getSuperTypeName(0)), false);
569 0 : o << ' ';
570 0 : if ( reader.getMethodName(i).isEmpty() ) {
571 0 : o << "create";
572 : } else {
573 : o << (codemaker::java::translateUnoToJavaIdentifier(
574 : codemaker::convertString(reader.getMethodName(i)),
575 0 : "method").getStr());
576 : }
577 0 : o << "(com.sun.star.uno.XComponentContext the_context";
578 0 : printMethodParameters(o, options, manager, reader, i, true, true);
579 0 : o << ')';
580 0 : printExceptionSpecification(o, options, manager, reader, i);
581 0 : o << ";\n";
582 : }
583 0 : }
584 :
585 : void generateDocumentation(std::ostream & o,
586 : ProgramOptions const & options, TypeManager const & manager,
587 : OString const & type);
588 :
589 0 : void printServiceMembers(std::ostream & o,
590 : ProgramOptions const & options, TypeManager const & manager,
591 : typereg::Reader const & reader, OString const & type,
592 : OString const & delegate)
593 : {
594 0 : for ( sal_uInt16 i = 0; i < reader.getReferenceCount(); ++i ) {
595 : OString referenceType(
596 : codemaker::convertString(
597 0 : reader.getReferenceTypeName(i)).replace('/', '.'));
598 :
599 0 : if ( reader.getReferenceSort(i) == RT_REF_SUPPORTS ) {
600 0 : o << "\n// supported interface " << referenceType.getStr() << "\n";
601 0 : generateDocumentation(o, options, manager, referenceType, delegate);
602 0 : } else if ( reader.getReferenceSort(i) == RT_REF_EXPORTS ) {
603 0 : o << "\n// exported service " << referenceType.getStr() << "\n";
604 0 : generateDocumentation(o, options, manager, referenceType, delegate);
605 : }
606 0 : }
607 :
608 0 : o << "\n// properties of service \""<< type.getStr() << "\"\n";
609 0 : for ( sal_uInt16 i = 0; i < reader.getFieldCount(); ++i ) {
610 : OString fieldName(
611 0 : codemaker::convertString(reader.getFieldName(i)));
612 : OString fieldType(
613 0 : codemaker::convertString(reader.getFieldTypeName(i)));
614 :
615 0 : o << "// private ";
616 0 : printType(o, options, manager, fieldType, false);
617 0 : o << " "
618 : << codemaker::java::translateUnoToJavaIdentifier(
619 0 : fieldName, "property").getStr()
620 0 : << ";\n";
621 0 : }
622 0 : }
623 :
624 0 : void printMapsToJavaType(std::ostream & o,
625 : ProgramOptions const & options, TypeManager const & manager,
626 : codemaker::UnoType::Sort sort, RTTypeClass typeClass,
627 : OString const & name, sal_Int32 rank,
628 : std::vector< OString > const & arguments, const char * javaTypeSort)
629 : {
630 0 : o << "maps to Java " << (options.java5 ? "1.5" : "1.4") << " ";
631 0 : if ( javaTypeSort != 0 ) {
632 0 : o << javaTypeSort << ' ';
633 : }
634 0 : o << "type \"";
635 0 : if ( rank == 0 && name == "com/sun/star/uno/XInterface" ) {
636 0 : o << "com.sun.star.uno.XInterface";
637 : } else {
638 : printType(o,
639 0 : options, manager, sort, typeClass, name, rank, arguments, false);
640 : }
641 0 : o << '"';
642 0 : }
643 :
644 0 : void generateDocumentation(std::ostream & o,
645 : ProgramOptions const & options, TypeManager const & manager,
646 : OString const & type, OString const & delegate)
647 : {
648 0 : if ( type.indexOf('/') >= 0 ) {
649 0 : throw CannotDumpException("Illegal type name " + type);
650 : }
651 0 : OString binType(type.replace('.', '/'));
652 : RTTypeClass typeClass;
653 0 : OString name;
654 : sal_Int32 rank;
655 0 : std::vector< OString > arguments;
656 : codemaker::UnoType::Sort sort = decomposeResolveAndCheck(
657 : manager, binType, false, true, true, &typeClass, &name, &rank,
658 0 : &arguments);
659 :
660 0 : bool comment=true;
661 0 : if ( !delegate.isEmpty() ) {
662 0 : if ( typeClass != RT_TYPE_INTERFACE && typeClass != RT_TYPE_SERVICE )
663 0 : return;
664 :
665 0 : comment=false;
666 : }
667 :
668 0 : if ( comment ) {
669 0 : o << "\n// UNO";
670 0 : if ( rank > 0 ) {
671 0 : o << " sequence type";
672 0 : } else if ( sort != codemaker::UnoType::SORT_COMPLEX ) {
673 0 : o << " simple type";
674 : } else {
675 0 : typereg::Reader reader(manager.getTypeReader(name));
676 0 : if ( !reader.isValid() ) {
677 0 : throw CannotDumpException("Bad type library entity " + name);
678 : }
679 0 : switch ( typeClass ) {
680 : case RT_TYPE_INTERFACE:
681 0 : o << " interface type";
682 0 : break;
683 :
684 : case RT_TYPE_MODULE:
685 0 : o << "IDL module";
686 0 : break;
687 :
688 : case RT_TYPE_STRUCT:
689 0 : if ( reader.getReferenceCount() == 0 ) {
690 0 : o << " simple struct type";
691 0 : } else if ( arguments.empty() ) {
692 0 : o << " polymorphic struct type template";
693 : } else {
694 0 : o << " instantiated polymorphic struct type";
695 : }
696 0 : break;
697 :
698 : case RT_TYPE_ENUM:
699 0 : o << " enum type";
700 0 : break;
701 :
702 : case RT_TYPE_EXCEPTION:
703 0 : o << " exception type";
704 0 : break;
705 :
706 : case RT_TYPE_TYPEDEF:
707 0 : o << "IDL typedef";
708 0 : break;
709 :
710 : case RT_TYPE_SERVICE:
711 0 : if ( reader.getSuperTypeCount() > 0 ) {
712 0 : o << " single-inheritance--based service";
713 : } else {
714 0 : o << "IDL accumulation-based service";
715 : }
716 0 : break;
717 :
718 : case RT_TYPE_SINGLETON:
719 0 : if ( (manager.getTypeReader(
720 : codemaker::convertString(
721 0 : reader.getSuperTypeName(0))).getTypeClass())
722 : == RT_TYPE_INTERFACE )
723 : {
724 0 : o << " inheritance-based singleton";
725 : } else {
726 0 : o << "IDL service-based singleton";
727 : }
728 0 : break;
729 :
730 : case RT_TYPE_CONSTANTS:
731 0 : o << "IDL constant group";
732 0 : break;
733 :
734 : default:
735 : OSL_ASSERT(false);
736 0 : break;
737 0 : }
738 : }
739 0 : o << " \"" << type.getStr() << "\" ";
740 : }
741 : sort = codemaker::decomposeAndResolve(
742 : manager, binType, true, true, true, &typeClass, &name, &rank,
743 0 : &arguments);
744 0 : if ( rank > 0 ) {
745 : printMapsToJavaType(o,
746 0 : options, manager, sort, typeClass, name, rank, arguments, "array");
747 0 : o << '\n';
748 0 : } else if ( sort != codemaker::UnoType::SORT_COMPLEX ) {
749 : printMapsToJavaType(o,
750 0 : options, manager, sort, typeClass, name, rank, arguments, 0);
751 0 : o << '\n';
752 : } else {
753 0 : typereg::Reader reader(manager.getTypeReader(name));
754 0 : if ( !reader.isValid() ) {
755 0 : throw CannotDumpException("Bad type library entity " + name);
756 : }
757 0 : switch ( typeClass ) {
758 : case RT_TYPE_INTERFACE:
759 : printMapsToJavaType(o,
760 : options, manager, sort, typeClass, name, rank, arguments,
761 0 : "interface");
762 0 : if ( name == "com/sun/star/uno/XInterface" ) {
763 0 : o << '\n';
764 : } else {
765 : o
766 0 : << "; " << (options.all ? "all" : "direct")
767 0 : << " methods:\n";
768 0 : codemaker::GeneratedTypeSet generated;
769 : printMethods(o, options, manager, reader, generated,
770 0 : delegate, "");
771 : }
772 0 : break;
773 :
774 : case RT_TYPE_MODULE:
775 : printMapsToJavaType(o,
776 : options, manager, sort, typeClass, name, rank, arguments,
777 0 : "package");
778 0 : o << '\n';
779 0 : break;
780 :
781 : case RT_TYPE_STRUCT:
782 0 : if ( reader.getReferenceCount() == 0 ) {
783 : printMapsToJavaType(o,
784 : options, manager, sort, typeClass, name, rank, arguments,
785 0 : "class");
786 0 : } else if ( arguments.empty() ) {
787 : printMapsToJavaType(o,
788 : options, manager, sort, typeClass, name, rank, arguments,
789 0 : options.java5 ? "generic class" : "class");
790 : } else {
791 : printMapsToJavaType(o,
792 : options, manager, sort, typeClass, name, rank, arguments,
793 0 : options.java5 ? "generic class instantiation" : "class");
794 : }
795 0 : o << "; full constructor:\n";
796 0 : printConstructor(o, options, manager, reader, arguments);
797 0 : break;
798 :
799 : case RT_TYPE_ENUM:
800 : case RT_TYPE_CONSTANTS:
801 : printMapsToJavaType(o,
802 : options, manager, sort, typeClass, name, rank, arguments,
803 0 : "class");
804 0 : o << '\n';
805 0 : break;
806 :
807 : case RT_TYPE_EXCEPTION:
808 : printMapsToJavaType(o,
809 : options, manager, sort, typeClass, name, rank, arguments,
810 0 : "exception class");
811 0 : o << "; full constructor:\n";
812 0 : printConstructor(o, options, manager, reader, arguments);
813 0 : break;
814 :
815 : case RT_TYPE_SERVICE:
816 0 : if ( reader.getSuperTypeCount() > 0 ) {
817 : printMapsToJavaType(o,
818 : options, manager, sort, typeClass, name, rank, arguments,
819 0 : "class");
820 0 : o << "; construction methods:\n";
821 0 : printConstructionMethods(o, options, manager, reader);
822 :
823 : OString super(
824 : codemaker::convertString(
825 0 : reader.getSuperTypeName(0)).replace('/', '.'));
826 :
827 0 : generateDocumentation(o, options, manager, super, delegate);
828 : } else {
829 : o << ("does not map to Java\n"
830 0 : "// the service members are generated instead\n");
831 0 : printServiceMembers(o, options, manager, reader, type, delegate);
832 : }
833 0 : break;
834 :
835 : case RT_TYPE_SINGLETON:
836 0 : if ( reader.getSuperTypeCount() > 0 &&
837 : ((manager.getTypeReader(
838 : codemaker::convertString(
839 0 : reader.getSuperTypeName(0))).getTypeClass())
840 : == RT_TYPE_INTERFACE) ) {
841 : printMapsToJavaType(o, options, manager, sort, typeClass,
842 0 : name, rank, arguments, "class");
843 0 : o << "; get method:\npublic static ";
844 : printType(o, options, manager,
845 : codemaker::convertString(reader.getSuperTypeName(0)),
846 0 : false);
847 : o
848 0 : << " get(com.sun.star.uno.XComponentContext context);\n";
849 : } else {
850 0 : o << "does not map to Java\n";
851 : }
852 0 : break;
853 :
854 : default:
855 : OSL_ASSERT(false);
856 0 : break;
857 0 : }
858 0 : }
859 : }
860 :
861 : } }
862 :
863 :
864 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|