VirtualBox

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

Last change on this file was 106065, checked in by vboxsync, 3 weeks ago

Manual copyright year updates.

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