VirtualBox

source: vbox/trunk/src/VBox/Main/idl/midl.xsl@ 56396

Last change on this file since 56396 was 56396, checked in by vboxsync, 9 years ago

Main/idl: introduce attributes to define how many reserved attributes/methods should be added to a particular interface (currently unused, i.e. not much tested)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 29.8 KB
Line 
1<?xml version="1.0"?>
2<!-- $Id: midl.xsl 56396 2015-06-12 18:02:06Z vboxsync $ -->
3
4<!--
5 * A template to generate a MS IDL compatible interface definition file
6 * from the generic interface definition expressed in XML.
7
8 Copyright (C) 2006-2015 Oracle Corporation
9
10 This file is part of VirtualBox Open Source Edition (OSE), as
11 available from http://www.virtualbox.org. This file is free software;
12 you can redistribute it and/or modify it under the terms of the GNU
13 General Public License (GPL) as published by the Free Software
14 Foundation, in version 2 as it comes in the "COPYING" file of the
15 VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17-->
18
19<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
20<xsl:output method="text"/>
21
22<xsl:strip-space elements="*"/>
23
24<!-- Whether to generate proxy code and type library ('yes'), or just the type-library. -->
25<xsl:param name="g_fGenProxy" select="'no'"/>
26
27<xsl:include href="typemap-shared.inc.xsl"/>
28
29
30<!--
31// templates
32/////////////////////////////////////////////////////////////////////////////
33-->
34
35<!--
36 * not explicitly matched elements and attributes
37-->
38<xsl:template match="*"/>
39
40
41<!--
42 * header
43-->
44<xsl:template match="/idl">
45 <xsl:text>
46/*
47 * DO NOT EDIT! This is a generated file.
48 *
49 * MS IDL (MIDL) definition for VirtualBox Main API (COM interfaces)
50 * generated from XIDL (XML interface definition).
51 *
52 * Source : src/VBox/Main/idl/VirtualBox.xidl
53 * Generator : src/VBox/Main/idl/midl.xsl
54 */
55 </xsl:text>
56 <xsl:text>&#x0A;</xsl:text>
57 <xsl:text>import "unknwn.idl";&#x0A;&#x0A;</xsl:text>
58 <xsl:apply-templates/>
59</xsl:template>
60
61
62<!--
63 * ignore all |if|s except those for MIDL target
64-->
65<xsl:template match="if">
66 <xsl:if test="@target='midl'">
67 <xsl:apply-templates/>
68 </xsl:if>
69</xsl:template>
70<xsl:template match="if" mode="forward">
71 <xsl:if test="@target='midl'">
72 <xsl:apply-templates mode="forward"/>
73 </xsl:if>
74</xsl:template>
75<xsl:template match="if" mode="forwarder">
76 <xsl:param name="nameOnly"/>
77 <xsl:if test="@target='midl'">
78 <xsl:apply-templates mode="forwarder">
79 <xsl:with-param name="nameOnly" select="$nameOnly"/>
80 </xsl:apply-templates>
81 </xsl:if>
82</xsl:template>
83
84
85<!--
86 * cpp_quote
87-->
88<xsl:template match="cpp">
89 <xsl:text>cpp_quote("</xsl:text>
90 <xsl:value-of select="@line"/>
91 <xsl:text>")&#x0A;&#x0A;</xsl:text>
92</xsl:template>
93
94
95<!--
96 * #if statement (@if attribute)
97-->
98<xsl:template match="@if" mode="begin">
99 <xsl:text>#if </xsl:text>
100 <xsl:value-of select="."/>
101 <xsl:text>&#x0A;</xsl:text>
102</xsl:template>
103<xsl:template match="@if" mode="end">
104 <xsl:text>#endif&#x0A;</xsl:text>
105</xsl:template>
106
107
108<!--
109 * libraries
110-->
111<xsl:template match="library">
112 <xsl:if test="$g_fGenProxy = 'yes'">
113 <!-- Declare everything outside the library and then reference these
114 from inside the library statement. See:
115 http://msdn.microsoft.com/en-us/library/windows/desktop/aa366841(v=vs.85).aspx -->
116 <xsl:text>&#x0A;</xsl:text>
117 <!-- forward declarations -->
118 <xsl:apply-templates select="if | interface" mode="forward"/>
119 <xsl:text>&#x0A;</xsl:text>
120 <!-- all enums go first -->
121 <xsl:apply-templates select="enum | if/enum"/>
122 <!-- declare the interfaces -->
123 <xsl:apply-templates select="if | interface"/>
124 </xsl:if>
125
126[
127 uuid(<xsl:value-of select="@uuid"/>),
128 version(<xsl:value-of select="@version"/>),
129 helpstring("<xsl:value-of select="@desc"/>")
130]
131<xsl:text>library </xsl:text>
132 <xsl:value-of select="@name"/>
133 <xsl:text>&#x0A;{&#x0A;</xsl:text>
134 <xsl:text>&#x0A;importlib("stdole2.tlb");&#x0A;&#x0A;</xsl:text>
135 <!-- result codes -->
136 <xsl:for-each select="result">
137 <xsl:apply-templates select="."/>
138 </xsl:for-each>
139 <xsl:text>&#x0A;</xsl:text>
140 <xsl:text>&#x0A;</xsl:text>
141 <xsl:choose>
142 <xsl:when test="$g_fGenProxy = 'yes'">
143 <!-- reference enums and interfaces -->
144 <xsl:apply-templates select="if | interface" mode="forward"/>
145 <xsl:apply-templates select="enum | if/enum" mode="forward"/>
146 <!-- the modules (i.e. everything else) -->
147 <xsl:apply-templates select="module | if/module"/>
148 </xsl:when>
149 <xsl:otherwise>
150 <!-- forward declarations -->
151 <xsl:apply-templates select="if | interface" mode="forward"/>
152 <!-- all enums go first -->
153 <xsl:apply-templates select="enum | if/enum"/>
154 <!-- everything else but result codes and enums -->
155 <xsl:apply-templates select="*[not(self::result or self::enum) and
156 not(self::if[result] or self::if[enum])]"/>
157 </xsl:otherwise>
158 </xsl:choose>
159 <!-- -->
160 <xsl:text>}; /* library </xsl:text>
161 <xsl:value-of select="@name"/>
162 <xsl:text> */&#x0A;&#x0A;</xsl:text>
163</xsl:template>
164
165
166<!--
167 * result codes
168-->
169<xsl:template match="result">
170 <xsl:text>cpp_quote("</xsl:text>
171 <xsl:value-of select="concat('#define ',@name,' ',@value)"/>
172 <xsl:text>")&#x0A;</xsl:text>
173</xsl:template>
174
175
176<!--
177 * forward declarations
178-->
179<xsl:template match="interface" mode="forward">
180 <xsl:text>interface </xsl:text>
181 <xsl:value-of select="@name"/>
182 <xsl:text>;&#x0A;</xsl:text>
183</xsl:template>
184
185
186<xsl:template match="enum" mode="forward">
187 <xsl:text>enum </xsl:text>
188 <xsl:value-of select="@name"/>
189 <xsl:text>;&#x0A;&#x0A;</xsl:text>
190</xsl:template>
191
192
193<!--
194 * interfaces
195-->
196<xsl:template match="interface">[
197 uuid(<xsl:value-of select="@uuid"/>),
198 object,
199 dual,
200 oleautomation
201]
202<xsl:text>interface </xsl:text>
203 <xsl:variable name="name" select="@name"/>
204 <xsl:value-of select="$name"/>
205 <xsl:text> : </xsl:text>
206 <xsl:choose>
207 <xsl:when test="@extends='$unknown'">IDispatch</xsl:when>
208 <xsl:when test="@extends='$errorinfo'">IErrorInfo</xsl:when>
209 <!-- TODO/FIXME/BUGBUG: The above $errorinfo value causes the following warning (/W4):
210warning MIDL2460 : dual interface should be derived from IDispatch : IVirtualBoxErrorInfo [ Interface 'IVirtualBoxErrorInfo' ]
211 -->
212 <xsl:otherwise><xsl:value-of select="@extends"/></xsl:otherwise>
213 </xsl:choose>
214 <xsl:call-template name="xsltprocNewlineOutputHack"/>
215 <xsl:text>{&#x0A;</xsl:text>
216 <!-- attributes (properties) -->
217 <xsl:apply-templates select="attribute"/>
218 <xsl:variable name="reservedAttributes" select="@reservedAttributes"/>
219 <xsl:if test="$reservedAttributes > 0">
220 <!-- tricky way to do a "for" loop without recursion -->
221 <xsl:for-each select="(//*)[position() &lt;= $reservedAttributes]">
222 <xsl:text> [propget] HRESULT InternalAndReservedAttribute</xsl:text>
223 <xsl:value-of select="concat(position(), $name)"/>
224 <xsl:text> ([out, retval] ULONG *aReserved);&#x0A;&#x0A;</xsl:text>
225 <xsl:text> [propput] HRESULT InternalAndReservedAttribute</xsl:text>
226 <xsl:value-of select="concat(position(), $name)"/>
227 <xsl:text> ([in] ULONG aReserved);&#x0A;&#x0A;</xsl:text>
228 </xsl:for-each>
229 </xsl:if>
230 <!-- methods -->
231 <xsl:apply-templates select="method"/>
232 <xsl:variable name="reservedMethods" select="@reservedMethods"/>
233 <xsl:if test="$reservedMethods > 0">
234 <!-- tricky way to do a "for" loop without recursion -->
235 <xsl:for-each select="(//*)[position() &lt;= $reservedMethods]">
236 <xsl:text> HRESULT InternalAndReservedMethod</xsl:text>
237 <xsl:value-of select="concat(position(), $name)"/>
238 <xsl:text>();&#x0A;&#x0A;</xsl:text>
239 </xsl:for-each>
240 </xsl:if>
241 <!-- 'if' enclosed elements, unsorted -->
242 <xsl:apply-templates select="if"/>
243 <!-- -->
244 <xsl:text>}; /* interface </xsl:text>
245 <xsl:value-of select="$name"/>
246 <xsl:text> */&#x0A;&#x0A;</xsl:text>
247 <!-- Interface implementation forwarder macro -->
248 <xsl:text>/* Interface implementation forwarder macro */&#x0A;</xsl:text>
249 <!-- 1) individual methods -->
250 <xsl:apply-templates select="attribute" mode="forwarder"/>
251 <xsl:apply-templates select="method" mode="forwarder"/>
252 <xsl:apply-templates select="if" mode="forwarder"/>
253 <!-- 2) COM_FORWARD_Interface_TO(smth) -->
254 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
255 <xsl:value-of select="$name"/>
256 <xsl:text>_TO(smth) </xsl:text>
257 <xsl:apply-templates select="attribute" mode="forwarder">
258 <xsl:with-param name="nameOnly" select="'yes'"/>
259 </xsl:apply-templates>
260 <xsl:apply-templates select="method" mode="forwarder">
261 <xsl:with-param name="nameOnly" select="'yes'"/>
262 </xsl:apply-templates>
263 <xsl:apply-templates select="if" mode="forwarder">
264 <xsl:with-param name="nameOnly" select="'yes'"/>
265 </xsl:apply-templates>
266 <xsl:text>")&#x0A;</xsl:text>
267 <!-- 3) COM_FORWARD_Interface_TO_OBJ(obj) -->
268 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
269 <xsl:value-of select="$name"/>
270 <xsl:text>_TO_OBJ(obj) COM_FORWARD_</xsl:text>
271 <xsl:value-of select="$name"/>
272 <xsl:text>_TO ((obj)->)")&#x0A;</xsl:text>
273 <!-- 4) COM_FORWARD_Interface_TO_BASE(base) -->
274 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
275 <xsl:value-of select="$name"/>
276 <xsl:text>_TO_BASE(base) COM_FORWARD_</xsl:text>
277 <xsl:value-of select="$name"/>
278 <xsl:text>_TO (base::)")&#x0A;</xsl:text>
279 <!-- end -->
280 <xsl:text>&#x0A;</xsl:text>
281</xsl:template>
282
283
284<!--
285 * attributes
286-->
287<xsl:template match="interface//attribute">
288 <xsl:apply-templates select="@if" mode="begin"/>
289 <!-- getter -->
290 <xsl:text> [propget] HRESULT </xsl:text>
291 <xsl:call-template name="capitalize">
292 <xsl:with-param name="str" select="@name"/>
293 </xsl:call-template>
294 <xsl:text> ([out, retval] </xsl:text>
295 <xsl:if test="@safearray='yes'">
296 <xsl:text>SAFEARRAY(</xsl:text>
297 </xsl:if>
298 <xsl:apply-templates select="@type"/>
299 <xsl:if test="@safearray='yes'">
300 <xsl:text>)</xsl:text>
301 </xsl:if>
302 <xsl:text> * a</xsl:text>
303 <xsl:call-template name="capitalize">
304 <xsl:with-param name="str" select="@name"/>
305 </xsl:call-template>
306 <xsl:text>);&#x0A;</xsl:text>
307 <!-- setter -->
308 <xsl:if test="not(@readonly='yes')">
309 <xsl:text> [propput] HRESULT </xsl:text>
310 <xsl:call-template name="capitalize">
311 <xsl:with-param name="str" select="@name"/>
312 </xsl:call-template>
313 <xsl:text> ([in] </xsl:text>
314 <xsl:if test="@safearray='yes'">
315 <xsl:text>SAFEARRAY(</xsl:text>
316 </xsl:if>
317 <xsl:apply-templates select="@type"/>
318 <xsl:if test="@safearray='yes'">
319 <xsl:text>)</xsl:text>
320 </xsl:if>
321 <xsl:text> a</xsl:text>
322 <xsl:call-template name="capitalize">
323 <xsl:with-param name="str" select="@name"/>
324 </xsl:call-template>
325 <xsl:text>);&#x0A;</xsl:text>
326 </xsl:if>
327 <xsl:apply-templates select="@if" mode="end"/>
328 <xsl:text>&#x0A;</xsl:text>
329</xsl:template>
330
331<xsl:template match="interface//attribute" mode="forwarder">
332
333 <!-- if nameOnly='yes' then only the macro name is composed
334 followed by a space -->
335 <xsl:param name="nameOnly"/>
336
337 <xsl:variable name="parent" select="ancestor::interface"/>
338
339 <xsl:apply-templates select="@if" mode="begin"/>
340
341 <xsl:choose>
342 <xsl:when test="$nameOnly='yes'">
343 <!-- getter: COM_FORWARD_Interface_GETTER_Name_TO(smth) -->
344 <xsl:text>COM_FORWARD_</xsl:text>
345 <xsl:value-of select="$parent/@name"/>
346 <xsl:text>_GETTER_</xsl:text>
347 <xsl:call-template name="capitalize">
348 <xsl:with-param name="str" select="@name"/>
349 </xsl:call-template>
350 <xsl:text>_TO (smth) </xsl:text>
351 <!-- setter: COM_FORWARD_Interface_SETTER_Name_TO(smth) -->
352 <xsl:if test="not(@readonly='yes')">
353 <xsl:text>COM_FORWARD_</xsl:text>
354 <xsl:value-of select="$parent/@name"/>
355 <xsl:text>_SETTER_</xsl:text>
356 <xsl:call-template name="capitalize">
357 <xsl:with-param name="str" select="@name"/>
358 </xsl:call-template>
359 <xsl:text>_TO (smth) </xsl:text>
360 </xsl:if>
361 </xsl:when>
362 <xsl:otherwise>
363 <!-- getter: COM_FORWARD_Interface_GETTER_Name_TO(smth) -->
364 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
365 <xsl:value-of select="$parent/@name"/>
366 <xsl:text>_GETTER_</xsl:text>
367 <xsl:call-template name="capitalize">
368 <xsl:with-param name="str" select="@name"/>
369 </xsl:call-template>
370 <xsl:text>_TO(smth) HRESULT STDMETHODCALLTYPE get_</xsl:text>
371 <xsl:call-template name="capitalize">
372 <xsl:with-param name="str" select="@name"/>
373 </xsl:call-template>
374 <xsl:text> (</xsl:text>
375 <xsl:choose>
376 <xsl:when test="@safearray='yes'">
377 <xsl:text>SAFEARRAY *</xsl:text>
378 </xsl:when>
379 <xsl:otherwise>
380 <xsl:apply-templates select="@type"/>
381 </xsl:otherwise>
382 </xsl:choose>
383 <xsl:text> * a</xsl:text>
384 <xsl:call-template name="capitalize">
385 <xsl:with-param name="str" select="@name"/>
386 </xsl:call-template>
387 <xsl:text>) { return smth get_</xsl:text>
388 <xsl:call-template name="capitalize">
389 <xsl:with-param name="str" select="@name"/>
390 </xsl:call-template>
391 <xsl:text> (a</xsl:text>
392 <xsl:call-template name="capitalize">
393 <xsl:with-param name="str" select="@name"/>
394 </xsl:call-template>
395 <xsl:text>); }")&#x0A;</xsl:text>
396 <!-- getter: COM_FORWARD_Interface_GETTER_Name_TO_OBJ(obj) -->
397 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
398 <xsl:value-of select="$parent/@name"/>
399 <xsl:text>_GETTER_</xsl:text>
400 <xsl:call-template name="capitalize">
401 <xsl:with-param name="str" select="@name"/>
402 </xsl:call-template>
403 <xsl:text>_TO_OBJ(obj) COM_FORWARD_</xsl:text>
404 <xsl:value-of select="$parent/@name"/>
405 <xsl:text>_GETTER_</xsl:text>
406 <xsl:call-template name="capitalize">
407 <xsl:with-param name="str" select="@name"/>
408 </xsl:call-template>
409 <xsl:text>_TO ((obj)->)")&#x0A;</xsl:text>
410 <!-- getter: COM_FORWARD_Interface_GETTER_Name_TO_BASE(base) -->
411 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
412 <xsl:value-of select="$parent/@name"/>
413 <xsl:text>_GETTER_</xsl:text>
414 <xsl:call-template name="capitalize">
415 <xsl:with-param name="str" select="@name"/>
416 </xsl:call-template>
417 <xsl:text>_TO_BASE(base) COM_FORWARD_</xsl:text>
418 <xsl:value-of select="$parent/@name"/>
419 <xsl:text>_GETTER_</xsl:text>
420 <xsl:call-template name="capitalize">
421 <xsl:with-param name="str" select="@name"/>
422 </xsl:call-template>
423 <xsl:text>_TO (base::)")&#x0A;</xsl:text>
424 <!-- -->
425 <xsl:if test="not(@readonly='yes')">
426 <!-- setter: COM_FORWARD_Interface_SETTER_Name_TO(smth) -->
427 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
428 <xsl:value-of select="$parent/@name"/>
429 <xsl:text>_SETTER_</xsl:text>
430 <xsl:call-template name="capitalize">
431 <xsl:with-param name="str" select="@name"/>
432 </xsl:call-template>
433 <xsl:text>_TO(smth) HRESULT STDMETHODCALLTYPE put_</xsl:text>
434 <xsl:call-template name="capitalize">
435 <xsl:with-param name="str" select="@name"/>
436 </xsl:call-template>
437 <xsl:text> (</xsl:text>
438 <xsl:choose>
439 <xsl:when test="@safearray='yes'">
440 <xsl:text>SAFEARRAY *</xsl:text>
441 </xsl:when>
442 <xsl:otherwise>
443 <xsl:apply-templates select="@type"/>
444 </xsl:otherwise>
445 </xsl:choose>
446 <xsl:text> a</xsl:text>
447 <xsl:call-template name="capitalize">
448 <xsl:with-param name="str" select="@name"/>
449 </xsl:call-template>
450 <xsl:text>) { return smth put_</xsl:text>
451 <xsl:call-template name="capitalize">
452 <xsl:with-param name="str" select="@name"/>
453 </xsl:call-template>
454 <xsl:text> (a</xsl:text>
455 <xsl:call-template name="capitalize">
456 <xsl:with-param name="str" select="@name"/>
457 </xsl:call-template>
458 <xsl:text>); }")&#x0A;</xsl:text>
459 <!-- setter: COM_FORWARD_Interface_SETTER_Name_TO_OBJ(obj) -->
460 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
461 <xsl:value-of select="$parent/@name"/>
462 <xsl:text>_SETTER_</xsl:text>
463 <xsl:call-template name="capitalize">
464 <xsl:with-param name="str" select="@name"/>
465 </xsl:call-template>
466 <xsl:text>_TO_OBJ(obj) COM_FORWARD_</xsl:text>
467 <xsl:value-of select="$parent/@name"/>
468 <xsl:text>_SETTER_</xsl:text>
469 <xsl:call-template name="capitalize">
470 <xsl:with-param name="str" select="@name"/>
471 </xsl:call-template>
472 <xsl:text>_TO ((obj)->)")&#x0A;</xsl:text>
473 <!-- setter: COM_FORWARD_Interface_SETTER_Name_TO_BASE(base) -->
474 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
475 <xsl:value-of select="$parent/@name"/>
476 <xsl:text>_SETTER_</xsl:text>
477 <xsl:call-template name="capitalize">
478 <xsl:with-param name="str" select="@name"/>
479 </xsl:call-template>
480 <xsl:text>_TO_BASE(base) COM_FORWARD_</xsl:text>
481 <xsl:value-of select="$parent/@name"/>
482 <xsl:text>_SETTER_</xsl:text>
483 <xsl:call-template name="capitalize">
484 <xsl:with-param name="str" select="@name"/>
485 </xsl:call-template>
486 <xsl:text>_TO (base::)")&#x0A;</xsl:text>
487 </xsl:if>
488 </xsl:otherwise>
489 </xsl:choose>
490
491 <xsl:apply-templates select="@if" mode="end"/>
492
493</xsl:template>
494
495
496<!--
497 * methods
498-->
499<xsl:template match="interface//method">
500 <xsl:apply-templates select="@if" mode="begin"/>
501 <xsl:text> HRESULT </xsl:text>
502 <xsl:call-template name="capitalize">
503 <xsl:with-param name="str" select="@name"/>
504 </xsl:call-template>
505 <xsl:choose>
506 <xsl:when test="param">
507 <xsl:text> (&#x0A;</xsl:text>
508 <xsl:for-each select="param [position() != last()]">
509 <xsl:text> </xsl:text>
510 <xsl:apply-templates select="."/>
511 <xsl:text>,&#x0A;</xsl:text>
512 </xsl:for-each>
513 <xsl:text> </xsl:text>
514 <xsl:apply-templates select="param [last()]"/>
515 <xsl:text>&#x0A; );&#x0A;</xsl:text>
516 </xsl:when>
517 <xsl:otherwise test="not(param)">
518 <xsl:text>();&#x0A;</xsl:text>
519 </xsl:otherwise>
520 </xsl:choose>
521 <xsl:apply-templates select="@if" mode="end"/>
522 <xsl:text>&#x0A;</xsl:text>
523</xsl:template>
524
525<xsl:template match="interface//method" mode="forwarder">
526
527 <!-- if nameOnly='yes' then only the macro name is composed followed by \ -->
528 <xsl:param name="nameOnly"/>
529
530 <xsl:variable name="parent" select="ancestor::interface"/>
531
532 <xsl:apply-templates select="@if" mode="begin"/>
533
534 <xsl:choose>
535 <xsl:when test="$nameOnly='yes'">
536 <!-- COM_FORWARD_Interface_Method_TO(smth) -->
537 <xsl:text>COM_FORWARD_</xsl:text>
538 <xsl:value-of select="$parent/@name"/>
539 <xsl:text>_</xsl:text>
540 <xsl:call-template name="capitalize">
541 <xsl:with-param name="str" select="@name"/>
542 </xsl:call-template>
543 <xsl:text>_TO (smth) </xsl:text>
544 </xsl:when>
545 <xsl:otherwise>
546 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
547 <xsl:value-of select="$parent/@name"/>
548 <xsl:text>_</xsl:text>
549 <xsl:call-template name="capitalize">
550 <xsl:with-param name="str" select="@name"/>
551 </xsl:call-template>
552 <xsl:text>_TO(smth) HRESULT STDMETHODCALLTYPE </xsl:text>
553 <xsl:call-template name="capitalize">
554 <xsl:with-param name="str" select="@name"/>
555 </xsl:call-template>
556 <xsl:choose>
557 <xsl:when test="param">
558 <xsl:text> (</xsl:text>
559 <xsl:for-each select="param [position() != last()]">
560 <xsl:apply-templates select="." mode="forwarder"/>
561 <xsl:text>, </xsl:text>
562 </xsl:for-each>
563 <xsl:apply-templates select="param [last()]" mode="forwarder"/>
564 <xsl:text>) { return smth </xsl:text>
565 <xsl:call-template name="capitalize">
566 <xsl:with-param name="str" select="@name"/>
567 </xsl:call-template>
568 <xsl:text> (</xsl:text>
569 <xsl:for-each select="param [position() != last()]">
570 <xsl:text>a</xsl:text>
571 <xsl:call-template name="capitalize">
572 <xsl:with-param name="str" select="@name"/>
573 </xsl:call-template>
574 <xsl:text>, </xsl:text>
575 </xsl:for-each>
576 <xsl:text>a</xsl:text>
577 <xsl:call-template name="capitalize">
578 <xsl:with-param name="str" select="param [last()]/@name"/>
579 </xsl:call-template>
580 <xsl:text>); }</xsl:text>
581 </xsl:when>
582 <xsl:otherwise test="not(param)">
583 <xsl:text>() { return smth </xsl:text>
584 <xsl:call-template name="capitalize">
585 <xsl:with-param name="str" select="@name"/>
586 </xsl:call-template>
587 <xsl:text>(); }</xsl:text>
588 </xsl:otherwise>
589 </xsl:choose>
590 <xsl:text>")&#x0A;</xsl:text>
591 <!-- COM_FORWARD_Interface_Method_TO_OBJ(obj) -->
592 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
593 <xsl:value-of select="$parent/@name"/>
594 <xsl:text>_</xsl:text>
595 <xsl:call-template name="capitalize">
596 <xsl:with-param name="str" select="@name"/>
597 </xsl:call-template>
598 <xsl:text>_TO_OBJ(obj) COM_FORWARD_</xsl:text>
599 <xsl:value-of select="$parent/@name"/>
600 <xsl:text>_</xsl:text>
601 <xsl:call-template name="capitalize">
602 <xsl:with-param name="str" select="@name"/>
603 </xsl:call-template>
604 <xsl:text>_TO ((obj)->)")&#x0A;</xsl:text>
605 <!-- COM_FORWARD_Interface_Method_TO_BASE(base) -->
606 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
607 <xsl:value-of select="$parent/@name"/>
608 <xsl:text>_</xsl:text>
609 <xsl:call-template name="capitalize">
610 <xsl:with-param name="str" select="@name"/>
611 </xsl:call-template>
612 <xsl:text>_TO_BASE(base) COM_FORWARD_</xsl:text>
613 <xsl:value-of select="$parent/@name"/>
614 <xsl:text>_</xsl:text>
615 <xsl:call-template name="capitalize">
616 <xsl:with-param name="str" select="@name"/>
617 </xsl:call-template>
618 <xsl:text>_TO (base::)")&#x0A;</xsl:text>
619 </xsl:otherwise>
620 </xsl:choose>
621
622 <xsl:apply-templates select="@if" mode="end"/>
623
624</xsl:template>
625
626
627<!--
628 * modules
629-->
630<xsl:template match="module">
631 <xsl:apply-templates select="class"/>
632</xsl:template>
633
634
635<!--
636 * co-classes
637-->
638<xsl:template match="module/class">[
639 uuid(<xsl:value-of select="@uuid"/>)
640]
641<xsl:text>coclass </xsl:text>
642 <xsl:value-of select="@name"/>
643 <xsl:text>&#x0A;{&#x0A;</xsl:text>
644 <xsl:for-each select="interface">
645 <xsl:text> </xsl:text>
646 <xsl:if test="@default='yes'">
647 <xsl:text>[default] </xsl:text>
648 </xsl:if>
649 <xsl:text>interface </xsl:text>
650 <xsl:value-of select="@name"/>
651 <xsl:text>;&#x0A;</xsl:text>
652 </xsl:for-each>
653 <xsl:for-each select="eventsink">
654 <xsl:text> </xsl:text>
655 <xsl:choose>
656 <xsl:when test="@default='yes'"><xsl:text>[default,source]</xsl:text></xsl:when>
657 <xsl:otherwise><xsl:text>[source]</xsl:text></xsl:otherwise>
658 </xsl:choose>
659 <xsl:text> interface </xsl:text>
660 <xsl:value-of select="@name"/>
661 <xsl:text>;&#x0A;</xsl:text>
662 </xsl:for-each>
663 <xsl:text>&#x0A;}; /* coclass </xsl:text>
664 <xsl:value-of select="@name"/>
665 <xsl:text> */&#x0A;&#x0A;</xsl:text>
666</xsl:template>
667
668
669<!--
670 * enums
671-->
672<xsl:template match="enum">[
673 uuid(<xsl:value-of select="@uuid"/>),
674 v1_enum
675]
676<xsl:text>typedef enum &#x0A;{&#x0A;</xsl:text>
677 <xsl:for-each select="const">
678 <xsl:text> </xsl:text>
679 <xsl:value-of select="concat(../@name,'_',@name)"/> = <xsl:value-of select="@value"/>
680 <xsl:choose>
681 <xsl:when test="position()!=last()"><xsl:text>,&#x0A;</xsl:text></xsl:when>
682 <xsl:otherwise><xsl:text>&#x0A;</xsl:text></xsl:otherwise>
683 </xsl:choose>
684 </xsl:for-each>
685 <xsl:text>} </xsl:text>
686 <xsl:value-of select="@name"/>
687 <xsl:text>;&#x0A;&#x0A;</xsl:text>
688 <!-- -->
689 <xsl:value-of select="concat('/* cross-platform type name for ', @name, ' */&#x0A;')"/>
690 <xsl:value-of select="concat('cpp_quote(&quot;#define ', @name, '_T', ' ',
691 @name, '&quot;)&#x0A;&#x0A;')"/>
692 <xsl:text>&#x0A;&#x0A;</xsl:text>
693</xsl:template>
694
695
696<!--
697 * method parameters
698-->
699<xsl:template match="method/param">
700 <xsl:text>[</xsl:text>
701 <xsl:choose>
702 <xsl:when test="@dir='in'">in</xsl:when>
703 <xsl:when test="@dir='out'">out</xsl:when>
704 <xsl:when test="@dir='return'">out, retval</xsl:when>
705 <xsl:otherwise>in</xsl:otherwise>
706 </xsl:choose>
707 <xsl:text>] </xsl:text>
708 <xsl:if test="@safearray='yes'">
709 <xsl:text>SAFEARRAY(</xsl:text>
710 </xsl:if>
711 <xsl:apply-templates select="@type"/>
712 <xsl:if test="@safearray='yes'">
713 <xsl:text>)</xsl:text>
714 </xsl:if>
715 <xsl:if test="@dir='out' or @dir='return'">
716 <xsl:text> *</xsl:text>
717 </xsl:if>
718 <xsl:text> a</xsl:text>
719 <xsl:call-template name="capitalize">
720 <xsl:with-param name="str" select="@name"/>
721 </xsl:call-template>
722</xsl:template>
723
724<xsl:template match="method/param" mode="forwarder">
725 <xsl:choose>
726 <xsl:when test="@safearray='yes'">
727 <xsl:text>SAFEARRAY *</xsl:text>
728 </xsl:when>
729 <xsl:otherwise>
730 <xsl:apply-templates select="@type"/>
731 </xsl:otherwise>
732 </xsl:choose>
733 <xsl:if test="@dir='out' or @dir='return' or @safearray='yes'">
734 <xsl:text> *</xsl:text>
735 </xsl:if>
736 <xsl:text> a</xsl:text>
737 <xsl:call-template name="capitalize">
738 <xsl:with-param name="str" select="@name"/>
739 </xsl:call-template>
740</xsl:template>
741
742
743<!--
744 * attribute/parameter type conversion
745-->
746<xsl:template match="attribute/@type | param/@type">
747 <xsl:variable name="self_target" select="current()/ancestor::if/@target"/>
748
749 <xsl:choose>
750 <!-- modifiers -->
751 <xsl:when test="name(current())='type' and ../@mod">
752 <xsl:choose>
753 <xsl:when test="../@mod='ptr'">
754 <xsl:choose>
755 <!-- standard types -->
756 <!--xsl:when test=".='result'">??</xsl:when-->
757 <xsl:when test=".='boolean'">BOOL *</xsl:when>
758 <xsl:when test=".='octet'">BYTE *</xsl:when>
759 <xsl:when test=".='short'">SHORT *</xsl:when>
760 <xsl:when test=".='unsigned short'">USHORT *</xsl:when>
761 <xsl:when test=".='long'">LONG *</xsl:when>
762 <xsl:when test=".='long long'">LONG64 *</xsl:when>
763 <xsl:when test=".='unsigned long'">ULONG *</xsl:when>
764 <xsl:when test=".='unsigned long long'">
765 <xsl:message terminate="yes">
766 <xsl:value-of select="'&quot;unsigned long long&quot; no longer supported'" />
767 </xsl:message>
768 </xsl:when>
769 <xsl:otherwise>
770 <xsl:message terminate="yes">
771 <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
772 <xsl:text>attribute 'mod=</xsl:text>
773 <xsl:value-of select="concat('&quot;',../@mod,'&quot;')"/>
774 <xsl:text>' cannot be used with type </xsl:text>
775 <xsl:value-of select="concat('&quot;',current(),'&quot;!')"/>
776 </xsl:message>
777 </xsl:otherwise>
778 </xsl:choose>
779 </xsl:when>
780 <xsl:when test="../@mod='string'">
781 <xsl:choose>
782 <!-- standard types -->
783 <!--xsl:when test=".='result'">??</xsl:when-->
784 <xsl:when test=".='uuid'">BSTR</xsl:when>
785 <xsl:otherwise>
786 <xsl:message terminate="yes">
787 <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
788 <xsl:text>attribute 'mod=</xsl:text>
789 <xsl:value-of select="concat('&quot;',../@mod,'&quot;')"/>
790 <xsl:text>' cannot be used with type </xsl:text>
791 <xsl:value-of select="concat('&quot;',current(),'&quot;!')"/>
792 </xsl:message>
793 </xsl:otherwise>
794 </xsl:choose>
795 </xsl:when>
796 <xsl:otherwise>
797 <xsl:message terminate="yes">
798 <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
799 <xsl:value-of select="concat('value &quot;',../@mod,'&quot; ')"/>
800 <xsl:text>of attribute 'mod' is invalid!</xsl:text>
801 </xsl:message>
802 </xsl:otherwise>
803 </xsl:choose>
804 </xsl:when>
805 <!-- no modifiers -->
806 <xsl:otherwise>
807 <xsl:choose>
808 <!-- standard types -->
809 <xsl:when test=".='result'">HRESULT</xsl:when>
810 <xsl:when test=".='boolean'">BOOL</xsl:when>
811 <xsl:when test=".='octet'">BYTE</xsl:when>
812 <xsl:when test=".='short'">SHORT</xsl:when>
813 <xsl:when test=".='unsigned short'">USHORT</xsl:when>
814 <xsl:when test=".='long'">LONG</xsl:when>
815 <xsl:when test=".='long long'">LONG64</xsl:when>
816 <xsl:when test=".='unsigned long'">ULONG</xsl:when>
817 <xsl:when test=".='char'">CHAR</xsl:when>
818 <xsl:when test=".='string'">CHAR *</xsl:when>
819 <xsl:when test=".='wchar'">OLECHAR</xsl:when>
820 <xsl:when test=".='wstring'">BSTR</xsl:when>
821 <!-- UUID type -->
822 <xsl:when test=".='uuid'">GUID</xsl:when>
823 <!-- system interface types -->
824 <xsl:when test=".='$unknown'">IUnknown *</xsl:when>
825 <xsl:when test=".='unsigned long long'">
826 <xsl:message terminate="yes">
827 <xsl:value-of select="'&quot;unsigned long long&quot; no longer supported'" />
828 </xsl:message>
829 </xsl:when>
830 <xsl:otherwise>
831 <xsl:choose>
832 <!-- enum types -->
833 <xsl:when test="
834 (ancestor::library/enum[@name=current()]) or
835 (ancestor::library/if[@target=$self_target]/enum[@name=current()])
836 ">
837 <xsl:value-of select="."/>
838 </xsl:when>
839 <!-- custom interface types -->
840 <xsl:when test="
841 ((ancestor::library/interface[@name=current()]) or
842 (ancestor::library/if[@target=$self_target]/interface[@name=current()])
843 )
844 ">
845 <xsl:value-of select="."/><xsl:text> *</xsl:text>
846 </xsl:when>
847 <!-- other types -->
848 <xsl:otherwise>
849 <xsl:message terminate="yes">
850 <xsl:text>Unknown parameter type: </xsl:text>
851 <xsl:value-of select="."/>
852 </xsl:message>
853 </xsl:otherwise>
854 </xsl:choose>
855 </xsl:otherwise>
856 </xsl:choose>
857 </xsl:otherwise>
858 </xsl:choose>
859</xsl:template>
860
861</xsl:stylesheet>
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette