VirtualBox

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

Last change on this file since 5523 was 4097, checked in by vboxsync, 17 years ago

Main, Installer:

  • XIDL Schema: Renamed module/ => library, class => module/class.
  • WiX: Created XSLT to generate the TypeLib block from XIDL to avoid usage of tallow.exe.
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 20.0 KB
Line 
1<?xml version="1.0"?>
2
3<!--
4 * A template to generate a MS IDL compatible interface definition file
5 * from the generic interface definition expressed in XML.
6
7 Copyright (C) 2006-2007 innotek GmbH
8
9 This file is part of VirtualBox Open Source Edition (OSE), as
10 available from http://www.virtualbox.org. This file is free software;
11 you can redistribute it and/or modify it under the terms of the GNU
12 General Public License as published by the Free Software Foundation,
13 in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
14 distribution. VirtualBox OSE is distributed in the hope that it will
15 be useful, but WITHOUT ANY WARRANTY of any kind.
16-->
17
18<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
19<xsl:output method="text"/>
20
21<xsl:strip-space elements="*"/>
22
23
24<!--
25// helper definitions
26/////////////////////////////////////////////////////////////////////////////
27-->
28
29<!--
30 * capitalizes the first letter
31-->
32<xsl:template name="capitalize">
33 <xsl:param name="str" select="."/>
34 <xsl:value-of select="
35 concat(
36 translate(substring($str,1,1),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ'),
37 substring($str,2)
38 )
39 "/>
40</xsl:template>
41
42<!--
43 * uncapitalizes the first letter only if the second one is not capital
44 * otherwise leaves the string unchanged
45-->
46<xsl:template name="uncapitalize">
47 <xsl:param name="str" select="."/>
48 <xsl:choose>
49 <xsl:when test="not(contains('ABCDEFGHIJKLMNOPQRSTUVWXYZ', substring($str,2,1)))">
50 <xsl:value-of select="
51 concat(
52 translate(substring($str,1,1),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),
53 substring($str,2)
54 )
55 "/>
56 </xsl:when>
57 <xsl:otherwise>
58 <xsl:value-of select="string($str)"/>
59 </xsl:otherwise>
60 </xsl:choose>
61</xsl:template>
62
63
64<!--
65// templates
66/////////////////////////////////////////////////////////////////////////////
67-->
68
69
70<!--
71 * header
72-->
73<xsl:template match="/idl">
74 <xsl:text>
75/*
76 * DO NOT EDIT! This is a generated file.
77 *
78 * MS IDL (MIDL) definition for VirualBox Main API (COM interfaces)
79 * generated from XIDL (XML interface definition).
80 *
81 * Source : src/VBox/Main/idl/VirtualBox.xidl
82 * Generator : src/VBox/Main/idl/midl.xsl
83 */
84 </xsl:text>
85 <xsl:text>&#x0A;</xsl:text>
86 <xsl:text>import "unknwn.idl";&#x0A;&#x0A;</xsl:text>
87 <xsl:apply-templates/>
88</xsl:template>
89
90
91<!--
92 * ignore all |if|s except those for MIDL target
93-->
94<xsl:template match="if">
95 <xsl:if test="@target='midl'">
96 <xsl:apply-templates/>
97 </xsl:if>
98</xsl:template>
99<xsl:template match="if" mode="forward">
100 <xsl:if test="@target='midl'">
101 <xsl:apply-templates mode="forward"/>
102 </xsl:if>
103</xsl:template>
104
105
106<!--
107 * cpp_quote
108-->
109<xsl:template match="cpp">
110 <xsl:text>cpp_quote("</xsl:text>
111 <xsl:value-of select="@line"/>
112 <xsl:text>")&#x0A;&#x0A;</xsl:text>
113</xsl:template>
114
115
116<!--
117 * #if statement (@if attribute)
118-->
119<xsl:template match="@if" mode="begin">
120 <xsl:text>#if </xsl:text>
121 <xsl:value-of select="."/>
122 <xsl:text>&#x0A;</xsl:text>
123</xsl:template>
124<xsl:template match="@if" mode="end">
125 <xsl:text>#endif&#x0A;</xsl:text>
126</xsl:template>
127
128
129<!--
130 * libraries
131-->
132<xsl:template match="library">[
133 uuid(<xsl:value-of select="@uuid"/>),
134 version(<xsl:value-of select="@version"/>),
135 helpstring("<xsl:value-of select="@desc"/>")
136]
137<xsl:text>library </xsl:text>
138 <xsl:value-of select="@name"/>
139 <xsl:text>&#x0A;{&#x0A;</xsl:text>
140 <xsl:text>&#x0A;importlib("stdole2.tlb");&#x0A;&#x0A;</xsl:text>
141 <!-- forward declarations -->
142 <xsl:apply-templates select="if | interface | collection | enumerator" mode="forward"/>
143 <xsl:text>&#x0A;</xsl:text>
144 <!-- all enums go first -->
145 <xsl:apply-templates select="enum | if/enum"/>
146 <!-- everything else but enums -->
147 <xsl:apply-templates select="*[not(self::enum) and not(self::if[enum])]"/>
148 <!-- -->
149 <xsl:text>}; /* library </xsl:text>
150 <xsl:value-of select="@name"/>
151 <xsl:text> */&#x0A;&#x0A;</xsl:text>
152</xsl:template>
153
154
155<!--
156 * forward declarations
157-->
158<xsl:template match="interface | collection | enumerator" mode="forward">
159 <xsl:text>interface </xsl:text>
160 <xsl:value-of select="@name"/>
161 <xsl:text>;&#x0A;</xsl:text>
162</xsl:template>
163
164
165<!--
166 * interfaces
167-->
168<xsl:template match="interface">[
169 uuid(<xsl:value-of select="@uuid"/>),
170 object,
171 dual
172]
173<xsl:text>interface </xsl:text>
174 <xsl:value-of select="@name"/>
175 <xsl:text> : </xsl:text>
176 <xsl:choose>
177 <xsl:when test="@extends='$unknown'">IUnknown</xsl:when>
178 <xsl:when test="@extends='$dispatched'">IDispatch</xsl:when>
179 <xsl:when test="@extends='$errorinfo'">IErrorInfo</xsl:when>
180 <xsl:otherwise><xsl:value-of select="@extends"/></xsl:otherwise>
181 </xsl:choose>
182 <xsl:text>&#x0A;{&#x0A;</xsl:text>
183 <!-- attributes (properties) -->
184 <xsl:apply-templates select="attribute"/>
185 <!-- methods -->
186 <xsl:apply-templates select="method"/>
187 <!-- 'if' enclosed elements, unsorted -->
188 <xsl:apply-templates select="if"/>
189 <!-- -->
190 <xsl:text>}; /* interface </xsl:text>
191 <xsl:value-of select="@name"/>
192 <xsl:text> */&#x0A;&#x0A;</xsl:text>
193</xsl:template>
194
195
196<!--
197 * attributes
198-->
199<xsl:template match="interface//attribute | collection//attribute">
200 <xsl:apply-templates select="@if" mode="begin"/>
201 <xsl:text> [propget] HRESULT </xsl:text>
202 <xsl:call-template name="capitalize">
203 <xsl:with-param name="str" select="@name"/>
204 </xsl:call-template>
205 <xsl:text> ([out, retval] </xsl:text>
206 <xsl:apply-templates select="@type"/>
207 <xsl:text> * a</xsl:text>
208 <xsl:call-template name="capitalize">
209 <xsl:with-param name="str" select="@name"/>
210 </xsl:call-template>
211 <xsl:text>);&#x0A;</xsl:text>
212 <xsl:if test="not(@readonly='yes')">
213 <xsl:text> [propput] HRESULT </xsl:text>
214 <xsl:call-template name="capitalize">
215 <xsl:with-param name="str" select="@name"/>
216 </xsl:call-template>
217 <xsl:text> ([in] </xsl:text>
218 <xsl:apply-templates select="@type"/>
219 <xsl:text> a</xsl:text>
220 <xsl:call-template name="capitalize">
221 <xsl:with-param name="str" select="@name"/>
222 </xsl:call-template>
223 <xsl:text>);&#x0A;</xsl:text>
224 </xsl:if>
225 <xsl:apply-templates select="@if" mode="end"/>
226 <xsl:text>&#x0A;</xsl:text>
227</xsl:template>
228
229
230<!--
231 * methods
232-->
233<xsl:template match="interface//method | collection//method">
234 <xsl:apply-templates select="@if" mode="begin"/>
235 <xsl:text> HRESULT </xsl:text>
236 <xsl:call-template name="capitalize">
237 <xsl:with-param name="str" select="@name"/>
238 </xsl:call-template>
239 <xsl:if test="param">
240 <xsl:text> (&#x0A;</xsl:text>
241 <xsl:for-each select="param [position() != last()]">
242 <xsl:text> </xsl:text>
243 <xsl:apply-templates select="."/>
244 <xsl:text>,&#x0A;</xsl:text>
245 </xsl:for-each>
246 <xsl:text> </xsl:text>
247 <xsl:apply-templates select="param [last()]"/>
248 <xsl:text>&#x0A; );&#x0A;</xsl:text>
249 </xsl:if>
250 <xsl:if test="not(param)">
251 <xsl:text>();&#x0A;</xsl:text>
252 </xsl:if>
253 <xsl:apply-templates select="@if" mode="end"/>
254 <xsl:text>&#x0A;</xsl:text>
255</xsl:template>
256
257
258<!--
259 * co-classes
260-->
261<xsl:template match="module/class">[
262 uuid(<xsl:value-of select="@uuid"/>)
263]
264<xsl:text>coclass </xsl:text>
265 <xsl:value-of select="@name"/>
266 <xsl:text>&#x0A;{&#x0A;</xsl:text>
267 <xsl:for-each select="interface">
268 <xsl:text> </xsl:text>
269 <xsl:if test="@default='yes'">
270 <xsl:text>[default] </xsl:text>
271 </xsl:if>
272 <xsl:text>interface </xsl:text>
273 <xsl:value-of select="@name"/>
274 <xsl:text>;&#x0A;</xsl:text>
275 </xsl:for-each>
276 <xsl:text>&#x0A;}; /* coclass </xsl:text>
277 <xsl:value-of select="@name"/>
278 <xsl:text> */&#x0A;&#x0A;</xsl:text>
279</xsl:template>
280
281
282<!--
283 * enumerators
284-->
285<xsl:template match="enumerator">[
286 uuid(<xsl:value-of select="@uuid"/>),
287 object,
288 dual
289]
290<xsl:text>interface </xsl:text>
291 <xsl:value-of select="@name"/>
292 <xsl:text> : IUnknown&#x0A;{&#x0A;</xsl:text>
293 <!-- HasMore -->
294 <xsl:text> HRESULT HasMore ([out, retval] BOOL * more);&#x0A;&#x0A;</xsl:text>
295 <!-- GetNext -->
296 <xsl:text> HRESULT GetNext ([out, retval] </xsl:text>
297 <xsl:apply-templates select="@type"/>
298 <xsl:text> * next);&#x0A;&#x0A;</xsl:text>
299 <!-- -->
300 <xsl:text>&#x0A;}; /* interface </xsl:text>
301 <xsl:value-of select="@name"/>
302 <xsl:text> */&#x0A;&#x0A;</xsl:text>
303</xsl:template>
304
305
306<!--
307 * collections
308-->
309<xsl:template match="collection">
310 <xsl:if test="not(@readonly='yes')">
311 <xsl:message terminate="yes">
312 <xsl:value-of select="concat(@name,': ')"/>
313 <xsl:text>non-readonly collections are not currently supported</xsl:text>
314 </xsl:message>
315 </xsl:if>[
316 uuid(<xsl:value-of select="@uuid"/>),
317 object,
318 dual
319]
320<xsl:text>interface </xsl:text>
321 <xsl:value-of select="@name"/>
322 <xsl:text> : IUnknown&#x0A;{&#x0A;</xsl:text>
323 <!-- Count -->
324 <xsl:text> [propget] HRESULT Count ([out, retval] ULONG * count);&#x0A;&#x0A;</xsl:text>
325 <!-- GetItemAt -->
326 <xsl:text> HRESULT GetItemAt ([in] ULONG index, [out, retval] </xsl:text>
327 <xsl:apply-templates select="@type"/>
328 <xsl:text> * item);&#x0A;&#x0A;</xsl:text>
329 <!-- Enumerate -->
330 <xsl:text> HRESULT Enumerate ([out, retval] </xsl:text>
331 <xsl:apply-templates select="@enumerator"/>
332 <xsl:text> * enumerator);&#x0A;&#x0A;</xsl:text>
333 <!-- other extra attributes (properties) -->
334 <xsl:apply-templates select="attribute"/>
335 <!-- other extra methods -->
336 <xsl:apply-templates select="method"/>
337 <!-- 'if' enclosed elements, unsorted -->
338 <xsl:apply-templates select="if"/>
339 <!-- -->
340 <xsl:text>&#x0A;}; /* interface </xsl:text>
341 <xsl:value-of select="@name"/>
342 <xsl:text> */&#x0A;&#x0A;</xsl:text>
343</xsl:template>
344
345
346<!--
347 * enums
348-->
349<xsl:template match="enum">[
350 uuid(<xsl:value-of select="@uuid"/>),
351 v1_enum
352]
353<xsl:text>typedef enum &#x0A;{&#x0A;</xsl:text>
354 <xsl:for-each select="const">
355 <xsl:text> </xsl:text>
356 <xsl:value-of select="@name"/> = <xsl:value-of select="@value"/>
357 <xsl:choose>
358 <xsl:when test="position()!=last()"><xsl:text>,&#x0A;</xsl:text></xsl:when>
359 <xsl:otherwise><xsl:text>&#x0A;</xsl:text></xsl:otherwise>
360 </xsl:choose>
361 </xsl:for-each>
362 <xsl:text>} </xsl:text>
363 <xsl:value-of select="@name"/>
364 <xsl:text>;&#x0A;&#x0A;</xsl:text>
365 <!-- -->
366 <xsl:value-of select="concat('/* cross-platform type name for ', @name, ' */&#x0A;')"/>
367 <xsl:value-of select="concat('cpp_quote(&quot;#define ', @name, '_T', ' ',
368 @name, '&quot;)&#x0A;&#x0A;')"/>
369 <xsl:text>cpp_quote("")&#x0A;</xsl:text>
370 <!-- -->
371 <xsl:value-of select="concat('/* cross-platform constants for ', @name, ' */&#x0A;')"/>
372 <xsl:for-each select="const">
373 <xsl:value-of select="concat('cpp_quote(&quot;#define ', ../@name, '_', @name, ' ',
374 @name, '&quot;)&#x0A;')"/>
375 <xsl:choose>
376 <xsl:when test="position()=last()"><xsl:text>cpp_quote("")&#x0A;</xsl:text></xsl:when>
377 </xsl:choose>
378 </xsl:for-each>
379 <xsl:text>&#x0A;&#x0A;</xsl:text>
380</xsl:template>
381
382
383<!--
384 * method parameters
385-->
386<xsl:template match="method/param">
387 <xsl:text>[</xsl:text>
388 <xsl:choose>
389 <xsl:when test="@dir='in'">in</xsl:when>
390 <xsl:when test="@dir='out'">out</xsl:when>
391 <xsl:when test="@dir='return'">out, retval</xsl:when>
392 <xsl:otherwise>in</xsl:otherwise>
393 </xsl:choose>
394 <xsl:if test="@array">
395 <xsl:if test="@dir='return'">
396 <xsl:message terminate="yes">
397 <xsl:value-of select="concat(../../@name,'::',../@name,'::',@name,': ')"/>
398 <xsl:text>return array parameters are not currently supported</xsl:text>
399 </xsl:message>
400 </xsl:if>
401 <xsl:choose>
402 <xsl:when test="../param[@name=current()/@array]">
403 <xsl:if test="../param[@name=current()/@array]/@dir != @dir">
404 <xsl:message terminate="yes">
405 <xsl:value-of select="concat(../../@name,'::',../@name,': ')"/>
406 <xsl:value-of select="concat(@name,' and ',../param[@name=current()/@array]/@name)"/>
407 <xsl:text> must have the same direction</xsl:text>
408 </xsl:message>
409 </xsl:if>
410 <xsl:text>, size_is(</xsl:text>
411 <xsl:if test="@dir='out'">
412 <xsl:text>, </xsl:text>
413 </xsl:if>
414 <xsl:if test="../param[@name=current()/@array]/@dir='out'">
415 <xsl:text>*</xsl:text>
416 </xsl:if>
417 <!--xsl:value-of select="@array"/-->
418 <xsl:text>a</xsl:text>
419 <xsl:call-template name="capitalize">
420 <xsl:with-param name="str" select="@array"/>
421 </xsl:call-template>
422 <xsl:text>)</xsl:text>
423 </xsl:when>
424 <xsl:otherwise>
425 <xsl:message terminate="yes">
426 <xsl:value-of select="concat(../../@name,'::',../@name,'::',@name,': ')"/>
427 <xsl:text>array attribute refers to non-existent param: </xsl:text>
428 <xsl:value-of select="@array"/>
429 </xsl:message>
430 </xsl:otherwise>
431 </xsl:choose>
432 </xsl:if>
433 <xsl:text>] </xsl:text>
434 <xsl:apply-templates select="@type"/>
435 <xsl:text> </xsl:text>
436 <xsl:if test="@array">
437 <xsl:text>* </xsl:text>
438 </xsl:if>
439 <xsl:if test="@dir='out' or @dir='return'">
440 <xsl:text>* </xsl:text>
441 </xsl:if>
442 <!--xsl:value-of select="@name"/-->
443 <xsl:text>a</xsl:text>
444 <xsl:call-template name="capitalize">
445 <xsl:with-param name="str" select="@name"/>
446 </xsl:call-template>
447</xsl:template>
448
449
450<!--
451 * attribute/parameter type conversion
452-->
453<xsl:template match="
454 attribute/@type | param/@type |
455 enumerator/@type | collection/@type | collection/@enumerator
456">
457 <xsl:variable name="self_target" select="current()/ancestor::if/@target"/>
458
459 <xsl:choose>
460 <!-- modifiers (ignored for 'enumeration' attributes)-->
461 <xsl:when test="name(current())='type' and ../@mod">
462 <xsl:if test="../@array">
463 <xsl:message terminate="yes">
464 <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
465 <xsl:text>either 'array' or 'mod' attribute is allowed, but not both!</xsl:text>
466 </xsl:message>
467 </xsl:if>
468 <xsl:choose>
469 <xsl:when test="../@mod='ptr'">
470 <xsl:choose>
471 <!-- standard types -->
472 <!--xsl:when test=".='result'">??</xsl:when-->
473 <xsl:when test=".='boolean'">BOOL *</xsl:when>
474 <xsl:when test=".='octet'">BYTE *</xsl:when>
475 <xsl:when test=".='short'">SHORT *</xsl:when>
476 <xsl:when test=".='unsigned short'">USHORT *</xsl:when>
477 <xsl:when test=".='long'">LONG *</xsl:when>
478 <xsl:when test=".='long long'">LONG64 *</xsl:when>
479 <xsl:when test=".='unsigned long'">ULONG *</xsl:when>
480 <xsl:when test=".='unsigned long long'">ULONG64 *</xsl:when>
481 <xsl:when test=".='char'">CHAR *</xsl:when>
482 <!--xsl:when test=".='string'">??</xsl:when-->
483 <xsl:when test=".='wchar'">OLECHAR *</xsl:when>
484 <!--xsl:when test=".='wstring'">??</xsl:when-->
485 <xsl:otherwise>
486 <xsl:message terminate="yes">
487 <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
488 <xsl:text>attribute 'mod=</xsl:text>
489 <xsl:value-of select="concat('&quot;',../@mod,'&quot;')"/>
490 <xsl:text>' cannot be used with type </xsl:text>
491 <xsl:value-of select="concat('&quot;',current(),'&quot;!')"/>
492 </xsl:message>
493 </xsl:otherwise>
494 </xsl:choose>
495 </xsl:when>
496 <xsl:otherwise>
497 <xsl:message terminate="yes">
498 <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
499 <xsl:value-of select="concat('value &quot;',../@mod,'&quot; ')"/>
500 <xsl:text>of attibute 'mod' is invalid!</xsl:text>
501 </xsl:message>
502 </xsl:otherwise>
503 </xsl:choose>
504 </xsl:when>
505 <!-- no modifiers -->
506 <xsl:otherwise>
507 <xsl:choose>
508 <!-- standard types -->
509 <xsl:when test=".='result'">HRESULT</xsl:when>
510 <xsl:when test=".='boolean'">BOOL</xsl:when>
511 <xsl:when test=".='octet'">BYTE</xsl:when>
512 <xsl:when test=".='short'">SHORT</xsl:when>
513 <xsl:when test=".='unsigned short'">USHORT</xsl:when>
514 <xsl:when test=".='long'">LONG</xsl:when>
515 <xsl:when test=".='long long'">LONG64</xsl:when>
516 <xsl:when test=".='unsigned long'">ULONG</xsl:when>
517 <xsl:when test=".='unsigned long long'">ULONG64</xsl:when>
518 <xsl:when test=".='char'">CHAR</xsl:when>
519 <xsl:when test=".='string'">CHAR *</xsl:when>
520 <xsl:when test=".='wchar'">OLECHAR</xsl:when>
521 <xsl:when test=".='wstring'">BSTR</xsl:when>
522 <!-- UUID type -->
523 <xsl:when test=".='uuid'">GUID</xsl:when>
524 <!-- system interface types -->
525 <xsl:when test=".='$unknown'">IUnknown *</xsl:when>
526 <xsl:otherwise>
527 <xsl:choose>
528 <!-- enum types -->
529 <xsl:when test="
530 (ancestor::library/enum[@name=current()]) or
531 (ancestor::library/if[@target=$self_target]/enum[@name=current()])
532 ">
533 <xsl:value-of select="."/>
534 </xsl:when>
535 <!-- custom interface types -->
536 <xsl:when test="
537 (name(current())='enumerator' and
538 ((ancestor::library/enumerator[@name=current()]) or
539 (ancestor::library/if[@target=$self_target]/enumerator[@name=current()]))
540 ) or
541 ((ancestor::library/interface[@name=current()]) or
542 (ancestor::library/if[@target=$self_target]/interface[@name=current()])
543 ) or
544 ((ancestor::library/collection[@name=current()]) or
545 (ancestor::library/if[@target=$self_target]/collection[@name=current()])
546 )
547 ">
548 <xsl:value-of select="."/><xsl:text> *</xsl:text>
549 </xsl:when>
550 <!-- other types -->
551 <xsl:otherwise>
552 <xsl:message terminate="yes">
553 <xsl:text>Unknown parameter type: </xsl:text>
554 <xsl:value-of select="."/>
555 </xsl:message>
556 </xsl:otherwise>
557 </xsl:choose>
558 </xsl:otherwise>
559 </xsl:choose>
560 </xsl:otherwise>
561 </xsl:choose>
562</xsl:template>
563
564</xsl:stylesheet>
565
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