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