VirtualBox

source: vbox/trunk/src/VBox/Main/webservice/websrv-php.xsl@ 40752

Last change on this file since 40752 was 36676, checked in by vboxsync, 14 years ago

Main/webservice: Fix for variable sanity checking, and provide VirtualBox COM result variables as constants. Contributed by James Lucas.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 20.9 KB
Line 
1<xsl:stylesheet version = '1.0'
2 xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
3 xmlns:vbox="http://www.virtualbox.org/">
4
5<!--
6
7 websrv-php.xsl:
8 XSLT stylesheet that generates vboxServiceWrappers.php from
9 VirtualBox.xidl. This PHP file represents our
10 web service API. Depends on WSDL file for actual SOAP bindings.
11
12 Contributed by James Lucas (mjlucas at eng.uts.edu.au).
13
14 Copyright (C) 2008-2010 Oracle Corporation
15
16 This file is part of VirtualBox Open Source Edition (OSE), as
17 available from http://www.virtualbox.org. This file is free software;
18 you can redistribute it and/or modify it under the terms of the GNU
19 General Public License (GPL) as published by the Free Software
20 Foundation, in version 2 as it comes in the "COPYING" file of the
21 VirtualBox OSE distribution. VirtualBox OSE is distributed in the
22 hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
23-->
24
25
26<xsl:output
27 method="text"
28 version="1.0"
29 encoding="utf-8"
30 indent="no"/>
31
32<xsl:include href="websrv-shared.inc.xsl" />
33
34<xsl:variable name="G_setSuppressedInterfaces"
35 select="//interface[@wsmap='suppress']" />
36
37<xsl:template name="emitOutParam">
38 <xsl:param name="type" />
39 <xsl:param name="value" />
40 <xsl:param name="safearray" />
41
42 <xsl:choose>
43 <xsl:when test="$type='wstring' or $type='uuid'">
44 <xsl:call-template name="emitPrimitive">
45 <xsl:with-param name="type">string</xsl:with-param>
46 <xsl:with-param name="value" select="$value" />
47 <xsl:with-param name="safearray" select="$safearray"/>
48 </xsl:call-template>
49 </xsl:when>
50 <xsl:when test="$type='boolean'">
51 <xsl:call-template name="emitPrimitive">
52 <xsl:with-param name="type">bool</xsl:with-param>
53 <xsl:with-param name="value" select="$value" />
54 <xsl:with-param name="safearray" select="$safearray"/>
55 </xsl:call-template>
56 </xsl:when>
57 <xsl:when test="$type='short' or $type='unsigned short' or $type='long' or $type='octet'">
58 <xsl:call-template name="emitPrimitive">
59 <xsl:with-param name="type">int</xsl:with-param>
60 <xsl:with-param name="value" select="$value" />
61 <xsl:with-param name="safearray" select="$safearray"/>
62 </xsl:call-template>
63 </xsl:when>
64 <xsl:when test="$type='double' or $type='float' or $type='unsigned long' or $type='long long' or $type='unsigned long long'">
65 <xsl:call-template name="emitPrimitive">
66 <xsl:with-param name="type">float</xsl:with-param>
67 <xsl:with-param name="value" select="$value" />
68 <xsl:with-param name="safearray" select="$safearray"/>
69 </xsl:call-template>
70 </xsl:when>
71 <xsl:when test="$type='$unknown'">
72 <xsl:call-template name="emitObject">
73 <xsl:with-param name="type">VBox_ManagedObject</xsl:with-param>
74 <xsl:with-param name="value" select="$value" />
75 <xsl:with-param name="safearray" select="$safearray"/>
76 </xsl:call-template>
77 </xsl:when>
78 <xsl:otherwise>
79 <xsl:call-template name="emitObject">
80 <xsl:with-param name="type" select="$type" />
81 <xsl:with-param name="value" select="$value" />
82 <xsl:with-param name="safearray" select="$safearray"/>
83 </xsl:call-template>
84 </xsl:otherwise>
85 </xsl:choose>
86</xsl:template>
87
88<xsl:template name="emitObject">
89 <xsl:param name="type" />
90 <xsl:param name="value" />
91 <xsl:param name="safearray" />
92 <xsl:choose>
93 <xsl:when test="$safearray='yes'">
94 <xsl:text>new </xsl:text><xsl:value-of select="$type" />Collection ($this->connection, (array)<xsl:value-of select="$value"/><xsl:text>)</xsl:text>
95 </xsl:when>
96 <xsl:otherwise>
97 <xsl:text>new </xsl:text><xsl:value-of select="$type" /> ($this->connection, <xsl:value-of select="$value"/><xsl:text>)</xsl:text>
98 </xsl:otherwise>
99 </xsl:choose>
100</xsl:template>
101
102<xsl:template name="emitPrimitive">
103 <xsl:param name="type" />
104 <xsl:param name="value" />
105 <xsl:param name="safearray" />
106 <xsl:choose>
107 <xsl:when test="$safearray='yes'">
108 <xsl:text>(array)</xsl:text><xsl:value-of select="$value"/>
109 </xsl:when>
110 <xsl:otherwise>
111 <xsl:text>(</xsl:text><xsl:value-of select="$type" /><xsl:text>)</xsl:text><xsl:value-of select="$value"/>
112 </xsl:otherwise>
113 </xsl:choose>
114</xsl:template>
115
116<xsl:template name="emitGetAttribute">
117 <xsl:param name="ifname" />
118 <xsl:param name="attrname" />
119 <xsl:param name="attrtype" />
120 <xsl:param name="attrsafearray" />
121 <xsl:variable name="fname"><xsl:call-template name="makeGetterName"><xsl:with-param name="attrname" select="$attrname"/></xsl:call-template> </xsl:variable>
122 public function <xsl:value-of select="$fname"/>() {
123 $request = new stdClass();
124 $request->_this = $this->handle;
125 $response = $this->connection->__soapCall('<xsl:value-of select="$ifname"/>_<xsl:value-of select="$fname"/>', array((array)$request));
126 <xsl:text>return </xsl:text>
127 <xsl:call-template name="emitOutParam">
128 <xsl:with-param name="type" select="$attrtype" />
129 <xsl:with-param name="value" select="concat('$response->','returnval')" />
130 <xsl:with-param name="safearray" select="@safearray"/>
131 </xsl:call-template><xsl:text>;</xsl:text>
132 }
133</xsl:template>
134
135<xsl:template name="emitSetAttribute">
136 <xsl:param name="ifname" />
137 <xsl:param name="attrname" />
138 <xsl:param name="attrtype" />
139 <xsl:param name="attrsafearray" />
140 <xsl:variable name="fname"><xsl:call-template name="makeSetterName"><xsl:with-param name="attrname" select="$attrname"/></xsl:call-template></xsl:variable>
141 public function <xsl:value-of select="$fname"/>($value) {
142 $request = new stdClass();
143 $request->_this = $this->handle;
144 if (is_null($value) || is_scalar($value)) {
145 $request-><xsl:value-of select="$attrname"/> = $value;
146 }
147 else
148 {
149 $request-><xsl:value-of select="$attrname"/> = $value->handle;
150 }
151 $this->connection->__soapCall('<xsl:value-of select="$ifname"/>_<xsl:value-of select="$fname"/>', array((array)$request));
152 }
153</xsl:template>
154
155<xsl:template name="interface">
156 <xsl:variable name="ifname"><xsl:value-of select="@name" /></xsl:variable>
157 <xsl:variable name="wsmap"><xsl:value-of select="@wsmap" /></xsl:variable>
158 <xsl:variable name="extends"><xsl:value-of select="@extends" /></xsl:variable>
159 <xsl:text>
160/**
161* Generated VBoxWebService Interface Wrapper
162*/
163</xsl:text>
164 <xsl:choose>
165 <xsl:when test="($extends = '$unknown') or ($extends = '$dispatched') or ($extends = '$errorinfo')">
166 <xsl:value-of select="concat('class ', $ifname, ' extends VBox_ManagedObject {&#10;')" />
167 </xsl:when>
168 <xsl:when test="//interface[@name=$extends]">
169 <xsl:value-of select="concat('class ', $ifname, ' extends ', $extends, ' {&#10;')" />
170 </xsl:when>
171 </xsl:choose>
172 <xsl:for-each select="method">
173 <xsl:if test="not((param[@type=($G_setSuppressedInterfaces/@name)])
174 or (param[@mod='ptr']))" >
175 <xsl:call-template name="method">
176 <xsl:with-param name="wsmap" select="$wsmap" />
177 </xsl:call-template>
178 </xsl:if>
179 </xsl:for-each>
180 <xsl:for-each select="attribute">
181 <xsl:variable name="attrname"><xsl:value-of select="@name" /></xsl:variable>
182 <xsl:variable name="attrtype"><xsl:value-of select="@type" /></xsl:variable>
183 <xsl:variable name="attrreadonly"><xsl:value-of select="@readonly" /></xsl:variable>
184 <!-- skip this attribute if it has parameters of a type that has wsmap="suppress" -->
185 <xsl:choose>
186 <xsl:when test="( $attrtype=($G_setSuppressedInterfaces/@name) )">
187 <xsl:comment><xsl:value-of select="concat('skipping attribute ', $attrtype, ' for it is of a suppressed type')" /></xsl:comment>
188 </xsl:when>
189 <xsl:otherwise>
190 <xsl:choose>
191 <xsl:when test="@readonly='yes'">
192 <xsl:comment> readonly attribute <xsl:copy-of select="$ifname" />::<xsl:copy-of select="$attrname" /> </xsl:comment>
193 </xsl:when>
194 <xsl:otherwise>
195 <xsl:comment> read/write attribute <xsl:copy-of select="$ifname" />::<xsl:copy-of select="$attrname" /> </xsl:comment>
196 </xsl:otherwise>
197 </xsl:choose>
198 <!-- aa) get method: emit request and result -->
199 <xsl:call-template name="emitGetAttribute">
200 <xsl:with-param name="ifname" select="$ifname" />
201 <xsl:with-param name="attrname" select="$attrname" />
202 <xsl:with-param name="attrtype" select="$attrtype" />
203 </xsl:call-template>
204 <!-- bb) emit a set method if the attribute is read/write -->
205 <xsl:if test="not($attrreadonly='yes')">
206 <xsl:call-template name="emitSetAttribute">
207 <xsl:with-param name="ifname" select="$ifname" />
208 <xsl:with-param name="attrname" select="$attrname" />
209 <xsl:with-param name="attrtype" select="$attrtype" />
210 </xsl:call-template>
211 </xsl:if>
212 </xsl:otherwise>
213 </xsl:choose>
214 </xsl:for-each>
215 <xsl:text>}
216 </xsl:text>
217</xsl:template>
218
219<xsl:template name="collection">
220 <xsl:variable name="ifname"><xsl:value-of select="@name" /></xsl:variable>
221 <xsl:text>
222/**
223* Generated VBoxWebService Managed Object Collection
224*/</xsl:text>
225class <xsl:value-of select="$ifname"/>Collection extends VBox_ManagedObjectCollection {
226 protected $_interfaceName = "<xsl:value-of select="$ifname"/>";
227}
228</xsl:template>
229
230<xsl:template name="interfacestruct">
231 <xsl:variable name="ifname"><xsl:value-of select="@name" /></xsl:variable>
232 <xsl:text>
233/**
234* Generated VBoxWebService Struct
235*/</xsl:text>
236class <xsl:value-of select="$ifname"/> extends VBox_Struct {
237 <xsl:for-each select="attribute">
238 protected $<xsl:value-of select="@name"/>;
239 </xsl:for-each>
240 public function __construct($connection, $values) {
241 $this->connection = $connection;
242 <xsl:for-each select="attribute">
243 $this-><xsl:value-of select="@name"/> = $values-><xsl:value-of select="@name"/><xsl:text>;</xsl:text>
244 </xsl:for-each>
245 }
246
247 <xsl:for-each select="attribute">
248 public function <xsl:call-template name="makeGetterName"><xsl:with-param name="attrname" select="@name"/></xsl:call-template>() {
249 <xsl:text>return </xsl:text>
250 <xsl:call-template name="emitOutParam">
251 <xsl:with-param name="type" select="@type" />
252 <xsl:with-param name="value" select="concat('$this->',@name)" />
253 <xsl:with-param name="safearray" select="@safearray"/>
254 </xsl:call-template>;
255 }
256 </xsl:for-each>
257
258}
259</xsl:template>
260
261<xsl:template name="structcollection">
262 <xsl:variable name="ifname"><xsl:value-of select="@name" /></xsl:variable>
263 <xsl:text>
264/**
265* Generated VBoxWebService Struct Collection
266*/</xsl:text>
267class <xsl:value-of select="$ifname"/>Collection extends VBox_StructCollection {
268 protected $_interfaceName = "<xsl:value-of select="$ifname"/>";
269}
270</xsl:template>
271
272<xsl:template name="genreq">
273 <xsl:param name="wsmap" />
274 <xsl:text>$request = new stdClass()</xsl:text>;
275 <xsl:if test="$wsmap='managed'">
276 $request->_this = $this->handle;
277 </xsl:if>
278 <xsl:for-each select="param[@dir='in']">
279 $request-><xsl:value-of select="@name" /> = $arg_<xsl:value-of select="@name" /><xsl:text>;</xsl:text>
280 </xsl:for-each>
281 $response = $this->connection->__soapCall('<xsl:value-of select="../@name"/>_<xsl:value-of select="@name"/>', array((array)$request));
282 <!-- return needs to be the first one -->
283 return <xsl:if test="param[@dir='out']">
284 <xsl:text>array(</xsl:text>
285 </xsl:if>
286 <xsl:for-each select="param[@dir='return']">
287 <xsl:call-template name="emitOutParam">
288 <xsl:with-param name="type" select="@type" />
289 <xsl:with-param name="value" select="concat('$response->','returnval')" />
290 <xsl:with-param name="safearray" select="@safearray"/>
291 </xsl:call-template>
292 <xsl:if test="../param[@dir='out']">
293 <xsl:text>, </xsl:text>
294 </xsl:if>
295 </xsl:for-each>
296 <xsl:for-each select="param[@dir='out']">
297 <xsl:if test="not(position()=1)">
298 <xsl:text>, </xsl:text>
299 </xsl:if>
300 <xsl:call-template name="emitOutParam">
301 <xsl:with-param name="type" select="@type" />
302 <xsl:with-param name="value" select="concat('$response->',@name)" />
303 <xsl:with-param name="safearray" select="@safearray"/>
304 </xsl:call-template>
305 </xsl:for-each>
306 <xsl:if test="param[@dir='out']">
307 <xsl:text>)</xsl:text>
308 </xsl:if>
309 <xsl:text>;&#10;</xsl:text>
310</xsl:template>
311
312<xsl:template name="method" >
313 <xsl:param name="wsmap" />
314 public function <xsl:value-of select="@name"/><xsl:text>(</xsl:text>
315 <xsl:for-each select="param[@dir='in']">
316 <xsl:if test="not(position()=1)">
317 <xsl:text>, </xsl:text>
318 </xsl:if>
319 <xsl:value-of select="concat('$arg_',@name)"/>
320 </xsl:for-each><xsl:text>) { &#10; </xsl:text>
321 <xsl:call-template name="genreq"><xsl:with-param name="wsmap" select="$wsmap" /></xsl:call-template>
322 <xsl:text> }&#10;</xsl:text>
323</xsl:template>
324
325<xsl:template name="enum">
326 <xsl:text>
327/**
328* Generated VBoxWebService ENUM
329*/</xsl:text>
330class <xsl:value-of select="@name"/> extends VBox_Enum {
331 public $NameMap = array(<xsl:for-each select="const"><xsl:if test="not(@wsmap='suppress')"><xsl:value-of select="@value"/> => '<xsl:value-of select="@name"/>'<xsl:if test="not(position()=last())">, </xsl:if></xsl:if></xsl:for-each>);
332 public $ValueMap = array(<xsl:for-each select="const"><xsl:if test="not(@wsmap='suppress')">'<xsl:value-of select="@name"/>' => <xsl:value-of select="@value"/><xsl:if test="not(position()=last())">, </xsl:if></xsl:if></xsl:for-each>);
333}
334</xsl:template>
335
336<xsl:template name="enumcollection">
337 <xsl:variable name="ifname"><xsl:value-of select="@name" /></xsl:variable>
338 <xsl:text>
339/**
340* Generated VBoxWebService Enum Collection
341*/</xsl:text>
342class <xsl:value-of select="$ifname"/>Collection extends VBox_EnumCollection {
343 protected $_interfaceName = "<xsl:value-of select="$ifname"/>";
344}
345</xsl:template>
346
347<xsl:template name="comResultCodes">
348 const <xsl:value-of select="@name"/> = <xsl:value-of select="@value"/>;
349</xsl:template>
350
351<xsl:template match="/">
352<xsl:text>&lt;?php
353
354/*
355 * Copyright (C) 2008-2010 Oracle Corporation
356 *
357 * This file is part of a free software library; you can redistribute
358 * it and/or modify it under the terms of the GNU Lesser General
359 * Public License version 2.1 as published by the Free Software
360 * Foundation and shipped in the "COPYING.LIB" file with this library.
361 * The library is distributed in the hope that it will be useful,
362 * but WITHOUT ANY WARRANTY of any kind.
363 *
364 * Oracle LGPL Disclaimer: For the avoidance of doubt, except that if
365 * any license choice other than GPL or LGPL is available it will
366 * apply instead, Oracle elects to use only the Lesser General Public
367 * License version 2.1 (LGPLv2) at this time for any software where
368 * a choice of LGPL license versions is made available with the
369 * language indicating that LGPLv2 or any later version may be used,
370 * or where a choice of which version of the LGPL is applied is
371 * otherwise unspecified.
372 *
373 * This file is autogenerated from VirtualBox.xidl, DO NOT EDIT!
374 */
375
376class VBox_ManagedObject
377{
378 protected $connection;
379 protected $handle;
380
381 public function __construct($soap, $handle = null)
382 {
383 $this->connection = $soap;
384 $this->handle = $handle;
385 }
386
387 public function __toString()
388 {
389 return (string)$this->handle;
390 }
391
392 public function __set($attr, $value)
393 {
394 $methodName = "set" . $attr;
395 if (method_exists($this, $methodName))
396 $this->$methodName($value);
397 else
398 throw new Exception("Attribute does not exist");
399 }
400
401 public function __get($attr)
402 {
403 $methodName = "get" . $attr;
404 if (method_exists($this, $methodName))
405 return $this->$methodName();
406 else
407 throw new Exception("Attribute does not exist");
408 }
409
410 public function getHandle()
411 {
412 return $this->handle;
413 }
414
415 public function cast($class)
416 {
417 if (is_subclass_of($class, 'VBox_ManagedObject'))
418 {
419 return new $class($this->connection, $this->handle);
420 }
421 throw new Exception('Cannot cast VBox_ManagedObject to non-child class VBox_ManagedObject');
422 }
423
424 public function releaseRemote()
425 {
426 try
427 {
428 $request = new stdClass();
429 $request->_this = $this->handle;
430 $this->connection->__soapCall('IManagedObjectRef_release', array((array)$request));
431 } catch (Exception $ex) {}
432 }
433}
434
435abstract class VBox_Collection implements ArrayAccess, Iterator, Countable {
436 protected $_connection;
437 protected $_values;
438 protected $_objects;
439 protected $_interfaceName;
440
441 public function __construct($soap, array $values = array()) {
442 $this->_connection = $soap;
443 $this->_values = $values;
444 $this->_soapToObject();
445 }
446
447 protected function _soapToObject() {
448 $this->_objects = array();
449 foreach($this->_values as $value)
450 {
451 $this->_objects[] = new $this->_interfaceName($this->_connection, $value);
452 }
453 }
454
455 /** ArrayAccess Functions **/
456 public function offsetSet($offset, $value) {
457 if ($value instanceof $this->_interfaceName)
458 {
459 if ($offset)
460 {
461 $this->_objects[$offset] = $value;
462 }
463 else
464 {
465 $this->_objects[] = $value;
466 }
467 }
468 else
469 {
470 throw new Exception("Value must be a instance of " . $this->_interfaceName);
471 }
472 }
473
474 public function offsetExists($offset) {
475 return isset($this->_objects[$offset]);
476 }
477
478 public function offsetUnset($offset) {
479 unset($this->_objects[$offset]);
480 }
481
482 public function offsetGet($offset) {
483 return isset($this->_objects[$offset]) ? $this->_objects[$offset] : null;
484 }
485
486 /** Iterator Functions **/
487 public function rewind() {
488 reset($this->_objects);
489 }
490
491 public function current() {
492 return current($this->_objects);
493 }
494
495 public function key() {
496 return key($this->_objects);
497 }
498
499 public function next() {
500 return next($this->_objects);
501 }
502
503 public function valid() {
504 return ($this->current() !== false);
505 }
506
507 /** Countable Functions **/
508 public function count() {
509 return count($this->_objects);
510 }
511}
512
513class VBox_ManagedObjectCollection extends VBox_Collection {
514 protected $_interfaceName = 'VBox_ManagedObject';
515
516 // Result is undefined if this is called AFTER any call to VBox_Collection::offsetSet or VBox_Collection::offsetUnset
517 public function setInterfaceName($interface) {
518 if (!is_subclass_of($interface, 'VBox_ManagedObject'))
519 {
520 throw new Exception('Cannot set collection interface to non-child class of VBox_ManagedObject');
521 }
522 $this->_interfaceName = $interface;
523 $this->_soapToObject();
524 }
525}
526
527abstract class VBox_Struct {
528 protected $connection;
529
530 public function __get($attr)
531 {
532 $methodName = "get" . $attr;
533 if (method_exists($this, $methodName))
534 return $this->$methodName();
535 else
536 throw new Exception("Attribute does not exist");
537 }
538}
539
540abstract class VBox_StructCollection extends VBox_Collection {
541
542 public function __construct($soap, array $values = array())
543 {
544 if (!(array_values($values) === $values))
545 {
546 $values = array((object)$values); //Fix for when struct return value only contains one list item (e.g. one medium attachment)
547 }
548 parent::__construct($soap, $values);
549 }
550}
551
552abstract class VBox_Enum {
553 protected $_handle;
554
555 public function __construct($connection, $handle)
556 {
557 if (is_string($handle))
558 $this->_handle = $this->ValueMap[$handle];
559 else
560 $this->_handle = $handle;
561 }
562
563 public function __toString()
564 {
565 return (string)$this->NameMap[$this->_handle];
566 }
567}
568
569abstract class VBox_EnumCollection extends VBox_Collection {
570}
571
572</xsl:text>
573
574<xsl:text>
575/**
576* VirtualBox COM result codes
577*/
578class VirtualBox_COM_result_codes {
579</xsl:text>
580 <xsl:for-each select="/idl/library/result">
581 <xsl:call-template name="comResultCodes"/>
582 </xsl:for-each>
583<xsl:text>
584}
585</xsl:text>
586 <xsl:for-each select="//interface[@wsmap='managed' or @wsmap='global']">
587 <xsl:call-template name="interface"/>
588 <xsl:call-template name="collection"/>
589 </xsl:for-each>
590 <xsl:for-each select="//interface[@wsmap='struct']">
591 <xsl:call-template name="interfacestruct"/>
592 <xsl:call-template name="structcollection"/>
593 </xsl:for-each>
594 <xsl:for-each select="//enum">
595 <xsl:call-template name="enum"/>
596 <xsl:call-template name="enumcollection"/>
597 </xsl:for-each>
598
599</xsl:template>
600
601</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