VirtualBox

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

Last change on this file since 22357 was 19134, checked in by vboxsync, 16 years ago

Main: make VBox interfaces scriptable (that is, callable from Python and VisualBasic)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 32.1 KB
Line 
1<?xml version="1.0"?>
2<!-- $Id: midl.xsl 19134 2009-04-23 09:21:43Z 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-2008 Sun Microsystems, Inc.
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 Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
19 Clara, CA 95054 USA or visit http://www.sun.com if you need
20 additional information or have any questions.
21-->
22
23<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
24<xsl:output method="text"/>
25
26<xsl:strip-space elements="*"/>
27
28
29<!--
30// helper definitions
31/////////////////////////////////////////////////////////////////////////////
32-->
33
34<!--
35 * capitalizes the first letter
36-->
37<xsl:template name="capitalize">
38 <xsl:param name="str" select="."/>
39 <xsl:value-of select="
40 concat(
41 translate(substring($str,1,1),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ'),
42 substring($str,2)
43 )
44 "/>
45</xsl:template>
46
47<!--
48 * uncapitalizes the first letter only if the second one is not capital
49 * otherwise leaves the string unchanged
50-->
51<xsl:template name="uncapitalize">
52 <xsl:param name="str" select="."/>
53 <xsl:choose>
54 <xsl:when test="not(contains('ABCDEFGHIJKLMNOPQRSTUVWXYZ', substring($str,2,1)))">
55 <xsl:value-of select="
56 concat(
57 translate(substring($str,1,1),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),
58 substring($str,2)
59 )
60 "/>
61 </xsl:when>
62 <xsl:otherwise>
63 <xsl:value-of select="string($str)"/>
64 </xsl:otherwise>
65 </xsl:choose>
66</xsl:template>
67
68
69<!--
70// templates
71/////////////////////////////////////////////////////////////////////////////
72-->
73
74<!--
75 * not explicitly matched elements and attributes
76-->
77<xsl:template match="*"/>
78
79
80<!--
81 * header
82-->
83<xsl:template match="/idl">
84 <xsl:text>
85/*
86 * DO NOT EDIT! This is a generated file.
87 *
88 * MS IDL (MIDL) definition for VirtualBox Main API (COM interfaces)
89 * generated from XIDL (XML interface definition).
90 *
91 * Source : src/VBox/Main/idl/VirtualBox.xidl
92 * Generator : src/VBox/Main/idl/midl.xsl
93 */
94 </xsl:text>
95 <xsl:text>&#x0A;</xsl:text>
96 <xsl:text>import "unknwn.idl";&#x0A;&#x0A;</xsl:text>
97 <xsl:apply-templates/>
98</xsl:template>
99
100
101<!--
102 * ignore all |if|s except those for MIDL target
103-->
104<xsl:template match="if">
105 <xsl:if test="@target='midl'">
106 <xsl:apply-templates/>
107 </xsl:if>
108</xsl:template>
109<xsl:template match="if" mode="forward">
110 <xsl:if test="@target='midl'">
111 <xsl:apply-templates mode="forward"/>
112 </xsl:if>
113</xsl:template>
114<xsl:template match="if" mode="forwarder">
115 <xsl:param name="nameOnly"/>
116 <xsl:if test="@target='midl'">
117 <xsl:apply-templates mode="forwarder">
118 <xsl:with-param name="nameOnly" select="$nameOnly"/>
119 </xsl:apply-templates>
120 </xsl:if>
121</xsl:template>
122
123
124<!--
125 * cpp_quote
126-->
127<xsl:template match="cpp">
128 <xsl:text>cpp_quote("</xsl:text>
129 <xsl:value-of select="@line"/>
130 <xsl:text>")&#x0A;&#x0A;</xsl:text>
131</xsl:template>
132
133
134<!--
135 * #if statement (@if attribute)
136-->
137<xsl:template match="@if" mode="begin">
138 <xsl:text>#if </xsl:text>
139 <xsl:value-of select="."/>
140 <xsl:text>&#x0A;</xsl:text>
141</xsl:template>
142<xsl:template match="@if" mode="end">
143 <xsl:text>#endif&#x0A;</xsl:text>
144</xsl:template>
145
146
147<!--
148 * libraries
149-->
150<xsl:template match="library">[
151 uuid(<xsl:value-of select="@uuid"/>),
152 version(<xsl:value-of select="@version"/>),
153 helpstring("<xsl:value-of select="@desc"/>")
154]
155<xsl:text>library </xsl:text>
156 <xsl:value-of select="@name"/>
157 <xsl:text>&#x0A;{&#x0A;</xsl:text>
158 <xsl:text>&#x0A;importlib("stdole2.tlb");&#x0A;&#x0A;</xsl:text>
159 <!-- result codes -->
160 <xsl:for-each select="result">
161 <xsl:apply-templates select="."/>
162 </xsl:for-each>
163 <xsl:text>&#x0A;</xsl:text>
164 <!-- forward declarations -->
165 <xsl:apply-templates select="if | interface | collection | enumerator" mode="forward"/>
166 <xsl:text>&#x0A;</xsl:text>
167 <!-- all enums go first -->
168 <xsl:apply-templates select="enum | if/enum"/>
169 <!-- everything else but result codes and enums -->
170 <xsl:apply-templates select="*[not(self::result or self::enum) and
171 not(self::if[result] or self::if[enum])]"/>
172 <!-- -->
173 <xsl:text>}; /* library </xsl:text>
174 <xsl:value-of select="@name"/>
175 <xsl:text> */&#x0A;&#x0A;</xsl:text>
176</xsl:template>
177
178
179<!--
180 * result codes
181-->
182<xsl:template match="result">
183 <xsl:text>cpp_quote("</xsl:text>
184 <xsl:value-of select="concat('#define ',@name,' ',@value)"/>
185 <xsl:text>")&#x0A;</xsl:text>
186</xsl:template>
187
188
189<!--
190 * forward declarations
191-->
192<xsl:template match="interface | collection | enumerator" mode="forward">
193 <xsl:text>interface </xsl:text>
194 <xsl:value-of select="@name"/>
195 <xsl:text>;&#x0A;</xsl:text>
196</xsl:template>
197
198
199<!--
200 * interfaces
201-->
202<xsl:template match="interface">[
203 uuid(<xsl:value-of select="@uuid"/>),
204 object,
205 dual,
206 oleautomation
207]
208<xsl:text>interface </xsl:text>
209 <xsl:value-of select="@name"/>
210 <xsl:text> : </xsl:text>
211 <xsl:choose>
212 <xsl:when test="@extends='$unknown'">IDispatch</xsl:when>
213 <xsl:when test="@extends='$dispatched'">IDispatch</xsl:when>
214 <xsl:when test="@extends='$errorinfo'">IErrorInfo</xsl:when>
215 <xsl:otherwise><xsl:value-of select="@extends"/></xsl:otherwise>
216 </xsl:choose>
217 <xsl:text>&#x0A;{&#x0A;</xsl:text>
218 <!-- attributes (properties) -->
219 <xsl:apply-templates select="attribute"/>
220 <!-- methods -->
221 <xsl:apply-templates select="method"/>
222 <!-- 'if' enclosed elements, unsorted -->
223 <xsl:apply-templates select="if"/>
224 <!-- -->
225 <xsl:text>}; /* interface </xsl:text>
226 <xsl:value-of select="@name"/>
227 <xsl:text> */&#x0A;&#x0A;</xsl:text>
228 <!-- Interface implementation forwarder macro -->
229 <xsl:text>/* Interface implementation forwarder macro */&#x0A;</xsl:text>
230 <!-- 1) indivudual methods -->
231 <xsl:apply-templates select="attribute" mode="forwarder"/>
232 <xsl:apply-templates select="method" mode="forwarder"/>
233 <xsl:apply-templates select="if" mode="forwarder"/>
234 <!-- 2) COM_FORWARD_Interface_TO(smth) -->
235 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
236 <xsl:value-of select="@name"/>
237 <xsl:text>_TO(smth) </xsl:text>
238 <xsl:apply-templates select="attribute" mode="forwarder">
239 <xsl:with-param name="nameOnly" select="'yes'"/>
240 </xsl:apply-templates>
241 <xsl:apply-templates select="method" mode="forwarder">
242 <xsl:with-param name="nameOnly" select="'yes'"/>
243 </xsl:apply-templates>
244 <xsl:apply-templates select="if" mode="forwarder">
245 <xsl:with-param name="nameOnly" select="'yes'"/>
246 </xsl:apply-templates>
247 <xsl:text>")&#x0A;</xsl:text>
248 <!-- 3) COM_FORWARD_Interface_TO_OBJ(obj) -->
249 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
250 <xsl:value-of select="@name"/>
251 <xsl:text>_TO_OBJ(obj) COM_FORWARD_</xsl:text>
252 <xsl:value-of select="@name"/>
253 <xsl:text>_TO ((obj)->)")&#x0A;</xsl:text>
254 <!-- 4) COM_FORWARD_Interface_TO_BASE(base) -->
255 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
256 <xsl:value-of select="@name"/>
257 <xsl:text>_TO_BASE(base) COM_FORWARD_</xsl:text>
258 <xsl:value-of select="@name"/>
259 <xsl:text>_TO (base::)")&#x0A;</xsl:text>
260 <!-- end -->
261 <xsl:text>&#x0A;</xsl:text>
262</xsl:template>
263
264
265<!--
266 * attributes
267-->
268<xsl:template match="interface//attribute | collection//attribute">
269 <xsl:apply-templates select="@if" mode="begin"/>
270 <xsl:if test="@array">
271 <xsl:message terminate="yes">
272 <xsl:value-of select="concat(../@name,'::',@name,': ')"/>
273 <xsl:text>'array' attributes are not supported, use 'safearray="yes"' instead.</xsl:text>
274 </xsl:message>
275 </xsl:if>
276 <!-- getter -->
277 <xsl:text> [propget] HRESULT </xsl:text>
278 <xsl:call-template name="capitalize">
279 <xsl:with-param name="str" select="@name"/>
280 </xsl:call-template>
281 <xsl:text> ([out, retval] </xsl:text>
282 <xsl:if test="@safearray='yes'">
283 <xsl:text>SAFEARRAY(</xsl:text>
284 </xsl:if>
285 <xsl:apply-templates select="@type"/>
286 <xsl:if test="@safearray='yes'">
287 <xsl:text>)</xsl:text>
288 </xsl:if>
289 <xsl:text> * a</xsl:text>
290 <xsl:call-template name="capitalize">
291 <xsl:with-param name="str" select="@name"/>
292 </xsl:call-template>
293 <xsl:text>);&#x0A;</xsl:text>
294 <!-- setter -->
295 <xsl:if test="not(@readonly='yes')">
296 <xsl:text> [propput] HRESULT </xsl:text>
297 <xsl:call-template name="capitalize">
298 <xsl:with-param name="str" select="@name"/>
299 </xsl:call-template>
300 <xsl:text> ([in</xsl:text>
301 <xsl:if test="@safearray='yes'">
302 <!-- VB supports only [in, out], [out] and [out, retval] arrays -->
303 <xsl:text>, out</xsl:text>
304 </xsl:if>
305 <xsl:text>] </xsl:text>
306 <xsl:if test="@safearray='yes'">
307 <xsl:text>SAFEARRAY(</xsl:text>
308 </xsl:if>
309 <xsl:apply-templates select="@type"/>
310 <xsl:if test="@safearray='yes'">
311 <xsl:text>) *</xsl:text>
312 </xsl:if>
313 <xsl:text> a</xsl:text>
314 <xsl:call-template name="capitalize">
315 <xsl:with-param name="str" select="@name"/>
316 </xsl:call-template>
317 <xsl:text>);&#x0A;</xsl:text>
318 </xsl:if>
319 <xsl:apply-templates select="@if" mode="end"/>
320 <xsl:text>&#x0A;</xsl:text>
321</xsl:template>
322
323<xsl:template match="interface//attribute | collection//attribute" mode="forwarder">
324
325 <!-- if nameOnly='yes' then only the macro name is composed
326 followed by a space -->
327 <xsl:param name="nameOnly"/>
328
329 <xsl:variable name="parent" select="ancestor::interface | ancestor::collection"/>
330
331 <xsl:apply-templates select="@if" mode="begin"/>
332
333 <xsl:choose>
334 <xsl:when test="$nameOnly='yes'">
335 <!-- getter: COM_FORWARD_Interface_GETTER_Name_TO(smth) -->
336 <xsl:text>COM_FORWARD_</xsl:text>
337 <xsl:value-of select="$parent/@name"/>
338 <xsl:text>_GETTER_</xsl:text>
339 <xsl:call-template name="capitalize">
340 <xsl:with-param name="str" select="@name"/>
341 </xsl:call-template>
342 <xsl:text>_TO (smth) </xsl:text>
343 <!-- setter: COM_FORWARD_Interface_SETTER_Name_TO(smth) -->
344 <xsl:if test="not(@readonly='yes')">
345 <xsl:text>COM_FORWARD_</xsl:text>
346 <xsl:value-of select="$parent/@name"/>
347 <xsl:text>_SETTER_</xsl:text>
348 <xsl:call-template name="capitalize">
349 <xsl:with-param name="str" select="@name"/>
350 </xsl:call-template>
351 <xsl:text>_TO (smth) </xsl:text>
352 </xsl:if>
353 </xsl:when>
354 <xsl:otherwise>
355 <!-- getter: COM_FORWARD_Interface_GETTER_Name_TO(smth) -->
356 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
357 <xsl:value-of select="$parent/@name"/>
358 <xsl:text>_GETTER_</xsl:text>
359 <xsl:call-template name="capitalize">
360 <xsl:with-param name="str" select="@name"/>
361 </xsl:call-template>
362 <xsl:text>_TO(smth) HRESULT STDMETHODCALLTYPE get_</xsl:text>
363 <xsl:call-template name="capitalize">
364 <xsl:with-param name="str" select="@name"/>
365 </xsl:call-template>
366 <xsl:text> (</xsl:text>
367 <xsl:choose>
368 <xsl:when test="@safearray='yes'">
369 <xsl:text>SAFEARRAY *</xsl:text>
370 </xsl:when>
371 <xsl:otherwise>
372 <xsl:apply-templates select="@type"/>
373 </xsl:otherwise>
374 </xsl:choose>
375 <xsl:text> * a</xsl:text>
376 <xsl:call-template name="capitalize">
377 <xsl:with-param name="str" select="@name"/>
378 </xsl:call-template>
379 <xsl:text>) { return smth get_</xsl:text>
380 <xsl:call-template name="capitalize">
381 <xsl:with-param name="str" select="@name"/>
382 </xsl:call-template>
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>); }")&#x0A;</xsl:text>
388 <!-- getter: COM_FORWARD_Interface_GETTER_Name_TO_OBJ(obj) -->
389 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
390 <xsl:value-of select="$parent/@name"/>
391 <xsl:text>_GETTER_</xsl:text>
392 <xsl:call-template name="capitalize">
393 <xsl:with-param name="str" select="@name"/>
394 </xsl:call-template>
395 <xsl:text>_TO_OBJ(obj) COM_FORWARD_</xsl:text>
396 <xsl:value-of select="$parent/@name"/>
397 <xsl:text>_GETTER_</xsl:text>
398 <xsl:call-template name="capitalize">
399 <xsl:with-param name="str" select="@name"/>
400 </xsl:call-template>
401 <xsl:text>_TO ((obj)->)")&#x0A;</xsl:text>
402 <!-- getter: COM_FORWARD_Interface_GETTER_Name_TO_BASE(base) -->
403 <xsl:text>cpp_quote("#define 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_BASE(base) COM_FORWARD_</xsl:text>
410 <xsl:value-of select="$parent/@name"/>
411 <xsl:text>_GETTER_</xsl:text>
412 <xsl:call-template name="capitalize">
413 <xsl:with-param name="str" select="@name"/>
414 </xsl:call-template>
415 <xsl:text>_TO (base::)")&#x0A;</xsl:text>
416 <!-- -->
417 <xsl:if test="not(@readonly='yes')">
418 <!-- setter: COM_FORWARD_Interface_SETTER_Name_TO(smth) -->
419 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
420 <xsl:value-of select="$parent/@name"/>
421 <xsl:text>_SETTER_</xsl:text>
422 <xsl:call-template name="capitalize">
423 <xsl:with-param name="str" select="@name"/>
424 </xsl:call-template>
425 <xsl:text>_TO(smth) HRESULT STDMETHODCALLTYPE put_</xsl:text>
426 <xsl:call-template name="capitalize">
427 <xsl:with-param name="str" select="@name"/>
428 </xsl:call-template>
429 <xsl:text> (</xsl:text>
430 <xsl:choose>
431 <xsl:when test="@safearray='yes'">
432 <xsl:text>SAFEARRAY *</xsl:text>
433 </xsl:when>
434 <xsl:otherwise>
435 <xsl:apply-templates select="@type"/>
436 </xsl:otherwise>
437 </xsl:choose>
438 <xsl:text> a</xsl:text>
439 <xsl:call-template name="capitalize">
440 <xsl:with-param name="str" select="@name"/>
441 </xsl:call-template>
442 <xsl:text>) { return smth put_</xsl:text>
443 <xsl:call-template name="capitalize">
444 <xsl:with-param name="str" select="@name"/>
445 </xsl:call-template>
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>); }")&#x0A;</xsl:text>
451 <!-- setter: COM_FORWARD_Interface_SETTER_Name_TO_OBJ(obj) -->
452 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
453 <xsl:value-of select="$parent/@name"/>
454 <xsl:text>_SETTER_</xsl:text>
455 <xsl:call-template name="capitalize">
456 <xsl:with-param name="str" select="@name"/>
457 </xsl:call-template>
458 <xsl:text>_TO_OBJ(obj) COM_FORWARD_</xsl:text>
459 <xsl:value-of select="$parent/@name"/>
460 <xsl:text>_SETTER_</xsl:text>
461 <xsl:call-template name="capitalize">
462 <xsl:with-param name="str" select="@name"/>
463 </xsl:call-template>
464 <xsl:text>_TO ((obj)->)")&#x0A;</xsl:text>
465 <!-- setter: COM_FORWARD_Interface_SETTER_Name_TO_BASE(base) -->
466 <xsl:text>cpp_quote("#define 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_BASE(base) COM_FORWARD_</xsl:text>
473 <xsl:value-of select="$parent/@name"/>
474 <xsl:text>_SETTER_</xsl:text>
475 <xsl:call-template name="capitalize">
476 <xsl:with-param name="str" select="@name"/>
477 </xsl:call-template>
478 <xsl:text>_TO (base::)")&#x0A;</xsl:text>
479 </xsl:if>
480 </xsl:otherwise>
481 </xsl:choose>
482
483 <xsl:apply-templates select="@if" mode="end"/>
484
485</xsl:template>
486
487
488<!--
489 * methods
490-->
491<xsl:template match="interface//method | collection//method">
492 <xsl:apply-templates select="@if" mode="begin"/>
493 <xsl:text> HRESULT </xsl:text>
494 <xsl:call-template name="capitalize">
495 <xsl:with-param name="str" select="@name"/>
496 </xsl:call-template>
497 <xsl:choose>
498 <xsl:when test="param">
499 <xsl:text> (&#x0A;</xsl:text>
500 <xsl:for-each select="param [position() != last()]">
501 <xsl:text> </xsl:text>
502 <xsl:apply-templates select="."/>
503 <xsl:text>,&#x0A;</xsl:text>
504 </xsl:for-each>
505 <xsl:text> </xsl:text>
506 <xsl:apply-templates select="param [last()]"/>
507 <xsl:text>&#x0A; );&#x0A;</xsl:text>
508 </xsl:when>
509 <xsl:otherwise test="not(param)">
510 <xsl:text>();&#x0A;</xsl:text>
511 </xsl:otherwise>
512 </xsl:choose>
513 <xsl:apply-templates select="@if" mode="end"/>
514 <xsl:text>&#x0A;</xsl:text>
515</xsl:template>
516
517<xsl:template match="interface//method | collection//method" mode="forwarder">
518
519 <!-- if nameOnly='yes' then only the macro name is composed followed by \ -->
520 <xsl:param name="nameOnly"/>
521
522 <xsl:variable name="parent" select="ancestor::interface | ancestor::collection"/>
523
524 <xsl:apply-templates select="@if" mode="begin"/>
525
526 <xsl:choose>
527 <xsl:when test="$nameOnly='yes'">
528 <!-- COM_FORWARD_Interface_Method_TO(smth) -->
529 <xsl:text>COM_FORWARD_</xsl:text>
530 <xsl:value-of select="$parent/@name"/>
531 <xsl:text>_</xsl:text>
532 <xsl:call-template name="capitalize">
533 <xsl:with-param name="str" select="@name"/>
534 </xsl:call-template>
535 <xsl:text>_TO (smth) </xsl:text>
536 </xsl:when>
537 <xsl:otherwise>
538 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
539 <xsl:value-of select="$parent/@name"/>
540 <xsl:text>_</xsl:text>
541 <xsl:call-template name="capitalize">
542 <xsl:with-param name="str" select="@name"/>
543 </xsl:call-template>
544 <xsl:text>_TO(smth) HRESULT STDMETHODCALLTYPE </xsl:text>
545 <xsl:call-template name="capitalize">
546 <xsl:with-param name="str" select="@name"/>
547 </xsl:call-template>
548 <xsl:choose>
549 <xsl:when test="param">
550 <xsl:text> (</xsl:text>
551 <xsl:for-each select="param [position() != last()]">
552 <xsl:apply-templates select="." mode="forwarder"/>
553 <xsl:text>, </xsl:text>
554 </xsl:for-each>
555 <xsl:apply-templates select="param [last()]" mode="forwarder"/>
556 <xsl:text>) { return smth </xsl:text>
557 <xsl:call-template name="capitalize">
558 <xsl:with-param name="str" select="@name"/>
559 </xsl:call-template>
560 <xsl:text> (</xsl:text>
561 <xsl:for-each select="param [position() != last()]">
562 <xsl:text>a</xsl:text>
563 <xsl:call-template name="capitalize">
564 <xsl:with-param name="str" select="@name"/>
565 </xsl:call-template>
566 <xsl:text>, </xsl:text>
567 </xsl:for-each>
568 <xsl:text>a</xsl:text>
569 <xsl:call-template name="capitalize">
570 <xsl:with-param name="str" select="param [last()]/@name"/>
571 </xsl:call-template>
572 <xsl:text>); }</xsl:text>
573 </xsl:when>
574 <xsl:otherwise test="not(param)">
575 <xsl:text>() { return smth </xsl:text>
576 <xsl:call-template name="capitalize">
577 <xsl:with-param name="str" select="@name"/>
578 </xsl:call-template>
579 <xsl:text>(); }</xsl:text>
580 </xsl:otherwise>
581 </xsl:choose>
582 <xsl:text>")&#x0A;</xsl:text>
583 <!-- COM_FORWARD_Interface_Method_TO_OBJ(obj) -->
584 <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
585 <xsl:value-of select="$parent/@name"/>
586 <xsl:text>_</xsl:text>
587 <xsl:call-template name="capitalize">
588 <xsl:with-param name="str" select="@name"/>
589 </xsl:call-template>
590 <xsl:text>_TO_OBJ(obj) COM_FORWARD_</xsl:text>
591 <xsl:value-of select="$parent/@name"/>
592 <xsl:text>_</xsl:text>
593 <xsl:call-template name="capitalize">
594 <xsl:with-param name="str" select="@name"/>
595 </xsl:call-template>
596 <xsl:text>_TO ((obj)->)")&#x0A;</xsl:text>
597 <!-- COM_FORWARD_Interface_Method_TO_BASE(base) -->
598 <xsl:text>cpp_quote("#define 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_BASE(base) COM_FORWARD_</xsl:text>
605 <xsl:value-of select="$parent/@name"/>
606 <xsl:text>_</xsl:text>
607 <xsl:call-template name="capitalize">
608 <xsl:with-param name="str" select="@name"/>
609 </xsl:call-template>
610 <xsl:text>_TO (base::)")&#x0A;</xsl:text>
611 </xsl:otherwise>
612 </xsl:choose>
613
614 <xsl:apply-templates select="@if" mode="end"/>
615
616</xsl:template>
617
618
619<!--
620 * modules
621-->
622<xsl:template match="module">
623 <xsl:apply-templates select="class"/>
624</xsl:template>
625
626
627<!--
628 * co-classes
629-->
630<xsl:template match="module/class">[
631 uuid(<xsl:value-of select="@uuid"/>)
632]
633<xsl:text>coclass </xsl:text>
634 <xsl:value-of select="@name"/>
635 <xsl:text>&#x0A;{&#x0A;</xsl:text>
636 <xsl:for-each select="interface">
637 <xsl:text> </xsl:text>
638 <xsl:if test="@default='yes'">
639 <xsl:text>[default] </xsl:text>
640 </xsl:if>
641 <xsl:text>interface </xsl:text>
642 <xsl:value-of select="@name"/>
643 <xsl:text>;&#x0A;</xsl:text>
644 </xsl:for-each>
645 <xsl:text>&#x0A;}; /* coclass </xsl:text>
646 <xsl:value-of select="@name"/>
647 <xsl:text> */&#x0A;&#x0A;</xsl:text>
648</xsl:template>
649
650
651<!--
652 * enumerators
653-->
654<xsl:template match="enumerator">[
655 uuid(<xsl:value-of select="@uuid"/>),
656 object,
657 dual
658]
659<xsl:text>interface </xsl:text>
660 <xsl:value-of select="@name"/>
661 <xsl:text> : IUnknown&#x0A;{&#x0A;</xsl:text>
662 <!-- HasMore -->
663 <xsl:text> HRESULT HasMore ([out, retval] BOOL * more);&#x0A;&#x0A;</xsl:text>
664 <!-- GetNext -->
665 <xsl:text> HRESULT GetNext ([out, retval] </xsl:text>
666 <xsl:apply-templates select="@type"/>
667 <xsl:text> * next);&#x0A;&#x0A;</xsl:text>
668 <!-- -->
669 <xsl:text>&#x0A;}; /* interface </xsl:text>
670 <xsl:value-of select="@name"/>
671 <xsl:text> */&#x0A;&#x0A;</xsl:text>
672</xsl:template>
673
674
675<!--
676 * collections
677-->
678<xsl:template match="collection">
679 <xsl:if test="not(@readonly='yes')">
680 <xsl:message terminate="yes">
681 <xsl:value-of select="concat(@name,': ')"/>
682 <xsl:text>non-readonly collections are not currently supported</xsl:text>
683 </xsl:message>
684 </xsl:if>[
685 uuid(<xsl:value-of select="@uuid"/>),
686 object,
687 dual
688]
689<xsl:text>interface </xsl:text>
690 <xsl:value-of select="@name"/>
691 <xsl:text> : IUnknown&#x0A;{&#x0A;</xsl:text>
692 <!-- Count -->
693 <xsl:text> [propget] HRESULT Count ([out, retval] ULONG * count);&#x0A;&#x0A;</xsl:text>
694 <!-- GetItemAt -->
695 <xsl:text> HRESULT GetItemAt ([in] ULONG index, [out, retval] </xsl:text>
696 <xsl:apply-templates select="@type"/>
697 <xsl:text> * item);&#x0A;&#x0A;</xsl:text>
698 <!-- Enumerate -->
699 <xsl:text> HRESULT Enumerate ([out, retval] </xsl:text>
700 <xsl:apply-templates select="@enumerator"/>
701 <xsl:text> * enumerator);&#x0A;&#x0A;</xsl:text>
702 <!-- other extra attributes (properties) -->
703 <xsl:apply-templates select="attribute"/>
704 <!-- other extra methods -->
705 <xsl:apply-templates select="method"/>
706 <!-- 'if' enclosed elements, unsorted -->
707 <xsl:apply-templates select="if"/>
708 <!-- -->
709 <xsl:text>&#x0A;}; /* interface </xsl:text>
710 <xsl:value-of select="@name"/>
711 <xsl:text> */&#x0A;&#x0A;</xsl:text>
712</xsl:template>
713
714
715<!--
716 * enums
717-->
718<xsl:template match="enum">[
719 uuid(<xsl:value-of select="@uuid"/>),
720 v1_enum
721]
722<xsl:text>typedef enum &#x0A;{&#x0A;</xsl:text>
723 <xsl:for-each select="const">
724 <xsl:text> </xsl:text>
725 <xsl:value-of select="concat(../@name,'_',@name)"/> = <xsl:value-of select="@value"/>
726 <xsl:choose>
727 <xsl:when test="position()!=last()"><xsl:text>,&#x0A;</xsl:text></xsl:when>
728 <xsl:otherwise><xsl:text>&#x0A;</xsl:text></xsl:otherwise>
729 </xsl:choose>
730 </xsl:for-each>
731 <xsl:text>} </xsl:text>
732 <xsl:value-of select="@name"/>
733 <xsl:text>;&#x0A;&#x0A;</xsl:text>
734 <!-- -->
735 <xsl:value-of select="concat('/* cross-platform type name for ', @name, ' */&#x0A;')"/>
736 <xsl:value-of select="concat('cpp_quote(&quot;#define ', @name, '_T', ' ',
737 @name, '&quot;)&#x0A;&#x0A;')"/>
738 <xsl:text>&#x0A;&#x0A;</xsl:text>
739</xsl:template>
740
741
742<!--
743 * method parameters
744-->
745<xsl:template match="method/param">
746 <xsl:text>[</xsl:text>
747 <xsl:choose>
748 <xsl:when test="@dir='in'">in</xsl:when>
749 <xsl:when test="@dir='out'">out</xsl:when>
750 <xsl:when test="@dir='return'">out, retval</xsl:when>
751 <xsl:otherwise>in</xsl:otherwise>
752 </xsl:choose>
753 <xsl:if test="@safearray='yes'">
754 <!-- VB supports only [in, out], [out] and [out, retval] arrays -->
755 <xsl:if test="@dir='in'">, out</xsl:if>
756 </xsl:if>
757 <xsl:if test="@array">
758 <xsl:if test="@dir='return'">
759 <xsl:message terminate="yes">
760 <xsl:value-of select="concat(../../@name,'::',../@name,'::',@name,': ')"/>
761 <xsl:text>return 'array' parameters are not supported, use 'safearray="yes"' instead.</xsl:text>
762 </xsl:message>
763 </xsl:if>
764 <xsl:choose>
765 <xsl:when test="../param[@name=current()/@array]">
766 <xsl:if test="../param[@name=current()/@array]/@dir != @dir">
767 <xsl:message terminate="yes">
768 <xsl:value-of select="concat(../../@name,'::',../@name,': ')"/>
769 <xsl:value-of select="concat(@name,' and ',../param[@name=current()/@array]/@name)"/>
770 <xsl:text> must have the same direction</xsl:text>
771 </xsl:message>
772 </xsl:if>
773 <xsl:text>, size_is(</xsl:text>
774 <xsl:if test="@dir='out'">
775 <xsl:text>, *</xsl:text>
776 </xsl:if>
777 <xsl:text>a</xsl:text>
778 <xsl:call-template name="capitalize">
779 <xsl:with-param name="str" select="@array"/>
780 </xsl:call-template>
781 <xsl:text>)</xsl:text>
782 </xsl:when>
783 <xsl:otherwise>
784 <xsl:message terminate="yes">
785 <xsl:value-of select="concat(../../@name,'::',../@name,'::',@name,': ')"/>
786 <xsl:text>array attribute refers to non-existent param: </xsl:text>
787 <xsl:value-of select="@array"/>
788 </xsl:message>
789 </xsl:otherwise>
790 </xsl:choose>
791 </xsl:if>
792 <xsl:text>] </xsl:text>
793 <xsl:if test="@safearray='yes'">
794 <xsl:text>SAFEARRAY(</xsl:text>
795 </xsl:if>
796 <xsl:apply-templates select="@type"/>
797 <xsl:if test="@safearray='yes'">
798 <xsl:text>)</xsl:text>
799 </xsl:if>
800 <xsl:if test="@array">
801 <xsl:text> *</xsl:text>
802 </xsl:if>
803 <xsl:if test="@dir='out' or @dir='return' or @safearray='yes'">
804 <xsl:text> *</xsl:text>
805 </xsl:if>
806 <xsl:text> a</xsl:text>
807 <xsl:call-template name="capitalize">
808 <xsl:with-param name="str" select="@name"/>
809 </xsl:call-template>
810</xsl:template>
811
812<xsl:template match="method/param" mode="forwarder">
813 <xsl:choose>
814 <xsl:when test="@safearray='yes'">
815 <xsl:text>SAFEARRAY *</xsl:text>
816 </xsl:when>
817 <xsl:otherwise>
818 <xsl:apply-templates select="@type"/>
819 </xsl:otherwise>
820 </xsl:choose>
821 <xsl:if test="@array">
822 <xsl:text> *</xsl:text>
823 </xsl:if>
824 <xsl:if test="@dir='out' or @dir='return' or @safearray='yes'">
825 <xsl:text> *</xsl:text>
826 </xsl:if>
827 <xsl:text> a</xsl:text>
828 <xsl:call-template name="capitalize">
829 <xsl:with-param name="str" select="@name"/>
830 </xsl:call-template>
831</xsl:template>
832
833
834<!--
835 * attribute/parameter type conversion
836-->
837<xsl:template match="
838 attribute/@type | param/@type |
839 enumerator/@type | collection/@type | collection/@enumerator
840">
841 <xsl:variable name="self_target" select="current()/ancestor::if/@target"/>
842
843 <xsl:if test="../@array and ../@safearray='yes'">
844 <xsl:message terminate="yes">
845 <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
846 <xsl:text>either 'array' or 'safearray="yes"' attribute is allowed, but not both!</xsl:text>
847 </xsl:message>
848 </xsl:if>
849
850 <xsl:choose>
851 <!-- modifiers (ignored for 'enumeration' attributes)-->
852 <xsl:when test="name(current())='type' and ../@mod">
853 <xsl:choose>
854 <xsl:when test="../@mod='ptr'">
855 <xsl:choose>
856 <!-- standard types -->
857 <!--xsl:when test=".='result'">??</xsl:when-->
858 <xsl:when test=".='boolean'">BOOL *</xsl:when>
859 <xsl:when test=".='octet'">BYTE *</xsl:when>
860 <xsl:when test=".='short'">SHORT *</xsl:when>
861 <xsl:when test=".='unsigned short'">USHORT *</xsl:when>
862 <xsl:when test=".='long'">LONG *</xsl:when>
863 <xsl:when test=".='long long'">LONG64 *</xsl:when>
864 <xsl:when test=".='unsigned long'">ULONG *</xsl:when>
865 <xsl:when test=".='unsigned long long'">ULONG64 *</xsl:when>
866 <xsl:when test=".='char'">CHAR *</xsl:when>
867 <!--xsl:when test=".='string'">??</xsl:when-->
868 <xsl:when test=".='wchar'">OLECHAR *</xsl:when>
869 <!--xsl:when test=".='wstring'">??</xsl:when-->
870 <xsl:otherwise>
871 <xsl:message terminate="yes">
872 <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
873 <xsl:text>attribute 'mod=</xsl:text>
874 <xsl:value-of select="concat('&quot;',../@mod,'&quot;')"/>
875 <xsl:text>' cannot be used with type </xsl:text>
876 <xsl:value-of select="concat('&quot;',current(),'&quot;!')"/>
877 </xsl:message>
878 </xsl:otherwise>
879 </xsl:choose>
880 </xsl:when>
881 <xsl:otherwise>
882 <xsl:message terminate="yes">
883 <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
884 <xsl:value-of select="concat('value &quot;',../@mod,'&quot; ')"/>
885 <xsl:text>of attribute 'mod' is invalid!</xsl:text>
886 </xsl:message>
887 </xsl:otherwise>
888 </xsl:choose>
889 </xsl:when>
890 <!-- no modifiers -->
891 <xsl:otherwise>
892 <xsl:choose>
893 <!-- standard types -->
894 <xsl:when test=".='result'">HRESULT</xsl:when>
895 <xsl:when test=".='boolean'">BOOL</xsl:when>
896 <xsl:when test=".='octet'">BYTE</xsl:when>
897 <xsl:when test=".='short'">SHORT</xsl:when>
898 <xsl:when test=".='unsigned short'">USHORT</xsl:when>
899 <xsl:when test=".='long'">LONG</xsl:when>
900 <xsl:when test=".='long long'">LONG64</xsl:when>
901 <xsl:when test=".='unsigned long'">ULONG</xsl:when>
902 <xsl:when test=".='unsigned long long'">ULONG64</xsl:when>
903 <xsl:when test=".='char'">CHAR</xsl:when>
904 <xsl:when test=".='string'">CHAR *</xsl:when>
905 <xsl:when test=".='wchar'">OLECHAR</xsl:when>
906 <xsl:when test=".='wstring'">BSTR</xsl:when>
907 <!-- UUID type -->
908 <xsl:when test=".='uuid'">GUID</xsl:when>
909 <!-- system interface types -->
910 <xsl:when test=".='$unknown'">IUnknown *</xsl:when>
911 <xsl:otherwise>
912 <xsl:choose>
913 <!-- enum types -->
914 <xsl:when test="
915 (ancestor::library/enum[@name=current()]) or
916 (ancestor::library/if[@target=$self_target]/enum[@name=current()])
917 ">
918 <xsl:value-of select="."/>
919 </xsl:when>
920 <!-- custom interface types -->
921 <xsl:when test="
922 (name(current())='enumerator' and
923 ((ancestor::library/enumerator[@name=current()]) or
924 (ancestor::library/if[@target=$self_target]/enumerator[@name=current()]))
925 ) or
926 ((ancestor::library/interface[@name=current()]) or
927 (ancestor::library/if[@target=$self_target]/interface[@name=current()])
928 ) or
929 ((ancestor::library/collection[@name=current()]) or
930 (ancestor::library/if[@target=$self_target]/collection[@name=current()])
931 )
932 ">
933 <xsl:value-of select="."/><xsl:text> *</xsl:text>
934 </xsl:when>
935 <!-- other types -->
936 <xsl:otherwise>
937 <xsl:message terminate="yes">
938 <xsl:text>Unknown parameter type: </xsl:text>
939 <xsl:value-of select="."/>
940 </xsl:message>
941 </xsl:otherwise>
942 </xsl:choose>
943 </xsl:otherwise>
944 </xsl:choose>
945 </xsl:otherwise>
946 </xsl:choose>
947</xsl:template>
948
949</xsl:stylesheet>
950
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