summaryrefslogtreecommitdiffstats
path: root/src/VBox/Main/idl
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-11 08:17:27 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-11 08:17:27 +0000
commitf215e02bf85f68d3a6106c2a1f4f7f063f819064 (patch)
tree6bb5b92c046312c4e95ac2620b10ddf482d3fa8b /src/VBox/Main/idl
parentInitial commit. (diff)
downloadvirtualbox-f215e02bf85f68d3a6106c2a1f4f7f063f819064.tar.xz
virtualbox-f215e02bf85f68d3a6106c2a1f4f7f063f819064.zip
Adding upstream version 7.0.14-dfsg.upstream/7.0.14-dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/VBox/Main/idl')
-rw-r--r--src/VBox/Main/idl/Makefile.kup0
-rw-r--r--src/VBox/Main/idl/VirtualBox.dtd159
-rw-r--r--src/VBox/Main/idl/VirtualBox.xidl30777
-rw-r--r--src/VBox/Main/idl/apiwrap-server-filelist.xsl192
-rw-r--r--src/VBox/Main/idl/apiwrap-server.xsl2592
-rw-r--r--src/VBox/Main/idl/comimpl.xsl1182
-rw-r--r--src/VBox/Main/idl/docstrip.xsl51
-rw-r--r--src/VBox/Main/idl/doxygen.xsl774
-rw-r--r--src/VBox/Main/idl/midl.xsl924
-rw-r--r--src/VBox/Main/idl/stringify-enums.xsl251
-rw-r--r--src/VBox/Main/idl/typemap-shared.inc.xsl571
-rw-r--r--src/VBox/Main/idl/xpidl.xsl1124
-rw-r--r--src/VBox/Main/idl/xpidl_iid.xsl172
13 files changed, 38769 insertions, 0 deletions
diff --git a/src/VBox/Main/idl/Makefile.kup b/src/VBox/Main/idl/Makefile.kup
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/VBox/Main/idl/Makefile.kup
diff --git a/src/VBox/Main/idl/VirtualBox.dtd b/src/VBox/Main/idl/VirtualBox.dtd
new file mode 100644
index 00000000..a2007e6e
--- /dev/null
+++ b/src/VBox/Main/idl/VirtualBox.dtd
@@ -0,0 +1,159 @@
+<!--
+ Unofficial DTD for the VirtualBox.xidl file. This is not currently used:
+ neither by the VirtualBox build process nor at runtime, so it's not shipped
+ with the product either, and thus not guaranteed to be up to date.
+ It is still the only sort-of-documentation available about what is valid
+ XIDL syntax.
+-->
+<!--
+ Copyright (C) 2008-2023 Oracle and/or its affiliates.
+
+ This file is part of VirtualBox base platform packages, as
+ available from https://www.virtualbox.org.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, in version 3 of the
+ License.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <https://www.gnu.org/licenses>.
+
+ SPDX-License-Identifier: GPL-3.0-only
+-->
+ <!ELEMENT idl (desc|if|library)*> <!-- done -->
+ <!ELEMENT if ANY> <!-- done -->
+ <!ATTLIST if target (midl|xpidl|wsdl) #REQUIRED>
+ <!ELEMENT cpp ANY> <!-- done -->
+ <!ATTLIST cpp line CDATA #IMPLIED>
+ <!ELEMENT library (application|if)*> <!-- done -->
+ <!ATTLIST library name CDATA #REQUIRED>
+ <!ATTLIST library uuid CDATA #REQUIRED>
+ <!ATTLIST library version CDATA #REQUIRED>
+ <!ELEMENT application (descGroup|if|result|enum|interface|module)*> <!-- done -->
+ <!ATTLIST application name CDATA #REQUIRED>
+ <!ATTLIST application uuid CDATA #REQUIRED>
+ <!ATTLIST application supportsErrorInfo CDATA #REQUIRED>
+ <!ELEMENT result (#PCDATA|desc|link)*> <!-- done -->
+ <!ATTLIST result name CDATA #REQUIRED>
+ <!ATTLIST result value CDATA #IMPLIED>
+ <!ELEMENT module (class)*> <!-- done -->
+ <!ATTLIST module name CDATA #REQUIRED>
+ <!ATTLIST module context CDATA #REQUIRED>
+ <!ATTLIST module threadingModel CDATA #IMPLIED>
+ <!ELEMENT enum (desc?, const+)> <!-- done -->
+ <!ATTLIST enum name CDATA #REQUIRED>
+ <!ATTLIST enum uuid CDATA #REQUIRED>
+ <!ELEMENT const (desc?)> <!-- done -->
+ <!ATTLIST const name CDATA #REQUIRED>
+ <!ATTLIST const value CDATA #REQUIRED>
+ <!ATTLIST const wsmap (managed|suppress) "managed">
+ <!ELEMENT interface (desc?, (attribute|method|class|if)*)> <!-- done -->
+ <!ATTLIST interface name CDATA #REQUIRED>
+ <!ATTLIST interface extends CDATA #IMPLIED>
+ <!ATTLIST interface uuid CDATA #IMPLIED>
+ <!ATTLIST interface supportsErrorInfo (yes|no) #IMPLIED>
+ <!ATTLIST interface default (yes|no) "no">
+ <!ATTLIST interface internal (yes|no) "no">
+ <!ATTLIST interface wsmap (fail|global|struct|managed|suppress) "fail">
+ <!-- wsmap specifies how this interface is mapped to the
+ web services API (WSDL). One of the following must be specified:
+ fail: the default value, for which vboxweb.xsl will raise an error and die.
+ global: object is a singleton and resides in global variable in the web service.
+ managed: objects of this type are referenced by managed object referenced
+ struct: object is a simple struct and can be copied as such
+ suppress: Skip this interface entirely, and all methods that use it -->
+ <!ATTLIST interface wscpp (generate|hardcoded) "generate">
+ <!-- wscpp specifies whether C++ code should be generated in methodmaps.cpp
+ as a mapper to COM APIs. By default, this is "generate"; however, if set
+ to "hardcoded", then no automatic C++ code should be generated. This is done
+ for webservice APIs that have no counterpart in COM and are hard-coded in
+ the webservice server, such as IManagedObjectReference and ISessionManager. -->
+ <!ATTLIST interface rest (managed|suppress) "suppress">
+ <!-- rest specifies how this interface is mapped to the
+ web services API (RESTful). One of the following must be specified:
+ managed: objects of this type are represented
+ suppress: the default value, skip this interface entirely -->
+ <!ATTLIST interface autogen CDATA #IMPLIED>
+ <!-- autogen names the style of code auto-generation for this
+ interface (currently only VBoxEvent). -->
+ <!ATTLIST interface autogenflags CDATA #IMPLIED>
+ <!-- autogenflags contains autogen tweaks.
+ For autoget=VBoxEvent: 'BSTR' - generate IN_BSTR variants of the functions. -->
+ <!ATTLIST interface id CDATA #IMPLIED>
+ <!-- id is only relevant for event interfaces, and specifies
+ which const name will be generated. -->
+ <!ATTLIST interface waitable (yes|no) "no">
+ <!-- waitable is only relevant for event interfaces, and
+ specifies that this event can be waited for. -->
+ <!ATTLIST interface wrap-hint-server-addinterfaces CDATA #IMPLIED>
+ <!ATTLIST interface wrap-hint-server CDATA #IMPLIED>
+ <!ATTLIST interface wrap-gen-hook (yes|no) "no">
+ <!ATTLIST interface notdual (yes|no) "no">
+ <!-- DTrace has a probe name length limit, so dtracename helps dealing with excessivly long names. -->
+ <!ATTLIST interface dtracename CDATA #IMPLIED>
+ <!ATTLIST interface reservedAttributes CDATA #IMPLIED>
+ <!ATTLIST interface reservedMethods CDATA #IMPLIED>
+ <!ELEMENT class (interface)> <!-- done -->
+ <!ATTLIST class name CDATA #REQUIRED>
+ <!ATTLIST class uuid CDATA #REQUIRED>
+ <!ATTLIST class namespace CDATA #REQUIRED>
+ <!ELEMENT attribute (desc?)> <!-- done -->
+ <!ATTLIST attribute name CDATA #REQUIRED>
+ <!ATTLIST attribute type CDATA #REQUIRED>
+ <!ATTLIST attribute default CDATA #IMPLIED>
+ <!ATTLIST attribute readonly (yes|no) "no">
+ <!ATTLIST attribute mod (ptr|string) #IMPLIED>
+ <!ATTLIST attribute internal (yes|no) "no">
+ <!ATTLIST attribute safearray (yes|no) "no">
+ <!ATTLIST attribute wsmap (managed|suppress) "managed">
+ <!ATTLIST attribute rest (uuid|suppress|default) "default">
+ <!ATTLIST attribute wrap-hint-server CDATA #IMPLIED>
+ <!-- DTrace has a probe name length limit, so dtracename helps dealing with excessivly long names. -->
+ <!ATTLIST attribute dtracename CDATA #IMPLIED>
+ <!ELEMENT method (rest?,desc?,param*,result*)> <!-- done -->
+ <!ATTLIST method name CDATA #REQUIRED>
+ <!ATTLIST method const CDATA "no">
+ <!ATTLIST method internal (yes|no) "no">
+ <!ATTLIST method wsmap (managed|suppress) "managed">
+ <!ATTLIST method wrap-hint-server CDATA #IMPLIED>
+ <!-- DTrace has a probe name length limit, so dtracename helps dealing with excessivly long names. -->
+ <!ATTLIST method dtracename CDATA #IMPLIED>
+ <!ELEMENT rest ANY> <!-- done -->
+ <!ATTLIST rest name CDATA #IMPLIED>
+ <!ATTLIST rest request (get|put|post|delete|patch) "get">
+ <!ATTLIST rest path CDATA #REQUIRED>
+ <!ELEMENT param (desc?)> <!-- done -->
+ <!ATTLIST param name CDATA #REQUIRED>
+ <!ATTLIST param type CDATA #REQUIRED>
+ <!ATTLIST param dir (in|out|return) #REQUIRED>
+ <!ATTLIST param mod (ptr|string) #IMPLIED>
+ <!ATTLIST param safearray (yes|no) "no">
+ <!ELEMENT descGroup (desc)*> <!-- done (ignoring, butt-ugly hack, improper nesting enforced all over the .xsl files!) -->
+ <!ATTLIST descGroup id CDATA #IMPLIED>
+ <!ATTLIST descGroup title CDATA #IMPLIED>
+ <!ELEMENT desc (#PCDATA|link|note|see|b|tt|i|pre|para|ul|ol|h3|table|result)*> <!-- done (ignoring) -->
+ <!-- the following only appear within descriptions -->
+ <!ELEMENT link (#PCDATA)>
+ <!ATTLIST link to CDATA #REQUIRED>
+ <!ELEMENT h3 ANY>
+ <!ELEMENT para ANY>
+ <!ELEMENT b ANY>
+ <!ELEMENT i ANY>
+ <!ELEMENT ul (#PCDATA|li)*>
+ <!ELEMENT ol (#PCDATA|li)*>
+ <!ELEMENT li ANY>
+ <!ELEMENT pre ANY>
+ <!ELEMENT tt ANY>
+ <!ELEMENT see (#PCDATA|link)*>
+ <!ELEMENT note ANY>
+ <!ATTLIST note internal (yes|no) "no">
+ <!ELEMENT table (tr)+>
+ <!ELEMENT tr (td|th)+>
+ <!ELEMENT th ANY>
+ <!ELEMENT td ANY>
diff --git a/src/VBox/Main/idl/VirtualBox.xidl b/src/VBox/Main/idl/VirtualBox.xidl
new file mode 100644
index 00000000..8654afec
--- /dev/null
+++ b/src/VBox/Main/idl/VirtualBox.xidl
@@ -0,0 +1,30777 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ Copyright (C) 2006-2023 Oracle and/or its affiliates.
+
+ This file is part of VirtualBox base platform packages, as
+ available from https://www.virtualbox.org.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, in version 3 of the
+ License.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <https://www.gnu.org/licenses>.
+
+ SPDX-License-Identifier: GPL-3.0-only
+-->
+
+<!--
+ This is the master declaration for VirtualBox's Main API,
+ represented by COM/XPCOM and web service interfaces.
+
+ From this document, the build system generates several files
+ via XSLT that are then used during the build process.
+
+ Below is the list of XSL templates that operate on this file and
+ output files they generate. These XSL templates must be updated
+ whenever the schema of this file changes:
+
+ 1. src/VBox/Main/idl/midl.xsl =>
+ out/<platform>/bin/sdk/idl/VirtualBox.idl
+ (MS COM interface definition file for Main API)
+
+ 2. src/VBox/Main/idl/xpidl.xsl =>
+ out/<platform>/bin/sdk/idl/VirtualBox_XPCOM.idl
+ (XPCOM interface definition file for Main API)
+
+ 3. src/VBox/Main/idl/doxygen.xsl =>
+ out/<platform>/obj/src/VBox/Main/VirtualBox.idl
+ (pseudo-IDL for Doxygen to generate the official Main API
+ documentation)
+
+ 4. src/VBox/Main/webservice/*.xsl =>
+ a bunch of WSDL and C++ files
+ (VirtualBox web service sources and SOAP mappers;
+ see src/VBox/Main/webservice/Makefile.kmk for details)
+
+ 5. src/VBox/Frontends/VirtualBox/include/COMWrappers.xsl =>
+ out/<platform>/obj/src/VBox/Frontends/VirtualBox/VirtualBox/include/COMWrappers.h
+ (smart Qt-based C++ wrapper classes for COM interfaces
+ of the Main API)
+
+ 6. src/VBox/Installer/win32/VirtualBox_TypeLib.xsl =>
+ out/<platform>/obj/src/VBox/Installer/win32/VirtualBox_TypeLib.wxi
+ (Main API TypeLib block for the WiX installer)
+
+ 7. src/VBox/Runtime/common/err/errmsgvboxcom.xsl =>
+ out/<platform>/obj/Runtime/errmsgvboxcomdata.h
+ (<result> extraction for the %Rhrc format specifier)
+
+
+ Note! SlickEdit users can use the 'xml_validate' command on the SlickEdit
+ command line to verify the document against the DTD. Uncomment the
+ DOCTYPE below first (java doesn't seem to like it).
+-->
+
+<!DOCTYPE idl SYSTEM "VirtualBox.dtd">
+
+<idl>
+
+<desc>
+ Welcome to the <b>VirtualBox Main API documentation</b>. This documentation
+ describes the so-called <i>VirtualBox Main API</i> which comprises all public
+ COM interfaces and components provided by the VirtualBox server and by the
+ VirtualBox client library.
+
+ VirtualBox employs a client-server design, meaning that whenever any part of
+ VirtualBox is running -- be it the Qt GUI, the VBoxManage command-line
+ interface or any virtual machine --, a dedicated server process named
+ VBoxSVC runs in the background. This allows multiple processes working with
+ VirtualBox to cooperate without conflicts. These processes communicate to each
+ other using inter-process communication facilities provided by the COM
+ implementation of the host computer.
+
+ On Windows platforms, the VirtualBox Main API uses Microsoft COM, a native COM
+ implementation. On all other platforms, Mozilla XPCOM, an open-source COM
+ implementation, is used.
+
+ All the parts that a typical VirtualBox user interacts with (the Qt GUI
+ and the VBoxManage command-line interface) are technically
+ front-ends to the Main API and only use the interfaces that are documented
+ in this Main API documentation. This ensures that, with any given release
+ version of VirtualBox, all capabilities of the product that could be useful
+ to an external client program are always exposed by way of this API.
+
+ The VirtualBox Main API (also called the <i>VirtualBox COM library</i>)
+ contains two public component classes:
+ <tt>%VirtualBox.VirtualBox</tt> and <tt>%VirtualBox.Session</tt>, which
+ implement IVirtualBox and ISession interfaces respectively. These two classes
+ are of supreme importance and will be needed in order for any front-end
+ program to do anything useful. It is recommended to read the documentation of
+ the mentioned interfaces first.
+
+ The <tt>%VirtualBox.VirtualBox</tt> class is a singleton. This means that
+ there can be only one object of this class on the local machine at any given
+ time. This object is a parent of many other objects in the VirtualBox COM
+ library and lives in the VBoxSVC process. In fact, when you create an instance
+ of the <tt>VirtualBox.VirtualBox</tt>, the COM subsystem checks if the VBoxSVC
+ process is already running, starts it if not, and returns you a reference to
+ the <tt>VirtualBox</tt> object created in this process. When the last reference
+ to this object is released, the VBoxSVC process ends (with a 5 second delay to
+ protect from too frequent restarts).
+
+ The <tt>%VirtualBox.Session</tt> class is a regular component. You can create
+ as many <tt>Session</tt> objects as you need but all of them will live in a
+ process which issues the object instantiation call. <tt>Session</tt> objects
+ represent virtual machine sessions which are used to configure virtual
+ machines and control their execution.
+
+ The naming of methods and attributes is very clearly defined: they all start
+ with a lowercase letter (except if they start with an acronym), and are using
+ CamelCase style otherwise. This naming only applies to the IDL description,
+ and is modified by the various language bindings (some convert the first
+ character to upper case, some not). See the SDK reference for more details
+ about how to call a method or attribute from a specific programming language.
+</desc>
+
+<if target="midl">
+ <cpp line="enum {"/>
+ <cpp line=" kTypeLibraryMajorVersion = 1,"/>
+ <cpp line=" kTypeLibraryMinorVersion = 3"/>
+ <cpp line="};"/>
+</if>
+
+<if target="xpidl">
+ <!-- NS_IMPL_THREADSAFE_ISUPPORTSxx_CI macros are placed here, for convenience -->
+ <cpp>
+/* currently, nsISupportsImpl.h lacks the below-like macros */
+
+#define NS_IMPL_THREADSAFE_QUERY_INTERFACE1_CI NS_IMPL_QUERY_INTERFACE1_CI
+#define NS_IMPL_THREADSAFE_QUERY_INTERFACE2_CI NS_IMPL_QUERY_INTERFACE2_CI
+#define NS_IMPL_THREADSAFE_QUERY_INTERFACE3_CI NS_IMPL_QUERY_INTERFACE3_CI
+#define NS_IMPL_THREADSAFE_QUERY_INTERFACE4_CI NS_IMPL_QUERY_INTERFACE4_CI
+#define NS_IMPL_THREADSAFE_QUERY_INTERFACE5_CI NS_IMPL_QUERY_INTERFACE5_CI
+#define NS_IMPL_THREADSAFE_QUERY_INTERFACE6_CI NS_IMPL_QUERY_INTERFACE6_CI
+#define NS_IMPL_THREADSAFE_QUERY_INTERFACE7_CI NS_IMPL_QUERY_INTERFACE7_CI
+#define NS_IMPL_THREADSAFE_QUERY_INTERFACE8_CI NS_IMPL_QUERY_INTERFACE8_CI
+
+
+#ifndef NS_IMPL_THREADSAFE_ISUPPORTS1_CI
+# define NS_IMPL_THREADSAFE_ISUPPORTS1_CI(_class, _interface) \
+ NS_IMPL_THREADSAFE_ADDREF(_class) \
+ NS_IMPL_THREADSAFE_RELEASE(_class) \
+ NS_IMPL_THREADSAFE_QUERY_INTERFACE1_CI(_class, _interface) \
+ NS_IMPL_CI_INTERFACE_GETTER1(_class, _interface)
+#endif
+
+#ifndef NS_IMPL_THREADSAFE_ISUPPORTS2_CI
+# define NS_IMPL_THREADSAFE_ISUPPORTS2_CI(_class, _i1, _i2) \
+ NS_IMPL_THREADSAFE_ADDREF(_class) \
+ NS_IMPL_THREADSAFE_RELEASE(_class) \
+ NS_IMPL_THREADSAFE_QUERY_INTERFACE2_CI(_class, _i1, _i2) \
+ NS_IMPL_CI_INTERFACE_GETTER2(_class, _i1, _i2)
+#endif
+
+#ifndef NS_IMPL_THREADSAFE_ISUPPORTS3_CI
+# define NS_IMPL_THREADSAFE_ISUPPORTS3_CI(_class, _i1, _i2, _i3) \
+ NS_IMPL_THREADSAFE_ADDREF(_class) \
+ NS_IMPL_THREADSAFE_RELEASE(_class) \
+ NS_IMPL_THREADSAFE_QUERY_INTERFACE3_CI(_class, _i1, _i2, _i3) \
+ NS_IMPL_CI_INTERFACE_GETTER3(_class, _i1, _i2, _i3)
+#endif
+
+#ifndef NS_IMPL_THREADSAFE_ISUPPORTS4_CI
+# define NS_IMPL_THREADSAFE_ISUPPORTS4_CI(_class, _i1, _i2, _i3, _i4) \
+ NS_IMPL_THREADSAFE_ADDREF(_class) \
+ NS_IMPL_THREADSAFE_RELEASE(_class) \
+ NS_IMPL_THREADSAFE_QUERY_INTERFACE4_CI(_class, _i1, _i2, _i3, _i4) \
+ NS_IMPL_CI_INTERFACE_GETTER4(_class, _i1, _i2, _i3, _i4)
+#endif
+
+#ifndef NS_IMPL_THREADSAFE_ISUPPORTS5_CI
+# define NS_IMPL_THREADSAFE_ISUPPORTS5_CI(_class, _i1, _i2, _i3, _i4, _i5) \
+ NS_IMPL_THREADSAFE_ADDREF(_class) \
+ NS_IMPL_THREADSAFE_RELEASE(_class) \
+ NS_IMPL_THREADSAFE_QUERY_INTERFACE5_CI(_class, _i1, _i2, _i3, _i4, _i5) \
+ NS_IMPL_CI_INTERFACE_GETTER5(_class, _i1, _i2, _i3, _i4, _i5)
+#endif
+
+#ifndef NS_IMPL_THREADSAFE_ISUPPORTS6_CI
+# define NS_IMPL_THREADSAFE_ISUPPORTS6_CI(_class, _i1, _i2, _i3, _i4, _i5, _i6) \
+ NS_IMPL_THREADSAFE_ADDREF(_class) \
+ NS_IMPL_THREADSAFE_RELEASE(_class) \
+ NS_IMPL_THREADSAFE_QUERY_INTERFACE6_CI(_class, _i1, _i2, _i3, _i4, _i5, _i6) \
+ NS_IMPL_CI_INTERFACE_GETTER6(_class, _i1, _i2, _i3, _i4, _i5, _i6)
+#endif
+
+#ifndef NS_IMPL_THREADSAFE_ISUPPORTS7_CI
+# define NS_IMPL_THREADSAFE_ISUPPORTS7_CI(_class, _i1, _i2, _i3, _i4, _i5, _i6, _i7) \
+ NS_IMPL_THREADSAFE_ADDREF(_class) \
+ NS_IMPL_THREADSAFE_RELEASE(_class) \
+ NS_IMPL_THREADSAFE_QUERY_INTERFACE7_CI(_class, _i1, _i2, _i3, _i4, _i5, _i6, _i7) \
+ NS_IMPL_CI_INTERFACE_GETTER7(_class, _i1, _i2, _i3, _i4, _i5, _i6, _i7)
+#endif
+
+#ifndef NS_IMPL_THREADSAFE_ISUPPORTS8_CI
+# define NS_IMPL_THREADSAFE_ISUPPORTS8_CI(_class, _i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8) \
+ NS_IMPL_THREADSAFE_ADDREF(_class) \
+ NS_IMPL_THREADSAFE_RELEASE(_class) \
+ NS_IMPL_THREADSAFE_QUERY_INTERFACE8_CI(_class, _i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8) \
+ NS_IMPL_CI_INTERFACE_GETTER8(_class, _i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8)
+#endif
+
+#ifndef NS_IMPL_QUERY_INTERFACE1_AMBIGUOUS_CI
+# define NS_IMPL_QUERY_INTERFACE1_AMBIGUOUS_CI(_class, _i1, _ic1) \
+ NS_INTERFACE_MAP_BEGIN(_class) \
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(_i1, _ic1) \
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, _ic1) \
+ NS_IMPL_QUERY_CLASSINFO(_class) \
+ NS_INTERFACE_MAP_END
+#endif
+
+#ifndef NS_IMPL_QUERY_INTERFACE2_AMBIGUOUS_CI
+# define NS_IMPL_QUERY_INTERFACE2_AMBIGUOUS_CI(_class, _i1, _ic1, \
+ _i2, _ic2) \
+ NS_INTERFACE_MAP_BEGIN(_class) \
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(_i1, _ic1) \
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(_i2, _ic2) \
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, _ic1) \
+ NS_IMPL_QUERY_CLASSINFO(_class) \
+ NS_INTERFACE_MAP_END
+#endif
+
+#ifndef NS_IMPL_QUERY_INTERFACE3_AMBIGUOUS_CI
+# define NS_IMPL_QUERY_INTERFACE3_AMBIGUOUS_CI(_class, _i1, _ic1, \
+ _i2, _ic2, _i3, _ic3) \
+ NS_INTERFACE_MAP_BEGIN(_class) \
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(_i1, _ic1) \
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(_i2, _ic2) \
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(_i3, _ic3) \
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, _ic1) \
+ NS_IMPL_QUERY_CLASSINFO(_class) \
+ NS_INTERFACE_MAP_END
+#endif
+
+#define NS_IMPL_THREADSAFE_QUERY_INTERFACE1_AMBIGUOUS_CI NS_IMPL_QUERY_INTERFACE1_AMBIGUOUS_CI
+#define NS_IMPL_THREADSAFE_QUERY_INTERFACE2_AMBIGUOUS_CI NS_IMPL_QUERY_INTERFACE2_AMBIGUOUS_CI
+#define NS_IMPL_THREADSAFE_QUERY_INTERFACE3_AMBIGUOUS_CI NS_IMPL_QUERY_INTERFACE3_AMBIGUOUS_CI
+
+#ifndef NS_IMPL_THREADSAFE_ISUPPORTS1_AMBIGUOUS_CI
+# define NS_IMPL_THREADSAFE_ISUPPORTS1_AMBIGUOUS_CI(_class, _i1, _ic1) \
+ NS_IMPL_THREADSAFE_ADDREF(_class) \
+ NS_IMPL_THREADSAFE_RELEASE(_class) \
+ NS_IMPL_THREADSAFE_QUERY_INTERFACE1_AMBIGUOUS_CI(_class, _i1, _ic1) \
+ NS_IMPL_CI_INTERFACE_GETTER1(_class, _i1)
+#endif
+
+#ifndef NS_IMPL_THREADSAFE_ISUPPORTS2_AMBIGUOUS_CI
+# define NS_IMPL_THREADSAFE_ISUPPORTS2_AMBIGUOUS_CI(_class, _i1, _ic1, \
+ _i2, _ic2) \
+ NS_IMPL_THREADSAFE_ADDREF(_class) \
+ NS_IMPL_THREADSAFE_RELEASE(_class) \
+ NS_IMPL_THREADSAFE_QUERY_INTERFACE2_AMBIGUOUS_CI(_class, _i1, _ic1, \
+ _i2, _ic2) \
+ NS_IMPL_CI_INTERFACE_GETTER2(_class, _i1, _i2)
+#endif
+
+#ifndef NS_IMPL_THREADSAFE_ISUPPORTS3_AMBIGUOUS_CI
+# define NS_IMPL_THREADSAFE_ISUPPORTS3_AMBIGUOUS_CI(_class, _i1, _ic1, \
+ _i2, _ic2, _i3, _ic3) \
+ NS_IMPL_THREADSAFE_ADDREF(_class) \
+ NS_IMPL_THREADSAFE_RELEASE(_class) \
+ NS_IMPL_THREADSAFE_QUERY_INTERFACE3_AMBIGUOUS_CI(_class, _i1, _ic1, \
+ _i2, _ic2, _i3, _ic3) \
+ NS_IMPL_CI_INTERFACE_GETTER3(_class, _i1, _i2, _i3)
+#endif
+
+ </cpp>
+</if>
+
+<!--
+ Note!! Don't forget to update the python bindings (++) when changing the
+ UUID or version!!
+-->
+<library
+ name="VirtualBox"
+ uuid="d7569351-1750-46f0-936e-bd127d5bc264"
+ version="1.3"
+>
+
+<application
+ name="VirtualBox"
+ uuid="819B4D85-9CEE-493C-B6FC-64FFE759B3C9"
+ supportsErrorInfo="yes"
+>
+
+
+ <!--
+ // COM result codes for VirtualBox
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <descGroup id="VirtualBox_COM_result_codes" title="VirtualBox COM result codes">
+ <desc>
+ This section describes all VirtualBox-specific COM result codes that may
+ be returned by methods of VirtualBox COM interfaces in addition to
+ standard COM result codes.
+
+ Note that along with the result code, every VirtualBox method returns
+ extended error information through the IVirtualBoxErrorInfo interface on
+ failure. This interface is a preferred way to present the error to the end
+ user because it contains a human readable description of the error. Raw
+ result codes, both standard and described in this section, are intended to
+ be used by programs to analyze the reason of a failure and select an
+ appropriate course of action without involving the end user (for example,
+ retry the operation later or make a different call).
+
+ The standard COM result codes that may originate from our methods include:
+
+ <dl>
+ <dt><tt>E_INVALIDARG</tt></dt>
+ <dd>
+ Returned when the value of the method's argument is not within the range
+ of valid values. This should not be confused with situations when the
+ value is within the range but simply doesn't suit the current object
+ state and there is a possibility that it will be accepted later (in such
+ cases VirtualBox-specific codes are returned, for example,
+ <link to="VBOX_E_OBJECT_NOT_FOUND"/>).
+ </dd>
+ <dt><tt>E_POINTER</tt></dt>
+ <dd>
+ Returned if a memory pointer for the output argument is invalid (for
+ example, @c null). When pointers representing input arguments (such
+ as strings) are invalid, E_INVALIDARG is returned.
+ </dd>
+ <dt><tt>E_ACCESSDENIED</tt></dt>
+ <dd>
+ Returned when the called object is not ready. Since the lifetime of a
+ public COM object cannot be fully controlled by the implementation,
+ VirtualBox maintains the readiness state for all objects it creates and
+ returns this code in response to any method call on the object that was
+ deactivated by VirtualBox and is not functioning any more.
+ </dd>
+ <dt><tt>E_OUTOFMEMORY</tt></dt>
+ <dd>
+ Returned when a memory allocation operation fails.
+ </dd>
+ </dl>
+ </desc>
+ </descGroup>
+
+ <!--
+ Note that src/VBox/Runtime/common/err/errmsgvboxcom.xsl will ignore
+ everything in <result>/<desc> after (and including) the first dot, so express
+ the matter of the error code in the first sentence and keep it short.
+ -->
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND" value="0x80BB0001">
+ <desc>
+ Object corresponding to the supplied arguments does not exist.
+ </desc>
+ </result>
+
+ <result name="VBOX_E_INVALID_VM_STATE" value="0x80BB0002">
+ <desc>
+ Current virtual machine state prevents the operation.
+ </desc>
+ </result>
+
+ <result name="VBOX_E_VM_ERROR" value="0x80BB0003">
+ <desc>
+ Virtual machine error occurred attempting the operation.
+ </desc>
+ </result>
+
+ <result name="VBOX_E_FILE_ERROR" value="0x80BB0004">
+ <desc>
+ File not accessible or erroneous file contents.
+ </desc>
+ </result>
+
+ <result name="VBOX_E_IPRT_ERROR" value="0x80BB0005">
+ <desc>
+ Runtime subsystem error.
+ </desc>
+ </result>
+
+ <result name="VBOX_E_PDM_ERROR" value="0x80BB0006">
+ <desc>
+ Pluggable Device Manager error.
+ </desc>
+ </result>
+
+ <result name="VBOX_E_INVALID_OBJECT_STATE" value="0x80BB0007">
+ <desc>
+ Current object state prohibits operation.
+ </desc>
+ </result>
+
+ <result name="VBOX_E_HOST_ERROR" value="0x80BB0008">
+ <desc>
+ Host operating system related error.
+ </desc>
+ </result>
+
+ <result name="VBOX_E_NOT_SUPPORTED" value="0x80BB0009">
+ <desc>
+ Requested operation is not supported.
+ </desc>
+ </result>
+
+ <result name="VBOX_E_XML_ERROR" value="0x80BB000A">
+ <desc>
+ Invalid XML found.
+ </desc>
+ </result>
+
+ <result name="VBOX_E_INVALID_SESSION_STATE" value="0x80BB000B">
+ <desc>
+ Current session state prohibits operation.
+ </desc>
+ </result>
+
+ <result name="VBOX_E_OBJECT_IN_USE" value="0x80BB000C">
+ <desc>
+ Object being in use prohibits operation.
+ </desc>
+ </result>
+
+ <result name="VBOX_E_PASSWORD_INCORRECT" value="0x80BB000D">
+ <desc>
+ A provided password was incorrect.
+ </desc>
+ </result>
+
+ <result name="VBOX_E_MAXIMUM_REACHED" value="0x80BB000E">
+ <desc>
+ A maximum has been reached.
+ </desc>
+ </result>
+
+ <result name="VBOX_E_GSTCTL_GUEST_ERROR" value="0x80BB000F">
+ <desc>
+ Guest Control reported an error from the guest side.
+ </desc>
+ </result>
+
+ <result name="VBOX_E_TIMEOUT" value="0x80BB0010">
+ <desc>
+ The operation ran into an explicitly requested timeout.
+ </desc>
+ </result>
+
+ <result name="VBOX_E_DND_ERROR" value="0x80BB0011">
+ <desc>
+ A drag and drop error has occurred.
+ </desc>
+ </result>
+
+ <!--
+ Note that src/VBox/Runtime/common/err/errmsgvboxcom.xsl will ignore
+ everything in <result>/<desc> after (and including) the first dot, so express
+ the matter of the error code in the first sentence and keep it short.
+ -->
+
+ <descGroup/>
+
+ <!--
+ // all common enums
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="SettingsVersion"
+ uuid="b4cc23c2-96f2-419d-830b-bd13c1135dfb"
+ >
+ <desc>
+ Settings version of VirtualBox settings files. This is written to
+ the "version" attribute of the root "VirtualBox" element in the settings
+ file XML and indicates which VirtualBox version wrote the file.
+ </desc>
+
+ <const name="Null" value="0">
+ <desc>Null value, indicates invalid version.</desc>
+ </const>
+ <const name="v1_0" value="1">
+ <desc>Legacy settings version, not currently supported.</desc>
+ </const>
+ <const name="v1_1" value="2">
+ <desc>Legacy settings version, not currently supported.</desc>
+ </const>
+ <const name="v1_2" value="3">
+ <desc>Legacy settings version, not currently supported.</desc>
+ </const>
+ <const name="v1_3pre" value="4">
+ <desc>Legacy settings version, not currently supported.</desc>
+ </const>
+ <const name="v1_3" value="5">
+ <desc>Settings version "1.3", written by VirtualBox 2.0.12.</desc>
+ <!--
+ Machine XML: Capitalization of Uart, Lpt elements and many attributes changed.
+ -->
+ </const>
+ <const name="v1_4" value="6">
+ <desc>Intermediate settings version, understood by VirtualBox 2.1.x.</desc>
+ <!--
+ VirtualBox.xml: big DiskRegistry -> MediaRegistry revamp, various HardDisk types merged
+ (was VirtualDiskImage, VMDKImage, VHDImage, ISCSIHardDisk, CustomHardDisk, DiffHardDisk)
+ -->
+ </const>
+ <const name="v1_5" value="7">
+ <desc>Intermediate settings version, understood by VirtualBox 2.1.x.</desc>
+ <!--
+ 2008-09-04: 2.0.0 released
+ 2008-11-20: settings version 1.5 introduced
+ 2008-12-17: 2.1.0 released
+ Machine changes:
+ guest OS identifiers changed;
+ Machine/Hardware/Display/MonitorCount renamed to monitorCount;
+ Machine/Hardware/Display/Accelerate3D renamed to accelerate3D;
+ Machine/Hardware/CPU/CPUCount/@count changed to CPU/@count
+ -->
+ </const>
+ <const name="v1_6" value="8">
+ <desc>Settings version "1.6", written by VirtualBox 2.1.4 (at least).</desc>
+ <!--
+ 2008-12-17: 2.1.0 released
+ 2008-12-19: settings version 1.6 introduced (is in 2.1 branch)
+ 2009-04-08: 2.2.0 released
+ Machine changes: remove all Machine/Hardware/Network/Adapter/HostInterface[@TAPSetup or @TAPTerminate]/ attributes (done)
+ -->
+ </const>
+ <const name="v1_7" value="9">
+ <desc>Settings version "1.7", written by VirtualBox 2.2.x and 3.0.x.</desc>
+ <!--
+ 2008-12-17: 2.1.0 released
+ 2009-03-11: settings version 1.7 introduced (is in 2.2 branch)
+ 2009-04-08: 2.2.0 released
+ VirtualBox.xml additions: NetserviceRegistry with DHCPServers (done)
+ Machine changes: HardDiskAttachments is now StorageControllers (done)
+ -->
+ </const>
+ <const name="v1_8" value="10">
+ <desc>Intermediate settings version "1.8", understood by VirtualBox 3.1.x.</desc>
+ <!--
+ Machine additions: Display/@accelerate2DVideo (done)
+ -->
+ </const>
+ <const name="v1_9" value="11">
+ <desc>Settings version "1.9", written by VirtualBox 3.1.x.</desc>
+ <!--
+ The big storage controller / DVD / Floppy rework (done)
+ -->
+ </const>
+ <const name="v1_10" value="12">
+ <desc>Settings version "1.10", written by VirtualBox 3.2.x.</desc>
+ <!--
+ Machine changes: RTC localOrUTC (done)
+ CPU hot-plug support
+ -->
+ </const>
+ <const name="v1_11" value="13">
+ <desc>Settings version "1.11", written by VirtualBox 4.0.x.</desc>
+ <!--
+ Machine changes: HD Audio controller, per-machine disk registries,
+ /@format attribute for DVD and floppy images.
+ -->
+ </const>
+ <const name="v1_12" value="14">
+ <desc>Settings version "1.12", written by VirtualBox 4.1.x.</desc>
+ <!--
+ Machine changes: raw PCI device attachment;
+ NetworkAdapter changes: bandwidth group.
+ -->
+ </const>
+ <const name="v1_13" value="15">
+ <desc>Settings version "1.13", written by VirtualBox 4.2.x.</desc>
+ <!--
+ Machine changes: tracing config, groups, autostart;
+ NetworkAdapter changes: unit for bandwidth group limits.
+ -->
+ </const>
+ <const name="v1_14" value="16">
+ <desc>Settings version "1.14", written by VirtualBox 4.3.x.</desc>
+ <!--
+ Machine changes: default frontend, USB rework.
+ -->
+ </const>
+ <const name="v1_15" value="17">
+ <desc>Settings version "1.15", written by VirtualBox 5.0.x.</desc>
+ <!--
+ Machine changes: hot-plug flag for storage devices.
+ -->
+ </const>
+ <const name="v1_16" value="18">
+ <desc>Settings version "1.16", written by VirtualBox 5.1.x.</desc>
+ <!--
+ Machine changes: NVMe storage controller, paravirt debug options, CPU
+ profile and BIOS/CPU APIC settings.
+ VirtualBox.xml: Add support for additional USB device sources (e.g. USB/IP)
+ -->
+ </const>
+ <const name="v1_17" value="19">
+ <desc>Settings version "1.17", written by VirtualBox 6.0.x.</desc>
+ <!--
+ Machine changes: nested hardware virtualization, hardware
+ virtualization using native API, shared folder automount point,
+ UART type selection and VM process priority.
+ -->
+ </const>
+ <const name="v1_18" value="20">
+ <desc>Settings version "1.18", written by VirtualBox 6.1.x.</desc>
+ <!--
+ Machine changes: virtio-scsi storage controller, NVRAM device.
+ -->
+ </const>
+ <const name="v1_19" value="21">
+ <desc>Settings version "1.19", written by VirtualBox 7.0.x.</desc>
+ <!--
+ VirtualBox.xml additions: HostOnlyNetworks in NetserviceRegistry
+ Machine changes: IOMMU device, HostOnlyNetwork mode for
+ NetworkAdapter, full VM encryption.
+ -->
+ </const>
+ <const name="Future" value="99999">
+ <desc>Settings version greater than "1.19", written by a future VirtualBox version.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="AccessMode"
+ uuid="1da0007c-ddf7-4be8-bcac-d84a1558785f"
+ >
+ <desc>
+ Access mode for opening files.
+ </desc>
+
+ <const name="ReadOnly" value="1"/>
+ <const name="ReadWrite" value="2"/>
+ </enum>
+
+ <enum
+ name="MachineState"
+ uuid="00bc01b5-00a4-48db-000a-9061008357aa"
+ >
+ <desc>
+ Virtual machine execution state.
+
+ This enumeration represents possible values of the <link
+ to="IMachine::state"/> attribute.
+
+ Below is the basic virtual machine state diagram. It shows how the state
+ changes during virtual machine execution. The text in square braces shows
+ a method of the IConsole or IMachine interface that performs the given state
+ transition.
+
+ <pre>
+ +---------[powerDown()] &lt;- Stuck &lt;--[failure]-+
+ V |
+ +-&gt; PoweredOff --+--&gt;[powerUp()]--&gt; Starting --+ | +-----[resume()]-----+
+ | | | | V |
+ | Aborted &lt;----+ +--&gt; Running --[pause()]--&gt; Paused
+ | | ^ | ^ |
+ | AbortedSaved &lt;-----------[failure]-----&lt;----+ | | | |
+ | | | | | | |
+ | +-------------+ | | | | |
+ | V | | | | |
+ | Saved --------[powerUp()]-----&gt; Restoring -+ | | | |
+ | ^ | | | |
+ | | +-----------------------------------------+-|-------------------+ +
+ | | | | |
+ | | +- OnlineSnapshotting &lt;--[takeSnapshot()]&lt;--+---------------------+
+ | | | |
+ | +-------- Saving &lt;--------[saveState()]&lt;----------+---------------------+
+ | | |
+ +-------------- Stopping -------[powerDown()]&lt;----------+---------------------+
+ </pre>
+
+ Note that states to the right of PoweredOff, Aborted, AbortedSaved, and
+ Saved in the above diagram are called <i>online VM states</i>. These
+ states represent the virtual machine which is being executed in a
+ dedicated process (usually with a GUI window attached to it where you can
+ see the activity of the virtual machine and interact with it). There are
+ two special pseudo-states, FirstOnline and LastOnline, that can be used
+ in relational expressions to detect if the given machine state is online
+ or not:
+
+ <pre>
+ if (machine.GetState() &gt;= MachineState_FirstOnline &amp;&amp;
+ machine.GetState() &lt;= MachineState_LastOnline)
+ {
+ ...the machine is being executed...
+ }
+ </pre>
+
+ When the virtual machine is in one of the online VM states (that is, being
+ executed), only a few machine settings can be modified. Methods working
+ with such settings contain an explicit note about that. An attempt to
+ change any other setting or perform a modifying operation during this time
+ will result in the @c VBOX_E_INVALID_VM_STATE error.
+
+ All online states except Running, Paused and Stuck are transitional: they
+ represent temporary conditions of the virtual machine that will last as
+ long as the operation that initiated such a condition.
+
+ The Stuck state is a special case. It means that execution of the machine
+ has reached the "Guru Meditation" condition. This condition indicates an
+ internal VMM (virtual machine manager) failure which may happen as a
+ result of either an unhandled low-level virtual hardware exception or one
+ of the recompiler exceptions (such as the <i>too-many-traps</i>
+ condition).
+
+ Note also that any online VM state may transit to the Aborted state. This
+ happens if the process that is executing the virtual machine terminates
+ unexpectedly (for example, crashes). Other than that, the Aborted state is
+ equivalent to PoweredOff.
+
+ There are also a few additional state diagrams that do not deal with
+ virtual machine execution and therefore are shown separately. The states
+ shown on these diagrams are called <i>offline VM states</i> (this includes
+ PoweredOff, Aborted, AbortedSaved and Saved too).
+
+ The first diagram shows what happens when a lengthy setup operation is
+ being executed (such as <link to="IMachine::attachDevice"/>).
+
+ <pre>
+ +----------------------------------(same state as before the call)------+
+ | |
+ +-&gt; PoweredOff --+ |
+ | | |
+ |-&gt; Aborted -----+--&gt;[lengthy VM configuration call] --&gt; SettingUp -----+
+ | |
+ +-&gt; Saved -------+
+ </pre>
+
+ The next two diagrams demonstrate the process of taking a snapshot of a
+ powered off virtual machine, restoring the state to that as of a snapshot
+ or deleting a snapshot, respectively.
+
+ <pre>
+ +----------------------------------(same state as before the call)------+
+ | |
+ +-&gt; PoweredOff --+ |
+ | +--&gt;[takeSnapshot()] ------------------&gt; Snapshotting -+
+ +-&gt; Aborted -----+
+
+ +-&gt; PoweredOff --+
+ | |
+ | Aborted -----+--&gt;[restoreSnapshot() ]-------&gt; RestoringSnapshot -+
+ | | [deleteSnapshot() ]-------&gt; DeletingSnapshot --+
+ +-&gt; Saved -------+ |
+ | |
+ +---(Saved if restored from an online snapshot, PoweredOff otherwise)---+
+ </pre>
+
+ <note internal="yes">
+ For whoever decides to touch this enum: In order to keep the
+ comparisons involving FirstOnline and LastOnline pseudo-states valid,
+ the numeric values of these states must be correspondingly updated if
+ needed: for any online VM state, the condition
+ <tt>FirstOnline &lt;= state &lt;= LastOnline</tt> must be
+ @c true. The same relates to transient states for which
+ the condition <tt>FirstOnline &lt;= state &lt;= LastOnline</tt> must be
+ @c true.
+ </note>
+ </desc>
+
+ <const name="Null" value="0">
+ <desc>Null value (never used by the API).</desc>
+ </const>
+ <const name="PoweredOff" value="1">
+ <desc>
+ The machine is not running and has no saved execution state; it has
+ either never been started or been shut down successfully.
+ </desc>
+ </const>
+ <const name="Saved" value="2">
+ <desc>
+ The machine is not currently running, but the execution state of the machine
+ has been saved to an external file when it was running, from where
+ it can be resumed.
+ </desc>
+ </const>
+ <const name="Teleported" value="3">
+ <desc>
+ The machine was teleported to a different host (or process) and then
+ powered off. Take care when powering it on again may corrupt resources
+ it shares with the teleportation target (e.g. disk and network).
+ </desc>
+ </const>
+ <const name="Aborted" value="4">
+ <desc>
+ The process running the machine has terminated abnormally. This may
+ indicate a crash of the VM process in host execution context, or
+ the VM process has been terminated externally.
+ </desc>
+ </const>
+ <const name="AbortedSaved" value="5">
+ <desc>
+ A machine in the @c Saved stated has terminated abnormally before
+ reaching the @c Running state. Similar to the @c Aborted state,
+ this may indicate a crash of the VM process in host execution
+ context, or the VM process has been terminated externally.
+ </desc>
+ </const>
+
+ <const name="Running" value="6">
+ <desc>
+ The machine is currently being executed.
+ <note internal="yes">
+ For whoever decides to touch this enum: In order to keep the
+ comparisons in the old source code valid, this state must immediately
+ precede the Paused state.
+
+ @todo Lift this spectacularly wonderful restriction.
+ </note>
+ </desc>
+ </const>
+ <const name="Paused" value="7">
+ <desc>
+ Execution of the machine has been paused.
+ <note internal="yes">
+ For whoever decides to touch this enum: In order to keep the
+ comparisons in the old source code valid, this state must immediately
+ follow the Running state.
+
+ @todo Lift this spectacularly wonderful restriction.
+ </note>
+ </desc>
+ </const>
+ <const name="Stuck" value="8">
+ <desc>
+ Execution of the machine has reached the "Guru Meditation"
+ condition. This indicates a severe error in the hypervisor itself.
+ <note internal="yes">
+ bird: Why this uncool name? Could we rename it to "GuruMeditation" or
+ "Guru", perhaps? Or are there some other VMM states that are
+ intended to be lumped in here as well?
+ </note>
+ </desc>
+ </const>
+ <const name="Teleporting" value="9">
+ <desc>
+ The machine is about to be teleported to a different host or process.
+ It is possible to pause a machine in this state, but it will go to the
+ @c TeleportingPausedVM state and it will not be
+ possible to resume it again unless the teleportation fails.
+ </desc>
+ </const>
+ <const name="LiveSnapshotting" value="10">
+ <desc>
+ A live snapshot is being taken. The machine is running normally, but
+ some of the runtime configuration options are inaccessible. Also, if
+ paused while in this state it will transition to
+ @c OnlineSnapshotting and it will not be resume the
+ execution until the snapshot operation has completed.
+ </desc>
+ </const>
+ <const name="Starting" value="11">
+ <desc>
+ Machine is being started after powering it on from a
+ zero execution state.
+ </desc>
+ </const>
+ <const name="Stopping" value="12">
+ <desc>
+ Machine is being normally stopped powering it off, or after the guest OS
+ has initiated a shutdown sequence.
+ </desc>
+ </const>
+ <const name="Saving" value="13">
+ <desc>
+ Machine is saving its execution state to a file.
+ </desc>
+ </const>
+ <const name="Restoring" value="14">
+ <desc>
+ Execution state of the machine is being restored from a file
+ after powering it on from either the @c Saved or @c AbortedSaved
+ execution state.
+ </desc>
+ </const>
+ <const name="TeleportingPausedVM" value="15">
+ <desc>
+ The machine is being teleported to another host or process, but it is
+ not running. This is the paused variant of the
+ @c Teleporting state.
+ </desc>
+ </const>
+ <const name="TeleportingIn" value="16">
+ <desc>
+ Teleporting the machine state in from another host or process.
+ </desc>
+ </const>
+ <const name="DeletingSnapshotOnline" value="17">
+ <desc>
+ Like @c DeletingSnapshot, but the merging of media is ongoing in
+ the background while the machine is running.
+ </desc>
+ </const>
+ <const name="DeletingSnapshotPaused" value="18">
+ <desc>
+ Like @c DeletingSnapshotOnline, but the machine was paused when the
+ merging of differencing media was started.
+ </desc>
+ </const>
+ <const name="OnlineSnapshotting" value="19">
+ <desc>
+ Like @c LiveSnapshotting, but the machine was paused when the
+ merging of differencing media was started.
+ </desc>
+ </const>
+ <const name="RestoringSnapshot" value="20">
+ <desc>
+ A machine snapshot is being restored; this typically does not take long.
+ </desc>
+ </const>
+ <const name="DeletingSnapshot" value="21">
+ <desc>
+ A machine snapshot is being deleted; this can take a long time since this
+ may require merging differencing media. This value indicates that the
+ machine is not running while the snapshot is being deleted.
+ </desc>
+ </const>
+ <const name="SettingUp" value="22">
+ <desc>
+ Lengthy setup operation is in progress.
+ </desc>
+ </const>
+ <const name="Snapshotting" value="23">
+ <desc>
+ Taking an (offline) snapshot.
+ </desc>
+ </const>
+
+ <const name="FirstOnline" value="6" wsmap="suppress"> <!-- Running -->
+ <desc>
+ Pseudo-state: first online state (for use in relational expressions).
+ </desc>
+ </const>
+ <const name="LastOnline" value="19" wsmap="suppress"> <!-- OnlineSnapshotting -->
+ <desc>
+ Pseudo-state: last online state (for use in relational expressions).
+ </desc>
+ </const>
+
+ <const name="FirstTransient" value="9" wsmap="suppress"> <!-- Teleporting -->
+ <desc>
+ Pseudo-state: first transient state (for use in relational expressions).
+ </desc>
+ </const>
+ <const name="LastTransient" value="23" wsmap="suppress"> <!-- Snapshotting -->
+ <desc>
+ Pseudo-state: last transient state (for use in relational expressions).
+ </desc>
+ </const>
+
+ </enum>
+
+ <enum
+ name="SessionState"
+ uuid="cf2700c0-ea4b-47ae-9725-7810114b94d8"
+ >
+ <desc>
+ Session state. This enumeration represents possible values of
+ <link to="IMachine::sessionState"/> and <link to="ISession::state"/>
+ attributes.
+ </desc>
+
+ <const name="Null" value="0">
+ <desc>Null value (never used by the API).</desc>
+ </const>
+ <const name="Unlocked" value="1">
+ <desc>
+ In <link to="IMachine::sessionState"/>, this means that the machine
+ is not locked for any sessions.
+
+ In <link to="ISession::state"/>, this means that no machine is
+ currently locked for this session.
+ </desc>
+ </const>
+ <const name="Locked" value="2">
+ <desc>
+ In <link to="IMachine::sessionState"/>, this means that the machine
+ is currently locked for a session, whose process identifier can
+ then be found in the <link to="IMachine::sessionPID" /> attribute.
+
+ In <link to="ISession::state"/>, this means that a machine is
+ currently locked for this session, and the mutable machine object
+ can be found in the <link to="ISession::machine"/> attribute
+ (see <link to="IMachine::lockMachine" /> for details).
+ </desc>
+ </const>
+ <const name="Spawning" value="3">
+ <desc>
+ A new process is being spawned for the machine as a result of
+ <link to="IMachine::launchVMProcess"/> call. This state also occurs
+ as a short transient state during an <link to="IMachine::lockMachine"/>
+ call.
+ </desc>
+ </const>
+ <const name="Unlocking" value="4">
+ <desc>
+ The session is being unlocked.
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="CPUArchitecture"
+ uuid="4a2c9915-12f1-43b2-bb84-e4bd4d5ca227"
+ >
+ <desc>Basic CPU architecture types.</desc>
+ <const name="Any" value="0">
+ <desc>Matches any CPU architecture.</desc>
+ </const>
+ <const name="x86" value="1">
+ <desc>32-bit (and 16-bit) x86.</desc>
+ </const>
+ <const name="AMD64" value="2">
+ <desc>64-bit x86. (Also known as x86-64 or x64.)</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="CPUPropertyType"
+ uuid="3fcfe589-ca66-468f-e313-656f9d0b2eb6"
+ >
+ <desc>
+ Virtual CPU property type. This enumeration represents possible values of the
+ IMachine get- and setCPUProperty methods.
+ </desc>
+ <const name="Null" value="0">
+ <desc>Null value (never used by the API).</desc>
+ </const>
+ <const name="PAE" value="1">
+ <desc>
+ This setting determines whether VirtualBox will expose the Physical Address
+ Extension (PAE) feature of the host CPU to the guest. Note that in case PAE
+ is not available, it will not be reported.
+ </desc>
+ </const>
+ <const name="LongMode" value="2">
+ <desc>
+ This setting determines whether VirtualBox will advertise long mode
+ (i.e. 64-bit guest support) and let the guest enter it.
+ </desc>
+ </const>
+ <const name="TripleFaultReset" value="3">
+ <desc>
+ This setting determines whether a triple fault within a guest will
+ trigger an internal error condition and stop the VM (default) or reset
+ the virtual CPU/VM and continue execution.
+ </desc>
+ </const>
+ <const name="APIC" value="4">
+ <desc>
+ This setting determines whether an APIC is part of the virtual CPU.
+ This feature can only be turned off when the X2APIC feature is off.
+ </desc>
+ </const>
+ <const name="X2APIC" value="5">
+ <desc>
+ This setting determines whether an x2APIC is part of the virtual CPU.
+ Since this feature implies that the APIC feature is present, it
+ automatically enables the APIC feature when set.
+ </desc>
+ </const>
+ <const name="IBPBOnVMExit" value="6">
+ <desc>
+ If set, force an indirect branch prediction barrier on VM exits if the
+ host CPU supports it. This setting will significantly slow down workloads
+ causing many VM exits, so it is only recommended for situation where there
+ is a real need to be paranoid.
+ </desc>
+ </const>
+ <const name="IBPBOnVMEntry" value="7">
+ <desc>
+ If set, force an indirect branch prediction barrier on VM entry if the
+ host CPU supports it. This setting will significantly slow down workloads
+ causing many VM exits, so it is only recommended for situation where there
+ is a real need to be paranoid.
+ </desc>
+ </const>
+ <const name="HWVirt" value="8">
+ <desc>
+ Enabled the hardware virtualization (AMD-V/VT-x) feature on the guest CPU.
+ This requires hardware virtualization on the host CPU.
+ </desc>
+ </const>
+ <const name="SpecCtrl" value="9">
+ <desc>
+ If set, the speculation control CPUID bits and MSRs, when available on the
+ host, are exposed to the guest. Depending on the host CPU and operating
+ system, this may significantly slow down workloads causing many VM exits.
+ </desc>
+ </const>
+ <const name="SpecCtrlByHost" value="10">
+ <desc>
+ If set, the speculation controls are managed by the host. This is intended
+ for guests which do not set the speculation controls themselves.
+ Note! This has not yet been implemented beyond leaving everything to the host OS.
+ </desc>
+ </const>
+ <const name="L1DFlushOnEMTScheduling" value="11">
+ <desc>
+ If set and the host is affected by CVE-2018-3646, flushes the level 1 data
+ cache when the EMT is scheduled to do ring-0 guest execution. There could
+ be a small performance penalty for certain typs of workloads.
+ For security reasons this setting will be enabled by default.
+ </desc>
+ </const>
+ <const name="L1DFlushOnVMEntry" value="12">
+ <desc>
+ If set and the host is affected by CVE-2018-3646, flushes the level 1 data
+ on every VM entry. This setting may significantly slow down workloads
+ causing many VM exits, so it is only recommended for situation where there
+ is a real need to be paranoid.
+ </desc>
+ </const>
+ <const name="MDSClearOnEMTScheduling" value="13">
+ <desc>
+ If set and the host is affected by CVE-2018-12126, CVE-2018-12127, or
+ CVE-2018-12130, clears the relevant MDS buffers when the EMT is scheduled
+ to do ring-0 guest execution. There could be a small performance penalty
+ for certain typs of workloads. For security reasons this setting will be
+ enabled by default.
+ </desc>
+ </const>
+ <const name="MDSClearOnVMEntry" value="14">
+ <desc>
+ If set and the host is affected by CVE-2018-12126, CVE-2018-12127, or
+ CVE-2018-12130, clears the relevant MDS buffers on every VM entry. This
+ setting may slow down workloads causing many VM exits, so it is only
+ recommended for situation where there is a real need to be paranoid.
+ </desc>
+ </const>
+ </enum>
+
+
+ <enum
+ name="HWVirtExPropertyType"
+ uuid="00069d9c-00b5-460c-00dd-64250024f7aa"
+ >
+ <desc>
+ Hardware virtualization property type. This enumeration represents possible values
+ for the <link to="IMachine::getHWVirtExProperty"/> and
+ <link to="IMachine::setHWVirtExProperty"/> methods.
+ </desc>
+ <const name="Null" value="0">
+ <desc>Null value (never used by the API).</desc>
+ </const>
+ <const name="Enabled" value="1">
+ <desc>
+ Whether hardware virtualization (VT-x/AMD-V) is enabled at all. If
+ such extensions are not available, they will not be used.
+ </desc>
+ </const>
+ <const name="VPID" value="2">
+ <desc>
+ Whether VT-x VPID is enabled. If this extension is not available, it will not be used.
+ </desc>
+ </const>
+ <const name="NestedPaging" value="3">
+ <desc>
+ Whether Nested Paging is enabled. If this extension is not available, it will not be used.
+ </desc>
+ </const>
+ <const name="UnrestrictedExecution" value="4">
+ <desc>
+ Whether VT-x unrestricted execution is enabled. If this feature is not available, it will not be used.
+ </desc>
+ </const>
+ <const name="LargePages" value="5">
+ <desc>
+ Whether large page allocation is enabled; requires nested paging and a 64-bit host.
+ </desc>
+ </const>
+ <const name="Force" value="6">
+ <desc>
+ Whether the VM should fail to start if hardware virtualization (VT-x/AMD-V) cannot be used. If
+ not set, there will be an automatic fallback to software virtualization.
+ </desc>
+ </const>
+ <const name="UseNativeApi" value="7">
+ <desc>
+ Use the native hypervisor API instead of the VirtualBox one (HM) for VT-X/AMD-V. This is
+ ignored if <link to="HWVirtExPropertyType_Enabled"/> isn't set.
+ </desc>
+ </const>
+ <const name="VirtVmsaveVmload" value="8">
+ <desc>
+ Whether AMD-V Virtualized VMSAVE/VMLOAD is enabled. If this feature is not available, it will not
+ be used.
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="ParavirtProvider"
+ uuid="696453ec-3742-4a05-bead-658ccbf2c944"
+ >
+ <desc>
+ The paravirtualized guest interface provider. This enumeration represents possible
+ values for the <link to="IMachine::paravirtProvider"/> attribute.
+ </desc>
+ <const name="None" value="0">
+ <desc>No provider is used.</desc>
+ </const>
+ <const name="Default" value="1">
+ <desc>A default provider is automatically chosen according to the guest OS type.</desc>
+ </const>
+ <const name="Legacy" value="2">
+ <desc>Used for VMs which didn't used to have any provider settings. Usually
+ interpreted as @c None for most VMs.</desc>
+ </const>
+ <const name="Minimal" value="3">
+ <desc>A minimal set of features to expose to the paravirtualized guest.</desc>
+ </const>
+ <const name="HyperV" value="4">
+ <desc>Microsoft Hyper-V.</desc>
+ </const>
+ <const name="KVM" value="5">
+ <desc>Linux KVM.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="LockType"
+ uuid="678aaf14-2815-4c3e-b20a-e86ed0216498"
+ >
+ <desc>
+ Used with <link to="IMachine::lockMachine" />.
+ </desc>
+ <const name="Null" value="0">
+ <desc>Placeholder value, do not use when obtaining a lock.</desc>
+ </const>
+ <const name="Shared" value="1">
+ <desc>Request only a shared lock for remote-controlling the machine.
+ Such a lock allows changing certain VM settings which can be safely
+ modified for a running VM.</desc>
+ </const>
+ <const name="Write" value="2">
+ <desc>Lock the machine for writing. This requests an exclusive lock, i.e.
+ there cannot be any other API client holding any type of lock for this
+ VM concurrently. Remember that a VM process counts as an API client
+ which implicitly holds the equivalent of a shared lock during the
+ entire VM runtime.</desc>
+ </const>
+ <const name="VM" value="3">
+ <desc>Lock the machine for writing, and create objects necessary for
+ running a VM in this process.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="SessionType"
+ uuid="A13C02CB-0C2C-421E-8317-AC0E8AAA153A"
+ >
+ <desc>
+ Session type. This enumeration represents possible values of the
+ <link to="ISession::type"/> attribute.
+ </desc>
+
+ <const name="Null" value="0">
+ <desc>Null value (never used by the API).</desc>
+ </const>
+ <const name="WriteLock" value="1">
+ <desc>
+ Session has acquired an exclusive write lock on a machine
+ using <link to="IMachine::lockMachine"/>.
+ </desc>
+ </const>
+ <const name="Remote" value="2">
+ <desc>
+ Session has launched a VM process using
+ <link to="IMachine::launchVMProcess"/>
+ </desc>
+ </const>
+ <const name="Shared" value="3">
+ <desc>
+ Session has obtained a link to another session using
+ <link to="IMachine::lockMachine"/>
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="DeviceType"
+ uuid="cb977be1-d1fb-41f8-ad7e-951736c6cb3e"
+ >
+ <desc>
+ Device type.
+ </desc>
+ <const name="Null" value="0">
+ <desc>
+ Null value, may also mean "no device" (not allowed for
+ <link to="IConsole::getDeviceActivity"/>).
+ </desc>
+ </const>
+ <const name="Floppy" value="1">
+ <desc>Floppy device.</desc>
+ </const>
+ <const name="DVD" value="2">
+ <desc>CD/DVD-ROM device.</desc>
+ </const>
+ <const name="HardDisk" value="3">
+ <desc>Hard disk device.</desc>
+ </const>
+ <const name="Network" value="4">
+ <desc>Network device.</desc>
+ </const>
+ <const name="USB" value="5">
+ <desc>USB device.</desc>
+ </const>
+ <const name="SharedFolder" value="6">
+ <desc>Shared folder device.</desc>
+ </const>
+ <const name="Graphics3D" value="7">
+ <desc>Graphics device 3D activity.</desc>
+ </const>
+ <const name="End" value="8">
+ <desc>End of valid device types (exclusive). Used for invalid validation and such.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="DeviceActivity"
+ uuid="6FC8AEAA-130A-4eb5-8954-3F921422D707"
+ >
+ <desc>
+ Device activity for <link to="IConsole::getDeviceActivity"/>.
+ </desc>
+
+ <const name="Null" value="0"/>
+ <const name="Idle" value="1"/>
+ <const name="Reading" value="2"/>
+ <const name="Writing" value="3"/>
+ </enum>
+
+ <enum
+ name="ClipboardMode"
+ uuid="33364716-4008-4701-8f14-be0fa3d62950"
+ >
+ <desc>
+ Host-Guest clipboard interchange mode.
+ </desc>
+
+ <const name="Disabled" value="0"/>
+ <const name="HostToGuest" value="1"/>
+ <const name="GuestToHost" value="2"/>
+ <const name="Bidirectional" value="3"/>
+ </enum>
+
+ <enum
+ name="DnDMode"
+ uuid="07af8800-f936-4b33-9172-cd400e83c148"
+ >
+ <desc>
+ Drag and drop interchange mode.
+ </desc>
+
+ <const name="Disabled" value="0"/>
+ <const name="HostToGuest" value="1"/>
+ <const name="GuestToHost" value="2"/>
+ <const name="Bidirectional" value="3"/>
+ </enum>
+
+ <enum
+ name="Scope"
+ uuid="7c91096e-499e-4eca-9f9b-9001438d7855"
+ >
+ <desc>
+ Scope of the operation.
+
+ A generic enumeration used in various methods to define the action or
+ argument scope.
+ </desc>
+
+ <const name="Global" value="0"/>
+ <const name="Machine" value="1"/>
+ <const name="Session" value="2"/>
+ </enum>
+
+ <enum
+ name="BIOSBootMenuMode"
+ uuid="ae4fb9f7-29d2-45b4-b2c7-d579603135d5"
+ >
+ <desc>
+ BIOS boot menu mode.
+ </desc>
+
+ <const name="Disabled" value="0"/>
+ <const name="MenuOnly" value="1"/>
+ <const name="MessageAndMenu" value="2"/>
+ </enum>
+
+ <enum
+ name="APICMode"
+ uuid="c6884ba5-3cc4-4a92-a7f6-4410f9fd894e"
+ >
+ <desc>
+ BIOS APIC initialization mode. If the hardware does not support the
+ mode then the code falls back to a lower mode.
+ </desc>
+
+ <const name="Disabled" value="0"/>
+ <const name="APIC" value="1"/>
+ <const name="X2APIC" value="2"/>
+ </enum>
+
+ <enum
+ name="ProcessorFeature"
+ uuid="0064dece-000e-4963-00f8-eb9b00674c8a"
+ >
+ <desc>
+ CPU features.
+ </desc>
+
+ <const name="HWVirtEx" value="0"/>
+ <const name="PAE" value="1"/>
+ <const name="LongMode" value="2"/>
+ <const name="NestedPaging" value="3"/>
+ <const name="UnrestrictedGuest" value="4"/>
+ <const name="NestedHWVirt" value="5"/>
+ <const name="VirtVmsaveVmload" value="6"/>
+ </enum>
+
+ <enum
+ name="FirmwareType"
+ uuid="b903f264-c230-483e-ac74-2b37ce60d371"
+ >
+ <desc>
+ Firmware type.
+ </desc>
+ <const name="BIOS" value="1">
+ <desc>BIOS Firmware.</desc>
+ </const>
+ <const name="EFI" value="2">
+ <desc>EFI Firmware, bitness detected basing on OS type.</desc>
+ </const>
+ <const name="EFI32" value="3">
+ <desc>EFI firmware, 32-bit.</desc>
+ </const>
+ <const name="EFI64" value="4">
+ <desc>EFI firmware, 64-bit.</desc>
+ </const>
+ <const name="EFIDUAL" value="5">
+ <desc>EFI firmware, combined 32 and 64-bit.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="PointingHIDType"
+ uuid="b3fd8215-6870-4e61-b6d9-2998fa625de0"
+ >
+ <desc>
+ Type of pointing device used in a virtual machine.
+ </desc>
+ <const name="None" value="1">
+ <desc>No mouse.</desc>
+ </const>
+ <const name="PS2Mouse" value="2">
+ <desc>PS/2 auxiliary device, a.k.a. mouse.</desc>
+ </const>
+ <const name="USBMouse" value="3">
+ <desc>USB mouse (relative pointer).</desc>
+ </const>
+ <const name="USBTablet" value="4">
+ <desc>
+ USB tablet (absolute pointer). Also enables a relative USB mouse in
+ addition.
+ </desc>
+ </const>
+ <const name="ComboMouse" value="5">
+ <desc>
+ Combined device, working as PS/2 or USB mouse, depending on guest
+ behavior. Using this device can have negative performance implications.
+ </desc>
+ </const>
+ <const name="USBMultiTouch" value="6">
+ <desc>
+ USB multi-touch device, just touchscreen. It is a specific mode of the
+ USB tablet and also enables the mouse device.
+ </desc>
+ </const>
+ <const name="USBMultiTouchScreenPlusPad" value="7">
+ <desc>
+ USB multi-touch device, touchscreen plus touchpad. It also enables the
+ mouse device.
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="KeyboardHIDType"
+ uuid="383e43d7-5c7c-4ec8-9cb8-eda1bccd6699"
+ >
+ <desc>
+ Type of keyboard device used in a virtual machine.
+ </desc>
+ <const name="None" value="1">
+ <desc>No keyboard.</desc>
+ </const>
+ <const name="PS2Keyboard" value="2">
+ <desc>PS/2 keyboard.</desc>
+ </const>
+ <const name="USBKeyboard" value="3">
+ <desc>USB keyboard.</desc>
+ </const>
+ <const name="ComboKeyboard" value="4">
+ <desc>Combined device, working as PS/2 or USB keyboard, depending on guest behavior.
+ Using of such device can have negative performance implications.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="BitmapFormat"
+ uuid="afb2bf39-8b1e-4f9f-8948-d1b887f83eb0"
+ >
+ <desc>
+ Format of a bitmap. Generic values for formats used by
+ the source bitmap, the screen shot or image update APIs.
+ </desc>
+
+ <const name="Opaque" value="0">
+ <desc>
+ Unknown buffer format (the user may not assume any particular format of
+ the buffer).
+ </desc>
+ </const>
+ <const name="BGR" value="0x20524742">
+ <desc>
+ Generic BGR format without alpha channel.
+ Pixel layout depends on the number of bits per pixel:
+ <ul>
+ <li>
+ <b>32</b> - bits 31:24 undefined, bits 23:16 R, bits 15:8 G, bits 7:0 B.
+ </li>
+
+ <li>
+ <b>16</b> - bits 15:11 R, bits 10:5 G, bits 4:0 B.
+ </li>
+ </ul>
+ </desc>
+ </const>
+ <const name="BGR0" value="0x30524742">
+ <desc>
+ 4 bytes per pixel: B, G, R, 0.
+ </desc>
+ </const>
+ <const name="BGRA" value="0x41524742">
+ <desc>
+ 4 bytes per pixel: B, G, R, A.
+ </desc>
+ </const>
+ <const name="RGBA" value="0x41424752">
+ <desc>
+ 4 bytes per pixel: R, G, B, A.
+ </desc>
+ </const>
+ <const name="PNG" value="0x20474E50">
+ <desc>
+ PNG image.
+ </desc>
+ </const>
+ <const name="JPEG" value="0x4745504A">
+ <desc>
+ JPEG image.
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="PartitioningType"
+ uuid="64c4c806-8908-4c0b-9a51-2d7a0151321f"
+ >
+ <desc>
+ The type of the disk partition.
+ </desc>
+
+ <const name="MBR" value="0"/>
+ <const name="GPT" value="1"/>
+ </enum>
+
+ <enum
+ name="PartitionType"
+ uuid="84a6629c-8e9c-474c-adbb-21995671597f"
+ >
+ <desc></desc>
+
+ <!-- MBR partition IDs using the same value: -->
+ <const name="Empty" value="0"><desc>Empty partition entry</desc></const>
+ <const name="FAT12" value="1"> <desc>FAT12 if partition size less than 65536 sectors</desc></const>
+ <const name="FAT16" value="4"> <desc>FAT16 if partition size less than 65536 sectors</desc></const>
+ <const name="FAT" value="6"> <desc>FAT12 or FAT16 if partition size greater or equal than 65536 sectors</desc></const>
+ <const name="IFS" value="7"> <desc>NT and OS/2 installable file system, e.g. NTFS, exFAT, HPFS.</desc></const>
+ <const name="FAT32CHS" value="11"> <desc>The FAT32 with CHS addressing.</desc></const>
+ <const name="FAT32LBA" value="12"> <desc>The FAT32 with LBA addressing.</desc></const>
+ <const name="FAT16B" value="14"> <desc>The FAT16 with LBA addressing.</desc></const>
+ <const name="Extended" value="15"> <desc>The extended partition with LBA addressing.</desc></const>
+ <const name="WindowsRE" value="39"> <desc>Windows Recovery Environment (RE) partition (hidden NTFS partition).</desc></const>
+ <const name="LinuxSwapOld" value="66"> <desc>The linux swap partition (old versions).</desc></const>
+ <const name="LinuxOld" value="67"> <desc>The linux native partition (old versions).</desc></const>
+ <const name="DragonFlyBSDSlice" value="108"><desc>The BSD slice.</desc></const>
+ <const name="LinuxSwap" value="130"><desc>The linux swap partition.</desc></const>
+ <const name="Linux" value="131"><desc>The linux native partition.</desc></const>
+ <const name="LinuxExtended" value="133"><desc>The linux extended partition.</desc></const>
+ <const name="LinuxLVM" value="142"><desc>The linux LVM partition.</desc></const>
+ <const name="BSDSlice" value="165"><desc>The BSD slice.</desc></const>
+ <const name="AppleUFS" value="168"><desc>The Apple UFS partition.</desc></const>
+ <const name="AppleHFS" value="175"><desc>The Apple HFS partition.</desc></const>
+ <const name="Solaris" value="191"><desc>The Apple HFS partition.</desc></const>
+ <const name="GPT" value="238"><desc>The GPT protective MBR partition.</desc></const>
+ <const name="EFI" value="239"><desc>The EFI system partition.</desc></const>
+
+ <!-- Dummy value: -->
+ <const name="Unknown" value="256"><desc>Unknown partition type.</desc></const>
+
+ <!-- GPT partition types: -->
+ <const name="MBR" value="257"><desc>MBR partition scheme.</desc></const>
+ <const name="iFFS" value="258"><desc>Intel Fast Flash (iFFS) partition.</desc></const>
+ <const name="SonyBoot" value="259"><desc>Sony boot partition.</desc></const>
+ <const name="LenovoBoot" value="260"><desc>Lenovo boot partition.</desc></const>
+
+ <const name="WindowsMSR" value="270"><desc>Microsoft Reserved Partition (MSR).</desc></const>
+ <const name="WindowsBasicData" value="271"><desc>Windows Basic data partition</desc></const>
+ <const name="WindowsLDMMeta" value="272"><desc>Windows Logical Disk Manager (LDM) metadata partition.</desc></const>
+ <const name="WindowsLDMData" value="273"><desc>Windows Logical Disk Manager data partition.</desc></const>
+ <const name="WindowsRecovery" value="274"><desc>Windows Recovery Environment.</desc></const>
+ <const name="WindowsStorageSpaces" value="276"><desc>Windows Storage Spaces partition.</desc></const>
+ <const name="WindowsStorageReplica" value="277"><desc>Windows Storage Replica partition.</desc></const>
+ <const name="IBMGPFS" value="275"><desc>IBM General Parallel File System (GPFS) partition.</desc></const>
+
+ <const name="LinuxData" value="300"><desc>Linux filesystem data.</desc></const>
+ <const name="LinuxRAID" value="301"><desc>Linux RAID partition.</desc></const>
+ <const name="LinuxRootX86" value="302"><desc>Linux root partition for x86.</desc></const>
+ <const name="LinuxRootAMD64" value="303"><desc>Linux root partition for AMD64.</desc></const>
+ <const name="LinuxRootARM32" value="304"><desc>Linux root partition for ARM32.</desc></const>
+ <const name="LinuxRootARM64" value="305"><desc>Linux root partition for ARM64 / AArch64.</desc></const>
+ <const name="LinuxHome" value="306"><desc>Linux /home partition.</desc></const>
+ <const name="LinuxSrv" value="307"><desc>Linux /srv partition.</desc></const>
+ <const name="LinuxPlainDmCrypt" value="308"><desc>Linux plain dm-crypt partition.</desc></const>
+ <const name="LinuxLUKS" value="309"><desc>Linux unitified key setup (LUKS) partition.</desc></const>
+ <const name="LinuxReserved" value="310"><desc>Linux reserved partition.</desc></const>
+
+ <const name="FreeBSDBoot" value="330"><desc>FreeBSD boot partition.</desc></const>
+ <const name="FreeBSDData" value="331"><desc>FreeBSD data partition.</desc></const>
+ <const name="FreeBSDSwap" value="332"><desc>FreeBSD swap partition.</desc></const>
+ <const name="FreeBSDUFS" value="333"><desc>FreeBSD unix file system (UFS) partition.</desc></const>
+ <const name="FreeBSDVinum" value="334"><desc>FreeBSD Vinum volume manager partition.</desc></const>
+ <const name="FreeBSDZFS" value="335"><desc>FreeBSD ZFS partition.</desc></const>
+ <const name="FreeBSDUnknown" value="359"><desc>Unknown FreeBSD partition.</desc></const>
+
+ <const name="AppleHFSPlus" value="360"><desc>Apple hierarchical file system plus (HFS+) partition.</desc></const>
+ <const name="AppleAPFS" value="361"><desc>Apple APFS/FileFault container partition.</desc></const>
+ <const name="AppleRAID" value="362"><desc>Apple RAID partition.</desc></const>
+ <const name="AppleRAIDOffline" value="363"><desc>Apple RAID partition, offline.</desc></const>
+ <const name="AppleBoot" value="364"><desc>Apple boot partition.</desc></const>
+ <const name="AppleLabel" value="365"><desc>Apple label.</desc></const>
+ <const name="AppleTvRecovery" value="366"><desc>Apple TV recovery partition.</desc></const>
+ <const name="AppleCoreStorage" value="367"><desc>Apple Core Storage Containe.</desc></const>
+ <const name="SoftRAIDStatus" value="370"><desc>SoftRAID status.</desc></const>
+ <const name="SoftRAIDScratch" value="371"><desc>SoftRAID scratch.</desc></const>
+ <const name="SoftRAIDVolume" value="372"><desc>SoftRAID volume.</desc></const>
+ <const name="SoftRAIDCache" value="373"><desc>SoftRAID cache.</desc></const>
+ <const name="AppleUnknown" value="389"><desc>Unknown Apple partition.</desc></const>
+
+ <const name="SolarisBoot" value="390"><desc>Solaris boot partition.</desc></const>
+ <const name="SolarisRoot" value="391"><desc>Solaris root partition.</desc></const>
+ <const name="SolarisSwap" value="392"><desc>Solaris swap partition.</desc></const>
+ <const name="SolarisBackup" value="393"><desc>Solaris backup partition.</desc></const>
+ <const name="SolarisUsr" value="394"><desc>Solaris /usr partition.</desc></const>
+ <const name="SolarisVar" value="395"><desc>Solaris /var partition.</desc></const>
+ <const name="SolarisHome" value="396"><desc>Solaris /home partition.</desc></const>
+ <const name="SolarisAltSector" value="397"><desc>Solaris alternate sector.</desc></const>
+ <const name="SolarisReserved" value="398"><desc>Solaris reserved partition.</desc></const>
+ <const name="SolarisUnknown" value="419"><desc>Unknown Solaris partition.</desc></const>
+
+ <const name="NetBSDSwap" value="420"><desc>NetBSD swap partition.</desc></const>
+ <const name="NetBSDFFS" value="421"><desc>NetBSD fast file system (FFS) partition.</desc></const>
+ <const name="NetBSDLFS" value="422"><desc>NetBSD log structured file system (LFS) partition.</desc></const>
+ <const name="NetBSDRAID" value="423"><desc>NetBSD RAID partition.</desc></const>
+ <const name="NetBSDConcatenated" value="424"><desc>NetBSD concatenated partition.</desc></const>
+ <const name="NetBSDEncrypted" value="425"><desc>NetBSD encrypted partition.</desc></const>
+ <const name="NetBSDUnknown" value="449"><desc>Unknown NetBSD partition.</desc></const>
+
+ <const name="ChromeOSKernel" value="450"><desc>Chrome OS kernel partition.</desc></const>
+ <const name="ChromeOSRootFS" value="451"><desc>Chrome OS root file system partition.</desc></const>
+ <const name="ChromeOSFuture" value="452"><desc>Chrome OS partition reserved for future.</desc></const>
+
+ <const name="ContLnxUsr" value="480"><desc>Container Linux /usr partition.</desc></const>
+ <const name="ContLnxRoot" value="481"><desc>Container Linux resizable root filesystem partition.</desc></const>
+ <const name="ContLnxReserved" value="482"><desc>Container Linux OEM customization partition.</desc></const>
+ <const name="ContLnxRootRAID" value="483"><desc>Container Linux root filesystem on RAID partition.</desc></const>
+
+ <const name="HaikuBFS" value="510"><desc>Haiku BFS</desc></const>
+
+ <const name="MidntBSDBoot" value="540"><desc>MidnightBSD boot partition.</desc></const>
+ <const name="MidntBSDData" value="541"><desc>MidnightBSD data partition.</desc></const>
+ <const name="MidntBSDSwap" value="542"><desc>MidnightBSD swap partition.</desc></const>
+ <const name="MidntBSDUFS" value="543"><desc>MidnightBSD unix file system (UFS) partition.</desc></const>
+ <const name="MidntBSDVium" value="544"><desc>MidnightBSD Vinum volume manager partition.</desc></const>
+ <const name="MidntBSDZFS" value="545"><desc>MidnightBSD ZFS partition.</desc></const>
+ <const name="MidntBSDUnknown" value="569"><desc>Unknown MidnightBSD partition.</desc></const>
+
+ <const name="OpenBSDData" value="570"><desc>OpenBSD data partition.</desc></const>
+
+ <const name="QNXPowerSafeFS" value="600"><desc>QNX power-safe file system partition.</desc></const>
+
+ <const name="Plan9" value="630"><desc>Plan 9 partition.</desc></const>
+
+ <const name="VMWareVMKCore" value="660"><desc>VMWare ESX coredump partition.</desc></const>
+ <const name="VMWareVMFS" value="661"><desc>VMWare ESX virtual machine file system (VMFS) partition.</desc></const>
+ <const name="VMWareReserved" value="662"><desc>VMWare ESX reserved partition.</desc></const>
+ <const name="VMWareUnknown" value="689"><desc>Unknown VMWare partition.</desc></const>
+
+ <const name="AndroidX86Bootloader" value="690"><desc>Android x86 bootloader partition.</desc></const>
+ <const name="AndroidX86Bootloader2" value="691"><desc>Android x86 bootloader2 partition.</desc></const>
+ <const name="AndroidX86Boot" value="692"><desc>Android x86 boot partition.</desc></const>
+ <const name="AndroidX86Recovery" value="693"><desc>Android x86 recovery partition.</desc></const>
+ <const name="AndroidX86Misc" value="694"><desc>Android x86 misc partition.</desc></const>
+ <const name="AndroidX86Metadata" value="695"><desc>Android x86 metadata partition.</desc></const>
+ <const name="AndroidX86System" value="696"><desc>Android x86 system partition.</desc></const>
+ <const name="AndroidX86Cache" value="697"><desc>Android x86 cache partition.</desc></const>
+ <const name="AndroidX86Data" value="698"><desc>Android x86 data partition.</desc></const>
+ <const name="AndroidX86Persistent" value="699"><desc>Android x86 persistent data partition.</desc></const>
+ <const name="AndroidX86Vendor" value="700"><desc>Android x86 vendor partition.</desc></const>
+ <const name="AndroidX86Config" value="701"><desc>Android x86 config partition.</desc></const>
+ <const name="AndroidX86Factory" value="702"><desc>Android x86 factory partition.</desc></const>
+ <const name="AndroidX86FactoryAlt" value="703"><desc>Android x86 alternative factory partition.</desc></const>
+ <const name="AndroidX86Fastboot" value="704"><desc>Android x86 fastboot partition.</desc></const>
+ <const name="AndroidX86OEM" value="705"><desc>Android x86 OEM partition.</desc></const>
+
+ <const name="AndroidARMMeta" value="720"><desc>Android ARM meta partition.</desc></const>
+ <const name="AndroidARMExt" value="721"><desc>Android ARM EXT partition.</desc></const>
+
+ <const name="ONIEBoot" value="750"><desc>Open Network Install Environment (ONIE) boot partition.</desc></const>
+ <const name="ONIEConfig" value="751"><desc>Open Network Install Environment (ONIE) config partition.</desc></const>
+
+ <const name="PowerPCPrep" value="780"><desc>PowerPC PReP boot partition.</desc></const>
+
+ <const name="XDGShrBootConfig" value="810"><desc>freedesktop.org shared boot loader configuration partition.</desc></const>
+
+ <const name="CephBlock" value="830"><desc>Ceph block partition.</desc></const>
+ <const name="CephBlockDB" value="831"><desc>Ceph block DB partition.</desc></const>
+ <const name="CephBlockDBDmc" value="832"><desc>Ceph dm-crypt block DB partition.</desc></const>
+ <const name="CephBlockDBDmcLUKS" value="833"><desc>Ceph dm-crypt Linux unitified key setup (LUKS) block DB partition.</desc></const>
+ <const name="CephBlockDmc" value="834"><desc>Ceph dm-crypt block partition.</desc></const>
+ <const name="CephBlockDmcLUKS" value="835"><desc>Ceph dm-crypt Linux unitified key setup (LUKS) block partition.</desc></const>
+ <const name="CephBlockWALog" value="836"><desc>Ceph block write-ahead log partition.</desc></const>
+ <const name="CephBlockWALogDmc" value="837"><desc>Ceph dm-crypt block write-ahead log partition.</desc></const>
+ <const name="CephBlockWALogDmcLUKS" value="838"><desc>Ceph dm-crypt Linux unitified key setup (LUKS) block write-ahead log partition.</desc></const>
+ <const name="CephDisk" value="839"><desc>Ceph disk in creation partition.</desc></const>
+ <const name="CephDiskDmc" value="840"><desc>Ceph dm-crypt disk in creation partition.</desc></const>
+ <const name="CephJournal" value="841"><desc>Ceph Journal partition.</desc></const>
+ <const name="CephJournalDmc" value="842"><desc>Ceph dm-crypt journal partition.</desc></const>
+ <const name="CephJournalDmcLUKS" value="843"><desc>Ceph dm-crypt Linux unitified key setup (LUKS) journal partition.</desc></const>
+ <const name="CephLockbox" value="844"><desc>Ceph Lockbox for dm-crypt keys partition.</desc></const>
+ <const name="CephMultipathBlock1" value="845"><desc>Ceph multipath block 1 partition.</desc></const>
+ <const name="CephMultipathBlock2" value="846"><desc>Ceph multipath block 2 partition.</desc></const>
+ <const name="CephMultipathBlockDB" value="847"><desc>Ceph multipath block DB partition.</desc></const>
+ <const name="CephMultipathBLockWALog" value="848"><desc>Ceph multipath block write-ahead log partition.</desc></const>
+ <const name="CephMultipathJournal" value="849"><desc>Ceph multipath journal partition.</desc></const>
+ <const name="CephMultipathOSD" value="851"><desc>Ceph multipath object storage deamon (OSD) partition.</desc></const>
+ <const name="CephOSD" value="852"><desc>Ceph object storage deamon (OSD) partition.</desc></const>
+ <const name="CephOSDDmc" value="853"><desc>Ceph dm-crypt object storage deamon (OSD) partition.</desc></const>
+ <const name="CephOSDDmcLUKS" value="854"><desc>Ceph dm-crypt Linux unitified key setup (LUKS) object storage deamon (OSD) partition.</desc></const>
+ </enum>
+
+
+ <!--
+ // IVirtualBoxErrorInfo
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IVirtualBoxErrorInfo" extends="$errorinfo"
+ uuid="c1bcc6d5-7966-481d-ab0b-d0ed73e28135"
+ supportsErrorInfo="no"
+ wsmap="managed"
+ rest="managed"
+ >
+ <desc>
+ The IVirtualBoxErrorInfo interface represents extended error information.
+
+ Extended error information can be set by VirtualBox components after
+ unsuccessful or partially successful method invocation. This information
+ can be retrieved by the calling party as an IVirtualBoxErrorInfo object
+ and then shown to the client in addition to the plain 32-bit result code.
+
+ In MS COM, this interface extends the IErrorInfo interface,
+ in XPCOM, it extends the nsIException interface. In both cases,
+ it provides a set of common attributes to retrieve error
+ information.
+
+ Sometimes invocation of some component's method may involve methods of
+ other components that may also fail (independently of this method's
+ failure), or a series of non-fatal errors may precede a fatal error that
+ causes method failure. In cases like that, it may be desirable to preserve
+ information about all errors happened during method invocation and deliver
+ it to the caller. The <link to="#next"/> attribute is intended
+ specifically for this purpose and allows to represent a chain of errors
+ through a single IVirtualBoxErrorInfo object set after method invocation.
+
+ <note>errors are stored to a chain in the reverse order, i.e. the
+ initial error object you query right after method invocation is the last
+ error set by the callee, the object it points to in the @a next attribute
+ is the previous error and so on, up to the first error (which is the last
+ in the chain).</note>
+ </desc>
+
+ <attribute name="resultCode" type="long" readonly="yes">
+ <desc>
+ Result code of the error.
+ Usually, it will be the same as the result code returned
+ by the method that provided this error information, but not
+ always. For example, on Win32, CoCreateInstance() will most
+ likely return E_NOINTERFACE upon unsuccessful component
+ instantiation attempt, but not the value the component factory
+ returned. Value is typed 'long', not 'result',
+ to make interface usable from scripting languages.
+ <note>
+ In MS COM, there is no equivalent.
+ In XPCOM, it is the same as nsIException::result.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="resultDetail" type="long" readonly="yes">
+ <desc>
+ Optional result data of this error. This will vary depending on the
+ actual error usage. By default this attribute is not being used.
+ </desc>
+ </attribute>
+
+ <attribute name="interfaceID" type="uuid" mod="string" readonly="yes">
+ <desc>
+ UUID of the interface that defined the error.
+ <note>
+ In MS COM, it is the same as IErrorInfo::GetGUID, except for the
+ data type.
+ In XPCOM, there is no equivalent.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="component" type="wstring" readonly="yes">
+ <desc>
+ Name of the component that generated the error.
+ <note>
+ In MS COM, it is the same as IErrorInfo::GetSource.
+ In XPCOM, there is no equivalent.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="text" type="wstring" readonly="yes">
+ <desc>
+ Text description of the error.
+ <note>
+ In MS COM, it is the same as IErrorInfo::GetDescription.
+ In XPCOM, it is the same as nsIException::message.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="next" type="IVirtualBoxErrorInfo" readonly="yes">
+ <desc>
+ Next error object if there is any, or @c null otherwise.
+ <note>
+ In MS COM, there is no equivalent.
+ In XPCOM, it is the same as nsIException::inner.
+ </note>
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <!--
+ // INATNetwork
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface name="INATNetwork" extends="$unknown"
+ uuid="4fdebbf0-be30-49c0-b315-e9749e1bded1"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="2" reservedAttributes="8"
+ >
+
+ <attribute name="networkName" type="wstring">
+ <desc>
+ TBD: the idea, technically we can start any number of the NAT networks,
+ but we should expect that at some point we will get collisions because of
+ port-forwanding rules. so perhaps we should support only single instance of NAT
+ network.
+ </desc>
+ </attribute>
+ <attribute name="enabled" type="boolean"/>
+ <attribute name="network" type="wstring">
+ <desc>
+ This is CIDR IPv4 string. Specifying it user defines IPv4 addresses
+ of gateway (low address + 1) and DHCP server (= low address + 2).
+ Note: If there are defined IPv4 port-forward rules update of network
+ will be ignored (because new assignment could break existing rules).
+ </desc>
+ </attribute>
+ <attribute name="gateway" type="wstring" readonly="yes">
+ <desc>
+ This attribute is read-only. It's recalculated on changing
+ network attribute (low address of network + 1).
+ </desc>
+ </attribute>
+ <attribute name="IPv6Enabled" type="boolean">
+ <desc>
+ This attribute define whether gateway will support IPv6 or not.
+ </desc>
+ </attribute>
+ <attribute name="IPv6Prefix" type="wstring">
+ <desc>
+ This a CIDR IPv6 defining prefix for link-local addresses
+ autoconfiguration within network. Note: ignored if attribute
+ IPv6Enabled is false.
+ </desc>
+ </attribute>
+ <attribute name="advertiseDefaultIPv6RouteEnabled" type="boolean" dtracename="advertiseDefaultIPv6Route"/>
+ <attribute name="needDhcpServer" type="boolean"/>
+ <attribute name="eventSource" type="IEventSource" readonly="yes"/>
+ <attribute name="portForwardRules4" type="wstring" readonly="yes" safearray="yes">
+ <desc>Array of NAT port-forwarding rules in string representation,
+ in the following format:
+ "name:protocolid:[host ip]:host port:[guest ip]:guest port".
+ </desc>
+ </attribute>
+ <attribute name="localMappings" type="wstring" readonly="yes" safearray="yes">
+ <desc>Array of mappings (address,offset),e.g. ("127.0.1.1=4") maps 127.0.1.1 to networkid + 4.
+ </desc>
+ </attribute>
+
+ <method name="addLocalMapping">
+ <rest request="post" path="/natnetworks/{networkid}/configuration/"/>
+ <desc>
+ </desc>
+ <param name="hostid" type="wstring" dir="in"/>
+ <param name="offset" type="long" dir="in"/>
+ </method>
+
+ <attribute name="loopbackIp6" type="long">
+ <desc>Offset in ipv6 network from network id for address mapped into loopback6 interface of the host.
+ </desc>
+ </attribute>
+
+ <attribute name="portForwardRules6" type="wstring" readonly="yes" safearray="yes">
+ <desc>Array of NAT port-forwarding rules in string representation, in the
+ following format: "name:protocolid:[host ip]:host port:[guest ip]:guest port".
+ </desc>
+ </attribute>
+ <method name="addPortForwardRule">
+ <rest request="post" path="/natnetworks/{networkid}/configuration/"/>
+ <param name="isIpv6" type="boolean" dir="in"/>
+ <param name="ruleName" type="wstring" dir="in"/>
+ <param name="proto" type="NATProtocol" dir="in">
+ <desc>Protocol handled with the rule.</desc>
+ </param>
+ <param name="hostIP" type="wstring" dir="in">
+ <desc>IP of the host interface to which the rule should apply.
+ An empty ip address is acceptable, in which case the NAT engine
+ binds the handling socket to any interface.
+ </desc>
+ </param>
+ <param name="hostPort" type="unsigned short" dir="in">
+ <desc>The port number to listen on.</desc>
+ </param>
+ <param name="guestIP" type="wstring" dir="in">
+ <desc>The IP address of the guest which the NAT engine will forward
+ matching packets to. An empty IP address is not acceptable.</desc>
+ </param>
+ <param name="guestPort" type="unsigned short" dir="in">
+ <desc>The port number to forward.</desc>
+ </param>
+ </method>
+ <method name="removePortForwardRule">
+ <rest request="post" path="/natnetworks/{networkid}/configuration/"/>
+ <param name="isIpv6" type="boolean" dir="in"/>
+ <param name="ruleName" type="wstring" dir="in"/>
+ </method>
+ <method name="start">
+ <rest request="post" path="/natnetworks/{networkid}/actions/"/>
+ </method>
+ <method name="stop">
+ <rest request="post" path="/natnetworks/{networkid}/actions/"/>
+ </method>
+ </interface>
+
+
+ <!--
+ // ICloudNetwork
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface name="ICloudNetwork" extends="$unknown"
+ uuid="d8e3496e-735f-4fde-8a54-427d49409b5f"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="12"
+ >
+
+ <attribute name="networkName" type="wstring">
+ <desc>
+ TBD: User-friendly, descriptive name of cloud subnet. For example, domain
+ names of subnet and vcn, separated by dot.
+ </desc>
+ </attribute>
+ <attribute name="enabled" type="boolean"/>
+ <attribute name="provider" type="wstring">
+ <desc>
+ Cloud provider short name.
+ </desc>
+ </attribute>
+ <attribute name="profile" type="wstring">
+ <desc>
+ Cloud profile name.
+ </desc>
+ </attribute>
+ <attribute name="networkId" type="wstring">
+ <desc>
+ Cloud network id.
+ </desc>
+ </attribute>
+ </interface>
+
+ <!--
+ // IHostOnlyNetwork
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface name="IHostOnlyNetwork" extends="$unknown"
+ uuid="6eb5de7d-9a67-4fde-83be-f768084d03b5"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+
+ <attribute name="networkName" type="wstring">
+ <desc>
+ TBD: User-friendly, descriptive name of host-only network. For example,
+ "Host-only network 192.168.56.0".
+ </desc>
+ </attribute>
+ <attribute name="enabled" type="boolean"/>
+ <attribute name="networkMask" type="wstring">
+ <desc>
+ specifies network mask
+ </desc>
+ </attribute>
+
+ <attribute name="hostIP" type="wstring" readonly="yes">
+ <desc>
+ host IP address, which usually is the lower IP address of DHCP range.
+ </desc>
+ </attribute>
+
+ <attribute name="lowerIP" type="wstring">
+ <desc>
+ specifies from IP address in DHCP address range
+ </desc>
+ </attribute>
+
+ <attribute name="upperIP" type="wstring">
+ <desc>
+ specifies to IP address in DHCP address range
+ </desc>
+ </attribute>
+
+ <attribute name="id" type="uuid" mod="string">
+ <desc>
+ Host-only network ID.
+ </desc>
+ </attribute>
+ </interface>
+
+ <!--
+ // IDHCPServer and associates
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="DHCPOption"
+ uuid="00f5b10f-0021-4513-00f7-5bf4000982bf">
+ <!-- Names should exactly match those given in DhcpOptions.h.
+ Everything must be documented properly.
+
+ Note! We use these descriptions in the VBoxManage man page / manual.
+ When making changes remember to regenerate the man page bits:
+ kmk -C doc/manual dhcpoptions
+ -->
+ <const name="SubnetMask" value="1"><desc>IPv4 netmask. Set to <link to="IDHCPServer::networkMask"/> by default.</desc></const>
+ <const name="TimeOffset" value="2"><desc>UTC offset in seconds (32-bit decimal value).</desc></const>
+ <const name="Routers" value="3"><desc>Space separated list of IPv4 router addresses.</desc></const>
+ <const name="TimeServers" value="4"><desc>Space separated list of IPv4 time server (RFC 868) addresses.</desc></const>
+ <const name="NameServers" value="5"><desc>Space separated list of IPv4 name server (IEN 116) addresses.</desc></const>
+ <const name="DomainNameServers" value="6"><desc>Space separated list of IPv4 DNS addresses.</desc></const>
+ <const name="LogServers" value="7"><desc>Space separated list of IPv4 log server addresses.</desc></const>
+ <const name="CookieServers" value="8"><desc>Space separated list of IPv4 cookie server (RFC 865) addresses.</desc></const>
+ <const name="LPRServers" value="9"><desc>Space separated list of IPv4 line printer server (RFC 1179) addresses.</desc></const>
+ <const name="ImpressServers" value="10"><desc>Space separated list of IPv4 imagen impress server addresses.</desc></const>
+ <const name="ResourseLocationServers" value="11"><desc>Space separated list of IPv4 resource location (RFC 887) addresses.</desc></const>
+ <const name="HostName" value="12"><desc>The client name. See RFC 1035 for character limits. </desc></const>
+ <const name="BootFileSize" value="13"><desc>Number of 512 byte blocks making up the boot file (16-bit decimal value).</desc></const>
+ <const name="MeritDumpFile" value="14"><desc>Client core file.</desc></const>
+ <const name="DomainName" value="15"><desc>Domain name for the client.</desc></const>
+ <const name="SwapServer" value="16"><desc>IPv4 address of the swap server that the client should use.</desc></const>
+ <const name="RootPath" value="17"><desc>The path to the root disk the client should use.</desc></const>
+ <const name="ExtensionPath" value="18"><desc>Path to a file containing additional DHCP options (RFC2123).</desc></const>
+ <const name="IPForwarding" value="19"><desc>Whether IP forwarding should be enabled by the client (boolean).</desc></const>
+ <const name="OptNonLocalSourceRouting" value="20"><desc>Whether non-local datagrams should be forwarded by the client (boolean)</desc></const>
+ <const name="PolicyFilter" value="21"><desc>List of IPv4 addresses and masks paris controlling non-local source routing.</desc></const>
+ <const name="MaxDgramReassemblySize" value="22"><desc>The maximum datagram size the client should reassemble (16-bit decimal value).</desc></const>
+ <const name="DefaultIPTTL" value="23"><desc>The default time-to-leave on outgoing (IP) datagrams (8-bit decimal value).</desc></const>
+ <const name="PathMTUAgingTimeout" value="24"><desc>RFC1191 path MTU discovery timeout value in seconds (32-bit decimal value).</desc></const>
+ <const name="PathMTUPlateauTable" value="25"><desc>RFC1191 path MTU discovery size table, sorted in ascending order (list of 16-bit decimal values).</desc></const>
+ <const name="InterfaceMTU" value="26"><desc>The MTU size for the interface (16-bit decimal value).</desc></const>
+ <const name="AllSubnetsAreLocal" value="27"><desc>Indicates whether the MTU size is the same for all subnets (boolean).</desc></const>
+ <const name="BroadcastAddress" value="28"><desc>Broadcast address (RFC1122) for the client to use (IPv4 address).</desc></const>
+ <const name="PerformMaskDiscovery" value="29"><desc>Whether to perform subnet mask discovery via ICMP (boolean).</desc></const>
+ <const name="MaskSupplier" value="30"><desc>Whether to respond to subnet mask requests via ICMP (boolean).</desc></const>
+ <const name="PerformRouterDiscovery" value="31"><desc>Whether to perform router discovery (RFC1256) (boolean).</desc></const>
+ <const name="RouterSolicitationAddress" value="32"><desc>Where to send router solicitation requests (RFC1256) (IPv4 address).</desc></const>
+ <const name="StaticRoute" value="33"><desc>List of network and router address pairs addresses.</desc></const>
+ <const name="TrailerEncapsulation" value="34"><desc>Whether to negotiate the use of trailers for ARP (RTF893) (boolean).</desc></const>
+ <const name="ARPCacheTimeout" value="35"><desc>The timeout in seconds for ARP cache entries (32-bit decimal value).</desc></const>
+ <const name="EthernetEncapsulation" value="36"><desc>Whether to use IEEE 802.3 (RTF1042) rather than of v2 (RFC894) ethernet encapsulation (boolean).</desc></const>
+ <const name="TCPDefaultTTL" value="37"><desc>Default time-to-live for TCP sends (non-zero 8-bit decimal value).</desc></const>
+ <const name="TCPKeepaliveInterval" value="38"><desc>The interface in seconds between TCP keepalive messages (32-bit decimal value).</desc></const>
+ <const name="TCPKeepaliveGarbage" value="39"><desc>Whether to include a byte of garbage in TCP keepalive messages for backward compatibility (boolean).</desc></const>
+ <const name="NISDomain" value="40"><desc>The NIS (Sun Network Information Services) domain name (string).</desc></const>
+ <const name="NISServers" value="41"><desc>Space separated list of IPv4 NIS server addresses.</desc></const>
+ <const name="NTPServers" value="42"><desc>Space separated list of IPv4 NTP (RFC1035) server addresses.</desc></const>
+ <const name="VendorSpecificInfo" value="43"><desc>Vendor specific information. Only accessible using <link to="DHCPOptionEncoding_Hex"/>.</desc></const>
+ <const name="NetBIOSNameServers" value="44"><desc>Space separated list of IPv4 NetBIOS name server (NBNS) addresses (RFC1001,RFC1002).</desc></const>
+ <const name="NetBIOSDatagramServers" value="45"><desc>Space separated list of IPv4 NetBIOS datagram distribution server (NBDD) addresses (RFC1001,RFC1002).</desc></const>
+ <const name="NetBIOSNodeType" value="46"><desc>NetBIOS node type (RFC1001,RFC1002): 1=B-node, 2=P-node, 4=M-node, and 8=H-node (8-bit decimal value).</desc></const>
+ <const name="NetBIOSScope" value="47"><desc>NetBIOS scope (RFC1001,RFC1002). Only accessible using <link to="DHCPOptionEncoding_Hex"/>.</desc></const>
+ <const name="XWindowsFontServers" value="48"><desc>Space separated list of IPv4 X windows font server addresses.</desc></const>
+ <const name="XWindowsDisplayManager" value="49"><desc>Space separated list of IPv4 X windows display manager addresses.</desc></const>
+ <!-- Options 50 thru 59 are considered DHCP internal and currently not settable. -->
+ <const name="NetWareIPDomainName" value="62"><desc>Netware IP domain name (RFC2242) (string).</desc></const>
+ <const name="NetWareIPInformation" value="63"><desc>Netware IP information (RFC2242). Only accessible using <link to="DHCPOptionEncoding_Hex"/>.</desc></const>
+ <const name="NISPlusDomain" value="64"><desc>The NIS+ domain name (string).</desc></const>
+ <const name="NISPlusServers" value="65"><desc>Space separated list of IPv4 NIS+ server addresses.</desc></const>
+ <const name="TFTPServerName" value="66"><desc>TFTP server name (string).</desc></const>
+ <const name="BootfileName" value="67"><desc>Bootfile name (string).</desc></const>
+ <const name="MobileIPHomeAgents" value="68"><desc>Space separated list of IPv4 mobile IP agent addresses.</desc></const>
+ <const name="SMTPServers" value="69"><desc>Space separated list of IPv4 simple mail transport protocol (SMPT) server addresses.</desc></const>
+ <const name="POP3Servers" value="70"><desc>Space separated list of IPv4 post office protocol 3 (POP3) server addresses.</desc></const>
+ <const name="NNTPServers" value="71"><desc>Space separated list of IPv4 network news transport protocol (NTTP) server addresses.</desc></const>
+ <const name="WWWServers" value="72"><desc>Space separated list of default IPv4 world wide web (WWW) server addresses.</desc></const>
+ <const name="FingerServers" value="73"><desc>Space separated list of default IPv4 finger server addresses.</desc></const>
+ <const name="IRCServers" value="74"><desc>Space separated list of default IPv4 internet relay chat (IRC) server addresses.</desc></const>
+ <const name="StreetTalkServers" value="75"><desc>Space separated list of IPv4 StreetTalk server addresses.</desc></const>
+ <const name="STDAServers" value="76"><desc>Space separated list of IPv4 StreetTalk directory assistance (STDA) server addresses.</desc></const>
+ <!-- 77 is client only -->
+ <const name="SLPDirectoryAgent" value="78"><desc>Addresses of one or more service location protocol (SLP) directory agent, and an indicator of whether their use is mandatory. Only accessible using <link to="DHCPOptionEncoding_Hex"/>.</desc></const>
+ <const name="SLPServiceScope" value="79"><desc>List of service scopes for the service location protocol (SLP) and whether using the list is mandator. Only accessible using <link to="DHCPOptionEncoding_Hex"/>.</desc></const>
+ <!-- 80 is client only -->
+ <const name="DomainSearch" value="119"><desc>Domain search list, see RFC3397 and section 4.1.4 in RFC1035 for encoding. Only accessible using <link to="DHCPOptionEncoding_Hex"/>.</desc></const>
+ </enum>
+
+ <enum
+ name="DHCPOptionEncoding"
+ uuid="84b6d460-2838-4682-c0d6-ef5b573ef28a">
+ <const name="Normal" value="0">
+ <desc>Value format is specific to the option and generally user friendly.</desc>
+ </const>
+ <const name="Hex" value="1">
+ <desc>Value format is a series of hex bytes (<tt>09314f3200fe</tt>),
+ optionally colons as byte separators (<tt>9:31:4f:32::fe</tt>).</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="DHCPConfigScope"
+ uuid="469c42e4-b9ec-43f2-bdcb-9e9d1eb434ae">
+ <const name="Global" value="0"><desc><link to="IDHCPServer::globalConfig"/></desc></const>
+ <const name="Group" value="1"><desc><link to="IDHCPServer::groupConfigs"/></desc></const>
+ <const name="MachineNIC" value="2"><desc><link to="IDHCPServer::individualConfigs"/></desc></const>
+ <const name="MAC" value="3"><desc><link to="IDHCPServer::individualConfigs"/></desc></const>
+ </enum>
+
+ <enum
+ name="DHCPGroupConditionType"
+ uuid="2cb9280f-ada2-4194-dee8-bfb8ad77119d"
+ >
+ <const name="MAC" value="0"><desc>MAC address</desc></const>
+ <const name="MACWildcard" value="1"><desc>MAC address wildcard pattern.</desc></const>
+ <const name="vendorClassID" value="2"><desc>Vendor class ID</desc></const>
+ <const name="vendorClassIDWildcard" value="3"><desc>Vendor class ID wildcard pattern.</desc></const>
+ <const name="userClassID" value="4"><desc>User class ID</desc></const>
+ <const name="userClassIDWildcard" value="5"><desc>User class ID wildcard pattern.</desc></const>
+ </enum>
+
+ <interface
+ name="IDHCPServer" extends="$unknown"
+ uuid="cadef0a2-a1a9-4ac2-8e80-c049af69dac8"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="0" reservedAttributes="3"
+ >
+ <desc>
+ The IDHCPServer interface represents the VirtualBox DHCP server configuration.
+
+ To enumerate all the DHCP servers on the host, use the
+ <link to="IVirtualBox::DHCPServers"/> attribute.
+ </desc>
+ <!-- We want to keep our "real" servers updated about configuration changes -->
+ <attribute name="eventSource" type="IEventSource" readonly="yes"/>
+ <attribute name="enabled" type="boolean">
+ <desc>
+ specifies if the DHCP server is enabled
+ </desc>
+ </attribute>
+
+ <attribute name="IPAddress" type="wstring" readonly="yes">
+ <desc>
+ specifies server IP
+ </desc>
+ </attribute>
+
+ <attribute name="networkMask" type="wstring" readonly="yes">
+ <desc>
+ specifies server network mask
+ </desc>
+ </attribute>
+
+ <attribute name="networkName" type="wstring" readonly="yes">
+ <desc>
+ specifies internal network name the server is used for
+ </desc>
+ </attribute>
+
+ <attribute name="lowerIP" type="wstring" readonly="yes">
+ <desc>
+ specifies from IP address in server address range
+ </desc>
+ </attribute>
+
+ <attribute name="upperIP" type="wstring" readonly="yes">
+ <desc>
+ specifies to IP address in server address range
+ </desc>
+ </attribute>
+
+ <attribute name="globalConfig" type="IDHCPGlobalConfig" readonly="yes">
+ <desc>Global configuration that applies to all clients.</desc>
+ </attribute>
+
+ <attribute name="groupConfigs" type="IDHCPGroupConfig" safearray="yes" readonly="yes">
+ <desc>Configuration groups that applies to selected clients, selection is flexible.</desc>
+ </attribute>
+
+ <attribute name="individualConfigs" type="IDHCPIndividualConfig" safearray="yes" readonly="yes">
+ <desc>Individual NIC configurations either by MAC address or VM + NIC number.</desc>
+ </attribute>
+
+ <!-- VM-slot settings
+ It's corresponds to dhcpd.conf entries, like:
+
+ host ncd1 { hardware ethernet 0:c0:c3:11:90:23; }
+
+ - in Main we can match (vm name, slot) to ethernet address
+ that why it's easy to configure dhcp server in such way,
+ then ask user to to enter valid name,
+
+ - mac address might change because of adapter type (e1k <-> pcnet) or because
+ of import/export
+
+ - it's easy to provide vm-name.rom in boot filename VM with network boot.
+
+ XXX: do we need classic getOptionValueByMAC?
+
+ XML: O-o-oh, this settings are per VM, so perhaps they should be stored in
+ VM configuration files. And we haven't got the attachment type for
+ NATNetwork.
+ -->
+ <method name="setConfiguration">
+ <rest request="post" path="/dhcpservers/{serverid}/configuration/"/>
+ <desc>
+ configures the server
+ <result name="E_INVALIDARG">
+ invalid configuration supplied
+ </result>
+ </desc>
+ <param name="IPAddress" type="wstring" dir="in">
+ <desc>
+ server IP address
+ </desc>
+ </param>
+ <param name="networkMask" type="wstring" dir="in">
+ <desc>
+ server network mask
+ </desc>
+ </param>
+ <param name="FromIPAddress" type="wstring" dir="in">
+ <desc>
+ server From IP address for address range
+ </desc>
+ </param>
+ <param name="ToIPAddress" type="wstring" dir="in">
+ <desc>
+ server To IP address for address range
+ </desc>
+ </param>
+ </method>
+
+ <method name="start">
+ <rest request="post" path="/dhcpservers/{serverid}/actions/"/>
+ <desc>
+ Starts DHCP server process.
+ <result name="E_FAIL">
+ Failed to start the process.
+ </result>
+ </desc>
+ <param name="trunkName" type="wstring" dir="in">
+ <desc>
+ Name of internal network trunk.
+ </desc>
+ </param>
+ <param name="trunkType" type="wstring" dir="in">
+ <desc>
+ Type of internal network trunk.
+ </desc>
+ </param>
+ </method>
+
+ <method name="stop">
+ <rest request="post" path="/dhcpservers/{serverid}/actions/"/>
+ <desc>
+ Stops DHCP server process.
+ <result name="E_FAIL">
+ Failed to stop the process.
+ </result>
+ </desc>
+ </method>
+
+ <method name="restart">
+ <rest request="post" path="/dhcpservers/{serverid}/actions/"/>
+ <desc>
+ Restart running DHCP server process.
+ <result name="E_FAIL">
+ Failed to restart the process.
+ </result>
+ </desc>
+ </method>
+
+ <method name="findLeaseByMAC">
+ <desc>
+ Queries the persistent lease database by MAC address.
+
+ This is handy if the host wants to connect to a server running inside
+ a VM on a host only network.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">If MAC address not in the database.</result>
+ <result name="VBOX_E_FILE_ERROR">If not able to read the lease database file.</result>
+ </desc>
+ <param name="mac" type="wstring" dir="in">
+ <desc>The MAC address to look up.</desc>
+ </param>
+ <param name="type" type="long" dir="in">
+ <desc>Reserved, MBZ.</desc>
+ </param>
+ <param name="address" type="wstring" dir="out">
+ <desc>The assigned address.</desc>
+ </param>
+ <param name="state" type="wstring" dir="out">
+ <desc>The lease state.</desc>
+ </param>
+ <param name="issued" type="long long" dir="out">
+ <desc>Timestamp of when the lease was issued, in seconds since 1970-01-01 UTC.</desc>
+ </param>
+ <param name="expire" type="long long" dir="out">
+ <desc>Timestamp of when the lease expires/expired, in seconds since 1970-01-01 UTC.</desc>
+ </param>
+ </method>
+
+ <method name="getConfig">
+ <rest request="get" path="/dhcpservers/{serverid}/configuration/"/>
+ <desc>
+ Gets or adds a configuration.
+ </desc>
+ <param name="scope" dir="in" type="DHCPConfigScope">
+ <desc>The kind of configuration being sought or added.</desc>
+ </param>
+ <param name="name" dir="in" type="wstring">
+ <desc>
+ Meaning depends on the @a scope:
+ - Ignored when the @a scope is <link to="DHCPConfigScope_Global"/>.
+ - A VM name or UUID for <link to="DHCPConfigScope_MachineNIC"/>.
+ - A MAC address for <link to="DHCPConfigScope_MAC"/>.
+ - A group name for <link to="DHCPConfigScope_Group"/>.
+ </desc>
+ </param>
+ <param name="slot" dir="in" type="unsigned long">
+ <desc>The NIC slot when @a scope is set to <link to="DHCPConfigScope_MachineNIC"/>,
+ must be zero for all other scope values.
+ </desc>
+ </param>
+ <param name="mayAdd" dir="in" type="boolean">
+ <desc>
+ Set to @c TRUE if the configuration should be added if not found.
+ If set to @c FALSE the method will fail with VBOX_E_OBJECT_NOT_FOUND.
+ </desc>
+ </param>
+ <param name="config" dir="return" type="IDHCPConfig">
+ <desc>The requested configuration.</desc>
+ </param>
+ </method>
+
+ <!-- @todo Add variant of queryLeaseByMac that goes by VM name and optionally slot. -->
+ <!-- @todo Add lease database attribute (readonly) -->
+
+ </interface>
+
+ <interface
+ name="IDHCPConfig" extends="$unknown"
+ uuid="00f4a8dc-0002-4b81-0077-1dcb004571ba"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="8" reservedAttributes="16"
+ >
+ <desc>
+ The DHCP server has several configuration levels: global, group and
+ individual MAC. This interface implements the settings common to
+ each level.
+ </desc>
+
+ <attribute name="scope" type="DHCPConfigScope" readonly="yes">
+ <desc>
+ Indicates the kind of config this is (mostly for IDHCPIndividualConfig).
+ </desc>
+ </attribute>
+
+ <attribute name="minLeaseTime" type="unsigned long">
+ <desc>The minimum lease time in seconds, ignored if zero.</desc>
+ </attribute>
+ <attribute name="defaultLeaseTime" type="unsigned long">
+ <desc>The default lease time in seconds, ignored if zero.</desc>
+ </attribute>
+ <attribute name="maxLeaseTime" type="unsigned long">
+ <desc>The maximum lease time in seconds, ignored if zero.</desc>
+ </attribute>
+
+ <attribute name="forcedOptions" type="DHCPOption" safearray="yes">
+ <desc>List of DHCP options which should be forced upon the clients in this
+ config scope when they are available, whether the clients asks for them
+ or not.</desc>
+ </attribute>
+
+ <attribute name="suppressedOptions" type="DHCPOption" safearray="yes">
+ <desc>List of DHCP options which should not be sent to the clients in
+ this config scope. This is intended for cases where one client or a
+ group of clients shouldn't see one or more (typically global) options.</desc>
+ </attribute>
+
+ <method name="setOption">
+ <desc>
+ Sets a DHCP option.
+ </desc>
+ <param name="option" dir="in" type="DHCPOption">
+ <desc>The DHCP option.</desc>
+ </param>
+ <param name="encoding" dir="in" type="DHCPOptionEncoding">
+ <desc>The value encoding.</desc>
+ </param>
+ <param name="value" dir="in" type="wstring">
+ <desc>The DHCP option value. The exact format depends on the DHCP
+ @a option value and @a encoding, see see <link to="DHCPOption"/>
+ for the <link to="DHCPOptionEncoding_Normal"/> format.
+ </desc>
+ </param>
+ </method>
+
+ <method name="removeOption">
+ <desc>Removes the given DHCP option.</desc>
+ <param name="option" dir="in" type="DHCPOption"/>
+ </method>
+
+ <method name="removeAllOptions">
+ <desc>
+ Removes all the options.
+
+ One exception here is the DhcpOpt_SubnetMask option in the global scope
+ that is linked to the <link to="IDHCPServer::networkMask"/> attribute
+ and therefore cannot be removed.
+ </desc>
+ </method>
+
+ <method name="getOption">
+ <desc>Gets the value of a single DHCP option.</desc>
+ <param name="option" dir="in" type="DHCPOption">
+ <desc>The DHCP option being sought.</desc>
+ </param>
+ <param name="encoding" dir="out" type="DHCPOptionEncoding">
+ <desc>The value encoding.</desc>
+ </param>
+ <param name="value" dir="return" type="wstring">
+ <desc>The value of the requested DHCP option. The exact format depends on
+ the DHCP @a option value and the @a encoding, see <link to="DHCPOption"/>
+ for the <link to="DHCPOptionEncoding_Normal"/> format.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getAllOptions">
+ <desc>Gets all DHCP options and their values</desc>
+ <param name="options" dir="out" type="DHCPOption" safearray="yes">
+ <desc>Array containing the DHCP option numbers.</desc>
+ </param>
+ <param name="encodings" dir="out" type="DHCPOptionEncoding" safearray="yes">
+ <desc>Array of value encodings that runs parallel to @a options.</desc>
+ </param>
+ <param name="values" dir="return" type="wstring" safearray="yes">
+ <desc>Array of values that runs parallel to @a options and @a encodings. The
+ format depends on both of those.
+ </desc>
+ </param>
+ </method>
+
+ <method name="remove">
+ <desc>
+ Remove this group or individual configuration.
+ Will of course not work on global configurations.
+ </desc>
+ </method>
+
+ </interface>
+
+ <interface
+ name="IDHCPGlobalConfig" extends="IDHCPConfig"
+ uuid="46735de7-f4c4-4020-a185-0d2881bcfa8b"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="4"
+ >
+ <desc>
+ The global DHCP server configuration, see <link to="IDHCPServer::globalConfig"/>.
+ </desc>
+
+ </interface>
+
+ <interface
+ name="IDHCPGroupCondition" extends="$unknown"
+ uuid="5ca9e537-5a1d-43f1-6f27-6a0db298a9a8"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="3" reservedAttributes="3"
+ >
+ <attribute name="inclusive" type="boolean">
+ <desc>Whether this is an inclusive or exclusive group membership condition</desc>
+ </attribute>
+ <attribute name="type" type="DHCPGroupConditionType">
+ <desc>Defines how the <link to="IDHCPGroupCondition::value"/> is interpreted.</desc>
+ </attribute>
+ <attribute name="value" type="wstring">
+ <desc>The condition value.</desc>
+ </attribute>
+ <method name="remove">
+ <desc>Remove this condition from the group.</desc>
+ </method>
+ </interface>
+
+ <interface
+ name="IDHCPGroupConfig" extends="IDHCPConfig"
+ uuid="537707f7-ebf9-4d5c-7aea-877bfc4256ba"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="8" reservedAttributes="8"
+ >
+ <desc>
+ A configuration that applies to a group of NICs.
+ </desc>
+
+ <attribute name="name" type="wstring">
+ <desc>The group name.</desc>
+ </attribute>
+
+ <attribute name="conditions" type="IDHCPGroupCondition" safearray="yes" readonly="yes">
+ <desc>
+ Group membership conditions.
+
+ Add new conditions by calling <link to="IDHCPGroupConfig::addCondition"/>
+ and use <link to="IDHCPGroupCondition::remove"/> to remove.
+ </desc>
+ </attribute>
+
+ <method name="addCondition">
+ <desc>Adds a new condition.</desc>
+ <param name="inclusive" dir="in" type="boolean"/>
+ <param name="type" dir="in" type="DHCPGroupConditionType"/>
+ <param name="value" dir="in" type="wstring"/>
+ <param name="condition" dir="return" type="IDHCPGroupCondition"/>
+ </method>
+
+ <method name="removeAllConditions">
+ <desc>Removes all conditions.</desc>
+ </method>
+
+ </interface>
+
+ <interface
+ name="IDHCPIndividualConfig" extends="IDHCPConfig"
+ uuid="c40c2b86-73a5-46cc-8227-93fe57d006a6"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="8" reservedAttributes="8"
+ >
+ <desc>
+ Configuration for a single NIC, either given directly by MAC address or by
+ VM + adaptor slot number.
+ </desc>
+
+ <attribute name="MACAddress" type="wstring" readonly="yes">
+ <desc>
+ The MAC address. If a <link to="DHCPConfigScope_MachineNIC"/> config, this
+ will be queried via the VM ID.
+ </desc>
+ </attribute>
+
+ <attribute name="machineId" type="uuid" mod="string" readonly="yes">
+ <desc>
+ The virtual machine ID if a <link to="DHCPConfigScope_MachineNIC"/> config,
+ null UUID for <link to="DHCPConfigScope_MAC"/>.
+ </desc>
+ </attribute>
+
+ <attribute name="slot" type="unsigned long" readonly="yes">
+ <desc>The NIC slot number of the VM if a <link to="DHCPConfigScope_MachineNIC"/> config.</desc>
+ </attribute>
+
+ <attribute name="fixedAddress" type="wstring">
+ <desc>Fixed IPv4 address assignment, dynamic if empty.</desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IVirtualBox" extends="$unknown"
+ uuid="7682d5eb-f00e-44f1-8ca2-99d08b1cd607"
+ wsmap="managed"
+ rest="managed"
+ wrap-gen-hook="yes"
+ reservedMethods="8" reservedAttributes="12"
+ >
+ <desc>
+ The IVirtualBox interface represents the main interface exposed by the
+ product that provides virtual machine management.
+
+ An instance of IVirtualBox is required for the product to do anything
+ useful. Even though the interface does not expose this, internally,
+ IVirtualBox is implemented as a singleton and actually lives in the
+ process of the VirtualBox server (VBoxSVC.exe). This makes sure that
+ IVirtualBox can track the state of all virtual machines on a particular
+ host, regardless of which frontend started them.
+
+ To enumerate all the virtual machines on the host, use the
+ <link to="IVirtualBox::machines"/> attribute.
+
+ Error information handling is a bit special with IVirtualBox: creating
+ an instance will always succeed. The return of the actual error
+ code/information is postponed to any attribute or method call. The
+ reason for this is that COM likes to mutilate the error code and lose
+ the detailed error information returned by instance creation.
+ </desc>
+
+ <attribute name="version" type="wstring" readonly="yes">
+ <desc>
+ A string representing the version number of the product. The
+ format is 3 integer numbers divided by dots (e.g. 1.0.1). The
+ last number represents the build number and will frequently change.
+
+ This may be followed by a _ALPHA[0-9]*, _BETA[0-9]* or _RC[0-9]* tag
+ in prerelease builds. Non-Oracle builds may (/shall) also have a
+ publisher tag, at the end. The publisher tag starts with an underscore
+ just like the prerelease build type tag.
+ </desc>
+ </attribute>
+
+ <attribute name="versionNormalized" type="wstring" readonly="yes">
+ <desc>
+ A string representing the version number of the product,
+ without the publisher information (but still with other tags).
+ See <link to="#version" />.
+ </desc>
+ </attribute>
+
+ <attribute name="revision" type="unsigned long" readonly="yes">
+ <desc>
+ The internal build revision number of the product.
+ </desc>
+ </attribute>
+
+ <attribute name="packageType" type="wstring" readonly="yes">
+ <desc>
+ A string representing the package type of this product. The
+ format is OS_ARCH_DIST where OS is either WINDOWS, LINUX,
+ SOLARIS, DARWIN. ARCH is either 32BITS or 64BITS. DIST
+ is either GENERIC, UBUNTU_606, UBUNTU_710, or something like
+ this.
+ </desc>
+ </attribute>
+
+ <attribute name="APIVersion" type="wstring" readonly="yes">
+ <desc>
+ A string representing the VirtualBox API version number. The format is
+ 2 integer numbers divided by an underscore (e.g. 1_0). After the
+ first public release of packages with a particular API version the
+ API will not be changed in an incompatible way. Note that this
+ guarantee does not apply to development builds, and also there is no
+ guarantee that this version is identical to the first two integer
+ numbers of the package version.
+ </desc>
+ </attribute>
+
+ <attribute name="APIRevision" type="long long" readonly="yes">
+ <desc>
+ This is mainly intended for the VBox Validation Kit so it can fluently
+ deal with incompatible API changes and new functionality during
+ development (i.e. on trunk).
+
+ The high 7 bits (62:56) is the major version number, the next 8 bits
+ (55:48) are the minor version number, the next 8 bits (47:40) are the
+ build number, and the rest (39:0) is the API revision number.
+
+ The API revision number is manually increased on trunk when making
+ incompatible changes that the validation kit or others needs to be able
+ to detect and cope with dynamically. It can also be used to indicate
+ the presence of new features on both trunk and branches.
+ </desc>
+ </attribute>
+
+ <attribute name="homeFolder" type="wstring" readonly="yes">
+ <desc>
+ Full path to the directory where the global settings file,
+ <tt>VirtualBox.xml</tt>, is stored.
+
+ In this version of VirtualBox, the value of this property is
+ always <tt>&lt;user_dir&gt;/.VirtualBox</tt> (where
+ <tt>&lt;user_dir&gt;</tt> is the path to the user directory,
+ as determined by the host OS), and cannot be changed.
+
+ This path is also used as the base to resolve relative paths in
+ places where relative paths are allowed (unless otherwise
+ expressly indicated).
+ </desc>
+ </attribute>
+
+ <attribute name="settingsFilePath" type="wstring" readonly="yes">
+ <desc>
+ Full name of the global settings file.
+ The value of this property corresponds to the value of
+ <link to="#homeFolder"/> plus <tt>/VirtualBox.xml</tt>.
+ </desc>
+ </attribute>
+
+ <attribute name="host" type="IHost" readonly="yes">
+ <desc>Associated host object.</desc>
+ </attribute>
+
+ <attribute name="systemProperties" type="ISystemProperties" readonly="yes">
+ <desc>Associated system information object.</desc>
+ </attribute>
+
+ <attribute name="machines" type="IMachine" readonly="yes" safearray="yes">
+ <desc>
+ Array of machine objects registered within this VirtualBox instance.
+ </desc>
+ </attribute>
+
+ <attribute name="machineGroups" type="wstring" readonly="yes" safearray="yes">
+ <desc>
+ Array of all machine group names which are used by the machines which
+ are accessible. Each group is only listed once, however they are listed
+ in no particular order and there is no guarantee that there are no gaps
+ in the group hierarchy (i.e. <tt>"/"</tt>, <tt>"/group/subgroup"</tt>
+ is a valid result).
+ </desc>
+ </attribute>
+
+ <attribute name="hardDisks" type="IMedium" readonly="yes" safearray="yes">
+ <desc>
+ Array of medium objects known to this VirtualBox installation.
+
+ This array contains only base media. All differencing
+ media of the given base medium can be enumerated using
+ <link to="IMedium::children"/>.
+ </desc>
+ </attribute>
+
+ <attribute name="DVDImages" type="IMedium" readonly="yes" safearray="yes">
+ <desc>
+ Array of CD/DVD image objects currently in use by this VirtualBox instance.
+ </desc>
+ </attribute>
+
+ <attribute name="floppyImages" type="IMedium" readonly="yes" safearray="yes">
+ <desc>
+ Array of floppy image objects currently in use by this VirtualBox instance.
+ </desc>
+ </attribute>
+
+ <attribute name="progressOperations" type="IProgress" readonly="yes" safearray="yes"/>
+
+ <attribute name="guestOSTypes" type="IGuestOSType" readonly="yes" safearray="yes"/>
+
+ <attribute name="sharedFolders" type="ISharedFolder" readonly="yes" safearray="yes">
+ <desc>
+ Collection of global shared folders. Global shared folders are
+ available to all virtual machines.
+
+ New shared folders are added to the collection using
+ <link to="#createSharedFolder"/>. Existing shared folders can be
+ removed using <link to="#removeSharedFolder"/>.
+
+ <note>
+ In the current version of the product, global shared folders are not
+ implemented and therefore this collection is always empty.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="performanceCollector" type="IPerformanceCollector" readonly="yes">
+ <desc>
+ Associated performance collector object.
+ </desc>
+ </attribute>
+
+ <attribute name="DHCPServers" type="IDHCPServer" safearray="yes" readonly="yes">
+ <desc>
+ DHCP servers.
+ </desc>
+ </attribute>
+ <!-- Array of NAT networks -->
+ <attribute name="NATNetworks" type="INATNetwork" safearray="yes" readonly="yes"/>
+
+ <attribute name="eventSource" type="IEventSource" readonly="yes">
+ <desc>
+ Event source for VirtualBox events.
+ </desc>
+ </attribute>
+
+ <attribute name="extensionPackManager" type="IExtPackManager" readonly="yes">
+ <desc>
+ The extension pack manager.
+ </desc>
+ </attribute>
+
+
+ <attribute name="internalNetworks" type="wstring" safearray="yes" readonly="yes">
+ <desc>
+ Names of all internal networks.
+ </desc>
+ </attribute>
+
+ <attribute name="hostOnlyNetworks" type="IHostOnlyNetwork" safearray="yes" readonly="yes">
+ <desc>
+ Names of all host-only networks.
+ </desc>
+ </attribute>
+
+ <attribute name="genericNetworkDrivers" type="wstring" safearray="yes" readonly="yes">
+ <desc>
+ Names of all generic network drivers.
+ </desc>
+ </attribute>
+
+ <attribute name="cloudNetworks" type="ICloudNetwork" safearray="yes" readonly="yes">
+ <desc>
+ Names of all configured cloud networks.
+ </desc>
+ </attribute>
+
+ <attribute name="cloudProviderManager" type="ICloudProviderManager" readonly="yes">
+ <desc>
+ The cloud provider manager (singleton).
+ </desc>
+ </attribute>
+
+ <method name="composeMachineFilename">
+ <rest request="get" path="/server/methods/"/>
+ <desc>
+ Returns a recommended full path of the settings file name for a new virtual
+ machine.
+
+ This API serves two purposes:
+
+ <ul>
+ <li>It gets called by <link to="#createMachine" /> if @c null or
+ empty string (which is recommended) is specified for the
+ @a settingsFile argument there, which means that API should use
+ a recommended default file name.</li>
+
+ <li>It can be called manually by a client software before creating a machine,
+ e.g. if that client wants to pre-create the machine directory to create
+ virtual hard disks in that directory together with the new machine
+ settings file. In that case, the file name should be stripped from the
+ full settings file path returned by this function to obtain the
+ machine directory.</li>
+ </ul>
+
+ See <link to="IMachine::name"/> and <link to="#createMachine"/> for more
+ details about the machine name.
+
+ @a groupName defines which additional subdirectory levels should be
+ included. It must be either a valid group name or @c null or empty
+ string which designates that the machine will not be related to a
+ machine group.
+
+ If @a baseFolder is a @c null or empty string (which is recommended), the
+ default machine settings folder
+ (see <link to="ISystemProperties::defaultMachineFolder" />) will be used as
+ a base folder for the created machine, resulting in a file name like
+ "/home/user/VirtualBox VMs/name/name.vbox". Otherwise the given base folder
+ will be used.
+
+ This method does not access the host disks. In particular, it does not check
+ for whether a machine with this name already exists.
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Suggested machine name.</desc>
+ </param>
+ <param name="group" type="wstring" dir="in">
+ <desc>Machine group name for the new machine or machine group. It is
+ used to determine the right subdirectory.</desc>
+ </param>
+ <param name="createFlags" type="wstring" dir="in">
+ <desc>Machine creation flags, see <link to="#createMachine" /> (optional).</desc>
+ </param>
+ <param name="baseFolder" type="wstring" dir="in">
+ <desc>Base machine folder (optional).</desc>
+ </param>
+ <param name="file" type="wstring" dir="return">
+ <desc>Fully qualified path where the machine would be created.</desc>
+ </param>
+ </method>
+
+ <method name="createMachine">
+ <rest name="create" request="post" path="/vms/"/>
+ <desc>
+ Creates a new virtual machine by creating a machine settings file at
+ the given location.
+
+ VirtualBox machine settings files use a custom XML dialect. Starting
+ with VirtualBox 4.0, a ".vbox" extension is recommended, but not enforced,
+ and machine files can be created at arbitrary locations.
+
+ However, it is recommended that machines are created in the default
+ machine folder (e.g. "/home/user/VirtualBox VMs/name/name.vbox"; see
+ <link to="ISystemProperties::defaultMachineFolder" />). If you specify
+ @c null or empty string (which is recommended) for the @a settingsFile
+ argument, <link to="#composeMachineFilename" /> is called automatically
+ to have such a recommended name composed based on the machine name
+ given in the @a name argument and the primary group.
+
+ If the resulting settings file already exists, this method will fail,
+ unless the forceOverwrite flag is set.
+
+ The new machine is created unregistered, with the initial configuration
+ set according to the specified guest OS type. A typical sequence of
+ actions to create a new virtual machine is as follows:
+
+ <ol>
+ <li>
+ Call this method to have a new machine created. The returned machine
+ object will be "mutable" allowing to change any machine property.
+ </li>
+
+ <li>
+ Configure the machine using the appropriate attributes and methods.
+ </li>
+
+ <li>
+ Call <link to="IMachine::saveSettings" /> to write the settings
+ to the machine's XML settings file. The configuration of the newly
+ created machine will not be saved to disk until this method is
+ called.
+ </li>
+
+ <li>
+ Call <link to="#registerMachine" /> to add the machine to the list
+ of machines known to VirtualBox.
+ </li>
+ </ol>
+
+ The specified guest OS type identifier must match an ID of one of known
+ guest OS types listed in the <link to="IVirtualBox::guestOSTypes"/>
+ array.
+
+ <note>
+ <link to="IMachine::settingsModified"/> will return
+ @c false for the created machine, until any of machine settings
+ are changed.
+ </note>
+
+ <note>
+ There is no way to change the name of the settings file or
+ subfolder of the created machine directly.
+ </note>
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ @a osTypeId is invalid.
+ </result>
+ <result name="VBOX_E_FILE_ERROR">
+ Resulting settings file name is invalid or the settings file already
+ exists or could not be created due to an I/O error.
+ </result>
+ <result name="E_INVALIDARG">
+ @a name is empty or @c null.
+ </result>
+ </desc>
+
+ <param name="settingsFile" type="wstring" dir="in">
+ <desc>Fully qualified path where the settings file should be created,
+ empty string or @c null for a default folder and file based on the
+ @a name argument and the primary group.
+ (see <link to="#composeMachineFilename" />).</desc>
+ </param>
+ <param name="name" type="wstring" dir="in">
+ <desc>Machine name.</desc>
+ </param>
+ <param name="groups" type="wstring" safearray="yes" dir="in">
+ <desc>Array of group names. @c null or an empty array have the same
+ meaning as an array with just the empty string or <tt>"/"</tt>, i.e.
+ create a machine without group association.</desc>
+ </param>
+ <param name="osTypeId" type="wstring" dir="in">
+ <desc>Guest OS Type ID.</desc>
+ </param>
+ <param name="flags" type="wstring" dir="in">
+ <desc>
+ Additional property parameters, passed as a comma-separated list of
+ "name=value" type entries. The following ones are recognized:
+ <tt>forceOverwrite=1</tt> to overwrite an existing machine settings
+ file, <tt>UUID=&lt;uuid&gt;</tt> to specify a machine UUID and
+ <tt>directoryIncludesUUID=1</tt> to switch to a special VM directory
+ naming scheme which should not be used unless necessary.
+ </desc>
+ </param>
+ <param name="cipher" type="wstring" dir="in">
+ <desc>
+ The cipher. It should be empty if encryption is not required.
+ </desc>
+ </param>
+ <param name="passwordId" type="wstring" dir="in">
+ <desc>
+ The password id. It should be empty if encryption is not required.
+ </desc>
+ </param>
+ <param name="password" type="wstring" dir="in">
+ <desc>
+ The password. It should be empty if encryption is not required.
+ </desc>
+ </param>
+ <param name="machine" type="IMachine" dir="return">
+ <desc>Created machine object.</desc>
+ </param>
+ </method>
+
+ <method name="openMachine">
+ <rest name="open" request="post" path="/vms/{vmid}/actions/"/>
+ <desc>
+ Opens a virtual machine from the existing settings file.
+ The opened machine remains unregistered until you call
+ <link to="#registerMachine"/>.
+
+ The specified settings file name must be fully qualified.
+ The file must exist and be a valid machine XML settings file
+ whose contents will be used to construct the machine object.
+
+ <note>
+ If the VM is encrypted and password is incorrect
+ the method returns success allowing you to register the
+ encrypted machine but it remains in inaccessible state. You
+ can check <link to="IMachine::accessible"/> and
+ <link to="IMachine::accessError"/> properties to determine the
+ real machine state.
+ </note>
+
+ <note>
+ <link to="IMachine::settingsModified"/> will return
+ @c false for the opened machine, until any of machine settings
+ are changed.
+ </note>
+
+ <result name="VBOX_E_FILE_ERROR">
+ Settings file name invalid, not found or sharing violation.
+ </result>
+ </desc>
+ <param name="settingsFile" type="wstring" dir="in">
+ <desc>
+ Name of the machine settings file.
+ </desc>
+ </param>
+ <param name="password" type="wstring" dir="in">
+ <desc>
+ The password. If the machine is not encrypted the parameter is
+ ignored.
+ </desc>
+ </param>
+ <param name="machine" type="IMachine" dir="return">
+ <desc>Opened machine object.</desc>
+ </param>
+ </method>
+
+ <method name="registerMachine">
+ <rest name="register" request="post" path="/vms/{vmid}/actions/"/>
+ <desc>
+
+ Registers the machine previously created using
+ <link to="#createMachine"/> or opened using
+ <link to="#openMachine"/> within this VirtualBox installation. After
+ successful method invocation, the
+ <link to="IMachineRegisteredEvent"/> event is fired.
+
+ <note>
+ This method implicitly calls <link to="IMachine::saveSettings"/>
+ to save all current machine settings before registering it.
+ </note>
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ No matching virtual machine found.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Virtual machine was not created within this VirtualBox instance.
+ </result>
+
+ </desc>
+ <param name="machine" type="IMachine" dir="in"/>
+ </method>
+
+ <method name="findMachine" const="yes">
+ <rest name="find" request="get" path="/vms/{vmid}/"/>
+ <desc>
+ Attempts to find a virtual machine given its name or UUID.
+
+ <note>Inaccessible machines cannot be found by name, only by UUID, because their name
+ cannot safely be determined.</note>
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ Could not find registered machine matching @a nameOrId.
+ </result>
+
+ </desc>
+ <param name="nameOrId" type="wstring" dir="in">
+ <desc>What to search for. This can either be the UUID or the name of a virtual machine.</desc>
+ </param>
+ <param name="machine" type="IMachine" dir="return">
+ <desc>Machine object, if found.</desc>
+ </param>
+ </method>
+
+ <method name="getMachinesByGroups">
+ <rest request="get" path="/server/methods/"/>
+ <desc>
+ Gets all machine references which are in one of the specified groups.
+ </desc>
+ <param name="groups" type="wstring" dir="in" safearray="yes">
+ <desc>What groups to match. The usual group list rules apply, i.e.
+ passing an empty list will match VMs in the toplevel group, likewise
+ the empty string.</desc>
+ </param>
+ <param name="machines" type="IMachine" dir="return" safearray="yes">
+ <desc>All machines which matched.</desc>
+ </param>
+ </method>
+
+ <method name="getMachineStates">
+ <rest request="get" path="/server/methods/"/>
+ <desc>
+ Gets the state of several machines in a single operation.
+ </desc>
+ <param name="machines" type="IMachine" dir="in" safearray="yes">
+ <desc>Array with the machine references.</desc>
+ </param>
+ <param name="states" type="MachineState" dir="return" safearray="yes">
+ <desc>Machine states, corresponding to the machines.</desc>
+ </param>
+ </method>
+
+ <method name="createAppliance">
+ <rest name="create" request="post" path="/appliances/"/>
+ <desc>
+ Creates a new appliance object, which represents an appliance in the Open Virtual Machine
+ Format (OVF). This can then be used to import an OVF appliance into VirtualBox or to export
+ machines as an OVF appliance; see the documentation for <link to="IAppliance" /> for details.
+ </desc>
+ <param name="appliance" type="IAppliance" dir="return">
+ <desc>New appliance.</desc>
+ </param>
+ </method>
+
+ <method name="createUnattendedInstaller">
+ <rest request="post" path="/server/methods/"/>
+ <desc>
+ Creates a new <link to="IUnattended"/> guest installation object. This can be used to
+ analyze an installation ISO to create and configure a new machine for it to be installed
+ on. It can also be used to (re)install an existing machine.
+ </desc>
+ <param name="unattended" type="IUnattended" dir="return">
+ <desc>New unattended object.</desc>
+ </param>
+ </method>
+
+ <method name="createMedium">
+ <rest name="create" request="post" path="/media/"/>
+ <desc>
+ Creates a new base medium object that will use the given storage
+ format and location for medium data.
+
+ The actual storage unit is not created by this method. In order to
+ do it, and before you are able to attach the created medium to
+ virtual machines, you must call one of the following methods to
+ allocate a format-specific storage unit at the specified location:
+ <ul>
+ <li><link to="IMedium::createBaseStorage"/></li>
+ <li><link to="IMedium::createDiffStorage"/></li>
+ </ul>
+
+ Some medium attributes, such as <link to="IMedium::id"/>, may
+ remain uninitialized until the medium storage unit is successfully
+ created by one of the above methods.
+
+ Depending on the given device type, the file at the storage location
+ must be in one of the media formats understood by VirtualBox:
+
+ <ul>
+ <li>With a "HardDisk" device type, the file must be a hard disk image
+ in one of the formats supported by VirtualBox (see
+ <link to="ISystemProperties::mediumFormats" />).
+ After the storage unit is successfully created and this method succeeds,
+ if the medium is a base medium, it
+ will be added to the <link to="#hardDisks"/> array attribute. </li>
+ <li>With a "DVD" device type, the file must be an ISO 9960 CD/DVD image.
+ After this method succeeds, the medium will be added to the
+ <link to="#DVDImages"/> array attribute.</li>
+ <li>With a "Floppy" device type, the file must be an RAW floppy image.
+ After this method succeeds, the medium will be added to the
+ <link to="#floppyImages"/> array attribute.</li>
+ </ul>
+
+ The list of all storage formats supported by this VirtualBox
+ installation can be obtained using
+ <link to="ISystemProperties::mediumFormats"/>. If the @a format
+ attribute is empty or @c null then the default storage format
+ specified by <link to="ISystemProperties::defaultHardDiskFormat"/> will
+ be used for disks r creating a storage unit of the medium.
+
+ Note that the format of the location string is storage format specific.
+ See <link to="IMedium::location"/> and IMedium for more details.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ @a format identifier is invalid. See
+ <link to="ISystemProperties::mediumFormats"/>.
+ </result>
+ <result name="VBOX_E_FILE_ERROR">
+ @a location is a not valid file name (for file-based formats only).
+ </result>
+ </desc>
+ <param name="format" type="wstring" dir="in">
+ <desc>
+ Identifier of the storage format to use for the new medium.
+ </desc>
+ </param>
+ <param name="location" type="wstring" dir="in">
+ <desc>
+ Location of the storage unit for the new medium.
+ </desc>
+ </param>
+ <param name="accessMode" type="AccessMode" dir="in">
+ <desc>Whether to open the image in read/write or read-only mode. For
+ a "DVD" device type, this is ignored and read-only mode is always assumed.</desc>
+ </param>
+ <param name="aDeviceTypeType" type="DeviceType" dir="in">
+ <desc>
+ Must be one of "HardDisk", "DVD" or "Floppy".
+ </desc>
+ </param>
+ <param name="medium" type="IMedium" dir="return">
+ <desc>Created medium object.</desc>
+ </param>
+ </method>
+
+ <method name="openMedium">
+ <rest request="post" path="/server/methods/"/>
+ <desc>
+ Finds existing media or opens a medium from an existing storage location.
+
+ Once a medium has been opened, it can be passed to other VirtualBox
+ methods, in particular to <link to="IMachine::attachDevice" />.
+
+ Depending on the given device type, the file at the storage location
+ must be in one of the media formats understood by VirtualBox:
+
+ <ul>
+ <li>With a "HardDisk" device type, the file must be a hard disk image
+ in one of the formats supported by VirtualBox (see
+ <link to="ISystemProperties::mediumFormats" />).
+ After this method succeeds, if the medium is a base medium, it
+ will be added to the <link to="#hardDisks"/> array attribute. </li>
+ <li>With a "DVD" device type, the file must be an ISO 9960 CD/DVD image.
+ After this method succeeds, the medium will be added to the
+ <link to="#DVDImages"/> array attribute.</li>
+ <li>With a "Floppy" device type, the file must be an RAW floppy image.
+ After this method succeeds, the medium will be added to the
+ <link to="#floppyImages"/> array attribute.</li>
+ </ul>
+
+ After having been opened, the medium can be re-found by this method
+ and can be attached to virtual machines. See <link to="IMedium" /> for
+ more details.
+
+ The UUID of the newly opened medium will either be retrieved from the
+ storage location, if the format supports it (e.g. for hard disk images),
+ or a new UUID will be randomly generated (e.g. for ISO and RAW files).
+ If for some reason you need to change the medium's UUID, use
+ <link to="IMedium::setIds" />.
+
+ If a differencing hard disk medium is to be opened by this method, the
+ operation will succeed only if its parent medium and all ancestors,
+ if any, are already known to this VirtualBox installation (for example,
+ were opened by this method before).
+
+ This method attempts to guess the storage format of the specified medium
+ by reading medium data at the specified location.
+
+ If @a accessMode is ReadWrite (which it should be for hard disks and floppies),
+ the image is opened for read/write access and must have according permissions,
+ as VirtualBox may actually write status information into the disk's metadata
+ sections.
+
+ Note that write access is required for all typical hard disk usage in VirtualBox,
+ since VirtualBox may need to write metadata such as a UUID into the image.
+ The only exception is opening a source image temporarily for copying and
+ cloning (see <link to="IMedium::cloneTo" /> when the image will be closed
+ again soon.
+
+ The format of the location string is storage format specific. See
+ <link to="IMedium::location"/> and IMedium for more details.
+
+ <result name="VBOX_E_FILE_ERROR">
+ Invalid medium storage file location or could not find the medium
+ at the specified location.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ Could not get medium storage format.
+ </result>
+ <result name="E_INVALIDARG">
+ Invalid medium storage format.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Medium has already been added to a media registry.
+ </result>
+ </desc>
+ <param name="location" type="wstring" dir="in">
+ <desc>
+ Location of the storage unit that contains medium data in one of
+ the supported storage formats.
+ </desc>
+ </param>
+ <param name="deviceType" type="DeviceType" dir="in">
+ <desc>
+ Must be one of "HardDisk", "DVD" or "Floppy".
+ </desc>
+ </param>
+ <param name="accessMode" type="AccessMode" dir="in">
+ <desc>Whether to open the image in read/write or read-only mode. For
+ a "DVD" device type, this is ignored and read-only mode is always assumed.</desc>
+ </param>
+ <param name="forceNewUuid" type="boolean" dir="in">
+ <desc>Allows the caller to request a completely new medium UUID for
+ the image which is to be opened. Useful if one intends to open an exact
+ copy of a previously opened image, as this would normally fail due to
+ the duplicate UUID.</desc>
+ </param>
+ <param name="medium" type="IMedium" dir="return">
+ <desc>Opened medium object.</desc>
+ </param>
+ </method>
+
+ <method name="getGuestOSType">
+ <rest request="get" path="/server/methods/"/>
+ <desc>
+ Returns an object describing the specified guest OS type.
+
+ The requested guest OS type is specified using a string which is a
+ mnemonic identifier of the guest operating system, such as
+ <tt>"win31"</tt> or <tt>"ubuntu"</tt>. The guest OS type ID of a
+ particular virtual machine can be read or set using the
+ <link to="IMachine::OSTypeId"/> attribute.
+
+ The <link to="IVirtualBox::guestOSTypes"/> collection contains all
+ available guest OS type objects. Each object has an
+ <link to="IGuestOSType::id"/> attribute which contains an identifier of
+ the guest OS this object describes.
+
+ While this function returns an error for unknown guest OS types, they
+ can be still used without serious problems (if one accepts the fact
+ that there is no default VM config information).
+
+ <result name="E_INVALIDARG">
+ @a id is not a valid Guest OS type.
+ </result>
+
+ </desc>
+ <param name="id" type="wstring" dir="in">
+ <desc>Guest OS type ID string.</desc>
+ </param>
+ <param name="type" type="IGuestOSType" dir="return">
+ <desc>Guest OS type object.</desc>
+ </param>
+ </method>
+
+ <method name="createSharedFolder">
+ <rest name="create" request="post" path="/sharedfolders/"/>
+ <desc>
+ Creates a new global shared folder by associating the given logical
+ name with the given host path, adds it to the collection of shared
+ folders and starts sharing it. Refer to the description of
+ <link to="ISharedFolder"/> to read more about logical names.
+ <note>
+ In the current implementation, this operation is not
+ implemented.
+ </note>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Unique logical name of the shared folder.</desc>
+ </param>
+ <param name="hostPath" type="wstring" dir="in">
+ <desc>Full path to the shared folder in the host file system.</desc>
+ </param>
+ <param name="writable" type="boolean" dir="in">
+ <desc>Whether the share is writable or readonly</desc>
+ </param>
+ <param name="automount" type="boolean" dir="in">
+ <desc>Whether the share gets automatically mounted by the guest
+ or not.</desc>
+ </param>
+ <param name="autoMountPoint" type="wstring" dir="in">
+ <desc>Where the guest should automatically mount the folder, if possible.
+ For Windows and OS/2 guests this should be a drive letter, while other
+ guests it should be a absolute directory.
+ </desc>
+ </param>
+ </method>
+
+ <method name="removeSharedFolder">
+ <rest name="remove" request="delete" path="/sharedfolders/"/>
+ <desc>
+ Removes the global shared folder with the given name previously
+ created by <link to="#createSharedFolder"/> from the collection of
+ shared folders and stops sharing it.
+ <note>
+ In the current implementation, this operation is not
+ implemented.
+ </note>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Logical name of the shared folder to remove.</desc>
+ </param>
+ </method>
+
+ <method name="getExtraDataKeys">
+ <rest request="get" path="/server/methods/"/>
+ <desc>
+ Returns an array representing the global extra data keys which currently
+ have values defined.
+ </desc>
+ <param name="keys" type="wstring" dir="return" safearray="yes">
+ <desc>Array of extra data keys.</desc>
+ </param>
+ </method>
+
+ <method name="getExtraData">
+ <rest request="get" path="/server/methods/"/>
+ <desc>
+ Returns associated global extra data.
+
+ If the requested data @a key does not exist, this function will
+ succeed and return an empty string in the @a value argument.
+
+ <result name="VBOX_E_FILE_ERROR">
+ Settings file not accessible.
+ </result>
+ <result name="VBOX_E_XML_ERROR">
+ Could not parse the settings file.
+ </result>
+
+ </desc>
+ <param name="key" type="wstring" dir="in">
+ <desc>Name of the data key to get.</desc>
+ </param>
+ <param name="value" type="wstring" dir="return">
+ <desc>Value of the requested data key.</desc>
+ </param>
+ </method>
+
+ <method name="setExtraData">
+ <rest request="put" path="/server/methods/"/>
+ <desc>
+ Sets associated global extra data.
+
+ If you pass @c null or an empty string as a key @a value, the given
+ @a key will be deleted.
+
+ <note>
+ Key must contain printable (non-control) UTF-8 characters only.
+ </note>
+ <note>
+ Before performing the actual data change, this method will ask all
+ registered event listeners using the
+ <link to="IExtraDataCanChangeEvent"/>
+ notification for a permission. If one of the listeners refuses the
+ new value, the change will not be performed.
+ </note>
+ <note>
+ On success, the
+ <link to="IExtraDataChangedEvent"/> notification
+ is called to inform all registered listeners about a successful data
+ change.
+ </note>
+
+ <result name="VBOX_E_FILE_ERROR">
+ Settings file not accessible.
+ </result>
+ <result name="VBOX_E_XML_ERROR">
+ Could not parse the settings file.
+ </result>
+ <result name="E_ACCESSDENIED">
+ Modification request refused.
+ </result>
+ <result name="E_INVALIDARG">
+ Key contains invalid characters.
+ </result>
+
+ </desc>
+ <param name="key" type="wstring" dir="in">
+ <desc>Name of the data key to set.</desc>
+ </param>
+ <param name="value" type="wstring" dir="in">
+ <desc>Value to assign to the key.</desc>
+ </param>
+ </method>
+
+ <method name="setSettingsSecret">
+ <desc>
+ Unlocks the secret data by passing the unlock password to the
+ server. The server will cache the password for that machine.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine is not mutable.
+ </result>
+
+ </desc>
+ <param name="password" type="wstring" dir="in">
+ <desc>
+ The cipher key.
+ </desc>
+ </param>
+ </method>
+
+ <!--method name="createDHCPServerForInterface">
+ <desc>
+ Creates a DHCP server settings to be used for the given interface
+ <result name="E_INVALIDARG">
+ Host network interface @a name already exists.
+ </result>
+ </desc>
+ <param name="interface" type="IHostNetworkInterface" dir="in">
+ <desc>Network Interface</desc>
+ </param>
+ <param name="server" type="IDHCPServer" dir="out">
+ <desc>DHCP server settings</desc>
+ </param>
+ </method-->
+
+ <method name="createDHCPServer">
+ <rest name="create" request="post" path="/dhcpservers/"/>
+ <desc>
+ Creates a DHCP server settings to be used for the given internal network name
+ <result name="E_INVALIDARG">
+ Host network interface @a name already exists.
+ </result>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>server name</desc>
+ </param>
+ <param name="server" type="IDHCPServer" dir="return">
+ <desc>DHCP server settings</desc>
+ </param>
+ </method>
+
+ <method name="findDHCPServerByNetworkName">
+ <rest name="find" request="get" path="/dhcpservers/"/>
+ <desc>
+ Searches a DHCP server settings to be used for the given internal network name
+ <result name="E_INVALIDARG">
+ Host network interface @a name already exists.
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>server name</desc>
+ </param>
+ <param name="server" type="IDHCPServer" dir="return">
+ <desc>DHCP server settings</desc>
+ </param>
+ </method>
+
+ <!--method name="findDHCPServerForInterface">
+ <desc>
+ Searches a DHCP server settings to be used for the given interface
+ <result name="E_INVALIDARG">
+ Host network interface @a name already exists.
+ </result>
+ </desc>
+ <param name="interface" type="IHostNetworkInterface" dir="in">
+ <desc>Network Interface</desc>
+ </param>
+ <param name="server" type="IDHCPServer" dir="out">
+ <desc>DHCP server settings</desc>
+ </param>
+ </method-->
+
+ <method name="removeDHCPServer">
+ <rest name="remove" request="delete" path="/dhcpservers/"/>
+ <desc>
+ Removes the DHCP server settings
+ <result name="E_INVALIDARG">
+ Host network interface @a name already exists.
+ </result>
+ </desc>
+ <param name="server" type="IDHCPServer" dir="in">
+ <desc>DHCP server settings to be removed</desc>
+ </param>
+ </method>
+
+ <!-- bunch of methods to create NAT -->
+ <method name="createNATNetwork">
+ <!-- Here we create a record in NAT network array with name
+ and gateway/network parameters this information should
+ be enough for VBoxNetNAT and VBoxNetDHCP for
+ servicing the guests.
+ -->
+ <rest name="create" request="post" path="/natnetworks/"/>
+ <param name="networkName" type="wstring" dir="in"/>
+ <param name="network" type="INATNetwork" dir="return"/>
+ </method>
+
+ <!--
+ Returns the NATNetwork by name, e.g. for adding port forward rule or deletion.
+ -->
+ <method name="findNATNetworkByName">
+ <rest name="find" request="get" path="/natnetworks/"/>
+ <param name="networkName" type="wstring" dir="in"/>
+ <param name="network" type="INATNetwork" dir="return"/>
+ </method>
+ <!--
+ Deletes given NAT network.
+ -->
+ <method name="removeNATNetwork">
+ <rest name="remove" request="delete" path="/natnetworks/"/>
+ <param name="network" type="INATNetwork" dir="in"/>
+ </method>
+
+ <!-- bunch of methods to manage host-only networks -->
+ <!--
+ Here we create a record in cloud network array with specified name.
+ -->
+ <method name="createHostOnlyNetwork">
+ <rest name="create" request="post" path="/hostonlynetworks/"/>
+ <param name="networkName" type="wstring" dir="in"/>
+ <param name="network" type="IHostOnlyNetwork" dir="return"/>
+ </method>
+
+ <!--
+ Returns the host-only network by name.
+ -->
+ <method name="findHostOnlyNetworkByName">
+ <param name="networkName" type="wstring" dir="in"/>
+ <param name="network" type="IHostOnlyNetwork" dir="return"/>
+ </method>
+ <!--
+ Returns the host-only network by id.
+ -->
+ <method name="findHostOnlyNetworkById">
+ <rest name="find" request="get" path="/hostonlynetworks/"/>
+ <desc>
+ Searches through all host networks for one with
+ the given GUID.
+ <note>
+ The method returns an error if the given GUID does not
+ correspond to any host network.
+ </note>
+ </desc>
+ <param name="id" type="uuid" mod="string" dir="in">
+ <desc>GUID of the host-only network to search for.</desc>
+ </param>
+ <param name="network" type="IHostOnlyNetwork" dir="return">
+ <desc>Found host-only network object.</desc>
+ </param>
+ </method>
+ <!--
+ Deletes given host-only network.
+ -->
+ <method name="removeHostOnlyNetwork">
+ <rest name="remove" request="delete" path="/hostonlynetworks/"/>
+ <param name="network" type="IHostOnlyNetwork" dir="in"/>
+ </method>
+
+ <!-- bunch of methods to manage cloud networks -->
+ <method name="createCloudNetwork">
+ <!-- Here we create a record in cloud network array with specified name.
+ -->
+ <rest name="create" request="post" path="/cloudnetworks/"/>
+ <param name="networkName" type="wstring" dir="in"/>
+ <param name="network" type="ICloudNetwork" dir="return"/>
+ </method>
+
+ <!--
+ Returns the cloud network by name.
+ -->
+ <method name="findCloudNetworkByName">
+ <rest name="find" request="get" path="/cloudnetworks/"/>
+ <param name="networkName" type="wstring" dir="in"/>
+ <param name="network" type="ICloudNetwork" dir="return"/>
+ </method>
+ <!--
+ Deletes given cloud network.
+ -->
+ <method name="removeCloudNetwork">
+ <rest name="remove" request="delete" path="/cloudnetworks/"/>
+ <param name="network" type="ICloudNetwork" dir="in"/>
+ </method>
+
+ <method name="checkFirmwarePresent">
+ <rest request="get" path="/server/methods/"/>
+ <desc>
+ Check if this VirtualBox installation has a firmware
+ of the given type available, either system-wide or per-user.
+ Optionally, this may return a hint where this firmware can be
+ downloaded from.
+ </desc>
+ <param name="firmwareType" type="FirmwareType" dir="in">
+ <desc>
+ Type of firmware to check.
+ </desc>
+ </param>
+ <param name="version" type="wstring" dir="in">
+ <desc>Expected version number, usually empty string (presently ignored).</desc>
+ </param>
+
+ <param name="url" type="wstring" dir="out">
+ <desc>
+ Suggested URL to download this firmware from.
+ </desc>
+ </param>
+
+ <param name="file" type="wstring" dir="out">
+ <desc>
+ Filename of firmware, only valid if result == TRUE.
+ </desc>
+ </param>
+
+ <param name="result" type="boolean" dir="return">
+ <desc>If firmware of this type and version is available.</desc>
+ </param>
+ </method>
+
+ <method name="findProgressById">
+ <rest name="find" request="get" path="/progresses/{progressid}/"/>
+ <desc>
+ Searches through all progress objects known to VBoxSVC for an
+ instance with the given GUID.
+ <note>
+ The method returns an error if the given GUID does not
+ correspond to any currently known progress object.
+ </note>
+ </desc>
+ <param name="id" type="uuid" mod="string" dir="in">
+ <desc>GUID of the progress object to search for.</desc>
+ </param>
+ <param name="progressObject" type="IProgress" dir="return">
+ <desc>Found progress object.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <!--
+ // IVFSExplorer
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="VFSType"
+ uuid="813999ba-b949-48a8-9230-aadc6285e2f2"
+ >
+ <desc>
+ Virtual file systems supported by VFSExplorer.
+ </desc>
+
+ <const name="File" value="1" />
+ <const name="Cloud" value="2" />
+ <const name="S3" value="3" />
+ <const name="WebDav" value="4" />
+ </enum>
+
+ <interface
+ name="IVFSExplorer" extends="$unknown"
+ uuid="fb220201-2fd3-47e2-a5dc-2c2431d833cc"
+ wsmap="managed"
+ >
+ <desc>
+ The VFSExplorer interface unifies access to different file system
+ types. This includes local file systems as well remote file systems like
+ S3. For a list of supported types see <link to="VFSType" />.
+ An instance of this is returned by <link to="IAppliance::createVFSExplorer" />.
+ </desc>
+
+ <attribute name="path" type="wstring" readonly="yes">
+ <desc>Returns the current path in the virtual file system.</desc>
+ </attribute>
+
+ <attribute name="type" type="VFSType" readonly="yes">
+ <desc>Returns the file system type which is currently in use.</desc>
+ </attribute>
+
+ <method name="update">
+ <desc>Updates the internal list of files/directories from the
+ current directory level. Use <link to="#entryList" /> to get the full list
+ after a call to this method.</desc>
+
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="cd">
+ <desc>Change the current directory level.</desc>
+
+ <param name="dir" type="wstring" dir="in">
+ <desc>The name of the directory to go in.</desc>
+ </param>
+
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="cdUp">
+ <desc>Go one directory upwards from the current directory level.</desc>
+
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="entryList">
+ <desc>Returns a list of files/directories after a call to <link
+ to="#update" />. The user is responsible for keeping this internal
+ list up do date.</desc>
+
+ <param name="names" type="wstring" safearray="yes" dir="out">
+ <desc>The list of names for the entries.</desc>
+ </param>
+
+ <param name="types" type="unsigned long" safearray="yes" dir="out">
+ <desc>The list of types for the entries. <link to="FsObjType"/></desc>
+ </param>
+
+ <param name="sizes" type="long long" safearray="yes" dir="out">
+ <desc>The list of sizes (in bytes) for the entries.</desc>
+ </param>
+
+ <param name="modes" type="unsigned long" safearray="yes" dir="out">
+ <desc>The list of file modes (in octal form) for the entries.</desc>
+ </param>
+ </method>
+
+ <method name="exists">
+ <desc>Checks if the given file list exists in the current directory
+ level.</desc>
+
+ <param name="names" type="wstring" safearray="yes" dir="in">
+ <desc>The names to check.</desc>
+ </param>
+
+ <param name="exists" type="wstring" safearray="yes" dir="return">
+ <desc>The names which exist.</desc>
+ </param>
+ </method>
+
+ <method name="remove">
+ <desc>Deletes the given files in the current directory level.</desc>
+
+ <param name="names" type="wstring" safearray="yes" dir="in">
+ <desc>The names to remove.</desc>
+ </param>
+
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <enum
+ name="ImportOptions"
+ uuid="0a981523-3b20-4004-8ee3-dfd322202ace"
+ >
+
+ <desc>
+ Import options, used with <link to="IAppliance::importMachines" />.
+ </desc>
+
+ <const name="KeepAllMACs" value="1">
+ <desc>Don't generate new MAC addresses of the attached network adapters.</desc>
+ </const>
+ <const name="KeepNATMACs" value="2">
+ <desc>Don't generate new MAC addresses of the attached network adapters when they are using NAT.</desc>
+ </const>
+
+ <const name="ImportToVDI" value="3">
+ <desc>Import all disks to VDI format</desc>
+ </const>
+
+ </enum>
+
+ <enum
+ name="ExportOptions"
+ uuid="8f45eb08-fd34-41ee-af95-a880bdee5554"
+ >
+
+ <desc>
+ Export options, used with <link to="IAppliance::write" />.
+ </desc>
+
+ <const name="CreateManifest" value="1">
+ <desc>Write the optional manifest file (.mf) which is used for integrity
+ checks prior import.</desc>
+ </const>
+ <const name="ExportDVDImages" value="2">
+ <desc>Export DVD images. Default is not to export them as it is rarely
+ needed for typical VMs.</desc>
+ </const>
+ <const name="StripAllMACs" value="3">
+ <desc>Do not export any MAC address information. Default is to keep them
+ to avoid losing information which can cause trouble after import, at the
+ price of risking duplicate MAC addresses, if the import options are used
+ to keep them.</desc>
+ </const>
+ <const name="StripAllNonNATMACs" value="4">
+ <desc>Do not export any MAC address information, except for adapters
+ using NAT. Default is to keep them to avoid losing information which can
+ cause trouble after import, at the price of risking duplicate MAC
+ addresses, if the import options are used to keep them.</desc>
+ </const>
+
+ </enum>
+
+ <enum
+ name="CertificateVersion"
+ uuid="9e232a99-51d0-4dbd-96a0-ffac4bc3e2a8"
+ >
+ <desc>
+ X.509 certificate version numbers.
+ </desc>
+ <const name="V1" value="1"/>
+ <const name="V2" value="2"/>
+ <const name="V3" value="3"/>
+ <const name="Unknown" value="99"/>
+ </enum>
+
+ <!--
+ // ICertificate
+ /////////////////////////////////////////////////////////////////////////
+ -->
+ <interface
+ name="ICertificate" extends="$unknown"
+ uuid="392f1de4-80e1-4a8a-93a1-67c5f92a838a"
+ wsmap="managed"
+ rest="managed"
+ reservedAttributes="12" reservedMethods="2"
+ >
+ <desc>
+ X.509 certificate details.
+ </desc>
+ <attribute name="versionNumber" type="CertificateVersion" readonly="yes">
+ <desc>Certificate version number.</desc>
+ </attribute>
+ <attribute name="serialNumber" type="wstring" readonly="yes">
+ <desc>Certificate serial number.</desc>
+ </attribute>
+ <attribute name="signatureAlgorithmOID" type="wstring" readonly="yes">
+ <desc>The dotted OID of the signature algorithm.</desc>
+ </attribute>
+ <attribute name="signatureAlgorithmName" type="wstring" readonly="yes">
+ <desc>The signature algorithm name if known (if known).</desc>
+ </attribute>
+ <attribute name="issuerName" type="wstring" readonly="yes" safearray="yes">
+ <desc>Issuer name. Each member of the array is on the format
+ COMPONENT=NAME, e.g. "C=DE", "ST=Example", "L=For Instance", "O=Beispiel GmbH",
+ "CN=beispiel.example.org".
+ </desc>
+ </attribute>
+ <attribute name="subjectName" type="wstring" readonly="yes" safearray="yes">
+ <desc>Subject name. Same format as issuerName.</desc>
+ </attribute>
+ <attribute name="friendlyName" type="wstring" readonly="yes">
+ <desc>Friendly subject name or similar.</desc>
+ </attribute>
+ <attribute name="validityPeriodNotBefore" type="wstring" readonly="yes">
+ <desc>Certificate not valid before ISO timestamp.</desc>
+ </attribute>
+ <attribute name="validityPeriodNotAfter" type="wstring" readonly="yes">
+ <desc>Certificate not valid after ISO timestamp.</desc>
+ </attribute>
+ <attribute name="publicKeyAlgorithmOID" type="wstring" readonly="yes">
+ <desc>The dotted OID of the public key algorithm.</desc>
+ </attribute>
+ <attribute name="publicKeyAlgorithm" type="wstring" readonly="yes">
+ <desc>The public key algorithm name (if known).</desc>
+ </attribute>
+ <attribute name="subjectPublicKey" type="octet" safearray="yes" readonly="yes">
+ <desc>The raw public key bytes.</desc>
+ </attribute>
+ <attribute name="issuerUniqueIdentifier" type="wstring" readonly="yes">
+ <desc>Unique identifier of the issuer (empty string if not present).</desc>
+ </attribute>
+ <attribute name="subjectUniqueIdentifier" type="wstring" readonly="yes">
+ <desc>Unique identifier of this certificate (empty string if not present).</desc>
+ </attribute>
+ <attribute name="certificateAuthority" type="boolean" readonly="yes">
+ <desc>Whether this certificate is a certificate authority. Will return E_FAIL
+ if this attribute is not present.
+ </desc>
+ </attribute>
+ <attribute name="keyUsage" type="unsigned long" readonly="yes">
+ <desc>Key usage mask. Will return 0 if not present.</desc>
+ </attribute>
+ <attribute name="extendedKeyUsage" type="wstring" safearray="yes" readonly="yes">
+ <desc>Array of dotted extended key usage OIDs. Empty array if not present.</desc>
+ </attribute>
+ <attribute name="rawCertData" type="octet" safearray="yes" readonly="yes">
+ <desc>The raw certificate bytes.</desc>
+ </attribute>
+ <attribute name="selfSigned" type="boolean" readonly="yes">
+ <desc>Set if self signed certificate.</desc>
+ </attribute>
+
+ <!-- The following is subject to the parent object views. -->
+ <attribute name="trusted" type="boolean" readonly="yes">
+ <desc>Set if the certificate is trusted (by the parent object).</desc>
+ </attribute>
+ <attribute name="expired" type="boolean" readonly="yes"> <!-- isCurrentlyExpired is clearer than isCurrentlyValid. -->
+ <desc>Set if the certificate has expired (relevant to the parent object)/</desc>
+ </attribute>
+
+ <method name="isCurrentlyExpired">
+ <desc>
+ Tests if the certificate has expired at the present time according to
+ the X.509 validity of the certificate.</desc>
+ <param name="result" type="boolean" dir="return" />
+ </method>
+
+ <method name="queryInfo">
+ <desc>Way to extend the interface.</desc>
+ <param name="what" type="long" dir="in"/>
+ <param name="result" type="wstring" dir="return" />
+ </method>
+
+ </interface>
+
+
+ <!--
+ // IAppliance
+ /////////////////////////////////////////////////////////////////////////
+ -->
+ <interface
+ name="IAppliance" extends="$unknown"
+ uuid="86a98347-7619-41aa-aece-b21ac5c1a7e6"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="7" reservedAttributes="8"
+ >
+ <desc>
+ Represents a platform-independent appliance in OVF format. An instance of this is returned
+ by <link to="IVirtualBox::createAppliance" />, which can then be used to import and export
+ virtual machines within an appliance with VirtualBox.
+
+ The OVF standard suggests two different physical file formats:
+
+ <ol>
+ <li>If the appliance is distributed as a set of files, there must be at least one XML descriptor
+ file that conforms to the OVF standard and carries an <tt>.ovf</tt> file extension. If
+ this descriptor file references other files such as disk images, as OVF appliances typically
+ do, those additional files must be in the same directory as the descriptor file.
+ </li>
+
+ <li>If the appliance is distributed as a single file, it must be in TAR format and have the
+ <tt>.ova</tt> file extension. This TAR file must then contain at least the OVF descriptor
+ files and optionally other files.
+
+ At this time, VirtualBox does not not yet support the packed (TAR) variant; support will
+ be added with a later version.
+ </li>
+ </ol>
+
+ <b>Importing</b> an OVF appliance into VirtualBox as instances of
+ <link to="IMachine" /> involves the following sequence of API calls:
+
+ <ol>
+ <li>Call <link to="IVirtualBox::createAppliance" />. This will create an empty IAppliance object.
+ </li>
+
+ <li>On the new object, call <link to="#read" /> with the full path of the OVF file you
+ would like to import. So long as this file is syntactically valid, this will succeed
+ and fill the appliance object with the parsed data from the OVF file.
+ </li>
+
+ <li>Next, call <link to="#interpret" />, which analyzes the OVF data and sets up the
+ contents of the IAppliance attributes accordingly. These can be inspected by a
+ VirtualBox front-end such as the GUI, and the suggestions can be displayed to the
+ user. In particular, the <link to="#virtualSystemDescriptions" /> array contains
+ instances of <link to="IVirtualSystemDescription" /> which represent the virtual
+ systems (machines) in the OVF, which in turn describe the virtual hardware prescribed
+ by the OVF (network and hardware adapters, virtual disk images, memory size and so on).
+ The GUI can then give the user the option to confirm and/or change these suggestions.
+ </li>
+
+ <li>If desired, call <link to="IVirtualSystemDescription::setFinalValues" /> for each
+ virtual system (machine) to override the suggestions made by the <link to="#interpret" /> routine.
+ </li>
+
+ <li>Finally, call <link to="#importMachines" /> to create virtual machines in
+ VirtualBox as instances of <link to="IMachine" /> that match the information in the
+ virtual system descriptions. After this call succeeded, the UUIDs of the machines created
+ can be found in the <link to="#machines" /> array attribute.
+ </li>
+ </ol>
+
+ <b>Exporting</b> VirtualBox machines into an OVF appliance involves the following steps:
+
+ <ol>
+ <li>As with importing, first call <link to="IVirtualBox::createAppliance" /> to create
+ an empty IAppliance object.
+ </li>
+
+ <li>For each machine you would like to export, call <link to="IMachine::exportTo" />
+ with the IAppliance object you just created. Each such call creates one instance of
+ <link to="IVirtualSystemDescription" /> inside the appliance.
+ </li>
+
+ <li>If desired, call <link to="IVirtualSystemDescription::setFinalValues" /> for each
+ virtual system (machine) to override the suggestions made by the <link to="IMachine::exportTo"/> routine.
+ </li>
+
+ <li>Finally, call <link to="#write" /> with a path specification to have the OVF
+ file written.</li>
+ </ol>
+
+ </desc>
+
+ <attribute name="path" type="wstring" readonly="yes">
+ <desc>Path to the main file of the OVF appliance, which is either the <tt>.ovf</tt> or
+ the <tt>.ova</tt> file passed to <link to="#read" /> (for import) or
+ <link to="#write" /> (for export).
+ This attribute is empty until one of these methods has been called.
+ </desc>
+ </attribute>
+
+ <attribute name="disks" type="wstring" readonly="yes" safearray="yes">
+ <desc>
+ Array of virtual disk definitions. One such description exists for each
+ disk definition in the OVF; each string array item represents one such piece of
+ disk information, with the information fields separated by tab (\\t) characters.
+
+ The caller should be prepared for additional fields being appended to
+ this string in future versions of VirtualBox and therefore check for
+ the number of tabs in the strings returned.
+
+ In the current version, the following eight fields are returned per string
+ in the array:
+
+ <ol>
+ <li>Disk ID (unique string identifier given to disk)</li>
+
+ <li>Capacity (unsigned integer indicating the maximum capacity of the disk)</li>
+
+ <li>Populated size (optional unsigned integer indicating the current size of the
+ disk; can be approximate; -1 if unspecified)</li>
+
+ <li>Format (string identifying the disk format, typically
+ "http://www.vmware.com/specifications/vmdk.html#sparse")</li>
+
+ <li>Reference (where to find the disk image, typically a file name; if empty,
+ then the disk should be created on import)</li>
+
+ <li>Image size (optional unsigned integer indicating the size of the image,
+ which need not necessarily be the same as the values specified above, since
+ the image may be compressed or sparse; -1 if not specified)</li>
+
+ <li>Chunk size (optional unsigned integer if the image is split into chunks;
+ presently unsupported and always -1)</li>
+
+ <li>Compression (optional string equaling "gzip" if the image is gzip-compressed)</li>
+ </ol>
+ </desc>
+ </attribute>
+
+ <attribute name="virtualSystemDescriptions" type="IVirtualSystemDescription" readonly="yes" safearray="yes">
+ <desc> Array of virtual system descriptions. One such description is created
+ for each virtual system (machine) found in the OVF.
+ This array is empty until either <link to="#interpret" /> (for import) or <link to="IMachine::exportTo" />
+ (for export) has been called.
+ </desc>
+ </attribute>
+
+ <attribute name="machines" type="wstring" readonly="yes" safearray="yes">
+ <desc>
+ Contains the UUIDs of the machines created from the information in this appliances. This is only
+ relevant for the import case, and will only contain data after a call to <link to="#importMachines" />
+ succeeded.
+ </desc>
+ </attribute>
+
+ <attribute name="certificate" type="ICertificate" readonly="yes">
+ <desc>
+ The X.509 signing certificate, if the imported OVF was signed, @c null
+ if not signed. This is available after calling <link to="#read"/>.
+ </desc>
+ </attribute>
+
+ <method name="read">
+ <rest request="post" path="/appliances/{applianceid}/actions/"/>
+ <desc>
+ Reads an OVF file into the appliance object.
+
+ This method succeeds if the OVF is syntactically valid and, by itself, without errors. The
+ mere fact that this method returns successfully does not mean that VirtualBox supports all
+ features requested by the appliance; this can only be examined after a call to <link to="#interpret" />.
+ </desc>
+ <param name="file" type="wstring" dir="in">
+ <desc>
+ Name of appliance file to open (either with an <tt>.ovf</tt> or <tt>.ova</tt> extension, depending
+ on whether the appliance is distributed as a set of files or as a single file, respectively).
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="interpret">
+ <rest request="post" path="/appliances/{applianceid}/actions/"/>
+ <desc>
+ Interprets the OVF data that was read when the appliance was constructed. After
+ calling this method, one can inspect the
+ <link to="#virtualSystemDescriptions" /> array attribute, which will then contain
+ one <link to="IVirtualSystemDescription" /> for each virtual machine found in
+ the appliance.
+
+ Calling this method is the second step of importing an appliance into VirtualBox;
+ see <link to="IAppliance" /> for an overview.
+
+ After calling this method, one should call <link to="#getWarnings" /> to find out
+ if problems were encountered during the processing which might later lead to
+ errors.
+ </desc>
+ </method>
+
+ <method name="importMachines">
+ <rest request="post" path="/appliances/{applianceid}/actions/"/>
+ <desc>
+ Imports the appliance into VirtualBox by creating instances of <link to="IMachine" />
+ and other interfaces that match the information contained in the appliance as
+ closely as possible, as represented by the import instructions in the
+ <link to="#virtualSystemDescriptions" /> array.
+
+ Calling this method is the final step of importing an appliance into VirtualBox;
+ see <link to="IAppliance" /> for an overview.
+
+ Since importing the appliance will most probably involve copying and converting
+ disk images, which can take a long time, this method operates asynchronously and
+ returns an IProgress object to allow the caller to monitor the progress.
+
+ After the import succeeded, the UUIDs of the IMachine instances created can be
+ retrieved from the <link to="#machines" /> array attribute.
+ </desc>
+
+ <param name="options" type="ImportOptions" dir="in" safearray="yes">
+ <desc>Options for the importing operation.</desc>
+ </param>
+
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="createVFSExplorer">
+ <desc>Returns a <link to="IVFSExplorer" /> object for the given URI.</desc>
+
+ <param name="URI" type="wstring" dir="in">
+ <desc>The URI describing the file system to use.</desc>
+ </param>
+
+ <param name="explorer" type="IVFSExplorer" dir="return">
+ <desc></desc>
+ </param>
+ </method>
+
+ <method name="write">
+ <rest request="post" path="/appliances/{applianceid}/actions/"/>
+ <desc>
+ Writes the contents of the appliance exports into a new OVF file.
+
+ Calling this method is the final step of exporting an appliance from VirtualBox;
+ see <link to="IAppliance" /> for an overview.
+
+ Since exporting the appliance will most probably involve copying and converting
+ disk images, which can take a long time, this method operates asynchronously and
+ returns an IProgress object to allow the caller to monitor the progress.
+ </desc>
+ <param name="format" type="wstring" dir="in">
+ <desc>
+ Output format, as a string. Currently supported formats are "ovf-0.9", "ovf-1.0",
+ "ovf-2.0" and "opc-1.0"; future versions of VirtualBox may support additional formats.
+ The "opc-1.0" format is for creating tarballs for the Oracle Public Cloud.
+ </desc>
+ </param>
+ <param name="options" type="ExportOptions" dir="in" safearray="yes">
+ <desc>Options for the exporting operation.</desc>
+ </param>
+ <param name="path" type="wstring" dir="in">
+ <desc>
+ Name of appliance file to create. There are certain restrictions with regard
+ to the file name suffix. If the format parameter is "opc-1.0" a <tt>.tar.gz</tt>
+ suffix is required. Otherwise the suffix must either be <tt>.ovf</tt> or
+ <tt>.ova</tt>, depending on whether the appliance is distributed as a set of
+ files or as a single file, respectively.
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="getWarnings">
+ <rest request="get" path="/appliances/{applianceid}/configuration/"/>
+ <desc>Returns textual warnings which occurred during execution of <link to="#interpret" />.</desc>
+
+ <param name="warnings" type="wstring" dir="return" safearray="yes">
+ <desc></desc>
+ </param>
+ </method>
+
+ <method name="getPasswordIds">
+ <rest request="get" path="/appliances/{applianceid}/configuration/"/>
+ <desc>
+ Returns a list of password identifiers which must be supplied to import or export
+ encrypted virtual machines.
+ </desc>
+
+ <param name="identifiers" type="wstring" dir="return" safearray="yes">
+ <desc>The list of password identifiers required for export on success.</desc>
+ </param>
+ </method>
+
+ <method name="getMediumIdsForPasswordId">
+ <rest request="get" path="/appliances/{applianceid}/configuration/"/>
+ <desc>
+ Returns a list of medium identifiers which use the given password identifier.
+ </desc>
+
+ <param name="passwordId" type="wstring" dir="in">
+ <desc>The password identifier to get the medium identifiers for.</desc>
+ </param>
+ <param name="identifiers" type="uuid" mod="string" dir="return" safearray="yes">
+ <desc>The list of medium identifiers returned on success.</desc>
+ </param>
+ </method>
+
+ <method name="addPasswords">
+ <rest request="post" path="/appliances/{applianceid}/configuration/"/>
+ <desc>
+ Adds a list of passwords required to import or export encrypted virtual
+ machines.
+ </desc>
+
+ <param name="identifiers" type="wstring" dir="in" safearray="yes">
+ <desc>List of identifiers.</desc>
+ </param>
+
+ <param name="passwords" type="wstring" dir="in" safearray="yes">
+ <desc>List of matching passwords.</desc>
+ </param>
+ </method>
+
+ <method name="createVirtualSystemDescriptions">
+ <rest request="post" path="/appliances/{applianceid}/configuration/"/>
+ <desc>Creates a number of <link to="IVirtualSystemDescription" /> objects and store them
+ in the <link to="#virtualSystemDescriptions" /> array.
+ </desc>
+
+ <param name="requested" type="unsigned long" dir="in">
+ <desc>Requested number of new virtual system description objects</desc>
+ </param>
+
+ <param name="created" type="unsigned long" dir="return">
+ <desc>Actually created number of virtual system description objects</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <enum
+ name="VirtualSystemDescriptionType"
+ uuid="d171d08c-f7bf-4bee-932f-ffbf998f7ac4"
+ >
+ <desc>Used with <link to="IVirtualSystemDescription" /> to describe the type of
+ a configuration value.</desc>
+
+ <const name="Ignore" value="1" />
+ <const name="OS" value="2" />
+ <const name="Name" value="3" />
+ <const name="Product" value="4" />
+ <const name="Vendor" value="5" />
+ <const name="Version" value="6" />
+ <const name="ProductUrl" value="7" />
+ <const name="VendorUrl" value="8" />
+ <const name="Description" value="9" />
+ <const name="License" value="10" />
+ <const name="Miscellaneous" value="11" />
+ <const name="CPU" value="12" />
+ <const name="Memory" value="13" />
+ <const name="HardDiskControllerIDE" value="14" />
+ <const name="HardDiskControllerSATA" value="15" />
+ <const name="HardDiskControllerSCSI" value="16" />
+ <const name="HardDiskControllerSAS" value="17" />
+ <const name="HardDiskImage" value="18" />
+ <const name="Floppy" value="19" />
+ <const name="CDROM" value="20" />
+ <const name="NetworkAdapter" value="21" />
+ <const name="USBController" value="22" />
+ <const name="SoundCard" value="23" />
+ <const name="SettingsFile" value="24">
+ <desc>Optional, may be unset by the API caller. If this is changed by the
+ API caller it defines the absolute path of the VM settings file and
+ therefore also the VM folder with highest priority.</desc>
+ </const>
+ <const name="BaseFolder" value="25">
+ <desc>Optional, may be unset by the API caller. If set (and
+ <link to="VirtualSystemDescriptionType_SettingsFile"/> is not changed),
+ defines the VM base folder (taking the primary group into account if
+ also set).</desc>
+ </const>
+ <const name="PrimaryGroup" value="26">
+ <desc>Optional, empty by default and may be unset by the API caller.
+ Defines the primary group of the VM after import. May influence the
+ selection of the VM folder. Additional groups may be configured later
+ using <link to="IMachine::groups"/>, after importing.</desc>
+ </const>
+ <const name="CloudInstanceShape" value="27" />
+ <const name="CloudDomain" value="28" />
+ <const name="CloudBootDiskSize" value="29" />
+ <const name="CloudBucket" value="30" />
+ <const name="CloudOCIVCN" value="31" />
+ <const name="CloudPublicIP" value="32" />
+ <const name="CloudProfileName" value="33" />
+ <const name="CloudOCISubnet" value="34" />
+ <const name="CloudKeepObject" value="35" />
+ <const name="CloudLaunchInstance" value="36" />
+ <const name="CloudInstanceId" value="37" />
+ <const name="CloudImageId" value="38" />
+ <const name="CloudInstanceState" value="39" />
+ <const name="CloudImageState" value="40" />
+ <const name="CloudInstanceDisplayName" value="41" />
+ <const name="CloudImageDisplayName" value="42" />
+ <const name="CloudOCILaunchMode" value="43" />
+ <const name="CloudPrivateIP" value="44" />
+ <const name="CloudBootVolumeId" value="45" />
+ <const name="CloudOCIVCNCompartment" value="46" />
+ <const name="CloudOCISubnetCompartment" value="47" />
+ <const name="CloudPublicSSHKey" value="48" />
+ <const name="BootingFirmware" value="49" />
+ <const name="CloudInitScriptPath" value="50" />
+ <const name="CloudCompartmentId" value="51" />
+ <const name="CloudShapeCpus" value="52" />
+ <const name="CloudShapeMemory" value="53" />
+ <const name="CloudInstanceMetadata" value="54" />
+ <const name="CloudInstanceFreeFormTags" value="55" />
+ <const name="CloudImageFreeFormTags" value="56" />
+ <const name="HardDiskControllerVirtioSCSI" value="60" />
+ <const name="HardDiskControllerNVMe" value="61" />
+ </enum>
+
+ <enum
+ name="VirtualSystemDescriptionValueType"
+ uuid="56d9403f-3425-4118-9919-36f2a9b8c77c"
+ >
+ <desc>Used with <link to="IVirtualSystemDescription::getValuesByType" /> to describe the value
+ type to fetch.</desc>
+
+ <const name="Reference" value="1" />
+ <const name="Original" value="2" />
+ <const name="Auto" value="3" />
+ <const name="ExtraConfig" value="4" />
+
+ </enum>
+
+ <interface
+ name="IVirtualSystemDescription" extends="$unknown"
+ uuid="01510f40-c196-4d26-b8db-4c8c389f1f82"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="4"
+ >
+
+ <desc>
+ Represents one virtual system (machine) in an appliance. This interface is used in
+ the <link to="IAppliance::virtualSystemDescriptions" /> array. After
+ <link to="IAppliance::interpret" /> has been called, that array contains information
+ about how the virtual systems described in the OVF should best be imported into
+ VirtualBox virtual machines. See <link to="IAppliance" /> for the steps required to
+ import an OVF into VirtualBox.
+ </desc>
+
+ <attribute name="count" type="unsigned long" readonly="yes">
+ <desc>Return the number of virtual system description entries.</desc>
+ </attribute>
+
+ <method name="getDescription">
+ <desc>Returns information about the virtual system as arrays of instruction items. In each array, the
+ items with the same indices correspond and jointly represent an import instruction for VirtualBox.
+
+ The list below identifies the value sets that are possible depending on the
+ <link to="VirtualSystemDescriptionType" /> enum value in the array item in @a aTypes[]. In each case,
+ the array item with the same index in @a OVFValues[] will contain the original value as contained
+ in the OVF file (just for informational purposes), and the corresponding item in @a aVBoxValues[]
+ will contain a suggested value to be used for VirtualBox. Depending on the description type,
+ the @a aExtraConfigValues[] array item may also be used.
+
+ <ul>
+ <li>
+ "OS": the guest operating system type. There must be exactly one such array item on import. The
+ corresponding item in @a aVBoxValues[] contains the suggested guest operating system for VirtualBox.
+ This will be one of the values listed in <link to="IVirtualBox::guestOSTypes" />. The corresponding
+ item in @a OVFValues[] will contain a numerical value that described the operating system in the OVF.
+ </li>
+ <li>
+ "Name": the name to give to the new virtual machine. There can be at most one such array item;
+ if none is present on import, then an automatic name will be created from the operating system
+ type. The corresponding item im @a OVFValues[] will contain the suggested virtual machine name
+ from the OVF file, and @a aVBoxValues[] will contain a suggestion for a unique VirtualBox
+ <link to="IMachine" /> name that does not exist yet.
+ </li>
+ <li>
+ "Description": an arbitrary description.
+ </li>
+ <li>
+ "License": the EULA section from the OVF, if present. It is the responsibility of the calling
+ code to display such a license for agreement; the Main API does not enforce any such policy.
+ </li>
+ <li>
+ Miscellaneous: reserved for future use.
+ </li>
+ <li>
+ "CPU": the number of CPUs. There can be at most one such item, which will presently be ignored.
+ </li>
+ <li>
+ "Memory": the amount of guest RAM, in bytes. There can be at most one such array item; if none
+ is present on import, then VirtualBox will set a meaningful default based on the operating system
+ type.
+ </li>
+ <li>
+ "HardDiskControllerIDE": an IDE hard disk controller. There can be at most two such items.
+ An optional value in @a OVFValues[] and @a aVBoxValues[] can be "PIIX3" or "PIIX4" to specify
+ the type of IDE controller; this corresponds to the ResourceSubType element which VirtualBox
+ writes into the OVF.
+ The matching item in the @a aRefs[] array will contain an integer that items of the "Harddisk"
+ type can use to specify which hard disk controller a virtual disk should be connected to.
+ Note that in OVF, an IDE controller has two channels, corresponding to "master" and "slave"
+ in traditional terminology, whereas the IDE storage controller that VirtualBox supports in
+ its virtual machines supports four channels (primary master, primary slave, secondary master,
+ secondary slave) and thus maps to two IDE controllers in the OVF sense.
+ </li>
+ <li>
+ "HardDiskControllerSATA": an SATA hard disk controller. There can be at most one such item. This
+ has no value in @a OVFValues[] or @a aVBoxValues[].
+ The matching item in the @a aRefs[] array will be used as with IDE controllers (see above).
+ </li>
+ <li>
+ "HardDiskControllerSCSI": a SCSI hard disk controller. There can be at most one such item.
+ The items in @a OVFValues[] and @a aVBoxValues[] will either be "LsiLogic", "BusLogic" or
+ "LsiLogicSas". (Note that in OVF, the LsiLogicSas controller is treated as a SCSI controller
+ whereas VirtualBox considers it a class of storage controllers of its own; see
+ <link to="StorageControllerType" />).
+ The matching item in the @a aRefs[] array will be used as with IDE controllers (see above).
+ </li>
+ <li>
+ "HardDiskImage": a virtual hard disk, most probably as a reference to an image file. There can be an
+ arbitrary number of these items, one for each virtual disk image that accompanies the OVF.
+
+ The array item in @a OVFValues[] will contain the file specification from the OVF file (without
+ a path since the image file should be in the same location as the OVF file itself), whereas the
+ item in @a aVBoxValues[] will contain a qualified path specification to where VirtualBox uses the
+ hard disk image. This means that on import the image will be copied and converted from the
+ "ovf" location to the "vbox" location; on export, this will be handled the other way round.
+
+ The matching item in the @a aExtraConfigValues[] array must contain a string of the following
+ format: "controller=&lt;index&gt;;channel=&lt;c&gt;"
+ In this string, &lt;index&gt; must be an integer specifying the hard disk controller to connect
+ the image to. That number must be the index of an array item with one of the hard disk controller
+ types (HardDiskControllerSCSI, HardDiskControllerSATA, HardDiskControllerIDE).
+ In addition, &lt;c&gt; must specify the channel to use on that controller. For IDE controllers,
+ this can be 0 or 1 for master or slave, respectively. For compatibility with VirtualBox versions
+ before 3.2, the values 2 and 3 (for secondary master and secondary slave) are also supported, but
+ no longer exported. For SATA and SCSI controllers, the channel can range from 0-29.
+ </li>
+ <li>
+ "CDROM": a virtual CD-ROM drive. The matching item in @a aExtraConfigValue[] contains the same
+ attachment information as with "HardDiskImage" items.
+ </li>
+ <li>
+ "CDROM": a virtual floppy drive. The matching item in @a aExtraConfigValue[] contains the same
+ attachment information as with "HardDiskImage" items.
+ </li>
+ <li>
+ "NetworkAdapter": a network adapter. The array item in @a aVBoxValues[] will specify the hardware
+ for the network adapter, whereas the array item in @a aExtraConfigValues[] will have a string
+ of the "type=&lt;X&gt;" format, where &lt;X&gt; must be either "NAT" or "Bridged".
+ </li>
+ <li>
+ "USBController": a USB controller. There can be at most one such item. If, and only if, such an
+ item is present, USB support will be enabled for the new virtual machine.
+ </li>
+ <li>
+ "SoundCard": a sound card. There can be at most one such item. If and only if such an item is
+ present, sound support will be enabled for the new virtual machine. Note that the virtual
+ machine in VirtualBox will always be presented with the standard VirtualBox soundcard, which
+ may be different from the virtual soundcard expected by the appliance.
+ </li>
+ </ul>
+
+ </desc>
+
+ <param name="types" type="VirtualSystemDescriptionType" dir="out" safearray="yes">
+ <desc></desc>
+ </param>
+
+ <param name="refs" type="wstring" dir="out" safearray="yes">
+ <desc></desc>
+ </param>
+
+ <param name="OVFValues" type="wstring" dir="out" safearray="yes">
+ <desc></desc>
+ </param>
+
+ <param name="VBoxValues" type="wstring" dir="out" safearray="yes">
+ <desc></desc>
+ </param>
+
+ <param name="extraConfigValues" type="wstring" dir="out" safearray="yes">
+ <desc></desc>
+ </param>
+
+ </method>
+
+ <method name="getDescriptionByType">
+ <desc>This is the same as <link to="#getDescription" /> except that you can specify which types
+ should be returned.</desc>
+
+ <param name="type" type="VirtualSystemDescriptionType" dir="in">
+ <desc></desc>
+ </param>
+
+ <param name="types" type="VirtualSystemDescriptionType" dir="out" safearray="yes">
+ <desc></desc>
+ </param>
+
+ <param name="refs" type="wstring" dir="out" safearray="yes">
+ <desc></desc>
+ </param>
+
+ <param name="OVFValues" type="wstring" dir="out" safearray="yes">
+ <desc></desc>
+ </param>
+
+ <param name="VBoxValues" type="wstring" dir="out" safearray="yes">
+ <desc></desc>
+ </param>
+
+ <param name="extraConfigValues" type="wstring" dir="out" safearray="yes">
+ <desc></desc>
+ </param>
+
+ </method>
+
+ <method name="removeDescriptionByType">
+ <desc>Delete all records which are equal to the passed type from the list</desc>
+
+ <param name="type" type="VirtualSystemDescriptionType" dir="in">
+ <desc></desc>
+ </param>
+ </method>
+
+ <method name="getValuesByType">
+ <desc>This is the same as <link to="#getDescriptionByType" /> except that you can specify which
+ value types should be returned. See <link to="VirtualSystemDescriptionValueType" /> for possible
+ values.</desc>
+
+ <param name="type" type="VirtualSystemDescriptionType" dir="in">
+ <desc></desc>
+ </param>
+
+ <param name="which" type="VirtualSystemDescriptionValueType" dir="in">
+ <desc></desc>
+ </param>
+
+ <param name="values" type="wstring" dir="return" safearray="yes">
+ <desc></desc>
+ </param>
+
+ </method>
+
+ <method name="setFinalValues">
+ <desc>
+ This method allows the appliance's user to change the configuration for the virtual
+ system descriptions. For each array item returned from <link to="#getDescription" />,
+ you must pass in one boolean value and one configuration value.
+
+ Each item in the boolean array determines whether the particular configuration item
+ should be enabled.
+ You can only disable items of the types HardDiskControllerIDE, HardDiskControllerSATA,
+ HardDiskControllerSCSI, HardDiskImage, CDROM, Floppy, NetworkAdapter, USBController
+ and SoundCard.
+
+ For the "vbox" and "extra configuration" values, if you pass in the same arrays
+ as returned in the aVBoxValues and aExtraConfigValues arrays from <link to="#getDescription"/>,
+ the configuration remains unchanged. Please see the documentation for <link to="#getDescription"/>
+ for valid configuration values for the individual array item types. If the
+ corresponding item in the aEnabled array is @c false, the configuration value is ignored.
+ </desc>
+
+ <param name="enabled" type="boolean" dir="in" safearray="yes">
+ <desc></desc>
+ </param>
+
+ <param name="VBoxValues" type="wstring" dir="in" safearray="yes">
+ <desc></desc>
+ </param>
+
+ <param name="extraConfigValues" type="wstring" dir="in" safearray="yes">
+ <desc></desc>
+ </param>
+ </method>
+
+ <method name="addDescription">
+ <desc>
+ This method adds an additional description entry to the stack of already
+ available descriptions for this virtual system. This is handy for writing
+ values which aren't directly supported by VirtualBox. One example would
+ be the License type of <link to="VirtualSystemDescriptionType" />.
+ </desc>
+
+ <param name="type" type="VirtualSystemDescriptionType" dir="in">
+ <desc></desc>
+ </param>
+
+ <param name="VBoxValue" type="wstring" dir="in">
+ <desc></desc>
+ </param>
+
+ <param name="extraConfigValue" type="wstring" dir="in">
+ <desc></desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <!--
+ // IUnattended
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IUnattended" extends="$unknown"
+ uuid="6f89464f-7773-436a-a4df-592e4e537fa0"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="16"
+ >
+
+ <desc>
+ The IUnattended interface represents the pipeline for preparing
+ the Guest OS for fully automated install.
+
+ The typical workflow is:
+ <ol>
+ <li>Call <link to="IVirtualBox::createUnattendedInstaller"/> to create the object</li>
+ <li>Set <link to="IUnattended::isoPath"/> and call <link to="IUnattended::detectIsoOS"/></li>
+ <li>Create, configure and register a machine according to <link to="IUnattended::detectedOSTypeId"/>
+ and the other detectedOS* attributes.</li>
+ <li>Set <link to="IUnattended::machine"/> to the new IMachine instance.</li>
+ <li>Set the other IUnattended attributes as desired.</li>
+ <li>Call <link to="IUnattended::prepare"/> for the object to check the
+ attribute values and create an internal installer instance.</li>
+ <li>Call <link to="IUnattended::constructMedia"/> to create additional
+ media files (ISO/floppy) needed.</li>
+ <li>Call <link to="IUnattended::reconfigureVM"/> to reconfigure the VM
+ with the installation ISO, additional media files and whatnot </li>
+ <li>Optionally call <link to="IUnattended::done"/> to destroy the internal
+ installer and allow restarting from the second step.</li>
+ </ol>
+
+ Note! Step two is currently not implemented.
+ </desc>
+
+ <attribute name="isoPath" type="wstring">
+ <desc>
+ Guest operating system ISO image
+ </desc>
+ </attribute>
+
+ <attribute name="machine" type="IMachine">
+ <desc>
+ The associated machine object.
+
+ This must be set before <link to="IUnattended::prepare"/> is called.
+ The VM must be registered.
+ </desc>
+ </attribute>
+
+ <attribute name="user" type="wstring">
+ <desc>
+ Assign an user login name.
+ </desc>
+ </attribute>
+
+ <attribute name="password" type="wstring">
+ <desc>
+ Assign a password to the user. The password is the same for both
+ normal user and for Administrator / 'root' accounts.
+ </desc>
+ </attribute>
+
+ <attribute name="fullUserName" type="wstring">
+ <desc>
+ The full name of the user. This is optional and defaults to
+ <link to="IUnattended::user"/>. Please note that not all guests picks
+ up this attribute.
+ </desc>
+ </attribute>
+
+ <attribute name="productKey" type="wstring">
+ <desc>
+ Any key which is used as authorization of access to install genuine OS
+ </desc>
+ </attribute>
+
+ <attribute name="additionsIsoPath" type="wstring">
+ <desc>
+ Guest Additions ISO image path. This defaults to
+ <link to="ISystemProperties::defaultAdditionsISO"/> when the Unattended
+ object is instantiated.
+
+ This property is ignored when <link to="IUnattended::installGuestAdditions"/> is false.
+ </desc>
+ </attribute>
+
+ <attribute name="installGuestAdditions" type="boolean">
+ <desc>
+ Indicates whether the Guest Additions should be installed or not.
+
+ Setting this to false does not affect additions shipped with the linux
+ distribution, only the installation of additions pointed to by
+ <link to="IUnattended::additionsIsoPath"/>.
+ </desc>
+ </attribute>
+
+ <attribute name="validationKitIsoPath" type="wstring">
+ <desc>
+ VirtualBox ValidationKit ISO image path. This is used when
+ <link to="IUnattended::installTestExecService"/> is set to true.
+ </desc>
+ </attribute>
+
+ <attribute name="installTestExecService" type="boolean">
+ <desc>
+ Indicates whether the test execution service (TXS) from the VBox
+ ValidationKit should be installed.
+
+ The TXS binary will be taken from the ISO indicated by
+ <link to="IUnattended::validationKitIsoPath"/>.
+ </desc>
+ </attribute>
+
+ <attribute name="timeZone" type="wstring">
+ <desc>
+ The guest time zone specifier.
+
+ This is unfortunately guest OS specific.
+
+ Windows XP and earlier takes the index number from this table:
+ https://support.microsoft.com/en-gb/help/973627/microsoft-time-zone-index-values
+
+ Windows Vista and later takes the time zone string from this table:
+ https://technet.microsoft.com/en-us/library/cc749073(v=ws.10).aspx
+
+ Linux usually takes the TZ string from this table:
+ https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
+
+ The default is currently UTC/GMT, but this may change to be same as
+ the host later.
+
+ TODO: Investigate automatic mapping between linux and the two windows
+ time zone formats.
+ TODO: Take default from host (this requires mapping).
+ </desc>
+ </attribute>
+
+ <attribute name="locale" type="wstring">
+ <desc>
+ The 5 letter locale identifier, no codesets or such.
+
+ The format is two lower case language letters (ISO 639-1), underscore ('_'),
+ and two upper case country letters (ISO 3166-1 alpha-2). For instance
+ 'en_US', 'de_DE', or 'ny_NO'.
+
+ The default is taken from the host if possible, with 'en_US' as fallback.
+ </desc>
+ </attribute>
+
+ <attribute name="language" type="wstring">
+ <desc>
+ This is more or less a Windows specific setting for choosing the UI language
+ setting of the installer.
+
+ The value should be from the list available via <link to="IUnattended::detectedOSLanguages"/>.
+ The typical format is {language-code}-{COUNTRY} but windows may also use
+ {16-bit code}:{32-bit code} or insert another component between the language
+ and country codes. We consider the format guest OS specific.
+
+ Note that it is crucial that this is correctly specified for Windows
+ installations. If an unsupported value is given the installer will ask
+ for an installation language and wait for user input. Best to leave it
+ to the default value.
+
+ The default is the first one from <link to="IUnattended::detectedOSLanguages"/>.
+ </desc>
+ </attribute>
+
+ <attribute name="country" type="wstring">
+ <desc>
+ The 2 upper case letter country identifier, ISO 3166-1 alpha-2.
+
+ This is used for mirrors and such.
+
+ The default is taken from the host when possible, falling back on
+ <link to="IUnattended::locale"/>.
+ </desc>
+ </attribute>
+
+ <attribute name="proxy" type="wstring">
+ <desc>
+ Proxy incantation to pass on to the guest OS installer.
+
+ This is important to get right if the guest OS installer is of the type
+ that goes online to fetch the packages (e.g. debian-*-netinst.iso) or
+ to fetch updates during the install process.
+
+ Format: [schema=]schema://[login[:password]@]proxy[:port][;...]
+
+ The default is taken from the host proxy configuration (once implemented).
+ </desc>
+ </attribute>
+
+ <attribute name="packageSelectionAdjustments" type="wstring">
+ <desc>
+ Guest OS specific package selection adjustments.
+
+ This is a semicolon separated list of keywords, and later maybe guest OS
+ package specifiers. Currently the 'minimal' is the only recognized value,
+ and this only works with a selection of linux installers.
+ </desc>
+ </attribute>
+
+ <attribute name="hostname" type="wstring">
+ <desc>
+ The fully qualified guest hostname.
+
+ This defaults to machine-name + ".myguest.virtualbox.org", though it may
+ change to the host domain name later.
+ </desc>
+ </attribute>
+
+ <attribute name="auxiliaryBasePath" type="wstring">
+ <desc>
+ The path + basename for auxiliary files generated by the unattended
+ installation. This defaults to the VM folder + Unattended + VM UUID.
+
+ The files which gets generated depends on the OS being installed. When
+ installing Windows there is currently only a auxiliaryBasePath + "floppy.img"
+ being created. But for linux, a "cdrom.viso" and one or more configuration
+ files are generate generated.
+ </desc>
+ </attribute>
+
+ <attribute name="imageIndex" type="unsigned long">
+ <desc>
+ The image index on installation CD/DVD used to install. This index should be
+ one of the indices of <link to="IUnattended::detectedImageIndices"/>.
+
+ Changing this after ISO detection may cause
+ <link to="IUnattended::detectedOSTypeId"/>, <link to="IUnattended::detectedOSVersion"/>,
+ <link to="IUnattended::detectedOSFlavor"/>, <link to="IUnattended::detectedOSLanguages"/>,
+ and <link to="IUnattended::detectedOSHints"/> to be updated with values
+ specific to the selected image.
+
+ Used only with Windows installation CD/DVD:
+ https://technet.microsoft.com/en-us/library/cc766022%28v=ws.10%29.aspx
+ </desc>
+ </attribute>
+
+ <attribute name="scriptTemplatePath" type="wstring">
+ <desc>
+ The unattended installation script template file.
+
+ The template default is based on the guest OS type and is determined by the
+ internal installer when when <link to="IUnattended::prepare"/> is invoked.
+ Most users will want the defaults.
+
+ After <link to="IUnattended::prepare"/> is called, it can be read to see
+ which file is being used.
+ </desc>
+ </attribute>
+
+ <attribute name="postInstallScriptTemplatePath" type="wstring">
+ <desc>
+ The post installation (shell/batch) script template file.
+
+ The template default is based on the guest OS type and is determined by the
+ internal installer when when <link to="IUnattended::prepare"/> is invoked.
+ Most users will want the defaults.
+
+ After <link to="IUnattended::prepare"/> is called, it can be read to see
+ which file is being used.
+ </desc>
+ </attribute>
+
+ <attribute name="postInstallCommand" type="wstring">
+ <desc>
+ Custom post installation command.
+
+ Exactly what is expected as input here depends on the guest OS installer
+ and the post installation script template (see
+ <link to="IUnattended::postInstallScriptTemplatePath"/>).
+ Most users will not need to set this attribute.
+ </desc>
+ </attribute>
+
+ <attribute name="extraInstallKernelParameters" type="wstring">
+ <desc>
+ Extra kernel arguments passed to the install kernel of some guests.
+
+ This is currently only picked up by linux guests. The exact parameters
+ are specific to the guest OS being installed of course.
+
+ After <link to="IUnattended::prepare"/> is called, it can be read to see
+ which parameters are being used.
+ </desc>
+ </attribute>
+
+ <attribute name="detectedOSTypeId" type="wstring" readonly="yes">
+ <desc>
+ The detected OS type ID (<link to="IGuestOSType::id"/>).
+
+ Set by <link to="IUnattended::detectIsoOS"/> or <link to="IUnattended::prepare"/>.
+
+ Not yet implemented.
+ </desc>
+ </attribute>
+
+ <attribute name="detectedOSVersion" type="wstring" readonly="yes">
+ <desc>
+ The detected OS version string.
+
+ Set by <link to="IUnattended::detectIsoOS"/> or <link to="IUnattended::prepare"/>.
+
+ Not yet implemented.
+ </desc>
+ </attribute>
+
+ <attribute name="detectedOSFlavor" type="wstring" readonly="yes">
+ <desc>
+ The detected OS flavor (e.g. server, desktop, etc)
+
+ Set by <link to="IUnattended::detectIsoOS"/> or <link to="IUnattended::prepare"/>.
+
+ Not yet implemented.
+ </desc>
+ </attribute>
+
+ <attribute name="detectedOSLanguages" type="wstring" readonly="yes">
+ <desc>
+ The space separated list of (Windows) installation UI languages we detected (lang.ini).
+
+ The language specifier format is specific to the guest OS. They are
+ used to set <link to="IUnattended::language"/>.
+
+ Set by <link to="IUnattended::detectIsoOS"/> or <link to="IUnattended::prepare"/>.
+
+ Partially implemented.
+ </desc>
+ </attribute>
+
+ <attribute name="detectedOSHints" type="wstring" readonly="yes">
+ <desc>
+ Space separated list of other stuff detected about the OS and the
+ installation ISO.
+
+ Set by <link to="IUnattended::detectIsoOS"/> or <link to="IUnattended::prepare"/>.
+
+ Not yet implemented.
+ </desc>
+ </attribute>
+
+ <attribute name="detectedImageNames" type="wstring" readonly="yes" safearray="yes">
+ <desc>
+ A list of names of the images detected from install.wim file of a Windows Vista
+ or later ISO. This array is parallel to <link to="IUnattended::detectedImageIndices"/>.
+ This will be empty for older Windows ISOs and non-Windows ISOs.
+ </desc>
+ </attribute>
+
+ <attribute name="detectedImageIndices" type="unsigned long" readonly="yes" safearray="yes">
+ <desc>
+ A list of image indexes detected from install.wim file of a Windows ISO. This array
+ is parallel to <link to="IUnattended::detectedImageNames"/>. <link to="IUnattended::imageIndex"/>
+ should be set to one of these indices for Vista and later Windows ISOs.
+ </desc>
+ </attribute>
+
+ <attribute name="isUnattendedInstallSupported" type="boolean" readonly="yes">
+ <desc>
+ Checks the detected OS type and version against a set of rules and returns
+ whether unattended install is supported or not. Note that failing detecting
+ OS type from the ISO causes this attribute to be false by default.
+ </desc>
+ </attribute>
+
+ <attribute name="avoidUpdatesOverNetwork" type="boolean">
+ <desc>
+ When set to true installation is configured to abstain from
+ using network to update/get data. Especially useful when network
+ is not available (as in our test boxes).
+ </desc>
+ </attribute>
+
+ <method name="detectIsoOS">
+ <desc>
+ Detects the OS on the ISO given by <link to="IUnattended::isoPath"/> and sets
+ <link to="IUnattended::detectedOSTypeId"/>, <link to="IUnattended::detectedOSVersion"/>
+ <link to="IUnattended::detectedOSFlavor"/>, <link to="IUnattended::detectedOSLanguages"/>,
+ <link to="IUnattended::detectedOSHints"/>, <link to="IUnattended::detectedImageNames"/>,
+ and <link to="IUnattended::detectedImageIndices"/>,
+
+ Not really yet implemented.
+ </desc>
+ </method>
+
+ <method name="prepare">
+ <desc>
+ Prepare for running the unattended process of installation.
+
+ This will perform <link to="IUnattended::detectIsoOS"/> if not yet called on the
+ current <link to="IUnattended::isoPath"/> value. It may then may cause
+ <link to="IUnattended::detectedOSTypeId"/>, <link to="IUnattended::detectedOSVersion"/>,
+ <link to="IUnattended::detectedOSFlavor"/>, <link to="IUnattended::detectedOSLanguages"/>,
+ and <link to="IUnattended::detectedOSHints"/> to be updated with values
+ specific to the image selected by <link to="IUnattended::imageIndex"/> if the ISO
+ contains images.
+
+ This method will then instantiate the installer based on the detected guest type
+ (see <link to="IUnattended::detectedOSTypeId"/>).
+ </desc>
+ </method>
+
+ <method name="constructMedia">
+ <desc>
+ Constructors the necessary ISO/VISO/Floppy images, with unattended scripts
+ and all necessary bits on them.
+ </desc>
+ </method>
+
+ <method name="reconfigureVM">
+ <desc>
+ Reconfigures the machine to start the installation.
+
+ This involves mounting the ISOs and floppy images created by
+ <link to="IUnattended::constructMedia"/>, attaching new DVD and floppy
+ drives as necessary, and possibly modifying the boot order.
+ </desc>
+ </method>
+
+ <method name="done">
+ <desc>
+ Done - time to start the VM.
+
+ This deletes the internal installer instance that <link to="IUnattended::prepare"/>
+ created. Before done() is called, it is not possible to start over again
+ from <link to="IUnattended::prepare"/>.
+ </desc>
+ </method>
+
+ </interface>
+
+ <!--
+ // IMachine
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IInternalMachineControl" extends="$unknown"
+ uuid="EA05E40C-CB31-423B-B3B7-A5B19300F40C"
+ internal="yes"
+ wsmap="suppress"
+ >
+
+ <method name="updateState">
+ <desc>
+ Updates the VM state.
+ <note>
+ This operation will also update the settings file with the correct
+ information about the saved state file and delete this file from disk
+ when appropriate.
+ </note>
+ </desc>
+ <param name="state" type="MachineState" dir="in"/>
+ </method>
+
+ <method name="beginPowerUp">
+ <desc>
+ Tells VBoxSVC that <link to="IConsole::powerUp"/> is under ways and
+ gives it the progress object that should be part of any pending
+ <link to="IMachine::launchVMProcess"/> operations. The progress
+ object may be called back to reflect an early cancelation, so some care
+ have to be taken with respect to any cancelation callbacks. The console
+ object will call <link to="IInternalMachineControl::endPowerUp"/>
+ to signal the completion of the progress object.
+ </desc>
+ <param name="progress" type="IProgress" dir="in" />
+ </method>
+
+ <method name="endPowerUp">
+ <desc>
+ Tells VBoxSVC that <link to="IConsole::powerUp"/> has completed.
+ This method may query status information from the progress object it
+ received in <link to="IInternalMachineControl::beginPowerUp"/> and copy
+ it over to any in-progress <link to="IMachine::launchVMProcess"/>
+ call in order to complete that progress object.
+ </desc>
+ <param name="result" type="long" dir="in"/>
+ </method>
+
+ <method name="beginPoweringDown">
+ <desc>
+ Called by the VM process to inform the server it wants to
+ stop the VM execution and power down.
+ </desc>
+ <param name="progress" type="IProgress" dir="out">
+ <desc>
+ Progress object created by VBoxSVC to wait until
+ the VM is powered down.
+ </desc>
+ </param>
+ </method>
+
+ <method name="endPoweringDown">
+ <desc>
+ Called by the VM process to inform the server that powering
+ down previously requested by #beginPoweringDown is either
+ successfully finished or there was a failure.
+
+ <result name="VBOX_E_FILE_ERROR">
+ Settings file not accessible.
+ </result>
+ <result name="VBOX_E_XML_ERROR">
+ Could not parse the settings file.
+ </result>
+
+ </desc>
+
+ <param name="result" type="long" dir="in">
+ <desc>@c S_OK to indicate success.
+ </desc>
+ </param>
+ <param name="errMsg" type="wstring" dir="in">
+ <desc>@c human readable error message in case of failure.
+ </desc>
+ </param>
+ </method>
+
+ <method name="runUSBDeviceFilters">
+ <desc>
+ Asks the server to run USB devices filters of the associated
+ machine against the given USB device and tell if there is
+ a match.
+ <note>
+ Intended to be used only for remote USB devices. Local
+ ones don't require to call this method (this is done
+ implicitly by the Host and USBProxyService).
+ </note>
+ </desc>
+ <param name="device" type="IUSBDevice" dir="in"/>
+ <param name="matched" type="boolean" dir="out"/>
+ <param name="maskedInterfaces" type="unsigned long" dir="out"/>
+ </method>
+
+ <method name="captureUSBDevice">
+ <desc>
+ Requests a capture of the given host USB device.
+ When the request is completed, the VM process will
+ get a <link to="IInternalSessionControl::onUSBDeviceAttach"/>
+ notification.
+ </desc>
+ <param name="id" type="uuid" mod="string" dir="in"/>
+ <param name="captureFilename" type="wstring" dir="in"/>
+ </method>
+
+ <method name="detachUSBDevice">
+ <desc>
+ Notification that a VM is going to detach (@a done = @c false) or has
+ already detached (@a done = @c true) the given USB device.
+ When the @a done = @c true request is completed, the VM process will
+ get a <link to="IInternalSessionControl::onUSBDeviceDetach"/>
+ notification.
+ <note>
+ In the @a done = @c true case, the server must run its own filters
+ and filters of all VMs but this one on the detached device
+ as if it were just attached to the host computer.
+ </note>
+ </desc>
+ <param name="id" type="uuid" mod="string" dir="in"/>
+ <param name="done" type="boolean" dir="in"/>
+ </method>
+
+ <method name="autoCaptureUSBDevices">
+ <desc>
+ Requests a capture all matching USB devices attached to the host.
+ When the request is completed, the VM process will
+ get a <link to="IInternalSessionControl::onUSBDeviceAttach"/>
+ notification per every captured device.
+ </desc>
+ </method>
+
+ <method name="detachAllUSBDevices">
+ <desc>
+ Notification that a VM that is being powered down. The done
+ parameter indicates whether which stage of the power down
+ we're at. When @a done = @c false the VM is announcing its
+ intentions, while when @a done = @c true the VM is reporting
+ what it has done.
+ <note>
+ In the @a done = @c true case, the server must run its own filters
+ and filters of all VMs but this one on all detach devices as
+ if they were just attached to the host computer.
+ </note>
+ </desc>
+ <param name="done" type="boolean" dir="in"/>
+ </method>
+
+ <method name="onSessionEnd">
+ <desc>
+ Triggered by the given session object when the session is about
+ to close normally.
+ </desc>
+ <param name="session" type="ISession" dir="in">
+ <desc>Session that is being closed</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Used to wait until the corresponding machine is actually
+ dissociated from the given session on the server.
+ Returned only when this session is a direct one.
+ </desc>
+ </param>
+ </method>
+
+ <method name="finishOnlineMergeMedium">
+ <desc>
+ Gets called by <link to="IInternalSessionControl::onlineMergeMedium"/>.
+ All necessary state information is available at the called object.
+ </desc>
+ </method>
+
+ <method name="pullGuestProperties">
+ <desc>
+ Get the list of the guest properties matching a set of patterns along
+ with their values, timestamps and flags and give responsibility for
+ managing properties to the console.
+ </desc>
+ <param name="names" type="wstring" dir="out" safearray="yes">
+ <desc>
+ The names of the properties returned.
+ </desc>
+ </param>
+ <param name="values" type="wstring" dir="out" safearray="yes">
+ <desc>
+ The values of the properties returned. The array entries match the
+ corresponding entries in the @a name array.
+ </desc>
+ </param>
+ <param name="timestamps" type="long long" dir="out" safearray="yes">
+ <desc>
+ The timestamps of the properties returned. The array entries match
+ the corresponding entries in the @a name array.
+ </desc>
+ </param>
+ <param name="flags" type="wstring" dir="out" safearray="yes">
+ <desc>
+ The flags of the properties returned. The array entries match the
+ corresponding entries in the @a name array.
+ </desc>
+ </param>
+ </method>
+ <method name="pushGuestProperty">
+ <desc>
+ Update a single guest property in IMachine.
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>
+ The name of the property to be updated.
+ </desc>
+ </param>
+ <param name="value" type="wstring" dir="in">
+ <desc>
+ The value of the property.
+ </desc>
+ </param>
+ <param name="timestamp" type="long long" dir="in">
+ <desc>
+ The timestamp of the property.
+ </desc>
+ </param>
+ <param name="flags" type="wstring" dir="in">
+ <desc>
+ The flags of the property.
+ </desc>
+ </param>
+ <param name="fWasDeleted" type="boolean" dir="in">
+ <desc>
+ The flag which indicates if property was deleted.
+ </desc>
+ </param>
+ </method>
+
+ <method name="lockMedia">
+ <desc>
+ Locks all media attached to the machine for writing and parents of
+ attached differencing media (if any) for reading. This operation is
+ atomic so that if it fails no media is actually locked.
+
+ This method is intended to be called when the machine is in Starting or
+ Restoring state. The locked media will be automatically unlocked when
+ the machine is powered off or crashed.
+ </desc>
+ </method>
+ <method name="unlockMedia">
+ <desc>
+ Unlocks all media previously locked using
+ <link to="IInternalMachineControl::lockMedia"/>.
+
+ This method is intended to be used with teleportation so that it is
+ possible to teleport between processes on the same machine.
+ </desc>
+ </method>
+
+ <method name="ejectMedium">
+ <desc>
+ Tells VBoxSVC that the guest has ejected the medium associated with
+ the medium attachment.
+ </desc>
+ <param name="attachment" type="IMediumAttachment" dir="in">
+ <desc>
+ The medium attachment where the eject happened.
+ </desc>
+ </param>
+ <param name="newAttachment" type="IMediumAttachment" dir="return">
+ <desc>
+ A new reference to the medium attachment, as the config change can
+ result in the creation of a new instance.
+ </desc>
+ </param>
+ </method>
+
+ <method name="reportVmStatistics">
+ <desc>
+ Passes statistics collected by VM (including guest statistics) to VBoxSVC.
+ </desc>
+ <param name="validStats" type="unsigned long" dir="in">
+ <desc>
+ Mask defining which parameters are valid. For example: 0x11 means
+ that cpuIdle and XXX are valid. Other parameters should be ignored.
+ </desc>
+ </param>
+ <param name="cpuUser" type="unsigned long" dir="in">
+ <desc>Percentage of processor time spent in user mode as seen by the guest.</desc>
+ </param>
+ <param name="cpuKernel" type="unsigned long" dir="in">
+ <desc>Percentage of processor time spent in kernel mode as seen by the guest.</desc>
+ </param>
+ <param name="cpuIdle" type="unsigned long" dir="in">
+ <desc>Percentage of processor time spent idling as seen by the guest.</desc>
+ </param>
+ <param name="memTotal" type="unsigned long" dir="in">
+ <desc>Total amount of physical guest RAM.</desc>
+ </param>
+ <param name="memFree" type="unsigned long" dir="in">
+ <desc>Free amount of physical guest RAM.</desc>
+ </param>
+ <param name="memBalloon" type="unsigned long" dir="in">
+ <desc>Amount of ballooned physical guest RAM.</desc>
+ </param>
+ <param name="memShared" type="unsigned long" dir="in">
+ <desc>Amount of shared physical guest RAM.</desc>
+ </param>
+ <param name="memCache" type="unsigned long" dir="in">
+ <desc>Total amount of guest (disk) cache memory.</desc>
+ </param>
+ <param name="pagedTotal" type="unsigned long" dir="in">
+ <desc>Total amount of space in the page file.</desc>
+ </param>
+ <param name="memAllocTotal" type="unsigned long" dir="in">
+ <desc>Total amount of memory allocated by the hypervisor.</desc>
+ </param>
+ <param name="memFreeTotal" type="unsigned long" dir="in">
+ <desc>Total amount of free memory available in the hypervisor.</desc>
+ </param>
+ <param name="memBalloonTotal" type="unsigned long" dir="in">
+ <desc>Total amount of memory ballooned by the hypervisor.</desc>
+ </param>
+ <param name="memSharedTotal" type="unsigned long" dir="in">
+ <desc>Total amount of shared memory in the hypervisor.</desc>
+ </param>
+ <param name="vmNetRx" type="unsigned long" dir="in">
+ <desc>Network receive rate for VM.</desc>
+ </param>
+ <param name="vmNetTx" type="unsigned long" dir="in">
+ <desc>Network transmit rate for VM.</desc>
+ </param>
+ </method>
+
+ <method name="authenticateExternal">
+ <desc>
+ Verify credentials using the external auth library.
+ </desc>
+ <param name="authParams" type="wstring" dir="in" safearray="yes">
+ <desc>
+ The auth parameters, credentials, etc.
+ </desc>
+ </param>
+ <param name="result" type="wstring" dir="out">
+ <desc>
+ The authentification result.
+ </desc>
+ </param>
+ </method>
+ </interface>
+
+ <interface
+ name="IGraphicsAdapter" extends="$unknown"
+ uuid="f692806f-febe-4049-b476-1292a8e45b09"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>
+ The IGraphicsAdapter interface represents the graphics adapter
+ of the virtual machine.
+ </desc>
+
+ <attribute name="graphicsControllerType" type="GraphicsControllerType">
+ <desc>Graphics controller type.</desc>
+ </attribute>
+
+ <attribute name="VRAMSize" type="unsigned long">
+ <desc>Video memory size in megabytes.</desc>
+ </attribute>
+
+ <attribute name="accelerate3DEnabled" type="boolean" default="false">
+ <desc>
+ This setting determines whether VirtualBox allows this machine to make
+ use of the 3D graphics support available on the host.</desc>
+ </attribute>
+
+ <attribute name="accelerate2DVideoEnabled" type="boolean" default="false">
+ <desc>
+ This setting determines whether VirtualBox allows this machine to make
+ use of the 2D video acceleration support available on the host.</desc>
+ </attribute>
+
+ <attribute name="monitorCount" type="unsigned long">
+ <desc>
+ Number of virtual monitors.
+ <note>
+ Only effective on Windows XP and later guests with
+ Guest Additions installed.
+ </note>
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IBIOSSettings" extends="$unknown"
+ uuid="a0a7f210-b857-4468-be26-c29f36a84345"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="2" reservedAttributes="8"
+ >
+ <desc>
+ The IBIOSSettings interface represents BIOS settings of the virtual
+ machine. This is used only in the <link to="IMachine::BIOSSettings" /> attribute.
+ </desc>
+ <attribute name="logoFadeIn" type="boolean">
+ <desc>Fade in flag for BIOS logo animation.</desc>
+ </attribute>
+
+ <attribute name="logoFadeOut" type="boolean">
+ <desc>Fade out flag for BIOS logo animation.</desc>
+ </attribute>
+
+ <attribute name="logoDisplayTime" type="unsigned long">
+ <desc>BIOS logo display time in milliseconds (0 = default).</desc>
+ </attribute>
+
+ <attribute name="logoImagePath" type="wstring">
+ <desc>
+ Local file system path for external BIOS splash image. Empty string
+ means the default image is shown on boot.
+ </desc>
+ </attribute>
+
+ <attribute name="bootMenuMode" type="BIOSBootMenuMode">
+ <desc>Mode of the BIOS boot device menu.</desc>
+ </attribute>
+
+ <attribute name="ACPIEnabled" type="boolean">
+ <desc>ACPI support flag.</desc>
+ </attribute>
+
+ <attribute name="IOAPICEnabled" type="boolean">
+ <desc>
+ I/O-APIC support flag. If set, VirtualBox will provide an I/O-APIC
+ and support IRQs above 15.
+ </desc>
+ </attribute>
+
+ <attribute name="APICMode" type="APICMode">
+ <desc>
+ APIC mode to set up by the firmware.
+ </desc>
+ </attribute>
+
+ <attribute name="timeOffset" type="long long">
+ <desc>
+ Offset in milliseconds from the host system time. This allows for
+ guests running with a different system date/time than the host.
+ It is equivalent to setting the system date/time in the BIOS except
+ it is not an absolute value but a relative one. Guest Additions
+ time synchronization honors this offset.
+ </desc>
+ </attribute>
+
+ <attribute name="PXEDebugEnabled" type="boolean">
+ <desc>
+ PXE debug logging flag. If set, VirtualBox will write extensive
+ PXE trace information to the release log.
+ </desc>
+ </attribute>
+
+ <attribute name="SMBIOSUuidLittleEndian" type="boolean">
+ <desc>
+ Flag to control whether the SMBIOS system UUID is presented in little endian
+ form to the guest as mandated by the SMBIOS spec chapter 7.2.1.
+ Before VirtualBox version 6.1 it was always presented in big endian form
+ and to retain the old behavior this flag was introduced so it can be changed.
+ VMs created with VBox 6.1 will default to true for this flag.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <enum
+ name="TpmType"
+ uuid="c669b9f7-a547-42b6-8464-636aa53401eb"
+ >
+ <desc>
+ TPM type enumeration.
+ </desc>
+
+ <const name="None" value="0">
+ <desc>No TPM present in the virtual machine.</desc>
+ </const>
+ <const name="v1_2" value="1">
+ <desc>A TPM compliant to the 1.2 TCG specification is emulated.</desc>
+ </const>
+ <const name="v2_0" value="2">
+ <desc>A TPM compliant to the 2.0 TCG specification is emulated.</desc>
+ </const>
+ <const name="Host" value="3">
+ <desc>The host TPM is passed through, might not be available on all host platforms.</desc>
+ </const>
+ <const name="Swtpm" value="4">
+ <desc>The VM will attach to an external software TPM emulation compliant to swtpm.</desc>
+ </const>
+ </enum>
+
+ <interface
+ name="ITrustedPlatformModule" extends="$unknown"
+ uuid="cf11d345-0241-4ea9-ac4c-c69ed3d674e3"
+ wsmap="managed"
+ reservedMethods="2" reservedAttributes="8"
+ >
+ <desc>
+ The ITrustedPlatformModule interface represents the settings of the virtual
+ machine's trusted platform module. This is used only in the <link to="IMachine::trustedPlatformModule"/> attribute.
+ </desc>
+
+ <attribute name="type" type="TpmType">
+ <desc>
+ Type of TPM configured for the virtual machine.
+ </desc>
+ </attribute>
+
+ <attribute name="location" type="wstring">
+ <desc>
+ Location of the TPM. This is only used for the TpmType_Swtpm type of TPM
+ where the location denotes a <b>hostname:port</b> where to connect to.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <enum
+ name="RecordingDestination"
+ uuid="11E3F06B-DEC1-48B9-BDC4-1E618D72893C"
+ >
+ <desc>
+ Recording destination enumeration.
+ </desc>
+
+ <const name="None" value="0">
+ <desc>No destination.</desc>
+ </const>
+ <const name="File" value="1">
+ <desc>Destination is a regular file.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="RecordingFeature"
+ uuid="A7DDC6A5-DAA8-4485-B860-E9F2E98A7794"
+ >
+ <desc>
+ Recording feature flags. More than one flag may be set.
+ </desc>
+
+ <const name="None" value="0x0">
+ <desc>No feature set.</desc>
+ </const>
+ <const name="Video" value="0x1">
+ <desc>Video recording.</desc>
+ </const>
+ <const name="Audio" value="0x2">
+ <desc>Audio recording.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="RecordingAudioCodec"
+ uuid="16c42be8-1713-4717-a8b9-c65a6549fbcd"
+ >
+ <desc>
+ Recording audio codec enumeration.
+ </desc>
+
+ <const name="None" value="0">
+ <desc>No codec set.</desc>
+ </const>
+ <const name="WavPCM" value="1">
+ <desc>WAV format, linear PCM, uncompressed.</desc>
+ </const>
+ <const name="MP3" value="2">
+ <desc>MPEG-2 Audio Layer III.</desc>
+ </const>
+ <const name="OggVorbis" value="3">
+ <desc>Ogg Vorbis.</desc>
+ </const>
+ <const name="Opus" value="4">
+ <desc>Opus Audio.</desc>
+ </const>
+ <const name="Other" value="5">
+ <desc>Other codec.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="RecordingCodecDeadline"
+ uuid="53627ae1-31cf-4303-9cd5-0c22fd2637cf"
+ >
+ <desc>
+ Recording codec deadline.
+
+ How (and if at all) this deadline is being implemented depends on the codec being used.
+ </desc>
+
+ <const name="Default" value="0">
+ <desc>Default deadline.</desc>
+ </const>
+ <const name="Realtime" value="1">
+ <desc>Realtime quality, often resulting in poor / basic quality.</desc>
+ </const>
+ <const name="Good" value="2">
+ <desc>Balance between realtime and best deadline.</desc>
+ </const>
+ <const name="Best" value="3">
+ <desc>Best quality, slowest.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="RecordingVideoCodec"
+ uuid="93791063-3e8c-4310-987c-ddb43ff03ffe"
+ >
+ <desc>
+ Recording video codec enumeration.
+ </desc>
+
+ <const name="None" value="0">
+ <desc>No codec set.</desc>
+ </const>
+ <const name="MJPEG" value="1">
+ <desc>Motion JPEG.</desc>
+ </const>
+ <const name="H262" value="2">
+ <desc>MPEG-2, Part 2.</desc>
+ </const>
+ <const name="H264" value="3">
+ <desc>Advanced Video Coding (AVC), MPEG-4 Part 10.</desc>
+ </const>
+ <const name="H265" value="4">
+ <desc>High Efficiency Video Coding (HEVC), MPEG-H Part 2.</desc>
+ </const>
+ <const name="H266" value="5">
+ <desc>Versatile Video Coding (VVC), MPEG-I Part 3.</desc>
+ </const>
+ <const name="VP8" value="6">
+ <desc>VP8 codec.</desc>
+ </const>
+ <const name="VP9" value="7">
+ <desc>VP9 codec.</desc>
+ </const>
+ <const name="AV1" value="8">
+ <desc>AOMedia Video 1 codec.</desc>
+ </const>
+ <const name="Other" value="9">
+ <desc>Other codec.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="RecordingVideoScalingMode"
+ uuid="0dd1127d-4f62-4b82-beee-91086a9f1d24"
+ >
+ <desc>
+ Recording video scaling method enumeration.
+ </desc>
+
+ <const name="None" value="0">
+ <desc>No scaling performed.
+ The image wil be cropped when the source is bigger than the target size.</desc>
+ </const>
+ <const name="NearestNeighbor" value="1">
+ <desc>Performs scaling via nearest-neighbor interpolation.
+ Not yet implemented.</desc>
+ </const>
+ <const name="Bilinear" value="2">
+ <desc>Performs scaling via bilinear interpolation.
+ Not yet implemented.</desc>
+ </const>
+ <const name="Bicubic" value="3">
+ <desc>Performs scaling via bicubic interpolation.
+ Not yet implemented.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="RecordingRateControlMode"
+ uuid="d07a33ac-b4ea-4917-942d-c03be14fbe2f"
+ >
+ <desc>
+ Recording video rate control mode enumeration.
+ <note>Not all codecs may support all rate control modes.</note>
+ </desc>
+
+ <const name="ABR" value="0">
+ <desc>Average bit rate (ABR). Constrained to a certain size.</desc>
+ </const>
+ <const name="CBR" value="1">
+ <desc>Constant bit rate (CBR). Constrained to a certain size.</desc>
+ </const>
+ <const name="VBR" value="2">
+ <desc>Variable bit rate (VBR). Constrained to a certain quality.</desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IRecordingScreenSettings" extends="$unknown"
+ uuid="c1844087-ec6b-488d-afbb-c90f6452a04b"
+ wsmap="managed"
+ rest="managed"
+ >
+
+ <desc>
+ The IRecordingScreenSettings interface represents recording settings of a
+ single virtual screen. This is used only in the <link to="IRecordingSettings" />
+ interface.
+ </desc>
+
+ <method name="isFeatureEnabled">
+ <desc>Returns whether a particular recording feature is enabled for this
+ screen or not.</desc>
+ <param name="feature" type="RecordingFeature" dir="in">
+ <desc>Feature to check for.</desc>
+ </param>
+ <param name="enabled" type="boolean" dir="return">
+ <desc>@c true if the feature is enabled, @c false if not.</desc>
+ </param>
+ </method>
+
+ <attribute name="id" type="unsigned long" readonly="yes">
+ <desc>
+ This attribute contains the screen ID bound to these settings.
+ </desc>
+ </attribute>
+
+ <attribute name="enabled" type="boolean" default="false">
+ <desc>
+ This setting determines whether this screen is enabled while recording.
+ </desc>
+ </attribute>
+
+ <attribute name="features" type="RecordingFeature" safearray="yes">
+ <desc>This setting determines all enabled recording features for this
+ screen.</desc>
+ </attribute>
+
+ <attribute name="destination" type="RecordingDestination">
+ <desc>This setting determines the recording destination for this
+ screen.</desc>
+ </attribute>
+
+ <attribute name="filename" type="wstring">
+ <desc>
+ This setting determines the filename VirtualBox uses to save
+ the recorded content. This setting cannot be changed while video
+ recording is enabled.
+ <note>
+ When setting this attribute, the specified path has to be
+ absolute (full path). When reading this attribute, a full path is
+ always returned.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="maxTime" type="unsigned long" default="0">
+ <desc>
+ This setting defines the maximum amount of time in seconds
+ to record. Recording will stop as soon as the defined time
+ interval has elapsed. If this value is zero, recording will not be
+ limited by time. This setting cannot be changed while recording is
+ enabled.
+ </desc>
+ </attribute>
+
+ <attribute name="maxFileSize" type="unsigned long" default="0">
+ <desc>
+ This setting determines the maximal number of recording file
+ size in MB. Recording will stop as soon as the file size has
+ reached the defined value. If this value is zero, recording
+ will not be limited by the file size. This setting cannot be changed
+ while recording is enabled.
+ </desc>
+ </attribute>
+
+ <attribute name="options" type="wstring">
+ <desc>
+ This setting contains any additional recording options required in
+ comma-separated key=value format, which are currently not represented
+ via own attribtues. Consider these options as experimental and mostly
+ for codec-specific settings, and are subject to change. This setting
+ cannot be changed while recording is enabled.
+ </desc>
+ </attribute>
+
+ <attribute name="audioCodec" type="RecordingAudioCodec">
+ <desc>
+ Determines the audio codec to use for encoding the
+ recorded audio data. This setting cannot be changed while recording is
+ enabled.
+
+ <note>
+ Only the Opus codec is supported currently.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="audioRateControlMode" type="RecordingRateControlMode">
+ <desc>
+ Determines the audio rate control mode. This setting cannot be changed
+ while recording is enabled.
+ </desc>
+ </attribute>
+
+ <attribute name="audioDeadline" type="RecordingCodecDeadline" default="Default">
+ <desc>
+ Determines the audio deadline to use.
+ This setting cannot be changed while recording is enabled.
+ </desc>
+ </attribute>
+
+ <attribute name="audioHz" type="unsigned long" default="22050">
+ <desc>
+ Determines the Hertz (Hz) rate of the recorded audio data. This setting
+ cannot be changed while recording is enabled.
+ </desc>
+ </attribute>
+
+ <attribute name="audioBits" type="unsigned long" default="16">
+ <desc>
+ Determines the bits per sample of the recorded audio data. This setting
+ cannot be changed while recording is enabled.
+ </desc>
+ </attribute>
+
+ <attribute name="audioChannels" type="unsigned long" default="2">
+ <desc>
+ Determines the audio channels of the recorded audio data.
+ Specifiy 2 for stereo or 1 for mono. More than stereo (2) channels
+ are not supported at the moment. This setting cannot be changed while
+ recording is enabled.
+ </desc>
+ </attribute>
+
+ <attribute name="videoCodec" type="RecordingVideoCodec">
+ <desc>
+ Determines the video codec to use for encoding the recorded video data.
+ This setting cannot be changed while recording is enabled.
+
+ <note>
+ Only the VP8 codec is supported currently.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="videoDeadline" type="RecordingCodecDeadline" default="Default">
+ <desc>
+ Determines the video deadline to use.
+ This setting cannot be changed while recording is enabled.
+ </desc>
+ </attribute>
+
+ <attribute name="videoWidth" type="unsigned long" default="1024">
+ <desc>
+ Determines the horizontal resolution of the recorded video data. This
+ setting cannot be changed while recording is enabled.
+ </desc>
+ </attribute>
+
+ <attribute name="videoHeight" type="unsigned long" default="768">
+ <desc>
+ Determines the vertical resolution of the recorded video data. This
+ setting cannot be changed while recording is enabled.
+ </desc>
+ </attribute>
+
+ <attribute name="videoRate" type="unsigned long" default="512">
+ <desc>
+ Determines the bitrate in kilobits per second. Increasing this value
+ makes the video look better for the cost of an increased file size or
+ transfer rate. This setting cannot be changed while recording is enabled.
+ </desc>
+ </attribute>
+
+ <attribute name="videoRateControlMode" type="RecordingRateControlMode">
+ <desc>
+ Determines the video rate control mode. This setting cannot be changed
+ while recording is enabled.
+ </desc>
+ </attribute>
+
+ <attribute name="videoFPS" type="unsigned long" default="25">
+ <desc>
+ Determines the maximum number of frames per second (FPS). Frames with
+ a higher frequency will be skipped. Reducing this value increases the
+ number of skipped frames and reduces the file size or transfer rate.
+ This setting cannot be changed while recording is enabled.
+ </desc>
+ </attribute>
+
+ <attribute name="videoScalingMode" type="RecordingVideoScalingMode">
+ <desc>
+ Determines the video scaling mode to use.
+ This setting cannot be changed while recording is enabled.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IRecordingSettings" extends="$unknown"
+ uuid="D88F2A5A-47C7-4A3F-AAE1-1B516817DB41"
+ wsmap="managed"
+ rest="managed"
+ >
+
+ <desc>
+ The IRecordingSettings interface represents recording settings of the virtual
+ machine. This is used only in the <link to="IMachine::recordingSettings" />
+ attribute.
+ </desc>
+
+ <method name="getScreenSettings">
+ <desc>Returns the recording settings for a particular screen.</desc>
+ <param name="screenId" type="unsigned long" dir="in">
+ <desc>Screen ID to retrieve recording screen settings for.</desc>
+ </param>
+ <param name="recordScreenSettings" type="IRecordingScreenSettings" dir="return">
+ <desc>Recording screen settings for the requested screen.</desc>
+ </param>
+ </method>
+
+ <attribute name="enabled" type="boolean" default="false">
+ <desc>
+ This setting determines whether VirtualBox uses recording to record a
+ VM session.</desc>
+ </attribute>
+
+ <attribute name="screens" type="IRecordingScreenSettings" readonly="yes" safearray="yes">
+ <desc>
+ This setting returns an array for recording settings of all configured
+ virtual screens.</desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IPCIAddress" extends="$unknown"
+ uuid="c984d15f-e191-400b-840e-970f3dad7296"
+ wsmap="managed"
+ rest="managed"
+ >
+
+ <desc>
+ Address on the PCI bus.
+ </desc>
+
+ <attribute name="bus" type="short">
+ <desc>
+ Bus number.
+ </desc>
+ </attribute>
+
+ <attribute name="device" type="short">
+ <desc>
+ Device number.
+ </desc>
+ </attribute>
+
+ <attribute name="devFunction" type="short">
+ <desc>
+ Device function number.
+ </desc>
+ </attribute>
+
+ <method name="asLong">
+ <desc>
+ Convert PCI address into long.
+ </desc>
+ <param name="result" type="long" dir="return" />
+ </method>
+
+ <method name="fromLong">
+ <desc>
+ Make PCI address from long.
+ </desc>
+ <param name="number" type="long" dir="in" />
+ </method>
+ </interface>
+
+ <interface
+ name="IPCIDeviceAttachment" extends="$unknown"
+ uuid="91f33d6f-e621-4f70-a77e-15f0e3c714d5"
+ wsmap="struct"
+ rest="managed"
+ >
+
+ <desc>
+ Information about PCI attachments.
+ </desc>
+
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>
+ Device name.
+ </desc>
+ </attribute>
+
+ <attribute name="isPhysicalDevice" type="boolean" readonly="yes">
+ <desc>
+ If this is physical or virtual device.
+ </desc>
+ </attribute>
+
+ <attribute name="hostAddress" type="long" readonly="yes">
+ <desc>
+ Address of device on the host, applicable only to host devices.
+ </desc>
+ </attribute>
+
+ <attribute name="guestAddress" type="long" readonly="yes">
+ <desc>
+ Address of device in the guest.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <enum
+ name="SignatureType"
+ uuid="6f6e67ef-9a32-4084-af84-5702679f882a"
+ >
+ <desc>
+ UEFI signature type enumeration.
+ </desc>
+
+ <const name="X509" value="0">
+ <desc>X.509 certificate.</desc>
+ </const>
+ <const name="Sha256" value="1">
+ <desc>SHA256 hash.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="UefiVariableAttributes"
+ uuid="cda505ec-b444-4aef-b55c-b687717bdac5"
+ >
+ <desc>
+ Possible variable attributes. More than one flag may be set.
+ <see><link to="IUefiVariableStore"/></see>
+ </desc>
+
+ <const name="None" value="0">
+ <desc>No attributes set.</desc>
+ </const>
+ <const name="NonVolatile" value="0x01">
+ <desc>Variable is stored in non volatile storage.</desc>
+ </const>
+ <const name="BootServiceAccess" value="0x02">
+ <desc>Variable can be accessed from the boot services.</desc>
+ </const>
+ <const name="RuntimeAccess" value="0x04">
+ <desc>Variable can be accessed from the runtime.</desc>
+ </const>
+ <const name="HwErrorRecord" value="0x08">
+ <desc>Variable contains a hardware error record.</desc>
+ </const>
+ <const name="AuthWriteAccess" value="0x100">
+ <desc>Writing to this variable requires an authenticated source.</desc>
+ </const>
+ <const name="AuthTimeBasedWriteAccess" value="0x200">
+ <desc>Variable was written with a time based authentication.</desc>
+ </const>
+ <const name="AuthAppendWrite" value="0x400">
+ <desc>The variable can be appended only.</desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IUefiVariableStore" extends="$unknown"
+ uuid="d134c6b6-4479-430d-bb73-68a452ba3e67"
+ wsmap="managed"
+ reservedMethods="9" reservedAttributes="5"
+ >
+ <desc>
+ The IUefiVariableStore interface allows inspecting and manipulating the content
+ of an existing UEFI variable store in a NVRAM file. This is used only in the
+ <link to="INvramStore::uefiVariableStore" /> attribute.
+ </desc>
+
+ <attribute name="secureBootEnabled" type="boolean">
+ <desc>Flag whether secure boot is currently enabled for the VM.</desc>
+ </attribute>
+
+ <method name="addVariable">
+ <desc>Adds a new variable to the non volatile storage area.</desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the variable.</desc>
+ </param>
+ <param name="owner" type="uuid" mod="string" dir="in">
+ <desc>UUID of the variable owner.</desc>
+ </param>
+ <param name="attributes" type="UefiVariableAttributes" safearray="yes" dir="in">
+ <desc>Attributes of the variable.</desc>
+ </param>
+ <param name="data" type="octet" dir="in" safearray="yes">
+ <desc>The variable data.</desc>
+ </param>
+ </method>
+
+ <method name="deleteVariable">
+ <desc>Deletes the given variable from the non volatile storage area.</desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the variable.</desc>
+ </param>
+ <param name="owner" type="uuid" mod="string" dir="in">
+ <desc>UUID of the variable owner.</desc>
+ </param>
+ </method>
+
+ <method name="changeVariable">
+ <desc>Changes the data of the given variable.</desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the variable.</desc>
+ </param>
+ <param name="data" type="octet" dir="in" safearray="yes">
+ <desc>The new variable data.</desc>
+ </param>
+ </method>
+
+ <method name="queryVariableByName">
+ <desc>Queries the variable content variable by the given name.</desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the variable to look for.</desc>
+ </param>
+ <param name="owner" type="uuid" mod="string" dir="out">
+ <desc>UUID of the variable owner returned on success.</desc>
+ </param>
+ <param name="attributes" type="UefiVariableAttributes" safearray="yes" dir="out">
+ <desc>Attributes of the variable.</desc>
+ </param>
+ <param name="data" type="octet" dir="out" safearray="yes">
+ <desc>The variable data returned on success.</desc>
+ </param>
+ </method>
+
+ <method name="queryVariables">
+ <desc>
+ Queries all variables in the non volatile storage and returns their names.
+ </desc>
+ <param name="names" type="wstring" dir="out" safearray="yes">
+ <desc>The variable names returned on success.</desc>
+ </param>
+ <param name="owners" type="uuid" mod="string" dir="out" safearray="yes">
+ <desc>UUID of the variable owners returned on success.</desc>
+ </param>
+ </method>
+
+ <method name="enrollOraclePlatformKey">
+ <desc>
+ Enroll the default platform key from Oracle for enabling Secure Boot.
+ </desc>
+ </method>
+
+ <method name="enrollPlatformKey">
+ <desc>
+ Convenience method to enroll a new platform key (PK) for enabling Secure Boot.
+ </desc>
+ <param name="platformKey" type="octet" safearray="yes" dir="in">
+ <desc>The platform key (PK) to enroll.</desc>
+ </param>
+ <param name="owner" type="uuid" mod="string" dir="in">
+ <desc>UUID of the PK owner.</desc>
+ </param>
+ </method>
+
+ <method name="addKek">
+ <desc>
+ Convenience method to add a new Key Encryption Key (KEK) for Secure Boot.
+ </desc>
+ <param name="keyEncryptionKey" type="octet" safearray="yes" dir="in">
+ <desc>The Key Encryption Key (KEK) to add.</desc>
+ </param>
+ <param name="owner" type="uuid" mod="string" dir="in">
+ <desc>UUID of the KEK owner.</desc>
+ </param>
+ <param name="signatureType" type="SignatureType" dir="in">
+ <desc>Type of the signature.</desc>
+ </param>
+ </method>
+
+ <method name="addSignatureToDb">
+ <desc>
+ Convenience method to add a new entry to the signature database.
+ </desc>
+ <param name="signature" type="octet" safearray="yes" dir="in">
+ <desc>The signature to add.</desc>
+ </param>
+ <param name="owner" type="uuid" mod="string" dir="in">
+ <desc>UUID of the signature owner.</desc>
+ </param>
+ <param name="signatureType" type="SignatureType" dir="in">
+ <desc>Type of the signature.</desc>
+ </param>
+ </method>
+
+ <method name="addSignatureToDbx">
+ <desc>
+ Convenience method to add a new entry to the forbidden signature database.
+ </desc>
+ <param name="signature" type="octet" safearray="yes" dir="in">
+ <desc>The signature to add.</desc>
+ </param>
+ <param name="owner" type="uuid" mod="string" dir="in">
+ <desc>UUID of the signature owner.</desc>
+ </param>
+ <param name="signatureType" type="SignatureType" dir="in">
+ <desc>Type of the signature.</desc>
+ </param>
+ </method>
+
+ <method name="enrollDefaultMsSignatures">
+ <desc>
+ Convenience method to enroll the standard Microsoft KEK and signatures
+ in the signature databases.
+ </desc>
+ </method>
+
+ <method name="addSignatureToMok">
+ <desc>
+ Convenience method to add a new entry to the MOK (Machine Owner Key) signature database.
+ </desc>
+ <param name="signature" type="octet" safearray="yes" dir="in">
+ <desc>The signature to add.</desc>
+ </param>
+ <param name="owner" type="uuid" mod="string" dir="in">
+ <desc>UUID of the signature owner.</desc>
+ </param>
+ <param name="signatureType" type="SignatureType" dir="in">
+ <desc>Type of the signature.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <interface
+ name="INvramStore" extends="$unknown"
+ uuid="5bfd8965-b81b-469f-8649-f717ce97a5d5"
+ wsmap="managed"
+ >
+
+ <desc>
+ Provides access to the NVRAM store collecting all permanent states from different sources
+ (UEFI, TPM, etc.).
+ </desc>
+
+ <attribute name="nonVolatileStorageFile" type="wstring" readonly="yes">
+ <desc>
+ The location of the file storing the non-volatile memory content when
+ the VM is powered off. The file does not always exist.
+ </desc>
+ </attribute>
+
+ <attribute name="uefiVariableStore" type="IUefiVariableStore" readonly="yes">
+ <desc>Object to manipulate the data in an existing UEFI variable store.</desc>
+ </attribute>
+
+ <attribute name="keyId" type="wstring" readonly="yes">
+ <desc>
+ Key Id of the password used for encrypting the NVRAM file.
+ Internal use only for now.
+ </desc>
+ </attribute>
+
+ <attribute name="keyStore" type="wstring" readonly="yes">
+ <desc>
+ Key store used for encrypting the NVRAM file.
+ Internal use only for now.
+ </desc>
+ </attribute>
+
+ <method name="initUefiVariableStore">
+ <desc>Initializes the UEFI variable store.</desc>
+ <param name="size" type="unsigned long" dir="in">
+ <desc>
+ Size in bytes of the UEFI variable store. Must be 0 for now to initialize to the
+ default size.
+ </desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <enum
+ name="GraphicsControllerType"
+ uuid="3e009bb0-2b57-4283-a39b-4c363d4f0808"
+ >
+ <desc>Graphics controller type, used with <link to="IGraphicsAdapter::graphicsControllerType" />.
+ </desc>
+ <const name="Null" value="0">
+ <desc>Reserved value, invalid.</desc>
+ </const>
+ <const name="VBoxVGA" value="1">
+ <desc>VirtualBox VGA device.</desc>
+ </const>
+ <const name="VMSVGA" value="2">
+ <desc>VMware SVGA II device.</desc>
+ </const>
+ <const name="VBoxSVGA" value="3">
+ <desc>VirtualBox VGA device with VMware SVGA II extensions.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="CleanupMode"
+ uuid="67897c50-7cca-47a9-83f6-ce8fd8eb5441"
+ >
+ <desc>Cleanup mode, used with <link to="IMachine::unregister" />.
+ </desc>
+ <const name="UnregisterOnly" value="1">
+ <desc>Unregister only the machine, but neither delete snapshots nor detach media.</desc>
+ </const>
+ <const name="DetachAllReturnNone" value="2">
+ <desc>Delete all snapshots and detach all media but return none; this will keep all media registered.</desc>
+ </const>
+ <const name="DetachAllReturnHardDisksOnly" value="3">
+ <desc>Delete all snapshots, detach all media and return hard disks for closing, but not removable media.</desc>
+ </const>
+ <const name="Full" value="4">
+ <desc>Delete all snapshots, detach all media and return all media for closing.</desc>
+ </const>
+ <const name="DetachAllReturnHardDisksAndVMRemovable" value="5">
+ <desc>Delete all snapshots, detach all media and return hard disks and removable
+ media located in the folder of the machine to be deleted and referenced only
+ by this machine, for closing.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="CloneMode"
+ uuid="A7A159FE-5096-4B8D-8C3C-D033CB0B35A8"
+ >
+
+ <desc>
+ Clone mode, used with <link to="IMachine::cloneTo" />.
+ </desc>
+
+ <const name="MachineState" value="1">
+ <desc>Clone the state of the selected machine.</desc>
+ </const>
+ <const name="MachineAndChildStates" value="2">
+ <desc>Clone the state of the selected machine and its child snapshots if present.</desc>
+ </const>
+ <const name="AllStates" value="3">
+ <desc>Clone all states (including all snapshots) of the machine, regardless of the machine object used.</desc>
+ </const>
+
+ </enum>
+
+ <enum
+ name="CloneOptions"
+ uuid="22243f8e-96ab-497c-8cf0-f40a566c630b"
+ >
+
+ <desc>
+ Clone options, used with <link to="IMachine::cloneTo" />.
+ </desc>
+
+ <const name="Link" value="1">
+ <desc>Create a clone VM where all virtual disks are linked to the original VM.</desc>
+ </const>
+ <const name="KeepAllMACs" value="2">
+ <desc>Don't generate new MAC addresses of the attached network adapters.</desc>
+ </const>
+ <const name="KeepNATMACs" value="3">
+ <desc>Don't generate new MAC addresses of the attached network adapters when they are using NAT.</desc>
+ </const>
+ <const name="KeepDiskNames" value="4">
+ <desc>Don't change the disk names.</desc>
+ </const>
+ <const name="KeepHwUUIDs" value="5">
+ <desc>Don't change UUID of the machine hardware.</desc>
+ </const>
+
+ </enum>
+
+ <enum
+ name="AutostopType"
+ uuid="6bb96740-cf34-470d-aab2-2cd48ea2e10e"
+ >
+
+ <desc>
+ Autostop types, used with <link to="IMachine::autostopType" />.
+ </desc>
+
+ <const name="Disabled" value="1">
+ <desc>Stopping the VM during system shutdown is disabled.</desc>
+ </const>
+ <const name="SaveState" value="2">
+ <desc>The state of the VM will be saved when the system shuts down.</desc>
+ </const>
+ <const name="PowerOff" value="3">
+ <desc>The VM is powered off when the system shuts down.</desc>
+ </const>
+ <const name="AcpiShutdown" value="4">
+ <desc>An ACPI shutdown event is generated.</desc>
+ </const>
+
+ </enum>
+
+ <enum
+ name="VMProcPriority"
+ uuid="6fa72dd5-19b7-46ba-bc52-f223c98c7d80"
+ >
+ <desc>
+ Virtual machine process priorities.
+ </desc>
+
+ <const name="Invalid" value="0">
+ <desc>Invalid priority, do not use.</desc>
+ </const>
+ <const name="Default" value="1">
+ <desc>Default process priority determined by the OS.</desc>
+ </const>
+ <const name="Flat" value="2">
+ <desc>
+ Assumes a scheduling policy which puts the process at the default
+ priority and with all threads at the same priority
+ </desc>
+ </const>
+ <const name="Low" value="3">
+ <desc>
+ Assumes a scheduling policy which puts the process mostly below the
+ default priority of the host OS.
+ </desc>
+ </const>
+ <const name="Normal" value="5">
+ <desc>
+ Assume a scheduling policy which shares the CPU resources fairly with
+ other processes running with the default priority of the host OS.
+ </desc>
+ </const>
+ <const name="High" value="6">
+ <desc>
+ Assumes a scheduling policy which puts the task above the default
+ priority of the host OS. This policy might easily cause other tasks
+ in the system to starve.
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="IommuType"
+ uuid="f47339cb-b94e-48fe-b507-2900103d7b9f"
+ >
+ <desc>
+ The IOMMU type. This enumeration represents possible
+ values for the <link to="IMachine::iommuType"/> attribute.
+ </desc>
+ <const name="None" value="0">
+ <desc>No IOMMU is present.</desc>
+ </const>
+ <const name="Automatic" value="1">
+ <desc>No IOMMU is present.</desc>
+ </const>
+ <const name="AMD" value="2">
+ <desc>An AMD IOMMU.</desc>
+ </const>
+ <const name="Intel" value="3">
+ <desc>An Intel IOMMU.</desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IMachine" extends="$unknown"
+ uuid="300763af-5d6b-46e6-aa96-273eac15538a"
+ wsmap="managed"
+ rest="managed"
+ wrap-hint-server-addinterfaces="IInternalMachineControl"
+ wrap-hint-server="manualaddinterfaces"
+ reservedMethods="8" reservedAttributes="16"
+ >
+ <!-- Note! This interface is not compatible between 5.0 and 5.1 as it had too many
+ methods/attributes for midl and the reservedAttributes had to be
+ decreased. Max methods+attributes is 256, so in 6.0 this interface must
+ be refactored a little! In the mean time, take from reservedMethods and
+ reservedAttributes and update the UUID like always. -->
+ <desc>
+ The IMachine interface represents a virtual machine, or guest, created
+ in VirtualBox.
+
+ This interface is used in two contexts. First of all, a collection of
+ objects implementing this interface is stored in the
+ <link to="IVirtualBox::machines"/> attribute which lists all the virtual
+ machines that are currently registered with this VirtualBox
+ installation. Also, once a session has been opened for the given virtual
+ machine (e.g. the virtual machine is running), the machine object
+ associated with the open session can be queried from the session object;
+ see <link to="ISession"/> for details.
+
+ The main role of this interface is to expose the settings of the virtual
+ machine and provide methods to change various aspects of the virtual
+ machine's configuration. For machine objects stored in the
+ <link to="IVirtualBox::machines"/> collection, all attributes are
+ read-only unless explicitly stated otherwise in individual attribute
+ and method descriptions.
+
+ In order to change a machine setting, a session for this machine must be
+ opened using one of the <link to="IMachine::lockMachine" /> or
+ <link to="IMachine::launchVMProcess"/> methods. After the
+ machine has been successfully locked for a session, a mutable machine object
+ needs to be queried from the session object and then the desired settings
+ changes can be applied to the returned object using IMachine attributes and
+ methods. See the <link to="ISession"/> interface description for more
+ information about sessions.
+
+ Note that IMachine does not provide methods to control virtual machine
+ execution (such as start the machine, or power it down) -- these methods
+ are grouped in a separate interface called <link to="IConsole" />.
+
+ <see><link to="ISession"/>, <link to="IConsole"/></see>
+ </desc>
+
+ <attribute name="parent" type="IVirtualBox" readonly="yes" wrap-hint-server="limitedcaller" rest="suppress">
+ <desc>Associated parent object.</desc>
+ </attribute>
+
+ <attribute name="icon" type="octet" safearray="yes">
+ <desc>Overridden VM Icon details.</desc>
+ </attribute>
+
+ <attribute name="accessible" type="boolean" readonly="yes" wrap-hint-server="limitedcaller">
+ <desc>
+ Whether this virtual machine is currently accessible or not.
+
+ A machine is always deemed accessible unless it is registered <i>and</i>
+ its settings file cannot be read or parsed (either because the file itself
+ is unavailable or has invalid XML contents).
+
+ Every time this property is read, the accessibility state of
+ this machine is re-evaluated. If the returned value is @c false,
+ the <link to="#accessError"/> property may be used to get the
+ detailed error information describing the reason of
+ inaccessibility, including XML error messages.
+
+ When the machine is inaccessible, only the following properties
+ can be used on it:
+ <ul>
+ <li><link to="#parent"/></li>
+ <li><link to="#id"/></li>
+ <li><link to="#settingsFilePath"/></li>
+ <li><link to="#accessible"/></li>
+ <li><link to="#accessError"/></li>
+ </ul>
+
+ An attempt to access any other property or method will return
+ an error.
+
+ The only possible action you can perform on an inaccessible
+ machine is to unregister it using the
+ <link to="IMachine::unregister"/> call (or, to check
+ for the accessibility state once more by querying this
+ property).
+
+ <note>
+ In the current implementation, once this property returns
+ @c true, the machine will never become inaccessible
+ later, even if its settings file cannot be successfully
+ read/written any more (at least, until the VirtualBox
+ server is restarted). This limitation may be removed in
+ future releases.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="accessError" type="IVirtualBoxErrorInfo" readonly="yes" wrap-hint-server="limitedcaller">
+ <desc>
+ Error information describing the reason of machine
+ inaccessibility.
+
+ Reading this property is only valid after the last call to
+ <link to="#accessible"/> returned @c false (i.e. the
+ machine is currently inaccessible). Otherwise, a @c null
+ IVirtualBoxErrorInfo object will be returned.
+ </desc>
+ </attribute>
+
+ <attribute name="name" type="wstring">
+ <desc>
+ Name of the virtual machine.
+
+ Besides being used for human-readable identification purposes
+ everywhere in VirtualBox, the virtual machine name is also used
+ as a name of the machine's settings file and as a name of the
+ subdirectory this settings file resides in. Thus, every time you
+ change the value of this property, the settings file will be
+ renamed once you call <link to="#saveSettings"/> to confirm the
+ change. The containing subdirectory will be also renamed, but
+ only if it has exactly the same name as the settings file
+ itself prior to changing this property (for backward compatibility
+ with previous API releases). The above implies the following
+ limitations:
+ <ul>
+ <li>The machine name cannot be empty.</li>
+ <li>The machine name can contain only characters that are valid
+ file name characters according to the rules of the file
+ system used to store VirtualBox configuration.</li>
+ <li>You cannot have two or more machines with the same name
+ if they use the same subdirectory for storing the machine
+ settings files.</li>
+ <li>You cannot change the name of the machine if it is running,
+ or if any file in the directory containing the settings file
+ is being used by another running machine or by any other
+ process in the host operating system at a time when
+ <link to="#saveSettings"/> is called.
+ </li>
+ </ul>
+ If any of the above limitations are hit, <link to="#saveSettings"/>
+ will return an appropriate error message explaining the exact
+ reason and the changes you made to this machine will not be saved.
+
+ Starting with VirtualBox 4.0, a ".vbox" extension of the settings
+ file is recommended, but not enforced. (Previous versions always
+ used a generic ".xml" extension.)
+ </desc>
+ </attribute>
+
+ <attribute name="description" type="wstring">
+ <desc>
+ Description of the virtual machine.
+
+ The description attribute can contain any text and is
+ typically used to describe the hardware and software
+ configuration of the virtual machine in detail (i.e. network
+ settings, versions of the installed software and so on).
+ </desc>
+ </attribute>
+
+ <attribute name="id" type="uuid" mod="string" readonly="yes" wrap-hint-server="limitedcaller">
+ <desc>UUID of the virtual machine.</desc>
+ </attribute>
+
+ <attribute name="groups" type="wstring" safearray="yes">
+ <desc>
+ Array of machine group names of which this machine is a member.
+ <tt>""</tt> and <tt>"/"</tt> are synonyms for the toplevel group. Each
+ group is only listed once, however they are listed in no particular
+ order and there is no guarantee that there are no gaps in the group
+ hierarchy (i.e. <tt>"/group"</tt>,
+ <tt>"/group/subgroup/subsubgroup"</tt> is a valid result).
+ </desc>
+ </attribute>
+
+ <attribute name="OSTypeId" type="wstring">
+ <desc>
+ User-defined identifier of the Guest OS type.
+ You may use <link to="IVirtualBox::getGuestOSType"/> to obtain
+ an IGuestOSType object representing details about the given
+ Guest OS type. All Guest OS types are considered valid, even those
+ which are not known to <link to="IVirtualBox::getGuestOSType"/>.
+ <note>
+ This value may differ from the value returned by
+ <link to="IGuest::OSTypeId"/> if Guest Additions are
+ installed to the guest OS.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="hardwareVersion" type="wstring">
+ <desc>Hardware version identifier. Internal use only for now.</desc>
+ </attribute>
+
+ <attribute name="hardwareUUID" type="uuid" mod="string">
+ <desc>
+ The UUID presented to the guest via memory tables, hardware and guest
+ properties. For most VMs this is the same as the @a id, but for VMs
+ which have been cloned or teleported it may be the same as the source
+ VM. The latter is because the guest shouldn't notice that it was
+ cloned or teleported.
+ </desc>
+ </attribute>
+
+ <attribute name="CPUCount" type="unsigned long">
+ <desc>Number of virtual CPUs in the VM.</desc>
+ </attribute>
+
+ <attribute name="CPUHotPlugEnabled" type="boolean">
+ <desc>
+ This setting determines whether VirtualBox allows CPU
+ hotplugging for this machine.</desc>
+ </attribute>
+
+ <attribute name="CPUExecutionCap" type="unsigned long">
+ <desc>
+ Means to limit the number of CPU cycles a guest can use. The unit
+ is percentage of host CPU cycles per second. The valid range
+ is 1 - 100. 100 (the default) implies no limit.
+ </desc>
+ </attribute>
+
+ <attribute name="CPUIDPortabilityLevel" type="unsigned long">
+ <desc>Virtual CPUID portability level, the higher number the fewer newer
+ or vendor specific CPU feature is reported to the guest (via the CPUID
+ instruction). The default level of zero (0) means that all virtualized
+ features supported by the host is pass thru to the guest. While the
+ three (3) is currently the level supressing the most features.
+
+ Exactly which of the CPUID features are left out by the VMM at which
+ level is subject to change with each major version.
+ </desc>
+ </attribute>
+
+ <attribute name="memorySize" type="unsigned long">
+ <desc>System memory size in megabytes.</desc>
+ </attribute>
+
+ <attribute name="memoryBalloonSize" type="unsigned long">
+ <desc>Memory balloon size in megabytes.</desc>
+ </attribute>
+
+ <attribute name="pageFusionEnabled" type="boolean">
+ <desc>
+ This setting determines whether VirtualBox allows page
+ fusion for this machine (64-bit hosts only).
+ </desc>
+ </attribute>
+
+ <attribute name="graphicsAdapter" type="IGraphicsAdapter" readonly="yes">
+ <desc>Graphics adapter object.</desc>
+ </attribute>
+
+ <attribute name="BIOSSettings" type="IBIOSSettings" readonly="yes">
+ <desc>Object containing all BIOS settings.</desc>
+ </attribute>
+
+ <attribute name="trustedPlatformModule" type="ITrustedPlatformModule" readonly="yes">
+ <desc>Object containing all TPM settings.</desc>
+ </attribute>
+
+ <attribute name="nonVolatileStore" type="INvramStore" readonly="yes">
+ <desc>Object to manipulate data in the non volatile storage file.</desc>
+ </attribute>
+
+ <attribute name="recordingSettings" type="IRecordingSettings" readonly="yes">
+ <desc>Object containing all recording settings.</desc>
+ </attribute>
+
+ <attribute name="firmwareType" type="FirmwareType">
+ <desc>Type of firmware (such as legacy BIOS or EFI), used for initial
+ bootstrap in this VM.</desc>
+ </attribute>
+
+ <attribute name="pointingHIDType" type="PointingHIDType">
+ <desc>Type of pointing HID (such as mouse or tablet) used in this VM.
+ The default is typically "PS2Mouse" but can vary depending on the
+ requirements of the guest operating system.</desc>
+ </attribute>
+
+ <attribute name="keyboardHIDType" type="KeyboardHIDType">
+ <desc>Type of keyboard HID used in this VM.
+ The default is typically "PS2Keyboard" but can vary depending on the
+ requirements of the guest operating system.</desc>
+ </attribute>
+
+ <attribute name="HPETEnabled" type="boolean">
+ <desc>This attribute controls if High Precision Event Timer (HPET) is
+ enabled in this VM. Use this property if you want to provide guests
+ with additional time source, or if guest requires HPET to function correctly.
+ Default is false.</desc>
+ </attribute>
+
+ <attribute name="chipsetType" type="ChipsetType">
+ <desc>Chipset type used in this VM.</desc>
+ </attribute>
+
+ <attribute name="iommuType" type="IommuType">
+ <desc>IOMMU type used in this VM.</desc>
+ </attribute>
+
+ <attribute name="snapshotFolder" type="wstring">
+ <desc>
+ Full path to the directory used to store snapshot data
+ (differencing media and saved state files) of this machine.
+
+ The initial value of this property is
+ <tt>&lt;</tt><link to="#settingsFilePath">
+ path_to_settings_file</link><tt>&gt;/&lt;</tt>
+ <link to="#id">machine_uuid</link>
+ <tt>&gt;</tt>.
+
+ Currently, it is an error to try to change this property on
+ a machine that has snapshots (because this would require to
+ move possibly large files to a different location).
+ A separate method will be available for this purpose later.
+
+ <note>
+ Setting this property to @c null or to an empty string will restore
+ the initial value.
+ </note>
+ <note>
+ When setting this property, the specified path can be
+ absolute (full path) or relative to the directory where the
+ <link to="#settingsFilePath">machine settings file</link>
+ is located. When reading this property, a full path is
+ always returned.
+ </note>
+ <note>
+ The specified path may not exist, it will be created
+ when necessary.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="VRDEServer" type="IVRDEServer" readonly="yes">
+ <desc>VirtualBox Remote Desktop Extension (VRDE) server object.</desc>
+ </attribute>
+
+ <attribute name="emulatedUSBCardReaderEnabled" type="boolean" default="false"/>
+
+ <attribute name="mediumAttachments" type="IMediumAttachment" readonly="yes" safearray="yes">
+ <desc>Array of media attached to this machine.</desc>
+ </attribute>
+
+ <attribute name="USBControllers" type="IUSBController" readonly="yes" safearray="yes">
+ <desc>
+ Array of USB controllers attached to this machine.
+
+ <note>
+ If USB functionality is not available in the given edition of
+ VirtualBox, this method will set the result code to @c E_NOTIMPL.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="USBDeviceFilters" type="IUSBDeviceFilters" readonly="yes">
+ <desc>
+ Associated USB device filters object.
+
+ <note>
+ If USB functionality is not available in the given edition of
+ VirtualBox, this method will set the result code to @c E_NOTIMPL.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="audioSettings" type="IAudioSettings" readonly="yes">
+ <desc>
+ The machine's audio settings.
+ </desc>
+ </attribute>
+
+ <attribute name="storageControllers" type="IStorageController" readonly="yes" safearray="yes">
+ <desc>Array of storage controllers attached to this machine.</desc>
+ </attribute>
+
+ <attribute name="settingsFilePath" type="wstring" readonly="yes" wrap-hint-server="limitedcaller">
+ <desc>
+ Full name of the file containing machine settings data.
+ </desc>
+ </attribute>
+
+ <attribute name="settingsAuxFilePath" type="wstring" readonly="yes" wrap-hint-server="limitedcaller" rest="suppress">
+ <desc>
+ Full name of the file containing auxiliary machine settings data.
+ </desc>
+ </attribute>
+
+ <attribute name="settingsModified" type="boolean" readonly="yes" rest="suppress">
+ <desc>
+ Whether the settings of this machine have been modified
+ (but neither yet saved nor discarded).
+ <note>
+ Reading this property is only valid on instances returned
+ by <link to="ISession::machine"/> and on new machines
+ created by <link to="IVirtualBox::createMachine"/> or opened
+ by <link to="IVirtualBox::openMachine"/> but not
+ yet registered, or on unregistered machines after calling
+ <link to="IMachine::unregister"/>. For all other
+ cases, the settings can never be modified.
+ </note>
+ <note>
+ For newly created unregistered machines, the value of this
+ property is always @c true until <link to="#saveSettings"/>
+ is called (no matter if any machine settings have been
+ changed after the creation or not). For opened machines
+ the value is set to @c false (and then follows to normal rules).
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="sessionState" type="SessionState" readonly="yes">
+ <desc>Current session state for this machine.</desc>
+ </attribute>
+
+ <attribute name="sessionName" type="wstring" readonly="yes">
+ <desc>
+ Name of the session. If <link to="#sessionState"/> is
+ Spawning or Locked, this attribute contains the
+ same value as passed to the
+ <link to="IMachine::launchVMProcess"/> method in the
+ @a name parameter. If the session was established with
+ <link to="IMachine::lockMachine" />, it is the name of the session
+ (if set, otherwise empty string). If
+ <link to="#sessionState"/> is SessionClosed, the value of this
+ attribute is an empty string.
+ </desc>
+ </attribute>
+
+ <attribute name="sessionPID" type="unsigned long" readonly="yes">
+ <desc>
+ Identifier of the session process. This attribute contains the
+ platform-dependent identifier of the process whose session was
+ used with <link to="IMachine::lockMachine" /> call. The returned
+ value is only valid if <link to="#sessionState"/> is Locked or
+ Unlocking by the time this property is read.
+ </desc>
+ </attribute>
+
+ <attribute name="state" type="MachineState" readonly="yes">
+ <desc>Current execution state of this machine.</desc>
+ </attribute>
+
+ <attribute name="lastStateChange" type="long long" readonly="yes">
+ <desc>
+ Timestamp of the last execution state change,
+ in milliseconds since 1970-01-01 UTC.
+ </desc>
+ </attribute>
+
+ <attribute name="stateFilePath" type="wstring" readonly="yes">
+ <desc>
+ Full path to the file that stores the execution state of
+ the machine when it is in either the <link to="MachineState_Saved"/>
+ or <link to="MachineState_AbortedSaved"/> state.
+ <note>
+ When the machine is not in the Saved or AbortedSaved state, this
+ attribute is an empty string.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="logFolder" type="wstring" readonly="yes">
+ <desc>
+ Full path to the folder that stores a set of rotated log files
+ recorded during machine execution. The most recent log file is
+ named <tt>VBox.log</tt>, the previous log file is
+ named <tt>VBox.log.1</tt> and so on (up to <tt>VBox.log.3</tt>
+ in the current version).
+ </desc>
+ </attribute>
+
+ <attribute name="currentSnapshot" type="ISnapshot" readonly="yes">
+ <desc>
+ Current snapshot of this machine. This is @c null if the machine
+ currently has no snapshots. If it is not @c null, then it was
+ set by one of <link to="#takeSnapshot" />, <link to="#deleteSnapshot" />
+ or <link to="#restoreSnapshot" />, depending on which was called last.
+ See <link to="ISnapshot"/> for details.
+ </desc>
+ </attribute>
+
+ <attribute name="snapshotCount" type="unsigned long" readonly="yes">
+ <desc>
+ Number of snapshots taken on this machine. Zero means the
+ machine doesn't have any snapshots.
+ </desc>
+ </attribute>
+
+ <attribute name="currentStateModified" type="boolean" readonly="yes">
+ <desc>
+ Returns @c true if the current state of the machine is not
+ identical to the state stored in the current snapshot.
+
+ The current state is identical to the current snapshot only
+ directly after one of the following calls are made:
+
+ <ul>
+ <li><link to="#restoreSnapshot"/>
+ </li>
+ <li><link to="#takeSnapshot"/> (issued on a "powered off" or "saved"
+ machine, for which <link to="#settingsModified"/> returns @c false)
+ </li>
+ </ul>
+
+ The current state remains identical until one of the following
+ happens:
+ <ul>
+ <li>settings of the machine are changed</li>
+ <li>the saved state is deleted</li>
+ <li>the current snapshot is deleted</li>
+ <li>an attempt to execute the machine is made</li>
+ </ul>
+
+ <note>
+ For machines that don't have snapshots, this property is
+ always @c false.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="sharedFolders" type="ISharedFolder" readonly="yes" safearray="yes">
+ <desc>
+ Collection of shared folders for this machine (permanent shared
+ folders). These folders are shared automatically at machine startup
+ and available only to the guest OS installed within this machine.
+
+ New shared folders are added to the collection using
+ <link to="#createSharedFolder"/>. Existing shared folders can be
+ removed using <link to="#removeSharedFolder"/>.
+ </desc>
+ </attribute>
+
+ <attribute name="clipboardMode" type="ClipboardMode">
+ <desc>
+ Synchronization mode between the host OS clipboard
+ and the guest OS clipboard.
+ </desc>
+ </attribute>
+
+ <attribute name="clipboardFileTransfersEnabled" type="boolean">
+ <desc>
+ Sets or retrieves whether clipboard file transfers are allowed or not.
+
+ When set to @a true, clipboard file transfers between supported
+ host and guest OSes are allowed.
+ </desc>
+ </attribute>
+
+ <attribute name="dnDMode" type="DnDMode">
+ <desc>
+ Sets or retrieves the current drag'n drop mode.
+ </desc>
+ </attribute>
+
+ <attribute name="teleporterEnabled" type="boolean">
+ <desc>
+ When set to @a true, the virtual machine becomes a target teleporter
+ the next time it is powered on. This can only set to @a true when the
+ VM is in the @a PoweredOff or @a Aborted state.
+
+ <!-- This property is automatically set to @a false when the VM is powered
+ on. (bird: This doesn't work yet ) -->
+ </desc>
+ </attribute>
+
+ <attribute name="teleporterPort" type="unsigned long">
+ <desc>
+ The TCP port the target teleporter will listen for incoming
+ teleportations on.
+
+ 0 means the port is automatically selected upon power on. The actual
+ value can be read from this property while the machine is waiting for
+ incoming teleportations.
+ </desc>
+ </attribute>
+
+ <attribute name="teleporterAddress" type="wstring">
+ <desc>
+ The address the target teleporter will listen on. If set to an empty
+ string, it will listen on all addresses.
+ </desc>
+ </attribute>
+
+ <attribute name="teleporterPassword" type="wstring">
+ <desc>
+ The password to check for on the target teleporter. This is just a
+ very basic measure to prevent simple hacks and operators accidentally
+ beaming a virtual machine to the wrong place.
+
+ Note that you SET a plain text password while reading back a HASHED
+ password. Setting a hashed password is currently not supported.
+ </desc>
+ </attribute>
+
+ <attribute name="paravirtProvider" type="ParavirtProvider">
+ <desc>
+ The paravirtualized guest interface provider.
+ </desc>
+ </attribute>
+
+ <attribute name="RTCUseUTC" type="boolean">
+ <desc>
+ When set to @a true, the RTC device of the virtual machine will run
+ in UTC time, otherwise in local time. Especially Unix guests prefer
+ the time in UTC.
+ </desc>
+ </attribute>
+
+ <attribute name="IOCacheEnabled" type="boolean">
+ <desc>
+ When set to @a true, the builtin I/O cache of the virtual machine
+ will be enabled.
+ </desc>
+ </attribute>
+
+ <attribute name="IOCacheSize" type="unsigned long">
+ <desc>
+ Maximum size of the I/O cache in MB.
+ </desc>
+ </attribute>
+
+ <attribute name="PCIDeviceAssignments" type="IPCIDeviceAttachment" readonly="yes" safearray="yes">
+ <desc>Array of PCI devices assigned to this machine, to get list of all
+ PCI devices attached to the machine use
+ <link to="IConsole::attachedPCIDevices"/> attribute, as this attribute
+ is intended to list only devices additional to what described in
+ virtual hardware config. Usually, this list keeps host's physical
+ devices assigned to the particular machine.
+ </desc>
+ </attribute>
+
+ <attribute name="bandwidthControl" type="IBandwidthControl" readonly="yes">
+ <desc>
+ Bandwidth control manager.
+ </desc>
+ </attribute>
+
+ <attribute name="tracingEnabled" type="boolean">
+ <desc>
+ Enables the tracing facility in the VMM (including PDM devices +
+ drivers). The VMM will consume about 0.5MB of more memory when
+ enabled and there may be some extra overhead from tracepoints that are
+ always enabled.
+ </desc>
+ </attribute>
+
+ <attribute name="tracingConfig" type="wstring">
+ <desc>
+ Tracepoint configuration to apply at startup when
+ <link to="IMachine::tracingEnabled" /> is true. The string specifies
+ a space separated of tracepoint group names to enable. The special
+ group 'all' enables all tracepoints. Check DBGFR3TracingConfig for
+ more details on available tracepoint groups and such.
+
+ Note that on hosts supporting DTrace (or similar), a lot of the
+ tracepoints may be implemented exclusively as DTrace probes. So, the
+ effect of the same config may differ between Solaris and Windows for
+ example.
+ </desc>
+ </attribute>
+
+ <attribute name="allowTracingToAccessVM" type="boolean">
+ <desc>
+ Enables tracepoints in PDM devices and drivers to use the VMCPU or VM
+ structures when firing off trace points. This is especially useful
+ with DTrace tracepoints, as it allows you to use the VMCPU or VM
+ pointer to obtain useful information such as guest register state.
+
+ This is disabled by default because devices and drivers normally has no
+ business accessing the VMCPU or VM structures, and are therefore unable
+ to get any pointers to these.
+ </desc>
+ </attribute>
+
+ <attribute name="autostartEnabled" type="boolean">
+ <desc>
+ Enables autostart of the VM during system boot.
+ </desc>
+ </attribute>
+
+ <attribute name="autostartDelay" type="unsigned long">
+ <desc>
+ Number of seconds to wait until the VM should be started during system boot.
+ </desc>
+ </attribute>
+
+ <attribute name="autostopType" type="AutostopType">
+ <desc>
+ Action type to do when the system is shutting down.
+ </desc>
+ </attribute>
+
+ <attribute name="defaultFrontend" type="wstring">
+ <desc>
+ Selects which VM frontend should be used by default when launching
+ this VM through the <link to="IMachine::launchVMProcess" /> method.
+ Empty or @c null strings do not define a particular default, it is up
+ to <link to="IMachine::launchVMProcess" /> to select one. See the
+ description of <link to="IMachine::launchVMProcess" /> for the valid
+ frontend types.
+
+ This per-VM setting overrides the default defined by
+ <link to="ISystemProperties::defaultFrontend" /> attribute, and is
+ overridden by a frontend type passed to
+ <link to="IMachine::launchVMProcess" />.
+ </desc>
+ </attribute>
+
+ <attribute name="USBProxyAvailable" type="boolean" readonly="yes">
+ <desc>
+ Returns whether there is a USB proxy available.
+ </desc>
+ </attribute>
+
+ <attribute name="VMProcessPriority" type="VMProcPriority">
+ <desc>
+ Sets the priority of the VM process. It is a VM setting which can
+ be changed both before starting the VM and at runtime.
+
+ The default value is 'Default', which selects the default
+ process priority.
+
+ <result name="E_NOTIMPL">
+ This attribute is currently not implemented.
+ </result>
+ </desc>
+ </attribute>
+
+ <attribute name="paravirtDebug" type="wstring">
+ <desc>
+ Debug parameters for the paravirtualized guest interface provider.
+ </desc>
+ </attribute>
+
+ <attribute name="CPUProfile" type="wstring">
+ <desc>
+ Experimental feature to select the guest CPU profile. The default
+ is "host", which indicates the host CPU. All other names are subject
+ to change.
+
+ Use the <link to="ISystemProperties::getCPUProfiles" /> method to get
+ currently available CPU profiles.
+ </desc>
+ </attribute>
+
+ <attribute name="stateKeyId" type="wstring" readonly="yes">
+ <desc>
+ Key Id of the password used for encrypting the state file.
+ Internal use only for now.
+ </desc>
+ </attribute>
+
+ <attribute name="stateKeyStore" type="wstring" readonly="yes">
+ <desc>
+ Key store used for encrypting the state file.
+ Internal use only for now.
+ </desc>
+ </attribute>
+ <attribute name="logKeyId" type="wstring" readonly="yes">
+ <desc>
+ Key Id of the password used for encrypting the log files.
+ Internal use only for now.
+ </desc>
+ </attribute>
+
+ <attribute name="logKeyStore" type="wstring" readonly="yes">
+ <desc>
+ Key store used for encrypting the log files.
+ Internal use only for now.
+ </desc>
+ </attribute>
+
+ <attribute name="guestDebugControl" type="IGuestDebugControl" readonly="yes">
+ <desc>
+ Guest debugging configuration.
+ </desc>
+ </attribute>
+
+ <method name="lockMachine">
+ <rest name="lock" request="post" path="/vms/{vmid}/actions/"/>
+ <desc>
+ Locks the machine for the given session to enable the caller
+ to make changes to the machine or start the VM or control
+ VM execution.
+
+ There are two ways to lock a machine for such uses:
+
+ <ul>
+ <li>If you want to make changes to the machine settings,
+ you must obtain an exclusive write lock on the machine
+ by setting @a lockType to @c Write.
+
+ This will only succeed if no other process has locked
+ the machine to prevent conflicting changes. Only after
+ an exclusive write lock has been obtained using this method, one
+ can change all VM settings or execute the VM in the process
+ space of the session object. (Note that the latter is only of
+ interest if you actually want to write a new front-end for
+ virtual machines; but this API gets called internally by
+ the existing front-ends such as VBoxHeadless and the VirtualBox
+ GUI to acquire a write lock on the machine that they are running.)
+
+ On success, write-locking the machine for a session creates
+ a second copy of the IMachine object. It is this second object
+ upon which changes can be made; in VirtualBox terminology, the
+ second copy is "mutable". It is only this second, mutable machine
+ object upon which you can call methods that change the
+ machine state. After having called this method, you can
+ obtain this second, mutable machine object using the
+ <link to="ISession::machine" /> attribute.
+ </li>
+ <li>If you only want to check the machine state or control
+ machine execution without actually changing machine
+ settings (e.g. to get access to VM statistics or take
+ a snapshot or save the machine state), then set the
+ @a lockType argument to @c Shared.
+
+ If no other session has obtained a lock, you will obtain an
+ exclusive write lock as described above. However, if another
+ session has already obtained such a lock, then a link to that
+ existing session will be established which allows you
+ to control that existing session.
+
+ To find out which type of lock was obtained, you can
+ inspect <link to="ISession::type" />, which will have been
+ set to either @c WriteLock or @c Shared.
+ </li>
+ </ul>
+
+ In either case, you can get access to the <link to="IConsole" />
+ object which controls VM execution.
+
+ Also in all of the above cases, one must always call
+ <link to="ISession::unlockMachine" /> to release the lock on the machine, or
+ the machine's state will eventually be set to "Aborted".
+
+ To change settings on a machine, the following sequence is typically
+ performed:
+
+ <ol>
+ <li>Call this method to obtain an exclusive write lock for the current session.</li>
+
+ <li>Obtain a mutable IMachine object from <link to="ISession::machine" />.</li>
+
+ <li>Change the settings of the machine by invoking IMachine methods.</li>
+
+ <li>Call <link to="IMachine::saveSettings" />.</li>
+
+ <li>Release the write lock by calling <link to="ISession::unlockMachine"/>.</li>
+ </ol>
+
+ <result name="E_UNEXPECTED">
+ Virtual machine not registered.
+ </result>
+ <result name="E_ACCESSDENIED">
+ Process not started by <link to="IMachine::launchVMProcess"/>.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session already open or being opened.
+ </result>
+ <result name="VBOX_E_VM_ERROR">
+ Failed to assign machine to session.
+ </result>
+ </desc>
+ <param name="session" type="ISession" dir="in">
+ <desc>
+ Session object for which the machine will be locked.
+ </desc>
+ </param>
+ <param name="lockType" type="LockType" dir="in">
+ <desc>
+ If set to @c Write, then attempt to acquire an exclusive write lock or fail.
+ If set to @c Shared, then either acquire an exclusive write lock or establish
+ a link to an existing session.
+ </desc>
+ </param>
+ </method>
+
+ <method name="launchVMProcess">
+ <rest name="launch" request="post" path="/vms/{vmid}/actions/"/>
+ <desc>
+ Spawns a new process that will execute the virtual machine and obtains a shared
+ lock on the machine for the calling session.
+
+ If launching the VM succeeds, the new VM process will create its own session
+ and write-lock the machine for it, preventing conflicting changes from other
+ processes. If the machine is already locked (because it is already running or
+ because another session has a write lock), launching the VM process will therefore
+ fail. Reversely, future attempts to obtain a write lock will also fail while the
+ machine is running.
+
+ The caller's session object remains separate from the session opened by the new
+ VM process. It receives its own <link to="IConsole" /> object which can be used
+ to control machine execution, but it cannot be used to change all VM settings
+ which would be available after a <link to="#lockMachine" /> call.
+
+ The caller must eventually release the session's shared lock by calling
+ <link to="ISession::unlockMachine" /> on the local session object once this call
+ has returned. However, the session's state (see <link to="ISession::state" />)
+ will not return to "Unlocked" until the remote session has also unlocked
+ the machine (i.e. the machine has stopped running).
+
+ Launching a VM process can take some time (a new VM is started in a new process,
+ for which memory and other resources need to be set up). Because of this,
+ an <link to="IProgress" /> object is returned to allow the caller to wait
+ for this asynchronous operation to be completed. Until then, the caller's
+ session object remains in the "Unlocked" state, and its <link to="ISession::machine" />
+ and <link to="ISession::console" /> attributes cannot be accessed.
+ It is recommended to use <link to="IProgress::waitForCompletion" /> or
+ similar calls to wait for completion. Completion is signalled when the VM
+ is powered on. If launching the VM fails, error messages can be queried
+ via the progress object, if available.
+
+ The progress object will have at least 2 sub-operations. The first
+ operation covers the period up to the new VM process calls powerUp.
+ The subsequent operations mirror the <link to="IConsole::powerUp"/>
+ progress object. Because <link to="IConsole::powerUp"/> may require
+ some extra sub-operations, the <link to="IProgress::operationCount"/>
+ may change at the completion of operation.
+
+ For details on the teleportation progress operation, see
+ <link to="IConsole::powerUp"/>.
+
+ The @a environmentChanges argument is a list of strings where every string contains
+ environment variable in the putenv style, i.e. "VAR=VALUE" for setting/replacing
+ and "VAR" for unsetting. These environment variables will be applied to the environment
+ of the VirtualBox server process. If an environment variable exists both in the server
+ process and in this list, the value from this list takes precedence over the
+ server's variable. If the value of the environment variable is omitted, this variable
+ will be removed from the resulting environment. If the list is empty, the server
+ environment is inherited by the started process as is.
+
+ <result name="E_UNEXPECTED">
+ Virtual machine not registered.
+ </result>
+ <result name="E_INVALIDARG">
+ Invalid session type @a type.
+ </result>
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ No machine matching @a machineId found.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session already open or being opened.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ Launching process for machine failed.
+ </result>
+ <result name="VBOX_E_VM_ERROR">
+ Failed to assign machine to session.
+ </result>
+ </desc>
+ <param name="session" type="ISession" dir="in">
+ <desc>
+ Client session object to which the VM process will be connected (this
+ must be in "Unlocked" state).
+ </desc>
+ </param>
+ <param name="name" type="wstring" dir="in">
+ <desc>
+ Front-end to use for the new VM process. The following are currently supported:
+ <ul>
+ <li><tt>"gui"</tt>: VirtualBox Qt GUI front-end</li>
+ <li><tt>"headless"</tt>: VBoxHeadless (VRDE Server) front-end</li>
+ <li><tt>"sdl"</tt>: VirtualBox SDL front-end</li>
+ <li><tt>"emergencystop"</tt>: reserved value, used for aborting
+ the currently running VM or session owner. In this case the
+ @a session parameter may be @c null (if it is non-null it isn't
+ used in any way), and the @a progress return value will be always
+ @c null. The operation completes immediately.</li>
+ <li><tt>""</tt>: use the per-VM default frontend if set, otherwise
+ the global default defined in the system properties. If neither
+ are set, the API will launch a <tt>"gui"</tt> session, which may
+ fail if there is no windowing environment available. See
+ <link to="IMachine::defaultFrontend"/> and
+ <link to="ISystemProperties::defaultFrontend"/>.</li>
+ </ul>
+ </desc>
+ </param>
+ <param name="environmentChanges" type="wstring" safearray="yes" dir="in">
+ <desc>
+ The list of putenv-style changes to the VM process environment.
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="setBootOrder">
+ <rest name="bootorder" request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Puts the given device to the specified position in
+ the boot order.
+
+ To indicate that no device is associated with the given position,
+ <link to="DeviceType_Null"/> should be used.
+
+ @todo setHardDiskBootOrder(), setNetworkBootOrder()
+
+ <result name="E_INVALIDARG">
+ Boot @a position out of range.
+ </result>
+ <result name="E_NOTIMPL">
+ Booting from USB @a device currently not supported.
+ </result>
+
+ </desc>
+ <param name="position" type="unsigned long" dir="in">
+ <desc>
+ Position in the boot order (@c 1 to the total number of
+ devices the machine can boot from, as returned by
+ <link to="ISystemProperties::maxBootPosition"/>).
+ </desc>
+ </param>
+ <param name="device" type="DeviceType" dir="in">
+ <desc>
+ The type of the device used to boot at the given position.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getBootOrder" const="yes">
+ <rest name="bootorder" request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Returns the device type that occupies the specified
+ position in the boot order.
+
+ @todo [remove?]
+ If the machine can have more than one device of the returned type
+ (such as hard disks), then a separate method should be used to
+ retrieve the individual device that occupies the given position.
+
+ If here are no devices at the given position, then
+ <link to="DeviceType_Null"/> is returned.
+
+ @todo getHardDiskBootOrder(), getNetworkBootOrder()
+
+ <result name="E_INVALIDARG">
+ Boot @a position out of range.
+ </result>
+
+ </desc>
+ <param name="position" type="unsigned long" dir="in">
+ <desc>
+ Position in the boot order (@c 1 to the total number of
+ devices the machine can boot from, as returned by
+ <link to="ISystemProperties::maxBootPosition"/>).
+ </desc>
+ </param>
+ <param name="device" type="DeviceType" dir="return">
+ <desc>
+ Device at the given position.
+ </desc>
+ </param>
+ </method>
+
+ <method name="attachDevice">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Attaches a device and optionally mounts a medium to the given storage
+ controller (<link to="IStorageController" />, identified by @a name),
+ at the indicated port and device.
+
+ This method is intended for managing storage devices in general while a
+ machine is powered off. It can be used to attach and detach fixed
+ and removable media. The following kind of media can be attached
+ to a machine:
+
+ <ul>
+ <li>For fixed and removable media, you can pass in a medium that was
+ previously opened using <link to="IVirtualBox::openMedium" />.
+ </li>
+
+ <li>Only for storage devices supporting removable media (such as
+ DVDs and floppies), you can also specify a null pointer to
+ indicate an empty drive or one of the medium objects listed
+ in the <link to="IHost::DVDDrives" /> and <link to="IHost::floppyDrives"/>
+ arrays to indicate a host drive.
+ For removable devices, you can also use <link to="IMachine::mountMedium"/>
+ to change the media while the machine is running.
+ </li>
+ </ul>
+
+ In a VM's default configuration of virtual machines, the secondary
+ master of the IDE controller is used for a CD/DVD drive.
+
+ After calling this returns successfully, a new instance of
+ <link to="IMediumAttachment"/> will appear in the machine's list of medium
+ attachments (see <link to="IMachine::mediumAttachments"/>).
+
+ See <link to="IMedium"/> and <link to="IMediumAttachment"/> for more
+ information about attaching media.
+
+ The specified device slot must not have a device attached to it,
+ or this method will fail.
+
+ <note>
+ You cannot attach a device to a newly created machine until
+ this machine's settings are saved to disk using
+ <link to="#saveSettings"/>.
+ </note>
+ <note>
+ If the medium is being attached indirectly, a new differencing medium
+ will implicitly be created for it and attached instead. If the
+ changes made to the machine settings (including this indirect
+ attachment) are later cancelled using <link to="#discardSettings"/>,
+ this implicitly created differencing medium will implicitly
+ be deleted.
+ </note>
+
+ <result name="E_INVALIDARG">
+ SATA device, SATA port, IDE port or IDE slot out of range, or
+ file or UUID not found.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Machine must be registered before media can be attached.
+ </result>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Invalid machine state.
+ </result>
+ <result name="VBOX_E_OBJECT_IN_USE">
+ A medium is already attached to this or another virtual machine.
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the storage controller to attach the device to.</desc>
+ </param>
+ <param name="controllerPort" type="long" dir="in">
+ <desc>Port to attach the device to. For an IDE controller, 0 specifies
+ the primary controller and 1 specifies the secondary controller.
+ For a SCSI controller, this must range from 0 to 15; for a SATA controller,
+ from 0 to 29; for an SAS controller, from 0 to 7.</desc>
+ </param>
+ <param name="device" type="long" dir="in">
+ <desc>Device slot in the given port to attach the device to. This is only
+ relevant for IDE controllers, for which 0 specifies the master device and
+ 1 specifies the slave device. For all other controller types, this must
+ be 0.</desc>
+ </param>
+ <param name="type" type="DeviceType" dir="in">
+ <desc>Device type of the attached device. For media opened by
+ <link to="IVirtualBox::openMedium" />, this must match the device type
+ specified there.</desc>
+ </param>
+ <param name="medium" type="IMedium" dir="in">
+ <desc>Medium to mount or @c null for an empty drive.</desc>
+ </param>
+ </method>
+
+ <method name="attachDeviceWithoutMedium">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Attaches a device and optionally mounts a medium to the given storage
+ controller (<link to="IStorageController" />, identified by @a name),
+ at the indicated port and device.
+
+ This method is intended for managing storage devices in general while a
+ machine is powered off. It can be used to attach and detach fixed
+ and removable media. The following kind of media can be attached
+ to a machine:
+ <ul>
+ <li>
+ For fixed and removable media, you can pass in a medium that was
+ previously opened using <link to="IVirtualBox::openMedium" />.
+ </li>
+
+ <li>Only for storage devices supporting removable media (such as
+ DVDs and floppies) with an empty drive or one of the medium objects listed
+ in the <link to="IHost::DVDDrives" /> and <link to="IHost::floppyDrives"/>
+ arrays to indicate a host drive.
+ For removable devices, you can also use <link to="IMachine::mountMedium"/>
+ to change the media while the machine is running.
+ </li>
+ </ul>
+
+ In a VM's default configuration of virtual machines, the secondary
+ master of the IDE controller is used for a CD/DVD drive.
+ <link to="IMediumAttachment"/> will appear in the machine's list of medium
+ attachments (see <link to="IMachine::mediumAttachments"/>).
+
+ See <link to="IMedium"/> and <link to="IMediumAttachment"/> for more
+ information about attaching media.
+
+ The specified device slot must not have a device attached to it,
+ or this method will fail.
+ <note>
+ You cannot attach a device to a newly created machine until
+ this machine's settings are saved to disk using
+ <link to="#saveSettings"/>.
+ </note>
+ <note>
+ If the medium is being attached indirectly, a new differencing medium
+ will implicitly be created for it and attached instead. If the
+ changes made to the machine settings (including this indirect
+ attachment) are later cancelled using <link to="#discardSettings"/>,
+ this implicitly created differencing medium will implicitly
+ be deleted.
+ </note>
+
+ <result name="E_INVALIDARG">
+ SATA device, SATA port, IDE port or IDE slot out of range, or
+ file or UUID not found.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Machine must be registered before media can be attached.
+ </result>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Invalid machine state.
+ </result>
+ <result name="VBOX_E_OBJECT_IN_USE">
+ A medium is already attached to this or another virtual machine.
+ </result>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the storage controller to attach the device to.</desc>
+ </param>
+ <param name="controllerPort" type="long" dir="in">
+ <desc>Port to attach the device to. For an IDE controller, 0 specifies
+ the primary controller and 1 specifies the secondary controller.
+ For a SCSI controller, this must range from 0 to 15; for a SATA controller,
+ from 0 to 29; for an SAS controller, from 0 to 7.</desc>
+ </param>
+ <param name="device" type="long" dir="in">
+ <desc>Device slot in the given port to attach the device to. This is only
+ relevant for IDE controllers, for which 0 specifies the master device and
+ 1 specifies the slave device. For all other controller types, this must
+ be 0.</desc>
+ </param>
+ <param name="type" type="DeviceType" dir="in">
+ <desc>Device type of the attached device. For media opened by
+ <link to="IVirtualBox::openMedium" />, this must match the device type
+ specified there.</desc>
+ </param>
+ </method>
+
+ <method name="detachDevice">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Detaches the device attached to a device slot of the specified bus.
+
+ Detaching the device from the virtual machine is deferred. This means
+ that the medium remains associated with the machine when this method
+ returns and gets actually de-associated only after a successful
+ <link to="#saveSettings"/> call. See <link to="IMedium"/>
+ for more detailed information about attaching media.
+
+ <note>
+ You cannot detach a device from a running machine.
+ </note>
+ <note>
+ Detaching differencing media implicitly created by <link
+ to="#attachDevice"/> for the indirect attachment using this
+ method will <b>not</b> implicitly delete them. The
+ <link to="IMedium::deleteStorage"/> operation should be
+ explicitly performed by the caller after the medium is successfully
+ detached and the settings are saved with
+ <link to="#saveSettings"/>, if it is the desired action.
+ </note>
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Attempt to detach medium from a running virtual machine.
+ </result>
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ No medium attached to given slot/bus.
+ </result>
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Medium format does not support storage deletion (only for implicitly
+ created differencing media, should not happen).
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the storage controller to detach the medium from.</desc>
+ </param>
+ <param name="controllerPort" type="long" dir="in">
+ <desc>Port number to detach the medium from.</desc>
+ </param>
+ <param name="device" type="long" dir="in">
+ <desc>Device slot number to detach the medium from.</desc>
+ </param>
+ </method>
+
+ <method name="passthroughDevice">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Sets the passthrough mode of an existing DVD device. Changing the
+ setting while the VM is running is forbidden. The setting is only used
+ if at VM start the device is configured as a host DVD drive, in all
+ other cases it is ignored. The device must already exist; see
+ <link to="IMachine::attachDevice"/> for how to attach a new device.
+
+ The @a controllerPort and @a device parameters specify the device slot and
+ have have the same meaning as with <link to="IMachine::attachDevice" />.
+
+ <result name="E_INVALIDARG">
+ SATA device, SATA port, IDE port or IDE slot out of range.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Attempt to modify an unregistered virtual machine.
+ </result>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Invalid machine state.
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the storage controller.</desc>
+ </param>
+ <param name="controllerPort" type="long" dir="in">
+ <desc>Storage controller port.</desc>
+ </param>
+ <param name="device" type="long" dir="in">
+ <desc>Device slot in the given port.</desc>
+ </param>
+ <param name="passthrough" type="boolean" dir="in">
+ <desc>New value for the passthrough setting.</desc>
+ </param>
+ </method>
+
+ <method name="temporaryEjectDevice">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Sets the behavior for guest-triggered medium eject. In some situations
+ it is desirable that such ejects update the VM configuration, and in
+ others the eject should keep the VM configuration. The device must
+ already exist; see <link to="IMachine::attachDevice"/> for how to
+ attach a new device.
+
+ The @a controllerPort and @a device parameters specify the device slot and
+ have have the same meaning as with <link to="IMachine::attachDevice" />.
+
+ <result name="E_INVALIDARG">
+ SATA device, SATA port, IDE port or IDE slot out of range.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Attempt to modify an unregistered virtual machine.
+ </result>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Invalid machine state.
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the storage controller.</desc>
+ </param>
+ <param name="controllerPort" type="long" dir="in">
+ <desc>Storage controller port.</desc>
+ </param>
+ <param name="device" type="long" dir="in">
+ <desc>Device slot in the given port.</desc>
+ </param>
+ <param name="temporaryEject" type="boolean" dir="in">
+ <desc>New value for the eject behavior.</desc>
+ </param>
+ </method>
+
+ <method name="nonRotationalDevice">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Sets a flag in the device information which indicates that the medium
+ is not based on rotational technology, i.e. that the access times are
+ more or less independent of the position on the medium. This may or may
+ not be supported by a particular drive, and is silently ignored in the
+ latter case. At the moment only hard disks (which is a misnomer in this
+ context) accept this setting. Changing the setting while the VM is
+ running is forbidden. The device must already exist; see
+ <link to="IMachine::attachDevice"/> for how to attach a new device.
+
+ The @a controllerPort and @a device parameters specify the device slot and
+ have have the same meaning as with <link to="IMachine::attachDevice" />.
+
+ <result name="E_INVALIDARG">
+ SATA device, SATA port, IDE port or IDE slot out of range.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Attempt to modify an unregistered virtual machine.
+ </result>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Invalid machine state.
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the storage controller.</desc>
+ </param>
+ <param name="controllerPort" type="long" dir="in">
+ <desc>Storage controller port.</desc>
+ </param>
+ <param name="device" type="long" dir="in">
+ <desc>Device slot in the given port.</desc>
+ </param>
+ <param name="nonRotational" type="boolean" dir="in">
+ <desc>New value for the non-rotational device flag.</desc>
+ </param>
+ </method>
+
+ <method name="setAutoDiscardForDevice">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Sets a flag in the device information which indicates that the medium
+ supports discarding unused blocks (called trimming for SATA or unmap
+ for SCSI devices) .This may or may not be supported by a particular drive,
+ and is silently ignored in the latter case. At the moment only hard disks
+ (which is a misnomer in this context) accept this setting. Changing the
+ setting while the VM is running is forbidden. The device must already
+ exist; see <link to="IMachine::attachDevice"/> for how to attach a new
+ device.
+
+ The @a controllerPort and @a device parameters specify the device slot and
+ have have the same meaning as with <link to="IMachine::attachDevice" />.
+
+ <result name="E_INVALIDARG">
+ SATA device, SATA port, SCSI port out of range.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Attempt to modify an unregistered virtual machine.
+ </result>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Invalid machine state.
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the storage controller.</desc>
+ </param>
+ <param name="controllerPort" type="long" dir="in">
+ <desc>Storage controller port.</desc>
+ </param>
+ <param name="device" type="long" dir="in">
+ <desc>Device slot in the given port.</desc>
+ </param>
+ <param name="discard" type="boolean" dir="in">
+ <desc>New value for the discard device flag.</desc>
+ </param>
+ </method>
+
+ <method name="setHotPluggableForDevice">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Sets a flag in the device information which indicates that the attached
+ device is hot pluggable or not. This may or may not be supported by a
+ particular controller and/or drive, and is silently ignored in the
+ latter case. Changing the setting while the VM is running is forbidden.
+ The device must already exist; see <link to="IMachine::attachDevice"/>
+ for how to attach a new device.
+
+ The @a controllerPort and @a device parameters specify the device slot and
+ have have the same meaning as with <link to="IMachine::attachDevice" />.
+
+ <result name="E_INVALIDARG">
+ SATA device, SATA port, IDE port or IDE slot out of range.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Attempt to modify an unregistered virtual machine.
+ </result>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Invalid machine state.
+ </result>
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Controller doesn't support hot plugging.
+ </result>
+ </desc>
+
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the storage controller.</desc>
+ </param>
+ <param name="controllerPort" type="long" dir="in">
+ <desc>Storage controller port.</desc>
+ </param>
+ <param name="device" type="long" dir="in">
+ <desc>Device slot in the given port.</desc>
+ </param>
+ <param name="hotPluggable" type="boolean" dir="in">
+ <desc>New value for the hot-pluggable device flag.</desc>
+ </param>
+ </method>
+
+ <method name="setBandwidthGroupForDevice">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Sets the bandwidth group of an existing storage device.
+ The device must already exist; see <link to="IMachine::attachDevice"/>
+ for how to attach a new device.
+
+ The @a controllerPort and @a device parameters specify the device slot and
+ have have the same meaning as with <link to="IMachine::attachDevice" />.
+
+ <result name="E_INVALIDARG">
+ SATA device, SATA port, IDE port or IDE slot out of range.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Attempt to modify an unregistered virtual machine.
+ </result>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Invalid machine state.
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the storage controller.</desc>
+ </param>
+ <param name="controllerPort" type="long" dir="in">
+ <desc>Storage controller port.</desc>
+ </param>
+ <param name="device" type="long" dir="in">
+ <desc>Device slot in the given port.</desc>
+ </param>
+ <param name="bandwidthGroup" type="IBandwidthGroup" dir="in">
+ <desc>New value for the bandwidth group or @c null for no group.</desc>
+ </param>
+ </method>
+
+ <method name="setNoBandwidthGroupForDevice">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Sets no bandwidth group for an existing storage device.
+ The device must already exist; see <link to="IMachine::attachDevice"/>
+ for how to attach a new device.
+ The @a controllerPort and @a device parameters specify the device slot and
+ have have the same meaning as with <link to="IMachine::attachDevice" />.
+ <result name="E_INVALIDARG">
+ SATA device, SATA port, IDE port or IDE slot out of range.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Attempt to modify an unregistered virtual machine.
+ </result>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Invalid machine state.
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the storage controller.</desc>
+ </param>
+ <param name="controllerPort" type="long" dir="in">
+ <desc>Storage controller port.</desc>
+ </param>
+ <param name="device" type="long" dir="in">
+ <desc>Device slot in the given port.</desc>
+ </param>
+ </method>
+
+ <method name="unmountMedium">
+ <rest name="unmount" request="post" path="/vms/{vmid}/media/{mediumid}/actions/"/>
+ <desc>
+ Unmounts any currently mounted medium (<link to="IMedium" />,
+ identified by the given UUID @a id) to the given storage controller
+ (<link to="IStorageController" />, identified by @a name),
+ at the indicated port and device. The device must already exist;
+
+ This method is intended only for managing removable media, where the
+ device is fixed but media is changeable at runtime (such as DVDs
+ and floppies). It cannot be used for fixed media such as hard disks.
+
+ The @a controllerPort and @a device parameters specify the device slot
+ and have have the same meaning as with
+ <link to="IMachine::attachDevice" />.
+
+ The specified device slot must have a medium mounted, which will be
+ unmounted. If there is no mounted medium it will do nothing.
+ See <link to="IMedium"/> for more detailed information about
+ attaching/unmounting media.
+
+ <result name="E_INVALIDARG">
+ SATA device, SATA port, IDE port or IDE slot out of range.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Attempt to unmount medium that is not removable - not DVD or floppy.
+ </result>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Invalid machine state.
+ </result>
+ <result name="VBOX_E_OBJECT_IN_USE">
+ Medium already attached to this or another virtual machine.
+ </result>
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ Medium not attached to specified port, device, controller.
+ </result>
+ </desc>
+
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the storage controller to unmount the medium from.</desc>
+ </param>
+ <param name="controllerPort" type="long" dir="in">
+ <desc>Port to unmount the medium from.</desc>
+ </param>
+ <param name="device" type="long" dir="in">
+ <desc>Device slot in the given port to unmount the medium from.</desc>
+ </param>
+ <param name="force" type="boolean" dir="in">
+ <desc>Allows to force unmount of a medium which is locked by
+ the device slot in the given port medium is attached to.</desc>
+ </param>
+ </method>
+
+ <method name="mountMedium">
+ <rest name="mount" request="post" path="/vms/{vmid}/media/{mediumid}/actions/"/>
+ <desc>
+ Mounts a medium (<link to="IMedium" />, identified
+ by the given UUID @a id) to the given storage controller
+ (<link to="IStorageController" />, identified by @a name),
+ at the indicated port and device. The device must already exist;
+ see <link to="IMachine::attachDevice"/> for how to attach a new device.
+
+ This method is intended only for managing removable media, where the
+ device is fixed but media is changeable at runtime (such as DVDs
+ and floppies). It cannot be used for fixed media such as hard disks.
+
+ The @a controllerPort and @a device parameters specify the device slot and
+ have have the same meaning as with <link to="IMachine::attachDevice" />.
+
+ The specified device slot can have a medium mounted, which will be
+ unmounted first. Specifying a zero UUID (or an empty string) for
+ @a medium does just an unmount.
+
+ See <link to="IMedium"/> for more detailed information about
+ attaching media.
+
+ <result name="E_INVALIDARG">
+ SATA device, SATA port, IDE port or IDE slot out of range.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Attempt to attach medium to an unregistered virtual machine.
+ </result>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Invalid machine state.
+ </result>
+ <result name="VBOX_E_OBJECT_IN_USE">
+ Medium already attached to this or another virtual machine.
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the storage controller to attach the medium to.</desc>
+ </param>
+ <param name="controllerPort" type="long" dir="in">
+ <desc>Port to attach the medium to.</desc>
+ </param>
+ <param name="device" type="long" dir="in">
+ <desc>Device slot in the given port to attach the medium to.</desc>
+ </param>
+ <param name="medium" type="IMedium" dir="in">
+ <desc>Medium to mount or @c null for an empty drive.</desc>
+ </param>
+ <param name="force" type="boolean" dir="in">
+ <desc>Allows to force unmount/mount of a medium which is locked by
+ the device slot in the given port to attach the medium to.</desc>
+ </param>
+ </method>
+
+ <method name="getMedium" const="yes">
+ <rest name="find" request="get" path="/vms/{vmid}/media/{mediumid}/"/>
+ <desc>
+ Returns the virtual medium attached to a device slot of the specified
+ bus.
+
+ Note that if the medium was indirectly attached by
+ <link to="#mountMedium"/> to the given device slot then this
+ method will return not the same object as passed to the
+ <link to="#mountMedium"/> call. See <link to="IMedium"/> for
+ more detailed information about mounting a medium.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ No medium attached to given slot/bus.
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the storage controller the medium is attached to.</desc>
+ </param>
+ <param name="controllerPort" type="long" dir="in">
+ <desc>Port to query.</desc>
+ </param>
+ <param name="device" type="long" dir="in">
+ <desc>Device slot in the given port to query.</desc>
+ </param>
+ <param name="medium" type="IMedium" dir="return">
+ <desc>Attached medium object.</desc>
+ </param>
+ </method>
+
+ <method name="getMediumAttachmentsOfController" const="yes">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Returns an array of medium attachments which are attached to the
+ the controller with the given name.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ A storage controller with given name doesn't exist.
+ </result>
+ </desc>
+ <param name="name" type="wstring" dir="in"/>
+ <param name="mediumAttachments" type="IMediumAttachment" safearray="yes" dir="return"/>
+ </method>
+
+ <method name="getMediumAttachment" const="yes">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Returns a medium attachment which corresponds to the controller with
+ the given name, on the given port and device slot.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ No attachment exists for the given controller/port/device combination.
+ </result>
+ </desc>
+ <param name="name" type="wstring" dir="in"/>
+ <param name="controllerPort" type="long" dir="in"/>
+ <param name="device" type="long" dir="in"/>
+ <param name="attachment" type="IMediumAttachment" dir="return"/>
+ </method>
+
+ <method name="attachHostPCIDevice">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Attaches host PCI device with the given (host) PCI address to the
+ PCI bus of the virtual machine. Please note, that this operation
+ is two phase, as real attachment will happen when VM will start,
+ and most information will be delivered as IHostPCIDevicePlugEvent
+ on IVirtualBox event source.
+
+ <see><link to="IHostPCIDevicePlugEvent"/></see>
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine state is not stopped (PCI hotplug not yet implemented).
+ </result>
+ <result name="VBOX_E_PDM_ERROR">
+ Virtual machine does not have a PCI controller allowing attachment of physical devices.
+ </result>
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Hardware or host OS doesn't allow PCI device passthrough.
+ </result>
+ </desc>
+ <param name="hostAddress" type="long" dir="in">
+ <desc>Address of the host PCI device.</desc>
+ </param>
+ <param name="desiredGuestAddress" type="long" dir="in">
+ <desc>Desired position of this device on guest PCI bus.</desc>
+ </param>
+ <param name="tryToUnbind" type="boolean" dir="in">
+ <desc>If VMM shall try to unbind existing drivers from the
+ device before attaching it to the guest.</desc>
+ </param>
+ </method>
+
+ <method name="detachHostPCIDevice">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Detach host PCI device from the virtual machine.
+ Also HostPCIDevicePlugEvent on IVirtualBox event source
+ will be delivered. As currently we don't support hot device
+ unplug, IHostPCIDevicePlugEvent event is delivered immediately.
+
+ <see><link to="IHostPCIDevicePlugEvent"/></see>
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine state is not stopped (PCI hotplug not yet implemented).
+ </result>
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ This host device is not attached to this machine.
+ </result>
+ <result name="VBOX_E_PDM_ERROR">
+ Virtual machine does not have a PCI controller allowing attachment of physical devices.
+ </result>
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Hardware or host OS doesn't allow PCI device passthrough.
+ </result>
+ </desc>
+ <param name="hostAddress" type="long" dir="in">
+ <desc>Address of the host PCI device.</desc>
+ </param>
+ </method>
+
+ <method name="getNetworkAdapter" const="yes">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Returns the network adapter associated with the given slot.
+ Slots are numbered sequentially, starting with zero. The total
+ number of adapters per machine is defined by the
+ <link to="ISystemProperties::getMaxNetworkAdapters"/> property,
+ so the maximum slot number is one less than that property's value.
+
+ <result name="E_INVALIDARG">
+ Invalid @a slot number.
+ </result>
+
+ </desc>
+ <param name="slot" type="unsigned long" dir="in"/>
+ <param name="adapter" type="INetworkAdapter" dir="return"/>
+ </method>
+
+ <method name="addStorageController">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Adds a new storage controller (SCSI, SAS or SATA controller) to the
+ machine and returns it as an instance of
+ <link to="IStorageController" />.
+
+ @a name identifies the controller for subsequent calls such as
+ <link to="#getStorageControllerByName" />,
+ <link to="#getStorageControllerByInstance" />,
+ <link to="#removeStorageController" />,
+ <link to="#attachDevice" /> or <link to="#mountMedium" />.
+
+ After the controller has been added, you can set its exact
+ type by setting the <link to="IStorageController::controllerType" />.
+
+ <result name="VBOX_E_OBJECT_IN_USE">
+ A storage controller with given name exists already.
+ </result>
+ <result name="E_INVALIDARG">
+ Invalid @a controllerType.
+ </result>
+ </desc>
+ <param name="name" type="wstring" dir="in"/>
+ <param name="connectionType" type="StorageBus" dir="in"/>
+ <param name="controller" type="IStorageController" dir="return"/>
+ </method>
+
+ <method name="getStorageControllerByName" const="yes">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Returns a storage controller with the given name.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ A storage controller with given name doesn't exist.
+ </result>
+ </desc>
+ <param name="name" type="wstring" dir="in"/>
+ <param name="storageController" type="IStorageController" dir="return"/>
+ </method>
+
+ <method name="getStorageControllerByInstance" const="yes">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Returns a storage controller of a specific storage bus
+ with the given instance number.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ A storage controller with given instance number doesn't exist.
+ </result>
+ </desc>
+ <param name="connectionType" type="StorageBus" dir="in"/>
+ <param name="instance" type="unsigned long" dir="in"/>
+ <param name="storageController" type="IStorageController" dir="return"/>
+ </method>
+
+ <method name="removeStorageController">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Removes a storage controller from the machine with all devices attached to it.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ A storage controller with given name doesn't exist.
+ </result>
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Medium format does not support storage deletion (only for implicitly
+ created differencing media, should not happen).
+ </result>
+ </desc>
+ <param name="name" type="wstring" dir="in"/>
+ </method>
+
+ <method name="setStorageControllerBootable">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Sets the bootable flag of the storage controller with the given name.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ A storage controller with given name doesn't exist.
+ </result>
+ <result name="VBOX_E_OBJECT_IN_USE">
+ Another storage controller is marked as bootable already.
+ </result>
+ </desc>
+ <param name="name" type="wstring" dir="in"/>
+ <param name="bootable" type="boolean" dir="in"/>
+ </method>
+
+ <method name="addUSBController">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Adds a new USB controller to the machine and returns it as an instance of
+ <link to="IUSBController" />.
+
+ <result name="VBOX_E_OBJECT_IN_USE">
+ A USB controller with given type exists already.
+ </result>
+ <result name="E_INVALIDARG">
+ Invalid @a controllerType.
+ </result>
+ </desc>
+ <param name="name" type="wstring" dir="in"/>
+ <param name="type" type="USBControllerType" dir="in"/>
+ <param name="controller" type="IUSBController" dir="return"/>
+ </method>
+
+ <method name="removeUSBController">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Removes a USB controller from the machine.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ A USB controller with given type doesn't exist.
+ </result>
+ </desc>
+ <param name="name" type="wstring" dir="in"/>
+ </method>
+
+ <method name="getUSBControllerByName" const="yes">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Returns a USB controller with the given type.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ A USB controller with given name doesn't exist.
+ </result>
+ </desc>
+ <param name="name" type="wstring" dir="in"/>
+ <param name="controller" type="IUSBController" dir="return"/>
+ </method>
+
+ <method name="getUSBControllerCountByType" const="yes">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Returns the number of USB controllers of the given type attached to the VM.
+ </desc>
+ <param name="type" type="USBControllerType" dir="in"/>
+ <param name="controllers" type="unsigned long" dir="return"/>
+ </method>
+
+ <method name="getSerialPort" const="yes">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Returns the serial port associated with the given slot.
+ Slots are numbered sequentially, starting with zero. The total
+ number of serial ports per machine is defined by the
+ <link to="ISystemProperties::serialPortCount"/> property,
+ so the maximum slot number is one less than that property's value.
+
+ <result name="E_INVALIDARG">
+ Invalid @a slot number.
+ </result>
+
+ </desc>
+ <param name="slot" type="unsigned long" dir="in"/>
+ <param name="port" type="ISerialPort" dir="return"/>
+ </method>
+
+ <method name="getParallelPort" const="yes">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Returns the parallel port associated with the given slot.
+ Slots are numbered sequentially, starting with zero. The total
+ number of parallel ports per machine is defined by the
+ <link to="ISystemProperties::parallelPortCount"/> property,
+ so the maximum slot number is one less than that property's value.
+
+ <result name="E_INVALIDARG">
+ Invalid @a slot number.
+ </result>
+
+ </desc>
+ <param name="slot" type="unsigned long" dir="in"/>
+ <param name="port" type="IParallelPort" dir="return"/>
+ </method>
+
+ <method name="getExtraDataKeys">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Returns an array representing the machine-specific extra data keys
+ which currently have values defined.
+ </desc>
+ <param name="keys" type="wstring" dir="return" safearray="yes">
+ <desc>Array of extra data keys.</desc>
+ </param>
+ </method>
+
+ <method name="getExtraData">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Returns associated machine-specific extra data.
+
+ If the requested data @a key does not exist, this function will
+ succeed and return an empty string in the @a value argument.
+
+ <result name="VBOX_E_FILE_ERROR">
+ Settings file not accessible.
+ </result>
+ <result name="VBOX_E_XML_ERROR">
+ Could not parse the settings file.
+ </result>
+
+ </desc>
+ <param name="key" type="wstring" dir="in">
+ <desc>Name of the data key to get.</desc>
+ </param>
+ <param name="value" type="wstring" dir="return">
+ <desc>Value of the requested data key.</desc>
+ </param>
+ </method>
+
+ <method name="setExtraData">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Sets associated machine-specific extra data.
+
+ If you pass @c null or an empty string as a key @a value, the given
+ @a key will be deleted.
+
+ <note>
+ Key must contain printable (non-control) UTF-8 characters only.
+ </note>
+ <note>
+ Before performing the actual data change, this method will ask all
+ registered event listeners using the
+ <link to="IExtraDataCanChangeEvent"/>
+ notification for a permission. If one of the listeners refuses the
+ new value, the change will not be performed.
+ </note>
+ <note>
+ On success, the
+ <link to="IExtraDataChangedEvent"/> notification
+ is called to inform all registered listeners about a successful data
+ change.
+ </note>
+ <note>
+ This method can be called outside the machine session and therefore
+ it's a caller's responsibility to handle possible race conditions
+ when several clients change the same key at the same time.
+ </note>
+
+ <result name="VBOX_E_FILE_ERROR">
+ Settings file not accessible.
+ </result>
+ <result name="VBOX_E_XML_ERROR">
+ Could not parse the settings file.
+ </result>
+ <result name="E_INVALIDARG">
+ Key contains invalid characters.
+ </result>
+
+ </desc>
+ <param name="key" type="wstring" dir="in">
+ <desc>Name of the data key to set.</desc>
+ </param>
+ <param name="value" type="wstring" dir="in">
+ <desc>Value to assign to the key.</desc>
+ </param>
+ </method>
+
+ <method name="getCPUProperty" const="yes">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Returns the virtual CPU boolean value of the specified property.
+
+ <result name="E_INVALIDARG">
+ Invalid property.
+ </result>
+
+ </desc>
+ <param name="property" type="CPUPropertyType" dir="in">
+ <desc>
+ Property type to query.
+ </desc>
+ </param>
+ <param name="value" type="boolean" dir="return">
+ <desc>
+ Property value.
+ </desc>
+ </param>
+ </method>
+
+ <method name="setCPUProperty">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Sets the virtual CPU boolean value of the specified property.
+
+ <result name="E_INVALIDARG">
+ Invalid property.
+ </result>
+
+ </desc>
+ <param name="property" type="CPUPropertyType" dir="in">
+ <desc>
+ Property type to query.
+ </desc>
+ </param>
+ <param name="value" type="boolean" dir="in">
+ <desc>
+ Property value.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getCPUIDLeafByOrdinal" const="yes">
+ <desc>
+ Used to enumerate CPUID information override values.
+
+ <result name="E_INVALIDARG">
+ Invalid ordinal number is out of range.
+ </result>
+ </desc>
+ <param name="ordinal" type="unsigned long" dir="in">
+ <desc>
+ The ordinal number of the leaf to get.
+ </desc>
+ </param>
+ <param name="idx" type="unsigned long" dir="out">
+ <desc>
+ CPUID leaf index.
+ </desc>
+ </param>
+ <param name="idxSub" type="unsigned long" dir="out">
+ <desc>
+ CPUID leaf sub-index.
+ </desc>
+ </param>
+ <param name="valEax" type="unsigned long" dir="out">
+ <desc>
+ CPUID leaf value for register eax.
+ </desc>
+ </param>
+ <param name="valEbx" type="unsigned long" dir="out">
+ <desc>
+ CPUID leaf value for register ebx.
+ </desc>
+ </param>
+ <param name="valEcx" type="unsigned long" dir="out">
+ <desc>
+ CPUID leaf value for register ecx.
+ </desc>
+ </param>
+ <param name="valEdx" type="unsigned long" dir="out">
+ <desc>
+ CPUID leaf value for register edx.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getCPUIDLeaf" const="yes">
+ <desc>
+ Returns the virtual CPU cpuid information for the specified leaf.
+
+ Currently supported index values for cpuid:
+ Standard CPUID leaves: 0 - 0x1f
+ Extended CPUID leaves: 0x80000000 - 0x8000001f
+ VIA CPUID leaves: 0xc0000000 - 0xc000000f
+
+ See the Intel, AMD and VIA programmer's manuals for detailed information
+ about the CPUID instruction and its leaves.
+ <result name="E_INVALIDARG">
+ Invalid index.
+ </result>
+
+ </desc>
+ <param name="idx" type="unsigned long" dir="in">
+ <desc>
+ CPUID leaf index.
+ </desc>
+ </param>
+ <param name="idxSub" type="unsigned long" dir="in">
+ <desc>
+ CPUID leaf sub-index (ECX). Set to 0xffffffff (or 0) if not applicable.
+ </desc>
+ </param>
+ <param name="valEax" type="unsigned long" dir="out">
+ <desc>
+ CPUID leaf value for register eax.
+ </desc>
+ </param>
+ <param name="valEbx" type="unsigned long" dir="out">
+ <desc>
+ CPUID leaf value for register ebx.
+ </desc>
+ </param>
+ <param name="valEcx" type="unsigned long" dir="out">
+ <desc>
+ CPUID leaf value for register ecx.
+ </desc>
+ </param>
+ <param name="valEdx" type="unsigned long" dir="out">
+ <desc>
+ CPUID leaf value for register edx.
+ </desc>
+ </param>
+ </method>
+
+ <method name="setCPUIDLeaf">
+ <desc>
+ Sets the virtual CPU cpuid information for the specified leaf. Note that these values
+ are not passed unmodified. VirtualBox clears features that it doesn't support.
+
+ Currently supported index values for cpuid:
+ Standard CPUID leaves: 0 - 0x1f
+ Extended CPUID leaves: 0x80000000 - 0x8000001f
+ VIA CPUID leaves: 0xc0000000 - 0xc000000f
+
+ The subleaf index is only applicable to certain leaves (see manuals as this is
+ subject to change).
+
+ See the Intel, AMD and VIA programmer's manuals for detailed information
+ about the cpuid instruction and its leaves.
+
+ Do not use this method unless you know exactly what you're doing. Misuse can lead to
+ random crashes inside VMs.
+ <result name="E_INVALIDARG">
+ Invalid index.
+ </result>
+
+ </desc>
+ <param name="idx" type="unsigned long" dir="in">
+ <desc>
+ CPUID leaf index.
+ </desc>
+ </param>
+ <param name="idxSub" type="unsigned long" dir="in">
+ <desc>
+ CPUID leaf sub-index (ECX). Set to 0xffffffff (or 0) if not applicable.
+ The 0xffffffff causes it to remove all other subleaves before adding one
+ with sub-index 0.
+ </desc>
+ </param>
+ <param name="valEax" type="unsigned long" dir="in">
+ <desc>
+ CPUID leaf value for register eax.
+ </desc>
+ </param>
+ <param name="valEbx" type="unsigned long" dir="in">
+ <desc>
+ CPUID leaf value for register ebx.
+ </desc>
+ </param>
+ <param name="valEcx" type="unsigned long" dir="in">
+ <desc>
+ CPUID leaf value for register ecx.
+ </desc>
+ </param>
+ <param name="valEdx" type="unsigned long" dir="in">
+ <desc>
+ CPUID leaf value for register edx.
+ </desc>
+ </param>
+ </method>
+
+ <method name="removeCPUIDLeaf">
+ <desc>
+ Removes the virtual CPU cpuid leaf for the specified index
+
+ <result name="E_INVALIDARG">
+ Invalid index.
+ </result>
+
+ </desc>
+ <param name="idx" type="unsigned long" dir="in">
+ <desc>
+ CPUID leaf index.
+ </desc>
+ </param>
+ <param name="idxSub" type="unsigned long" dir="in">
+ <desc>
+ CPUID leaf sub-index (ECX). Set to 0xffffffff (or 0) if not applicable.
+ The 0xffffffff value works like a wildcard.
+ </desc>
+ </param>
+ </method>
+
+ <method name="removeAllCPUIDLeaves">
+ <desc>
+ Removes all the virtual CPU cpuid leaves
+ </desc>
+ </method>
+
+ <method name="getHWVirtExProperty" const="yes">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Returns the value of the specified hardware virtualization boolean property.
+
+ <result name="E_INVALIDARG">
+ Invalid property.
+ </result>
+
+ </desc>
+ <param name="property" type="HWVirtExPropertyType" dir="in">
+ <desc>
+ Property type to query.
+ </desc>
+ </param>
+ <param name="value" type="boolean" dir="return">
+ <desc>
+ Property value.
+ </desc>
+ </param>
+ </method>
+
+ <method name="setHWVirtExProperty">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Sets a new value for the specified hardware virtualization boolean property.
+
+ <result name="E_INVALIDARG">
+ Invalid property.
+ </result>
+
+ </desc>
+ <param name="property" type="HWVirtExPropertyType" dir="in">
+ <desc>
+ Property type to set.
+ </desc>
+ </param>
+ <param name="value" type="boolean" dir="in">
+ <desc>
+ New property value.
+ </desc>
+ </param>
+ </method>
+
+ <method name="setSettingsFilePath">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Currently, it is an error to change this property on any machine.
+ Later this will allow setting a new path for the settings file, with
+ automatic relocation of all files (including snapshots and disk images)
+ which are inside the base directory. This operation is only allowed
+ when there are no pending unsaved settings.
+
+ <note>
+ Setting this property to @c null or to an empty string is forbidden.
+ When setting this property, the specified path must be absolute.
+ The specified path may not exist, it will be created when necessary.
+ </note>
+
+ <result name="E_NOTIMPL">
+ The operation is not implemented yet.
+ </result>
+ </desc>
+
+ <param name="settingsFilePath" type="wstring" dir="in">
+ <desc>New settings file path, will be used to determine the new
+ location for the attached media if it is in the same directory or
+ below as the original settings file.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="saveSettings">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Saves any changes to machine settings made since the session
+ has been opened or a new machine has been created, or since the
+ last call to <link to="#saveSettings"/> or <link to="#discardSettings"/>.
+ For registered machines, new settings become visible to all
+ other VirtualBox clients after successful invocation of this
+ method.
+ <note>
+ The method sends <link to="IMachineDataChangedEvent"/>
+ notification event after the configuration has been successfully
+ saved (only for registered machines).
+ </note>
+ <note>
+ Calling this method is only valid on instances returned
+ by <link to="ISession::machine"/> and on new machines
+ created by <link to="IVirtualBox::createMachine"/> but not
+ yet registered, or on unregistered machines after calling
+ <link to="IMachine::unregister"/>.
+ </note>
+
+ <result name="VBOX_E_FILE_ERROR">
+ Settings file not accessible.
+ </result>
+ <result name="VBOX_E_XML_ERROR">
+ Could not parse the settings file.
+ </result>
+ <result name="E_ACCESSDENIED">
+ Modification request refused.
+ </result>
+
+ </desc>
+ </method>
+
+ <method name="discardSettings">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Discards any changes to the machine settings made since the session
+ has been opened or since the last call to <link to="#saveSettings"/>
+ or <link to="#discardSettings"/>.
+ <note>
+ Calling this method is only valid on instances returned
+ by <link to="ISession::machine"/> and on new machines
+ created by <link to="IVirtualBox::createMachine"/> or
+ opened by <link to="IVirtualBox::openMachine"/> but not
+ yet registered, or on unregistered machines after calling
+ <link to="IMachine::unregister"/>.
+ </note>
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine is not mutable.
+ </result>
+
+ </desc>
+ </method>
+
+ <method name="unregister" wrap-hint-server="limitedcaller,passcaller">
+ <rest request="post" path="/vms/{vmid}/actions/"/>
+ <desc>
+ Unregisters a machine previously registered with
+ <link to="IVirtualBox::registerMachine"/> and optionally do additional
+ cleanup before the machine is unregistered.
+
+ This method does not delete any files. It only changes the machine configuration and
+ the list of registered machines in the VirtualBox object. To delete the files which
+ belonged to the machine, including the XML file of the machine itself, call
+ <link to="#deleteConfig"/>, optionally with the array of IMedium objects which was returned
+ from this method.
+
+ How thoroughly this method cleans up the machine configuration before unregistering
+ the machine depends on the @a cleanupMode argument.
+
+ <ul>
+ <li>With "UnregisterOnly", the machine will only be unregistered, but no additional
+ cleanup will be performed. The call will fail if the machine has any snapshots or
+ any media attached (see <link to="IMediumAttachment" />). It is the responsibility
+ of the caller to delete all such configuration in this mode. In this mode, the API
+ behaves like the former @c IVirtualBox::unregisterMachine() API which it replaces.</li>
+ <li>With "DetachAllReturnNone", the call will succeed even if the machine is in "Saved"
+ state or if it has snapshots or media attached. All media attached to the current machine
+ state or in snapshots will be detached. No medium objects will be returned;
+ all of the machine's media will remain open.</li>
+ <li>With "DetachAllReturnHardDisksOnly", the call will behave like with "DetachAllReturnNone",
+ except that all the hard disk medium objects which were detached from the machine will
+ be returned as an array. This allows for quickly passing them to the <link to="#deleteConfig" />
+ API for closing and deletion.</li>
+ <li>With "Full", the call will behave like with "DetachAllReturnHardDisksOnly", except
+ that all media will be returned in the array, including removable media like DVDs and
+ floppies. This might be useful if the user wants to inspect in detail which media were
+ attached to the machine. Be careful when passing the media array to <link to="#deleteConfig" />
+ in that case because users will typically want to preserve ISO and RAW image files.</li>
+ </ul>
+
+ A typical implementation will use "DetachAllReturnHardDisksOnly" and then pass the
+ resulting IMedium array to <link to="#deleteConfig"/>. This way, the machine is completely
+ deleted with all its saved states and hard disk images, but images for removable
+ drives (such as ISO and RAW files) will remain on disk.
+
+ This API does not verify whether the media files returned in the array are still
+ attached to other machines (i.e. shared between several machines). If such a shared
+ image is passed to <link to="#deleteConfig" /> however, closing the image will fail there
+ and the image will be silently skipped.
+
+ This API may, however, move media from this machine's media registry to other media
+ registries (see <link to="IMedium" /> for details on media registries). For machines
+ created with VirtualBox 4.0 or later, if media from this machine's media registry
+ are also attached to another machine (shared attachments), each such medium will be
+ moved to another machine's registry. This is because without this machine's media
+ registry, the other machine cannot find its media any more and would become inaccessible.
+
+ This API implicitly calls <link to="#saveSettings"/> to save all current machine settings
+ before unregistering it. It may also silently call <link to="#saveSettings"/> on other machines
+ if media are moved to other machines' media registries.
+
+ After successful method invocation, the <link to="IMachineRegisteredEvent"/> event
+ is fired.
+
+ The call will fail if the machine is currently locked (see <link to="ISession" />).
+
+ <note>
+ If the given machine is inaccessible (see <link to="#accessible"/>), it
+ will be unregistered and fully uninitialized right afterwards. As a result,
+ the returned machine object will be unusable and an attempt to call
+ <b>any</b> method will return the "Object not ready" error.
+ </note>
+
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Machine is currently locked for a session.
+ </result>
+ </desc>
+
+ <param name="cleanupMode" type="CleanupMode" dir="in">
+ <desc>How to clean up after the machine has been unregistered.</desc>
+ </param>
+ <param name="media" type="IMedium" safearray="yes" dir="return">
+ <desc>List of media detached from the machine, depending on the @a cleanupMode parameter.</desc>
+ </param>
+ </method>
+
+ <method name="deleteConfig">
+ <rest name="remove" request="delete" path="/vms/{vmid}/"/>
+ <desc>
+ Deletes the files associated with this machine from disk. If medium objects are passed
+ in with the @a aMedia argument, they are closed and, if closing was successful, their
+ storage files are deleted as well. For convenience, this array of media files can be
+ the same as the one returned from a previous <link to="#unregister" /> call.
+
+ This method must only be called on machines which are either write-locked (i.e. on instances
+ returned by <link to="ISession::machine"/>) or on unregistered machines (i.e. not yet
+ registered machines created by <link to="IVirtualBox::createMachine"/> or opened by
+ <link to="IVirtualBox::openMachine"/>, or after having called <link to="#unregister"/>).
+
+ The following files will be deleted by this method:
+ <ul>
+ <li>If <link to="#unregister" /> had been previously called with a @a cleanupMode
+ argument other than "UnregisterOnly", this will delete all saved state files that
+ the machine had in use; possibly one if the machine was in either the "Saved" or
+ "AbortedSaved" state and one for each online snapshot that the machine had.</li>
+ <li>On each medium object passed in the @a aMedia array, this will call
+ <link to="IMedium::close" />. If that succeeds, this will attempt to delete the
+ medium's storage on disk. Since the <link to="IMedium::close"/> call will fail if the medium is still
+ in use, e.g. because it is still attached to a second machine; in that case the
+ storage will not be deleted.</li>
+ <li>Finally, the machine's own XML file will be deleted.</li>
+ </ul>
+
+ Since deleting large disk image files can be a time-consuming I/O operation, this
+ method operates asynchronously and returns an IProgress object to allow the caller
+ to monitor the progress. There will be one sub-operation for each file that is
+ being deleted (saved state or medium storage file).
+
+ <note>
+ <link to="#settingsModified"/> will return @c true after this
+ method successfully returns.
+ </note>
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Machine is registered but not write-locked.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ Could not delete the settings file.
+ </result>
+ </desc>
+ <param name="media" type="IMedium" safearray="yes" dir="in">
+ <desc>List of media to be closed and whose storage files will be deleted.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="exportTo">
+ <rest name="export" request="post" path="/vms/{vmid}/actions/"/>
+ <desc>Exports the machine to an OVF appliance. See <link to="IAppliance" /> for the
+ steps required to export VirtualBox machines to OVF.
+ </desc>
+
+ <param name="appliance" type="IAppliance" dir="in">
+ <desc>Appliance to export this machine to.</desc>
+ </param>
+ <param name="location" type="wstring" dir="in">
+ <desc>The target location.</desc>
+ </param>
+ <param name="description" type="IVirtualSystemDescription" dir="return">
+ <desc>VirtualSystemDescription object which is created for this machine.</desc>
+ </param>
+ </method>
+
+ <method name="findSnapshot">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Returns a snapshot of this machine with the given name or UUID.
+
+ Returns a snapshot of this machine with the given UUID.
+ A @c null argument can be used to obtain the first snapshot
+ taken on this machine. To traverse the whole tree of snapshots
+ starting from the root, inspect the root snapshot's
+ <link to="ISnapshot::children" /> attribute and recurse over those children.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ Virtual machine has no snapshots or snapshot not found.
+ </result>
+
+ </desc>
+ <param name="nameOrId" type="wstring" dir="in">
+ <desc>What to search for. Name or UUID of the snapshot to find</desc>
+ </param>
+ <param name="snapshot" type="ISnapshot" dir="return">
+ <desc>Snapshot object with the given name.</desc>
+ </param>
+ </method>
+
+ <method name="createSharedFolder">
+ <rest request="post" path="/vms/{vmid}/methods/"/>
+ <desc>
+ Creates a new permanent shared folder by associating the given logical
+ name with the given host path, adds it to the collection of shared
+ folders and starts sharing it. Refer to the description of
+ <link to="ISharedFolder"/> to read more about logical names.
+
+ <result name="VBOX_E_OBJECT_IN_USE">
+ Shared folder already exists.
+ </result>
+ <result name="VBOX_E_FILE_ERROR">
+ Shared folder @a hostPath not accessible.
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Unique logical name of the shared folder.</desc>
+ </param>
+ <param name="hostPath" type="wstring" dir="in">
+ <desc>Full path to the shared folder in the host file system.</desc>
+ </param>
+ <param name="writable" type="boolean" dir="in">
+ <desc>Whether the share is writable or read-only.</desc>
+ </param>
+ <param name="automount" type="boolean" dir="in">
+ <desc>Whether the share gets automatically mounted by the guest
+ or not.</desc>
+ </param>
+ <param name="autoMountPoint" type="wstring" dir="in">
+ <desc>Where the guest should automatically mount the folder, if possible.
+ For Windows and OS/2 guests this should be a drive letter, while other
+ guests it should be a absolute directory.
+ </desc>
+ </param>
+ </method>
+
+ <method name="removeSharedFolder">
+ <rest request="delete" path="/vms/{vmid}/methods/"/>
+ <desc>
+ Removes the permanent shared folder with the given name previously
+ created by <link to="#createSharedFolder"/> from the collection of
+ shared folders and stops sharing it.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine is not mutable.
+ </result>
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ Shared folder @a name does not exist.
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Logical name of the shared folder to remove.</desc>
+ </param>
+ </method>
+
+ <method name="canShowConsoleWindow">
+ <desc>
+ Returns @c true if the VM console process can activate the
+ console window and bring it to foreground on the desktop of
+ the host PC.
+ <note>
+ This method will fail if a session for this machine is not
+ currently open.
+ </note>
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Machine session is not open.
+ </result>
+
+ </desc>
+ <param name="canShow" type="boolean" dir="return">
+ <desc>
+ @c true if the console window can be shown and @c false otherwise.
+ </desc>
+ </param>
+ </method>
+
+ <method name="showConsoleWindow">
+ <desc>
+ Activates the console window and brings it to foreground on
+ the desktop of the host PC. Many modern window managers on
+ many platforms implement some sort of focus stealing
+ prevention logic, so that it may be impossible to activate
+ a window without the help of the currently active
+ application. In this case, this method will return a non-zero
+ identifier that represents the top-level window of the VM
+ console process. The caller, if it represents a currently
+ active process, is responsible to use this identifier (in a
+ platform-dependent manner) to perform actual window
+ activation.
+ <note>
+ This method will fail if a session for this machine is not
+ currently open.
+ </note>
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Machine session is not open.
+ </result>
+
+ </desc>
+ <param name="winId" type="long long" dir="return">
+ <desc>
+ Platform-dependent identifier of the top-level VM console
+ window, or zero if this method has performed all actions
+ necessary to implement the <i>show window</i> semantics for
+ the given platform and/or VirtualBox front-end.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getGuestProperty" const="yes">
+ <rest name="Property" request="get" path="/vms/{vmid}/guest/"/>
+
+ <desc>
+ Reads an entry from the machine's guest property store.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Machine session is not open.
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>
+ The name of the property to read.
+ </desc>
+ </param>
+ <param name="value" type="wstring" dir="out">
+ <desc>
+ The value of the property. If the property does not exist then this
+ will be empty.
+ </desc>
+ </param>
+ <param name="timestamp" type="long long" dir="out">
+ <desc>
+ The time at which the property was last modified, as seen by the
+ server process.
+ </desc>
+ </param>
+ <param name="flags" type="wstring" dir="out">
+ <desc>
+ Additional property parameters, passed as a comma-separated list of
+ "name=value" type entries.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getGuestPropertyValue" const="yes">
+ <desc>
+ Reads a value from the machine's guest property store.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Machine session is not open.
+ </result>
+
+ </desc>
+ <param name="property" type="wstring" dir="in">
+ <desc>
+ The name of the property to read.
+ </desc>
+ </param>
+ <param name="value" type="wstring" dir="return">
+ <desc>
+ The value of the property. If the property does not exist then this
+ will be empty.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getGuestPropertyTimestamp" const="yes">
+ <desc>
+ Reads a property timestamp from the machine's guest property store.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Machine session is not open.
+ </result>
+
+ </desc>
+ <param name="property" type="wstring" dir="in">
+ <desc>
+ The name of the property to read.
+ </desc>
+ </param>
+ <param name="value" type="long long" dir="return">
+ <desc>
+ The timestamp. If the property does not exist then this will be
+ empty.
+ </desc>
+ </param>
+ </method>
+
+ <method name="setGuestProperty">
+ <rest name="Property" request="patch" path="/vms/{vmid}/guest/"/>
+ <desc>
+ Sets, changes or deletes an entry in the machine's guest property
+ store.
+
+ <result name="E_ACCESSDENIED">
+ Property cannot be changed.
+ </result>
+ <result name="E_INVALIDARG">
+ Invalid @a flags.
+ </result>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine is not mutable or session not open.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Cannot set transient property when machine not running.
+ </result>
+
+ </desc>
+ <param name="property" type="wstring" dir="in">
+ <desc>
+ The name of the property to set, change or delete.
+ </desc>
+ </param>
+ <param name="value" type="wstring" dir="in">
+ <desc>
+ The new value of the property to set, change or delete. If the
+ property does not yet exist and value is non-empty, it will be
+ created. If the value is @c null or empty, the property will be
+ deleted if it exists.
+ </desc>
+ </param>
+ <param name="flags" type="wstring" dir="in">
+ <desc>
+ Additional property parameters, passed as a comma-separated list of
+ "name=value" type entries.
+ </desc>
+ </param>
+ </method>
+
+ <method name="setGuestPropertyValue">
+ <desc>
+ Sets or changes a value in the machine's guest property
+ store. The flags field will be left unchanged or created empty for a
+ new property.
+
+ <result name="E_ACCESSDENIED">
+ Property cannot be changed.
+ </result>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine is not mutable or session not open.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Cannot set transient property when machine not running.
+ </result>
+ </desc>
+
+ <param name="property" type="wstring" dir="in">
+ <desc>
+ The name of the property to set or change.
+ </desc>
+ </param>
+ <param name="value" type="wstring" dir="in">
+ <desc>
+ The new value of the property to set or change. If the
+ property does not yet exist and value is non-empty, it will be
+ created.
+ </desc>
+ </param>
+ </method>
+
+ <method name="deleteGuestProperty" const="yes">
+ <rest name="Property" request="delete" path="/vms/{vmid}/guest/"/>
+ <desc>
+ Deletes an entry from the machine's guest property store.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Machine session is not open.
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>
+ The name of the property to delete.
+ </desc>
+ </param>
+ </method>
+
+ <method name="enumerateGuestProperties" const="yes">
+ <desc>
+ Return a list of the guest properties matching a set of patterns along
+ with their values, timestamps and flags.
+ </desc>
+ <param name="patterns" type="wstring" dir="in">
+ <desc>
+ The patterns to match the properties against, separated by '|'
+ characters. If this is empty or @c null, all properties will match.
+ </desc>
+ </param>
+ <param name="names" type="wstring" dir="out" safearray="yes">
+ <desc>
+ The names of the properties returned.
+ </desc>
+ </param>
+ <param name="values" type="wstring" dir="out" safearray="yes">
+ <desc>
+ The values of the properties returned. The array entries match the
+ corresponding entries in the @a name array.
+ </desc>
+ </param>
+ <param name="timestamps" type="long long" dir="out" safearray="yes">
+ <desc>
+ The timestamps of the properties returned. The array entries match
+ the corresponding entries in the @a name array.
+ </desc>
+ </param>
+ <param name="flags" type="wstring" dir="out" safearray="yes">
+ <desc>
+ The flags of the properties returned. The array entries match the
+ corresponding entries in the @a name array.
+ </desc>
+ </param>
+ </method>
+
+ <method name="querySavedGuestScreenInfo" const="yes">
+ <desc>
+ Returns the guest dimensions from the saved state.
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in">
+ <desc>
+ Saved guest screen to query info from.
+ </desc>
+ </param>
+ <param name="originX" type="unsigned long" dir="out">
+ <desc>
+ The X position of the guest monitor top left corner.
+ </desc>
+ </param>
+ <param name="originY" type="unsigned long" dir="out">
+ <desc>
+ The Y position of the guest monitor top left corner.
+ </desc>
+ </param>
+ <param name="width" type="unsigned long" dir="out">
+ <desc>
+ Guest width at the time of the saved state was taken.
+ </desc>
+ </param>
+ <param name="height" type="unsigned long" dir="out">
+ <desc>
+ Guest height at the time of the saved state was taken.
+ </desc>
+ </param>
+ <param name="enabled" type="boolean" dir="out">
+ <desc>
+ Whether the monitor is enabled in the guest.
+ </desc>
+ </param>
+ </method>
+
+ <method name="readSavedThumbnailToArray">
+ <desc>
+ Thumbnail is retrieved to an array of bytes in the requested format.
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in">
+ <desc>
+ Saved guest screen to read from.
+ </desc>
+ </param>
+ <param name="bitmapFormat" type="BitmapFormat" dir="in">
+ <desc>
+ The requested format.
+ </desc>
+ </param>
+ <param name="width" type="unsigned long" dir="out">
+ <desc>
+ Bitmap width.
+ </desc>
+ </param>
+ <param name="height" type="unsigned long" dir="out">
+ <desc>
+ Bitmap height.
+ </desc>
+ </param>
+ <param name="data" type="octet" safearray="yes" dir="return">
+ <desc>
+ Array with resulting bitmap data.
+ </desc>
+ </param>
+ </method>
+
+ <method name="querySavedScreenshotInfo">
+ <desc>
+ Returns available formats and size of the screenshot from saved state.
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in">
+ <desc>
+ Saved guest screen to query info from.
+ </desc>
+ </param>
+ <param name="width" type="unsigned long" dir="out">
+ <desc>
+ Image width.
+ </desc>
+ </param>
+ <param name="height" type="unsigned long" dir="out">
+ <desc>
+ Image height.
+ </desc>
+ </param>
+ <param name="bitmapFormats" type="BitmapFormat" safearray="yes" dir="return">
+ <desc>
+ Formats supported by readSavedScreenshotToArray.
+ </desc>
+ </param>
+ </method>
+
+ <method name="readSavedScreenshotToArray">
+ <desc>
+ Screenshot in requested format is retrieved to an array of bytes.
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in">
+ <desc>
+ Saved guest screen to read from.
+ </desc>
+ </param>
+ <param name="bitmapFormat" type="BitmapFormat" dir="in">
+ <desc>
+ The requested format.
+ </desc>
+ </param>
+ <param name="width" type="unsigned long" dir="out">
+ <desc>
+ Image width.
+ </desc>
+ </param>
+ <param name="height" type="unsigned long" dir="out">
+ <desc>
+ Image height.
+ </desc>
+ </param>
+ <param name="data" type="octet" dir="return" safearray="yes">
+ <desc>
+ Array with resulting image data.
+ </desc>
+ </param>
+ </method>
+
+ <method name="hotPlugCPU">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Plugs a CPU into the machine.
+ </desc>
+ <param name="cpu" type="unsigned long" dir="in">
+ <desc>
+ The CPU id to insert.
+ </desc>
+ </param>
+ </method>
+
+ <method name="hotUnplugCPU">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Removes a CPU from the machine.
+ </desc>
+ <param name="cpu" type="unsigned long" dir="in">
+ <desc>
+ The CPU id to remove.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getCPUStatus">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Returns the current status of the given CPU.
+ </desc>
+ <param name="cpu" type="unsigned long" dir="in">
+ <desc>
+ The CPU id to check for.
+ </desc>
+ </param>
+ <param name="attached" type="boolean" dir="return">
+ <desc>
+ Status of the CPU.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getEffectiveParavirtProvider" const="yes">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Returns the effective paravirtualization provider for this VM.
+ </desc>
+ <param name="paravirtProvider" type="ParavirtProvider" dir="return">
+ <desc>
+ The effective paravirtualization provider for this VM.
+ </desc>
+ </param>
+ </method>
+
+ <method name="queryLogFilename">
+ <rest request="get" path="/vms/{vmid}/logs/"/>
+ <desc>
+ Queries for the VM log file name of an given index. Returns an empty
+ string if a log file with that index doesn't exists.
+ </desc>
+ <param name="idx" type="unsigned long" dir="in">
+ <desc>
+ Which log file name to query. 0=current log file.
+ </desc>
+ </param>
+ <param name="filename" type="wstring" dir="return">
+ <desc>
+ On return the full path to the log file or an empty string on error.
+ </desc>
+ </param>
+ </method>
+
+ <method name="readLog">
+ <desc>
+ Reads the VM log file. The chunk size is limited, so even if you
+ ask for a big piece there might be less data returned.
+ </desc>
+ <param name="idx" type="unsigned long" dir="in">
+ <desc>
+ Which log file to read. 0=current log file.
+ </desc>
+ </param>
+ <param name="offset" type="long long" dir="in">
+ <desc>
+ Offset in the log file.
+ </desc>
+ </param>
+ <param name="size" type="long long" dir="in">
+ <desc>
+ Chunk size to read in the log file.
+ </desc>
+ </param>
+ <param name="data" type="octet" dir="return" safearray="yes">
+ <desc>
+ Data read from the log file. A data size of 0 means end of file
+ if the requested chunk size was not 0. This is the unprocessed
+ file data, i.e. the line ending style depends on the platform of
+ the system the server is running on.
+ </desc>
+ </param>
+ </method>
+
+ <method name="cloneTo">
+ <rest name="clone" request="put" path="/vms/{vmid}/actions/"/>
+ <desc>
+ Creates a clone of this machine, either as a full clone (which means
+ creating independent copies of the hard disk media, save states and so
+ on), or as a linked clone (which uses its own differencing media,
+ sharing the parent media with the source machine).
+
+ The target machine object must have been created previously with <link
+ to="IVirtualBox::createMachine"/>, and all the settings will be
+ transferred except the VM name and the hardware UUID. You can set the
+ VM name and the new hardware UUID when creating the target machine. The
+ network MAC addresses are newly created for all enabled network
+ adapters. You can change that behaviour with the options parameter.
+ The operation is performed asynchronously, so the machine object will
+ be not be usable until the @a progress object signals completion.
+
+ <result name="E_INVALIDARG">
+ @a target is @c null.
+ </result>
+ </desc>
+
+ <param name="target" type="IMachine" dir="in">
+ <desc>Target machine object.</desc>
+ </param>
+ <param name="mode" type="CloneMode" dir="in">
+ <desc>Which states should be cloned.</desc>
+ </param>
+ <param name="options" type="CloneOptions" dir="in" safearray="yes">
+ <desc>Options for the cloning operation.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="moveTo">
+ <rest name="move" request="post" path="/vms/{vmid}/actions/"/>
+ <desc>
+ Move machine on to new place/folder
+ </desc>
+
+ <param name="folder" type="wstring" dir="in">
+ <desc>Target folder where machine is moved. May be the same folder
+ where the VM already is located or the empty string, in which
+ case the machine is kept in this location and the disk images
+ and other files which are stored elsewhere are moved.</desc>
+ </param>
+
+ <param name="type" type="wstring" dir="in">
+ <desc>Type of moving.
+ Possible values:
+ basic - Only the files which belong solely to this machine
+ are moved from the original machine's folder to
+ a new folder.
+ </desc>
+ </param>
+
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="saveState">
+ <rest name="save" request="post" path="/vms/{vmid}/actions/"/>
+ <desc>
+ Saves the current execution state of a running virtual machine
+ and stops its execution.
+
+ After this operation completes, the machine will go to the
+ Saved state. The next time it is powered up this state will
+ be restored and the machine will continue its execution from
+ the place where it was saved.
+
+ This operation differs from taking a snapshot to the effect
+ that it doesn't create new differencing media. Also, once
+ the machine is powered up from the state saved using this method,
+ the saved state is deleted, so it will be impossible to return
+ to this state later.
+
+ <note>
+ On success, this method implicitly calls
+ <link to="#saveSettings"/> to save all current machine
+ settings (including runtime changes to the DVD medium, etc.).
+ Together with the impossibility to change any VM settings when it is
+ in the Saved state, this guarantees adequate hardware
+ configuration of the machine when it is restored from the saved
+ state file.
+ </note>
+
+ <note>
+ The machine must be in the Running or Paused state, otherwise
+ the operation will fail.
+ </note>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine state neither Running nor Paused.
+ </result>
+ <result name="VBOX_E_FILE_ERROR">
+ Failed to create directory for saved state file.
+ </result>
+
+ <see><link to="#takeSnapshot"/></see>
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="adoptSavedState">
+ <desc>
+ Associates the given saved state file to the virtual machine.
+
+ On success, the machine will go to the Saved state. The next time it is
+ powered up it will be restored from the adopted saved state and
+ continue execution from the place where the saved state file was
+ created.
+
+ The specified saved state file path may be absolute or relative to the
+ folder the VM normally saves the state to (usually,
+ <link to="#snapshotFolder"/>).
+
+ <note>
+ It's a caller's responsibility to make sure the given saved state
+ file is compatible with the settings of this virtual machine that
+ represent its virtual hardware (memory size, storage disk configuration
+ etc.). If there is a mismatch, the behavior of the virtual machine
+ is undefined.
+ </note>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine state neither PoweredOff nor Aborted.
+ </result>
+ </desc>
+ <param name="savedStateFile" type="wstring" dir="in">
+ <desc>Path to the saved state file to adopt.</desc>
+ </param>
+ </method>
+
+ <method name="discardSavedState">
+ <rest request="post" path="/vms/{vmid}/actions/"/>
+ <desc>
+ Forcibly resets the machine to "Powered Off" state if it is
+ currently in the "Saved" state previously created by <link to="#saveState"/>)
+ or in the "AbortedSaved" state. The next time the machine is powered up
+ a clean boot will occur.
+ <note>
+ This operation is equivalent to resetting or powering off
+ the machine without doing a proper shutdown of the guest
+ operating system; as with resetting a running phyiscal
+ computer, it can can lead to data loss.
+ </note>
+ If @a fRemoveFile is @c true, the file in the machine directory
+ into which the machine state was saved is also deleted. If
+ this is @c false, then the state can be recovered and later
+ re-inserted into a machine using <link to="#adoptSavedState" />.
+ The location of the file can be found in the
+ <link to="#stateFilePath" /> attribute.
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine not in either the Saved or AbortedSaved state.
+ </result>
+ </desc>
+ <param name="fRemoveFile" type="boolean" dir="in" >
+ <desc>Whether to also remove the saved state file.</desc>
+ </param>
+ </method>
+
+ <method name="takeSnapshot">
+ <rest request="put" path="/vms/{vmid}/actions/"/>
+ <desc>
+ Saves the current execution state
+ and all settings of the machine and creates differencing images
+ for all normal (non-independent) media.
+ See <link to="ISnapshot" /> for an introduction to snapshots.
+
+ This method can be called for a PoweredOff, Saved (see
+ <link to="#saveState"/>), AbortedSaved, Running or
+ Paused virtual machine. When the machine is PoweredOff, an
+ offline snapshot is created. When the machine is Running a live
+ snapshot is created, and an online snapshot is created when Paused.
+
+ The taken snapshot is always based on the
+ <link to="#currentSnapshot">current snapshot</link>
+ of the associated virtual machine and becomes a new current snapshot.
+
+ <note>
+ This method implicitly calls <link to="#saveSettings"/> to
+ save all current machine settings before taking an offline snapshot.
+ </note>
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine currently changing state.
+ </result>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Short name for the snapshot.</desc>
+ </param>
+ <param name="description" type="wstring" dir="in">
+ <desc>Optional description of the snapshot.</desc>
+ </param>
+ <param name="pause" type="boolean" dir="in">
+ <desc>Whether the VM should be paused while taking the snapshot. Only
+ relevant when the VM is running, and distinguishes between online
+ (@c true) and live (@c false) snapshots. When the VM is not running
+ the result is always an offline snapshot.</desc>
+ </param>
+ <param name="id" type="uuid" mod="string" dir="out">
+ <desc>UUID of the snapshot which will be created. Useful for follow-up
+ operations after the snapshot has been created.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="deleteSnapshot">
+ <rest request="delete" path="/vms/{vmid}/actions/"/>
+ <desc>
+ Starts deleting the specified snapshot asynchronously.
+ See <link to="ISnapshot" /> for an introduction to snapshots.
+
+ The execution state and settings of the associated machine stored in
+ the snapshot will be deleted. The contents of all differencing media of
+ this snapshot will be merged with the contents of their dependent child
+ media to keep the medium chain valid (in other words, all changes
+ represented by media being deleted will be propagated to their child
+ medium). After that, this snapshot's differencing medium will be
+ deleted. The parent of this snapshot will become a new parent for all
+ its child snapshots.
+
+ If the deleted snapshot is the current one, its parent snapshot will
+ become a new current snapshot. The current machine state is not directly
+ affected in this case, except that currently attached differencing
+ media based on media of the deleted snapshot will be also merged as
+ described above.
+
+ If the deleted snapshot is the first or current snapshot, then the
+ respective IMachine attributes will be adjusted. Deleting the current
+ snapshot will also implicitly call <link to="#saveSettings"/>
+ to make all current machine settings permanent.
+
+ Deleting a snapshot has the following preconditions:
+
+ <ul>
+ <li>Child media of all normal media of the deleted snapshot
+ must be accessible (see <link to="IMedium::state"/>) for this
+ operation to succeed. If only one running VM refers to all images
+ which participates in merging the operation can be performed while
+ the VM is running. Otherwise all virtual machines whose media are
+ directly or indirectly based on the media of deleted snapshot must
+ be powered off. In any case, online snapshot deleting usually is
+ slower than the same operation without any running VM.</li>
+
+ <li>You cannot delete the snapshot if a medium attached to it has
+ more than one child medium (differencing images) because otherwise
+ merging would be impossible. This might be the case if there is
+ more than one child snapshot or differencing images were created
+ for other reason (e.g. implicitly because of multiple machine
+ attachments).</li>
+ </ul>
+
+ The virtual machine's <link to="#state">state</link> is
+ changed to "DeletingSnapshot", "DeletingSnapshotOnline" or
+ "DeletingSnapshotPaused" while this operation is in progress.
+
+ <note>
+ Merging medium contents can be very time and disk space
+ consuming, if these media are big in size and have many
+ children. However, if the snapshot being deleted is the last
+ (head) snapshot on the branch, the operation will be rather
+ quick.
+ </note>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ The running virtual machine prevents deleting this snapshot. This
+ happens only in very specific situations, usually snapshots can be
+ deleted without trouble while a VM is running. The error message
+ text explains the reason for the failure.
+ </result>
+ </desc>
+ <param name="id" type="uuid" mod="string" dir="in">
+ <desc>UUID of the snapshot to delete.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="deleteSnapshotAndAllChildren">
+ <rest request="post" path="/vms/{vmid}/actions/"/>
+ <desc>
+ Starts deleting the specified snapshot and all its children
+ asynchronously. See <link to="ISnapshot" /> for an introduction to
+ snapshots. The conditions and many details are the same as with
+ <link to="#deleteSnapshot"/>.
+
+ This operation is very fast if the snapshot subtree does not include
+ the current state. It is still significantly faster than deleting the
+ snapshots one by one if the current state is in the subtree and there
+ are more than one snapshots from current state to the snapshot which
+ marks the subtree, since it eliminates the incremental image merging.
+
+ <note>This API method is right now not implemented!</note>
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ The running virtual machine prevents deleting this snapshot. This
+ happens only in very specific situations, usually snapshots can be
+ deleted without trouble while a VM is running. The error message
+ text explains the reason for the failure.
+ </result>
+ <result name="E_NOTIMPL">
+ The method is not implemented yet.
+ </result>
+ </desc>
+ <param name="id" type="uuid" mod="string" dir="in">
+ <desc>UUID of the snapshot to delete, including all its children.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="deleteSnapshotRange">
+ <rest request="post" path="/vms/{vmid}/actions/"/>
+ <desc>
+ Starts deleting the specified snapshot range. This is limited to
+ linear snapshot lists, which means there may not be any other child
+ snapshots other than the direct sequence between the start and end
+ snapshot. If the start and end snapshot point to the same snapshot this
+ method is completely equivalent to <link to="#deleteSnapshot"/>. See
+ <link to="ISnapshot" /> for an introduction to snapshots. The
+ conditions and many details are the same as with
+ <link to="#deleteSnapshot"/>.
+
+ This operation is generally faster than deleting snapshots one by one
+ and often also needs less extra disk space before freeing up disk space
+ by deleting the removed disk images corresponding to the snapshot.
+
+ <note>This API method is right now not implemented!</note>
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ The running virtual machine prevents deleting this snapshot. This
+ happens only in very specific situations, usually snapshots can be
+ deleted without trouble while a VM is running. The error message
+ text explains the reason for the failure.
+ </result>
+ <result name="E_NOTIMPL">
+ The method is not implemented yet.
+ </result>
+ </desc>
+ <param name="startId" type="uuid" mod="string" dir="in">
+ <desc>UUID of the first snapshot to delete.</desc>
+ </param>
+ <param name="endId" type="uuid" mod="string" dir="in">
+ <desc>UUID of the last snapshot to delete.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="restoreSnapshot">
+ <rest request="post" path="/vms/{vmid}/actions/"/>
+ <desc>
+ Starts resetting the machine's current state to the state contained
+ in the given snapshot, asynchronously. All current settings of the
+ machine will be reset and changes stored in differencing media
+ will be lost.
+ See <link to="ISnapshot" /> for an introduction to snapshots.
+
+ After this operation is successfully completed, new empty differencing
+ media are created for all normal media of the machine.
+
+ If the given snapshot is an online snapshot, the machine will go to
+ the <link to="MachineState_Saved">Saved</link> state, so that the
+ next time it is powered on, the execution state will be restored
+ from the state of the snapshot.
+
+ <note>
+ The machine must not be running, otherwise the operation will fail.
+ </note>
+
+ <note>
+ If the machine is in the <link to="MachineState_Saved">Saved</link>
+ state prior to this operation, the saved state file will be implicitly
+ deleted (as if <link to="IMachine::discardSavedState"/> were
+ called).
+ </note>
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine is running.
+ </result>
+ </desc>
+ <param name="snapshot" type="ISnapshot" dir="in">
+ <desc>The snapshot to restore the VM state from.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="applyDefaults">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Applies the defaults for the configured guest OS type. This is
+ primarily for getting sane settings straight after creating a
+ new VM, but it can also be applied later.
+
+ <note>
+ This is primarily a shortcut, centralizing the tedious job of
+ getting the recommended settings and translating them into
+ settings updates. The settings are made at the end of the call,
+ but not saved.
+ </note>
+
+ <result name="E_FAIL">
+ General error.
+ </result>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ The machine is in invalid state.
+ </result>
+ <result name="VBOX_E_OBJECT_IN_USE">
+ Some of the applied objects already exist. The method has been
+ called to already configured machine.
+ </result>
+ </desc>
+ <param name="flags" type="wstring" dir="in">
+ <desc>
+ Additional flags, to be defined later.
+ </desc>
+ </param>
+ </method>
+
+ <method name="changeEncryption" wrap-hint-server="limitedcaller">
+ <desc>
+ Starts encryption of this VM. This means that the stored data of the VM is encrypted.
+
+ Please note that the results can be either returned straight away,
+ or later as the result of the background operation via the object
+ returned via the @a progress parameter.
+
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Encryption is not supported for various reasons e.g. unsupported cipher.
+ </result>
+ </desc>
+ <param name="currentPassword" type="wstring" dir="in">
+ <desc>
+ The current password the VM is protected with. Use an empty string to indicate
+ that the VM isn't encrypted.
+ </desc>
+ </param>
+ <param name="cipher" type="wstring" dir="in">
+ <desc>
+ The cipher to use for encryption. An empty string indicates no encryption for the
+ result.
+ </desc>
+ </param>
+ <param name="newPassword" type="wstring" dir="in">
+ <desc>
+ The new password the VM should be protected with. An empty password and password ID
+ will result in the VM being encrypted with the current password.
+ </desc>
+ </param>
+ <param name="newPasswordId" type="wstring" dir="in">
+ <desc>The ID of the new password when unlocking the VM.</desc>
+ </param>
+ <param name="force" type="boolean" dir="in">
+ <desc>
+ Force reencryption of the data if just password is changed.
+ Otherwise, if data already encrypted and cipher doesn't changed
+ only the password is changed.
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="getEncryptionSettings" const="yes" wrap-hint-server="limitedcaller">
+ <desc>
+ Returns the encryption settings for this VM.
+
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Encryption is not configured for this VM.
+ </result>
+ </desc>
+ <param name="cipher" type="wstring" dir="out">
+ <desc>The cipher used for encryption.</desc>
+ </param>
+ <param name="passwordId" type="wstring" dir="out">
+ <desc>The ID of the password when unlocking the VM.</desc>
+ </param>
+ </method>
+
+ <method name="checkEncryptionPassword" const="yes" wrap-hint-server="limitedcaller">
+ <desc>
+ Checks whether the supplied password is correct for the VM.
+
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Encryption is not configured for this VM.
+ </result>
+ <result name="VBOX_E_PASSWORD_INCORRECT">
+ The given password is incorrect.
+ </result>
+ </desc>
+ <param name="password" type="wstring" dir="in">
+ <desc>The password to check.</desc>
+ </param>
+ </method>
+
+ <method name="addEncryptionPassword" wrap-hint-server="limitedcaller">
+ <desc>
+ Adds a password used for encryption. Updates the accesibility
+ state if password used the VM encryption.
+
+ <result name="VBOX_E_PASSWORD_INCORRECT">
+ The password provided wasn't correct for the VM using the provided
+ ID.
+ </result>
+ </desc>
+ <param name="id" type="wstring" dir="in">
+ <desc>
+ The identifier used for the password. Must match the identifier
+ used when the encrypted VM was created.
+ </desc>
+ </param>
+ <param name="password" type="wstring" dir="in">
+ <desc>The password.</desc>
+ </param>
+ </method>
+
+ <method name="addEncryptionPasswords" wrap-hint-server="limitedcaller">
+ <desc>
+ Adds passwords used for encryption. Updates the accesibility
+ state if the list contains password used the VM encryption.
+
+ <result name="VBOX_E_PASSWORD_INCORRECT">
+ The password provided wasn't correct for the VM using the provided
+ ID.
+ </result>
+ <result name="E_INVALIDARG">
+ Id and passwords arrays have different size.
+ </result>
+ </desc>
+ <param name="ids" type="wstring" dir="in" safearray="yes">
+ <desc>
+ List of identifiers for the passwords. Must match the identifier
+ used when the encrypted VM was created.
+ </desc>
+ </param>
+ <param name="passwords" type="wstring" dir="in" safearray="yes">
+ <desc>List of passwords.</desc>
+ </param>
+ </method>
+
+ <method name="removeEncryptionPassword" wrap-hint-server="limitedcaller,passcaller">
+ <desc>
+ Removes a password used for the VM encryption/decryption.
+ The password can be removed only if the VM is powered off.
+ Removing the password causes the VM goes to the inaccessible
+ state and the password must be provided again.
+ <note>
+ If machine becomes inaccessible all passwords are purged.
+ One has to add required passwords again using either
+ <link to="IMachine::addEncryptionPassword"/> or
+ <link to="IMachine::addEncryptionPasswords"/> methods.
+ </note>
+ </desc>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ The VM is not in proper state e.g powered on.
+ </result>
+ <param name="id" type="wstring" dir="in">
+ <desc>
+ The identifier used for the password. Must match the identifier
+ used when the encrypted VM was created.
+ </desc>
+ </param>
+ </method>
+
+ <method name="clearAllEncryptionPasswords" wrap-hint-server="limitedcaller,passcaller">
+ <desc>
+ Clears all provided VM passwords.
+ The passwords can be removed only if the VM is powered off.
+ Removing the passwords causes the VM goes to the inaccessible
+ state and the password must be provided again.
+ </desc>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ The VM is not in proper state e.g powered on.
+ </result>
+ </method>
+
+ </interface>
+
+ <interface
+ name="IEmulatedUSB" extends="$unknown"
+ uuid="6e253ee8-477a-2497-6759-88b8292a5af0"
+ wsmap="managed"
+ reservedMethods="4" reservedAttributes="4"
+ >
+ <desc>
+ Manages emulated USB devices.
+ </desc>
+
+ <method name="webcamAttach">
+ <desc>
+ Attaches the emulated USB webcam to the VM, which will use a host video capture device.
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>The host path of the capture device to use.</desc>
+ </param>
+ <param name="settings" type="wstring" dir="in">
+ <desc>Optional settings.</desc>
+ </param>
+ </method>
+
+ <method name="webcamDetach">
+ <desc>
+ Detaches the emulated USB webcam from the VM
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>The host path of the capture device to detach.</desc>
+ </param>
+ </method>
+
+ <attribute name="webcams" type="wstring" safearray="yes" readonly="yes">
+ <desc>Lists attached virtual webcams.</desc>
+ </attribute>
+ </interface>
+
+ <!--
+ // IConsole
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IVRDEServerInfo" extends="$unknown"
+ uuid="c39ef4d6-7532-45e8-96da-eb5986ae76e4"
+ wsmap="struct"
+ rest="managed"
+ reservedAttributes="8"
+ >
+ <desc>
+ Contains information about the remote desktop (VRDE) server capabilities and status.
+ This is used in the <link to="IConsole::VRDEServerInfo" /> attribute.
+ </desc>
+
+ <attribute name="active" type="boolean" readonly="yes">
+ <desc>
+ Whether the remote desktop connection is active.
+ </desc>
+ </attribute>
+
+ <attribute name="port" type="long" readonly="yes">
+ <desc>
+ VRDE server port number. If this property is equal to <tt>0</tt>, then
+ the VRDE server failed to start, usually because there are no free IP
+ ports to bind to. If this property is equal to <tt>-1</tt>, then the VRDE
+ server has not yet been started.
+ </desc>
+ </attribute>
+
+ <attribute name="numberOfClients" type="unsigned long" readonly="yes">
+ <desc>
+ How many times a client connected.
+ </desc>
+ </attribute>
+
+ <attribute name="beginTime" type="long long" readonly="yes">
+ <desc>
+ When the last connection was established, in milliseconds since 1970-01-01 UTC.
+ </desc>
+ </attribute>
+
+ <attribute name="endTime" type="long long" readonly="yes">
+ <desc>
+ When the last connection was terminated or the current time, if
+ connection is still active, in milliseconds since 1970-01-01 UTC.
+ </desc>
+ </attribute>
+
+ <attribute name="bytesSent" type="long long" readonly="yes">
+ <desc>
+ How many bytes were sent in last or current, if still active, connection.
+ </desc>
+ </attribute>
+
+ <attribute name="bytesSentTotal" type="long long" readonly="yes">
+ <desc>
+ How many bytes were sent in all connections.
+ </desc>
+ </attribute>
+
+ <attribute name="bytesReceived" type="long long" readonly="yes">
+ <desc>
+ How many bytes were received in last or current, if still active, connection.
+ </desc>
+ </attribute>
+
+ <attribute name="bytesReceivedTotal" type="long long" readonly="yes">
+ <desc>
+ How many bytes were received in all connections.
+ </desc>
+ </attribute>
+
+ <attribute name="user" type="wstring" readonly="yes">
+ <desc>
+ Login user name supplied by the client.
+ </desc>
+ </attribute>
+
+ <attribute name="domain" type="wstring" readonly="yes">
+ <desc>
+ Login domain name supplied by the client.
+ </desc>
+ </attribute>
+
+ <attribute name="clientName" type="wstring" readonly="yes">
+ <desc>
+ The client name supplied by the client.
+ </desc>
+ </attribute>
+
+ <attribute name="clientIP" type="wstring" readonly="yes">
+ <desc>
+ The IP address of the client.
+ </desc>
+ </attribute>
+
+ <attribute name="clientVersion" type="unsigned long" readonly="yes">
+ <desc>
+ The client software version number.
+ </desc>
+ </attribute>
+
+ <attribute name="encryptionStyle" type="unsigned long" readonly="yes">
+ <desc>
+ Public key exchange method used when connection was established.
+ Values: 0 - RDP4 public key exchange scheme.
+ 1 - X509 certificates were sent to client.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IConsole" extends="$unknown"
+ uuid="6ac83d89-6ee7-4e33-8ae6-b257b2e81be8"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="8" reservedAttributes="8"
+ >
+ <desc>
+ The IConsole interface represents an interface to control virtual
+ machine execution.
+
+ A console object gets created when a machine has been locked for a
+ particular session (client process) using <link to="IMachine::lockMachine" />
+ or <link to="IMachine::launchVMProcess"/>. The console object can
+ then be found in the session's <link to="ISession::console" /> attribute.
+
+ Methods of the IConsole interface allow the caller to query the current
+ virtual machine execution state, pause the machine or power it down, save
+ the machine state or take a snapshot, attach and detach removable media
+ and so on.
+
+ <see><link to="ISession"/></see>
+ </desc>
+
+ <attribute name="machine" type="IMachine" readonly="yes" rest="uuid">
+ <desc>
+ Machine object for this console session.
+ <note>
+ This is a convenience property, it has the same value as
+ <link to="ISession::machine"/> of the corresponding session
+ object.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="state" type="MachineState" readonly="yes">
+ <desc>
+ Current execution state of the machine.
+ <note>
+ This property always returns the same value as the corresponding
+ property of the IMachine object for this console session.
+ For the process that owns (executes) the VM, this is the
+ preferable way of querying the VM state, because no IPC
+ calls are made.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="guest" type="IGuest" readonly="yes">
+ <desc>Guest object.</desc>
+ </attribute>
+
+ <attribute name="keyboard" type="IKeyboard" readonly="yes">
+ <desc>
+ Virtual keyboard object.
+ <note>
+ If the machine is not running, any attempt to use
+ the returned object will result in an error.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="mouse" type="IMouse" readonly="yes">
+ <desc>
+ Virtual mouse object.
+ <note>
+ If the machine is not running, any attempt to use
+ the returned object will result in an error.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="display" type="IDisplay" readonly="yes">
+ <desc>Virtual display object.
+ <note>
+ If the machine is not running, any attempt to use
+ the returned object will result in an error.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="debugger" type="IMachineDebugger" readonly="yes">
+ <desc>Debugging interface.</desc>
+ </attribute>
+
+ <attribute name="USBDevices" type="IUSBDevice" readonly="yes" safearray="yes">
+ <desc>
+ Collection of USB devices currently attached to the virtual
+ USB controller.
+ <note>
+ The collection is empty if the machine is not running.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="remoteUSBDevices" type="IHostUSBDevice" readonly="yes" safearray="yes">
+ <desc>
+ List of USB devices currently attached to the remote VRDE client.
+ Once a new device is physically attached to the remote host computer,
+ it appears in this list and remains there until detached.
+ </desc>
+ </attribute>
+
+ <attribute name="sharedFolders" type="ISharedFolder" readonly="yes" safearray="yes">
+ <desc>
+ Collection of shared folders for the current session. These folders
+ are called transient shared folders because they are available to the
+ guest OS running inside the associated virtual machine only for the
+ duration of the session (as opposed to
+ <link to="IMachine::sharedFolders"/> which represent permanent shared
+ folders). When the session is closed (e.g. the machine is powered down),
+ these folders are automatically discarded.
+
+ New shared folders are added to the collection using
+ <link to="#createSharedFolder"/>. Existing shared folders can be
+ removed using <link to="#removeSharedFolder"/>.
+ </desc>
+ </attribute>
+
+ <attribute name="VRDEServerInfo" type="IVRDEServerInfo" readonly="yes">
+ <desc>
+ Interface that provides information on Remote Desktop Extension (VRDE) connection.
+ </desc>
+ </attribute>
+
+ <attribute name="eventSource" type="IEventSource" readonly="yes">
+ <desc>
+ Event source for console events.
+ </desc>
+ </attribute>
+
+ <attribute name="attachedPCIDevices" type="IPCIDeviceAttachment" readonly="yes" safearray="yes">
+ <desc>Array of PCI devices attached to this machine.</desc>
+ </attribute>
+
+ <attribute name="useHostClipboard" type="boolean">
+ <desc>
+ Whether the guest clipboard should be connected to the host one or
+ whether it should only be allowed access to the VRDE clipboard. This
+ setting may not affect existing guest clipboard connections which
+ are already connected to the host clipboard.
+ </desc>
+ </attribute>
+
+ <attribute name="emulatedUSB" type="IEmulatedUSB" readonly="yes">
+ <desc>
+ Interface that manages emulated USB devices.
+ </desc>
+ </attribute>
+
+ <method name="powerUp">
+ <rest request="post" path="/vms/{vmid}/console/actions/"/>
+ <desc>
+ Starts the virtual machine execution using the current machine
+ state (that is, its current execution state, current settings and
+ current storage devices).
+
+ <note>
+ This method is only useful for front-ends that want to actually
+ execute virtual machines in their own process (like the VirtualBox
+ or VBoxSDL front-ends). Unless you are intending to write such a
+ front-end, do not call this method. If you simply want to
+ start virtual machine execution using one of the existing front-ends
+ (for example the VirtualBox GUI or headless server), use
+ <link to="IMachine::launchVMProcess"/> instead; these
+ front-ends will power up the machine automatically for you.
+ </note>
+
+ If the machine is powered off or aborted, the execution will
+ start from the beginning (as if the real hardware were just
+ powered on).
+
+ If the machine is in the <link to="MachineState_Saved"/> state or the
+ <link to="MachineState_AbortedSaved"/> state it will continue its
+ execution from the point where the state was saved.
+
+ If the machine <link to="IMachine::teleporterEnabled"/> property is
+ enabled on the machine being powered up, the machine will wait for an
+ incoming teleportation in the <link to="MachineState_TeleportingIn"/>
+ state. The returned progress object will have at least three
+ operations where the last three are defined as: (1) powering up and
+ starting TCP server, (2) waiting for incoming teleportations, and
+ (3) perform teleportation. These operations will be reflected as the
+ last three operations of the progress objected returned by
+ <link to="IMachine::launchVMProcess"/> as well.
+
+ <see><link to="IMachine::saveState"/></see>
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine already running.
+ </result>
+ <result name="VBOX_E_HOST_ERROR">
+ Host interface does not exist or name not set.
+ </result>
+ <result name="VBOX_E_FILE_ERROR">
+ Invalid saved state file.
+ </result>
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="powerUpPaused">
+ <rest request="post" path="/vms/{vmid}/console/actions/"/>
+ <desc>
+ Identical to powerUp except that the VM will enter the
+ <link to="MachineState_Paused"/> state, instead of
+ <link to="MachineState_Running"/>.
+
+ <see><link to="#powerUp"/></see>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine already running.
+ </result>
+ <result name="VBOX_E_HOST_ERROR">
+ Host interface does not exist or name not set.
+ </result>
+ <result name="VBOX_E_FILE_ERROR">
+ Invalid saved state file.
+ </result>
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="powerDown">
+ <rest request="post" path="/vms/{vmid}/console/actions/"/>
+ <desc>
+ Initiates the power down procedure to stop the virtual machine
+ execution.
+
+ The completion of the power down procedure is tracked using the returned
+ IProgress object. After the operation is complete, the machine will go
+ to the PoweredOff state.
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine must be Running, Paused or Stuck to be powered down.
+ </result>
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="reset">
+ <rest request="post" path="/vms/{vmid}/console/actions/"/>
+ <desc>Resets the virtual machine.
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine not in Running state.
+ </result>
+ <result name="VBOX_E_VM_ERROR">
+ Virtual machine error in reset operation.
+ </result>
+ </desc>
+ </method>
+
+ <method name="pause">
+ <rest request="post" path="/vms/{vmid}/console/actions/"/>
+ <desc>Pauses the virtual machine execution.
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine not in Running state.
+ </result>
+ <result name="VBOX_E_VM_ERROR">
+ Virtual machine error in suspend operation.
+ </result>
+ </desc>
+ </method>
+
+ <method name="resume">
+ <rest request="post" path="/vms/{vmid}/console/actions/"/>
+ <desc>Resumes the virtual machine execution.
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine not in Paused state.
+ </result>
+ <result name="VBOX_E_VM_ERROR">
+ Virtual machine error in resume operation.
+ </result>
+ </desc>
+ </method>
+
+ <method name="powerButton">
+ <rest request="post" path="/vms/{vmid}/console/actions/"/>
+ <desc>Sends the ACPI power button event to the guest.
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine not in Running state.
+ </result>
+ <result name="VBOX_E_PDM_ERROR">
+ Controlled power off failed.
+ </result>
+ </desc>
+ </method>
+
+ <method name="sleepButton">
+ <rest request="post" path="/vms/{vmid}/console/actions/"/>
+ <desc>Sends the ACPI sleep button event to the guest.
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine not in Running state.
+ </result>
+ <result name="VBOX_E_PDM_ERROR">
+ Sending sleep button event failed.
+ </result>
+ </desc>
+ </method>
+
+ <method name="getPowerButtonHandled">
+ <desc>Checks if the last power button event was handled by guest.
+ <result name="VBOX_E_PDM_ERROR">
+ Checking if the event was handled by the guest OS failed.
+ </result>
+ </desc>
+ <param name="handled" type="boolean" dir="return"/>
+ </method>
+
+ <method name="getGuestEnteredACPIMode">
+ <desc>Checks if the guest entered the ACPI mode G0 (working) or
+ G1 (sleeping). If this method returns @c false, the guest will
+ most likely not respond to external ACPI events.
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine not in Running state.
+ </result>
+ </desc>
+ <param name="entered" type="boolean" dir="return"/>
+ </method>
+
+ <method name="getDeviceActivity">
+ <desc>
+ Gets the current activity type of given devices or device groups.
+ <result name="E_INVALIDARG">
+ Invalid device type.
+ </result>
+ </desc>
+ <param name="type" type="DeviceType" safearray="yes" dir="in"/>
+ <param name="activity" type="DeviceActivity" safearray="yes" dir="return"/>
+ </method>
+
+ <method name="attachUSBDevice">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Attaches a host USB device with the given UUID to the
+ USB controller of the virtual machine.
+
+ The device needs to be in one of the following states:
+ <link to="USBDeviceState_Busy"/>,
+ <link to="USBDeviceState_Available"/> or
+ <link to="USBDeviceState_Held"/>,
+ otherwise an error is immediately returned.
+
+ When the device state is
+ <link to="USBDeviceState_Busy">Busy</link>, an error may also
+ be returned if the host computer refuses to release it for some reason.
+
+ <see><link to="IUSBDeviceFilters::deviceFilters"/>,
+ <link to="USBDeviceState"/></see>
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine state neither Running nor Paused.
+ </result>
+ <result name="VBOX_E_PDM_ERROR">
+ Virtual machine does not have a USB controller.
+ </result>
+ </desc>
+ <param name="id" type="uuid" mod="string" dir="in">
+ <desc>UUID of the host USB device to attach.</desc>
+ </param>
+ <param name="captureFilename" type="wstring" dir="in">
+ <desc>Filename to capture the USB traffic to.</desc>
+ </param>
+ </method>
+
+ <method name="detachUSBDevice">
+ <rest request="post" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Detaches a USB device with the given UUID from the USB controller
+ of the virtual machine.
+
+ After this method succeeds, the VirtualBox server re-initiates
+ all USB filters as if the device were just physically attached
+ to the host, but filters of this machine are ignored to avoid
+ a possible automatic re-attachment.
+
+ <see><link to="IUSBDeviceFilters::deviceFilters"/>,
+ <link to="USBDeviceState"/></see>
+
+ <result name="VBOX_E_PDM_ERROR">
+ Virtual machine does not have a USB controller.
+ </result>
+ <result name="E_INVALIDARG">
+ USB device not attached to this virtual machine.
+ </result>
+ </desc>
+ <param name="id" type="uuid" mod="string" dir="in">
+ <desc>UUID of the USB device to detach.</desc>
+ </param>
+ <param name="device" type="IUSBDevice" dir="return">
+ <desc>Detached USB device.</desc>
+ </param>
+ </method>
+
+ <method name="findUSBDeviceByAddress">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Searches for a USB device with the given host address.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ Given @c name does not correspond to any USB device.
+ </result>
+
+ <see><link to="IUSBDevice::address"/></see>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>
+ Address of the USB device (as assigned by the host) to
+ search for.
+ </desc>
+ </param>
+ <param name="device" type="IUSBDevice" dir="return">
+ <desc>Found USB device object.</desc>
+ </param>
+ </method>
+
+ <method name="findUSBDeviceById">
+ <rest request="get" path="/vms/{vmid}/configuration/"/>
+ <desc>
+ Searches for a USB device with the given UUID.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ Given @c id does not correspond to any USB device.
+ </result>
+
+ <see><link to="IUSBDevice::id"/></see>
+ </desc>
+ <param name="id" type="uuid" mod="string" dir="in">
+ <desc>UUID of the USB device to search for.</desc>
+ </param>
+ <param name="device" type="IUSBDevice" dir="return">
+ <desc>Found USB device object.</desc>
+ </param>
+ </method>
+
+ <method name="createSharedFolder">
+ <rest request="post" path="/vms/{vmid}/console/methods/"/>
+ <desc>
+ Creates a transient new shared folder by associating the given logical
+ name with the given host path, adds it to the collection of shared
+ folders and starts sharing it. Refer to the description of
+ <link to="ISharedFolder"/> to read more about logical names.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine is in the Saved or AbortedSaved state or currently changing state.
+ </result>
+ <result name="VBOX_E_FILE_ERROR">
+ Shared folder already exists or not accessible.
+ </result>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Unique logical name of the shared folder.</desc>
+ </param>
+ <param name="hostPath" type="wstring" dir="in">
+ <desc>Full path to the shared folder in the host file system.</desc>
+ </param>
+ <param name="writable" type="boolean" dir="in">
+ <desc>Whether the share is writable or readonly</desc>
+ </param>
+ <param name="automount" type="boolean" dir="in">
+ <desc>Whether the share gets automatically mounted by the guest
+ or not.</desc>
+ </param>
+ <param name="autoMountPoint" type="wstring" dir="in">
+ <desc>Where the guest should automatically mount the folder, if possible.
+ For Windows and OS/2 guests this should be a drive letter, while other
+ guests it should be a absolute directory.
+ </desc>
+ </param>
+ </method>
+
+ <method name="removeSharedFolder">
+ <rest request="post" path="/vms/{vmid}/console/methods/"/>
+ <desc>
+ Removes a transient shared folder with the given name previously
+ created by <link to="#createSharedFolder"/> from the collection of
+ shared folders and stops sharing it.
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine is in the Saved or AbortedSaved state or currently changing state.
+ </result>
+ <result name="VBOX_E_FILE_ERROR">
+ Shared folder does not exists.
+ </result>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Logical name of the shared folder to remove.</desc>
+ </param>
+ </method>
+
+ <method name="teleport">
+ <desc>
+ Teleport the VM to a different host machine or process.
+
+ @todo Explain the details.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine not running or paused.
+ </result>
+ </desc>
+ <param name="hostname" type="wstring" dir="in">
+ <desc>The name or IP of the host to teleport to.</desc>
+ </param>
+ <param name="tcpport" type="unsigned long" dir="in">
+ <desc>The TCP port to connect to (1..65535).</desc>
+ </param>
+ <param name="password" type="wstring" dir="in">
+ <desc>The password.</desc>
+ </param>
+ <param name="maxDowntime" type="unsigned long" dir="in">
+ <desc>
+ The maximum allowed downtime given as milliseconds. 0 is not a valid
+ value. Recommended value: 250 ms.
+
+ The higher the value is, the greater the chance for a successful
+ teleportation. A small value may easily result in the teleportation
+ process taking hours and eventually fail.
+
+ <note>
+ The current implementation treats this a guideline, not as an
+ absolute rule.
+ </note>
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="addEncryptionPassword">
+ <rest request="post" path="/vms/{vmid}/console/methods/"/>
+ <desc>
+ Adds a password used for encryption/decryption.
+
+ <result name="VBOX_E_PASSWORD_INCORRECT">
+ The password provided wasn't correct for at least one disk using the provided
+ ID.
+ </result>
+ </desc>
+ <param name="id" type="wstring" dir="in">
+ <desc>
+ The identifier used for the password. Must match the identifier
+ used when the encrypted medium was created.
+ </desc>
+ </param>
+ <param name="password" type="wstring" dir="in">
+ <desc>The password.</desc>
+ </param>
+ <param name="clearOnSuspend" type="boolean" dir="in">
+ <desc>
+ Flag whether to clear the password on VM suspend (due to a suspending host
+ for example). The password must be supplied again before the VM can resume.
+ </desc>
+ </param>
+ </method>
+
+ <method name="addEncryptionPasswords">
+ <rest request="post" path="/vms/{vmid}/console/methods/"/>
+ <desc>
+ Adds a password used for encryption/decryption.
+
+ <result name="VBOX_E_PASSWORD_INCORRECT">
+ The password provided wasn't correct for at least one disk using the provided
+ ID.
+ </result>
+ </desc>
+ <param name="ids" type="wstring" dir="in" safearray="yes">
+ <desc>
+ List of identifiers for the passwords. Must match the identifier
+ used when the encrypted medium was created.
+ </desc>
+ </param>
+ <param name="passwords" type="wstring" dir="in" safearray="yes">
+ <desc>List of passwords.</desc>
+ </param>
+ <param name="clearOnSuspend" type="boolean" dir="in">
+ <desc>
+ Flag whether to clear the given passwords on VM suspend (due to a suspending host
+ for example). The passwords must be supplied again before the VM can resume.
+ </desc>
+ </param>
+ </method>
+
+ <method name="removeEncryptionPassword">
+ <rest request="post" path="/vms/{vmid}/console/methods/"/>
+ <desc>
+ Removes a password used for hard disk encryption/decryption from
+ the running VM. As soon as the medium requiring this password
+ is accessed the VM is paused with an error and the password must be
+ provided again.
+ </desc>
+ <param name="id" type="wstring" dir="in">
+ <desc>
+ The identifier used for the password. Must match the identifier
+ used when the encrypted medium was created.
+ </desc>
+ </param>
+ </method>
+
+ <method name="clearAllEncryptionPasswords">
+ <rest request="post" path="/vms/{vmid}/console/methods/"/>
+ <desc>Clears all provided supplied encryption passwords.</desc>
+ </method>
+ </interface>
+
+ <!--
+ // IHost
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="HostNetworkInterfaceMediumType"
+ uuid="1aa54aaf-2497-45a2-bfb1-8eb225e93d5b"
+ >
+ <!-- Must match NETIFTYPE in netif.h exactly. -->
+ <desc>
+ Type of encapsulation. Ethernet encapsulation includes both wired and
+ wireless Ethernet connections.
+ <see><link to="IHostNetworkInterface"/></see>
+ </desc>
+
+ <const name="Unknown" value="0">
+ <desc>
+ The type of interface cannot be determined.
+ </desc>
+ </const>
+ <const name="Ethernet" value="1">
+ <desc>
+ Ethernet frame encapsulation.
+ </desc>
+ </const>
+ <const name="PPP" value="2">
+ <desc>
+ Point-to-point protocol encapsulation.
+ </desc>
+ </const>
+ <const name="SLIP" value="3">
+ <desc>
+ Serial line IP encapsulation.
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="HostNetworkInterfaceStatus"
+ uuid="CC474A69-2710-434B-8D99-C38E5D5A6F41"
+ >
+ <!-- Must match NETIFSTATUS in netif.h exactly. -->
+ <desc>
+ Current status of the interface.
+ <see><link to="IHostNetworkInterface"/></see>
+ </desc>
+
+ <const name="Unknown" value="0">
+ <desc>
+ The state of interface cannot be determined.
+ </desc>
+ </const>
+ <const name="Up" value="1">
+ <desc>
+ The interface is fully operational.
+ </desc>
+ </const>
+ <const name="Down" value="2">
+ <desc>
+ The interface is not functioning.
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="HostNetworkInterfaceType"
+ uuid="67431b00-9946-48a2-bc02-b25c5919f4f3"
+ >
+ <desc>
+ Network interface type.
+ </desc>
+ <const name="Bridged" value="1"/>
+ <const name="HostOnly" value="2"/>
+ </enum>
+
+ <interface
+ name="IHostNetworkInterface" extends="$unknown"
+ uuid="455f8c45-44a0-a470-ba20-27890b96dba9"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="2" reservedAttributes="4"
+ >
+ <desc>
+ Represents one of host's network interfaces. IP V6 address and network
+ mask are strings of 32 hexadecimal digits grouped by four. Groups are
+ separated by colons.
+ For example, fe80:0000:0000:0000:021e:c2ff:fed2:b030.
+ </desc>
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>Returns the host network interface name.</desc>
+ </attribute>
+
+ <attribute name="shortName" type="wstring" readonly="yes">
+ <desc>Returns the host network interface short name.</desc>
+ </attribute>
+
+ <attribute name="id" type="uuid" mod="string" readonly="yes">
+ <desc>Returns the interface UUID.</desc>
+ </attribute>
+
+ <attribute name="networkName" type="wstring" readonly="yes">
+ <desc>Returns the name of a virtual network the interface gets attached to.</desc>
+ </attribute>
+
+ <attribute name="DHCPEnabled" type="boolean" readonly="yes">
+ <desc>Specifies whether the DHCP is enabled for the interface.</desc>
+ </attribute>
+
+ <attribute name="IPAddress" type="wstring" readonly="yes">
+ <desc>Returns the IP V4 address of the interface.</desc>
+ </attribute>
+
+ <attribute name="networkMask" type="wstring" readonly="yes">
+ <desc>Returns the network mask of the interface.</desc>
+ </attribute>
+
+ <attribute name="IPV6Supported" type="boolean" readonly="yes">
+ <desc>Specifies whether the IP V6 is supported/enabled for the interface.</desc>
+ </attribute>
+
+ <attribute name="IPV6Address" type="wstring" readonly="yes">
+ <desc>Returns the IP V6 address of the interface.</desc>
+ </attribute>
+
+ <attribute name="IPV6NetworkMaskPrefixLength" type="unsigned long" readonly="yes">
+ <desc>Returns the length IP V6 network mask prefix of the interface.</desc>
+ </attribute>
+
+ <attribute name="hardwareAddress" type="wstring" readonly="yes">
+ <desc>Returns the hardware address. For Ethernet it is MAC address.</desc>
+ </attribute>
+
+ <attribute name="mediumType" type="HostNetworkInterfaceMediumType" readonly="yes">
+ <desc>Type of protocol encapsulation used.</desc>
+ </attribute>
+
+ <attribute name="status" type="HostNetworkInterfaceStatus" readonly="yes">
+ <desc>Status of the interface.</desc>
+ </attribute>
+
+ <attribute name="interfaceType" type="HostNetworkInterfaceType" readonly="yes">
+ <desc>specifies the host interface type.</desc>
+ </attribute>
+
+ <attribute name="wireless" type="boolean" readonly="yes">
+ <desc>Specifies whether the interface is wireless.</desc>
+ </attribute>
+
+ <method name="enableStaticIPConfig">
+ <desc>sets and enables the static IP V4 configuration for the given interface.</desc>
+ <param name="IPAddress" type="wstring" dir="in">
+ <desc>
+ IP address.
+ </desc>
+ </param>
+ <param name="networkMask" type="wstring" dir="in">
+ <desc>
+ network mask.
+ </desc>
+ </param>
+ </method>
+
+ <method name="enableStaticIPConfigV6">
+ <desc>sets and enables the static IP V6 configuration for the given interface.</desc>
+ <param name="IPV6Address" type="wstring" dir="in">
+ <desc>
+ IP address.
+ </desc>
+ </param>
+ <param name="IPV6NetworkMaskPrefixLength" type="unsigned long" dir="in">
+ <desc>
+ network mask.
+ </desc>
+ </param>
+ </method>
+
+ <method name="enableDynamicIPConfig">
+ <desc>enables the dynamic IP configuration.</desc>
+ </method>
+
+ <method name="DHCPRediscover">
+ <desc>refreshes the IP configuration for DHCP-enabled interface.</desc>
+ </method>
+
+ </interface>
+
+ <interface
+ name="IHostVideoInputDevice" extends="$unknown"
+ uuid="e8c25d4d-ac97-4c16-b3e2-81bd8a57cc27"
+ wsmap="managed"
+ rest="managed"
+ reservedAttributes="4"
+ >
+ <desc>
+ Represents one of host's video capture devices, for example a webcam.
+ </desc>
+
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>User friendly name.</desc>
+ </attribute>
+
+ <attribute name="path" type="wstring" readonly="yes">
+ <desc>The host path of the device.</desc>
+ </attribute>
+
+ <attribute name="alias" type="wstring" readonly="yes">
+ <desc>An alias which can be used for <link to="IEmulatedUSB::webcamAttach"/></desc>
+ </attribute>
+
+ </interface>
+
+ <enum
+ name="UpdateChannel"
+ uuid="9f1562a5-e47a-496b-a818-66776f06ce40"
+ >
+ <const name="Invalid" value="0">
+ <desc>No channel specified. Do not use this.</desc>
+ </const>
+ <const name="Stable" value="1">
+ <desc>All stable releases (maintenance and minor releases within the same major release).</desc>
+ </const>
+ <const name="All" value="2">
+ <desc>All stable releases, including major versions.</desc>
+ </const>
+ <const name="WithBetas" value="3">
+ <desc>All stable and major releases, including beta versions.</desc>
+ </const>
+ <const name="WithTesting" value="4">
+ <desc>All stable, major and beta releases, including testing versions.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="UpdateSeverity"
+ uuid="359a5fee-8a06-4306-8068-2f2dd5cde06f"
+ >
+ <const name="Invalid" value="0">
+ <desc>No severity specified. Do not use this.</desc>
+ </const>
+ <const name="Critical" value="1">
+ <desc>Update contains critical patches.</desc>
+ </const>
+ <const name="Major" value="2">
+ <desc>Update contains a major version.</desc>
+ </const>
+ <const name="Minor" value="3">
+ <desc>Update contains a minor version.</desc>
+ </const>
+ <const name="Testing" value="4">
+ <desc>Update contains a testing version. Use with caution!</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="UpdateState"
+ uuid="6623e363-c892-45f8-80cb-4e8ffd9b4e60"
+ >
+ <const name="Invalid" value="0">
+ <desc>Invalid / not set update state.</desc>
+ </const>
+ <const name="Available" value="1">
+ <desc>An uppdate is available.</desc>
+ </const>
+ <const name="NotAvailable" value="2">
+ <desc>No update available.</desc>
+ </const>
+ <const name="Downloading" value="3">
+ <desc>Update is being downloaded currently.</desc>
+ </const>
+ <const name="Downloaded" value="4">
+ <desc>Update has been successfully downloaded.</desc>
+ </const>
+ <const name="Installing" value="5">
+ <desc>Update is being installed currently.</desc>
+ </const>
+ <const name="Installed" value="6">
+ <desc>Update has been successfully installed.</desc>
+ </const>
+ <const name="UserInteraction" value="7">
+ <desc>Update requires user interaction to continue.</desc>
+ </const>
+ <const name="Canceled" value="8">
+ <desc>Update has been canceled.</desc>
+ </const>
+ <const name="Maintenance" value="9">
+ <desc>Update service currently is in maintenance mode.</desc>
+ </const>
+ <const name="Error" value="10">
+ <desc>An error occurred while updating.</desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IUpdateAgent" extends="$unknown"
+ uuid="c4b1b5f4-8cdf-4923-9ef6-b92476a84109"
+ wsmap="managed"
+ reservedMethods="2" reservedAttributes="4"
+ >
+
+ <desc>
+ Abstract parent interface for handling updateable software components.
+ </desc>
+
+ <method name="checkFor">
+ <!-- Initially named just "check", but older xcode versions on the Mac have trouble naming interface
+ functions like this and thus failing to build, sigh. -->
+ <desc>
+ Checks for an update.
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="download">
+ <desc>
+ Downloads the update.
+ </desc>
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Downloading update not supported.
+ </result>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="install">
+ <desc>
+ Installs the update.
+ </desc>
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Installing update not supported.
+ </result>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="rollback">
+ <desc>
+ Rolls back installing the update.
+ </desc>
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Rolling back update not supported.
+ </result>
+ </method>
+
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>
+ Name of the update component.
+ </desc>
+ </attribute>
+
+ <attribute name="eventSource" type="IEventSource" readonly="yes">
+ <desc>
+ Event source for update agent events.
+ </desc>
+ </attribute>
+
+ <attribute name="order" type="unsigned long" readonly="yes">
+ <desc>
+ Order hint the update component needs to run at, in conjunction with other update components.
+ </desc>
+ <result name="0">
+ No order preferred / disabled.
+ </result>
+ <note>
+ Lower numbers mean higher priority. 0 means no order or disabled.
+ </note>
+ </attribute>
+
+ <attribute name="dependsOn" type="wstring" readonly="yes" safearray="yes">
+ <desc>
+ Array of other update component names this component depends on before being able to get installed.
+ </desc>
+ <note>
+ Ordered entries, highest priority first. No dependencies when array is empty.
+ Dependency entries also can contain a minimum version number after the update component name, separated by an "@",
+ e.g. "Guest Additions@7.1.0_BETA2".
+ </note>
+ </attribute>
+
+ <attribute name="version" type="wstring" readonly="yes">
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Result not available yet.
+ </result>
+ <desc>
+ Version the update contains.
+ </desc>
+ </attribute>
+
+ <attribute name="downloadUrl" type="wstring" readonly="yes">
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Result not available yet.
+ </result>
+ <desc>
+ Download URL of the update.
+ </desc>
+ </attribute>
+
+ <attribute name="webUrl" type="wstring" readonly="yes">
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Result not available yet.
+ </result>
+ <desc>
+ Web URL of the update.
+ </desc>
+ </attribute>
+
+ <attribute name="releaseNotes" type="wstring" readonly="yes">
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Result not available yet.
+ </result>
+ <desc>
+ Release notes of the update.
+ </desc>
+ </attribute>
+
+ <attribute name="enabled" type="boolean" readonly="no">
+ <desc>
+ Enables or disables the update component.
+ </desc>
+ </attribute>
+
+ <attribute name="hidden" type="boolean" readonly="yes">
+ <desc>
+ Whether the update component shall be hidden from the user or not.
+ </desc>
+ </attribute>
+
+ <attribute name="state" type="UpdateState" readonly="yes">
+ <desc>
+ Returns the current update state.
+ </desc>
+ </attribute>
+
+ <attribute name="checkFrequency" type="unsigned long" readonly="no">
+ <desc>
+ The update check frequency (in seconds).
+ </desc>
+ </attribute>
+
+ <attribute name="channel" type="UpdateChannel" readonly="no">
+ <desc>
+ Update channel to use for checking for updates.
+ </desc>
+ </attribute>
+
+ <attribute name="repositoryURL" type="wstring" readonly="no">
+ <desc>
+ Update repository URL to use for retrieving the update.
+ </desc>
+ <note>
+ Only repositories with the https:// URL scheme are allowed.
+ </note>
+ </attribute>
+
+ <attribute name="lastCheckDate" type="wstring" readonly="yes">
+ <desc>
+ Date of last update check.
+ </desc>
+ <note>
+ In ISO 8601 format (e.g. 2020-05-11T21:13:39.348416000Z).
+ </note>
+ </attribute>
+
+ <attribute name="checkCount" type="unsigned long" readonly="yes">
+ <desc>
+ How many times the update check has happened already.
+ </desc>
+ </attribute>
+
+ <attribute name="isCheckNeeded" type="boolean" readonly="yes">
+ <desc>
+ Returns @c TRUE if an update check is needed, or @c FALSE if not.
+
+ <note>Compares the system's current date with the last
+ update check date and currently set check frequency.</note>
+ </desc>
+ </attribute>
+
+ <attribute name="supportedChannels" type="UpdateChannel" safearray="yes" readonly="yes">
+ <desc>
+ Returns a safe array of all supported update channels this agents offers.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IHostUpdateAgent" extends="IUpdateAgent"
+ uuid="d782dba7-cd4f-4ace-951a-58321c23e258"
+ wsmap="managed"
+ reservedMethods="2" reservedAttributes="4"
+ >
+ <desc>
+ Implementation of the <link to="IUpdateAgent" /> object
+ for VirtualBox host updates.
+ </desc>
+ <note>
+ If no proxy is explicitly set, the proxy settings from <link to="ISystemProperties" /> will be used.
+ </note>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="IHostDrivePartition" extends="$unknown"
+ uuid="4f529a14-ace3-407c-9c49-066e8e8027f0"
+ wsmap="struct"
+ rest="managed"
+ >
+ <desc>
+ The IHostDrivePartition interface represents the partition of the host drive.
+ To enumerate all available drives partitions in the host, use the
+ <link to="IHost::hostDrives"/> attribute.
+ </desc>
+
+ <attribute name="number" type="unsigned long" readonly="yes">
+ <desc>
+ The number of the partition. Represents the system number of the
+ partition, e.g. /dev/sdX in the linux, where X is the number
+ returned.
+ </desc>
+ </attribute>
+
+ <attribute name="size" type="long long" readonly="yes">
+ <desc>
+ The partition size in bytes.
+ </desc>
+ </attribute>
+
+ <attribute name="start" type="long long" readonly="yes">
+ <desc>
+ The start byte offset of this partition in bytes relative to the
+ beginning of the hard disk.
+ </desc>
+ </attribute>
+
+ <attribute name="type" type="PartitionType" readonly="yes">
+ <desc>
+ A translation of <link to="IHostDrivePartition::typeMBR"/> and
+ <link to="IHostDrivePartition::typeUuid"/> when possible, otherwise
+ set to <link to="PartitionType_Unknown" />.
+ </desc>
+ </attribute>
+
+ <attribute name="active" type="boolean" readonly="yes">
+ <desc>
+ The partition is bootable when TRUE.
+ </desc>
+ </attribute>
+
+ <!-- MBR: -->
+
+ <attribute name="typeMBR" type="unsigned long" readonly="yes">
+ <desc>
+ The raw MBR partition type, 0 for non-MBR disks.
+ </desc>
+ </attribute>
+
+ <attribute name="startCylinder" type="unsigned long" readonly="yes">
+ <desc>
+ The cylinder (0..1023) of the first sector in the partition on an MBR disk, zero for not an MBR disk.
+ </desc>
+ </attribute>
+
+ <attribute name="startHead" type="unsigned long" readonly="yes">
+ <desc>
+ The head (0..255) of the first sector in the partition on an MBR disk, zero for not an MBR disk.
+ </desc>
+ </attribute>
+
+ <attribute name="startSector" type="unsigned long" readonly="yes">
+ <desc>
+ The sector (0..63) of the first sector in the partition on an MBR disk, zero for not an MBR disk.
+ </desc>
+ </attribute>
+
+ <attribute name="endCylinder" type="unsigned long" readonly="yes">
+ <desc>
+ The cylinder (0..1023) of the last sector (inclusive) in the partition on an MBR disk, zero for not an MBR disk.
+ </desc>
+ </attribute>
+
+ <attribute name="endHead" type="unsigned long" readonly="yes">
+ <desc>
+ The head (0..255) of the last sector (inclusive) in the partition on an MBR disk, zero for not an MBR disk.
+ </desc>
+ </attribute>
+
+ <attribute name="endSector" type="unsigned long" readonly="yes">
+ <desc>
+ The sector (1..63) of the last sector (inclusive) in the partition on an MBR disk, zero for not an MBR disk.
+ </desc>
+ </attribute>
+
+ <!-- GPT: -->
+ <attribute name="typeUuid" type="uuid" mod="string" readonly="yes">
+ <!-- @todo r=bird: Not sure about the casing here. typeUUID Klaus? -->
+ <desc>
+ The partition type when GUID partitioning scheme is used, NULL UUID value for not a GPT disks.
+ </desc>
+ </attribute>
+
+ <attribute name="uuid" type="uuid" mod="string" readonly="yes">
+ <desc>
+ The GUID of the partition when GUID partitioning scheme is used, NULL UUID value for not a GPT disks.
+ </desc>
+ </attribute>
+
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>
+ The name of the partition if GPT partitioning is used, empty if not a GPT disk.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IHostDrive" extends="$unknown"
+ uuid="70e2e0c3-332c-4d72-b822-2db16e2cb31b"
+ wsmap="managed"
+ rest="managed"
+ >
+ <desc>
+ The IHostDrive interface represents the drive of the physical machine.
+ It is not a complete medium description and, therefore, it is not IMedium
+ based. The interface is used to get information about a host drive and
+ its partitioning.
+ <note>
+ The object operates in limited mode if the user cannot open the drive
+ and parse the partition table. In limited mode on the
+ <link to="IHostDrive::drivePath" /> and <link to="IHostDrive::model" />
+ attributes can be accessed, the rest will fail with E_ACCESSDENIED.
+ </note>
+ </desc>
+
+ <attribute name="drivePath" type="wstring" readonly="yes" wrap-hint-server="limitedcaller">
+ <desc>
+ The path of the drive. Platform dependent.
+ </desc>
+ </attribute>
+
+ <attribute name="partitioningType" type="PartitioningType" readonly="yes">
+ <desc>
+ The scheme of the partitions the disk has.
+ </desc>
+ </attribute>
+
+ <attribute name="uuid" type="uuid" mod="string" readonly="yes">
+ <desc>
+ The GUID of the disk.
+ </desc>
+ </attribute>
+
+ <attribute name="sectorSize" type="unsigned long" readonly="yes">
+ <desc>
+ The size of the sector in bytes.
+ </desc>
+ </attribute>
+
+ <attribute name="size" type="long long" readonly="yes">
+ <desc>
+ The size of the disk in bytes.
+ </desc>
+ </attribute>
+
+ <attribute name="model" type="wstring" readonly="yes" wrap-hint-server="limitedcaller">
+ <desc>
+ The model string of the drive if available.
+ </desc>
+ </attribute>
+
+ <attribute name="partitions" type="IHostDrivePartition" readonly="yes" safearray="yes">
+ <desc>List of partitions available on the host drive.</desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IHost" extends="$unknown"
+ uuid="e54f6256-97a7-4947-8a78-10c013ddf4b8"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="6" reservedAttributes="12"
+ >
+ <desc>
+ The IHost interface represents the physical machine that this VirtualBox
+ installation runs on.
+
+ An object implementing this interface is returned by the
+ <link to="IVirtualBox::host" /> attribute. This interface contains
+ read-only information about the host's physical hardware (such as what
+ processors and disks are available, what the host operating system is,
+ and so on) and also allows for manipulating some of the host's hardware,
+ such as global USB device filters and host interface networking.
+
+ </desc>
+ <attribute name="DVDDrives" type="IMedium" readonly="yes" safearray="yes">
+ <desc>List of DVD drives available on the host.</desc>
+ </attribute>
+
+ <attribute name="floppyDrives" type="IMedium" readonly="yes" safearray="yes">
+ <desc>List of floppy drives available on the host.</desc>
+ </attribute>
+
+ <attribute name="audioDevices" type="IHostAudioDevice" readonly="yes" safearray="yes">
+ <desc>List of audio devices currently available on the host.
+ <result name="E_NOTIMPL">
+ This attribute is not implemented yet.
+ </result>
+ </desc>
+ </attribute>
+
+ <attribute name="USBDevices" type="IHostUSBDevice" readonly="yes" safearray="yes">
+ <desc>
+ List of USB devices currently attached to the host.
+ Once a new device is physically attached to the host computer,
+ it appears in this list and remains there until detached.
+
+ <note>
+ If USB functionality is not available in the given edition of
+ VirtualBox, this method will set the result code to @c E_NOTIMPL.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="USBDeviceFilters" type="IHostUSBDeviceFilter" readonly="yes" safearray="yes">
+ <desc>
+ List of USB device filters in action.
+ When a new device is physically attached to the host computer,
+ filters from this list are applied to it (in order they are stored
+ in the list). The first matched filter will determine the
+ <link to="IHostUSBDeviceFilter::action">action</link>
+ performed on the device.
+
+ Unless the device is ignored by these filters, filters of all
+ currently running virtual machines
+ (<link to="IUSBDeviceFilters::deviceFilters"/>) are applied to it.
+
+ <note>
+ If USB functionality is not available in the given edition of
+ VirtualBox, this method will set the result code to @c E_NOTIMPL.
+ </note>
+
+ <see><link to="IHostUSBDeviceFilter"/>,
+ <link to="USBDeviceState"/></see>
+ </desc>
+ </attribute>
+
+ <attribute name="networkInterfaces" type="IHostNetworkInterface" safearray="yes" readonly="yes">
+ <desc>List of host network interfaces currently defined on the host.</desc>
+ </attribute>
+
+ <attribute name="nameServers" type="wstring" safearray="yes" readonly="yes">
+ <desc> The list of nameservers registered in host's name resolving system.</desc>
+ </attribute>
+
+ <attribute name="domainName" type="wstring" readonly="yes">
+ <desc>Domain name used for name resolving.</desc>
+ </attribute>
+
+ <attribute name="searchStrings" type="wstring" safearray="yes" readonly="yes">
+ <desc>Search string registered for name resolving.</desc>
+ </attribute>
+
+ <attribute name="processorCount" type="unsigned long" readonly="yes">
+ <desc>Number of (logical) CPUs installed in the host system.</desc>
+ </attribute>
+
+ <attribute name="processorOnlineCount" type="unsigned long" readonly="yes">
+ <desc>Number of (logical) CPUs online in the host system.</desc>
+ </attribute>
+
+ <attribute name="processorCoreCount" type="unsigned long" readonly="yes">
+ <desc>Number of physical processor cores installed in the host system.</desc>
+ </attribute>
+
+ <attribute name="processorOnlineCoreCount" type="unsigned long" readonly="yes">
+ <desc>Number of physical processor cores online in the host system.</desc>
+ </attribute>
+
+ <attribute name="hostDrives" type="IHostDrive" readonly="yes" safearray="yes">
+ <desc>List of the host drive available to use in the VirtualBox.</desc>
+ </attribute>
+
+ <method name="getProcessorSpeed">
+ <desc>Query the (approximate) maximum speed of a specified host CPU in
+ Megahertz.
+ </desc>
+ <param name="cpuId" type="unsigned long" dir="in">
+ <desc>
+ Identifier of the CPU.
+ </desc>
+ </param>
+ <param name="speed" type="unsigned long" dir="return">
+ <desc>
+ Speed value. 0 is returned if value is not known or @a cpuId is
+ invalid.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getProcessorFeature">
+ <desc>Query whether a CPU feature is supported or not.</desc>
+ <param name="feature" type="ProcessorFeature" dir="in">
+ <desc>
+ CPU Feature identifier.
+ </desc>
+ </param>
+ <param name="supported" type="boolean" dir="return">
+ <desc>
+ Feature is supported or not.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getProcessorDescription">
+ <desc>Query the model string of a specified host CPU.
+ </desc>
+ <param name="cpuId" type="unsigned long" dir="in">
+ <desc>
+ Identifier of the CPU.
+ <note>
+ The current implementation might not necessarily return the
+ description for this exact CPU.
+ </note>
+ </desc>
+ </param>
+ <param name="description" type="wstring" dir="return">
+ <desc>
+ Model string. An empty string is returned if value is not known or
+ @a cpuId is invalid.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getProcessorCPUIDLeaf">
+ <desc>
+ Returns the CPU cpuid information for the specified leaf.
+ </desc>
+ <param name="cpuId" type="unsigned long" dir="in">
+ <desc>
+ Identifier of the CPU. The CPU most be online.
+ <note>
+ The current implementation might not necessarily return the
+ description for this exact CPU.
+ </note>
+ </desc>
+ </param>
+ <param name="leaf" type="unsigned long" dir="in">
+ <desc>
+ CPUID leaf index (eax).
+ </desc>
+ </param>
+ <param name="subLeaf" type="unsigned long" dir="in">
+ <desc>
+ CPUID leaf sub index (ecx). This currently only applies to cache
+ information on Intel CPUs. Use 0 if retrieving values for
+ <link to="IMachine::setCPUIDLeaf"/>.
+ </desc>
+ </param>
+ <param name="valEax" type="unsigned long" dir="out">
+ <desc>
+ CPUID leaf value for register eax.
+ </desc>
+ </param>
+ <param name="valEbx" type="unsigned long" dir="out">
+ <desc>
+ CPUID leaf value for register ebx.
+ </desc>
+ </param>
+ <param name="valEcx" type="unsigned long" dir="out">
+ <desc>
+ CPUID leaf value for register ecx.
+ </desc>
+ </param>
+ <param name="valEdx" type="unsigned long" dir="out">
+ <desc>
+ CPUID leaf value for register edx.
+ </desc>
+ </param>
+ </method>
+
+ <attribute name="memorySize" type="unsigned long" readonly="yes">
+ <desc>Amount of system memory in megabytes installed in the host system.</desc>
+ </attribute>
+
+ <attribute name="memoryAvailable" type="unsigned long" readonly="yes">
+ <desc>Available system memory in the host system.</desc>
+ </attribute>
+
+ <attribute name="operatingSystem" type="wstring" readonly="yes">
+ <desc>Name of the host system's operating system.</desc>
+ </attribute>
+
+ <attribute name="OSVersion" type="wstring" readonly="yes">
+ <desc>Host operating system's version string.</desc>
+ </attribute>
+
+ <attribute name="UTCTime" type="long long" readonly="yes">
+ <desc>Returns the current host time in milliseconds since 1970-01-01 UTC.</desc>
+ </attribute>
+
+ <attribute name="acceleration3DAvailable" type="boolean" readonly="yes">
+ <desc>Returns @c true when the host supports 3D hardware acceleration.</desc>
+ </attribute>
+
+ <method name="createHostOnlyNetworkInterface">
+ <desc>
+ Creates a new adapter for Host Only Networking.
+ <result name="E_INVALIDARG">
+ Host network interface @a name already exists.
+ </result>
+ </desc>
+ <param name="hostInterface" type="IHostNetworkInterface" dir="out">
+ <desc>
+ Created host interface object.
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="removeHostOnlyNetworkInterface">
+ <desc>
+ Removes the given Host Only Networking interface.
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ No host network interface matching @a id found.
+ </result>
+ </desc>
+ <param name="id" type="uuid" mod="string" dir="in">
+ <desc>
+ Adapter GUID.
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="createUSBDeviceFilter">
+ <desc>
+ Creates a new USB device filter. All attributes except
+ the filter name are set to empty (any match),
+ <i>active</i> is @c false (the filter is not active).
+
+ The created filter can be added to the list of filters using
+ <link to="#insertUSBDeviceFilter"/>.
+
+ <see><link to="#USBDeviceFilters"/></see>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>
+ Filter name. See <link to="IUSBDeviceFilter::name"/> for more information.
+ </desc>
+ </param>
+ <param name="filter" type="IHostUSBDeviceFilter" dir="return">
+ <desc>Created filter object.</desc>
+ </param>
+ </method>
+
+ <method name="insertUSBDeviceFilter">
+ <desc>
+ Inserts the given USB device to the specified position
+ in the list of filters.
+
+ Positions are numbered starting from @c 0. If the specified
+ position is equal to or greater than the number of elements in
+ the list, the filter is added at the end of the collection.
+
+ <note>
+ Duplicates are not allowed, so an attempt to insert a
+ filter already in the list is an error.
+ </note>
+ <note>
+ If USB functionality is not available in the given edition of
+ VirtualBox, this method will set the result code to @c E_NOTIMPL.
+ </note>
+
+ <see><link to="#USBDeviceFilters"/></see>
+
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ USB device filter is not created within this VirtualBox instance.
+ </result>
+ <result name="E_INVALIDARG">
+ USB device filter already in list.
+ </result>
+
+ </desc>
+ <param name="position" type="unsigned long" dir="in">
+ <desc>Position to insert the filter to.</desc>
+ </param>
+ <param name="filter" type="IHostUSBDeviceFilter" dir="in">
+ <desc>USB device filter to insert.</desc>
+ </param>
+ </method>
+
+ <method name="removeUSBDeviceFilter">
+ <desc>
+ Removes a USB device filter from the specified position in the
+ list of filters.
+
+ Positions are numbered starting from @c 0. Specifying a
+ position equal to or greater than the number of elements in
+ the list will produce an error.
+
+ <note>
+ If USB functionality is not available in the given edition of
+ VirtualBox, this method will set the result code to @c E_NOTIMPL.
+ </note>
+
+ <see><link to="#USBDeviceFilters"/></see>
+
+ <result name="E_INVALIDARG">
+ USB device filter list empty or invalid @a position.
+ </result>
+
+ </desc>
+ <param name="position" type="unsigned long" dir="in">
+ <desc>Position to remove the filter from.</desc>
+ </param>
+ </method>
+
+ <method name="findHostDVDDrive">
+ <desc>
+ Searches for a host DVD drive with the given @c name.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ Given @c name does not correspond to any host drive.
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the host drive to search for</desc>
+ </param>
+ <param name="drive" type="IMedium" dir="return">
+ <desc>Found host drive object</desc>
+ </param>
+ </method>
+
+ <method name="findHostFloppyDrive">
+ <desc>
+ Searches for a host floppy drive with the given @c name.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ Given @c name does not correspond to any host floppy drive.
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the host floppy drive to search for</desc>
+ </param>
+ <param name="drive" type="IMedium" dir="return">
+ <desc>Found host floppy drive object</desc>
+ </param>
+ </method>
+
+ <method name="findHostNetworkInterfaceByName">
+ <desc>
+ Searches through all host network interfaces for an interface with
+ the given @c name.
+ <note>
+ The method returns an error if the given @c name does not
+ correspond to any host network interface.
+ </note>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the host network interface to search for.</desc>
+ </param>
+ <param name="networkInterface" type="IHostNetworkInterface" dir="return">
+ <desc>Found host network interface object.</desc>
+ </param>
+ </method>
+ <method name="findHostNetworkInterfaceById">
+ <desc>
+ Searches through all host network interfaces for an interface with
+ the given GUID.
+ <note>
+ The method returns an error if the given GUID does not
+ correspond to any host network interface.
+ </note>
+ </desc>
+ <param name="id" type="uuid" mod="string" dir="in">
+ <desc>GUID of the host network interface to search for.</desc>
+ </param>
+ <param name="networkInterface" type="IHostNetworkInterface" dir="return">
+ <desc>Found host network interface object.</desc>
+ </param>
+ </method>
+ <method name="findHostNetworkInterfacesOfType">
+ <desc>
+ Searches through all host network interfaces and returns a list of interfaces of the specified type
+ </desc>
+ <param name="type" type="HostNetworkInterfaceType" dir="in">
+ <desc>type of the host network interfaces to search for.</desc>
+ </param>
+ <param name="networkInterfaces" type="IHostNetworkInterface" safearray="yes" dir="return">
+ <desc>Found host network interface objects.</desc>
+ </param>
+ </method>
+
+ <method name="findUSBDeviceById">
+ <desc>
+ Searches for a USB device with the given UUID.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ Given @c id does not correspond to any USB device.
+ </result>
+
+ <see><link to="IUSBDevice::id"/></see>
+ </desc>
+ <param name="id" type="uuid" mod="string" dir="in">
+ <desc>UUID of the USB device to search for.</desc>
+ </param>
+ <param name="device" type="IHostUSBDevice" dir="return">
+ <desc>Found USB device object.</desc>
+ </param>
+ </method>
+
+ <method name="findUSBDeviceByAddress">
+ <desc>
+ Searches for a USB device with the given host address.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ Given @c name does not correspond to any USB device.
+ </result>
+
+ <see><link to="IUSBDevice::address"/></see>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>
+ Address of the USB device (as assigned by the host) to
+ search for.
+ </desc>
+ </param>
+ <param name="device" type="IHostUSBDevice" dir="return">
+ <desc>Found USB device object.</desc>
+ </param>
+ </method>
+
+ <method name="generateMACAddress">
+ <desc>
+ Generates a valid Ethernet MAC address, 12 hexadecimal characters.
+ </desc>
+ <param name="address" type="wstring" dir="return">
+ <desc>New Ethernet MAC address.</desc>
+ </param>
+ </method>
+
+ <attribute name="videoInputDevices" type="IHostVideoInputDevice" safearray="yes" readonly="yes">
+ <desc>List of currently available host video capture devices.</desc>
+ </attribute>
+
+ <method name="addUSBDeviceSource">
+ <desc>
+ Adds a new USB device source.
+ </desc>
+ <param name="backend" type="wstring" dir="in">
+ <desc>The backend to use as the new device source.</desc>
+ </param>
+ <param name="id" type="wstring" dir="in">
+ <desc>Unique ID to identify the source.</desc>
+ </param>
+ <param name="address" type="wstring" dir="in">
+ <desc>
+ Address to use, the format is dependent on the backend.
+ For USB/IP backends for example the notation is host[:port].
+ </desc>
+ </param>
+ <param name="propertyNames" type="wstring" safearray="yes" dir="in">
+ <desc>Array of property names for more detailed configuration. Not used at the moment.</desc>
+ </param>
+ <param name="propertyValues" type="wstring" safearray="yes" dir="in">
+ <desc>Array of property values for more detailed configuration. Not used at the moment.</desc>
+ </param>
+ </method>
+
+ <method name="removeUSBDeviceSource">
+ <desc>
+ Removes a previously added USB device source.
+ </desc>
+ <param name="id" type="wstring" dir="in">
+ <desc>The identifier used when the source was added.</desc>
+ </param>
+ </method>
+
+ <attribute name="updateHost" type="IUpdateAgent" readonly="yes">
+ <desc>Checks for new VirtualBox host versions.</desc>
+ </attribute>
+
+ <attribute name="updateExtPack" type="IUpdateAgent" readonly="yes">
+ <desc>Checks for new VirtualBox Extension Pack versions.</desc>
+ </attribute>
+
+ <attribute name="updateGuestAdditions" type="IUpdateAgent" readonly="yes">
+ <desc>Checks for new Guest Additions versions.</desc>
+ </attribute>
+
+ </interface>
+
+ <!--
+ // ICPUProfile
+ /////////////////////////////////////////////////////////////////////////
+ -->
+ <interface
+ name="ICPUProfile"
+ extends="$unknown"
+ uuid="b7fda727-7a08-46ee-8dd8-f8d7308b519c"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>CPU profile. Immutable.</desc>
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>The name.</desc>
+ </attribute>
+ <attribute name="fullName" type="wstring" readonly="yes">
+ <desc>The full name.</desc>
+ </attribute>
+ <attribute name="architecture" type="CPUArchitecture" readonly="yes">
+ <desc>The CPU architecture.</desc>
+ </attribute>
+ </interface>
+
+ <!--
+ // ISystemProperties
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum name="ProxyMode" uuid="885264b3-b517-40fc-ce46-36e3bae895a4">
+ <desc> Proxy setting: System (default), NoProxy and Manual. <link to="ISystemProperties::proxyMode"/></desc>
+ <const name="System" value="0">
+ <desc>Use the system proxy settings as far as possible.</desc>
+ </const>
+ <const name="NoProxy" value="1">
+ <desc>Direct connection to the Internet.</desc>
+ </const>
+ <const name="Manual" value="2">
+ <desc>Use the manual proxy from <link to="ISystemProperties::proxyURL"/>.</desc>
+ </const>
+ </enum>
+
+ <interface
+ name="ISystemProperties"
+ extends="$unknown"
+ uuid="aac6c7cb-a371-4c58-ab51-0616896b2f2c"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="16"
+ >
+ <desc>
+ The ISystemProperties interface represents global properties of the given
+ VirtualBox installation.
+
+ These properties define limits and default values for various attributes
+ and parameters. Most of the properties are read-only, but some can be
+ changed by a user.
+ </desc>
+
+ <attribute name="minGuestRAM" type="unsigned long" readonly="yes">
+ <desc>Minimum guest system memory in Megabytes.</desc>
+ </attribute>
+
+ <attribute name="maxGuestRAM" type="unsigned long" readonly="yes">
+ <desc>Maximum guest system memory in Megabytes.</desc>
+ </attribute>
+
+ <attribute name="minGuestVRAM" type="unsigned long" readonly="yes">
+ <desc>Minimum guest video memory in Megabytes.</desc>
+ </attribute>
+
+ <attribute name="maxGuestVRAM" type="unsigned long" readonly="yes">
+ <desc>Maximum guest video memory in Megabytes.</desc>
+ </attribute>
+
+ <attribute name="minGuestCPUCount" type="unsigned long" readonly="yes">
+ <desc>Minimum CPU count.</desc>
+ </attribute>
+
+ <attribute name="maxGuestCPUCount" type="unsigned long" readonly="yes">
+ <desc>Maximum CPU count.</desc>
+ </attribute>
+
+ <attribute name="maxGuestMonitors" type="unsigned long" readonly="yes">
+ <desc>Maximum of monitors which could be connected.</desc>
+ </attribute>
+
+ <attribute name="infoVDSize" type="long long" readonly="yes">
+ <desc>Maximum size of a virtual disk image in bytes. Informational value,
+ does not reflect the limits of any virtual disk image format.</desc>
+ </attribute>
+
+ <attribute name="serialPortCount" type="unsigned long" readonly="yes">
+ <desc>
+ Maximum number of serial ports associated with every
+ <link to="IMachine"/> instance.
+ </desc>
+ </attribute>
+
+ <attribute name="parallelPortCount" type="unsigned long" readonly="yes">
+ <desc>
+ Maximum number of parallel ports associated with every
+ <link to="IMachine"/> instance.
+ </desc>
+ </attribute>
+
+ <attribute name="maxBootPosition" type="unsigned long" readonly="yes">
+ <desc>
+ Maximum device position in the boot order. This value corresponds
+ to the total number of devices a machine can boot from, to make it
+ possible to include all possible devices to the boot list.
+ <see><link to="IMachine::setBootOrder"/></see>
+ </desc>
+ </attribute>
+
+ <attribute name="rawModeSupported" type="boolean" readonly="yes">
+ <desc>
+ Indicates whether VirtualBox was built with raw-mode support.
+
+ When this reads as False, the <link to="HWVirtExPropertyType_Enabled"/>
+ setting will be ignored and assumed to be True.
+ </desc>
+ </attribute>
+
+ <attribute name="exclusiveHwVirt" type="boolean">
+ <desc>
+ Exclusive use of hardware virtualization by VirtualBox. When enabled,
+ VirtualBox assumes it can obtain full and exclusive access to the VT-x
+ or AMD-V feature of the host. To share hardware virtualization with
+ other hypervisors, this property must be disabled.
+
+ <note>This is ignored on OS X, the kernel mediates hardware
+ access there.</note>
+ </desc>
+ </attribute>
+
+ <attribute name="defaultMachineFolder" type="wstring">
+ <desc>
+ Full path to the default directory used to create new or open
+ existing machines when a machine settings file name contains no
+ path.
+
+ Starting with VirtualBox 4.0, by default, this attribute contains
+ the full path of folder named "VirtualBox VMs" in the user's
+ home directory, which depends on the host platform.
+
+ When setting this attribute, a full path must be specified.
+ Setting this property to @c null or an empty string or the
+ special value "Machines" (for compatibility reasons) will restore
+ that default value.
+
+ If the folder specified herein does not exist, it will be created
+ automatically as needed.
+
+ <see>
+ <link to="IVirtualBox::createMachine"/>,
+ <link to="IVirtualBox::openMachine"/>
+ </see>
+ </desc>
+ </attribute>
+
+ <attribute name="loggingLevel" type="wstring">
+ <desc>
+ Specifies the logging level in current use by VirtualBox.
+ </desc>
+ </attribute>
+
+ <attribute name="mediumFormats" type="IMediumFormat" safearray="yes" readonly="yes">
+ <desc>
+ List of all medium storage formats supported by this VirtualBox
+ installation.
+
+ Keep in mind that the medium format identifier
+ (<link to="IMediumFormat::id"/>) used in other API calls like
+ <link to="IVirtualBox::createMedium"/> to refer to a particular
+ medium format is a case-insensitive string. This means that, for
+ example, all of the following strings:
+ <pre>
+ "VDI"
+ "vdi"
+ "VdI"</pre>
+ refer to the same medium format.
+
+ Note that the virtual medium framework is backend-based, therefore
+ the list of supported formats depends on what backends are currently
+ installed.
+
+ <see><link to="IMediumFormat"/></see>
+ </desc>
+ </attribute>
+
+ <attribute name="defaultHardDiskFormat" type="wstring">
+ <desc>
+ Identifier of the default medium format used by VirtualBox.
+
+ The medium format set by this attribute is used by VirtualBox
+ when the medium format was not specified explicitly. One example is
+ <link to="IVirtualBox::createMedium"/> with the empty
+ format argument. A more complex example is implicit creation of
+ differencing media when taking a snapshot of a virtual machine:
+ this operation will try to use a format of the parent medium first
+ and if this format does not support differencing media the default
+ format specified by this argument will be used.
+
+ The list of supported medium formats may be obtained by the
+ <link to="#mediumFormats"/> call. Note that the default medium
+ format must have a capability to create differencing media;
+ otherwise operations that create media implicitly may fail
+ unexpectedly.
+
+ The initial value of this property is <tt>"VDI"</tt> in the current
+ version of the VirtualBox product, but may change in the future.
+
+ <note>
+ Setting this property to @c null or empty string will restore the
+ initial value.
+ </note>
+
+ <see>
+ <link to="#mediumFormats"/>,
+ <link to="IMediumFormat::id"/>,
+ <link to="IVirtualBox::createMedium"/>
+ </see>
+ </desc>
+ </attribute>
+
+ <attribute name="freeDiskSpaceWarning" type="long long">
+ <desc>Issue a warning if the free disk space is below (or in some disk
+ intensive operation is expected to go below) the given size in
+ bytes.</desc>
+ </attribute>
+
+ <attribute name="freeDiskSpacePercentWarning" type="unsigned long">
+ <desc>Issue a warning if the free disk space is below (or in some disk
+ intensive operation is expected to go below) the given percentage.</desc>
+ </attribute>
+
+ <attribute name="freeDiskSpaceError" type="long long">
+ <desc>Issue an error if the free disk space is below (or in some disk
+ intensive operation is expected to go below) the given size in
+ bytes.</desc>
+ </attribute>
+
+ <attribute name="freeDiskSpacePercentError" type="unsigned long">
+ <desc>Issue an error if the free disk space is below (or in some disk
+ intensive operation is expected to go below) the given percentage.</desc>
+ </attribute>
+
+ <attribute name="VRDEAuthLibrary" type="wstring">
+ <desc>
+ Library that provides authentication for Remote Desktop clients. The library
+ is used if a virtual machine's authentication type is set to "external"
+ in the VM RemoteDisplay configuration.
+
+ The system library extension (".DLL" or ".so") must be omitted.
+ A full path can be specified; if not, then the library must reside on the
+ system's default library path.
+
+ The default value of this property is <tt>"VBoxAuth"</tt>. There is a library
+ of that name in one of the default VirtualBox library directories.
+
+ For details about VirtualBox authentication libraries and how to implement
+ them, please refer to the VirtualBox manual.
+
+ <note>
+ Setting this property to @c null or empty string will restore the
+ initial value.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="webServiceAuthLibrary" type="wstring">
+ <desc>
+ Library that provides authentication for webservice clients. The library
+ is used if a virtual machine's authentication type is set to "external"
+ in the VM RemoteDisplay configuration and will be called from
+ within the <link to="IWebsessionManager::logon" /> implementation.
+
+ As opposed to <link to="ISystemProperties::VRDEAuthLibrary" />,
+ there is no per-VM setting for this, as the webservice is a global
+ resource (if it is running). Only for this setting (for the webservice),
+ setting this value to a literal <tt>"null"</tt> string disables authentication,
+ meaning that <link to="IWebsessionManager::logon" /> will always succeed,
+ no matter what user name and password are supplied.
+
+ The initial value of this property is <tt>"VBoxAuth"</tt>,
+ meaning that the webservice will use the same authentication
+ library that is used by default for VRDE (again, see
+ <link to="ISystemProperties::VRDEAuthLibrary" />).
+ The format and calling convention of authentication libraries
+ is the same for the webservice as it is for VRDE.
+
+ <note>
+ Setting this property to @c null or empty string will restore the
+ initial value.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="defaultVRDEExtPack" type="wstring">
+ <desc>
+ The name of the extension pack providing the default VRDE.
+
+ This attribute is for choosing between multiple extension packs
+ providing VRDE. If only one is installed, it will automatically be the
+ default one. The attribute value can be empty if no VRDE extension
+ pack is installed.
+
+ For details about VirtualBox Remote Desktop Extension and how to
+ implement one, please refer to the VirtualBox SDK.
+ </desc>
+ </attribute>
+
+ <attribute name="defaultCryptoExtPack" type="wstring">
+ <desc>
+ The name of the extension pack providing the default cryptographic support
+ for full VM encryption.
+
+ This attribute is for choosing between multiple extension packs
+ providing cryptographic support. If only one is installed, it will automatically be the
+ default one. The attribute value can be empty if no cryptographic extension
+ pack is installed.
+ </desc>
+ </attribute>
+
+ <attribute name="logHistoryCount" type="unsigned long">
+ <desc>
+ This value specifies how many old release log files are kept.
+ </desc>
+ </attribute>
+
+ <attribute name="defaultAudioDriver" type="AudioDriverType" readonly="yes">
+ <desc>This value hold the default audio driver for the current
+ system.</desc>
+ </attribute>
+
+ <attribute name="autostartDatabasePath" type="wstring">
+ <desc>
+ The path to the autostart database. Depending on the host this might
+ be a filesystem path or something else.
+ </desc>
+ </attribute>
+
+ <attribute name="defaultAdditionsISO" type="wstring">
+ <desc>
+ The path to the default Guest Additions ISO image. Can be empty if
+ the location is not known in this installation.
+ </desc>
+ </attribute>
+
+ <attribute name="defaultFrontend" type="wstring">
+ <desc>
+ Selects which VM frontend should be used by default when launching
+ a VM through the <link to="IMachine::launchVMProcess" /> method.
+ Empty or @c null strings do not define a particular default, it is up
+ to <link to="IMachine::launchVMProcess" /> to select one. See the
+ description of <link to="IMachine::launchVMProcess" /> for the valid
+ frontend types.
+
+ This global setting is overridden by the per-VM attribute
+ <link to="IMachine::defaultFrontend" /> or a frontend type
+ passed to <link to="IMachine::launchVMProcess" />.
+ </desc>
+ </attribute>
+
+ <attribute name="screenShotFormats" type="BitmapFormat" safearray="yes" readonly="yes">
+ <desc>
+ Supported bitmap formats which can be used with takeScreenShot
+ and takeScreenShotToArray methods.
+ </desc>
+ </attribute>
+
+ <attribute name="proxyMode" type="ProxyMode">
+ <desc> The proxy mode setting: System, NoProxy or Manual.</desc>
+ </attribute>
+
+ <attribute name="proxyURL" type="wstring">
+ <desc>
+ Proxy server URL for the <link to="ProxyMode_Manual" /> proxy mode.
+
+ The format is: [{type}"://"][{userid}[:{password}]@]{server}[":"{port}]
+
+ Valid types are: http (default), https, socks4, socks4a, socks5, socks5h and direct.
+ Please note that these are proxy types defining how the proxy operates rather than
+ how to proxy any similarly named protocol (i.e. don't confuse a http-proxy with
+ proxying the http protocol, as a http-proxy usually can proxy https and other protocols too).
+
+ The port number defaults to 80 for http, 443 for https and 1080 for the socks ones.
+
+ <note>The password is currently stored as plain text! Use the <link to="ProxyMode_System" />
+ mode if you consider the proxy password to be sensitive.</note>
+
+ An empty string will cause the behavior to be identical to <link to="ProxyMode_System" />.
+ For compatibility with libproxy, an URL starting with "direct://" will cause
+ <link to="ProxyMode_NoProxy" /> behavior.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedParavirtProviders" type="ParavirtProvider" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="ParavirtProvider"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedClipboardModes" type="ClipboardMode" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="ClipboardMode"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedDnDModes" type="DnDMode" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="DnDMode"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedFirmwareTypes" type="FirmwareType" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="FirmwareType"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedPointingHIDTypes" type="PointingHIDType" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="PointingHIDType"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedKeyboardHIDTypes" type="KeyboardHIDType" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="KeyboardHIDType"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedVFSTypes" type="VFSType" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="VFSType"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedImportOptions" type="ImportOptions" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="ImportOptions"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedExportOptions" type="ExportOptions" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="ExportOptions"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedRecordingFeatures" type="RecordingFeature" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="RecordingFeature"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedRecordingAudioCodecs" type="RecordingAudioCodec" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="RecordingAudioCodec"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedRecordingVideoCodecs" type="RecordingVideoCodec" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="RecordingVideoCodec"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedRecordingVSModes" type="RecordingVideoScalingMode" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="RecordingVideoScalingMode"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedRecordingARCModes" type="RecordingRateControlMode" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported audio codec values for enum <link to="RecordingRateControlMode"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedRecordingVRCModes" type="RecordingRateControlMode" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported video codec values for enum <link to="RecordingRateControlMode"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedGraphicsControllerTypes" type="GraphicsControllerType" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="GraphicsControllerType"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedCloneOptions" type="CloneOptions" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="CloneOptions"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedAutostopTypes" type="AutostopType" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="AutostopType"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedVMProcPriorities" type="VMProcPriority" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="VMProcPriority"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedNetworkAttachmentTypes" type="NetworkAttachmentType" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="NetworkAttachmentType"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedNetworkAdapterTypes" type="NetworkAdapterType" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="NetworkAdapterType"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedPortModes" type="PortMode" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="PortMode"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedUartTypes" type="UartType" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="UartType"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedUSBControllerTypes" type="USBControllerType" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="USBControllerType"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedAudioDriverTypes" type="AudioDriverType" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="AudioDriverType"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedAudioControllerTypes" type="AudioControllerType" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="AudioControllerType"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedStorageBuses" type="StorageBus" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="StorageBus"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedStorageControllerTypes" type="StorageControllerType" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="StorageControllerType"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedChipsetTypes" type="ChipsetType" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="ChipsetType"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedIommuTypes" type="IommuType" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="IommuType"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="supportedTpmTypes" type="TpmType" safearray="yes" readonly="yes">
+ <desc>
+ Returns an array of officially supported values for enum <link to="TpmType"/>,
+ in the sense of what is e.g. worth offering in the VirtualBox GUI.
+ </desc>
+ </attribute>
+
+ <attribute name="languageId" type="wstring">
+ <desc>
+ The API language ID used to translate messages to client.
+ </desc>
+ </attribute>
+
+ <method name="getMaxNetworkAdapters">
+ <desc>
+ Maximum total number of network adapters associated with every
+ <link to="IMachine"/> instance.
+ </desc>
+
+ <param name="chipset" type="ChipsetType" dir="in">
+ <desc>The chipset type to get the value for.</desc>
+ </param>
+
+
+ <param name="maxNetworkAdapters" type="unsigned long" dir="return">
+ <desc>The maximum total number of network adapters allowed.</desc>
+ </param>
+
+ </method>
+
+ <method name="getMaxNetworkAdaptersOfType">
+ <desc>
+ Maximum number of network adapters of a given attachment type,
+ associated with every <link to="IMachine"/> instance.
+ </desc>
+
+ <param name="chipset" type="ChipsetType" dir="in">
+ <desc>The chipset type to get the value for.</desc>
+ </param>
+
+ <param name="type" type="NetworkAttachmentType" dir="in">
+ <desc>Type of attachment.</desc>
+ </param>
+
+ <param name="maxNetworkAdapters" type="unsigned long" dir="return">
+ <desc>The maximum number of network adapters allowed for
+ particular chipset and attachment type.</desc>
+ </param>
+
+ </method>
+
+
+ <method name="getMaxDevicesPerPortForStorageBus">
+ <desc>Returns the maximum number of devices which can be attached to a port
+ for the given storage bus.</desc>
+
+ <param name="bus" type="StorageBus" dir="in">
+ <desc>The storage bus type to get the value for.</desc>
+ </param>
+
+ <param name="maxDevicesPerPort" type="unsigned long" dir="return">
+ <desc>The maximum number of devices which can be attached to the port for the given
+ storage bus.</desc>
+ </param>
+ </method>
+
+ <method name="getMinPortCountForStorageBus">
+ <desc>Returns the minimum number of ports the given storage bus supports.</desc>
+
+ <param name="bus" type="StorageBus" dir="in">
+ <desc>The storage bus type to get the value for.</desc>
+ </param>
+
+ <param name="minPortCount" type="unsigned long" dir="return">
+ <desc>The minimum number of ports for the given storage bus.</desc>
+ </param>
+ </method>
+
+ <method name="getMaxPortCountForStorageBus">
+ <desc>Returns the maximum number of ports the given storage bus supports.</desc>
+
+ <param name="bus" type="StorageBus" dir="in">
+ <desc>The storage bus type to get the value for.</desc>
+ </param>
+
+ <param name="maxPortCount" type="unsigned long" dir="return">
+ <desc>The maximum number of ports for the given storage bus.</desc>
+ </param>
+ </method>
+
+ <method name="getMaxInstancesOfStorageBus">
+ <desc>Returns the maximum number of storage bus instances which
+ can be configured for each VM. This corresponds to the number of
+ storage controllers one can have. Value may depend on chipset type
+ used.</desc>
+
+ <param name="chipset" type="ChipsetType" dir="in">
+ <desc>The chipset type to get the value for.</desc>
+ </param>
+
+ <param name="bus" type="StorageBus" dir="in">
+ <desc>The storage bus type to get the value for.</desc>
+ </param>
+
+ <param name="maxInstances" type="unsigned long" dir="return">
+ <desc>The maximum number of instances for the given storage bus.</desc>
+ </param>
+ </method>
+
+ <method name="getDeviceTypesForStorageBus">
+ <desc>Returns list of all the supported device types
+ (<link to="DeviceType"/>) for the given type of storage
+ bus.</desc>
+
+ <param name="bus" type="StorageBus" dir="in">
+ <desc>The storage bus type to get the value for.</desc>
+ </param>
+
+ <param name="deviceTypes" type="DeviceType" safearray="yes" dir="return">
+ <desc>The list of all supported device types for the given storage bus.</desc>
+ </param>
+ </method>
+
+ <method name="getStorageBusForStorageControllerType">
+ <desc>Returns the <link to="StorageBus"/> enum value
+ for a given storage controller type.</desc>
+
+ <param name="storageControllerType" type="StorageControllerType" dir="in">
+ <desc>The storage controller type to get the value for.</desc>
+ </param>
+
+ <param name="storageBus" type="StorageBus" dir="return">
+ <desc>The storage bus which is applicable.</desc>
+ </param>
+ </method>
+
+ <method name="getStorageControllerTypesForStorageBus">
+ <desc>Returns the possible <link to="StorageControllerType"/> enum values
+ for a given storage bus.</desc>
+
+ <param name="storageBus" type="StorageBus" dir="in">
+ <desc>The storage bus type to get the values for.</desc>
+ </param>
+
+ <param name="storageControllerType" type="StorageControllerType" safearray="yes" dir="return">
+ <desc>The enum values (sorted by what should be a sensible decreasing
+ importance of the type) which are valid.</desc>
+ </param>
+ </method>
+
+ <method name="getDefaultIoCacheSettingForStorageController" dtracename="getDefaultStorageCtrlCacheSetting">
+ <desc>Returns the default I/O cache setting for the
+ given storage controller</desc>
+
+ <param name="controllerType" type="StorageControllerType" dir="in">
+ <desc>The storage controller type to get the setting for.</desc>
+ </param>
+
+ <param name="enabled" type="boolean" dir="return">
+ <desc>Returned flag indicating the default value</desc>
+ </param>
+ </method>
+
+ <method name="getStorageControllerHotplugCapable">
+ <desc>Returns whether the given storage controller supports
+ hot-plugging devices.</desc>
+
+ <param name="controllerType" type="StorageControllerType" dir="in">
+ <desc>The storage controller to check the setting for.</desc>
+ </param>
+
+ <param name="hotplugCapable" type="boolean" dir="return">
+ <desc>Returned flag indicating whether the controller is hotplug capable</desc>
+ </param>
+ </method>
+
+ <method name="getMaxInstancesOfUSBControllerType">
+ <desc>Returns the maximum number of USB controller instances which
+ can be configured for each VM. This corresponds to the number of
+ USB controllers one can have. Value may depend on chipset type
+ used.</desc>
+
+ <param name="chipset" type="ChipsetType" dir="in">
+ <desc>The chipset type to get the value for.</desc>
+ </param>
+
+ <param name="type" type="USBControllerType" dir="in">
+ <desc>The USB controller type to get the value for.</desc>
+ </param>
+
+ <param name="maxInstances" type="unsigned long" dir="return">
+ <desc>The maximum number of instances for the given USB controller type.</desc>
+ </param>
+ </method>
+
+ <method name="getCPUProfiles">
+ <desc>Returns CPU profiles matching the given criteria.</desc>
+
+ <param name="architecture" type="CPUArchitecture" dir="in">
+ <desc>The architecture to get profiles for. Required.</desc>
+ </param>
+ <param name="namePattern" type="wstring" dir="in">
+ <desc>Name pattern. Simple wildcard matching using asterisk (*) and
+ question mark (?).</desc>
+ </param>
+ <param name="profiles" type="ICPUProfile" safearray="yes" dir="return">
+ <desc>The matching CPU profiles.</desc>
+ </param>
+ </method>
+ </interface>
+
+ <!--
+ // IGuest
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IGuestOSType" extends="$unknown"
+ uuid="966303d0-36a8-4180-8971-18650b0d1055"
+ wsmap="struct"
+ rest="managed"
+ reservedAttributes="16"
+ >
+ <desc>
+ </desc>
+
+ <attribute name="familyId" type="wstring" readonly="yes">
+ <desc>Guest OS family identifier string.</desc>
+ </attribute>
+
+ <attribute name="familyDescription" type="wstring" readonly="yes">
+ <desc>Human readable description of the guest OS family.</desc>
+ </attribute>
+
+ <attribute name="id" type="wstring" readonly="yes">
+ <desc>Guest OS identifier string.</desc>
+ </attribute>
+
+ <attribute name="description" type="wstring" readonly="yes">
+ <desc>Human readable description of the guest OS.</desc>
+ </attribute>
+
+ <attribute name="is64Bit" type="boolean" readonly="yes">
+ <desc>Returns @c true if the given OS is 64-bit</desc>
+ </attribute>
+
+ <attribute name="recommendedIOAPIC" type="boolean" readonly="yes">
+ <desc>Returns @c true if I/O-APIC recommended for this OS type.</desc>
+ </attribute>
+
+ <attribute name="recommendedVirtEx" type="boolean" readonly="yes">
+ <desc>Returns @c true if VT-x or AMD-V recommended for this OS type.</desc>
+ </attribute>
+
+ <attribute name="recommendedRAM" type="unsigned long" readonly="yes">
+ <desc>Recommended RAM size in Megabytes.</desc>
+ </attribute>
+
+ <attribute name="recommendedGraphicsController" type="GraphicsControllerType" readonly="yes">
+ <desc>Recommended graphics controller type.</desc>
+ </attribute>
+
+ <attribute name="recommendedVRAM" type="unsigned long" readonly="yes">
+ <desc>Recommended video RAM size in Megabytes.</desc>
+ </attribute>
+
+ <attribute name="recommended2DVideoAcceleration" type="boolean" readonly="yes">
+ <desc>Returns @c true if 2D video acceleration is recommended for this OS type.</desc>
+ </attribute>
+
+ <attribute name="recommended3DAcceleration" type="boolean" readonly="yes">
+ <desc>Returns @c true if 3D acceleration is recommended for this OS type.</desc>
+ </attribute>
+
+ <attribute name="recommendedHDD" type="long long" readonly="yes">
+ <desc>Recommended hard disk size in bytes.</desc>
+ </attribute>
+
+ <attribute name="adapterType" type="NetworkAdapterType" readonly="yes">
+ <desc>Returns recommended network adapter for this OS type.</desc>
+ </attribute>
+
+ <attribute name="recommendedPAE" type="boolean" readonly="yes">
+ <desc>Returns @c true if using PAE is recommended for this OS type.</desc>
+ </attribute>
+
+ <attribute name="recommendedDVDStorageController" type="StorageControllerType" readonly="yes">
+ <desc>Recommended storage controller type for DVD/CD drives.</desc>
+ </attribute>
+
+ <attribute name="recommendedDVDStorageBus" type="StorageBus" readonly="yes">
+ <desc>Recommended storage bus type for DVD/CD drives.</desc>
+ </attribute>
+
+ <attribute name="recommendedHDStorageController" type="StorageControllerType" readonly="yes">
+ <desc>Recommended storage controller type for HD drives.</desc>
+ </attribute>
+
+ <attribute name="recommendedHDStorageBus" type="StorageBus" readonly="yes">
+ <desc>Recommended storage bus type for HD drives.</desc>
+ </attribute>
+
+ <attribute name="recommendedFirmware" type="FirmwareType" readonly="yes">
+ <desc>Recommended firmware type.</desc>
+ </attribute>
+
+ <attribute name="recommendedUSBHID" type="boolean" readonly="yes">
+ <desc>Returns @c true if using USB Human Interface Devices, such as keyboard and mouse recommended.</desc>
+ </attribute>
+
+ <attribute name="recommendedHPET" type="boolean" readonly="yes">
+ <desc>Returns @c true if using HPET is recommended for this OS type.</desc>
+ </attribute>
+
+ <attribute name="recommendedUSBTablet" type="boolean" readonly="yes">
+ <desc>Returns @c true if using a USB Tablet is recommended.</desc>
+ </attribute>
+
+ <attribute name="recommendedRTCUseUTC" type="boolean" readonly="yes">
+ <desc>Returns @c true if the RTC of this VM should be set to UTC</desc>
+ </attribute>
+
+ <attribute name="recommendedChipset" type="ChipsetType" readonly="yes">
+ <desc>Recommended chipset type.</desc>
+ </attribute>
+
+ <attribute name="recommendedIommuType" type="IommuType" readonly="yes">
+ <desc>Recommended IOMMU type.</desc>
+ </attribute>
+
+ <attribute name="recommendedAudioController" type="AudioControllerType" readonly="yes">
+ <desc>Recommended audio controller type.</desc>
+ </attribute>
+
+ <attribute name="recommendedAudioCodec" type="AudioCodecType" readonly="yes">
+ <desc>Recommended audio codec type.</desc>
+ </attribute>
+
+ <attribute name="recommendedFloppy" type="boolean" readonly="yes">
+ <desc>Returns @c true a floppy drive is recommended for this OS type.</desc>
+ </attribute>
+
+ <attribute name="recommendedUSB" type="boolean" readonly="yes">
+ <desc>Returns @c true a USB controller is recommended for this OS type.</desc>
+ </attribute>
+
+ <attribute name="recommendedUSB3" type="boolean" readonly="yes">
+ <desc>Returns @c true an xHCI (USB 3) controller is recommended for this OS type.</desc>
+ </attribute>
+
+ <attribute name="recommendedTFReset" type="boolean" readonly="yes">
+ <desc>Returns @c true if using VCPU reset on triple fault is recommended for this OS type.</desc>
+ </attribute>
+
+ <attribute name="recommendedX2APIC" type="boolean" readonly="yes">
+ <desc>Returns @c true if X2APIC is recommended for this OS type.</desc>
+ </attribute>
+
+ <attribute name="recommendedCPUCount" type="unsigned long" readonly="yes">
+ <desc>Number of vCPUs recommended for this OS type.</desc>
+ </attribute>
+
+ <attribute name="recommendedTpmType" type="TpmType" readonly="yes">
+ <desc>Returns the recommended trusted platform module type for this OS type.</desc>
+ </attribute>
+
+ <attribute name="recommendedSecureBoot" type="boolean" readonly="yes">
+ <desc>Returns @c true if EFI secure boot is recommended for this OS type.</desc>
+ </attribute>
+
+ <attribute name="recommendedWDDMGraphics" type="boolean" readonly="yes">
+ <desc>Returns @c true if this OS usually has a WDDM graphics driver
+ from guest additions.</desc>
+ </attribute>
+
+ </interface>
+
+ <enum
+ name="AdditionsFacilityType"
+ uuid="c4b10d74-dd48-4ff4-9a40-785a2a389ade"
+ >
+ <desc>
+ Guest Additions facility IDs.
+ </desc>
+
+ <const name="None" value="0">
+ <desc>No/invalid facility.</desc>
+ </const>
+ <const name="VBoxGuestDriver" value="20">
+ <desc>VirtualBox base driver (VBoxGuest).</desc>
+ </const>
+ <const name="AutoLogon" value="90">
+ <desc>Auto-logon modules (VBoxGINA, VBoxCredProv, pam_vbox).</desc>
+ </const>
+ <const name="VBoxService" value="100">
+ <desc>VirtualBox system service (VBoxService).</desc>
+ </const>
+ <const name="VBoxTrayClient" value="101">
+ <desc>VirtualBox desktop integration (VBoxTray on Windows, VBoxClient on non-Windows).</desc>
+ </const>
+ <const name="Seamless" value="1000">
+ <desc>Seamless guest desktop integration.</desc>
+ </const>
+ <const name="Graphics" value="1100">
+ <desc>Guest graphics mode. If not enabled, seamless rendering will not work, resize hints
+ are not immediately acted on and guest display resizes are probably not initiated by
+ the Guest Additions.
+ </desc>
+ </const>
+ <const name="MonitorAttach" value="1101">
+ <desc>Guest supports monitor hotplug.
+ </desc>
+ </const>
+ <const name="All" value="2147483646">
+ <desc>All facilities selected.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="AdditionsFacilityClass"
+ uuid="446451b2-c88d-4e5d-84c9-91bc7f533f5f"
+ >
+ <desc>
+ Guest Additions facility classes.
+ </desc>
+
+ <const name="None" value="0">
+ <desc>No/invalid class.</desc>
+ </const>
+ <const name="Driver" value="10">
+ <desc>Driver.</desc>
+ </const>
+ <const name="Service" value="30">
+ <desc>System service.</desc>
+ </const>
+ <const name="Program" value="50">
+ <desc>Program.</desc>
+ </const>
+ <const name="Feature" value="100">
+ <desc>Feature.</desc>
+ </const>
+ <const name="ThirdParty" value="999">
+ <desc>Third party.</desc>
+ </const>
+ <const name="All" value="2147483646">
+ <desc>All facility classes selected.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="AdditionsFacilityStatus"
+ uuid="ce06f9e1-394e-4fe9-9368-5a88c567dbde"
+ >
+ <desc>
+ Guest Additions facility states.
+ </desc>
+
+ <const name="Inactive" value="0">
+ <desc>Facility is not active.</desc>
+ </const>
+ <const name="Paused" value="1">
+ <desc>Facility has been paused.</desc>
+ </const>
+ <const name="PreInit" value="20">
+ <desc>Facility is preparing to initialize.</desc>
+ </const>
+ <const name="Init" value="30">
+ <desc>Facility is initializing.</desc>
+ </const>
+ <const name="Active" value="50">
+ <desc>Facility is up and running.</desc>
+ </const>
+ <const name="Terminating" value="100">
+ <desc>Facility is shutting down.</desc>
+ </const>
+ <const name="Terminated" value="101">
+ <desc>Facility successfully shut down.</desc>
+ </const>
+ <const name="Failed" value="800">
+ <desc>Facility failed to start.</desc>
+ </const>
+ <const name="Unknown" value="999">
+ <desc>Facility status is unknown.</desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IAdditionsFacility" extends="$unknown"
+ uuid="f2f7fae4-4a06-81fc-a916-78b2da1fa0e5"
+ wsmap="struct"
+ rest="managed"
+ reservedAttributes="2"
+ >
+ <desc>
+ Structure representing a Guest Additions facility.
+ </desc>
+
+ <attribute name="classType" type="AdditionsFacilityClass" readonly="yes">
+ <desc>The class this facility is part of.</desc>
+ </attribute>
+
+ <attribute name="lastUpdated" type="long long" readonly="yes">
+ <desc>
+ Timestamp of the last status update,
+ in milliseconds since 1970-01-01 UTC.
+ </desc>
+ </attribute>
+
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>The facility's friendly name.</desc>
+ </attribute>
+
+ <attribute name="status" type="AdditionsFacilityStatus" readonly="yes">
+ <desc>The current status.</desc>
+ </attribute>
+
+ <attribute name="type" type="AdditionsFacilityType" readonly="yes">
+ <desc>The facility's type ID.</desc>
+ </attribute>
+ </interface>
+
+ <enum
+ name="AdditionsRunLevelType"
+ uuid="a25417ee-a9dd-4f5b-b0dc-377860087754"
+ >
+ <desc>
+ Guest Additions run level type.
+ </desc>
+
+ <const name="None" value="0">
+ <desc>Guest Additions are not loaded.</desc>
+ </const>
+ <const name="System" value="1">
+ <desc>Guest drivers are loaded.</desc>
+ </const>
+ <const name="Userland" value="2">
+ <desc>Common components (such as application services) are loaded.</desc>
+ </const>
+ <const name="Desktop" value="3">
+ <desc>Per-user desktop components are loaded.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="AdditionsUpdateFlag"
+ uuid="726a818d-18d6-4389-94e8-3e9e6826171a"
+ >
+ <desc>
+ Guest Additions update flags.
+ </desc>
+
+ <const name="None" value="0">
+ <desc>No flag set.</desc>
+ </const>
+ <const name="WaitForUpdateStartOnly" value="1">
+ <desc>Starts the regular updating process and waits until the
+ actual Guest Additions update inside the guest was started.
+ This can be necessary due to needed interaction with the guest
+ OS during the installation phase.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="GuestShutdownFlag"
+ uuid="28D19C9C-5862-4930-B29A-F117712B4864"
+ >
+ <desc>
+ Guest shutdown flags.
+ </desc>
+
+ <const name="None" value="0">
+ <desc>No flag set.</desc>
+ </const>
+ <const name="PowerOff" value="1">
+ <desc>Performs a reboot after shutdown.</desc>
+ </const>
+ <const name="Reboot" value="2">
+ <desc>Performs a reboot after shutdown.</desc>
+ </const>
+ <const name="Force" value="4">
+ <desc>Force the system to shutdown/reboot regardless of objecting
+ application or other stuff. This flag might not be realized on
+ all systems.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="GuestSessionStatus"
+ uuid="ac2669da-4624-44f2-85b5-0b0bfb8d8673"
+ >
+ <desc>
+ Guest session status. This enumeration represents possible values of
+ the <link to="IGuestSession::status"/> attribute.
+ </desc>
+ <const name="Undefined" value="0">
+ <desc>Guest session is in an undefined state.</desc>
+ </const>
+ <const name="Starting" value="10">
+ <desc>Guest session is being started.</desc>
+ </const>
+ <const name="Started" value="100">
+ <desc>Guest session has been started.</desc>
+ </const>
+ <const name="Terminating" value="480">
+ <desc>Guest session is being terminated.</desc>
+ </const>
+ <const name="Terminated" value="500">
+ <desc>Guest session terminated normally.</desc>
+ </const>
+ <const name="TimedOutKilled" value="512">
+ <desc>Guest session timed out and was killed.</desc>
+ </const>
+ <const name="TimedOutAbnormally" value="513">
+ <desc>Guest session timed out and was not killed successfully.</desc>
+ </const>
+ <const name="Down" value="600">
+ <desc>Service/OS is stopping, guest session was killed.</desc>
+ </const>
+ <const name="Error" value="800">
+ <desc>Something went wrong.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="GuestSessionWaitForFlag"
+ uuid="bb7a372a-f635-4e11-a81a-e707f3a52ef5"
+ >
+ <desc>
+ Guest session waiting flags.
+ </desc>
+
+ <const name="None" value="0">
+ <desc>No waiting flags specified. Do not use this.</desc>
+ </const>
+ <const name="Start" value="1">
+ <desc>Wait for the guest session being started.</desc>
+ </const>
+ <const name="Terminate" value="2">
+ <desc>Wait for the guest session being terminated.</desc>
+ </const>
+ <const name="Status" value="4">
+ <desc>Wait for the next guest session status change.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="GuestSessionWaitResult"
+ uuid="c0f6a8a5-fdb6-42bf-a582-56c6f82bcd2d"
+ >
+ <desc>
+ Guest session waiting results. Depending on the session waiting flags (for
+ more information see <link to="GuestSessionWaitForFlag"/>) the waiting result
+ can vary based on the session's current status.
+
+ To wait for a guest session to terminate after it has been
+ created by <link to="IGuest::createSession"/> one would specify
+ GuestSessionWaitResult_Terminate.
+ </desc>
+
+ <const name="None" value="0">
+ <desc>No result was returned. Not being used.</desc>
+ </const>
+ <const name="Start" value="1">
+ <desc>The guest session has been started.</desc>
+ </const>
+ <const name="Terminate" value="2">
+ <desc>The guest session has been terminated.</desc>
+ </const>
+ <const name="Status" value="3">
+ <desc>
+ The guest session has changed its status. The status then can
+ be retrieved via <link to="IGuestSession::status"/>.
+ </desc>
+ </const>
+ <const name="Error" value="4">
+ <desc>Error while executing the process.</desc>
+ </const>
+ <const name="Timeout" value="5">
+ <desc>
+ The waiting operation timed out. This also will happen
+ when no event has been occurred matching the
+ current waiting flags in a <link to="IGuestSession::waitFor"/> call.
+ </desc>
+ </const>
+ <const name="WaitFlagNotSupported" value="6">
+ <desc>
+ A waiting flag specified in the <link to="IGuestSession::waitFor"/> call
+ is not supported by the guest.
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="GuestUserState"
+ uuid="b2a82b02-fd3d-4fc2-ba84-6ba5ac8be198"
+ >
+ <desc>
+ State a guest user has been changed to.
+ </desc>
+
+ <const name="Unknown" value="0">
+ <desc>Unknown state. Not being used.</desc>
+ </const>
+ <const name="LoggedIn" value="1">
+ <desc>A guest user has been successfully logged into
+ the guest OS.
+ <note>This property is not implemented yet!</note>
+ </desc>
+ </const>
+ <const name="LoggedOut" value="2">
+ <desc>A guest user has been successfully logged out
+ of the guest OS.
+ <note>This property is not implemented yet!</note>
+ </desc>
+ </const>
+ <const name="Locked" value="3">
+ <desc>A guest user has locked its account. This might
+ include running a password-protected screensaver
+ in the guest.
+ <note>This property is not implemented yet!</note>
+ </desc>
+ </const>
+ <const name="Unlocked" value="4">
+ <desc>A guest user has unlocked its account.
+ <note>This property is not implemented yet!</note>
+ </desc>
+ </const>
+ <const name="Disabled" value="5">
+ <desc>A guest user has been disabled by the guest OS.
+ <note>This property is not implemented yet!</note>
+ </desc>
+ </const>
+ <const name="Idle" value="6">
+ <desc>
+ A guest user currently is not using the guest OS.
+ <note>Currently only available for Windows guests since
+ Windows 2000 SP2.</note>
+ <note>On Windows guests this function currently only supports
+ reporting contiguous idle times up to 49.7 days per user.</note>
+ The event will be triggered if a guest user is not active for
+ at least 5 seconds. This threshold can be adjusted by either altering
+ VBoxService's command line in the guest to
+ <pre>--vminfo-user-idle-threshold &lt;ms&gt;</pre>
+ , or by setting the per-VM guest property
+ <pre>/VirtualBox/GuestAdd/VBoxService/--vminfo-user-idle-threshold &lt;ms&gt;</pre>
+ with the RDONLYGUEST flag on the host. In both cases VBoxService needs
+ to be restarted in order to get the changes applied.
+ </desc>
+ </const>
+ <const name="InUse" value="7">
+ <desc>A guest user continued using the guest OS after
+ being idle.</desc>
+ </const>
+ <const name="Created" value="8">
+ <desc>A guest user has been successfully created.
+ <note>This property is not implemented yet!</note>
+ </desc>
+ </const>
+ <const name="Deleted" value="9">
+ <desc>A guest user has been successfully deleted.
+ <note>This property is not implemented yet!</note>
+ </desc>
+ </const>
+ <const name="SessionChanged" value="10">
+ <desc>To guest OS has changed the session of a user.
+ <note>This property is not implemented yet!</note>
+ </desc>
+ </const>
+ <const name="CredentialsChanged" value="11">
+ <desc>To guest OS has changed the authentication
+ credentials of a user. This might include changed passwords
+ and authentication types.
+ <note>This property is not implemented yet!</note>
+ </desc>
+ </const>
+ <const name="RoleChanged" value="12">
+ <desc>To guest OS has changed the role of a user permanently,
+ e.g. granting / denying administrative rights.
+ <note>This property is not implemented yet!</note>
+ </desc>
+ </const>
+ <const name="GroupAdded" value="13">
+ <desc>To guest OS has added a user to a specific
+ user group.
+ <note>This property is not implemented yet!</note>
+ </desc>
+ </const>
+ <const name="GroupRemoved" value="14">
+ <desc>To guest OS has removed a user from a specific
+ user group.
+ <note>This property is not implemented yet!</note>
+ </desc>
+ </const>
+ <const name="Elevated" value="15">
+ <desc>To guest OS temporarily has elevated a user
+ to perform a certain task.
+ <note>This property is not implemented yet!</note>
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="FileSeekOrigin"
+ uuid="ad32f789-4279-4530-979c-f16892e1c263"
+ >
+ <desc>
+ What a file seek (<link to="IFile::seek"/>) is relative to.
+ </desc>
+
+ <const name="Begin" value="0">
+ <desc>Seek from the beginning of the file.</desc>
+ </const>
+ <const name="Current" value="1">
+ <desc>Seek from the current file position.</desc>
+ </const>
+ <const name="End" value="2">
+ <desc>Seek relative to the end of the file. To seek to the position two
+ bytes from the end of the file, specify -2 as the seek offset.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="ProcessInputFlag"
+ uuid="5d38c1dd-2604-4ddf-92e5-0c0cdd3bdbd5"
+ >
+ <desc>
+ Guest process input flags.
+ </desc>
+ <const name="None" value="0">
+ <desc>No flag set.</desc>
+ </const>
+ <const name="EndOfFile" value="1">
+ <desc>End of file (input) reached.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="ProcessOutputFlag"
+ uuid="9979e85a-52bb-40b7-870c-57115e27e0f1"
+ >
+ <desc>
+ Guest process output flags for specifying which
+ type of output to retrieve.
+ </desc>
+ <const name="None" value="0">
+ <desc>No flags set. Get output from stdout.</desc>
+ </const>
+ <const name="StdErr" value="1">
+ <desc>Get output from stderr.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="ProcessWaitForFlag"
+ uuid="23b550c7-78e1-437e-98f0-65fd9757bcd2"
+ >
+ <desc>
+ Process waiting flags.
+ </desc>
+
+ <const name="None" value="0">
+ <desc>No waiting flags specified. Do not use this.</desc>
+ </const>
+ <const name="Start" value="1">
+ <desc>Wait for the process being started.</desc>
+ </const>
+ <const name="Terminate" value="2">
+ <desc>Wait for the process being terminated.</desc>
+ </const>
+ <const name="StdIn" value="4">
+ <desc>Wait for stdin becoming available.</desc>
+ </const>
+ <const name="StdOut" value="8">
+ <desc>Wait for data becoming available on stdout.</desc>
+ </const>
+ <const name="StdErr" value="16">
+ <desc>Wait for data becoming available on stderr.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="ProcessWaitResult"
+ uuid="40719cbe-f192-4fe9-a231-6697b3c8e2b4"
+ >
+ <desc>
+ Process waiting results. Depending on the process waiting flags (for
+ more information see <link to="ProcessWaitForFlag"/>) the waiting result
+ can vary based on the processes' current status.
+
+ To wait for a guest process to terminate after it has been
+ created by <link to="IGuestSession::processCreate"/> or <link to="IGuestSession::processCreateEx"/>
+ one would specify ProcessWaitFor_Terminate.
+
+ If a guest process has been started with ProcessCreateFlag_WaitForStdOut
+ a client can wait with ProcessWaitResult_StdOut for new data to arrive on
+ stdout; same applies for ProcessCreateFlag_WaitForStdErr and
+ ProcessWaitResult_StdErr.
+ </desc>
+
+ <const name="None" value="0">
+ <desc>No result was returned. Not being used.</desc>
+ </const>
+ <const name="Start" value="1">
+ <desc>The process has been started.</desc>
+ </const>
+ <const name="Terminate" value="2">
+ <desc>The process has been terminated.</desc>
+ </const>
+ <const name="Status" value="3">
+ <desc>
+ The process has changed its status. The status then can
+ be retrieved via <link to="IProcess::status"/>.
+ </desc>
+ </const>
+ <const name="Error" value="4">
+ <desc>Error while executing the process.</desc>
+ </const>
+ <const name="Timeout" value="5">
+ <desc>
+ The waiting operation timed out. Also use if the guest process has
+ timed out in the guest side (kill attempted).
+ </desc>
+ </const>
+ <const name="StdIn" value="6">
+ <desc>The process signalled that stdin became available for writing.</desc>
+ </const>
+ <const name="StdOut" value="7">
+ <desc>Data on stdout became available for reading.</desc>
+ </const>
+ <const name="StdErr" value="8">
+ <desc>Data on stderr became available for reading.</desc>
+ </const>
+ <const name="WaitFlagNotSupported" value="9">
+ <desc>
+ A waiting flag specified in the <link to="IProcess::waitFor"/> call
+ is not supported by the guest.
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="FileCopyFlag"
+ uuid="791909d7-4c64-2fa4-4303-adb10658d347"
+ >
+ <desc>
+ File copying flags.
+ </desc>
+ <const name="None" value="0">
+ <desc>No flag set.</desc>
+ </const>
+ <const name="NoReplace" value="1">
+ <!-- Would make more sense to not replace by default, however we the GAs
+ only supports replacing as of writing, so we currently have no choice. -->
+ <desc>
+ Do not replace the destination file if it exists.
+ </desc>
+ </const>
+ <const name="FollowLinks" value="2">
+ <desc>
+ Follow symbolic links.
+ </desc>
+ </const>
+ <const name="Update" value="4">
+ <desc>
+ Only copy when the source file is newer than the destination file
+ or when the destination file is missing.
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="FsObjMoveFlag"
+ uuid="2450a05d-80c6-4c96-9a17-94d73293ff86"
+ >
+ <desc>
+ File moving flags.
+ </desc>
+ <const name="None" value="0">
+ <desc>No flag set.</desc>
+ </const>
+ <const name="Replace" value="1">
+ <desc>
+ Replace the destination file, symlink, etc if it exists, however this
+ does not allow replacing any directories.
+ </desc>
+ </const>
+ <const name="FollowLinks" value="2">
+ <desc>
+ Follow symbolic links in the final components or not (only applied to
+ the given source and target paths, not to anything else).
+ </desc>
+ </const>
+ <const name="AllowDirectoryMoves" value="4">
+ <desc>
+ Allow moving directories accross file system boundraries. Because it
+ is could be a big undertaking, we require extra assurance that we
+ should do it when requested.
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="DirectoryCreateFlag"
+ uuid="bd721b0e-ced5-4f79-b368-249897c32a36"
+ >
+ <desc>
+ Directory creation flags.
+ </desc>
+ <const name="None" value="0">
+ <desc>No flag set.</desc>
+ </const>
+ <const name="Parents" value="1">
+ <desc>No error if existing, make parent directories as needed.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="DirectoryCopyFlag"
+ uuid="20108C67-B1EB-4EF6-869B-25539A47A18E"
+ >
+ <desc>
+ Directory copying flags.
+ </desc>
+ <const name="None" value="0">
+ <desc>No flag set.</desc>
+ </const>
+ <const name="CopyIntoExisting" value="1">
+ <desc>Allow copying into an existing destination directory.</desc>
+ </const>
+ <const name="Recursive" value="2">
+ <desc>Copy directories recursively.</desc>
+ </const>
+ <const name="FollowLinks" value="4">
+ <desc>Follow symbolic links.</desc>
+ </const>
+ <!-- Later, basically have to see what cp and xcopy offers. -->
+ </enum>
+
+ <enum
+ name="DirectoryRemoveRecFlag"
+ uuid="455aabf0-7692-48f6-9061-f21579b65769"
+ >
+ <desc>
+ Directory recursive removement flags.
+ </desc>
+
+ <const name="None" value="0">
+ <desc>No flag set.</desc>
+ </const>
+ <const name="ContentAndDir" value="1">
+ <desc>Delete the content of the directory and the directory itself.</desc>
+ </const>
+ <const name="ContentOnly" value="2">
+ <desc>Only delete the content of the directory, omit the directory it self.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="FsObjRenameFlag"
+ uuid="59bbf3a1-4e23-d7cf-05d5-ccae32080ed2"
+ >
+ <desc>
+ Flags for use when renaming file system objects (files, directories,
+ symlink, etc), see <link to="IGuestSession::fsObjRename"/>.
+ </desc>
+
+ <const name="NoReplace" value="0">
+ <desc>Do not replace any destination object.</desc>
+ </const>
+ <const name="Replace" value="1">
+ <desc>This will attempt to replace any destination object other except
+ directories. (The default is to fail if the destination exists.)</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="ProcessCreateFlag"
+ uuid="C544CD2B-F02D-4886-9901-71C523DB8DC5"
+ >
+ <desc>
+ Guest process execution flags.
+ <note>The values are passed to the Guest Additions, so its not possible
+ to change (move) or reuse values.here. See GUEST_PROC_CREATE_FLAG_XXX
+ in GuestControlSvc.h.</note>
+ </desc>
+
+ <const name="None" value="0">
+ <desc>No flag set.</desc>
+ </const>
+ <const name="WaitForProcessStartOnly" value="1">
+ <desc>Only use the specified timeout value to wait for starting the guest process - the guest
+ process itself then uses an infinite timeout.</desc>
+ </const>
+ <const name="IgnoreOrphanedProcesses" value="2">
+ <desc>Do not report an error when executed processes are still alive when VBoxService or the guest OS is shutting down.</desc>
+ </const>
+ <const name="Hidden" value="4">
+ <desc>Do not show the started process according to the guest OS guidelines.</desc>
+ </const>
+ <const name="Profile" value="8">
+ <desc>Utilize the user's profile data when exeuting a process. Only available for Windows guests at the moment.</desc>
+ </const>
+ <const name="WaitForStdOut" value="16">
+ <desc>The guest process waits until all data from stdout is read out.</desc>
+ </const>
+ <const name="WaitForStdErr" value="32">
+ <desc>The guest process waits until all data from stderr is read out.</desc>
+ </const>
+ <const name="ExpandArguments" value="64">
+ <desc>Expands environment variables in process arguments.
+ <note>
+ This is not yet implemented and is currently silently ignored.
+ We will document the protocolVersion number for this feature once it
+ appears, so don't use it till then.
+ </note>
+ </desc>
+ </const>
+ <const name="UnquotedArguments" value="128">
+ <desc>Work around for Windows and OS/2 applications not following normal
+ argument quoting and escaping rules. The arguments are passed to the
+ application without any extra quoting, just a single space between each.
+ <note>Present since VirtualBox 4.3.28 and 5.0 beta 3.</note>
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="ProcessPriority"
+ uuid="ee8cac50-e232-49fe-806b-d1214d9c2e49"
+ >
+ <desc>
+ Process priorities.
+ </desc>
+
+ <const name="Invalid" value="0">
+ <desc>Invalid priority, do not use.</desc>
+ </const>
+ <const name="Default" value="1">
+ <desc>Default process priority determined by the OS.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="SymlinkType"
+ uuid="37794668-f8f1-4714-98a5-6f8fa2ed0118"
+ >
+ <desc>
+ Symbolic link types. This is significant when creating links on the
+ Windows platform, ignored elsewhere.
+ </desc>
+
+ <const name="Unknown" value="0">
+ <desc>It is not known what is being targeted.</desc>
+ </const>
+ <const name="Directory" value="1">
+ <desc>The link targets a directory.</desc>
+ </const>
+ <const name="File" value="2">
+ <desc>The link targets a file (or whatever else except directories).</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="SymlinkReadFlag"
+ uuid="b7fe2b9d-790e-4b25-8adf-1ca33026931f"
+ >
+ <desc>
+ Symbolic link reading flags.
+ </desc>
+
+ <const name="None" value="0">
+ <desc>No flags set.</desc>
+ </const>
+ <const name="NoSymlinks" value="1">
+ <desc>Don't allow symbolic links as part of the path.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="ProcessStatus"
+ uuid="4d52368f-5b48-4bfe-b486-acf89139b52f"
+ >
+ <desc>
+ Process execution statuses.
+ </desc>
+
+ <const name="Undefined" value="0">
+ <desc>Process is in an undefined state.</desc>
+ </const>
+ <const name="Starting" value="10">
+ <desc>Process is being started.</desc>
+ </const>
+ <const name="Started" value="100">
+ <desc>Process has been started.</desc>
+ </const>
+ <const name="Paused" value="110">
+ <desc>Process has been paused.</desc>
+ </const>
+ <const name="Terminating" value="480">
+ <desc>Process is being terminated.</desc>
+ </const>
+ <const name="TerminatedNormally" value="500">
+ <desc>Process terminated normally.</desc>
+ </const>
+ <const name="TerminatedSignal" value="510">
+ <desc>Process terminated via signal.</desc>
+ </const>
+ <const name="TerminatedAbnormally" value="511">
+ <desc>Process terminated abnormally.</desc>
+ </const>
+ <const name="TimedOutKilled" value="512">
+ <desc>Process timed out and was killed.</desc>
+ </const>
+ <const name="TimedOutAbnormally" value="513">
+ <desc>Process timed out and was not killed successfully.</desc>
+ </const>
+ <const name="Down" value="600">
+ <desc>Service/OS is stopping, process was killed.</desc>
+ </const>
+ <const name="Error" value="800">
+ <desc>Something went wrong.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="ProcessInputStatus"
+ uuid="a4a0ef9c-29cc-4805-9803-c8215ae9da6c"
+ >
+ <desc>
+ Process input statuses.
+ </desc>
+
+ <const name="Undefined" value="0">
+ <desc>Undefined state.</desc>
+ </const>
+ <const name="Broken" value="1">
+ <desc>Input pipe is broken.</desc>
+ </const>
+ <const name="Available" value="10">
+ <desc>Input pipe became available for writing.</desc>
+ </const>
+ <const name="Written" value="50">
+ <desc>Data has been successfully written.</desc>
+ </const>
+ <const name="Overflow" value="100">
+ <desc>Too much input data supplied, data overflow.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="PathStyle"
+ uuid="97303a5b-42e8-0a55-d16f-d2a92c295261"
+ >
+ <desc>
+ The path style of a system.
+ (Values matches the RTPATH_STR_F_STYLE_XXX defines in iprt/path.h!)
+ </desc>
+ <const name="DOS" value="1">
+ <desc>DOS-style paths with forward and backward slashes, drive
+ letters and UNC. Known from DOS, OS/2 and Windows.</desc>
+ </const>
+ <const name="UNIX" value="2">
+ <desc>UNIX-style paths with forward slashes only.</desc>
+ </const>
+ <const name="Unknown" value="8">
+ <desc>
+ The path style is not known, most likely because the Guest Additions
+ aren't active yet.
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="FileAccessMode"
+ uuid="231a578f-47fb-ea30-3b3e-8489558227f0"
+ >
+ <desc>
+ File open access mode for use with <link to="IGuestSession::fileOpen"/>
+ and <link to="IGuestSession::fileOpenEx"/>.
+ </desc>
+ <const name="ReadOnly" value="1">
+ <desc>Open the file only with read access.</desc>
+ </const>
+ <const name="WriteOnly" value="2">
+ <desc>Open the file only with write access.</desc>
+ </const>
+ <const name="ReadWrite" value="3">
+ <desc>Open the file with both read and write access.</desc>
+ </const>
+ <const name="AppendOnly" value="4">
+ <desc>Open the file for appending only, no read or seek access.
+ <note>Not yet implemented.</note>
+ </desc>
+ </const>
+ <const name="AppendRead" value="5">
+ <desc>Open the file for appending and read. Writes always goes to the
+ end of the file while reads are done at the current or specified file
+ position.
+ <note>Not yet implemented.</note>
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="FileOpenAction"
+ uuid="12bc97e2-4fc6-a8b4-4f84-0cbf4ab970d2"
+ >
+ <desc>
+ What action <link to="IGuestSession::fileOpen"/> and <link to="IGuestSession::fileOpenEx"/>
+ should take whether the file being opened exists or not.
+ </desc>
+ <const name="OpenExisting" value="1">
+ <desc>Opens an existing file, fails if no file exists. (Was "oe".)</desc>
+ </const>
+ <const name="OpenOrCreate" value="2">
+ <desc>Opens an existing file, creates a new one if no file exists. (Was "oc".)</desc>
+ </const>
+ <const name="CreateNew" value="3">
+ <desc>Creates a new file is no file exists, fails if there is a file there already. (Was "ce".)</desc>
+ </const>
+ <const name="CreateOrReplace" value="4">
+ <desc>
+ Creates a new file, replace any existing file. (Was "ca".)
+ <note>
+ Currently undefined whether we will inherit mode and ACLs from the
+ existing file or replace them.
+ </note>
+ </desc>
+ </const>
+ <const name="OpenExistingTruncated" value="5">
+ <desc>Opens and truncate an existing file, fails if no file exists. (Was "ot".)</desc>
+ </const>
+ <const name="AppendOrCreate" value="99">
+ <desc>Opens an existing file and places the file pointer at the end of
+ the file, creates the file if it does not exist. This action implies
+ write access. (Was "oa".)
+ <note>
+ <!-- @todo r=bird: See iprt/file.h, RTFILE_O_APPEND - not an action/disposition!
+ Moving the file pointer to the end, is almost fine, but implying 'write' access
+ isn't. That is something that is exclusively reserved for the opening mode. -->
+ Deprecated. Only here for historical reasons. Do not use!
+ </note>
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="FileSharingMode"
+ uuid="f87dfe58-425b-c5ba-7d6d-22adeea25de1"
+ >
+ <desc>
+ File sharing mode for <link to="IGuestSession::fileOpenEx"/>.
+ </desc>
+ <const name="Read" value="1">
+ <desc>Only share read access to the file.</desc>
+ </const>
+ <const name="Write" value="2">
+ <desc>Only share write access to the file.</desc>
+ </const>
+ <const name="ReadWrite" value="3">
+ <desc>Share both read and write access to the file, but deny deletion.</desc>
+ </const>
+ <const name="Delete" value="4">
+ <desc>Only share delete access, denying read and write.</desc>
+ </const>
+ <const name="ReadDelete" value="5">
+ <desc>Share read and delete access to the file, denying writing.</desc>
+ </const>
+ <const name="WriteDelete" value="6">
+ <desc>Share write and delete access to the file, denying reading.</desc>
+ </const>
+ <const name="All" value="7">
+ <desc>Share all access, i.e. read, write and delete, to the file.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="FileOpenExFlag"
+ uuid="4671abd4-f70c-42aa-8542-6c169cb87a5c"
+ >
+ <desc>
+ Open flags for <link to="IGuestSession::fileOpenEx"/>.
+ </desc>
+ <const name="None" value="0">
+ <desc>No flag set.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="FileStatus"
+ uuid="8c86468b-b97b-4080-8914-e29f5b0abd2c"
+ >
+ <desc>
+ File statuses.
+ </desc>
+
+ <const name="Undefined" value="0">
+ <desc>File is in an undefined state.</desc>
+ </const>
+ <const name="Opening" value="10">
+ <desc>Guest file is opening.</desc>
+ </const>
+ <const name="Open" value="100">
+ <desc>Guest file has been successfully opened.</desc>
+ </const>
+ <const name="Closing" value="150">
+ <desc>Guest file closing.</desc>
+ </const>
+ <const name="Closed" value="200">
+ <desc>Guest file has been closed.</desc>
+ </const>
+ <const name="Down" value="600">
+ <desc>Service/OS is stopping, guest file was closed.</desc>
+ </const>
+ <const name="Error" value="800">
+ <desc>Something went wrong.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="FsObjType"
+ uuid="34a0d1aa-491e-e209-e150-84964d6cee5f"
+ >
+ <desc>
+ File system object (file) types.
+ </desc>
+ <const name="Unknown" value="1">
+ <desc>Used either if the object has type that is not in this enum, or
+ if the type has not yet been determined or set.</desc>
+ </const>
+ <const name="Fifo" value="2">
+ <desc>FIFO or named pipe, depending on the platform/terminology.</desc>
+ </const>
+ <const name="DevChar" value="3">
+ <desc>Character device.</desc>
+ </const>
+ <const name="Directory" value="4">
+ <desc>Directory.</desc>
+ </const>
+ <const name="DevBlock" value="5">
+ <desc>Block device.</desc>
+ </const>
+ <const name="File" value="6">
+ <desc>Regular file.</desc>
+ </const>
+ <const name="Symlink" value="7">
+ <desc>Symbolic link.</desc>
+ </const>
+ <const name="Socket" value="8">
+ <desc>Socket.</desc>
+ </const>
+ <const name="WhiteOut" value="9">
+ <desc>A white-out file. Found in union mounts where it is used for
+ hiding files after deletion, I think. </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="DnDAction"
+ uuid="17609e74-778e-4d0e-8827-35f5230f287b"
+ >
+ <desc>
+ Possible actions of a drag'n drop operation.
+ </desc>
+
+ <const name="Ignore" value="0">
+ <desc>Do nothing.</desc>
+ </const>
+
+ <const name="Copy" value="1">
+ <desc>Copy the item to the target.</desc>
+ </const>
+
+ <const name="Move" value="2">
+ <desc>Move the item to the target.</desc>
+ </const>
+
+ <const name="Link" value="3">
+ <desc>Link the item from within the target.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="DirectoryOpenFlag"
+ uuid="5138837a-8fd2-4194-a1b0-08f7bc3949d0"
+ >
+ <desc>
+ Directory open flags.
+ </desc>
+ <const name="None" value="0">
+ <desc>No flag set.</desc>
+ </const>
+ <const name="NoSymlinks" value="1">
+ <desc>Don't allow symbolic links as part of the path.</desc>
+ </const>
+<!-- r=bird: need a "NoFollowSymlinks" value here. IPRT probably needs that too. -->
+ </enum>
+
+ <interface
+ name="IDnDBase" extends="$unknown"
+ uuid="00727A73-000A-4C4A-006D-E7D300351186"
+ wsmap="managed"
+ reservedMethods="1" reservedAttributes="2"
+ >
+ <desc>Base abstract interface for drag'n drop.</desc>
+
+ <attribute name="formats" type="wstring" safearray="yes" readonly="yes">
+ <desc>Returns all supported drag'n drop formats.</desc>
+ </attribute>
+
+ <method name="isFormatSupported" >
+ <desc>
+ Checks if a specific drag'n drop MIME / Content-type format is supported.
+ </desc>
+ <param name="format" type="wstring" dir="in">
+ <desc>Format to check for.</desc>
+ </param>
+ <param name="supported" type="boolean" dir="return">
+ <desc>Returns @c true if the specified format is supported, @c false if not.</desc>
+ </param>
+ </method>
+
+ <method name="addFormats" >
+ <desc>
+ Adds MIME / Content-type formats to the supported formats.
+ </desc>
+ <param name="formats" type="wstring" safearray="yes" dir="in">
+ <desc>Collection of formats to add.</desc>
+ </param>
+ </method>
+
+ <method name="removeFormats" >
+ <desc>
+ Removes MIME / Content-type formats from the supported formats.
+ </desc>
+ <param name="formats" type="wstring" safearray="yes" dir="in">
+ <desc>Collection of formats to remove.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <interface
+ name="IDnDSource" extends="IDnDBase"
+ uuid="d23a9ca3-42da-c94b-8aec-21968e08355d"
+ wsmap="managed"
+ reservedMethods="1" reservedAttributes="2"
+ >
+ <desc>Abstract interface for handling drag'n drop sources.</desc>
+
+ <method name="dragIsPending">
+ <desc>
+ Ask the source if there is any drag and drop operation pending.
+ If no drag and drop operation is pending currently, DnDAction_Ignore is returned.
+
+ <result name="VBOX_E_VM_ERROR">
+ VMM device is not available.
+ </result>
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in">
+ <desc>The screen ID where the drag and drop event occurred.</desc>
+ </param>
+ <param name="formats" type="wstring" dir="out" safearray="yes">
+ <desc>On return the supported mime types.</desc>
+ </param>
+ <param name="allowedActions" type="DnDAction" dir="out" safearray="yes">
+ <desc>On return the actions which are allowed.</desc>
+ </param>
+ <param name="defaultAction" type="DnDAction" dir="return">
+ <desc>On return the default action to use.</desc>
+ </param>
+ </method>
+
+ <method name="drop">
+ <desc>
+ Informs the source that a drop event occurred for a pending
+ drag and drop operation.
+
+ <result name="VBOX_E_VM_ERROR">
+ VMM device is not available.
+ </result>
+ </desc>
+
+ <param name="format" type="wstring" dir="in">
+ <desc>The mime type the data must be in.</desc>
+ </param>
+ <param name="action" type="DnDAction" dir="in">
+ <desc>The action to use.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="receiveData">
+ <desc>
+ Receive the data of a previously drag and drop event from the source.
+
+ <result name="VBOX_E_VM_ERROR">
+ VMM device is not available.
+ </result>
+
+ </desc>
+
+ <param name="data" type="octet" safearray="yes" dir="return">
+ <desc>The actual data.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <interface
+ name="IGuestDnDSource" extends="IDnDSource"
+ uuid="dedfb5d9-4c1b-edf7-fdf3-c1be6827dc28"
+ wsmap="managed"
+ >
+ <desc>
+ Implementation of the <link to="IDnDSource" /> object
+ for source drag'n drop operations on the guest.
+ </desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="IDnDTarget" extends="IDnDBase"
+ uuid="ff5befc3-4ba3-7903-2aa4-43988ba11554"
+ wsmap="managed"
+ reservedMethods="1" reservedAttributes="2"
+ >
+ <desc>Abstract interface for handling drag'n drop targets.</desc>
+
+ <method name="enter">
+ <desc>
+ Informs the target about a drag and drop enter event.
+
+ <result name="VBOX_E_VM_ERROR">
+ VMM device is not available.
+ </result>
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in">
+ <desc>The screen ID where the drag and drop event occurred.</desc>
+ </param>
+ <param name="y" type="unsigned long" dir="in">
+ <desc>Y-position of the event.</desc>
+ </param>
+ <param name="x" type="unsigned long" dir="in">
+ <desc>X-position of the event.</desc>
+ </param>
+ <param name="defaultAction" type="DnDAction" dir="in">
+ <desc>The default action to use.</desc>
+ </param>
+ <param name="allowedActions" type="DnDAction" dir="in" safearray="yes">
+ <desc>The actions which are allowed.</desc>
+ </param>
+ <param name="formats" type="wstring" dir="in" safearray="yes">
+ <desc>The supported MIME types.</desc>
+ </param>
+ <param name="resultAction" type="DnDAction" dir="return">
+ <desc>The resulting action of this event.</desc>
+ </param>
+ </method>
+
+ <method name="move">
+ <desc>
+ Informs the target about a drag and drop move event.
+
+ <result name="VBOX_E_VM_ERROR">
+ VMM device is not available.
+ </result>
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in">
+ <desc>The screen ID where the drag and drop event occurred.</desc>
+ </param>
+ <param name="x" type="unsigned long" dir="in">
+ <desc>X-position of the event.</desc>
+ </param>
+ <param name="y" type="unsigned long" dir="in">
+ <desc>Y-position of the event.</desc>
+ </param>
+ <param name="defaultAction" type="DnDAction" dir="in">
+ <desc>The default action to use.</desc>
+ </param>
+ <param name="allowedActions" type="DnDAction" dir="in" safearray="yes">
+ <desc>The actions which are allowed.</desc>
+ </param>
+ <param name="formats" type="wstring" dir="in" safearray="yes">
+ <desc>The supported MIME types.</desc>
+ </param>
+ <param name="resultAction" type="DnDAction" dir="return">
+ <desc>The resulting action of this event.</desc>
+ </param>
+ </method>
+
+ <method name="leave">
+ <desc>
+ Informs the target about a drag and drop leave event.
+
+ <result name="VBOX_E_VM_ERROR">
+ VMM device is not available.
+ </result>
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in">
+ <desc>The screen ID where the drag and drop event occurred.</desc>
+ </param>
+ </method>
+
+ <method name="drop">
+ <desc>
+ Informs the target about a drop event.
+
+ <result name="VBOX_E_VM_ERROR">
+ VMM device is not available.
+ </result>
+
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in">
+ <desc>The screen ID where the Drag and Drop event occurred.</desc>
+ </param>
+ <param name="x" type="unsigned long" dir="in">
+ <desc>X-position of the event.</desc>
+ </param>
+ <param name="y" type="unsigned long" dir="in">
+ <desc>Y-position of the event.</desc>
+ </param>
+ <param name="defaultAction" type="DnDAction" dir="in">
+ <desc>The default action to use.</desc>
+ </param>
+ <param name="allowedActions" type="DnDAction" dir="in" safearray="yes">
+ <desc>The actions which are allowed.</desc>
+ </param>
+ <param name="formats" type="wstring" dir="in" safearray="yes">
+ <desc>The supported MIME types.</desc>
+ </param>
+ <param name="format" type="wstring" dir="out">
+ <desc>The resulting format of this event.</desc>
+ </param>
+ <param name="resultAction" type="DnDAction" dir="return">
+ <desc>The resulting action of this event.</desc>
+ </param>
+ </method>
+
+ <method name="sendData">
+ <desc>
+ Initiates sending data to the target.
+
+ <result name="VBOX_E_VM_ERROR">
+ VMM device is not available.
+ </result>
+
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in">
+ <desc>The screen ID where the drag and drop event occurred.</desc>
+ </param>
+ <param name="format" type="wstring" dir="in">
+ <desc>The MIME type the data is in.</desc>
+ </param>
+ <param name="data" type="octet" dir="in" safearray="yes">
+ <desc>The actual data.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="cancel">
+ <desc>
+ Requests cancelling the current operation. The target can veto
+ the request in case the operation is not cancelable at the moment.
+
+ <result name="VBOX_E_VM_ERROR">
+ VMM device is not available.
+ </result>
+
+ </desc>
+
+ <param name="veto" type="boolean" dir="return">
+ <desc>Whether the target has vetoed cancelling the operation.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <interface
+ name="IGuestDnDTarget" extends="IDnDTarget"
+ uuid="50ce4b51-0ff7-46b7-a138-3c6e5ac946b4"
+ wsmap="managed"
+ >
+ <desc>
+ Implementation of the <link to="IDnDTarget" /> object
+ for target drag'n drop operations on the guest.
+ </desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="IGuestSession" extends="$unknown"
+ uuid="234f0627-866d-48c2-91a5-4c9d50f04928"
+ wsmap="managed"
+ reservedMethods="8" reservedAttributes="12"
+ >
+ <desc>
+ A guest session represents one impersonated user account in the guest, so
+ every operation will use the same credentials specified when creating
+ the session object via <link to="IGuest::createSession"/>.
+
+ There can be a maximum of 32 sessions at once per VM, whereas session 0
+ always is reserved for the root session (the root session is part of that
+ limit).
+
+ This root session is controlling all other guest sessions and also is
+ responsible for actions which require system level privileges.
+
+ Each guest session keeps track of the guest directories and files that
+ it opened as well as guest processes it has created. To work on guest
+ files or directories a guest session offers methods to open or create
+ such objects (see <link to="IGuestSession::fileOpen"/> or
+ <link to="IGuestSession::directoryOpen"/> for instance). Similarly,
+ there a methods for creating guest processes.
+
+ There can be up to 2048 objects (guest processes, files and directories)
+ a time per guest session. Exceeding the limit will result in an error (see
+ the corresponding functions for more).
+
+ When done with either of these objects, including the guest session itself,
+ use the appropriate close() method to let the object do its cleanup work.
+
+ Closing a session via <link to="IGuestSession::close" /> will try to close
+ all the mentioned objects above unless these objects are still used by
+ a client.
+
+ A set of environment variables changes is associated with each session
+ (<link to="IGuestSession::environmentChanges"/>). These are applied to
+ the base environment of the impersonated guest user when creating a new
+ guest process. For additional flexibility the <link to="IGuestSession::processCreate"/>
+ and <link to="IGuestSession::processCreateEx"/> methods allows you to
+ specify individual environment changes for each process you create.
+ With newer guest addition versions, the base environment is also made
+ available via <link to="IGuestSession::environmentBase"/>. (One reason
+ for why we record changes to a base environment instead of working
+ directly on an environment block is that we need to be compatible
+ with older Guest Additions. Another reason is that this way it is always
+ possible to undo all the changes you've scheduled.)
+ </desc>
+
+ <attribute name="user" type="wstring" readonly="yes">
+ <desc>Returns the user name used by this session to impersonate
+ users in the guest.
+ </desc>
+ </attribute>
+ <attribute name="domain" type="wstring" readonly="yes">
+ <desc>Returns the domain name used by this session to impersonate
+ users in the guest.
+ </desc>
+ </attribute>
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>Returns the session's friendly name.</desc>
+ </attribute>
+ <attribute name="id" type="unsigned long" readonly="yes">
+ <desc>Returns the internal session ID.</desc>
+ </attribute>
+ <attribute name="timeout" type="unsigned long">
+ <desc>
+<!-- r=bird: Using 'Returns' for writable attributes is misleading. -->
+ Returns the session timeout (in ms).
+ <result name="E_NOTIMPL">
+ This attribute is not implemented yet.
+ </result>
+ </desc>
+ </attribute>
+ <attribute name="protocolVersion" type="unsigned long" readonly="yes">
+ <desc>Returns the protocol version which is used by this session to
+ communicate with the guest.</desc>
+ </attribute>
+ <attribute name="status" type="GuestSessionStatus" readonly="yes">
+ <desc>Returns the current session status.</desc>
+ </attribute>
+ <attribute name="environmentChanges" type="wstring" safearray="yes">
+ <desc>
+ The set of scheduled environment changes to the base environment of the
+ session. They are in putenv format, i.e. "VAR=VALUE" for setting and
+ "VAR" for unsetting. One entry per variable (change). The changes are
+ applied when creating new guest processes.
+
+ This is writable, so to undo all the scheduled changes, assign it an
+ empty array.
+ </desc>
+ </attribute>
+ <attribute name="environmentBase" type="wstring" safearray="yes" readonly="yes">
+ <desc>
+ The base environment of the session. They are on the "VAR=VALUE" form,
+ one array entry per variable.
+ <!-- @todo/TODO/FIXME: This doesn't end up in the PDF.
+ <result name="VBOX_E_NOT_SUPPORTED">If the Guest Additions does not
+ support the session base environment feature. Support for this was
+ introduced with protocol version XXX.</result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">If the Guest Additions has
+ yet to report the session base environment.</result> -->
+
+ Access fails with VBOX_E_NOT_SUPPORTED if the Guest Additions does not
+ support the session base environment feature. Support for this was
+ introduced with protocol version XXXX.
+
+ Access fails with VBOX_E_INVALID_OBJECT_STATE if the Guest Additions
+ has yet to report the session base environment.
+ </desc>
+ </attribute>
+ <attribute name="processes" type="IGuestProcess" readonly="yes" safearray="yes">
+ <desc>
+ Returns all current guest processes.
+ </desc>
+ </attribute>
+ <attribute name="pathStyle" type="PathStyle" readonly="yes">
+ <desc>
+ The style of paths used by the guest. Handy for giving the right kind
+ of path specifications to <link to="IGuestSession::fileOpen"/> and similar methods.
+ </desc>
+ </attribute>
+ <attribute name="currentDirectory" type="wstring">
+ <desc>
+ Gets or sets the current directory of the session. Guest path style.
+ <result name="E_NOTIMPL">
+ This attribute is not implemented yet.
+ </result>
+ </desc>
+ </attribute>
+ <attribute name="userHome" type="wstring" readonly="yes">
+ <desc>
+ Returns the user's home / profile directory. Guest path style.
+ </desc>
+ </attribute>
+ <attribute name="userDocuments" type="wstring" readonly="yes">
+ <desc>
+ Returns the user's documents directory. Guest path style.
+ </desc>
+ </attribute>
+ <attribute name="directories" type="IGuestDirectory" readonly="yes" safearray="yes">
+ <desc>
+ Returns all currently opened guest directories.
+ </desc>
+ </attribute>
+ <attribute name="files" type="IGuestFile" readonly="yes" safearray="yes">
+ <desc>
+ Returns all currently opened guest files.
+ </desc>
+ </attribute>
+ <attribute name="eventSource" type="IEventSource" readonly="yes">
+ <desc>
+ Event source for guest session events.
+ </desc>
+ </attribute>
+
+ <method name="close">
+ <desc>
+ Closes this session. All opened guest directories, files and
+ processes which are not referenced by clients anymore will be
+ closed. Guest processes which fall into this category and still
+ are running in the guest will be terminated automatically.
+ </desc>
+ </method>
+
+ <method name="copyFromGuest">
+ <desc>
+ Copies directories and/or files from guest to the host.
+
+ This function requires several parallel arrays to be supplied, one
+ set for each source.
+ </desc>
+ <param name="sources" type="wstring" dir="in" safearray="yes">
+ <desc>Paths to directories and/or files on the guest side that should be
+ copied to the host. If the path ends with a path delimiter, only
+ the directory's content is being copied. Guest path style.</desc>
+ </param>
+ <param name="filters" type="wstring" dir="in" safearray="yes">
+ <desc>Array of source filters. This uses the
+ DOS/NT style wildcard characters '?' and '*'.</desc>
+ </param>
+ <param name="flags" type="wstring" dir="in" safearray="yes">
+ <desc>Array of comma-separated list of source flags.
+
+ The following flags are available:
+
+ <dl>
+ <dt><tt>CopyIntoExisting</tt></dt>
+ <dd>Allow copying into an existing destination directory.</dd>
+ <dt><tt>NoReplace</tt></dt>
+ <dd>Do not replace any existing destination files on
+ the destination.</dd>
+ <dt><tt>FollowLinks</tt></dt>
+ <dd>Follows (and handles) (symbolic) links.</dd>
+ <dt><tt>Update</tt></dt>
+ <dd>Only copy when the source file is newer than the destination
+ file or when the destination file is missing.</dd>
+ </dl>
+ </desc>
+ </param>
+ <param name="destination" type="wstring" dir="in">
+ <desc>Where to put the sources on the host. Host path style.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation to completion.</desc>
+ </param>
+ </method>
+
+ <method name="copyToGuest">
+ <desc>
+ Copies directories and/or files from host to the guest.
+
+ This function requires several parallel arrays to be supplied, one
+ set for each source.
+ </desc>
+ <param name="sources" type="wstring" dir="in" safearray="yes">
+ <desc>Paths to directories and/or files on the host side that should be
+ copied to the guest. If the path ends with a path delimiter, only
+ the directory's content is being copied. Host path style.</desc>
+ </param>
+ <param name="filters" type="wstring" dir="in" safearray="yes">
+ <desc>Array of source filters. This uses the
+ DOS/NT style wildcard characters '?' and '*'.</desc>
+ </param>
+ <param name="flags" type="wstring" dir="in" safearray="yes">
+ <desc>Array of comma-separated list of source flags.
+
+ The following flags are available:
+
+ <dl>
+ <dt><tt>CopyIntoExisting</tt></dt>
+ <dd>Allow copying into an existing destination directory.</dd>
+ <dt><tt>NoReplace</tt></dt>
+ <dd>Do not replace any existing destination files on
+ the destination.</dd>
+ <dt><tt>FollowLinks</tt></dt>
+ <dd>Follows (and handles) (symbolic) links.</dd>
+ <dt><tt>Update</tt></dt>
+ <dd>Only copy when the source file is newer than the destination
+ file or when the destination file is missing.</dd>
+ </dl>
+
+ </desc>
+ </param>
+ <param name="destination" type="wstring" dir="in">
+ <desc>Where to put the sources on the guest. Guest path style.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation to completion.</desc>
+ </param>
+ </method>
+
+ <!-- Directory related methods. -->
+
+ <method name="directoryCopy">
+ <desc>
+ Recursively copies a directory from one guest location to another.
+
+ <result name="E_NOTIMPL">
+ Not yet implemented.
+ </result>
+ </desc>
+ <param name="source" type="wstring" dir="in">
+ <desc>The path to the directory to copy (in the guest). Guest path style.</desc>
+ </param>
+ <param name="destination" type="wstring" dir="in">
+ <desc>The path to the target directory (in the guest). Unless the
+ <link to="DirectoryCopyFlag_CopyIntoExisting"/> flag is given, the
+ directory shall not already exist. Guest path style.</desc>
+ </param>
+ <param name="flags" type="DirectoryCopyFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="DirectoryCopyFlag"/> values.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation to completion.</desc>
+ </param>
+ </method>
+
+ <method name="directoryCopyFromGuest">
+ <desc>
+ Recursively copies a directory from the guest to the host.
+ </desc>
+ <param name="source" type="wstring" dir="in">
+ <desc>Path to the directory on the guest side that should be copied to
+ the host. Guest path style.</desc>
+ </param>
+ <param name="destination" type="wstring" dir="in">
+ <desc>Where to put the directory on the host. Unless the
+ <link to="DirectoryCopyFlag_CopyIntoExisting"/> flag is given, the
+ directory shall not already exist. Host path style.</desc>
+ </param>
+ <param name="flags" type="DirectoryCopyFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="DirectoryCopyFlag"/> values.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation to completion.</desc>
+ </param>
+ </method>
+
+ <method name="directoryCopyToGuest">
+ <desc>
+ Recursively copies a directory from the host to the guest.
+ </desc>
+ <param name="source" type="wstring" dir="in">
+ <desc>Path to the directory on the host side that should be copied to
+ the guest. Host path style.</desc>
+ </param>
+ <param name="destination" type="wstring" dir="in">
+ <desc>Where to put the file in the guest. Unless the
+ <link to="DirectoryCopyFlag_CopyIntoExisting"/> flag is given, the
+ directory shall not already exist. Guest style path.</desc>
+ </param>
+ <param name="flags" type="DirectoryCopyFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="DirectoryCopyFlag"/> values.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation to completion.</desc>
+ </param>
+ </method>
+
+ <method name="directoryCreate">
+ <desc>
+ Creates a directory in the guest.
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Error while creating the directory.
+ </result>
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>Path to the directory directory to be created. Guest path style.</desc>
+ </param>
+ <param name="mode" type="unsigned long" dir="in">
+ <desc>
+ The UNIX-style access mode mask to create the directory with.
+ Whether/how all three access groups and associated access rights are
+ realized is guest OS dependent. The API does the best it can on each
+ OS.
+ </desc>
+ </param>
+ <param name="flags" type="DirectoryCreateFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="DirectoryCreateFlag"/> flags.</desc>
+ </param>
+ </method>
+
+ <method name="directoryCreateTemp">
+ <desc>
+ Creates a temporary directory in the guest.
+
+ <result name="VBOX_E_NOT_SUPPORTED">
+ The operation is not possible as requested on this particular
+ guest type.
+ </result>
+ <result name="E_INVALIDARG">
+ Invalid argument. This includes an incorrectly formatted template,
+ or a non-absolute path.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ The temporary directory could not be created. Possible reasons
+ include a non-existing path or an insecure path when the secure
+ option was requested.
+ </result>
+ </desc>
+ <param name="templateName" type="wstring" dir="in">
+ <desc>Template for the name of the directory to create. This must
+ contain at least one 'X' character. The first group of consecutive
+ 'X' characters in the template will be replaced by a random
+ alphanumeric string to produce a unique name.</desc>
+ </param>
+ <param name="mode" type="unsigned long" dir="in">
+ <desc>
+ The UNIX-style access mode mask to create the directory with.
+ Whether/how all three access groups and associated access rights are
+ realized is guest OS dependent. The API does the best it can on each
+ OS.
+
+ This parameter is ignored if the @a secure parameter is set to @c true.
+ <note>It is strongly recommended to use 0700.</note>
+ </desc>
+ </param>
+ <param name="path" type="wstring" dir="in">
+ <desc>The path to the directory in which the temporary directory should
+ be created. Guest path style.</desc>
+ </param>
+ <param name="secure" type="boolean" dir="in">
+ <desc>
+ Whether to fail if the directory can not be securely created.
+ Currently this means that another unprivileged user cannot
+ manipulate the path specified or remove the temporary directory
+ after it has been created. Also causes the mode specified to be
+ ignored. May not be supported on all guest types.
+ </desc>
+ </param>
+ <param name="directory" type="wstring" dir="return">
+ <desc>On success this will contain the full path to the created
+ directory. Guest path style.</desc>
+ </param>
+ </method>
+
+ <method name="directoryExists">
+ <desc>
+ Checks whether a directory exists in the guest or not.
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Error while checking existence of the directory specified.
+ </result>
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>Path to the directory to check if exists. Guest path style.</desc>
+ </param>
+ <param name="followSymlinks" type="boolean" dir="in">
+ <desc>
+ If @c true, symbolic links in the final component will be followed
+ and the existance of the symlink target made the question for this method.
+ If @c false, a symbolic link in the final component will make the
+ method return @c false (because a symlink isn't a directory).
+ </desc>
+ </param>
+ <param name="exists" type="boolean" dir="return">
+ <desc>Returns @c true if the directory exists, @c false if not, or is not a directory.</desc>
+ </param>
+ </method>
+
+ <method name="directoryOpen">
+ <desc>
+ Opens a directory in the guest and creates a <link to="IGuestDirectory"/>
+ object that can be used for further operations.
+
+ <note>This method follows symbolic links by default at the moment, this
+ may change in the future.</note>
+
+ <note>One idiosyncrasy of the current implementation is that you will NOT
+ get VBOX_E_OBJECT_NOT_FOUND returned here if the directory doesn't exist.
+ Instead the read function will fail with VBOX_E_IPRT_ERROR. This will
+ be fixed soon.</note>
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ Directory to open was not found.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ Error while opening the directory.
+ </result>
+ <result name="VBOX_E_MAXIMUM_REACHED">
+ The maximum of concurrent guest directories has been reached.
+ </result>
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>Path to the directory to open. Guest path style.</desc>
+ </param>
+ <param name="filter" type="wstring" dir="in">
+ <desc>Optional directory listing filter to apply. This uses the DOS/NT
+ style wildcard characters '?' and '*'.</desc>
+ </param>
+ <param name="flags" type="DirectoryOpenFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="DirectoryOpenFlag"/> flags.</desc>
+ </param>
+ <param name="directory" type="IGuestDirectory" dir="return">
+ <desc><link to="IGuestDirectory"/> object containing the opened directory.</desc>
+ </param>
+ </method>
+
+ <method name="directoryRemove">
+ <desc>
+ Removes a guest directory if empty.
+
+ <note>Symbolic links in the final component will not be followed,
+ instead an not-a-directory error is reported.</note>
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>Path to the directory that should be removed. Guest path style.</desc>
+ </param>
+ </method>
+
+ <method name="directoryRemoveRecursive">
+ <desc>
+ Removes a guest directory recursively.
+
+<!-- Add this back when the warning can be removed:
+ Unless <link to="DirectoryRemoveRecFlag_ContentAndDir"/> or
+ <link to="DirectoryRemoveRecFlag_ContentOnly"/> is given, only the
+ directory structure is removed. Which means it will fail if there are
+ directories which are not empty in the directory tree @a path points to.
+-->
+
+ <note> WARNING!! THE FLAGS ARE NOT CURRENTLY IMPLEMENTED. THE IMPLEMENTATION
+ WORKS AS IF FLAGS WAS SET TO <link to="DirectoryRemoveRecFlag_ContentAndDir"/>.
+ </note>
+
+ <note>If the final path component is a symbolic link, this method will
+ fail as it can only be applied to directories.</note>
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>Path of the directory that is to be removed recursively. Guest
+ path style.</desc>
+ </param>
+ <param name="flags" type="DirectoryRemoveRecFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="DirectoryRemoveRecFlag"/> flags.
+ <note>WARNING! SPECIFYING <link to="DirectoryRemoveRecFlag_ContentAndDir"/> IS
+ MANDATORY AT THE MOMENT!!</note>
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion. This is not implemented
+ yet and therefore this method call will block until deletion is completed.</desc>
+ </param>
+ </method>
+
+ <!-- Environment related methods. -->
+
+ <method name="environmentScheduleSet">
+ <desc>
+ Schedules setting an environment variable when creating the next guest
+ process. This affects the <link to="IGuestSession::environmentChanges"/>
+ attribute.
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the environment variable to set. This cannot be empty
+ nor can it contain any equal signs.</desc>
+ </param>
+ <param name="value" type="wstring" dir="in">
+ <desc>Value to set the session environment variable to.</desc>
+ </param>
+ </method>
+
+ <method name="environmentScheduleUnset">
+ <desc>
+ Schedules unsetting (removing) an environment variable when creating
+ the next guest process. This affects the
+ <link to="IGuestSession::environmentChanges"/> attribute.
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the environment variable to unset. This cannot be empty
+ nor can it contain any equal signs.</desc>
+ </param>
+ </method>
+
+ <method name="environmentGetBaseVariable">
+ <desc>
+ Gets an environment variable from the session's base environment
+ (<link to="IGuestSession::environmentBase"/>).
+
+ <result name="VBOX_E_NOT_SUPPORTED">If the Guest Additions does not
+ support the session base environment feature. Support for this was
+ introduced with protocol version XXXX.</result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">If the Guest Additions has
+ yet to report the session base environment.</result>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the environment variable to get.This cannot be empty
+ nor can it contain any equal signs.</desc>
+ </param>
+ <param name="value" type="wstring" dir="return">
+ <desc>
+ The value of the variable. Empty if not found. To deal with
+ variables that may have empty values, use
+ <link to="IGuestSession::environmentDoesBaseVariableExist"/>.
+ </desc>
+ </param>
+ </method>
+
+ <method name="environmentDoesBaseVariableExist">
+ <desc>
+ Checks if the given environment variable exists in the session's base
+ environment (<link to="IGuestSession::environmentBase"/>).
+
+ <result name="VBOX_E_NOT_SUPPORTED">If the Guest Additions does not
+ support the session base environment feature. Support for this was
+ introduced with protocol version XXXX.</result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">If the Guest Additions has
+ yet to report the session base environment.</result>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the environment variable to look for. This cannot be
+ empty nor can it contain any equal signs.</desc>
+ </param>
+ <param name="exists" type="boolean" dir="return">
+ <desc>TRUE if the variable exists, FALSE if not.</desc>
+ </param>
+ </method>
+
+ <!-- File related methods. -->
+
+ <method name="fileCopy">
+ <desc>
+ Copies a file from one guest location to another.
+
+ <note>Will overwrite the destination file unless
+ <link to="FileCopyFlag_NoReplace"/> is specified.</note>
+
+ <result name="E_NOTIMPL">
+ Not yet implemented.
+ </result>
+ </desc>
+ <param name="source" type="wstring" dir="in">
+ <desc>The path to the file to copy (in the guest). Guest path style.</desc>
+ </param>
+ <param name="destination" type="wstring" dir="in">
+ <desc>The path to the target file (in the guest). This cannot be a
+ directory. Guest path style.</desc>
+ </param>
+ <param name="flags" type="FileCopyFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="FileCopyFlag"/> values.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation to completion.</desc>
+ </param>
+ </method>
+
+ <method name="fileCopyFromGuest">
+ <desc>
+ Copies a file from the guest to the host.
+
+ <note>Will overwrite the destination file unless
+ <link to="FileCopyFlag_NoReplace"/> is specified.</note>
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Error starting the copy operation.
+ </result>
+ </desc>
+ <param name="source" type="wstring" dir="in">
+ <desc>Path to the file on the guest side that should be copied to the
+ host. Guest path style.</desc>
+ </param>
+ <param name="destination" type="wstring" dir="in">
+ <desc>Where to put the file on the host (file, not directory). Host
+ path style.</desc>
+ </param>
+ <param name="flags" type="FileCopyFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="FileCopyFlag"/> values.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation to completion.</desc>
+ </param>
+ </method>
+
+ <method name="fileCopyToGuest">
+ <desc>
+ Copies a file from the host to the guest.
+
+ <note>Will overwrite the destination file unless
+ <link to="FileCopyFlag_NoReplace"/> is specified.</note>
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Error starting the copy operation.
+ </result>
+ </desc>
+ <param name="source" type="wstring" dir="in">
+ <desc>Path to the file on the host side that should be copied to the
+ guest. Host path style.</desc>
+ </param>
+ <param name="destination" type="wstring" dir="in">
+ <desc>Where to put the file in the guest (file, not directory). Guest
+ style path.</desc>
+ </param>
+ <param name="flags" type="FileCopyFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="FileCopyFlag"/> values.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation to completion.</desc>
+ </param>
+ </method>
+
+ <method name="fileCreateTemp">
+ <desc>
+ Creates a temporary file in the guest.
+
+ <result name="VBOX_E_NOT_SUPPORTED">
+ The operation is not possible as requested on this particular
+ guest OS.
+ </result>
+ <result name="E_INVALIDARG">
+ Invalid argument. This includes an incorrectly formatted template,
+ or a non-absolute path.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ The temporary file could not be created. Possible reasons include
+ a non-existing path or an insecure path when the secure
+ option was requested.
+ </result>
+ </desc>
+ <param name="templateName" type="wstring" dir="in">
+ <desc>Template for the name of the file to create. This must contain
+ at least one 'X' character. The first group of consecutive 'X'
+ characters in the template will be replaced by a random
+ alphanumeric string to produce a unique name.
+ </desc>
+ </param>
+ <param name="mode" type="unsigned long" dir="in">
+ <desc>
+ The UNIX-style access mode mask to create the file with.
+ Whether/how all three access groups and associated access rights are
+ realized is guest OS dependent. The API does the best it can on each
+ OS.
+
+ This parameter is ignore if the @a secure parameter is set to @c true.
+ <note>It is strongly recommended to use 0600.</note>
+ </desc>
+ </param>
+ <param name="path" type="wstring" dir="in">
+ <desc>The path to the directory in which the temporary file should be
+ created.</desc>
+ </param>
+ <param name="secure" type="boolean" dir="in">
+ <desc>Whether to fail if the file can not be securely created.
+ Currently this means that another unprivileged user cannot
+ manipulate the path specified or remove the temporary file after
+ it has been created. Also causes the mode specified to be ignored.
+ May not be supported on all guest types.</desc>
+ </param>
+ <param name="file" type="IGuestFile" dir="return">
+ <desc>On success this will contain an open file object for the new
+ temporary file.
+ </desc>
+ </param>
+ </method>
+
+ <method name="fileExists">
+ <desc>
+ Checks whether a regular file exists in the guest or not.
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Error while checking existence of the file specified.
+ </result>
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>Path to the alleged regular file. Guest path style.</desc>
+ </param>
+ <param name="followSymlinks" type="boolean" dir="in">
+ <desc>
+ If @c true, symbolic links in the final component will be followed
+ and the existance of the symlink target made the question for this method.
+ If @c false, a symbolic link in the final component will make the
+ method return @c false (because a symlink isn't a regular file).
+ </desc>
+ </param>
+ <param name="exists" type="boolean" dir="return">
+ <desc>Returns @c true if the file exists, @c false if not. @c false is
+ also return if this @a path does not point to a file object.</desc>
+ </param>
+ </method>
+
+ <method name="fileOpen">
+ <desc>
+ Opens a file and creates a <link to="IGuestFile"/> object that
+ can be used for further operations.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ File to open was not found.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ Error while opening the file.
+ </result>
+ <result name="VBOX_E_MAXIMUM_REACHED">
+ The maximum of concurrent guest files has been reached.
+ </result>
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>Path to file to open. Guest path style.</desc>
+ </param>
+ <param name="accessMode" type="FileAccessMode" dir="in">
+ <desc>The file access mode (read, write and/or append).
+ See <link to="FileAccessMode"/> for details.</desc>
+ </param>
+ <param name="openAction" type="FileOpenAction" dir="in">
+ <desc>What action to take depending on whether the file exists or not.
+ See <link to="FileOpenAction"/> for details.</desc>
+ </param>
+ <param name="creationMode" type="unsigned long" dir="in">
+ <desc>
+ The UNIX-style access mode mask to create the file with if @a openAction
+ requested the file to be created (otherwise ignored). Whether/how all
+ three access groups and associated access rights are realized is guest
+ OS dependent. The API does the best it can on each OS.
+ </desc>
+ </param>
+ <param name="file" type="IGuestFile" dir="return">
+ <desc><link to="IGuestFile"/> object representing the opened file.</desc>
+ </param>
+ </method>
+
+ <method name="fileOpenEx">
+ <desc>
+ Opens a file and creates a <link to="IGuestFile"/> object that
+ can be used for further operations, extended version.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ File to open was not found.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ Error while opening the file.
+ </result>
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>Path to file to open. Guest path style.</desc>
+ </param>
+ <param name="accessMode" type="FileAccessMode" dir="in">
+ <desc>The file access mode (read, write and/or append).
+ See <link to="FileAccessMode"/> for details.</desc>
+ </param>
+ <param name="openAction" type="FileOpenAction" dir="in">
+ <desc>What action to take depending on whether the file exists or not.
+ See <link to="FileOpenAction"/> for details.</desc>
+ </param>
+ <param name="sharingMode" type="FileSharingMode" dir="in">
+ <desc>The file sharing mode in the guest. This parameter is currently
+ ignore for all guest OSes. It will in the future be implemented for
+ Windows, OS/2 and maybe Solaris guests only, the others will ignore it.
+ Use <link to="FileSharingMode_All"/>.
+ </desc>
+ </param>
+ <param name="creationMode" type="unsigned long" dir="in">
+ <desc>
+ The UNIX-style access mode mask to create the file with if @a openAction
+ requested the file to be created (otherwise ignored). Whether/how all
+ three access groups and associated access rights are realized is guest
+ OS dependent. The API does the best it can on each OS.
+ </desc>
+ </param>
+ <param name="flags" type="FileOpenExFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="FileOpenExFlag"/> values. </desc>
+ </param>
+ <param name="file" type="IGuestFile" dir="return">
+ <desc><link to="IGuestFile"/> object representing the opened file.</desc>
+ </param>
+ </method>
+
+ <method name="fileQuerySize">
+ <desc>
+ Queries the size of a regular file in the guest.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ File to was not found.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ Error querying file size.
+ </result>
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>Path to the file which size is requested. Guest path style.</desc>
+ </param>
+ <param name="followSymlinks" type="boolean" dir="in">
+ <desc>
+ It @c true, symbolic links in the final path component will be
+ followed to their target, and the size of the target is returned.
+ If @c false, symbolic links in the final path component will make
+ the method call fail (symblink is not a regular file).
+ </desc>
+ </param>
+ <param name="size" type="long long" dir="return">
+ <desc>Queried file size.</desc>
+ </param>
+ </method>
+
+ <!-- File System Object Level -->
+
+ <method name="fsObjExists">
+ <desc>
+ Checks whether a file system object (file, directory, etc) exists in
+ the guest or not.
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Error while checking existence of the file specified.
+ </result>
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>Path to the file system object to check the existance of. Guest
+ path style.</desc>
+ </param>
+ <param name="followSymlinks" type="boolean" dir="in">
+ <desc>
+ If @c true, symbolic links in the final component will be followed
+ and the method will instead check if the target exists.
+ If @c false, symbolic links in the final component will satisfy the
+ method and it will return @c true in @a exists.
+ </desc>
+ </param>
+ <param name="exists" type="boolean" dir="return">
+ <desc>Returns @c true if the file exists, @c false if not.</desc>
+ </param>
+ </method>
+
+ <method name="fsObjQueryInfo">
+ <desc>
+ Queries information about a file system object (file, directory, etc)
+ in the guest.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ The file system object was not found.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ Error while querying information.
+ </result>
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>Path to the file system object to gather information about.
+ Guest path style.</desc>
+ </param>
+ <param name="followSymlinks" type="boolean" dir="in">
+ <desc>
+ Information about symbolic links is returned if @c false. Otherwise,
+ symbolic links are followed and the returned information concerns
+ itself with the symlink target if @c true.
+ </desc>
+ </param>
+ <param name="info" type="IGuestFsObjInfo" dir="return">
+ <desc><link to="IGuestFsObjInfo"/> object containing the information.</desc>
+ </param>
+ </method>
+
+ <method name="fsObjRemove">
+ <desc>
+ Removes a file system object (file, symlink, etc) in the guest. Will
+ not work on directories, use <link to="IGuestSession::directoryRemove"/>
+ to remove directories.
+
+ <note>This method will remove symbolic links in the final path
+ component, not follow them.</note>
+
+ <result name="E_NOTIMPL">
+ The method has not been implemented yet.
+ </result>
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ The file system object was not found.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ For most other errors. We know this is unhelpful, will fix shortly...
+ </result>
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>Path to the file system object to remove. Guest style path.</desc>
+ </param>
+ </method>
+
+ <method name="fsObjRemoveArray">
+ <desc>
+ Removes multiple file system objects (files, directories, symlinks, etc)
+ in the guest. Use with caution.
+
+ <note>This method is not implemented yet and will return E_NOTIMPL.</note>
+
+ <note>This method will remove symbolic links in the final path
+ component, not follow them.</note>
+
+ <result name="E_NOTIMPL">
+ The method has not been implemented yet.
+ </result>
+ </desc>
+ <param name="path" type="wstring" dir="in" safearray="yes">
+ <desc>Array of paths to the file system objects to remove. Guest style path.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation to completion.</desc>
+ </param>
+ </method>
+
+ <method name="fsObjRename">
+ <desc>
+ Renames a file system object (file, directory, symlink, etc) in the
+ guest.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ The file system object was not found.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ For most other errors. We know this is unhelpful, will fix shortly...
+ </result>
+ </desc>
+ <param name="oldPath" type="wstring" dir="in">
+ <desc>The current path to the object. Guest path style.</desc>
+ </param>
+ <param name="newPath" type="wstring" dir="in">
+ <desc>The new path to the object. Guest path style.</desc>
+ </param>
+ <param name="flags" type="FsObjRenameFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="FsObjRenameFlag"/> values.</desc>
+ </param>
+ </method>
+
+ <method name="fsObjMove">
+ <desc>
+ Moves a file system object (file, directory, symlink, etc) from one
+ guest location to another.
+
+ This differs from <link to="IGuestSession::fsObjRename"/> in that it
+ can move accross file system boundraries. In that case it will
+ perform a copy and then delete the original. For directories, this
+ can take a while and is subject to races.
+
+ <result name="E_NOTIMPL">
+ Not yet implemented.
+ </result>
+ </desc>
+ <param name="source" type="wstring" dir="in">
+ <desc>Path to the file to move. Guest path style.</desc>
+ </param>
+ <param name="destination" type="wstring" dir="in">
+ <desc>Where to move the file to (file, not directory). Guest path
+ style.</desc>
+ </param>
+ <param name="flags" type="FsObjMoveFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="FsObjMoveFlag"/> values.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation to completion.</desc>
+ </param>
+ </method>
+
+ <method name="fsObjMoveArray">
+ <desc>
+ Moves file system objects (files, directories, symlinks, etc) from one
+ guest location to another.
+
+ <result name="E_NOTIMPL">
+ Not yet implemented.
+ </result>
+ </desc>
+ <param name="source" type="wstring" dir="in" safearray="yes">
+ <desc>Array of paths to the file system objects to move. Guest style path.</desc>
+ </param>
+ <param name="destination" type="wstring" dir="in">
+ <desc>Where to move the file system objects to (directory). Guest path
+ style.</desc>
+ </param>
+ <param name="flags" type="FsObjMoveFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="FsObjMoveFlag"/> values.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation to completion.</desc>
+ </param>
+ </method>
+
+ <method name="fsObjCopyArray">
+ <desc>
+ Copies file system objects (files, directories, symlinks, etc) from one
+ guest location to another.
+
+ <result name="E_NOTIMPL">
+ Not yet implemented.
+ </result>
+ </desc>
+ <param name="source" type="wstring" dir="in" safearray="yes">
+ <desc>Array of paths to the file system objects to copy. Guest style path.</desc>
+ </param>
+ <param name="destination" type="wstring" dir="in">
+ <desc>Where to copy the file system objects to (directory). Guest path
+ style.</desc>
+ </param>
+ <param name="flags" type="FileCopyFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="FileCopyFlag"/> values.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation to completion.</desc>
+ </param>
+ </method>
+
+ <method name="fsObjSetACL">
+ <desc>
+ Sets the access control list (ACL) of a file system object (file,
+ directory, etc) in the guest.
+
+ <result name="E_NOTIMPL">
+ The method is not implemented yet.
+ </result>
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>Full path of the file system object which ACL to set.</desc>
+ </param>
+ <param name="followSymlinks" type="boolean" dir="in">
+ <desc>
+ If @c true symbolic links in the final component will be followed,
+ otherwise, if @c false, the method will work directly on a symbolic
+ link in the final component.
+ </desc>
+ </param>
+ <param name="acl" type="wstring" dir="in">
+ <desc>The ACL specification string. To-be-defined.</desc>
+ </param>
+ <param name="mode" type="unsigned long" dir="in">
+ <desc>UNIX-style mode mask to use if @a acl is empty. As mention in
+ <link to="IGuestSession::directoryCreate"/> this is realized on
+ a best effort basis and the exact behavior depends on the Guest OS.
+ </desc>
+ </param>
+ </method>
+
+ <method name="fsQueryFreeSpace">
+ <desc>
+ Returns the free space (in bytes) of a given path.
+
+ <result name="E_NOTIMPL">
+ The method is not implemented yet.
+ </result>
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>Full path to return the free space for.</desc>
+ </param>
+ <param name="freeSpace" type="long long" dir="return">
+ <desc>Free space (in bytes).</desc>
+ </param>
+ </method>
+
+ <method name="fsQueryInfo">
+ <desc>
+ Returns file system information for a given path.
+
+ <result name="E_NOTIMPL">
+ The method is not implemented yet.
+ </result>
+ </desc>
+
+ <param name="path" type="wstring" dir="in">
+ <desc>Full path to return file system information for.</desc>
+ </param>
+ <param name="info" type="IGuestFsInfo" dir="return">
+ <desc>IGuestFsInfo object containing the information.</desc>
+ </param>
+
+ </method>
+
+ <!-- Process methods -->
+
+ <method name="processCreate">
+ <desc>
+ Creates a new process running in the guest. The new process will be
+ started asynchronously, meaning on return of this function it is not
+ be guaranteed that the guest process is in a started state. To wait for
+ successful startup, use the <link to="IProcess::waitFor"/> call.
+
+ <note>
+ Starting at VirtualBox 4.2 guest process execution by is default limited
+ to serve up to 255 guest processes at a time. If all 255 guest processes
+ are active and running, creating a new guest process will result in an
+ error.
+
+ If ProcessCreateFlag_WaitForStdOut and/or ProcessCreateFlag_WaitForStdErr
+ are set, the guest process will not enter the terminated state until
+ all data from the specified streams have been read read.
+ </note>
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Error creating guest process.
+ </result>
+
+ <result name="VBOX_E_MAXIMUM_REACHED">
+ The maximum of concurrent guest processes has been reached.
+ </result>
+ </desc>
+ <param name="executable" type="wstring" dir="in">
+ <desc>
+ Full path to the file to execute in the guest. The file has to
+ exists in the guest VM with executable right to the session user in
+ order to succeed. If empty/null, the first entry in the
+ @a arguments array will be used instead (i.e. argv[0]).
+ </desc>
+ </param>
+ <param name="arguments" type="wstring" dir="in" safearray="yes">
+ <desc>Array of arguments passed to the new process.
+ <note>
+ Starting with VirtualBox 5.0 this array starts with argument 0
+ instead of argument 1 as in previous versions. Whether the zeroth
+ argument can be passed to the guest depends on the VBoxService
+ version running there. If you depend on this, check that the
+ <link to="IGuestSession::protocolVersion"/> is 3 or higher.
+ </note>
+ </desc>
+ </param>
+ <param name="environmentChanges" type="wstring" dir="in" safearray="yes">
+ <desc>
+ Set of environment changes to complement
+ <link to="IGuestSession::environmentChanges"/>. Takes precedence
+ over the session ones. The changes are in putenv format, i.e.
+ "VAR=VALUE" for setting and "VAR" for unsetting.
+
+ The changes are applied to the base environment of the impersonated
+ guest user (<link to="IGuestSession::environmentBase"/>) when
+ creating the process. (This is done on the guest side of things in
+ order to be compatible with older Guest Additions. That is one of
+ the motivations for not passing in the whole environment here.)
+ </desc>
+ </param>
+ <param name="flags" type="ProcessCreateFlag" dir="in" safearray="yes">
+ <desc>
+ Process creation flags;
+ see <link to="ProcessCreateFlag"/> for more information.
+ </desc>
+ </param>
+ <param name="timeoutMS" type="unsigned long" dir="in">
+ <desc>
+ Timeout (in ms) for limiting the guest process' running time.
+ Pass 0 for an infinite timeout. On timeout the guest process will be
+ killed and its status will be put to an appropriate value. See
+ <link to="ProcessStatus"/> for more information.
+ </desc>
+ </param>
+ <param name="guestProcess" type="IGuestProcess" dir="return">
+ <desc>Guest process object of the newly created process.</desc>
+ </param>
+ </method>
+
+ <method name="processCreateEx">
+ <desc>
+ Creates a new process running in the guest with the extended options
+ for setting the process priority and affinity.
+
+ See <link to="IGuestSession::processCreate"/> for more information.
+ </desc>
+ <param name="executable" type="wstring" dir="in">
+ <desc>
+ Full path to the file to execute in the guest. The file has to
+ exists in the guest VM with executable right to the session user in
+ order to succeed. If empty/null, the first entry in the
+ @a arguments array will be used instead (i.e. argv[0]).
+ </desc>
+ </param>
+ <param name="arguments" type="wstring" dir="in" safearray="yes">
+ <desc>Array of arguments passed to the new process.
+ <note>
+ Starting with VirtualBox 5.0 this array starts with argument 0
+ instead of argument 1 as in previous versions. Whether the zeroth
+ argument can be passed to the guest depends on the VBoxService
+ version running there. If you depend on this, check that the
+ <link to="IGuestSession::protocolVersion"/> is 3 or higher.
+ </note>
+ </desc>
+ </param>
+ <param name="environmentChanges" type="wstring" dir="in" safearray="yes">
+ <desc>
+ Set of environment changes to complement
+ <link to="IGuestSession::environmentChanges"/>. Takes precedence
+ over the session ones. The changes are in putenv format, i.e.
+ "VAR=VALUE" for setting and "VAR" for unsetting.
+
+ The changes are applied to the base environment of the impersonated
+ guest user (<link to="IGuestSession::environmentBase"/>) when
+ creating the process. (This is done on the guest side of things in
+ order to be compatible with older Guest Additions. That is one of
+ the motivations for not passing in the whole environment here.)
+ </desc>
+ </param>
+ <param name="flags" type="ProcessCreateFlag" dir="in" safearray="yes">
+ <desc>
+ Process creation flags, see <link to="ProcessCreateFlag"/> for
+ detailed description of available flags.
+ </desc>
+ </param>
+ <param name="timeoutMS" type="unsigned long" dir="in">
+ <desc>
+ Timeout (in ms) for limiting the guest process' running time.
+ Pass 0 for an infinite timeout. On timeout the guest process will be
+ killed and its status will be put to an appropriate value. See
+ <link to="ProcessStatus"/> for more information.
+ </desc>
+ </param>
+ <param name="priority" type="ProcessPriority" dir="in">
+ <desc>
+ Process priority to use for execution, see <link to="ProcessPriority"/>
+ for available priority levels.
+ <note>This is silently ignored if not supported by Guest Additions.</note>
+ </desc>
+ </param>
+ <param name="affinity" type="long" dir="in" safearray="yes">
+ <desc>
+ Processor affinity to set for the new process. This is a list of
+ guest CPU numbers the process is allowed to run on.
+ <note>
+ This is silently ignored if the guest does not support setting the
+ affinity of processes, or if the Guest Additions does not implemet
+ this feature.
+ </note>
+ </desc>
+ </param>
+ <param name="guestProcess" type="IGuestProcess" dir="return">
+ <desc>Guest process object of the newly created process.</desc>
+ </param>
+ </method>
+
+ <method name="processGet">
+ <desc>
+ Gets a certain guest process by its process ID (PID).
+ </desc>
+ <param name="pid" type="unsigned long" dir="in">
+ <desc>Process ID (PID) to get guest process for.</desc>
+ </param>
+ <param name="guestProcess" type="IGuestProcess" dir="return">
+ <desc>Guest process of specified process ID (PID).</desc>
+ </param>
+ </method>
+
+ <!-- Symbolic link methods -->
+
+ <method name="symlinkCreate">
+ <desc>
+ Creates a symbolic link in the guest.
+
+ <result name="E_NOTIMPL">
+ The method is not implemented yet.
+ </result>
+ </desc>
+ <param name="symlink" type="wstring" dir="in">
+ <desc>Path to the symbolic link that should be created. Guest path
+ style.</desc>
+ </param>
+ <param name="target" type="wstring" dir="in">
+ <desc>
+ The path to the symbolic link target. If not an absolute, this will
+ be relative to the @a symlink location at access time. Guest path
+ style.
+ </desc>
+ </param>
+ <param name="type" type="SymlinkType" dir="in">
+ <desc>
+ The symbolic link type (mainly for Windows). See <link to="SymlinkType"/>
+ for more information.
+ </desc>
+ </param>
+ </method>
+
+ <method name="symlinkExists">
+ <desc>
+ Checks whether a symbolic link exists in the guest.
+
+ <result name="E_NOTIMPL">
+ The method is not implemented yet.
+ </result>
+ </desc>
+ <param name="symlink" type="wstring" dir="in">
+ <desc>Path to the alleged symbolic link. Guest path style.</desc>
+ </param>
+ <param name="exists" type="boolean" dir="return">
+ <desc>
+ Returns @c true if the symbolic link exists. Returns @c false if it
+ does not exist, if the file system object identified by the path is
+ not a symbolic link, or if the object type is inaccessible to the
+ user, or if the @a symlink argument is empty.
+ </desc>
+ </param>
+ </method>
+
+ <method name="symlinkRead">
+ <desc>
+ Reads the target value of a symbolic link in the guest.
+
+ <result name="E_NOTIMPL">
+ The method is not implemented yet.
+ </result>
+ </desc>
+ <param name="symlink" type="wstring" dir="in">
+ <desc>Path to the symbolic link to read.</desc>
+ </param>
+ <param name="flags" type="SymlinkReadFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="SymlinkReadFlag"/> values.</desc>
+ </param>
+ <param name="target" type="wstring" dir="return">
+ <desc>Target value of the symbolic link. Guest path style.</desc>
+ </param>
+ </method>
+
+ <!-- Session wait methods -->
+
+ <method name="waitFor">
+ <desc>
+ Waits for one or more events to happen.
+ </desc>
+ <param name="waitFor" type="unsigned long" dir="in">
+ <desc>
+ Specifies what to wait for;
+ see <link to="GuestSessionWaitForFlag"/> for more information.
+ </desc>
+ </param>
+ <param name="timeoutMS" type="unsigned long" dir="in">
+ <desc>
+ Timeout (in ms) to wait for the operation to complete.
+ Pass 0 for an infinite timeout.
+ </desc>
+ </param>
+ <param name="reason" type="GuestSessionWaitResult" dir="return">
+ <desc>
+ The overall wait result;
+ see <link to="GuestSessionWaitResult"/> for more information.
+ </desc>
+ </param>
+ </method>
+
+ <method name="waitForArray">
+ <desc>
+ Waits for one or more events to happen.
+ Scriptable version of <link to="#waitFor" />.
+ </desc>
+ <param name="waitFor" type="GuestSessionWaitForFlag" dir="in" safearray="yes">
+ <desc>
+ Specifies what to wait for;
+ see <link to="GuestSessionWaitForFlag"/> for more information.
+ </desc>
+ </param>
+ <param name="timeoutMS" type="unsigned long" dir="in">
+ <desc>
+ Timeout (in ms) to wait for the operation to complete.
+ Pass 0 for an infinite timeout.
+ </desc>
+ </param>
+ <param name="reason" type="GuestSessionWaitResult" dir="return">
+ <desc>
+ The overall wait result;
+ see <link to="GuestSessionWaitResult"/> for more information.
+ </desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <interface
+ name="IProcess" extends="$unknown"
+ uuid="bc68370c-8a02-45f3-a07d-a67aa72756aa"
+ wsmap="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>
+ Abstract parent interface for processes handled by VirtualBox.
+ </desc>
+
+ <attribute name="arguments" type="wstring" readonly="yes" safearray="yes">
+ <desc>
+ The arguments this process is using for execution.
+ </desc>
+ </attribute>
+ <attribute name="environment" type="wstring" readonly="yes" safearray="yes">
+ <desc>
+ The initial process environment. Not yet implemented.
+ </desc>
+ </attribute>
+ <attribute name="eventSource" type="IEventSource" readonly="yes">
+ <desc>
+ Event source for process events.
+ </desc>
+ </attribute>
+ <attribute name="executablePath" type="wstring" readonly="yes">
+ <desc>Full path of the actual executable image.</desc>
+ </attribute>
+ <attribute name="exitCode" type="long" readonly="yes">
+ <desc>
+ The exit code. Only available when the process has been
+ terminated normally.
+ </desc>
+ </attribute>
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>
+ The friendly name of this process.
+ </desc>
+ </attribute>
+ <attribute name="PID" type="unsigned long" readonly="yes">
+ <desc>
+ The process ID (PID).
+ </desc>
+ </attribute>
+ <attribute name="status" type="ProcessStatus" readonly="yes">
+ <desc>
+ The current process status; see <link to="ProcessStatus"/>
+ for more information.
+ </desc>
+ </attribute>
+
+ <method name="waitFor">
+ <desc>
+ Waits for one or more events to happen.
+ </desc>
+ <param name="waitFor" type="unsigned long" dir="in">
+ <desc>
+ Specifies what to wait for;
+ see <link to="ProcessWaitForFlag"/> for more information.
+ </desc>
+ </param>
+ <param name="timeoutMS" type="unsigned long" dir="in">
+ <desc>
+ Timeout (in ms) to wait for the operation to complete.
+ Pass 0 for an infinite timeout.
+ </desc>
+ </param>
+ <param name="reason" type="ProcessWaitResult" dir="return">
+ <desc>
+ The overall wait result;
+ see <link to="ProcessWaitResult"/> for more information.
+ </desc>
+ </param>
+ </method>
+
+ <method name="waitForArray">
+ <desc>
+ Waits for one or more events to happen.
+ Scriptable version of <link to="#waitFor" />.
+ </desc>
+ <param name="waitFor" type="ProcessWaitForFlag" dir="in" safearray="yes">
+ <desc>
+ Specifies what to wait for;
+ see <link to="ProcessWaitForFlag"/> for more information.
+ </desc>
+ </param>
+ <param name="timeoutMS" type="unsigned long" dir="in">
+ <desc>
+ Timeout (in ms) to wait for the operation to complete.
+ Pass 0 for an infinite timeout.
+ </desc>
+ </param>
+ <param name="reason" type="ProcessWaitResult" dir="return">
+ <desc>
+ The overall wait result;
+ see <link to="ProcessWaitResult"/> for more information.
+ </desc>
+ </param>
+ </method>
+
+ <method name="read">
+ <desc>
+ Reads data from a running process.
+ </desc>
+ <param name="handle" type="unsigned long" dir="in">
+ <desc>Handle to read from. Usually 0 is stdin.</desc>
+ </param>
+ <param name="toRead" type="unsigned long" dir="in">
+ <desc>Number of bytes to read.</desc>
+ </param>
+ <param name="timeoutMS" type="unsigned long" dir="in">
+ <desc>
+ Timeout (in ms) to wait for the operation to complete.
+ Pass 0 for an infinite timeout.
+ </desc>
+ </param>
+ <param name="data" type="octet" dir="return" safearray="yes">
+ <desc>Array of data read.</desc>
+ </param>
+ </method>
+
+ <method name="write">
+ <desc>
+ Writes data to a running process.
+ </desc>
+ <param name="handle" type="unsigned long" dir="in">
+ <desc>Handle to write to. Usually 0 is stdin, 1 is stdout and 2 is stderr.</desc>
+ </param>
+ <param name="flags" type="unsigned long" dir="in">
+ <desc>
+ A combination of <link to="ProcessInputFlag"/> flags.
+ </desc>
+ </param>
+ <param name="data" type="octet" dir="in" safearray="yes">
+ <desc>
+ Array of bytes to write. The size of the array also specifies
+ how much to write.
+ </desc>
+ </param>
+ <param name="timeoutMS" type="unsigned long" dir="in">
+ <desc>
+ Timeout (in ms) to wait for the operation to complete.
+ Pass 0 for an infinite timeout.
+ </desc>
+ </param>
+ <param name="written" type="unsigned long" dir="return">
+ <desc>How many bytes were written.</desc>
+ </param>
+ </method>
+
+ <method name="writeArray">
+ <desc>
+ Writes data to a running process.
+ Scriptable version of <link to="#write" />.
+ </desc>
+ <param name="handle" type="unsigned long" dir="in">
+ <desc>Handle to write to. Usually 0 is stdin, 1 is stdout and 2 is stderr.</desc>
+ </param>
+ <param name="flags" type="ProcessInputFlag" dir="in" safearray="yes">
+ <desc>
+ A combination of <link to="ProcessInputFlag"/> flags.
+ </desc>
+ </param>
+ <param name="data" type="octet" dir="in" safearray="yes">
+ <desc>
+ Array of bytes to write. The size of the array also specifies
+ how much to write.
+ </desc>
+ </param>
+ <param name="timeoutMS" type="unsigned long" dir="in">
+ <desc>
+ Timeout (in ms) to wait for the operation to complete.
+ Pass 0 for an infinite timeout.
+ </desc>
+ </param>
+ <param name="written" type="unsigned long" dir="return">
+ <desc>How may bytes were written.</desc>
+ </param>
+ </method>
+
+ <method name="terminate">
+ <desc>
+ Terminates (kills) a running process.
+ <note>It can take up to 30 seconds to get a guest process killed. In
+ case a guest process could not be killed an appropriate error is
+ returned.</note>
+ </desc>
+ </method>
+ </interface>
+
+ <interface
+ name="IGuestProcess" extends="IProcess"
+ uuid="35cf4b3f-4453-4f3e-c9b8-5686939c80b6"
+ wsmap="managed"
+ >
+ <desc>
+ Implementation of the <link to="IProcess" /> object
+ for processes the host has started in the guest.
+ </desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="IDirectory" extends="$unknown"
+ uuid="758d7eac-e4b1-486a-8f2e-747ae346c3e9"
+ wsmap="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>
+ Abstract parent interface for directories handled by VirtualBox.
+ </desc>
+
+ <attribute name="directoryName" type="wstring" readonly="yes">
+ <desc>The path specified when opening the directory.</desc>
+ </attribute>
+
+ <attribute name="filter" type="wstring" readonly="yes">
+ <desc>Directory listing filter to (specified when opening the directory).</desc>
+ </attribute>
+
+ <method name="close">
+ <desc>
+ Closes this directory. After closing operations like reading the next
+ directory entry will not be possible anymore.
+ </desc>
+ </method>
+
+ <method name="read">
+ <desc>
+ Reads the next directory entry of this directory.
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ No more directory entries to read.
+ </result>
+ </desc>
+ <param name="objInfo" type="IFsObjInfo" dir="return">
+ <desc>Object information of the current directory entry read. Also see
+ <link to="IFsObjInfo"/>.</desc>
+ </param>
+ </method>
+
+ <!-- Would be useful to add queryInfo() and setACL() here later, but at
+ present IPRT isn't doing a race free job with the former and doesn't
+ have the latter. So, let it be for now. -->
+
+ </interface>
+
+ <interface
+ name="IGuestDirectory" extends="IDirectory"
+ uuid="cc830458-4974-a19c-4dc6-cc98c2269626"
+ wsmap="managed"
+ >
+ <desc>
+ Implementation of the <link to="IDirectory" /> object
+ for directories in the guest.
+ </desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="IFile" extends="$unknown"
+ uuid="59a235ac-2f1a-4d6c-81fc-e3fa843f49ae"
+ wsmap="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>
+ Abstract parent interface for files handled by VirtualBox.
+ </desc>
+
+ <attribute name="eventSource" type="IEventSource" readonly="yes">
+ <desc>
+ Event source for file events.
+ </desc>
+ </attribute>
+ <attribute name="id" type="unsigned long" readonly="yes">
+ <desc>
+ The ID VirtualBox internally assigned to the open file.
+ </desc>
+ </attribute>
+ <attribute name="initialSize" type="long long" readonly="yes">
+ <desc>
+ The initial size in bytes when opened.
+ </desc>
+ </attribute>
+ <attribute name="offset" type="long long" readonly="yes">
+ <desc>
+ The current file position.
+
+ The file current position always applies to the <link to="IFile::read"/>
+ method, which updates it upon return. Same goes for the <link to="IFile::write"/>
+ method except when <link to="IFile::accessMode"/> is <link to="FileAccessMode_AppendOnly"/>
+ or <link to="FileAccessMode_AppendRead"/>, where it will always write
+ to the end of the file and will leave this attribute unchanged.
+
+ The <link to="IFile::seek"/> is used to change this attribute without
+ transfering any file data like read and write does.
+
+ <note> This will not always be correct with older Guest Additions
+ (version 5.2.30 and earlier, as well as versions 6.0.0 thru 6.0.8)
+ after a calling <link to="IFile::readAt"/> or <link to="IFile::writeAt"/>,
+ or after calling <link to="IFile::write"/> on a file in append mode.
+ The correct file offset can be obtained using <link to="IFile::seek"/>.</note>
+
+ </desc>
+ </attribute>
+ <attribute name="status" type="FileStatus" readonly="yes">
+ <desc>
+ Current file status.
+ </desc>
+ </attribute>
+
+ <!-- The following attributes just remembers the fileOpen parameters for you.
+ Nice for introspection and probably doesn't cost us much. -->
+ <attribute name="filename" type="wstring" readonly="yes">
+ <desc>Full path of the actual file name of this file.
+ <!-- r=bird: The 'actual' file name is too tough, we cannot guarentee
+ that on unix guests. Seeing how IGuestDirectory did things,
+ I'm questioning the 'Full path' part too. Not urgent to check. -->
+ </desc>
+ </attribute>
+ <attribute name="creationMode" type="unsigned long" readonly="yes">
+ <desc>The UNIX-style creation mode specified when opening the file.</desc>
+ </attribute>
+ <attribute name="openAction" type="FileOpenAction" readonly="yes">
+ <desc>The opening action specified when opening the file.</desc>
+ </attribute>
+ <attribute name="accessMode" type="FileAccessMode" readonly="yes">
+ <desc>The file access mode.</desc>
+ </attribute>
+
+ <method name="close">
+ <desc>
+ Closes this file. After closing operations like reading data,
+ writing data or querying information will not be possible anymore.
+ </desc>
+ </method>
+
+ <method name="queryInfo">
+ <desc>
+ Queries information about this file.
+ </desc>
+ <param name="objInfo" type="IFsObjInfo" dir="return">
+ <desc>Object information of this file. Also see
+ <link to="IFsObjInfo"/>.</desc>
+ </param>
+ </method>
+
+ <method name="querySize">
+ <!-- Can also be gotten via seek(Current, 0), but this is easier to us.
+ This is a query method both to match IGuestSession::fileQuerySize to
+ highlight that it is a value that is not cacheable as others may be
+ changing the file concurrently (imagine reading /var/log/messages). -->
+ <desc>
+ Queries the current file size.
+ </desc>
+ <param name="size" type="long long" dir="return">
+ <desc>Queried file size.</desc>
+ </param>
+ </method>
+
+ <method name="read">
+ <desc>
+ Reads data from this file.
+
+ The file current position (<link to="IFile::offset"/>) is updated on success.
+ </desc>
+ <param name="toRead" type="unsigned long" dir="in">
+ <desc>Number of bytes to read.</desc>
+ </param>
+ <param name="timeoutMS" type="unsigned long" dir="in">
+ <desc>
+ Timeout (in ms) to wait for the operation to complete.
+ Pass 0 for an infinite timeout.
+ </desc>
+ </param>
+ <param name="data" type="octet" dir="return" safearray="yes">
+ <desc>Array of data read.</desc>
+ </param>
+ </method>
+
+ <method name="readAt">
+ <desc>
+ Reads data from an offset of this file.
+
+ The file current position (<link to="IFile::offset"/>) is updated on success.
+ </desc>
+ <param name="offset" type="long long" dir="in">
+ <desc>Offset in bytes to start reading.</desc>
+ </param>
+ <param name="toRead" type="unsigned long" dir="in">
+ <desc>Number of bytes to read.</desc>
+ </param>
+ <param name="timeoutMS" type="unsigned long" dir="in">
+ <desc>
+ Timeout (in ms) to wait for the operation to complete.
+ Pass 0 for an infinite timeout.
+ </desc>
+ </param>
+ <param name="data" type="octet" dir="return" safearray="yes">
+ <desc>Array of data read.</desc>
+ </param>
+ </method>
+
+ <method name="seek">
+ <desc>
+ Changes the current file position of this file.
+
+ The file current position always applies to the <link to="IFile::read"/>
+ method. Same for the <link to="IFile::write"/> method it except when
+ the <link to="IFile::accessMode"/> is <link to="FileAccessMode_AppendOnly"/>
+ or <link to="FileAccessMode_AppendRead"/>.
+ </desc>
+ <param name="offset" type="long long" dir="in">
+ <desc>Offset to seek relative to the position specified by @a whence.</desc>
+ </param>
+ <param name="whence" type="FileSeekOrigin" dir="in">
+ <desc>
+ One of the <link to="FileSeekOrigin"/> seek starting points.
+ </desc>
+ </param>
+ <param name="newOffset" type="long long" dir="return">
+ <desc>The new file offset after the seek operation.</desc>
+ </param>
+ </method>
+
+ <method name="setACL">
+ <desc>
+ Sets the ACL of this file.
+
+ <result name="E_NOTIMPL">
+ The method is not implemented yet.
+ </result>
+ </desc>
+ <param name="acl" type="wstring" dir="in">
+ <desc>The ACL specification string. To-be-defined.</desc>
+ </param>
+ <param name="mode" type="unsigned long" dir="in">
+ <desc>UNIX-style mode mask to use if @a acl is empty. As mention in
+ <link to="IGuestSession::directoryCreate"/> this is realized on
+ a best effort basis and the exact behavior depends on the Guest OS.
+ </desc>
+ </param>
+ </method>
+
+ <method name="setSize">
+ <desc>
+ Changes the file size.
+ </desc>
+ <param name="size" type="long long" dir="in">
+ <desc>The new file size.</desc>
+ </param>
+ </method>
+
+ <method name="write">
+ <desc>
+ Writes bytes to this file.
+
+ The file current position (<link to="IFile::offset"/>) is updated on success.
+ </desc>
+ <param name="data" type="octet" dir="in" safearray="yes">
+ <desc>
+ Array of bytes to write. The size of the array also specifies
+ how much to write.
+ </desc>
+ </param>
+ <param name="timeoutMS" type="unsigned long" dir="in">
+ <desc>
+ Timeout (in ms) to wait for the operation to complete.
+ Pass 0 for an infinite timeout.
+ </desc>
+ </param>
+ <param name="written" type="unsigned long" dir="return">
+ <desc>How many bytes were written.</desc>
+ </param>
+ </method>
+
+ <method name="writeAt">
+ <desc>
+ Writes bytes at a certain offset to this file.
+
+ The file current position (<link to="IFile::offset"/>) is updated on success.
+ </desc>
+ <param name="offset" type="long long" dir="in">
+ <desc>Offset in bytes to start writing. If the file was opened with the
+ <link to="IFile::accessMode"/> set to <link to="FileAccessMode_AppendOnly"/>
+ or <link to="FileAccessMode_AppendRead"/>, the offset is ignored and the
+ write always goes to the end of the file.</desc>
+ </param>
+ <param name="data" type="octet" dir="in" safearray="yes">
+ <desc>
+ Array of bytes to write. The size of the array also specifies
+ how much to write.
+ </desc>
+ </param>
+ <param name="timeoutMS" type="unsigned long" dir="in">
+ <desc>
+ Timeout (in ms) to wait for the operation to complete.
+ Pass 0 for an infinite timeout.
+ </desc>
+ </param>
+ <param name="written" type="unsigned long" dir="return">
+ <desc>How many bytes were written.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <interface
+ name="IGuestFile" extends="IFile"
+ uuid="92f21dc0-44de-1653-b717-2ebf0ca9b664"
+ wsmap="managed"
+ >
+ <desc>
+ Implementation of the <link to="IFile" /> object
+ for files in the guest.
+ </desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="IFsInfo" extends="$unknown"
+ uuid="3db2ab1a-6cf7-42f1-8bf5-e1c0553e0b30"
+ wsmap="managed"
+ reservedAttributes="8"
+ >
+ <desc>
+ Abstract parent interface for VirtualBox file system information.
+ This can be information about a host or guest file system, for example.
+ </desc>
+
+ <attribute name="freeSize" type="long long" readonly="yes">
+ <desc>
+ Remaining free space (in bytes) of the filesystem.
+ </desc>
+ </attribute>
+ <attribute name="totalSize" type="long long" readonly="yes">
+ <desc>
+ Total space (in bytes) of the filesystem.
+ </desc>
+ </attribute>
+ <attribute name="blockSize" type="unsigned long" readonly="yes">
+ <desc>
+ Block size (in bytes) of the filesystem.
+ </desc>
+ </attribute>
+ <attribute name="sectorSize" type="unsigned long" readonly="yes">
+ <desc>
+ Sector size (in bytes) of the filesystem.
+ </desc>
+ </attribute>
+ <attribute name="serialNumber" type="unsigned long" readonly="yes">
+ <desc>
+ Serial number of the filesystem.
+ </desc>
+ </attribute>
+ <attribute name="isRemote" type="boolean" readonly="yes">
+ <desc>
+ @c TRUE if the filesystem is remote, @c FALSE if the filesystem is local.
+ </desc>
+ </attribute>
+ <attribute name="isCaseSensitive" type="boolean" readonly="yes">
+ <desc>
+ @c TRUE if the filesystem is case sensitive, @c FALSE if the filesystem is case insensitive.
+ </desc>
+ </attribute>
+ <attribute name="isReadOnly" type="boolean" readonly="yes">
+ <desc>
+ @c TRUE if the filesystem is mounted read only, @c FALSE if the filesystem is mounted read write.
+ </desc>
+ </attribute>
+ <attribute name="isCompressed" type="boolean" readonly="yes">
+ <desc>
+ @c TRUE if the filesystem is compressed, @c FALSE if it isn't or we don't know.
+ </desc>
+ </attribute>
+ <attribute name="supportsFileCompression" type="boolean" readonly="yes">
+ <desc>
+ @c TRUE if the filesystem compresses of individual files, @c FALSE if it doesn't or we don't know.
+ </desc>
+ </attribute>
+ <attribute name="maxComponent" type="unsigned long" readonly="yes">
+ <desc>
+ The maximum size of a filesystem object name.
+ </desc>
+ </attribute>
+ <attribute name="type" type="wstring" readonly="yes">
+ <desc>
+ Name of the filesystem.
+ </desc>
+ </attribute>
+ <attribute name="label" type="wstring" readonly="yes">
+ <desc>
+ Label of the filesystem.
+ </desc>
+ </attribute>
+ <attribute name="mountPoint" type="wstring" readonly="yes">
+ <desc>
+ Mount point of the filesystem.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IFsObjInfo" extends="$unknown"
+ uuid="081fc833-c6fa-430e-6020-6a505d086387"
+ wsmap="managed"
+ reservedAttributes="8"
+ >
+ <desc>
+ Abstract parent interface for VirtualBox file system object information.
+ This can be information about a file or a directory, for example.
+ </desc>
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>
+ The object's name.
+ </desc>
+ </attribute>
+ <attribute name="type" type="FsObjType" readonly="yes">
+ <desc>
+ The object type. See <link to="FsObjType" /> for more.
+ </desc>
+ </attribute>
+ <attribute name="fileAttributes" type="wstring" readonly="yes">
+ <desc>
+ File attributes. Not implemented yet.
+ </desc>
+ </attribute>
+ <attribute name="objectSize" type="long long" readonly="yes">
+ <desc>
+ The logical size (st_size). For normal files this is the size of the file.
+ For symbolic links, this is the length of the path name contained in the
+ symbolic link. For other objects this fields needs to be specified.
+ </desc>
+ </attribute>
+ <attribute name="allocatedSize" type="long long" readonly="yes">
+ <desc>
+ Disk allocation size (st_blocks * DEV_BSIZE).
+ </desc>
+ </attribute>
+ <!-- Time attributes: -->
+ <attribute name="accessTime" type="long long" readonly="yes">
+ <desc>
+ Time of last access (st_atime).
+ </desc>
+ </attribute>
+ <attribute name="birthTime" type="long long" readonly="yes">
+ <desc>
+ Time of file birth (st_birthtime).
+ </desc>
+ </attribute>
+ <attribute name="changeTime" type="long long" readonly="yes">
+ <desc>
+ Time of last status change (st_ctime).
+ </desc>
+ </attribute>
+ <attribute name="modificationTime" type="long long" readonly="yes">
+ <desc>
+ Time of last data modification (st_mtime).
+ </desc>
+ </attribute>
+ <!-- Ownership attributes: -->
+ <attribute name="UID" type="long" readonly="yes">
+ <desc>
+ The user owning the filesystem object (st_uid). This is -1 if not available.
+ </desc>
+ </attribute>
+ <attribute name="userName" type="wstring" readonly="yes">
+ <desc>
+ The user name.
+ </desc>
+ </attribute>
+ <attribute name="GID" type="long" readonly="yes">
+ <desc>
+ The group the filesystem object is assigned (st_gid). This is -1 if not available.
+ </desc>
+ </attribute>
+ <attribute name="groupName" type="wstring" readonly="yes">
+ <desc>
+ The group name.
+ </desc>
+ </attribute>
+ <!-- More esoteric attributes: -->
+ <attribute name="nodeId" type="long long" readonly="yes">
+ <desc>
+ The unique identifier (within the filesystem) of this filesystem object (st_ino).
+ This is zero if not availalbe.
+ </desc>
+ </attribute>
+ <attribute name="nodeIdDevice" type="unsigned long" readonly="yes">
+ <desc>
+ The device number of the device which this filesystem object resides on (st_dev).
+ </desc>
+ </attribute>
+ <attribute name="hardLinks" type="unsigned long" readonly="yes">
+ <desc>
+ Number of hard links to this filesystem object (st_nlink).
+ </desc>
+ </attribute>
+ <attribute name="deviceNumber" type="unsigned long" readonly="yes">
+ <desc>
+ The device number of a character or block device type object (st_rdev).
+ </desc>
+ </attribute>
+ <attribute name="generationId" type="unsigned long" readonly="yes">
+ <desc>
+ The current generation number (st_gen).
+ </desc>
+ </attribute>
+ <attribute name="userFlags" type="unsigned long" readonly="yes">
+ <desc>
+ User flags (st_flags).
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IGuestFsInfo" extends="IFsInfo"
+ uuid="726eaca9-091e-41b4-bca6-355efe864107"
+ wsmap="managed"
+ >
+ <desc>
+ Represents the guest implementation of the
+ <link to="IFsInfo" /> object.
+ </desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="IGuestFsObjInfo" extends="IFsObjInfo"
+ uuid="6620db85-44e0-ca69-e9e0-d4907ceccbe5"
+ wsmap="managed"
+ >
+ <desc>
+ Represents the guest implementation of the
+ <link to="IFsObjInfo" /> object.
+ </desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="IGuest" extends="$unknown"
+ uuid="00892186-A4AF-4627-B21F-FC561CE4473C"
+ wsmap="managed"
+ reservedMethods="8" reservedAttributes="16"
+ >
+ <desc>
+ The IGuest interface represents information about the operating system
+ running inside the virtual machine. Used in
+ <link to="IConsole::guest"/>.
+
+ IGuest provides information about the guest operating system, whether
+ Guest Additions are installed and other OS-specific virtual machine
+ properties.
+ </desc>
+
+ <attribute name="OSTypeId" type="wstring" readonly="yes">
+ <desc>
+ Identifier of the Guest OS type as reported by the Guest
+ Additions.
+ You may use <link to="IVirtualBox::getGuestOSType"/> to obtain
+ an IGuestOSType object representing details about the given
+ Guest OS type.
+ <note>
+ If Guest Additions are not installed, this value will be
+ the same as <link to="IMachine::OSTypeId"/>.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="additionsRunLevel" type="AdditionsRunLevelType" readonly="yes">
+ <desc>
+ Current run level of the installed Guest Additions.
+ </desc>
+ </attribute>
+
+ <attribute name="additionsVersion" type="wstring" readonly="yes">
+ <desc>
+ Version of the installed Guest Additions in the same format as
+ <link to="IVirtualBox::version"/>.
+ </desc>
+ </attribute>
+
+ <attribute name="additionsRevision" type="unsigned long" readonly="yes">
+ <desc>
+ The internal build revision number of the installed Guest Additions.
+
+ See also <link to="IVirtualBox::revision"/>.
+ </desc>
+ </attribute>
+
+ <attribute name="dnDSource" type="IGuestDnDSource" readonly="yes">
+ <desc>
+ Retrieves the drag'n drop source implementation for the guest side, that
+ is, handling and retrieving drag'n drop data from the guest.
+ </desc>
+ </attribute>
+
+ <attribute name="dnDTarget" type="IGuestDnDTarget" readonly="yes">
+ <desc>
+ Retrieves the drag'n drop source implementation for the host side. This
+ will allow the host to handle and initiate a drag'n drop operation to copy
+ data from the host to the guest.
+ </desc>
+ </attribute>
+
+ <attribute name="eventSource" type="IEventSource" readonly="yes">
+ <desc>
+ Event source for guest events.
+ </desc>
+ </attribute>
+
+ <attribute name="facilities" type="IAdditionsFacility" readonly="yes" safearray="yes">
+ <desc>
+ Returns a collection of current known facilities. Only returns facilities where
+ a status is known, e.g. facilities with an unknown status will not be returned.
+ </desc>
+ </attribute>
+
+ <attribute name="sessions" type="IGuestSession" readonly="yes" safearray="yes">
+ <desc>Returns a collection of all opened guest sessions.</desc>
+ </attribute>
+
+ <attribute name="memoryBalloonSize" type="unsigned long">
+ <desc>Guest system memory balloon size in megabytes (transient property).</desc>
+ </attribute>
+
+ <attribute name="statisticsUpdateInterval" type="unsigned long">
+ <desc>Interval to update guest statistics in seconds.</desc>
+ </attribute>
+
+ <method name="internalGetStatistics">
+ <desc>
+ Internal method; do not use as it might change at any time.
+ </desc>
+ <param name="cpuUser" type="unsigned long" dir="out">
+ <desc>Percentage of processor time spent in user mode as seen by the guest.</desc>
+ </param>
+ <param name="cpuKernel" type="unsigned long" dir="out">
+ <desc>Percentage of processor time spent in kernel mode as seen by the guest.</desc>
+ </param>
+ <param name="cpuIdle" type="unsigned long" dir="out">
+ <desc>Percentage of processor time spent idling as seen by the guest.</desc>
+ </param>
+ <param name="memTotal" type="unsigned long" dir="out">
+ <desc>Total amount of physical guest RAM.</desc>
+ </param>
+ <param name="memFree" type="unsigned long" dir="out">
+ <desc>Free amount of physical guest RAM.</desc>
+ </param>
+ <param name="memBalloon" type="unsigned long" dir="out">
+ <desc>Amount of ballooned physical guest RAM.</desc>
+ </param>
+ <param name="memShared" type="unsigned long" dir="out">
+ <desc>Amount of shared physical guest RAM.</desc>
+ </param>
+ <param name="memCache" type="unsigned long" dir="out">
+ <desc>Total amount of guest (disk) cache memory.</desc>
+ </param>
+ <param name="pagedTotal" type="unsigned long" dir="out">
+ <desc>Total amount of space in the page file.</desc>
+ </param>
+ <param name="memAllocTotal" type="unsigned long" dir="out">
+ <desc>Total amount of memory allocated by the hypervisor.</desc>
+ </param>
+ <param name="memFreeTotal" type="unsigned long" dir="out">
+ <desc>Total amount of free memory available in the hypervisor.</desc>
+ </param>
+ <param name="memBalloonTotal" type="unsigned long" dir="out">
+ <desc>Total amount of memory ballooned by the hypervisor.</desc>
+ </param>
+ <param name="memSharedTotal" type="unsigned long" dir="out">
+ <desc>Total amount of shared memory in the hypervisor.</desc>
+ </param>
+ </method>
+
+ <method name="getFacilityStatus">
+ <desc>
+ Get the current status of a Guest Additions facility.
+ </desc>
+ <param name="facility" type="AdditionsFacilityType" dir="in">
+ <desc>Facility to check status for.</desc>
+ </param>
+ <param name="timestamp" type="long long" dir="out">
+ <desc>Timestamp (in ms) of last status update seen by the host.</desc>
+ </param>
+ <param name="status" type="AdditionsFacilityStatus" dir="return">
+ <desc>The current (latest) facility status.</desc>
+ </param>
+ </method>
+
+ <method name="getAdditionsStatus">
+ <desc>
+ Retrieve the current status of a certain Guest Additions run level.
+
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Wrong status level specified.
+ </result>
+
+ </desc>
+ <param name="level" type="AdditionsRunLevelType" dir="in">
+ <desc>Status level to check</desc>
+ </param>
+ <param name="active" type="boolean" dir="return">
+ <desc>Flag whether the status level has been reached or not</desc>
+ </param>
+ </method>
+
+ <method name="setCredentials">
+ <desc>
+ Store login credentials that can be queried by guest operating
+ systems with Additions installed. The credentials are transient
+ to the session and the guest may also choose to erase them. Note
+ that the caller cannot determine whether the guest operating system
+ has queried or made use of the credentials.
+
+ <result name="VBOX_E_VM_ERROR">
+ VMM device is not available.
+ </result>
+
+ </desc>
+ <param name="userName" type="wstring" dir="in">
+ <desc>User name string, can be empty</desc>
+ </param>
+ <param name="password" type="wstring" dir="in">
+ <desc>Password string, can be empty</desc>
+ </param>
+ <param name="domain" type="wstring" dir="in">
+ <desc>Domain name (guest logon scheme specific), can be empty</desc>
+ </param>
+ <param name="allowInteractiveLogon" type="boolean" dir="in">
+ <desc>
+ Flag whether the guest should alternatively allow the user to
+ interactively specify different credentials. This flag might
+ not be supported by all versions of the Additions.
+ </desc>
+ </param>
+ </method>
+
+ <method name="createSession">
+ <desc>
+ Creates a new guest session for controlling the guest. The new session
+ will be started asynchronously, meaning on return of this function it is
+ not guaranteed that the guest session is in a started and/or usable state.
+ To wait for successful startup, use the <link to="IGuestSession::waitFor"/>
+ call.
+
+ A guest session represents one impersonated user account in the guest, so
+ every operation will use the same credentials specified when creating
+ the session object via <link to="IGuest::createSession"/>. Anonymous
+ sessions, that is, sessions without specifying a valid
+ user account in the guest are not allowed reasons of security.
+
+ There can be a maximum of 32 sessions at once per VM. An error will
+ be returned if this has been reached.
+
+ For more information please consult <link to="IGuestSession"/>
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Error creating guest session.
+ </result>
+
+ <result name="VBOX_E_MAXIMUM_REACHED">
+ The maximum of concurrent guest sessions has been reached.
+ </result>
+ </desc>
+ <param name="user" type="wstring" dir="in">
+ <desc>
+ User name this session will be using to control the guest; has to exist
+ and have the appropriate rights to execute programs in the VM. Must not
+ be empty.
+ </desc>
+ </param>
+ <param name="password" type="wstring" dir="in">
+ <desc>
+ Password of the user account to be used. Empty passwords are allowed.
+ </desc>
+ </param>
+ <param name="domain" type="wstring" dir="in">
+ <desc>
+ Domain name of the user account to be used if the guest is part of
+ a domain. Optional. This feature is not implemented yet.
+ </desc>
+ </param>
+ <param name="sessionName" type="wstring" dir="in">
+ <desc>
+ The session's friendly name. Optional, can be empty.
+ </desc>
+ </param>
+ <param name="guestSession" type="IGuestSession" dir="return">
+ <desc>
+ The newly created session object.
+ </desc>
+ </param>
+ </method>
+
+ <method name="findSession">
+ <desc>
+ Finds guest sessions by their friendly name and returns an interface
+ array with all found guest sessions.
+ </desc>
+ <param name="sessionName" type="wstring" dir="in">
+ <desc>
+ The session's friendly name to find. Wildcards like ? and * are allowed.
+ </desc>
+ </param>
+ <param name="sessions" type="IGuestSession" safearray="yes" dir="return">
+ <desc>
+ Array with all guest sessions found matching the name specified.
+ </desc>
+ </param>
+ </method>
+
+ <method name="shutdown">
+ <desc>
+ Shuts down (and optionally halts and/or reboots) the guest.
+ Needs supported Guest Additions installed.
+
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Guest OS is not supported for shutting down, or the
+ already installed Guest Additions are not supported.
+ </result>
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Error while shutting down.
+ </result>
+
+ </desc>
+ <param name="flags" type="GuestShutdownFlag" dir="in" safearray="yes">
+ <desc>
+ <link to="GuestShutdownFlag"/> flags.
+ </desc>
+ </param>
+ </method>
+
+ <method name="updateGuestAdditions">
+ <desc>
+ Automatically updates already installed Guest Additions in a VM.
+
+ At the moment only Windows and Linux guests are supported.
+
+ Because the VirtualBox Guest Additions drivers are not WHQL-certified
+ yet there might be warning dialogs during the actual Guest Additions
+ update. These need to be confirmed manually in order to continue the
+ installation process. This applies to Windows 2000 and Windows XP guests
+ and therefore these guests can't be updated in a fully automated fashion
+ without user interaction. However, to start a Guest Additions update for
+ the mentioned Windows versions anyway, the flag
+ AdditionsUpdateFlag_WaitForUpdateStartOnly can be specified. See
+ <link to="AdditionsUpdateFlag"/> for more information.
+
+ The guest needs to be restarted in order to make use of the updated
+ Guest Additions.
+
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Guest OS is not supported for automated Guest Additions updates or the
+ already installed Guest Additions are not ready yet.
+ </result>
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Error while updating.
+ </result>
+
+ </desc>
+ <param name="source" type="wstring" dir="in">
+ <desc>
+ Path to the Guest Additions .ISO file to use for the update.
+ </desc>
+ </param>
+ <param name="arguments" type="wstring" dir="in" safearray="yes">
+ <desc>
+ Optional command line arguments to use for the Guest Additions
+ installer. Useful for retrofitting features which weren't installed
+ before in the guest.
+ </desc>
+ </param>
+ <param name="flags" type="AdditionsUpdateFlag" dir="in" safearray="yes">
+ <desc>
+ <link to="AdditionsUpdateFlag"/> flags.
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+
+ <!--
+ // IProgress
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IProgress" extends="$unknown"
+ uuid="d7b98d2b-30e8-447e-99cb-e31becae6ae4"
+ wsmap="managed"
+ rest="managed"
+ wrap-hint-server-addinterfaces="IInternalProgressControl"
+ reservedMethods="8" reservedAttributes="12"
+ >
+ <desc>
+ The IProgress interface is used to track and control
+ asynchronous tasks within VirtualBox.
+
+ An instance of this is returned every time VirtualBox starts
+ an asynchronous task (in other words, a separate thread) which
+ continues to run after a method call returns. For example,
+ <link to="IMachine::saveState" />, which saves the state of
+ a running virtual machine, can take a long time to complete.
+ To be able to display a progress bar, a user interface such as
+ the VirtualBox graphical user interface can use the IProgress
+ object returned by that method.
+
+ Note that IProgress is a "read-only" interface in the sense
+ that only the VirtualBox internals behind the Main API can
+ create and manipulate progress objects, whereas client code
+ can only use the IProgress object to monitor a task's
+ progress and, if <link to="#cancelable" /> is @c true,
+ cancel the task by calling <link to="#cancel" />.
+
+ A task represented by IProgress consists of either one or
+ several sub-operations that run sequentially, one by one (see
+ <link to="#operation" /> and <link to="#operationCount" />).
+ Every operation is identified by a number (starting from 0)
+ and has a separate description.
+
+ You can find the individual percentage of completion of the current
+ operation in <link to="#operationPercent" /> and the
+ percentage of completion of the task as a whole
+ in <link to="#percent" />.
+
+ Similarly, you can wait for the completion of a particular
+ operation via <link to="#waitForOperationCompletion" /> or
+ for the completion of the whole task via
+ <link to="#waitForCompletion" />.
+ </desc>
+
+ <attribute name="id" type="uuid" mod="string" readonly="yes">
+ <desc>ID of the task.</desc>
+ </attribute>
+
+ <attribute name="description" type="wstring" readonly="yes">
+ <desc>Description of the task.</desc>
+ </attribute>
+
+ <attribute name="initiator" type="$unknown" readonly="yes">
+ <desc>Initiator of the task.</desc>
+ </attribute>
+
+ <attribute name="cancelable" type="boolean" readonly="yes">
+ <desc>Whether the task can be interrupted.</desc>
+ </attribute>
+
+ <attribute name="percent" type="unsigned long" readonly="yes">
+ <desc>
+ Current progress value of the task as a whole, in percent.
+ This value depends on how many operations are already complete.
+ Returns 100 if <link to="#completed" /> is @c true.
+ </desc>
+ </attribute>
+
+ <attribute name="timeRemaining" type="long" readonly="yes">
+ <desc>
+ Estimated remaining time until the task completes, in
+ seconds. Returns 0 once the task has completed; returns -1
+ if the remaining time cannot be computed, in particular if
+ the current progress is 0.
+
+ Even if a value is returned, the estimate will be unreliable
+ for low progress values. It will become more reliable as the
+ task progresses; it is not recommended to display an ETA
+ before at least 20% of a task have completed.
+ </desc>
+ </attribute>
+
+ <attribute name="completed" type="boolean" readonly="yes">
+ <desc>Whether the task has been completed.</desc>
+ </attribute>
+
+ <attribute name="canceled" type="boolean" readonly="yes">
+ <desc>Whether the task has been canceled.</desc>
+ </attribute>
+
+ <attribute name="resultCode" type="long" readonly="yes">
+ <desc>
+ Result code of the progress task.
+ Valid only if <link to="#completed"/> is @c true.
+ </desc>
+ </attribute>
+
+ <attribute name="errorInfo" type="IVirtualBoxErrorInfo" readonly="yes">
+ <desc>
+ Extended information about the unsuccessful result of the
+ progress operation. May be @c null if no extended information
+ is available.
+ Valid only if <link to="#completed"/> is @c true and
+ <link to="#resultCode"/> indicates a failure.
+ </desc>
+ </attribute>
+
+ <attribute name="operationCount" type="unsigned long" readonly="yes">
+ <desc>
+ Number of sub-operations this task is divided into.
+ Every task consists of at least one suboperation.
+ </desc>
+ </attribute>
+
+ <attribute name="operation" type="unsigned long" readonly="yes">
+ <desc>Number of the sub-operation being currently executed.</desc>
+ </attribute>
+
+ <attribute name="operationDescription" type="wstring" readonly="yes">
+ <desc>
+ Description of the sub-operation being currently executed.
+ </desc>
+ </attribute>
+
+ <attribute name="operationPercent" type="unsigned long" readonly="yes">
+ <desc>Progress value of the current sub-operation only, in percent.</desc>
+ </attribute>
+
+ <attribute name="operationWeight" type="unsigned long" readonly="yes">
+ <desc>Weight value of the current sub-operation only.</desc>
+ </attribute>
+
+ <attribute name="timeout" type="unsigned long">
+ <desc>
+ When non-zero, this specifies the number of milliseconds after which
+ the operation will automatically be canceled. This can only be set on
+ cancelable objects.
+ </desc>
+ </attribute>
+
+ <attribute name="eventSource" type="IEventSource" readonly="yes" rest="suppress"/>
+
+ <method name="waitForCompletion">
+ <rest request="post" path="/progresses/{progressid}/actions/"/>
+ <desc>
+ Waits until the task is done (including all sub-operations)
+ with a given timeout in milliseconds; specify -1 for an indefinite wait.
+
+ Note that the VirtualBox/XPCOM/COM/native event queues of the calling
+ thread are not processed while waiting. Neglecting event queues may
+ have dire consequences (degrade performance, resource hogs,
+ deadlocks, etc.), this is specially so for the main thread on
+ platforms using XPCOM. Callers are advised wait for short periods
+ and service their event queues between calls, or to create a worker
+ thread to do the waiting.
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Failed to wait for task completion.
+ </result>
+ </desc>
+
+ <param name="timeout" type="long" dir="in">
+ <desc>
+ Maximum time in milliseconds to wait or -1 to wait indefinitely.
+ </desc>
+ </param>
+ </method>
+
+ <method name="waitForOperationCompletion">
+ <rest request="post" path="/progresses/{progressid}/actions/"/>
+ <desc>
+ Waits until the given operation is done with a given timeout in
+ milliseconds; specify -1 for an indefinite wait.
+
+ See <link to="#waitForCompletion"> for event queue considerations.</link>
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Failed to wait for operation completion.
+ </result>
+
+ </desc>
+ <param name="operation" type="unsigned long" dir="in">
+ <desc>
+ Number of the operation to wait for.
+ Must be less than <link to="#operationCount"/>.
+ </desc>
+ </param>
+ <param name="timeout" type="long" dir="in">
+ <desc>
+ Maximum time in milliseconds to wait or -1 to wait indefinitely.
+ </desc>
+ </param>
+ </method>
+
+ <method name="cancel">
+ <rest request="post" path="/progresses/{progressid}/actions/"/>
+ <desc>
+ Cancels the task.
+ <note>
+ If <link to="#cancelable"/> is @c false, then this method will fail.
+ </note>
+
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Operation cannot be canceled.
+ </result>
+
+ </desc>
+ </method>
+
+ </interface>
+
+ <interface
+ name="IInternalProgressControl" extends="$unknown"
+ uuid="41a033b8-cc87-4f6e-a0e9-47bb7f2d4be5"
+ internal="yes"
+ wsmap="suppress"
+ reservedMethods="8" reservedAttributes="8"
+ >
+
+ <method name="setCurrentOperationProgress">
+ <desc>Internal method, not to be called externally.</desc>
+ <param name="percent" type="unsigned long" dir="in" />
+ </method>
+
+ <method name="waitForOtherProgressCompletion">
+ <desc>
+ Internal method, not to be called externally.
+
+ Waits until the other task is completed (including all sub-operations)
+ and forward all changes from the other progress to this progress. This
+ means sub-operation number, description, percent and so on.
+
+ The caller is responsible for having at least the same count of
+ sub-operations in this progress object as there are in the other
+ progress object.
+
+ If the other progress object supports cancel and this object gets any
+ cancel request (when here enabled as well), it will be forwarded to
+ the other progress object.
+
+ Error information is automatically preserved (by transferring it to
+ the current thread's error information). If the caller wants to set it
+ as the completion state of this progress it needs to be done separately.
+
+ <result name="VBOX_E_TIMEOUT">
+ Waiting time has expired.
+ </result>
+ </desc>
+ <param name="progressOther" type="IProgress" dir="in">
+ <desc>Other progress object to be "cloned".</desc>
+ </param>
+ <param name="timeoutMS" type="unsigned long" dir="in">
+ <desc>Timeout (in ms). Pass 0 for an infinite timeout.</desc>
+ </param>
+ </method>
+
+ <method name="setNextOperation">
+ <desc>Internal method, not to be called externally.</desc>
+ <param name="nextOperationDescription" type="wstring" dir="in" />
+ <param name="nextOperationsWeight" type="unsigned long" dir="in" />
+ </method>
+
+ <method name="notifyPointOfNoReturn">
+ <desc>Internal method, not to be called externally.</desc>
+ </method>
+
+ <method name="notifyComplete">
+ <desc>Internal method, not to be called externally.</desc>
+ <param name="resultCode" type="long" dir="in" />
+ <param name="errorInfo" type="IVirtualBoxErrorInfo" dir="in" />
+ </method>
+
+ </interface>
+
+ <!--
+ // ISnapshot
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="ISnapshot" extends="$unknown"
+ uuid="6cc49055-dad4-4496-85cf-3f76bcb3b5fa"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>
+ The ISnapshot interface represents a snapshot of the virtual
+ machine.
+
+ Together with the differencing media that are created
+ when a snapshot is taken, a machine can be brought back to
+ the exact state it was in when the snapshot was taken.
+
+ The ISnapshot interface has no methods, only attributes; snapshots
+ are controlled through methods of the <link to="IMachine" /> interface
+ which also manage the media associated with the snapshot.
+ The following operations exist:
+
+ <ul>
+ <li><link to="IMachine::takeSnapshot"/> creates a new snapshot
+ by creating new, empty differencing images for the machine's
+ media and saving the VM settings and (if the VM is running)
+ the current VM state in the snapshot.
+
+ The differencing images will then receive all data written to
+ the machine's media, while their parent (base) images
+ remain unmodified after the snapshot has been taken (see
+ <link to="IMedium" /> for details about differencing images).
+ This simplifies restoring a machine to the state of a snapshot:
+ only the differencing images need to be deleted.
+
+ The current machine state is not changed by taking a snapshot
+ except that <link to="IMachine::currentSnapshot" /> is set to
+ the newly created snapshot, which is also added to the machine's
+ snapshots tree.
+ </li>
+
+ <li><link to="IMachine::restoreSnapshot"/> resets a machine to
+ the state of a previous snapshot by deleting the differencing
+ image of each of the machine's media and setting the machine's
+ settings and state to the state that was saved in the snapshot (if any).
+
+ This destroys the machine's current state. After calling this,
+ <link to="IMachine::currentSnapshot" /> points to the snapshot
+ that was restored.
+ </li>
+
+ <li><link to="IMachine::deleteSnapshot"/> deletes a snapshot
+ without affecting the current machine state.
+
+ This does not change the current machine state, but instead frees the
+ resources allocated when the snapshot was taken: the settings and machine
+ state file are deleted (if any), and the snapshot's differencing image for
+ each of the machine's media gets merged with its parent image.
+
+ Neither the current machine state nor other snapshots are affected
+ by this operation, except that parent media will be modified
+ to contain the disk data associated with the snapshot being deleted.
+
+ When deleting the current snapshot, the <link to="IMachine::currentSnapshot" />
+ attribute is set to the current snapshot's parent or @c null if it
+ has no parent. Otherwise the attribute is unchanged.
+ </li>
+ </ul>
+
+ Each snapshot contains a copy of virtual machine's settings (hardware
+ configuration etc.). This copy is contained in an immutable (read-only)
+ instance of <link to="IMachine" /> which is available from the snapshot's
+ <link to="#machine" /> attribute. When restoring the snapshot, these
+ settings are copied back to the original machine.
+
+ In addition, if the machine was running when the
+ snapshot was taken (<link to="IMachine::state"/> is <link to="MachineState_Running"/>),
+ the current VM state is saved in the snapshot (similarly to what happens
+ when a VM's state is saved). The snapshot is then said to be <i>online</i>
+ because when restoring it, the VM will be running.
+
+ If the machine was in the <link to="MachineState_Saved">Saved</link> or
+ <link to="MachineState_AbortedSaved">AbortedSaved</link> state, the snapshot
+ receives a copy of the execution state file (<link to="IMachine::stateFilePath"/>).
+
+ Otherwise, if the machine was not running (<link to="MachineState_PoweredOff"/>
+ or <link to="MachineState_Aborted"/>), the snapshot is <i>offline</i>;
+ it then contains a so-called "zero execution state", representing a
+ machine that is powered off.
+ </desc>
+
+ <attribute name="id" type="uuid" mod="string" readonly="yes">
+ <desc>UUID of the snapshot.</desc>
+ </attribute>
+
+ <attribute name="name" type="wstring">
+ <desc>Short name of the snapshot.
+ <note>Setting this attribute causes <link to="IMachine::saveSettings" /> to
+ be called implicitly.</note>
+ </desc>
+ </attribute>
+
+ <attribute name="description" type="wstring">
+ <desc>Optional description of the snapshot.
+ <note>Setting this attribute causes <link to="IMachine::saveSettings" /> to
+ be called implicitly.</note>
+ </desc>
+ </attribute>
+
+ <attribute name="timeStamp" type="long long" readonly="yes">
+ <desc>
+ Timestamp of the snapshot, in milliseconds since 1970-01-01 UTC.
+ </desc>
+ </attribute>
+
+ <attribute name="online" type="boolean" readonly="yes">
+ <desc>
+ @c true if this snapshot is an online snapshot and @c false otherwise.
+
+ When this attribute is @c true, the
+ <link to="IMachine::stateFilePath"/> attribute of the
+ <link to="#machine"/> object associated with this snapshot
+ will point to the saved state file. Otherwise, it will be
+ an empty string.
+ </desc>
+ </attribute>
+
+ <attribute name="machine" type="IMachine" readonly="yes" rest="uuid">
+ <desc>
+ Virtual machine this snapshot is taken on. This object
+ stores all settings the machine had when taking this snapshot.
+ <note>
+ The returned machine object is immutable, i.e. no
+ any settings can be changed.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="parent" type="ISnapshot" readonly="yes" rest="uuid">
+ <desc>
+ Parent snapshot (a snapshot this one is based on), or
+ @c null if the snapshot has no parent (i.e. is the first snapshot).
+ </desc>
+ </attribute>
+
+ <attribute name="children" type="ISnapshot" readonly="yes" safearray="yes" rest="uuid">
+ <desc>
+ Child snapshots (all snapshots having this one as a parent).
+ By inspecting this attribute starting with a machine's root snapshot
+ (which can be obtained by calling <link to="IMachine::findSnapshot" />
+ with a @c null UUID), a machine's snapshots tree can be iterated over.
+ </desc>
+ </attribute>
+
+ <attribute name="childrenCount" type="unsigned long" readonly="yes">
+ <desc>
+ Returns the number of direct children of this snapshot.
+ </desc>
+ </attribute>
+
+ </interface>
+
+
+ <!--
+ // IMedium
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="MediumState"
+ uuid="ef41e980-e012-43cd-9dea-479d4ef14d13"
+ >
+ <desc>
+ Virtual medium state.
+ <see><link to="IMedium"/></see>
+ </desc>
+
+ <const name="NotCreated" value="0">
+ <desc>
+ Associated medium storage does not exist (either was not created yet or
+ was deleted).
+ </desc>
+ </const>
+ <const name="Created" value="1">
+ <desc>
+ Associated storage exists and accessible; this gets set if the
+ accessibility check performed by <link to="IMedium::refreshState" />
+ was successful.
+ </desc>
+ </const>
+ <const name="LockedRead" value="2">
+ <desc>
+ Medium is locked for reading (see <link to="IMedium::lockRead"/>),
+ no data modification is possible.
+ </desc>
+ </const>
+ <const name="LockedWrite" value="3">
+ <desc>
+ Medium is locked for writing (see <link to="IMedium::lockWrite"/>),
+ no concurrent data reading or modification is possible.
+ </desc>
+ </const>
+ <const name="Inaccessible" value="4">
+ <desc>
+ Medium accessibility check (see <link to="IMedium::refreshState" />) has
+ not yet been performed, or else, associated medium storage is not
+ accessible. In the first case, <link to="IMedium::lastAccessError"/>
+ is empty, in the second case, it describes the error that occurred.
+ </desc>
+ </const>
+ <const name="Creating" value="5">
+ <desc>
+ Associated medium storage is being created.
+ </desc>
+ </const>
+ <const name="Deleting" value="6">
+ <desc>
+ Associated medium storage is being deleted.
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="MediumType"
+ uuid="fe663fb5-c244-4e1b-9d81-c628b417dd04"
+ >
+ <desc>
+ Virtual medium type. For each <link to="IMedium" />, this defines how the medium is
+ attached to a virtual machine (see <link to="IMediumAttachment" />) and what happens
+ when a snapshot (see <link to="ISnapshot" />) is taken of a virtual machine which has
+ the medium attached. At the moment DVD and floppy media are always of type "writethrough".
+ </desc>
+
+ <const name="Normal" value="0">
+ <desc>
+ Normal medium (attached directly or indirectly, preserved
+ when taking snapshots).
+ </desc>
+ </const>
+ <const name="Immutable" value="1">
+ <desc>
+ Immutable medium (attached indirectly, changes are wiped out
+ the next time the virtual machine is started).
+ </desc>
+ </const>
+ <const name="Writethrough" value="2">
+ <desc>
+ Write through medium (attached directly, ignored when
+ taking snapshots).
+ </desc>
+ </const>
+ <const name="Shareable" value="3">
+ <desc>
+ Allow using this medium concurrently by several machines.
+ <note>Present since VirtualBox 3.2.0, and accepted since 3.2.8.</note>
+ </desc>
+ </const>
+ <const name="Readonly" value="4">
+ <desc>
+ A readonly medium, which can of course be used by several machines.
+ <note>Present and accepted since VirtualBox 4.0.</note>
+ </desc>
+ </const>
+ <const name="MultiAttach" value="5">
+ <desc>
+ A medium which is indirectly attached, so that one base medium can
+ be used for several VMs which have their own differencing medium to
+ store their modifications. In some sense a variant of Immutable
+ with unset AutoReset flag in each differencing medium.
+ <note>Present and accepted since VirtualBox 4.0.</note>
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="MediumVariant"
+ uuid="0282e97f-4ef3-4411-a8e0-47c384803cb6"
+ >
+ <desc>
+ Virtual medium image variant. More than one flag may be set.
+ <see><link to="IMedium"/></see>
+ </desc>
+
+ <const name="Standard" value="0">
+ <desc>
+ No particular variant requested, results in using the backend default.
+ </desc>
+ </const>
+ <const name="VmdkSplit2G" value="0x01">
+ <desc>
+ VMDK image split in chunks of less than 2GByte.
+ </desc>
+ </const>
+ <const name="VmdkRawDisk" value="0x02">
+ <desc>
+ VMDK image representing a raw disk.
+ </desc>
+ </const>
+ <const name="VmdkStreamOptimized" value="0x04">
+ <desc>
+ VMDK streamOptimized image. Special import/export format which is
+ read-only/append-only.
+ </desc>
+ </const>
+ <const name="VmdkESX" value="0x08">
+ <desc>
+ VMDK format variant used on ESX products.
+ </desc>
+ </const>
+ <const name="VdiZeroExpand" value="0x100">
+ <desc>
+ Fill new blocks with zeroes while expanding image file.
+ </desc>
+ </const>
+ <const name="Fixed" value="0x10000">
+ <desc>
+ Fixed image. Only allowed for base images.
+ </desc>
+ </const>
+ <const name="Diff" value="0x20000">
+ <desc>
+ Differencing image. Only allowed for child images.
+ </desc>
+ </const>
+ <const name="Formatted" value="0x20000000">
+ <desc>
+ Special flag which requests formatting the disk image. Right now
+ supported for floppy images only.
+ </desc>
+ </const>
+ <const name="NoCreateDir" value="0x40000000">
+ <desc>
+ Special flag which suppresses automatic creation of the subdirectory.
+ Only used when passing the medium variant as an input parameter.
+ </desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IMediumAttachment" extends="$unknown"
+ uuid="8d095cb0-0126-43e0-b05d-326e74abb356"
+ wsmap="struct"
+ rest="managed"
+ reservedAttributes="8"
+ >
+ <desc>
+ The IMediumAttachment interface links storage media to virtual machines.
+ For each medium (<link to="IMedium"/>) which has been attached to a
+ storage controller (<link to="IStorageController"/>) of a machine
+ (<link to="IMachine"/>) via the <link to="IMachine::attachDevice" />
+ method, one instance of IMediumAttachment is added to the machine's
+ <link to="IMachine::mediumAttachments"/> array attribute.
+
+ Each medium attachment specifies the storage controller as well as a
+ port and device number and the IMedium instance representing a virtual
+ hard disk or floppy or DVD image.
+
+ For removable media (DVDs or floppies), there are two additional
+ options. For one, the IMedium instance can be @c null to represent
+ an empty drive with no media inserted (see <link to="IMachine::mountMedium" />);
+ secondly, the medium can be one of the pseudo-media for host drives
+ listed in <link to="IHost::DVDDrives"/> or <link to="IHost::floppyDrives"/>.
+
+ <h3>Attaching Hard Disks</h3>
+
+ Hard disks are attached to virtual machines using the
+ <link to="IMachine::attachDevice"/> method and detached using the
+ <link to="IMachine::detachDevice"/> method. Depending on a medium's
+ type (see <link to="IMedium::type" />), hard disks are attached either
+ <i>directly</i> or <i>indirectly</i>.
+
+ When a hard disk is being attached directly, it is associated with the
+ virtual machine and used for hard disk operations when the machine is
+ running. When a hard disk is being attached indirectly, a new differencing
+ hard disk linked to it is implicitly created and this differencing hard
+ disk is associated with the machine and used for hard disk operations.
+ This also means that if <link to="IMachine::attachDevice"/> performs
+ a direct attachment then the same hard disk will be returned in response
+ to the subsequent <link to="IMachine::getMedium"/> call; however if
+ an indirect attachment is performed then
+ <link to="IMachine::getMedium"/> will return the implicitly created
+ differencing hard disk, not the original one passed to <link
+ to="IMachine::attachDevice"/>. In detail:
+
+ <ul>
+ <li><b>Normal base</b> hard disks that do not have children (i.e.
+ differencing hard disks linked to them) and that are not already
+ attached to virtual machines in snapshots are attached <b>directly</b>.
+ Otherwise, they are attached <b>indirectly</b> because having
+ dependent children or being part of the snapshot makes it impossible
+ to modify hard disk contents without breaking the integrity of the
+ dependent party. The <link to="IMedium::readOnly"/> attribute allows to
+ quickly determine the kind of the attachment for the given hard
+ disk. Note that if a normal base hard disk is to be indirectly
+ attached to a virtual machine with snapshots then a special
+ procedure called <i>smart attachment</i> is performed (see below).</li>
+ <li><b>Normal differencing</b> hard disks are like normal base hard disks:
+ they are attached <b>directly</b> if they do not have children and are
+ not attached to virtual machines in snapshots, and <b>indirectly</b>
+ otherwise. Note that the smart attachment procedure is never performed
+ for differencing hard disks.</li>
+ <li><b>Immutable</b> hard disks are always attached <b>indirectly</b> because
+ they are designed to be non-writable. If an immutable hard disk is
+ attached to a virtual machine with snapshots then a special
+ procedure called smart attachment is performed (see below).</li>
+ <li><b>Writethrough</b> hard disks are always attached <b>directly</b>,
+ also as designed. This also means that writethrough hard disks cannot
+ have other hard disks linked to them at all.</li>
+ <li><b>Shareable</b> hard disks are always attached <b>directly</b>,
+ also as designed. This also means that shareable hard disks cannot
+ have other hard disks linked to them at all. They behave almost
+ like writethrough hard disks, except that shareable hard disks can
+ be attached to several virtual machines which are running, allowing
+ concurrent accesses. You need special cluster software running in
+ the virtual machines to make use of such disks.</li>
+ </ul>
+
+ Note that the same hard disk, regardless of its type, may be attached to
+ more than one virtual machine at a time. In this case, the machine that is
+ started first gains exclusive access to the hard disk and attempts to
+ start other machines having this hard disk attached will fail until the
+ first machine is powered down.
+
+ Detaching hard disks is performed in a <i>deferred</i> fashion. This means
+ that the given hard disk remains associated with the given machine after a
+ successful <link to="IMachine::detachDevice"/> call until
+ <link to="IMachine::saveSettings"/> is called to save all changes to
+ machine settings to disk. This deferring is necessary to guarantee that
+ the hard disk configuration may be restored at any time by a call to
+ <link to="IMachine::discardSettings"/> before the settings
+ are saved (committed).
+
+ Note that if <link to="IMachine::discardSettings"/> is called after
+ indirectly attaching some hard disks to the machine but before a call to
+ <link to="IMachine::saveSettings"/> is made, it will implicitly delete
+ all differencing hard disks implicitly created by
+ <link to="IMachine::attachDevice"/> for these indirect attachments.
+ Such implicitly created hard disks will also be immediately deleted when
+ detached explicitly using the <link to="IMachine::detachDevice"/>
+ call if it is made before <link to="IMachine::saveSettings"/>. This
+ implicit deletion is safe because newly created differencing hard
+ disks do not contain any user data.
+
+ However, keep in mind that detaching differencing hard disks that were
+ implicitly created by <link to="IMachine::attachDevice"/>
+ before the last <link to="IMachine::saveSettings"/> call will
+ <b>not</b> implicitly delete them as they may already contain some data
+ (for example, as a result of virtual machine execution). If these hard
+ disks are no more necessary, the caller can always delete them explicitly
+ using <link to="IMedium::deleteStorage"/> after they are actually de-associated
+ from this machine by the <link to="IMachine::saveSettings"/> call.
+
+ <h3>Smart Attachment</h3>
+
+ When normal base or immutable hard disks are indirectly attached to a
+ virtual machine then some additional steps are performed to make sure the
+ virtual machine will have the most recent "view" of the hard disk being
+ attached. These steps include walking through the machine's snapshots
+ starting from the current one and going through ancestors up to the first
+ snapshot. Hard disks attached to the virtual machine in all
+ of the encountered snapshots are checked whether they are descendants of
+ the given normal base or immutable hard disk. The first found child (which
+ is the differencing hard disk) will be used instead of the normal base or
+ immutable hard disk as a parent for creating a new differencing hard disk
+ that will be actually attached to the machine. And only if no descendants
+ are found or if the virtual machine does not have any snapshots then the
+ normal base or immutable hard disk will be used itself as a parent for
+ this differencing hard disk.
+
+ It is easier to explain what smart attachment does using the
+ following example:
+ <pre>
+BEFORE attaching B.vdi: AFTER attaching B.vdi:
+
+Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
+ Snapshot 2 (D1->B.vdi) Snapshot 2 (D1->B.vdi)
+ Snapshot 3 (D2->D1.vdi) Snapshot 3 (D2->D1.vdi)
+ Snapshot 4 (none) Snapshot 4 (none)
+ CurState (none) CurState (D3->D2.vdi)
+
+ NOT
+ ...
+ CurState (D3->B.vdi)
+ </pre>
+ The first column is the virtual machine configuration before the base hard
+ disk <tt>B.vdi</tt> is attached, the second column shows the machine after
+ this hard disk is attached. Constructs like <tt>D1->B.vdi</tt> and similar
+ mean that the hard disk that is actually attached to the machine is a
+ differencing hard disk, <tt>D1.vdi</tt>, which is linked to (based on)
+ another hard disk, <tt>B.vdi</tt>.
+
+ As we can see from the example, the hard disk <tt>B.vdi</tt> was detached
+ from the machine before taking Snapshot 4. Later, after Snapshot 4 was
+ taken, the user decides to attach <tt>B.vdi</tt> again. <tt>B.vdi</tt> has
+ dependent child hard disks (<tt>D1.vdi</tt>, <tt>D2.vdi</tt>), therefore
+ it cannot be attached directly and needs an indirect attachment (i.e.
+ implicit creation of a new differencing hard disk). Due to the smart
+ attachment procedure, the new differencing hard disk
+ (<tt>D3.vdi</tt>) will be based on <tt>D2.vdi</tt>, not on
+ <tt>B.vdi</tt> itself, since <tt>D2.vdi</tt> is the most recent view of
+ <tt>B.vdi</tt> existing for this snapshot branch of the given virtual
+ machine.
+
+ Note that if there is more than one descendant hard disk of the given base
+ hard disk found in a snapshot, and there is an exact device, channel and
+ bus match, then this exact match will be used. Otherwise, the youngest
+ descendant will be picked up.
+
+ There is one more important aspect of the smart attachment procedure which
+ is not related to snapshots at all. Before walking through the snapshots
+ as described above, the backup copy of the current list of hard disk
+ attachment is searched for descendants. This backup copy is created when
+ the hard disk configuration is changed for the first time after the last
+ <link to="IMachine::saveSettings"/> call and used by
+ <link to="IMachine::discardSettings"/> to undo the recent hard disk
+ changes. When such a descendant is found in this backup copy, it will be
+ simply re-attached back, without creating a new differencing hard disk for
+ it. This optimization is necessary to make it possible to re-attach the
+ base or immutable hard disk to a different bus, channel or device slot
+ without losing the contents of the differencing hard disk actually
+ attached to the machine in place of it.
+
+ </desc>
+
+ <attribute name="machine" type="IMachine" readonly="yes" rest="uuid">
+ <desc>Machine object for this medium attachment.</desc>
+ </attribute>
+
+ <attribute name="medium" type="IMedium" readonly="yes" rest="uuid">
+ <desc>Medium object associated with this attachment; it
+ can be @c null for removable devices.</desc>
+ </attribute>
+
+ <attribute name="controller" type="wstring" readonly="yes">
+ <desc>Name of the storage controller of this attachment; this
+ refers to one of the controllers in <link to="IMachine::storageControllers" />
+ by name.</desc>
+ </attribute>
+
+ <attribute name="port" type="long" readonly="yes">
+ <desc>Port number of this attachment.
+ See <link to="IMachine::attachDevice" /> for the meaning of this value for the different controller types.
+ </desc>
+ </attribute>
+
+ <attribute name="device" type="long" readonly="yes">
+ <desc>Device slot number of this attachment.
+ See <link to="IMachine::attachDevice" /> for the meaning of this value for the different controller types.
+ </desc>
+ </attribute>
+
+ <attribute name="type" type="DeviceType" readonly="yes">
+ <desc>Device type of this attachment.</desc>
+ </attribute>
+
+ <attribute name="passthrough" type="boolean" readonly="yes">
+ <desc>Pass I/O requests through to a device on the host.</desc>
+ </attribute>
+
+ <attribute name="temporaryEject" type="boolean" readonly="yes">
+ <desc>Whether guest-triggered eject results in unmounting the medium.</desc>
+ </attribute>
+
+ <attribute name="isEjected" type="boolean" readonly="yes">
+ <desc>Signals that the removable medium has been ejected. This is not
+ necessarily equivalent to having a @c null medium association.</desc>
+ </attribute>
+
+ <attribute name="nonRotational" type="boolean" readonly="yes">
+ <desc>Whether the associated medium is non-rotational.</desc>
+ </attribute>
+
+ <attribute name="discard" type="boolean" readonly="yes">
+ <desc>Whether the associated medium supports discarding unused blocks.</desc>
+ </attribute>
+
+ <attribute name="hotPluggable" type="boolean" readonly="yes">
+ <desc>Whether this attachment is hot pluggable or not.</desc>
+ </attribute>
+
+ <attribute name="bandwidthGroup" type="IBandwidthGroup" readonly="yes">
+ <desc>The bandwidth group this medium attachment is assigned to.</desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IMedium" extends="$unknown"
+ uuid="ad47ad09-787b-44ab-b343-a082a3f2dfb1"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="7" reservedAttributes="12"
+ >
+ <desc>
+ The IMedium interface represents virtual storage for a machine's
+ hard disks, CD/DVD or floppy drives. It will typically represent
+ a disk image on the host, for example a VDI or VMDK file representing
+ a virtual hard disk, or an ISO or RAW file representing virtual
+ removable media, but can also point to a network location (e.g.
+ for iSCSI targets).
+
+ Instances of IMedium are connected to virtual machines by way of medium
+ attachments, which link the storage medium to a particular device slot
+ of a storage controller of the virtual machine.
+ In the VirtualBox API, virtual storage is therefore always represented
+ by the following chain of object links:
+
+ <ul>
+ <li><link to="IMachine::storageControllers"/> contains an array of
+ storage controllers (IDE, SATA, SCSI, SAS or a floppy controller;
+ these are instances of <link to="IStorageController"/>).</li>
+ <li><link to="IMachine::mediumAttachments"/> contains an array of
+ medium attachments (instances of <link to="IMediumAttachment"/>
+ created by <link to="IMachine::attachDevice" />),
+ each containing a storage controller from the above array, a
+ port/device specification, and an instance of IMedium representing
+ the medium storage (image file).
+
+ For removable media, the storage medium is optional; a medium
+ attachment with no medium represents a CD/DVD or floppy drive
+ with no medium inserted. By contrast, hard disk attachments
+ will always have an IMedium object attached.</li>
+ <li>Each IMedium in turn points to a storage unit (such as a file
+ on the host computer or a network resource) that holds actual
+ data. This location is represented by the <link to="#location"/>
+ attribute.</li>
+ </ul>
+
+ Existing media are opened using <link to="IVirtualBox::openMedium"/>;
+ new hard disk media can be created with the VirtualBox API using the
+ <link to="IVirtualBox::createMedium"/> method. Differencing hard
+ disks (see below) are usually implicitly created by VirtualBox as
+ needed, but may also be created explicitly using <link to="#createDiffStorage"/>.
+ VirtualBox cannot create CD/DVD or floppy images (ISO and RAW files); these
+ should be created with external tools and then opened from within VirtualBox.
+
+ Only for CD/DVDs and floppies, an IMedium instance can also represent a host
+ drive. In that case the <link to="#id" /> attribute contains the UUID of
+ one of the drives in <link to="IHost::DVDDrives" /> or <link to="IHost::floppyDrives" />.
+
+ <h3>Media registries</h3>
+
+ When a medium has been opened or created using one of the aforementioned
+ APIs, it becomes "known" to VirtualBox. Known media can be attached
+ to virtual machines and re-found through <link to="IVirtualBox::openMedium"/>.
+ They also appear in the global
+ <link to="IVirtualBox::hardDisks" />,
+ <link to="IVirtualBox::DVDImages" /> and
+ <link to="IVirtualBox::floppyImages" /> arrays.
+
+ Prior to VirtualBox 4.0, opening a medium added it to a global media registry
+ in the VirtualBox.xml file, which was shared between all machines and made
+ transporting machines and their media from one host to another difficult.
+
+ Starting with VirtualBox 4.0, media are only added to a registry when they are
+ <i>attached</i> to a machine using <link to="IMachine::attachDevice" />. For
+ backwards compatibility, which registry a medium is added to depends on which
+ VirtualBox version created a machine:
+
+ <ul>
+ <li>If the medium has first been attached to a machine which was created by
+ VirtualBox 4.0 or later, it is added to that machine's media registry in
+ the machine XML settings file. This way all information about a machine's
+ media attachments is contained in a single file and can be transported
+ easily.</li>
+ <li>For older media attachments (i.e. if the medium was first attached to a
+ machine which was created with a VirtualBox version before 4.0), media
+ continue to be registered in the global VirtualBox settings file, for
+ backwards compatibility.</li>
+ </ul>
+
+ See <link to="IVirtualBox::openMedium" /> for more information.
+
+ Media are removed from media registries by the <link to="IMedium::close"/>,
+ <link to="#deleteStorage"/> and <link to="#mergeTo"/> methods.
+
+ <h3>Accessibility checks</h3>
+
+ VirtualBox defers media accessibility checks until the <link to="#refreshState" />
+ method is called explicitly on a medium. This is done to make the VirtualBox object
+ ready for serving requests as fast as possible and let the end-user
+ application decide if it needs to check media accessibility right away or not.
+
+ As a result, when VirtualBox starts up (e.g. the VirtualBox
+ object gets created for the first time), all known media are in the
+ "Inaccessible" state, but the value of the <link to="#lastAccessError"/>
+ attribute is an empty string because no actual accessibility check has
+ been made yet.
+
+ After calling <link to="#refreshState" />, a medium is considered
+ <i>accessible</i> if its storage unit can be read. In that case, the
+ <link to="#state"/> attribute has a value of "Created". If the storage
+ unit cannot be read (for example, because it is located on a disconnected
+ network resource, or was accidentally deleted outside VirtualBox),
+ the medium is considered <i>inaccessible</i>, which is indicated by the
+ "Inaccessible" state. The exact reason why the medium is inaccessible can be
+ obtained by reading the <link to="#lastAccessError"/> attribute.
+
+ <h3>Medium types</h3>
+
+ There are five types of medium behavior which are stored in the
+ <link to="#type"/> attribute (see <link to="MediumType" />) and
+ which define the medium's behavior with attachments and snapshots.
+
+ All media can be also divided in two groups: <i>base</i> media and
+ <i>differencing</i> media. A base medium contains all sectors of the
+ medium data in its own storage and therefore can be used independently.
+ In contrast, a differencing medium is a "delta" to some other medium and
+ contains only those sectors which differ from that other medium, which is
+ then called a <i>parent</i>. The differencing medium is said to be
+ <i>linked to</i> that parent. The parent may be itself a differencing
+ medium, thus forming a chain of linked media. The last element in that
+ chain must always be a base medium. Note that several differencing
+ media may be linked to the same parent medium.
+
+ Differencing media can be distinguished from base media by querying the
+ <link to="#parent"/> attribute: base media do not have parents they would
+ depend on, so the value of this attribute is always @c null for them.
+ Using this attribute, it is possible to walk up the medium tree (from the
+ child medium to its parent). It is also possible to walk down the tree
+ using the <link to="#children"/> attribute.
+
+ Note that the type of all differencing media is "normal"; all other
+ values are meaningless for them. Base media may be of any type.
+
+ <h3>Automatic composition of the file name part</h3>
+
+ Another extension to the <link to="IMedium::location"/> attribute is that
+ there is a possibility to cause VirtualBox to compose a unique value for
+ the file name part of the location using the UUID of the hard disk. This
+ applies only to hard disks in <link to="MediumState_NotCreated"/> state,
+ e.g. before the storage unit is created, and works as follows. You set the
+ value of the <link to="IMedium::location"/> attribute to a location
+ specification which only contains the path specification but not the file
+ name part and ends with either a forward slash or a backslash character.
+ In response, VirtualBox will generate a new UUID for the hard disk and
+ compose the file name using the following pattern:
+ <pre>
+ &lt;path&gt;/{&lt;uuid&gt;}.&lt;ext&gt;
+ </pre>
+ where <tt>&lt;path&gt;</tt> is the supplied path specification,
+ <tt>&lt;uuid&gt;</tt> is the newly generated UUID and <tt>&lt;ext&gt;</tt>
+ is the default extension for the storage format of this hard disk. After
+ that, you may call any of the methods that create a new hard disk storage
+ unit and they will use the generated UUID and file name.
+ </desc>
+
+ <attribute name="id" type="uuid" mod="string" readonly="yes">
+ <desc>
+ UUID of the medium. For a newly created medium, this value is a randomly
+ generated UUID.
+
+ <note>
+ For media in one of MediumState_NotCreated, MediumState_Creating or
+ MediumState_Deleting states, the value of this property is undefined
+ and will most likely be an empty UUID.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="description" type="wstring" wrap-hint-server="passcaller">
+ <desc>
+ Optional description of the medium. For a newly created medium the value
+ of this attribute is an empty string.
+
+ Medium types that don't support this attribute will return E_NOTIMPL in
+ attempt to get or set this attribute's value.
+
+ <note>
+ For some storage types, reading this attribute may return an outdated
+ (last known) value when <link to="#state"/> is <link
+ to="MediumState_Inaccessible"/> or <link
+ to="MediumState_LockedWrite"/> because the value of this attribute is
+ stored within the storage unit itself. Also note that changing the
+ attribute value is not possible in such case, as well as when the
+ medium is the <link to="MediumState_LockedRead"/> state.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="state" type="MediumState" readonly="yes">
+ <desc>
+ Returns the current medium state, which is the last state set by
+ the accessibility check performed by <link to="#refreshState"/>.
+ If that method has not yet been called on the medium, the state
+ is "Inaccessible"; as opposed to truly inaccessible media, the
+ value of <link to="#lastAccessError"/> will be an empty string in
+ that case.
+
+ <note>As of version 3.1, this no longer performs an accessibility check
+ automatically; call <link to="#refreshState"/> for that.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="variant" type="MediumVariant" safearray="yes" readonly="yes">
+ <desc>
+ Returns the storage format variant information for this medium
+ as an array of the flags described at <link to="MediumVariant" />.
+ Before <link to="#refreshState"/> is called this method returns
+ an undefined value.
+ </desc>
+ </attribute>
+
+ <attribute name="location" type="wstring">
+ <desc>
+ Location of the storage unit holding medium data.
+
+ The format of the location string is medium type specific. For medium
+ types using regular files in a host's file system, the location
+ string is the full file name.
+ </desc>
+ </attribute>
+
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>
+ Name of the storage unit holding medium data.
+
+ The returned string is a short version of the <link to="#location"/>
+ attribute that is suitable for representing the medium in situations
+ where the full location specification is too long (such as lists
+ and comboboxes in GUI frontends). This string is also used by frontends
+ to sort the media list alphabetically when needed.
+
+ For example, for locations that are regular files in the host's file
+ system, the value of this attribute is just the file name (+ extension),
+ without the path specification.
+
+ Note that as opposed to the <link to="#location"/> attribute, the name
+ attribute will not necessary be unique for a list of media of the
+ given type and format.
+ </desc>
+ </attribute>
+
+ <attribute name="deviceType" type="DeviceType" readonly="yes">
+ <desc>Kind of device (DVD/Floppy/HardDisk) which is applicable to this
+ medium.</desc>
+ </attribute>
+
+ <attribute name="hostDrive" type="boolean" readonly="yes">
+ <desc>True if this corresponds to a drive on the host.</desc>
+ </attribute>
+
+ <attribute name="size" type="long long" readonly="yes">
+ <desc>
+ Physical size of the storage unit used to hold medium data (in bytes).
+
+ <note>
+ For media whose <link to="#state"/> is <link
+ to="MediumState_Inaccessible"/>, the value of this property is the
+ last known size. For <link to="MediumState_NotCreated"/> media,
+ the returned value is zero.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="format" type="wstring" readonly="yes">
+ <desc>
+ Storage format of this medium.
+
+ The value of this attribute is a string that specifies a backend used
+ to store medium data. The storage format is defined when you create a
+ new medium or automatically detected when you open an existing medium,
+ and cannot be changed later.
+
+ The list of all storage formats supported by this VirtualBox
+ installation can be obtained using
+ <link to="ISystemProperties::mediumFormats"/>.
+ </desc>
+ </attribute>
+
+ <attribute name="mediumFormat" type="IMediumFormat" readonly="yes">
+ <desc>
+ Storage medium format object corresponding to this medium.
+
+ The value of this attribute is a reference to the medium format object
+ that specifies the backend properties used to store medium data. The
+ storage format is defined when you create a new medium or automatically
+ detected when you open an existing medium, and cannot be changed later.
+
+ <note>@c null is returned if there is no associated medium format
+ object. This can e.g. happen for medium objects representing host
+ drives and other special medium objects.</note>
+ </desc>
+ </attribute>
+
+ <attribute name="type" type="MediumType" wrap-hint-server="passcaller">
+ <desc>
+ Type (role) of this medium.
+
+ The following constraints apply when changing the value of this
+ attribute:
+ <ul>
+ <li>If a medium is attached to a virtual machine (either in the
+ current state or in one of the snapshots), its type cannot be
+ changed.
+ </li>
+ <li>As long as the medium has children, its type cannot be set
+ to <link to="MediumType_Writethrough"/>.
+ </li>
+ <li>The type of all differencing media is
+ <link to="MediumType_Normal"/> and cannot be changed.
+ </li>
+ </ul>
+
+ The type of a newly created or opened medium is set to
+ <link to="MediumType_Normal"/>, except for DVD and floppy media,
+ which have a type of <link to="MediumType_Writethrough"/>.
+ </desc>
+ </attribute>
+
+ <attribute name="allowedTypes" type="MediumType" safearray="yes" readonly="yes">
+ <desc>
+ Returns which medium types can selected for this medium.
+
+ <result name="E_NOTIMPL">
+ This attribute is not implemented at the moment.
+ </result>
+ </desc>
+ </attribute>
+
+ <attribute name="parent" type="IMedium" readonly="yes" wrap-hint-server="passcaller" rest="uuid">
+ <desc>
+ Parent of this medium (the medium this medium is directly based
+ on).
+
+ Only differencing media have parents. For base (non-differencing)
+ media, @c null is returned.
+ </desc>
+ </attribute>
+
+ <attribute name="children" type="IMedium" safearray="yes" readonly="yes" wrap-hint-server="passcaller" rest="uuid">
+ <desc>
+ Children of this medium (all differencing media directly based
+ on this medium). A @c null array is returned if this medium
+ does not have any children.
+ </desc>
+ </attribute>
+
+ <attribute name="base" type="IMedium" readonly="yes" wrap-hint-server="passcaller" rest="uuid">
+ <desc>
+ Base medium of this medium.
+
+ If this is a differencing medium, its base medium is the medium
+ the given medium branch starts from. For all other types of media, this
+ property returns the medium object itself (i.e. the same object this
+ property is read on).
+ </desc>
+ </attribute>
+
+ <attribute name="readOnly" type="boolean" readonly="yes" wrap-hint-server="passcaller">
+ <desc>
+ Returns @c true if this medium is read-only and @c false otherwise.
+
+ A medium is considered to be read-only when its contents cannot be
+ modified without breaking the integrity of other parties that depend on
+ this medium such as its child media or snapshots of virtual machines
+ where this medium is attached to these machines. If there are no
+ children and no such snapshots then there is no dependency and the
+ medium is not read-only.
+
+ The value of this attribute can be used to determine the kind of the
+ attachment that will take place when attaching this medium to a
+ virtual machine. If the value is @c false then the medium will
+ be attached directly. If the value is @c true then the medium
+ will be attached indirectly by creating a new differencing child
+ medium for that. See the interface description for more information.
+
+ Note that all <link to="MediumType_Immutable">Immutable</link> media
+ are always read-only while all
+ <link to="MediumType_Writethrough">Writethrough</link> media are
+ always not.
+
+ <note>
+ The read-only condition represented by this attribute is related to
+ the medium type and usage, not to the current
+ <link to="IMedium::state">medium state</link> and not to the read-only
+ state of the storage unit.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="logicalSize" type="long long" readonly="yes">
+ <desc>
+ Logical size of this medium (in bytes), as reported to the
+ guest OS running inside the virtual machine this medium is
+ attached to. The logical size is defined when the medium is created
+ and cannot be changed later.
+
+ <note>
+ For media whose state is <link to="#state"/> is <link
+ to="MediumState_Inaccessible"/>, the value of this property is the
+ last known logical size. For <link to="MediumState_NotCreated"/>
+ media, the returned value is zero.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="autoReset" type="boolean">
+ <desc>
+ Whether this differencing medium will be automatically reset each
+ time a virtual machine it is attached to is powered up. This
+ attribute is automatically set to @c true for the last
+ differencing image of an "immutable" medium (see
+ <link to="MediumType" />).
+
+ See <link to="#reset"/> for more information about resetting
+ differencing media.
+
+ <note>
+ Reading this property on a base (non-differencing) medium will
+ always @c false. Changing the value of this property in this
+ case is not supported.
+ </note>
+
+ <result name="VBOX_E_NOT_SUPPORTED">
+ This is not a differencing medium (when changing the attribute
+ value).
+ </result>
+ </desc>
+ </attribute>
+
+ <attribute name="lastAccessError" type="wstring" readonly="yes">
+ <desc>
+ Text message that represents the result of the last accessibility
+ check performed by <link to="#refreshState"/>.
+
+ An empty string is returned if the last accessibility check
+ was successful or has not yet been called. As a result, if
+ <link to="#state" /> is "Inaccessible" and this attribute is empty,
+ then <link to="#refreshState"/> has yet to be called; this is the
+ default value of media after VirtualBox initialization.
+ A non-empty string indicates a failure and should normally describe
+ a reason of the failure (for example, a file read error).
+ </desc>
+ </attribute>
+
+ <attribute name="machineIds" type="uuid" mod="string" safearray="yes" readonly="yes">
+ <desc>
+ Array of UUIDs of all machines this medium is attached to.
+
+ A @c null array is returned if this medium is not attached to any
+ machine or to any machine's snapshot.
+
+ <note>
+ The returned array will include a machine even if this medium is not
+ attached to that machine in the current state but attached to it in
+ one of the machine's snapshots. See <link to="#getSnapshotIds"/> for
+ details.
+ </note>
+ </desc>
+ </attribute>
+
+ <method name="setIds" wrap-hint-server="passcaller">
+ <rest request="post" path="/media/{mediumid}/configuration/"/>
+ <desc>
+ Changes the UUID and parent UUID for a hard disk medium.
+ </desc>
+ <param name="setImageId" type="boolean" dir="in">
+ <desc>
+ Select whether a new image UUID is set or not.
+ </desc>
+ </param>
+ <param name="imageId" type="uuid" mod="string" dir="in">
+ <desc>
+ New UUID for the image. If an empty string is passed, then a new
+ UUID is automatically created, provided that @a setImageId is @c true.
+ Specifying a zero UUID is not allowed.
+ </desc>
+ </param>
+ <param name="setParentId" type="boolean" dir="in">
+ <desc>
+ Select whether a new parent UUID is set or not.
+ </desc>
+ </param>
+ <param name="parentId" type="uuid" mod="string" dir="in">
+ <desc>
+ New parent UUID for the image. If an empty string is passed, then a
+ new UUID is automatically created, provided @a setParentId is
+ @c true. A zero UUID is valid.
+ </desc>
+ </param>
+ <result name="E_INVALIDARG">
+ Invalid parameter combination.
+ </result>
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Medium is not a hard disk medium.
+ </result>
+ </method>
+
+ <method name="refreshState" wrap-hint-server="passcaller">
+ <rest request="post" path="/media/{mediumid}/configuration/"/>
+ <desc>
+ If the current medium state (see <link to="MediumState"/>) is one of
+ "Created", "Inaccessible" or "LockedRead", then this performs an
+ accessibility check on the medium and sets the value of the <link to="#state"/>
+ attribute accordingly; that value is also returned for convenience.
+
+ For all other state values, this does not perform a refresh but returns
+ the state only.
+
+ The refresh, if performed, may take a long time (several seconds or even
+ minutes, depending on the storage unit location and format) because it performs an
+ accessibility check of the storage unit. This check may cause a significant
+ delay if the storage unit of the given medium is, for example, a file located
+ on a network share which is not currently accessible due to connectivity
+ problems. In that case, the call will not return until a timeout
+ interval defined by the host OS for this operation expires. For this reason,
+ it is recommended to never read this attribute on the main UI thread to avoid
+ making the UI unresponsive.
+
+ If the last known state of the medium is "Created" and the accessibility
+ check fails, then the state would be set to "Inaccessible", and
+ <link to="#lastAccessError"/> may be used to get more details about the
+ failure. If the state of the medium is "LockedRead", then it remains the
+ same, and a non-empty value of <link to="#lastAccessError"/> will
+ indicate a failed accessibility check in this case.
+
+ Note that not all medium states are applicable to all medium types.
+ </desc>
+ <param name="state" type="MediumState" dir="return">
+ <desc>
+ New medium state.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getSnapshotIds">
+ <rest request="get" path="/media/{mediumid}/configuration/"/>
+ <desc>
+ Returns an array of UUIDs of all snapshots of the given machine where
+ this medium is attached to.
+
+ If the medium is attached to the machine in the current state, then the
+ first element in the array will always be the ID of the queried machine
+ (i.e. the value equal to the @c machineId argument), followed by
+ snapshot IDs (if any).
+
+ If the medium is not attached to the machine in the current state, then
+ the array will contain only snapshot IDs.
+
+ The returned array may be @c null if this medium is not attached
+ to the given machine at all, neither in the current state nor in one of
+ the snapshots.
+ </desc>
+ <param name="machineId" type="uuid" mod="string" dir="in">
+ <desc>
+ UUID of the machine to query.
+ </desc>
+ </param>
+ <param name="snapshotIds" type="uuid" mod="string" safearray="yes" dir="return">
+ <desc>
+ Array of snapshot UUIDs of the given machine using this medium.
+ </desc>
+ </param>
+ </method>
+
+ <method name="lockRead">
+ <rest request="post" path="/media/{mediumid}/configuration/"/>
+ <desc>
+ Locks this medium for reading.
+
+ A read lock is shared: many clients can simultaneously lock the
+ same medium for reading unless it is already locked for writing (see
+ <link to="#lockWrite"/>) in which case an error is returned.
+
+ When the medium is locked for reading, it cannot be modified
+ from within VirtualBox. This means that any method that changes
+ the properties of this medium or contents of the storage unit
+ will return an error (unless explicitly stated otherwise). That
+ includes an attempt to start a virtual machine that wants to
+ write to the medium.
+
+ When the virtual machine is started up, it locks for reading all
+ media it uses in read-only mode. If some medium cannot be locked
+ for reading, the startup procedure will fail.
+ A medium is typically locked for reading while it is used by a running
+ virtual machine but has a depending differencing image that receives
+ the actual write operations. This way one base medium can have
+ multiple child differencing images which can be written to
+ simultaneously. Read-only media such as DVD and floppy images are
+ also locked for reading only (so they can be in use by multiple
+ machines simultaneously).
+
+ A medium is also locked for reading when it is the source of a
+ write operation such as <link to="#cloneTo"/> or <link to="#mergeTo"/>.
+
+ The medium locked for reading must be unlocked by abandoning the
+ returned token object, see <link to="IToken"/>. Calls to
+ <link to="#lockRead"/> can be nested and the lock is actually released
+ when all callers have abandoned the token.
+
+ This method sets the medium state (see <link to="#state"/>) to
+ "LockedRead" on success. The medium's previous state must be
+ one of "Created", "Inaccessible" or "LockedRead".
+
+ Locking an inaccessible medium is not an error; this method performs
+ a logical lock that prevents modifications of this medium through
+ the VirtualBox API, not a physical file-system lock of the underlying
+ storage unit.
+
+ This method returns the current state of the medium
+ <i>before</i> the operation.
+
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Invalid medium state (e.g. not created, locked, inaccessible,
+ creating, deleting).
+ </result>
+
+ </desc>
+ <param name="token" type="IToken" dir="return">
+ <desc>
+ Token object, when this is released (reference count reaches 0) then
+ the lock count is decreased. The lock is released when the lock count
+ reaches 0.
+ </desc>
+ </param>
+ </method>
+
+ <method name="lockWrite">
+ <rest request="post" path="/media/{mediumid}/configuration/"/>
+ <desc>
+ Locks this medium for writing.
+
+ A write lock, as opposed to <link to="#lockRead"/>, is
+ exclusive: there may be only one client holding a write lock,
+ and there may be no read locks while the write lock is held.
+ As a result, read-locking fails if a write lock is held, and
+ write-locking fails if either a read or another write lock is held.
+
+ When a medium is locked for writing, it cannot be modified
+ from within VirtualBox, and it is not guaranteed that the values
+ of its properties are up-to-date. Any method that changes the
+ properties of this medium or contents of the storage unit will
+ return an error (unless explicitly stated otherwise).
+
+ When a virtual machine is started up, it locks for writing all
+ media it uses to write data to. If any medium could not be locked
+ for writing, the startup procedure will fail. If a medium has
+ differencing images, then while the machine is running, only
+ the last ("leaf") differencing image is locked for writing,
+ whereas its parents are locked for reading only.
+
+ A medium is also locked for writing when it is the target of a
+ write operation such as <link to="#cloneTo"/> or <link to="#mergeTo"/>.
+
+ The medium locked for writing must be unlocked by abandoning the
+ returned token object, see <link to="IToken"/>. Write locks
+ <i>cannot</i> be nested.
+
+ This method sets the medium state (see <link to="#state"/>) to
+ "LockedWrite" on success. The medium's previous state must be
+ either "Created" or "Inaccessible".
+
+ Locking an inaccessible medium is not an error; this method performs
+ a logical lock that prevents modifications of this medium through
+ the VirtualBox API, not a physical file-system lock of the underlying
+ storage unit.
+
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Invalid medium state (e.g. not created, locked, inaccessible,
+ creating, deleting).
+ </result>
+
+ </desc>
+ <param name="token" type="IToken" dir="return">
+ <desc>
+ Token object, when this is released (reference count reaches 0) then
+ the lock is released.
+ </desc>
+ </param>
+ </method>
+
+ <method name="close" wrap-hint-server="passcaller">
+ <rest request="post" path="/media/{mediumid}/actions/"/>
+ <desc>
+ Closes this medium.
+
+ The medium must not be attached to any known virtual machine
+ and must not have any known child media, otherwise the
+ operation will fail.
+
+ When the medium is successfully closed, it is removed from
+ the list of registered media, but its storage unit is not
+ deleted. In particular, this means that this medium can
+ later be opened again using the <link to="IVirtualBox::openMedium"/>
+ call.
+
+ Note that after this method successfully returns, the given medium
+ object becomes uninitialized. This means that any attempt
+ to call any of its methods or attributes will fail with the
+ <tt>"Object not ready" (E_ACCESSDENIED)</tt> error.
+
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Invalid medium state (other than not created, created or
+ inaccessible).
+ </result>
+ <result name="VBOX_E_OBJECT_IN_USE">
+ Medium attached to virtual machine.
+ </result>
+ <result name="VBOX_E_FILE_ERROR">
+ Settings file not accessible.
+ </result>
+ <result name="VBOX_E_XML_ERROR">
+ Could not parse the settings file.
+ </result>
+
+ </desc>
+ </method>
+
+ <!-- property methods -->
+
+ <method name="getProperty" const="yes">
+ <rest request="get" path="/media/{mediumid}/configuration/"/>
+ <desc>
+ Returns the value of the custom medium property with the given name.
+
+ The list of all properties supported by the given medium format can
+ be obtained with <link to="IMediumFormat::describeProperties"/>.
+
+ <note>If this method returns an empty string in @a value, the requested
+ property is supported but currently not assigned any value.</note>
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ Requested property does not exist (not supported by the format).
+ </result>
+ <result name="E_INVALIDARG">@a name is @c null or empty.</result>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the property to get.</desc>
+ </param>
+ <param name="value" type="wstring" dir="return">
+ <desc>Current property value.</desc>
+ </param>
+ </method>
+
+ <method name="setProperty">
+ <rest request="post" path="/media/{mediumid}/configuration/"/>
+ <desc>
+ Sets the value of the custom medium property with the given name.
+
+ The list of all properties supported by the given medium format can
+ be obtained with <link to="IMediumFormat::describeProperties"/>.
+
+ <note>Setting the property value to @c null or an empty string is
+ equivalent to deleting the existing value. A default value (if it is
+ defined for this property) will be used by the format backend in this
+ case.</note>
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ Requested property does not exist (not supported by the format).
+ </result>
+ <result name="E_INVALIDARG">@a name is @c null or empty.</result>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the property to set.</desc>
+ </param>
+ <param name="value" type="wstring" dir="in">
+ <desc>Property value to set.</desc>
+ </param>
+ </method>
+
+ <method name="getProperties" const="yes">
+ <rest request="get" path="/media/{mediumid}/configuration/"/>
+ <desc>
+ Returns values for a group of properties in one call.
+
+ The names of the properties to get are specified using the @a names
+ argument which is a list of comma-separated property names or
+ an empty string if all properties are to be returned.
+ <note>Currently the value of this argument is ignored and the method
+ always returns all existing properties.</note>
+
+ The list of all properties supported by the given medium format can
+ be obtained with <link to="IMediumFormat::describeProperties"/>.
+
+ The method returns two arrays, the array of property names corresponding
+ to the @a names argument and the current values of these properties.
+ Both arrays have the same number of elements with each element at the
+ given index in the first array corresponds to an element at the same
+ index in the second array.
+
+ For properties that do not have assigned values, an empty string is
+ returned at the appropriate index in the @a returnValues array.
+
+ </desc>
+ <param name="names" type="wstring" dir="in">
+ <desc>
+ Names of properties to get.
+ </desc>
+ </param>
+ <param name="returnNames" type="wstring" safearray="yes" dir="out">
+ <desc>Names of returned properties.</desc>
+ </param>
+ <param name="returnValues" type="wstring" safearray="yes" dir="return">
+ <desc>Values of returned properties.</desc>
+ </param>
+ </method>
+
+ <method name="setProperties">
+ <rest request="post" path="/media/{mediumid}/configuration/"/>
+ <desc>
+ Sets values for a group of properties in one call.
+
+ The names of the properties to set are passed in the @a names
+ array along with the new values for them in the @a values array. Both
+ arrays have the same number of elements with each element at the given
+ index in the first array corresponding to an element at the same index
+ in the second array.
+
+ If there is at least one property name in @a names that is not valid,
+ the method will fail before changing the values of any other properties
+ from the @a names array.
+
+ Using this method over <link to="#setProperty"/> is preferred if you
+ need to set several properties at once since it is more efficient.
+
+ The list of all properties supported by the given medium format can
+ be obtained with <link to="IMediumFormat::describeProperties"/>.
+
+ Setting the property value to @c null or an empty string is equivalent
+ to deleting the existing value. A default value (if it is defined for
+ this property) will be used by the format backend in this case.
+ </desc>
+ <param name="names" type="wstring" safearray="yes" dir="in">
+ <desc>Names of properties to set.</desc>
+ </param>
+ <param name="values" type="wstring" safearray="yes" dir="in">
+ <desc>Values of properties to set.</desc>
+ </param>
+ </method>
+
+ <!-- storage methods -->
+
+ <method name="createBaseStorage">
+ <rest request="post" path="/media/{mediumid}/actions/"/>
+ <desc>
+ Starts creating a hard disk storage unit (fixed/dynamic, according
+ to the variant flags) in the background. The previous storage unit
+ created for this object, if any, must first be deleted using
+ <link to="#deleteStorage"/>, otherwise the operation will fail.
+
+ Before the operation starts, the medium is placed in
+ <link to="MediumState_Creating"/> state. If the create operation
+ fails, the medium will be placed back in <link to="MediumState_NotCreated"/>
+ state.
+
+ After the returned progress object reports that the operation has
+ successfully completed, the medium state will be set to <link
+ to="MediumState_Created"/>, the medium will be remembered by this
+ VirtualBox installation and may be attached to virtual machines.
+
+ <result name="VBOX_E_NOT_SUPPORTED">
+ The variant of storage creation operation is not supported. See <link
+ to="IMediumFormat::capabilities"/>.
+ </result>
+ </desc>
+ <param name="logicalSize" type="long long" dir="in">
+ <desc>Maximum logical size of the medium in bytes.</desc>
+ </param>
+ <param name="variant" type="MediumVariant" safearray="yes" dir="in">
+ <desc>Exact image variant which should be created (as a combination of
+ <link to="MediumVariant" /> flags).</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="deleteStorage">
+ <rest request="post" path="/media/{mediumid}/actions/"/>
+ <desc>
+ Starts deleting the storage unit of this medium.
+
+ The medium must not be attached to any known virtual machine and must
+ not have any known child media, otherwise the operation will fail.
+ It will also fail if there is no storage unit to delete or if deletion
+ is already in progress, or if the medium is being in use (locked for
+ read or for write) or inaccessible. Therefore, the only valid state for
+ this operation to succeed is <link to="MediumState_Created"/>.
+
+ Before the operation starts, the medium is placed in
+ <link to="MediumState_Deleting"/> state and gets removed from the list
+ of remembered hard disks (media registry). If the delete operation
+ fails, the medium will be remembered again and placed back to
+ <link to="MediumState_Created"/> state.
+
+ After the returned progress object reports that the operation is
+ complete, the medium state will be set to
+ <link to="MediumState_NotCreated"/> and you will be able to use one of
+ the storage creation methods to create it again.
+
+ <see><link to="#close"/></see>
+
+ <result name="VBOX_E_OBJECT_IN_USE">
+ Medium is attached to a virtual machine.
+ </result>
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Storage deletion is not allowed because neither of storage creation
+ operations are supported. See
+ <link to="IMediumFormat::capabilities"/>.
+ </result>
+
+ <note>
+ If the deletion operation fails, it is not guaranteed that the storage
+ unit still exists. You may check the <link to="IMedium::state"/> value
+ to answer this question.
+ </note>
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <!-- diff methods -->
+
+ <method name="createDiffStorage" wrap-hint-server="passcaller">
+ <rest request="post" path="/media/{mediumid}/actions/"/>
+ <desc>
+ Starts creating an empty differencing storage unit based on this
+ medium in the format and at the location defined by the @a target
+ argument.
+
+ The target medium must be in <link to="MediumState_NotCreated"/>
+ state (i.e. must not have an existing storage unit). Upon successful
+ completion, this operation will set the type of the target medium to
+ <link to="MediumType_Normal"/> and create a storage unit necessary to
+ represent the differencing medium data in the given format (according
+ to the storage format of the target object).
+
+ After the returned progress object reports that the operation is
+ successfully complete, the target medium gets remembered by this
+ VirtualBox installation and may be attached to virtual machines.
+
+ <note>
+ The medium will be set to <link to="MediumState_LockedRead"/>
+ state for the duration of this operation.
+ </note>
+ <result name="VBOX_E_OBJECT_IN_USE">
+ Medium not in @c NotCreated state.
+ </result>
+ </desc>
+ <param name="target" type="IMedium" dir="in">
+ <desc>Target medium.</desc>
+ </param>
+ <param name="variant" type="MediumVariant" safearray="yes" dir="in">
+ <desc>Exact image variant which should be created (as a combination of
+ <link to="MediumVariant" /> flags).</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="mergeTo">
+ <rest request="post" path="/media/{mediumid}/actions/"/>
+ <desc>
+ Starts merging the contents of this medium and all intermediate
+ differencing media in the chain to the given target medium.
+
+ The target medium must be either a descendant of this medium or
+ its ancestor (otherwise this method will immediately return a failure).
+ It follows that there are two logical directions of the merge operation:
+ from ancestor to descendant (<i>forward merge</i>) and from descendant to
+ ancestor (<i>backward merge</i>). Let us consider the following medium
+ chain:
+
+ <pre>Base &lt;- Diff_1 &lt;- Diff_2</pre>
+
+ Here, calling this method on the <tt>Base</tt> medium object with
+ <tt>Diff_2</tt> as an argument will be a forward merge; calling it on
+ <tt>Diff_2</tt> with <tt>Base</tt> as an argument will be a backward
+ merge. Note that in both cases the contents of the resulting medium
+ will be the same, the only difference is the medium object that takes
+ the result of the merge operation. In case of the forward merge in the
+ above example, the result will be written to <tt>Diff_2</tt>; in case of
+ the backward merge, the result will be written to <tt>Base</tt>. In
+ other words, the result of the operation is always stored in the target
+ medium.
+
+ Upon successful operation completion, the storage units of all media in
+ the chain between this (source) medium and the target medium, including
+ the source medium itself, will be automatically deleted and the
+ relevant medium objects (including this medium) will become
+ uninitialized. This means that any attempt to call any of
+ their methods or attributes will fail with the
+ <tt>"Object not ready" (E_ACCESSDENIED)</tt> error. Applied to the above
+ example, the forward merge of <tt>Base</tt> to <tt>Diff_2</tt> will
+ delete and uninitialize both <tt>Base</tt> and <tt>Diff_1</tt> media.
+ Note that <tt>Diff_2</tt> in this case will become a base medium
+ itself since it will no longer be based on any other medium.
+
+ Considering the above, all of the following conditions must be met in
+ order for the merge operation to succeed:
+ <ul>
+ <li>
+ Neither this (source) medium nor any intermediate
+ differencing medium in the chain between it and the target
+ medium is attached to any virtual machine.
+ </li>
+ <li>
+ Neither the source medium nor the target medium is an
+ <link to="MediumType_Immutable"/> medium.
+ </li>
+ <li>
+ The part of the medium tree from the source medium to the
+ target medium is a linear chain, i.e. all medium in this
+ chain have exactly one child which is the next medium in this
+ chain. The only exception from this rule is the target medium in
+ the forward merge operation; it is allowed to have any number of
+ child media because the merge operation will not change its
+ logical contents (as it is seen by the guest OS or by children).
+ </li>
+ <li>
+ None of the involved media are in
+ <link to="MediumState_LockedRead"/> or
+ <link to="MediumState_LockedWrite"/> state.
+ </li>
+ </ul>
+
+ <note>
+ This (source) medium and all intermediates will be placed to <link
+ to="MediumState_Deleting"/> state and the target medium will be
+ placed to <link to="MediumState_LockedWrite"/> state and for the
+ duration of this operation.
+ </note>
+ </desc>
+ <param name="target" type="IMedium" dir="in">
+ <desc>Target medium.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <!-- clone method -->
+
+ <method name="cloneTo">
+ <rest request="post" path="/media/{mediumid}/actions/"/>
+ <desc>
+ Starts creating a clone of this medium in the format and at the
+ location defined by the @a target argument.
+
+ The target medium must be either in <link to="MediumState_NotCreated"/>
+ state (i.e. must not have an existing storage unit) or in
+ <link to="MediumState_Created"/> state (i.e. created and not locked, and
+ big enough to hold the data or else the copy will be partial). Upon
+ successful completion, the cloned medium will contain exactly the
+ same sector data as the medium being cloned, except that in the
+ first case a new UUID for the clone will be randomly generated, and in
+ the second case the UUID will remain unchanged.
+
+ The @a parent argument defines which medium will be the parent
+ of the clone. Passing a @c null reference indicates that the clone will
+ be a base image, i.e. completely independent. It is possible to specify
+ an arbitrary medium for this parameter, including the parent of the
+ medium which is being cloned. Even cloning to a child of the source
+ medium is possible. Note that when cloning to an existing image, the
+ @a parent argument is ignored.
+
+ After the returned progress object reports that the operation is
+ successfully complete, the target medium gets remembered by this
+ VirtualBox installation and may be attached to virtual machines.
+
+ <note>
+ This medium will be placed to <link to="MediumState_LockedRead"/>
+ state for the duration of this operation.
+ </note>
+ <result name="E_NOTIMPL">
+ The specified cloning variant is not supported at the moment.
+ </result>
+ </desc>
+ <param name="target" type="IMedium" dir="in">
+ <desc>Target medium.</desc>
+ </param>
+ <param name="variant" type="MediumVariant" safearray="yes" dir="in">
+ <desc>Exact image variant which should be created (as a combination of
+ <link to="MediumVariant" /> flags).</desc>
+ </param>
+ <param name="parent" type="IMedium" dir="in">
+ <desc>Parent of the cloned medium.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="cloneToBase">
+ <rest request="post" path="/media/{mediumid}/actions/"/>
+ <desc>
+ Starts creating a clone of this medium in the format and at the
+ location defined by the @a target argument.
+
+ The target medium must be either in <link to="MediumState_NotCreated"/>
+ state (i.e. must not have an existing storage unit) or in
+ <link to="MediumState_Created"/> state (i.e. created and not locked, and
+ big enough to hold the data or else the copy will be partial). Upon
+ successful completion, the cloned medium will contain exactly the
+ same sector data as the medium being cloned, except that in the
+ first case a new UUID for the clone will be randomly generated, and in
+ the second case the UUID will remain unchanged.
+
+ The @a parent argument defines which medium will be the parent
+ of the clone. In this case the clone will be a base image, i.e.
+ completely independent. It is possible to specify an arbitrary
+ medium for this parameter, including the parent of the
+ medium which is being cloned. Even cloning to a child of the source
+ medium is possible. Note that when cloning to an existing image, the
+ @a parent argument is ignored.
+
+ After the returned progress object reports that the operation is
+ successfully complete, the target medium gets remembered by this
+ VirtualBox installation and may be attached to virtual machines.
+
+ <note>
+ This medium will be placed to <link to="MediumState_LockedRead"/>
+ state for the duration of this operation.
+ </note>
+ <result name="E_NOTIMPL">
+ The specified cloning variant is not supported at the moment.
+ </result>
+ </desc>
+ <param name="target" type="IMedium" dir="in">
+ <desc>Target medium.</desc>
+ </param>
+ <param name="variant" type="MediumVariant" safearray="yes" dir="in">
+ <desc><link to="MediumVariant" /> flags).</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <!-- other methods -->
+
+ <method name="moveTo" wrap-hint-server="passcaller">
+ <rest request="post" path="/media/{mediumid}/actions/"/>
+ <desc>
+ Changes the location of this medium. Some medium types may support
+ changing the storage unit location by simply changing the value of the
+ associated property. In this case the operation is performed
+ immediately, and @a progress is returning a @c null reference.
+ Otherwise on success there is a progress object returned, which
+ signals progress and completion of the operation. This distinction is
+ necessary because for some formats the operation is very fast, while
+ for others it can be very slow (moving the image file by copying all
+ data), and in the former case it'd be a waste of resources to create
+ a progress object which will immediately signal completion.
+
+ When setting a location for a medium which corresponds to a/several
+ regular file(s) in the host's file system, the given file name may be
+ either relative to the <link to="IVirtualBox::homeFolder">VirtualBox
+ home folder</link> or absolute. Note that if the given location
+ specification does not contain the file extension part then a proper
+ default extension will be automatically appended by the implementation
+ depending on the medium type.
+
+ <result name="E_NOTIMPL">
+ The operation is not implemented yet.
+ </result>
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Medium format does not support changing the location.
+ </result>
+ </desc>
+ <param name="location" type="wstring" dir="in">
+ <desc>New location.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="compact">
+ <rest request="post" path="/media/{mediumid}/actions/"/>
+ <desc>
+ Starts compacting of this medium. This means that the medium is
+ transformed into a possibly more compact storage representation.
+ This potentially creates temporary images, which can require a
+ substantial amount of additional disk space.
+
+ This medium will be placed to <link to="MediumState_LockedWrite"/>
+ state and all its parent media (if any) will be placed to
+ <link to="MediumState_LockedRead"/> state for the duration of this
+ operation.
+
+ Please note that the results can be either returned straight away,
+ or later as the result of the background operation via the object
+ returned via the @a progress parameter.
+
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Medium format does not support compacting (but potentially
+ needs it).
+ </result>
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="resize">
+ <rest request="post" path="/media/{mediumid}/actions/"/>
+ <desc>
+ Starts resizing this medium. This means that the nominal size of the
+ medium is set to the new value. Both increasing and decreasing the
+ size is possible, and there are no safety checks, since VirtualBox
+ does not make any assumptions about the medium contents.
+
+ Resizing usually needs additional disk space, and possibly also
+ some temporary disk space. Note that resize does not create a full
+ temporary copy of the medium, so the additional disk space requirement
+ is usually much lower than using the clone operation.
+
+ This medium will be placed to <link to="MediumState_LockedWrite"/>
+ state for the duration of this operation.
+
+ Please note that the results can be either returned straight away,
+ or later as the result of the background operation via the object
+ returned via the @a progress parameter.
+
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Medium format does not support resizing.
+ </result>
+ </desc>
+ <param name="logicalSize" type="long long" dir="in">
+ <desc>New nominal capacity of the medium in bytes.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="reset" wrap-hint-server="passcaller">
+ <rest request="post" path="/media/{mediumid}/actions/"/>
+ <desc>
+ Starts erasing the contents of this differencing medium.
+
+ This operation will reset the differencing medium to its initial
+ state when it does not contain any sector data and any read operation is
+ redirected to its parent medium. This automatically gets called
+ during VM power-up for every medium whose <link to="#autoReset" />
+ attribute is @c true.
+
+ The medium will be write-locked for the duration of this operation (see
+ <link to="#lockWrite" />).
+
+ <result name="VBOX_E_NOT_SUPPORTED">
+ This is not a differencing medium.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Medium is not in <link to="MediumState_Created"/> or
+ <link to="MediumState_Inaccessible"/> state.
+ </result>
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="changeEncryption">
+ <rest request="post" path="/media/{mediumid}/actions/"/>
+ <desc>
+ Starts encryption of this medium. This means that the stored data in the
+ medium is encrypted.
+
+ This medium will be placed to <link to="MediumState_LockedWrite"/>
+ state.
+
+ Please note that the results can be either returned straight away,
+ or later as the result of the background operation via the object
+ returned via the @a progress parameter.
+
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Encryption is not supported for this medium because it is attached to more than one VM
+ or has children.
+ </result>
+ </desc>
+ <param name="currentPassword" type="wstring" dir="in">
+ <desc>
+ The current password the medium is protected with. Use an empty string to indicate
+ that the medium isn't encrypted.
+ </desc>
+ </param>
+ <param name="cipher" type="wstring" dir="in">
+ <desc>
+ The cipher to use for encryption. An empty string indicates no encryption for the
+ result.
+ </desc>
+ </param>
+ <param name="newPassword" type="wstring" dir="in">
+ <desc>
+ The new password the medium should be protected with. An empty password and password ID
+ will result in the medium being encrypted with the current password.
+ </desc>
+ </param>
+ <param name="newPasswordId" type="wstring" dir="in">
+ <desc>The ID of the new password when unlocking the medium.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="getEncryptionSettings" const="yes" wrap-hint-server="passcaller">
+ <rest request="get" path="/media/{mediumid}/configuration/"/>
+ <desc>
+ Returns the encryption settings for this medium.
+
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Encryption is not configured for this medium.
+ </result>
+ </desc>
+ <param name="cipher" type="wstring" dir="out">
+ <desc>The cipher used for encryption.</desc>
+ </param>
+ <param name="passwordId" type="wstring" dir="return">
+ <desc>The ID of the password when unlocking the medium.</desc>
+ </param>
+ </method>
+
+ <method name="checkEncryptionPassword" const="yes">
+ <rest request="get" path="/media/{mediumid}/configuration/"/>
+ <desc>
+ Checks whether the supplied password is correct for the medium.
+
+ <result name="VBOX_E_NOT_SUPPORTED">
+ Encryption is not configured for this medium.
+ </result>
+ <result name="VBOX_E_PASSWORD_INCORRECT">
+ The given password is incorrect.
+ </result>
+ </desc>
+ <param name="password" type="wstring" dir="in">
+ <desc>The password to check.</desc>
+ </param>
+ </method>
+
+ <method name="openForIO">
+ <desc>
+ Open the medium for I/O.
+ </desc>
+ <param name="writable" type="boolean" dir="in">
+ <desc>Set this to open the medium for both reading and writing. When
+ not set the medium is opened readonly.</desc>
+ </param>
+ <param name="password" type="wstring" dir="in">
+ <desc>Password for accessing an encrypted medium. Must be empty if not encrypted.</desc>
+ </param>
+ <param name="mediumIO" type="IMediumIO" dir="return">
+ <desc>Medium I/O object.</desc>
+ </param>
+ </method>
+
+ <method name="resizeAndCloneTo">
+ <rest request="post" path="/media/{mediumid}/actions/"/>
+
+ <desc>
+ This is a helper function that combines the functionality of
+ <link to="IMedium::cloneTo"/> and <link to="IMedium::resize"/>. The target medium will take the
+ contents of the calling medium.
+ <result name="E_NOTIMPL">
+ The specified cloning variant is not supported at the moment.
+ </result>
+
+ <note>
+ Method will be moved to appropriate location at the next major API release.
+ </note>
+ </desc>
+
+ <param name="target" type="IMedium" dir="in">
+ <desc>Target medium.</desc>
+ </param>
+ <param name="logicalSize" type="long long" dir="in">
+ <desc>New nominal capacity of the medium in bytes.</desc>
+ </param>
+ <param name="variant" type="MediumVariant" safearray="yes" dir="in">
+ <desc>Exact image variant which should be created (as a combination of
+ <link to="MediumVariant" /> flags).</desc>
+ </param>
+ <param name="parent" type="IMedium" dir="in">
+ <desc>Parent of the cloned medium.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+
+ <!--
+ // IMediumFormat
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="DataType"
+ uuid="d90ea51e-a3f1-4a01-beb1-c1723c0d3ba7"
+ >
+ <const name="Int32" value="0"/>
+ <const name="Int8" value="1"/>
+ <const name="String" value="2"/>
+ </enum>
+
+ <enum
+ name="DataFlags"
+ uuid="86884dcf-1d6b-4f1b-b4bf-f5aa44959d60"
+ >
+ <const name="None" value="0x00"/>
+ <const name="Mandatory" value="0x01"/>
+ <const name="Expert" value="0x02"/>
+ <const name="Array" value="0x04"/>
+ <const name="FlagMask" value="0x07"/>
+ </enum>
+
+ <enum
+ name="MediumFormatCapabilities"
+ uuid="7342ba79-7ce0-4d94-8f86-5ed5a185d9bd"
+ >
+ <desc>
+ Medium format capability flags.
+ </desc>
+
+ <const name="Uuid" value="0x01">
+ <desc>
+ Supports UUIDs as expected by VirtualBox code.
+ </desc>
+ </const>
+
+ <const name="CreateFixed" value="0x02">
+ <desc>
+ Supports creating fixed size images, allocating all space instantly.
+ </desc>
+ </const>
+
+ <const name="CreateDynamic" value="0x04">
+ <desc>
+ Supports creating dynamically growing images, allocating space on
+ demand.
+ </desc>
+ </const>
+
+ <const name="CreateSplit2G" value="0x08">
+ <desc>
+ Supports creating images split in chunks of a bit less than 2 GBytes.
+ </desc>
+ </const>
+
+ <const name="Differencing" value="0x10">
+ <desc>
+ Supports being used as a format for differencing media (see <link
+ to="IMedium::createDiffStorage"/>).
+ </desc>
+ </const>
+
+ <const name="Asynchronous" value="0x20">
+ <desc>
+ Supports asynchronous I/O operations for at least some configurations.
+ </desc>
+ </const>
+
+ <const name="File" value="0x40">
+ <desc>
+ The format backend operates on files (the <link to="IMedium::location"/>
+ attribute of the medium specifies a file used to store medium
+ data; for a list of supported file extensions see
+ <link to="IMediumFormat::describeFileExtensions"/>).
+ </desc>
+ </const>
+
+ <const name="Properties" value="0x80">
+ <desc>
+ The format backend uses the property interface to configure the storage
+ location and properties (the <link to="IMediumFormat::describeProperties"/>
+ method is used to get access to properties supported by the given medium format).
+ </desc>
+ </const>
+
+ <const name="TcpNetworking" value="0x100">
+ <desc>
+ The format backend uses the TCP networking interface for network access.
+ </desc>
+ </const>
+
+ <const name="VFS" value="0x200">
+ <desc>
+ The format backend supports virtual filesystem functionality.
+ </desc>
+ </const>
+
+ <const name="Discard" value="0x400">
+ <desc>
+ The format backend supports discarding blocks.
+ </desc>
+ </const>
+
+ <const name="Preferred" value="0x800">
+ <desc>
+ Indicates that this is a frequently used format backend.
+ </desc>
+ </const>
+
+ <const name="CapabilityMask" value="0xFFF"/>
+ </enum>
+
+ <interface
+ name="IMediumFormat" extends="$unknown"
+ uuid="11be93c7-a862-4dc9-8c89-bf4ba74a886a"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="2" reservedAttributes="4"
+ >
+ <desc>
+ The IMediumFormat interface represents a medium format.
+
+ Each medium format has an associated backend which is used to handle
+ media stored in this format. This interface provides information
+ about the properties of the associated backend.
+
+ Each medium format is identified by a string represented by the
+ <link to="#id"/> attribute. This string is used in calls like
+ <link to="IVirtualBox::createMedium"/> to specify the desired
+ format.
+
+ The list of all supported medium formats can be obtained using
+ <link to="ISystemProperties::mediumFormats"/>.
+
+ <see><link to="IMedium"/></see>
+ </desc>
+
+ <attribute name="id" type="wstring" readonly="yes">
+ <desc>
+ Identifier of this format.
+
+ The format identifier is a non-@c null non-empty ASCII string. Note that
+ this string is case-insensitive. This means that, for example, all of
+ the following strings:
+ <pre>
+ "VDI"
+ "vdi"
+ "VdI"</pre>
+ refer to the same medium format.
+
+ This string is used in methods of other interfaces where it is necessary
+ to specify a medium format, such as
+ <link to="IVirtualBox::createMedium"/>.
+ </desc>
+ </attribute>
+
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>
+ Human readable description of this format.
+
+ Mainly for use in file open dialogs.
+ </desc>
+ </attribute>
+
+ <attribute name="capabilities" type="MediumFormatCapabilities" safearray="yes" readonly="yes">
+ <desc>
+ Capabilities of the format as an array of the flags.
+
+ For the meaning of individual capability flags see
+ <link to="MediumFormatCapabilities"/>.
+ </desc>
+ </attribute>
+
+ <method name="describeFileExtensions" const="yes">
+ <desc>
+ Returns two arrays describing the supported file extensions.
+
+ The first array contains the supported extensions and the seconds one
+ the type each extension supports. Both have the same size.
+
+ Note that some backends do not work on files, so this array may be
+ empty.
+
+ <see><link to="IMediumFormat::capabilities"/></see>
+ </desc>
+ <param name="extensions" type="wstring" safearray="yes" dir="out">
+ <desc>The array of supported extensions.</desc>
+ </param>
+ <param name="types" type="DeviceType" safearray="yes" dir="out">
+ <desc>The array which indicates the device type for every given extension.</desc>
+ </param>
+ </method>
+
+ <method name="describeProperties" const="yes">
+ <desc>
+ Returns several arrays describing the properties supported by this
+ format.
+
+ An element with the given index in each array describes one
+ property. Thus, the number of elements in each returned array is the
+ same and corresponds to the number of supported properties.
+
+ The returned arrays are filled in only if the
+ <link to="MediumFormatCapabilities_Properties"/> flag is set.
+ All arguments must be non-@c null.
+
+ <see><link to="DataType"/>, <link to="DataFlags"/></see>
+ </desc>
+
+ <param name="names" type="wstring" safearray="yes" dir="out">
+ <desc>Array of property names.</desc>
+ </param>
+ <param name="descriptions" type="wstring" safearray="yes" dir="out">
+ <desc>Array of property descriptions.</desc>
+ </param>
+ <param name="types" type="DataType" safearray="yes" dir="out">
+ <desc>Array of property types.</desc>
+ </param>
+ <param name="flags" type="unsigned long" safearray="yes" dir="out">
+ <desc>Array of property flags.</desc>
+ </param>
+ <param name="defaults" type="wstring" safearray="yes" dir="out">
+ <desc>Array of default property values.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <!--
+ // IDataStream
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IDataStream" extends="$unknown"
+ uuid="a338ed20-58d9-43ae-8b03-c1fd7088ef15"
+ wsmap="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>
+ The IDataStream interface is used to retrieve a data stream. It is
+ returned by <link to="IMediumIO::convertToStream"/>.
+ </desc>
+
+ <attribute name="readSize" type="unsigned long" readonly="yes">
+ <desc>Recommended size of a read. Requesting a larger read may be
+ possible in certain situations, but it is not guaranteed.</desc>
+ </attribute>
+
+ <method name="read">
+ <desc>
+ Read data from the stream.
+ <result name="VBOX_E_TIMEOUT">
+ Waiting time has expired.
+ </result>
+ </desc>
+ <param name="size" type="unsigned long" dir="in">
+ <desc>How many bytes to try read.</desc>
+ </param>
+ <param name="timeoutMS" type="unsigned long" dir="in">
+ <desc>
+ Timeout (in ms) for limiting the wait time for data to be available.
+ Pass 0 for an infinite timeout.
+ </desc>
+ </param>
+ <param name="data" type="octet" dir="return" safearray="yes">
+ <desc>Array of data read. This may be shorter than the specified size.
+ Returning a zero-sized array indicates the end of the stream, if the
+ status is successful.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <!--
+ // IMediumIO
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="PartitionTableType"
+ uuid="360066eb-d19e-4fa1-57ef-fed434fbe2a9"
+ >
+ <desc>
+ Partition table types.
+ </desc>
+
+ <const name="MBR" value="1"/>
+ <const name="GPT" value="2"/>
+ </enum>
+
+
+ <interface
+ name="IMediumIO" extends="$unknown"
+ uuid="e4b301a9-5f86-4d65-ad1b-87ca284fb1c8"
+ wsmap="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>
+ The IMediumIO interface is used to access and modify the content of a
+ medium. It is returned by <link to="IMedium::openForIO"/>.
+ </desc>
+
+ <attribute name="medium" type="IMedium" readonly="yes">
+ <desc>The open medium.</desc>
+ </attribute>
+
+ <attribute name="writable" type="boolean" readonly="yes">
+ <desc>Whether the medium can be written to. (It can always be read from.)</desc>
+ </attribute>
+
+ <attribute name="explorer" type="IVFSExplorer" readonly="yes">
+ <desc>
+ Returns the virtual file system explorer for the medium.
+
+ This will attempt to recognize the format of the medium content and
+ present it as a virtual directory structure to the API user.
+
+ A FAT floppy image will be represented will a single root subdir 'fat12'
+ that gives access to the file system content.
+
+ A ISO-9660 image will have one subdir in the root for each format present
+ in the image, so the API user can select which data view to access (iso9660,
+ rockridge, joliet, udf, hfs, ...).
+
+ A partitioned harddisk image will have subdirs for each partition. The
+ the filesystem content of each partition can be accessed thru the subdirs
+ if we have a file system interpreter for it. There will also be raw files
+ for each subdirectory, to provide a simple way of accessing raw partition
+ data from an API client.
+
+ Please note that the explorer may show inconsistent information if
+ the API user modifies the raw image content after it was opened.
+ </desc>
+ </attribute>
+
+ <method name="read">
+ <desc>
+ Read data from the medium.
+ </desc>
+ <param name="offset" type="long long" dir="in">
+ <desc>The byte offset into the medium to start reading at.</desc>
+ </param>
+ <param name="size" type="unsigned long" dir="in">
+ <desc>How many bytes to try read.</desc>
+ </param>
+ <param name="data" type="octet" dir="return" safearray="yes">
+ <desc>Array of data read. This may be shorter than the specified size.</desc>
+ </param>
+ </method>
+
+ <method name="write">
+ <desc>
+ Write data to the medium.
+ </desc>
+ <param name="offset" type="long long" dir="in">
+ <desc>The byte offset into the medium to start reading at.</desc>
+ </param>
+ <param name="data" type="octet" dir="in" safearray="yes">
+ <desc>Array of data to write.</desc>
+ </param>
+ <param name="written" type="unsigned long" dir="return">
+ <desc>How many bytes were actually written.</desc>
+ </param>
+ </method>
+
+ <method name="formatFAT">
+ <desc>
+ Formats the medium as FAT. Generally only useful for floppy images as
+ no partition table will be created.
+ </desc>
+ <param name="quick" type="boolean" dir="in">
+ <desc>Quick format it when set.</desc>
+ </param>
+ </method>
+
+ <method name="initializePartitionTable">
+ <desc>
+ Writes an empty partition table to the disk.
+ </desc>
+ <param name="format" type="PartitionTableType" dir="in">
+ <desc>The partition table format.</desc>
+ </param>
+ <param name="wholeDiskInOneEntry" type="boolean" dir="in">
+ <desc>
+ When @c true a partition table entry for the whole disk is created.
+ Otherwise the partition table is empty.
+ </desc>
+ </param>
+ </method>
+
+ <method name="convertToStream">
+ <desc>
+ Converts the currently opened image into a stream of the specified
+ image type/variant. It is sufficient to open the image in read-only
+ mode. Only few types and variants are supported due to the inherent
+ restrictions of the output style.
+ <result name="VBOX_E_NOT_SUPPORTED">
+ The requested format/variant combination cannot handle stream output.
+ </result>
+ <result name="VBOX_E_FILE_ERROR">
+ An error occurred during the conversion.
+ </result>
+ </desc>
+ <param name="format" type="wstring" dir="in">
+ <desc>Identifier of the storage format to use for output.</desc>
+ </param>
+ <param name="variant" type="MediumVariant" safearray="yes" dir="in">
+ <desc>The partition table format.</desc>
+ </param>
+ <param name="bufferSize" type="unsigned long" dir="in">
+ <desc>
+ Requested buffer size (in bytes) for efficient conversion. Sizes
+ which are too small or too large are silently truncated to suitable
+ values. Tens to hundreds of Megabytes are a good choice.
+ </desc>
+ </param>
+ <param name="stream" type="IDataStream" dir="out">
+ <desc>Data stream object for reading the target image.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="close">
+ <desc>
+ Explictly close the medium I/O rather than waiting for garbage
+ collection and the destructor.
+
+ This will wait for any pending reads and writes to complete and then
+ close down the I/O access without regard for open explorer instances or
+ anything like that.
+ </desc>
+ </method>
+
+ </interface>
+
+
+ <!--
+ // IToken
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IToken" extends="$unknown"
+ uuid="20479eaf-d8ed-44cf-85ac-c83a26c95a4d"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="1" reservedAttributes="2"
+ >
+ <desc>
+ The IToken interface represents a token passed to an API client, which
+ triggers cleanup actions when it is explicitly released by calling the
+ <link to="#abandon"/> method (preferred, as it is accurately defined
+ when the release happens), or when the object reference count drops
+ to 0. The latter way is implicitly used when an API client crashes,
+ however the discovery that there was a crash can take rather long,
+ depending on the platform (COM needs 6 minutes). So better don't rely
+ on the crash behavior too much.
+ </desc>
+
+ <method name="abandon" wrap-hint-server="passcaller">
+ <desc>Releases this token. Cannot be undone in any way, and makes the
+ token object unusable (even the <link to="#dummy"/> method will return
+ an error), ready for releasing. It is a more defined way than just
+ letting the reference count drop to 0, because the latter (depending
+ on the platform) can trigger asynchronous cleanup activity.
+ </desc>
+ </method>
+
+ <method name="dummy">
+ <desc>Purely a NOOP. Useful when using proxy type API bindings (e.g. the
+ webservice) which manage objects on behalf of the actual client, using
+ an object reference expiration time based garbage collector.
+ </desc>
+ </method>
+
+ </interface>
+
+
+ <!--
+ // IKeyboard
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="KeyboardLED"
+ uuid="ef29ea38-409b-49c7-a817-c858d426dfba"
+ >
+ <desc>
+ Keyboard LED indicators.
+ </desc>
+
+ <const name="NumLock" value="0x01"/>
+ <const name="CapsLock" value="0x02"/>
+ <const name="ScrollLock" value="0x04"/>
+ </enum>
+
+ <interface
+ name="IKeyboard" extends="$unknown"
+ uuid="755e6bdf-1640-41f9-bd74-3ef5fd653250"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="4"
+ >
+ <desc>
+ The IKeyboard interface represents the virtual machine's keyboard. Used
+ in <link to="IConsole::keyboard"/>.
+
+ Use this interface to send keystrokes or the Ctrl-Alt-Del sequence
+ to the virtual machine.
+ </desc>
+
+ <attribute name="keyboardLEDs" type="KeyboardLED" safearray="yes" readonly="yes">
+ <desc>
+ Current status of the guest keyboard LEDs.
+ </desc>
+ </attribute>
+
+ <method name="putScancode">
+ <desc>Sends a scancode to the keyboard.
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Could not send scan code to virtual keyboard.
+ </result>
+
+ </desc>
+ <param name="scancode" type="long" dir="in"/>
+ </method>
+
+ <method name="putScancodes">
+ <desc>Sends an array of scancodes to the keyboard.
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Could not send all scan codes to virtual keyboard.
+ </result>
+
+ </desc>
+ <param name="scancodes" type="long" dir="in" safearray="yes"/>
+ <param name="codesStored" type="unsigned long" dir="return"/>
+ </method>
+
+ <method name="putCAD">
+ <desc>Sends the Ctrl-Alt-Del sequence to the keyboard. This
+ function is nothing special, it is just a convenience function
+ calling <link to="IKeyboard::putScancodes"/> with the proper scancodes.
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Could not send all scan codes to virtual keyboard.
+ </result>
+
+ </desc>
+ </method>
+
+ <method name="releaseKeys">
+ <desc>Causes the virtual keyboard to release any keys which are
+ currently pressed. Useful when host and guest keyboard may be out
+ of sync.
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Could not release some or all keys.
+ </result>
+
+ </desc>
+ </method>
+
+ <method name="putUsageCode">
+ <desc>Sends a USB HID usage code and page to the keyboard. The
+ keyRelease flag is set when the key is being released.
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Could not send usage code to virtual keyboard.
+ </result>
+
+ </desc>
+ <param name="usageCode" type="long" dir="in"/>
+ <param name="usagePage" type="long" dir="in"/>
+ <param name="keyRelease" type="boolean" dir="in"/>
+ </method>
+
+ <attribute name="eventSource" type="IEventSource" readonly="yes">
+ <desc>
+ Event source for keyboard events.
+ </desc>
+ </attribute>
+
+ </interface>
+
+
+ <!--
+ // IMouse
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="MouseButtonState"
+ uuid="9ee094b8-b28a-4d56-a166-973cb588d7f8"
+ >
+ <desc>
+ Mouse button state.
+ </desc>
+
+ <const name="LeftButton" value="0x01"/>
+ <const name="RightButton" value="0x02"/>
+ <const name="MiddleButton" value="0x04"/>
+ <const name="WheelUp" value="0x08"/>
+ <const name="WheelDown" value="0x10"/>
+ <const name="XButton1" value="0x20"/>
+ <const name="XButton2" value="0x40"/>
+ <const name="MouseStateMask" value="0x7F"/>
+ </enum>
+
+ <enum
+ name="TouchContactState"
+ uuid="3f942686-2506-421c-927c-90d4b45f4a38"
+ >
+ <desc>
+ Touch event contact state.
+ </desc>
+
+ <const name="None" value="0x00">
+ <desc>The touch has finished.</desc>
+ </const>
+ <const name="InContact" value="0x01">
+ <desc>Whether the touch is really touching the device.</desc>
+ </const>
+ <const name="InRange" value="0x02">
+ <desc>
+ Whether the touch is close enough to the device to be detected.
+ </desc>
+ </const>
+ <const name="ContactStateMask" value="0x03"/>
+ </enum>
+
+ <interface
+ name="IMousePointerShape" extends="$unknown"
+ uuid="1e775ea3-9070-4f9c-b0d5-53054496dbe0"
+ wsmap="managed"
+ rest="managed"
+ reservedAttributes="4"
+ >
+ <desc>
+ The guest mouse pointer description.
+ </desc>
+
+ <attribute name="visible" type="boolean" readonly="yes">
+ <desc>
+ Flag whether the pointer is visible.
+ </desc>
+ </attribute>
+ <attribute name="alpha" type="boolean" readonly="yes">
+ <desc>
+ Flag whether the pointer has an alpha channel.
+ </desc>
+ </attribute>
+ <attribute name="hotX" type="unsigned long" readonly="yes">
+ <desc>
+ The pointer hot spot X coordinate.
+ </desc>
+ </attribute>
+ <attribute name="hotY" type="unsigned long" readonly="yes">
+ <desc>
+ The pointer hot spot Y coordinate.
+ </desc>
+ </attribute>
+ <attribute name="width" type="unsigned long" readonly="yes">
+ <desc>
+ Width of the pointer shape in pixels.
+ </desc>
+ </attribute>
+ <attribute name="height" type="unsigned long" readonly="yes">
+ <desc>
+ Height of the pointer shape in pixels.
+ </desc>
+ </attribute>
+ <attribute name="shape" type="octet" safearray="yes" readonly="yes">
+ <desc>
+ Shape bitmaps.
+
+ The @a shape buffer contains a 1bpp (bits per pixel) AND mask
+ followed by a 32bpp XOR (color) mask.
+
+ For pointers without alpha channel the XOR mask pixels are
+ 32 bit values: (lsb)BGR0(msb). For pointers with alpha channel
+ the XOR mask consists of (lsb)BGRA(msb) 32 bit values.
+
+ An AND mask is provided for pointers with alpha channel, so if the
+ client does not support alpha, the pointer could be
+ displayed as a normal color pointer.
+
+ The AND mask is a 1bpp bitmap with byte aligned scanlines. The
+ size of the AND mask therefore is <tt>cbAnd = (width + 7) / 8 *
+ height</tt>. The padding bits at the end of each scanline are
+ undefined.
+
+ The XOR mask follows the AND mask on the next 4-byte aligned
+ offset: <tt>uint8_t *pu8Xor = pu8And + (cbAnd + 3) &amp; ~3</tt>.
+ Bytes in the gap between the AND and the XOR mask are undefined.
+ The XOR mask scanlines have no gap between them and the size of
+ the XOR mask is: <tt>cbXor = width * 4 * height</tt>.
+
+ <note>
+ If @a shape size is 0, then the shape is not known or did not change.
+ This can happen if only the pointer visibility is changed.
+ </note>
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IMouse" extends="$unknown"
+ uuid="25360a74-55e5-4f14-ac2a-f5cf8e62e4af"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="4"
+ >
+ <desc>
+ The IMouse interface represents the virtual machine's mouse. Used in
+ <link to="IConsole::mouse"/>.
+
+ Through this interface, the virtual machine's virtual mouse can be
+ controlled.
+ </desc>
+
+ <attribute name="absoluteSupported" type="boolean" readonly="yes">
+ <desc>
+ Whether the guest OS supports absolute mouse pointer positioning
+ or not.
+ <note>
+ You can use the <link to="IMouseCapabilityChangedEvent"/>
+ event to be instantly informed about changes of this attribute
+ during virtual machine execution.
+ </note>
+ <see><link to="#putMouseEventAbsolute"/></see>
+ </desc>
+ </attribute>
+
+ <attribute name="relativeSupported" type="boolean" readonly="yes">
+ <desc>
+ Whether the guest OS supports relative mouse pointer positioning
+ or not.
+ <note>
+ You can use the <link to="IMouseCapabilityChangedEvent"/>
+ event to be instantly informed about changes of this attribute
+ during virtual machine execution.
+ </note>
+ <see><link to="#putMouseEvent"/></see>
+ </desc>
+ </attribute>
+
+ <attribute name="touchScreenSupported" type="boolean" readonly="yes">
+ <desc>
+ Whether the guest OS has enabled the multi-touch reporting device,
+ touchscreen variant.
+ <note>
+ You can use the <link to="IMouseCapabilityChangedEvent"/>
+ event to be instantly informed about changes of this attribute
+ during virtual machine execution.
+ </note>
+ <see><link to="#putMouseEvent"/></see>
+ </desc>
+ </attribute>
+
+ <attribute name="touchPadSupported" type="boolean" readonly="yes">
+ <desc>
+ Whether the guest OS has enabled the multi-touch reporting device,
+ touchpad variant.
+ <note>
+ You can use the <link to="IMouseCapabilityChangedEvent"/>
+ event to be instantly informed about changes of this attribute
+ during virtual machine execution.
+ </note>
+ <see><link to="#putMouseEvent"/></see>
+ </desc>
+ </attribute>
+
+ <attribute name="needsHostCursor" type="boolean" readonly="yes">
+ <desc>
+ Whether the guest OS can currently switch to drawing it's own mouse
+ cursor on demand.
+ <note>
+ You can use the <link to="IMouseCapabilityChangedEvent"/>
+ event to be instantly informed about changes of this attribute
+ during virtual machine execution.
+ </note>
+ <see><link to="#putMouseEvent"/></see>
+ </desc>
+ </attribute>
+
+ <attribute name="pointerShape" type="IMousePointerShape" readonly="yes">
+ <desc>
+ The current mouse pointer used by the guest.
+ </desc>
+ </attribute>
+
+ <method name="putMouseEvent">
+ <desc>
+ Initiates a mouse event using relative pointer movements
+ along x and y axis.
+
+ <result name="E_ACCESSDENIED">
+ Console not powered up.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ Could not send mouse event to virtual mouse.
+ </result>
+
+ </desc>
+
+ <param name="dx" type="long" dir="in">
+ <desc>
+ Amount of pixels the mouse should move to the right.
+ Negative values move the mouse to the left.
+ </desc>
+ </param>
+ <param name="dy" type="long" dir="in">
+ <desc>
+ Amount of pixels the mouse should move downwards.
+ Negative values move the mouse upwards.
+ </desc>
+ </param>
+ <param name="dz" type="long" dir="in">
+ <desc>
+ Amount of mouse wheel moves.
+ Positive values describe clockwise wheel rotations,
+ negative values describe counterclockwise rotations.
+ </desc>
+ </param>
+ <param name="dw" type="long" dir="in">
+ <desc>
+ Amount of horizontal mouse wheel moves.
+ Positive values describe a movement to the left,
+ negative values describe a movement to the right.
+ </desc>
+ </param>
+ <param name="buttonState" type="long" dir="in">
+ <desc>
+ The current state of mouse buttons. Every bit represents
+ a mouse button as follows:
+ <dl>
+ <dt>Bit 0 (<tt>0x01</tt>)</dt><dd>left mouse button</dd>
+ <dt>Bit 1 (<tt>0x02</tt>)</dt><dd>right mouse button</dd>
+ <dt>Bit 2 (<tt>0x04</tt>)</dt><dd>middle mouse button</dd>
+ </dl>
+ A value of @c 1 means the corresponding button is pressed.
+ otherwise it is released.
+ </desc>
+ </param>
+ </method>
+
+ <method name="putMouseEventAbsolute">
+ <desc>
+ Positions the mouse pointer using absolute x and y coordinates.
+ These coordinates are expressed in pixels and
+ start from <tt>[1,1]</tt> which corresponds to the top left
+ corner of the virtual display. The values <tt>[-1,-1]</tt> and
+ <tt>[0x7fffffff,0x7fffffff]</tt> have special meanings as
+ respectively "no data" (to signal that the host wishes to report
+ absolute pointer data in future) and "out of range" (the host
+ pointer is outside of all guest windows).
+
+ <result name="E_ACCESSDENIED">
+ Console not powered up.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ Could not send mouse event to virtual mouse.
+ </result>
+
+ <note>
+ This method will have effect only if absolute mouse
+ positioning is supported by the guest OS.
+ </note>
+
+ <see><link to="#absoluteSupported"/></see>
+ </desc>
+
+ <param name="x" type="long" dir="in">
+ <desc>
+ X coordinate of the pointer in pixels, starting from @c 1.
+ </desc>
+ </param>
+ <param name="y" type="long" dir="in">
+ <desc>
+ Y coordinate of the pointer in pixels, starting from @c 1.
+ </desc>
+ </param>
+ <param name="dz" type="long" dir="in">
+ <desc>
+ Amount of mouse wheel moves.
+ Positive values describe clockwise wheel rotations,
+ negative values describe counterclockwise rotations.
+ </desc>
+ </param>
+ <param name="dw" type="long" dir="in">
+ <desc>
+ Amount of horizontal mouse wheel moves.
+ Positive values describe a movement to the left,
+ negative values describe a movement to the right.
+ </desc>
+ </param>
+ <param name="buttonState" type="long" dir="in">
+ <desc>
+ The current state of mouse buttons. Every bit represents
+ a mouse button as follows:
+ <dl>
+ <dt>Bit 0 (<tt>0x01</tt>)</dt><dd>left mouse button</dd>
+ <dt>Bit 1 (<tt>0x02</tt>)</dt><dd>right mouse button</dd>
+ <dt>Bit 2 (<tt>0x04</tt>)</dt><dd>middle mouse button</dd>
+ </dl>
+ A value of @c 1 means the corresponding button is pressed.
+ otherwise it is released.
+ </desc>
+ </param>
+ </method>
+
+ <method name="putEventMultiTouch">
+ <desc>
+ Sends a multi-touch pointer event. For touchscreen events the
+ coordinates are expressed in pixels and start from <tt>[1,1]</tt> which
+ corresponds to the top left corner of the virtual display, for
+ touchpad events the coordinates are normalized to the range 0..0xffff.
+
+ <result name="E_ACCESSDENIED">
+ Console not powered up.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ Could not send event to virtual device.
+ </result>
+
+ <note>
+ The guest may not understand or may choose to ignore this event.
+ </note>
+
+ <see><link to="#touchScreenSupported"/> and <link to="#touchPadSupported"/></see>
+ </desc>
+
+ <param name="count" type="long" dir="in">
+ <desc>
+ Number of contacts in the event.
+ </desc>
+ </param>
+
+ <param name="contacts" type="long long" dir="in" safearray="yes">
+ <desc>
+ Each array element contains packed information about one contact.
+ Bits 0..15: X coordinate in pixels or normalized X position.
+ Bits 16..31: Y coordinate in pixels or normalized Y position.
+ Bits 32..39: contact identifier.
+ Bit 40: "in contact" flag, which indicates that there is a contact with the touch surface.
+ Bit 41: "in range" flag, the contact is close enough to the touch surface.
+ All other bits are reserved for future use and must be set to 0.
+ </desc>
+ </param>
+
+ <param name="isTouchScreen" type="boolean" dir="in">
+ <desc>
+ Distinguishes between touchscreen and touchpad events.
+ </desc>
+ </param>
+
+ <param name="scanTime" type="unsigned long" dir="in">
+ <desc>
+ Timestamp of the event in milliseconds. Only relative time between events is important.
+ </desc>
+ </param>
+ </method>
+
+ <method name="putEventMultiTouchString">
+ <desc>
+ <see><link to="#putEventMultiTouch"/></see>
+ </desc>
+
+ <param name="count" type="long" dir="in">
+ <desc>
+ <see><link to="#putEventMultiTouch"/></see>
+ </desc>
+ </param>
+
+ <param name="contacts" type="wstring" dir="in">
+ <desc>
+ Contains information about all contacts:
+ "id1,x1,y1,inContact1,inRange1;...;idN,xN,yN,inContactN,inRangeN".
+ For example for two contacts: "0,10,20,1,1;1,30,40,1,1"
+ </desc>
+ </param>
+
+ <param name="isTouchScreen" type="boolean" dir="in">
+ <desc>
+ Distinguishes between touchscreen and touchpad events.
+ </desc>
+ </param>
+
+ <param name="scanTime" type="unsigned long" dir="in">
+ <desc>
+ <see><link to="#putEventMultiTouch"/></see>
+ </desc>
+ </param>
+ </method>
+
+ <attribute name="eventSource" type="IEventSource" readonly="yes">
+ <desc>
+ Event source for mouse events.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <!--
+ // IDisplay
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IDisplaySourceBitmap" extends="$unknown"
+ uuid="5094f67a-8084-11e9-b185-dbe296e54799"
+ wsmap="suppress"
+ rest="managed"
+ >
+ <attribute name="screenId" type="unsigned long" readonly="yes"/>
+ <method name="queryBitmapInfo">
+ <desc>Information about the screen bitmap.</desc>
+ <param name="address" type="octet" mod="ptr" dir="out"/>
+ <param name="width" type="unsigned long" dir="out"/>
+ <param name="height" type="unsigned long" dir="out"/>
+ <param name="bitsPerPixel" type="unsigned long" dir="out"/>
+ <param name="bytesPerLine" type="unsigned long" dir="out"/>
+ <param name="bitmapFormat" type="BitmapFormat" dir="out"/>
+ </method>
+
+ </interface>
+
+ <enum
+ name="FramebufferCapabilities"
+ uuid="cc395839-30fa-4ca5-ae65-e6360e3edd7a"
+ >
+ <desc>
+ Framebuffer capability flags.
+ </desc>
+
+ <const name="UpdateImage" value="0x01">
+ <desc>
+ Requires NotifyUpdateImage. NotifyUpdate must not be called.
+ </desc>
+ </const>
+
+ <const name="VHWA" value="0x02">
+ <desc>
+ Supports VHWA interface. If set, then
+ IFramebuffer::processVHWACommand can be called. <!-- no link, otherwise trouble with javadoc -->
+ </desc>
+ </const>
+
+ <const name="VisibleRegion" value="0x04">
+ <desc>
+ Supports visible region. If set, then
+ IFramebuffer::setVisibleRegion can be called. <!-- no link, otherwise trouble with javadoc -->
+ </desc>
+ </const>
+
+ <const name="RenderCursor" value="0x08">
+ <desc>
+ This framebuffer implementation can render a pointer cursor itself. Unless the
+ MoveCursor capability is also set the cursor will always be rendered at the
+ location of (and usually using) the host pointer.
+ </desc>
+ </const>
+
+ <const name="MoveCursor" value="0x10">
+ <desc>
+ Supports rendering a pointer cursor anywhere within the guest screen. Implies
+ RenderCursor.
+ </desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IFramebuffer" extends="$unknown"
+ uuid="1e8d3f27-b45c-48ae-8b36-d35e83d207aa"
+ wsmap="managed"
+ >
+ <attribute name="width" type="unsigned long" readonly="yes">
+ <desc>Frame buffer width, in pixels.</desc>
+ </attribute>
+
+ <attribute name="height" type="unsigned long" readonly="yes">
+ <desc>Frame buffer height, in pixels.</desc>
+ </attribute>
+
+ <attribute name="bitsPerPixel" type="unsigned long" readonly="yes">
+ <desc>
+ Color depth, in bits per pixel.
+ </desc>
+ </attribute>
+
+ <attribute name="bytesPerLine" type="unsigned long" readonly="yes">
+ <desc>
+ Scan line size, in bytes.
+ </desc>
+ </attribute>
+
+ <attribute name="pixelFormat" type="BitmapFormat" readonly="yes">
+ <desc>
+ Frame buffer pixel format. It's one of the values defined by <link
+ to="BitmapFormat"/>.
+ <note>
+ This attribute must never (and will never) return <link
+ to="BitmapFormat_Opaque"/> -- the format of the frame
+ buffer must be always known.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="heightReduction" type="unsigned long" readonly="yes">
+ <desc>
+ Hint from the frame buffer about how much of the standard
+ screen height it wants to use for itself. This information is
+ exposed to the guest through the VESA BIOS and VMMDev interface
+ so that it can use it for determining its video mode table. It
+ is not guaranteed that the guest respects the value.
+ </desc>
+ </attribute>
+
+ <attribute name="overlay" type="IFramebufferOverlay" readonly="yes">
+ <desc>
+ An alpha-blended overlay which is superposed over the frame buffer.
+ The initial purpose is to allow the display of icons providing
+ information about the VM state, including disk activity, in front
+ ends which do not have other means of doing that. The overlay is
+ designed to controlled exclusively by IDisplay. It has no locking
+ of its own, and any changes made to it are not guaranteed to be
+ visible until the affected portion of IFramebuffer is updated. The
+ overlay can be created lazily the first time it is requested. This
+ attribute can also return @c null to signal that the overlay is not
+ implemented.
+ </desc>
+ </attribute>
+
+ <attribute name="winId" type="long long" readonly="yes" wsmap="suppress">
+ <desc>
+ Platform-dependent identifier of the window where context of this
+ frame buffer is drawn, or zero if there's no such window.
+ </desc>
+ </attribute>
+
+ <attribute name="capabilities" type="FramebufferCapabilities" safearray="yes" readonly="yes">
+ <desc>
+ Capabilities of the framebuffer instance.
+
+ For the meaning of individual capability flags see
+ <link to="FramebufferCapabilities"/>.
+ </desc>
+ </attribute>
+
+ <method name="notifyUpdate">
+ <desc>
+ Informs about an update.
+ Gets called by the display object where this buffer is
+ registered.
+ </desc>
+ <param name="x" type="unsigned long" dir="in">
+ <desc>X position of update.</desc>
+ </param>
+ <param name="y" type="unsigned long" dir="in">
+ <desc>Y position of update.</desc>
+ </param>
+ <param name="width" type="unsigned long" dir="in">
+ <desc>Width of update.</desc>
+ </param>
+ <param name="height" type="unsigned long" dir="in">
+ <desc>Height of update.</desc>
+ </param>
+ </method>
+
+ <method name="notifyUpdateImage">
+ <desc>
+ Informs about an update and provides 32bpp bitmap.
+ </desc>
+ <param name="x" type="unsigned long" dir="in">
+ <desc>X position of update.</desc>
+ </param>
+ <param name="y" type="unsigned long" dir="in">
+ <desc>Y position of update.</desc>
+ </param>
+ <param name="width" type="unsigned long" dir="in">
+ <desc>Width of update.</desc>
+ </param>
+ <param name="height" type="unsigned long" dir="in">
+ <desc>Height of update.</desc>
+ </param>
+ <param name="image" type="octet" dir="in" safearray="yes">
+ <desc>Array with 32BPP image data.</desc>
+ </param>
+ </method>
+
+ <method name="notifyChange">
+ <desc>
+ Requests a size change.
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in">
+ <desc>
+ Logical guest screen number.
+ </desc>
+ </param>
+ <param name="xOrigin" type="unsigned long" dir="in">
+ <desc>Location of the screen in the guest.</desc>
+ </param>
+ <param name="yOrigin" type="unsigned long" dir="in">
+ <desc>Location of the screen in the guest.</desc>
+ </param>
+ <param name="width" type="unsigned long" dir="in">
+ <desc>Width of the guest display, in pixels.</desc>
+ </param>
+ <param name="height" type="unsigned long" dir="in">
+ <desc>Height of the guest display, in pixels.</desc>
+ </param>
+ </method>
+
+ <method name="videoModeSupported">
+ <desc>
+ Returns whether the frame buffer implementation is willing to
+ support a given video mode. In case it is not able to render
+ the video mode (or for some reason not willing), it should
+ return @c false. Usually this method is called when the guest
+ asks the VMM device whether a given video mode is supported
+ so the information returned is directly exposed to the guest.
+ It is important that this method returns very quickly.
+ </desc>
+ <param name="width" type="unsigned long" dir="in"/>
+ <param name="height" type="unsigned long" dir="in"/>
+ <param name="bpp" type="unsigned long" dir="in"/>
+ <param name="supported" type="boolean" dir="return"/>
+ </method>
+
+ <method name="getVisibleRegion" wsmap="suppress">
+ <desc>
+ Returns the visible region of this frame buffer.
+
+ If the @a rectangles parameter is @c null then the value of the
+ @a count parameter is ignored and the number of elements necessary to
+ describe the current visible region is returned in @a countCopied.
+
+ If @a rectangles is not @c null but @a count is less
+ than the required number of elements to store region data, the method
+ will report a failure. If @a count is equal or greater than the
+ required number of elements, then the actual number of elements copied
+ to the provided array will be returned in @a countCopied.
+
+ <note>
+ The address of the provided array must be in the process space of
+ this IFramebuffer object.
+ </note>
+ <note>
+ Method not yet implemented.
+ </note>
+ </desc>
+ <param name="rectangles" type="octet" mod="ptr" dir="in">
+ <desc>Pointer to the @c RTRECT array to receive region data.</desc>
+ </param>
+ <param name="count" type="unsigned long" dir="in">
+ <desc>Number of @c RTRECT elements in the @a rectangles array.</desc>
+ </param>
+ <param name="countCopied" type="unsigned long" dir="return">
+ <desc>Number of elements copied to the @a rectangles array.</desc>
+ </param>
+ </method>
+
+ <method name="setVisibleRegion" wsmap="suppress">
+ <desc>
+ Suggests a new visible region to this frame buffer. This region
+ represents the area of the VM display which is a union of regions of
+ all top-level windows of the guest operating system running inside the
+ VM (if the Guest Additions for this system support this
+ functionality). This information may be used by the frontends to
+ implement the seamless desktop integration feature.
+
+ <note>
+ The address of the provided array must be in the process space of
+ this IFramebuffer object.
+ </note>
+ <note>
+ The IFramebuffer implementation must make a copy of the provided
+ array of rectangles.
+ </note>
+ <note>
+ Method not yet implemented.
+ </note>
+ </desc>
+ <param name="rectangles" type="octet" mod="ptr" dir="in">
+ <desc>Pointer to the @c RTRECT array.</desc>
+ </param>
+ <param name="count" type="unsigned long" dir="in">
+ <desc>Number of @c RTRECT elements in the @a rectangles array.</desc>
+ </param>
+ </method>
+
+ <method name="processVHWACommand" wsmap="suppress">
+ <desc>
+ Posts a Video HW Acceleration Command to the frame buffer for processing.
+ The commands used for 2D video acceleration (DDraw surface creation/destroying, blitting, scaling, color conversion, overlaying, etc.)
+ are posted from quest to the host to be processed by the host hardware.
+
+ <note>
+ The address of the provided command must be in the process space of
+ this IFramebuffer object.
+ </note>
+ </desc>
+
+ <param name="command" type="octet" mod="ptr" dir="in">
+ <desc>Pointer to VBOXVHWACMD containing the command to execute.</desc>
+ </param>
+ <param name="enmCmd" type="long" dir="in">
+ <desc>The validated VBOXVHWACMD::enmCmd value from the command.</desc>
+ </param>
+ <param name="fromGuest" type="boolean" dir="in">
+ <desc>Set when the command origins from the guest, clear if host.</desc>
+ </param>
+ </method>
+
+ <method name="notify3DEvent">
+ <desc>
+ Notifies framebuffer about 3D backend event.
+ </desc>
+
+ <param name="type" type="unsigned long" dir="in">
+ <desc>event type. VBOX3D_NOTIFY_TYPE_* in VBoxVideo3D.h</desc>
+ </param>
+ <param name="data" type="octet" dir="in" safearray="yes">
+ <desc>event-specific data, depends on the supplied event type</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <interface
+ name="IFramebufferOverlay" extends="IFramebuffer"
+ uuid="af398a9a-6b76-4805-8fab-00a9dcf4732b"
+ wsmap="managed"
+ >
+ <desc>
+ The IFramebufferOverlay interface represents an alpha blended overlay
+ for displaying status icons above an IFramebuffer. It is always created
+ not visible, so that it must be explicitly shown. It only covers a
+ portion of the IFramebuffer, determined by its width, height and
+ co-ordinates. It is always in packed pixel little-endian 32bit ARGB (in
+ that order) format, and may be written to directly. Do re-read the
+ width though, after setting it, as it may be adjusted (increased) to
+ make it more suitable for the front end.
+ </desc>
+ <attribute name="x" type="unsigned long" readonly="yes">
+ <desc>X position of the overlay, relative to the frame buffer.</desc>
+ </attribute>
+
+ <attribute name="y" type="unsigned long" readonly="yes">
+ <desc>Y position of the overlay, relative to the frame buffer.</desc>
+ </attribute>
+
+ <attribute name="visible" type="boolean">
+ <desc>
+ Whether the overlay is currently visible.
+ </desc>
+ </attribute>
+
+ <attribute name="alpha" type="unsigned long">
+ <desc>
+ The global alpha value for the overlay. This may or may not be
+ supported by a given front end.
+ </desc>
+ </attribute>
+
+ <method name="move">
+ <desc>
+ Changes the overlay's position relative to the IFramebuffer.
+ </desc>
+ <param name="x" type="unsigned long" dir="in"/>
+ <param name="y" type="unsigned long" dir="in"/>
+ </method>
+
+ </interface>
+
+ <enum
+ name="GuestMonitorStatus"
+ uuid="6b8d3f71-39cb-459e-a916-48917ed43e19"
+ >
+ <desc>
+ The current status of the guest display.
+ </desc>
+
+ <const name="Disabled" value="0">
+ <desc>
+ The guest monitor is disabled in the guest.
+ </desc>
+ </const>
+
+ <const name="Enabled" value="1">
+ <desc>
+ The guest monitor is enabled in the guest.
+ </desc>
+ </const>
+
+ <const name="Blank" value="2">
+ <desc>
+ The guest monitor is enabled in the guest but should display nothing.
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="ScreenLayoutMode"
+ uuid="8fa1964c-8774-11e9-ae5d-1f419105e68d"
+ >
+ <desc>
+ How <link to="IDisplay::setScreenLayout"/> method should work.
+ </desc>
+
+ <const name="Apply" value="0">
+ <desc>
+ If the guest is already at desired mode then the API might avoid setting the mode.
+ </desc>
+ </const>
+
+ <const name="Reset" value="1">
+ <desc>
+ Always set the new mode even if the guest is already at desired mode.
+ </desc>
+ </const>
+
+ <const name="Attach" value="2">
+ <desc>
+ Attach new screens and always set the new mode for existing screens.
+ </desc>
+ </const>
+
+ <const name="Silent" value="3">
+ <desc>
+ Do not notify the guest of the change. Normally this is wished, but it
+ might not be when re-setting monitor information from the last session
+ (no hotplug happened, as it is still the same virtual monitor).
+ </desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IGuestScreenInfo" extends="$unknown"
+ uuid="6b2f98f8-9641-4397-854a-040439d0114b"
+ wsmap="managed"
+ >
+ <attribute name="screenId" type="unsigned long" readonly="yes"/>
+ <attribute name="guestMonitorStatus" type="GuestMonitorStatus" readonly="yes"/>
+ <attribute name="primary" type="boolean" readonly="yes"/>
+ <attribute name="origin" type="boolean" readonly="yes"/>
+ <attribute name="originX" type="long" readonly="yes"/>
+ <attribute name="originY" type="long" readonly="yes"/>
+ <attribute name="width" type="unsigned long" readonly="yes"/>
+ <attribute name="height" type="unsigned long" readonly="yes"/>
+ <attribute name="bitsPerPixel" type="unsigned long" readonly="yes"/>
+ <attribute name="extendedInfo" type="wstring" readonly="yes"/>
+ </interface>
+
+ <interface
+ name="IDisplay" extends="$unknown"
+ uuid="4680b2de-8690-11e9-b83d-5719e53cf1de"
+ wsmap="managed"
+ wrap-hint-server-addinterfaces="IEventListener"
+ reservedMethods="8" reservedAttributes="16"
+ >
+ <desc>
+ The IDisplay interface represents the virtual machine's display.
+
+ The object implementing this interface is contained in each
+ <link to="IConsole::display"/> attribute and represents the visual
+ output of the virtual machine.
+
+ The virtual display supports pluggable output targets represented by the
+ IFramebuffer interface. Examples of the output target are a window on
+ the host computer or an RDP session's display on a remote computer.
+ </desc>
+
+ <attribute name="guestScreenLayout" type="IGuestScreenInfo" safearray="yes" readonly="yes">
+ <desc>
+ Layout of the guest screens.
+ </desc>
+ </attribute>
+
+ <method name="getScreenResolution">
+ <desc>
+ Queries certain attributes such as display width, height, color depth
+ and the X and Y origin for a given guest screen.
+
+ The parameters @a xOrigin and @a yOrigin return the X and Y
+ coordinates of the framebuffer's origin.
+
+ All return parameters are optional.</desc>
+ <param name="screenId" type="unsigned long" dir="in"/>
+ <param name="width" type="unsigned long" dir="out"/>
+ <param name="height" type="unsigned long" dir="out"/>
+ <param name="bitsPerPixel" type="unsigned long" dir="out"/>
+ <param name="xOrigin" type="long" dir="out"/>
+ <param name="yOrigin" type="long" dir="out"/>
+ <param name="guestMonitorStatus" type="GuestMonitorStatus" dir="out"/>
+ </method>
+
+ <method name="attachFramebuffer">
+ <desc>
+ Sets the graphics update target for a screen.
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in"/>
+ <param name="framebuffer" type="IFramebuffer" dir="in"/>
+ <param name="id" type="uuid" mod="string" dir="return"/>
+ </method>
+
+ <method name="detachFramebuffer">
+ <desc>
+ Removes the graphics updates target for a screen.
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in"/>
+ <param name="id" type="uuid" mod="string" dir="in"/>
+ </method>
+
+ <method name="queryFramebuffer">
+ <desc>
+ Queries the graphics updates targets for a screen.
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in"/>
+ <param name="framebuffer" type="IFramebuffer" dir="return"/>
+ </method>
+
+ <method name="setVideoModeHint">
+ <desc>
+ Changes the monitor information reported by a given output of the guest
+ graphics device. This information can be read by the guest if suitable
+ drivers and driver tools are available, including but not limited to
+ those in the Guest Additions. The guest will receive monitor hotplug
+ notification when the monitor information is changed, and the
+ information itself will be available to the guest until the next change.
+ The information should not be resent if the guest does not resize in
+ response. The guest might have chosen to ignore the change, or the
+ resize might happen later when a suitable driver is started.
+
+ Specifying @c 0 for either @a width, @a height or @a bitsPerPixel
+ parameters means that the corresponding values should be taken from the
+ current video mode (i.e. left unchanged).
+
+ @todo Rename this to @a setMonitorInfo for 7.0.
+
+ <result name="E_INVALIDARG">
+ The @a display value is higher then the number of outputs.
+ </result>
+
+ </desc>
+ <param name="display" type="unsigned long" dir="in">
+ <desc>
+ The number of the guest output to change.
+ </desc>
+ </param>
+ <param name="enabled" type="boolean" dir="in">
+ <desc>
+ @c True if a monitor is connected,
+ @c False otherwise.
+ <note internal="yes">For historical reasons the Windows drivers can
+ and do override this setting. Call this a virtual hardware quirk.
+ </note>
+ </desc>
+ </param>
+ <param name="changeOrigin" type="boolean" dir="in">
+ <desc>
+ @c True, if the position of the guest screen is specified,
+ @c False otherwise.
+ </desc>
+ </param>
+ <param name="originX" type="long" dir="in">
+ <desc>
+ The X origin of the guest screen.
+ </desc>
+ </param>
+ <param name="originY" type="long" dir="in">
+ <desc>
+ The Y origin of the guest screen.
+ </desc>
+ </param>
+ <param name="width" type="unsigned long" dir="in">
+ <desc>
+ The width of the guest screen.
+ </desc>
+ </param>
+ <param name="height" type="unsigned long" dir="in">
+ <desc>
+ The height of the guest screen.
+ </desc>
+ </param>
+ <param name="bitsPerPixel" type="unsigned long" dir="in">
+ <desc>
+ The number of bits per pixel of the guest screen.
+ </desc>
+ </param>
+ <param name="notify" type="boolean" dir="in">
+ <desc>
+ Whether the guest should be notified of the change. Normally this
+ is wished, but it might not be when re-setting monitor information
+ from the last session (no hotplug happened, as it is still the same
+ virtual monitor). Might also be useful if several monitors are to be
+ changed at once, but this would not reflect physical hardware well,
+ and we also have @a setScreenLayout for that.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getVideoModeHint">
+ <desc>
+ Queries the monitor information for a given guest output. See
+ @a setVideoModeHint. If no monitor information has been set yet by a
+ front-end the preferred mode values returned will be zero.
+
+ @todo Rename this to @a getMonitorInfo for 7.0.
+
+ <result name="E_INVALIDARG">
+ The @a display value is higher than the number of outputs.
+ </result>
+
+ </desc>
+ <param name="display" type="unsigned long" dir="in">
+ <desc>
+ The number of the guest output to query.
+ </desc>
+ </param>
+ <param name="enabled" type="boolean" dir="out">
+ <desc>
+ @c True if a monitor is connected,
+ @c False otherwise.
+ <note internal="yes">For historical reasons the Windows drivers can
+ and do override the setting requested by the host.</note>
+ </desc>
+ </param>
+ <param name="changeOrigin" type="boolean" dir="out">
+ <desc>
+ @c True, if the position of the guest screen was specified,
+ @c False otherwise.
+ </desc>
+ </param>
+ <param name="originX" type="long" dir="out">
+ <desc>
+ The X origin of the guest screen.
+ </desc>
+ </param>
+ <param name="originY" type="long" dir="out">
+ <desc>
+ The Y origin of the guest screen.
+ </desc>
+ </param>
+ <param name="width" type="unsigned long" dir="out">
+ <desc>
+ The width of the monitor preferred mode.
+ </desc>
+ </param>
+ <param name="height" type="unsigned long" dir="out">
+ <desc>
+ The height of the monitor preferred mode.
+ </desc>
+ </param>
+ <param name="bitsPerPixel" type="unsigned long" dir="out">
+ <desc>
+ The number of bits per pixel of the monitor preferred mode.
+ </desc>
+ </param>
+ </method>
+
+ <method name="setSeamlessMode">
+ <desc>
+ Enables or disables seamless guest display rendering (seamless desktop
+ integration) mode.
+ <note>
+ Calling this method has no effect if <link
+ to="IGuest::getFacilityStatus"/> with facility @c Seamless
+ does not return @c Active.
+ </note>
+ </desc>
+ <param name="enabled" type="boolean" dir="in"/>
+ </method>
+
+ <method name="takeScreenShot">
+ <desc>
+ Takes a screen shot of the requested size and format and copies it to the
+ buffer allocated by the caller and pointed to by @a address.
+ The buffer size must be enough for a 32 bits per pixel bitmap,
+ i.e. width * height * 4 bytes.
+
+ <note>This API can be used only locally by a VM process through the
+ COM/XPCOM C++ API as it requires pointer support. It is not
+ available for scripting languages, Java or any webservice clients.
+ Unless you are writing a new VM frontend use
+ <link to="#takeScreenShotToArray" />.
+ </note>
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in"/>
+ <param name="address" type="octet" mod="ptr" dir="in"/>
+ <param name="width" type="unsigned long" dir="in"/>
+ <param name="height" type="unsigned long" dir="in"/>
+ <param name="bitmapFormat" type="BitmapFormat" dir="in"/>
+ </method>
+
+ <method name="takeScreenShotToArray">
+ <desc>
+ Takes a guest screen shot of the requested size and format
+ and returns it as an array of bytes.
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in">
+ <desc>
+ The guest monitor to take screenshot from.
+ </desc>
+ </param>
+ <param name="width" type="unsigned long" dir="in">
+ <desc>
+ Desired image width.
+ </desc>
+ </param>
+ <param name="height" type="unsigned long" dir="in">
+ <desc>
+ Desired image height.
+ </desc>
+ </param>
+ <param name="bitmapFormat" type="BitmapFormat" dir="in">
+ <desc>
+ The requested format.
+ </desc>
+ </param>
+ <param name="screenData" type="octet" dir="return" safearray="yes">
+ <desc>
+ Array with resulting screen data.
+ </desc>
+ </param>
+ </method>
+
+ <method name="drawToScreen">
+ <desc>
+ Draws a 32-bpp image of the specified size from the given buffer
+ to the given point on the VM display.
+
+ <result name="E_NOTIMPL">
+ Feature not implemented.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ Could not draw to screen.
+ </result>
+
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in">
+ <desc>
+ Monitor to take the screenshot from.
+ </desc>
+ </param>
+ <param name="address" type="octet" mod="ptr" dir="in">
+ <desc>
+ Address to store the screenshot to
+ </desc>
+ </param>
+ <param name="x" type="unsigned long" dir="in">
+ <desc>
+ Relative to the screen top left corner.
+ </desc>
+ </param>
+ <param name="y" type="unsigned long" dir="in">
+ <desc>
+ Relative to the screen top left corner.
+ </desc>
+ </param>
+ <param name="width" type="unsigned long" dir="in">
+ <desc>
+ Desired image width.
+ </desc>
+ </param>
+ <param name="height" type="unsigned long" dir="in">
+ <desc>
+ Desired image height.
+ </desc>
+ </param>
+ </method>
+
+ <method name="invalidateAndUpdate">
+ <desc>
+ Does a full invalidation of the VM display and instructs the VM
+ to update it.
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Could not invalidate and update screen.
+ </result>
+
+ </desc>
+ </method>
+
+ <method name="invalidateAndUpdateScreen">
+ <desc>
+ Redraw the specified VM screen.
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in">
+ <desc>
+ The guest screen to redraw.
+ </desc>
+ </param>
+ </method>
+
+ <method name="completeVHWACommand">
+ <desc>
+ Signals that the Video HW Acceleration command has completed.
+ </desc>
+
+ <param name="command" type="octet" mod="ptr" dir="in">
+ <desc>Pointer to VBOXVHWACMD containing the completed command.</desc>
+ </param>
+ </method>
+
+ <method name="viewportChanged">
+ <desc>
+ Signals that framebuffer window viewport has changed.
+
+ <result name="E_INVALIDARG">
+ The specified viewport data is invalid.
+ </result>
+
+ </desc>
+
+ <param name="screenId" type="unsigned long" dir="in">
+ <desc>
+ Monitor to take the screenshot from.
+ </desc>
+ </param>
+ <param name="x" type="unsigned long" dir="in">
+ <desc>
+ Framebuffer x offset.
+ </desc>
+ </param>
+ <param name="y" type="unsigned long" dir="in">
+ <desc>
+ Framebuffer y offset.
+ </desc>
+ </param>
+ <param name="width" type="unsigned long" dir="in">
+ <desc>
+ Viewport width.
+ </desc>
+ </param>
+ <param name="height" type="unsigned long" dir="in">
+ <desc>
+ Viewport height.
+ </desc>
+ </param>
+ </method>
+
+ <method name="querySourceBitmap" wsmap="suppress">
+ <desc>
+ Obtains the guest screen bitmap parameters.
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in"/>
+ <param name="displaySourceBitmap" type="IDisplaySourceBitmap" dir="out"/>
+ </method>
+
+ <method name="notifyScaleFactorChange">
+ <desc>
+ Notify OpenGL HGCM host service about graphics content scaling factor change.
+ </desc>
+ <param name="screenId" type="unsigned long" dir="in"/>
+ <param name="u32ScaleFactorWMultiplied" type="unsigned long" dir="in"/>
+ <param name="u32ScaleFactorHMultiplied" type="unsigned long" dir="in"/>
+ </method>
+
+ <method name="notifyHiDPIOutputPolicyChange">
+ <desc>
+ Notify OpenGL HGCM host service about HiDPI monitor scaling policy change.
+ </desc>
+ <param name="fUnscaledHiDPI" type="boolean" dir="in"/>
+ </method>
+
+ <method name="setScreenLayout">
+ <desc>
+ Set video modes for the guest screens.
+ </desc>
+ <param name="screenLayoutMode" type="ScreenLayoutMode" dir="in"/>
+ <param name="guestScreenInfo" type="IGuestScreenInfo" safearray="yes" dir="in"/>
+ </method>
+
+ <method name="detachScreens">
+ <desc>
+ Unplugs monitors from the virtual graphics card.
+ </desc>
+ <param name="screenIds" type="long" safearray="yes" dir="in"/>
+ </method>
+
+ <method name="createGuestScreenInfo">
+ <desc>
+ Make a IGuestScreenInfo object with the provided parameters.
+ </desc>
+ <param name="display" type="unsigned long" dir="in">
+ <desc>
+ The number of the guest display.
+ </desc>
+ </param>
+ <param name="status" type="GuestMonitorStatus" dir="in">
+ <desc>
+ @c True, if this guest screen is enabled,
+ @c False otherwise.
+ </desc>
+ </param>
+ <param name="primary" type="boolean" dir="in">
+ <desc>
+ Whether this guest monitor must be primary.
+ </desc>
+ </param>
+ <param name="changeOrigin" type="boolean" dir="in">
+ <desc>
+ @c True, if the origin of the guest screen should be changed,
+ @c False otherwise.
+ </desc>
+ </param>
+ <param name="originX" type="long" dir="in">
+ <desc>
+ The X origin of the guest screen.
+ </desc>
+ </param>
+ <param name="originY" type="long" dir="in">
+ <desc>
+ The Y origin of the guest screen.
+ </desc>
+ </param>
+ <param name="width" type="unsigned long" dir="in">
+ <desc>
+ The width of the guest screen.
+ </desc>
+ </param>
+ <param name="height" type="unsigned long" dir="in">
+ <desc>
+ The height of the guest screen.
+ </desc>
+ </param>
+ <param name="bitsPerPixel" type="unsigned long" dir="in">
+ <desc>
+ The number of bits per pixel of the guest screen.
+ </desc>
+ </param>
+ <param name="guestScreenInfo" type="IGuestScreenInfo" dir="return">
+ <desc>
+ The created object.
+ </desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <!--
+ // INetworkAdapter
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="NetworkAttachmentType"
+ uuid="cbfd17fa-fdc3-4d1c-97ec-4674da8d2a5d"
+ >
+ <desc>
+ Network attachment type.
+ </desc>
+
+ <const name="Null" value="0">
+ <desc>Null value, also means "not attached".</desc>
+ </const>
+ <const name="NAT" value="1"/>
+ <const name="Bridged" value="2"/>
+ <const name="Internal" value="3"/>
+ <const name="HostOnly" value="4"/>
+ <const name="Generic" value="5"/>
+ <const name="NATNetwork" value="6"/>
+ <const name="Cloud" value="7"/>
+ <const name="HostOnlyNetwork" value="8"/>
+ </enum>
+
+ <enum
+ name="NetworkAdapterType"
+ uuid="3c2281e4-d952-4e87-8c7d-24379cb6a81c"
+ >
+ <desc>
+ Network adapter type.
+ </desc>
+
+ <const name="Null" value="0">
+ <desc>Null value (never used by the API).</desc>
+ </const>
+ <const name="Am79C970A" value="1">
+ <desc>AMD PCNet-PCI II network card (Am79C970A).</desc>
+ </const>
+ <const name="Am79C973" value="2">
+ <desc>AMD PCNet-FAST III network card (Am79C973).</desc>
+ </const>
+ <const name="I82540EM" value="3">
+ <desc>Intel PRO/1000 MT Desktop network card (82540EM).</desc>
+ </const>
+ <const name="I82543GC" value="4">
+ <desc>Intel PRO/1000 T Server network card (82543GC).</desc>
+ </const>
+ <const name="I82545EM" value="5">
+ <desc>Intel PRO/1000 MT Server network card (82545EM).</desc>
+ </const>
+ <const name="Virtio" value="6">
+ <desc>Virtio network device.</desc>
+ </const>
+ <const name="Am79C960" value="7">
+ <desc>AMD PCnet-ISA/NE2100 network card (Am79C960).</desc>
+ </const>
+ <const name="NE2000" value="8">
+ <desc>Novell NE2000 network card (NE2000).</desc>
+ </const>
+ <const name="NE1000" value="9">
+ <desc>Novell NE1000 network card (NE1000).</desc>
+ </const>
+ <const name="WD8013" value="10">
+ <desc>WD/SMC EtherCard Plus 16 network card (WD8013EBT).</desc>
+ </const>
+ <const name="WD8003" value="11">
+ <desc>WD/SMC EtherCard Plus network card (WD8003E).</desc>
+ </const>
+ <const name="ELNK2" value="12">
+ <desc>3Com EtherLink II network card (3C503).</desc>
+ </const>
+ <const name="ELNK1" value="13">
+ <desc>3Com EtherLink network card (3C501/3C500).</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="NetworkAdapterPromiscModePolicy"
+ uuid="c963768a-376f-4c85-8d84-d8ced4b7269e"
+ >
+ <desc>
+ The promiscuous mode policy of an interface.
+ </desc>
+
+ <const name="Deny" value="1">
+ <desc>Deny promiscuous mode requests.</desc>
+ </const>
+ <const name="AllowNetwork" value="2">
+ <desc>
+ Allow promiscuous mode, but restrict the scope it to the internal
+ network so that it only applies to other VMs.
+ </desc>
+ </const>
+ <const name="AllowAll" value="3">
+ <desc>
+ Allow promiscuous mode, include unrelated traffic going over the wire
+ and internally on the host.
+ </desc>
+ </const>
+ </enum>
+
+ <interface
+ name="INetworkAdapter" extends="$unknown"
+ uuid="dcf47a1d-ed70-4db8-9a4b-2646bd166905"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>
+ Represents a virtual network adapter that is attached to a virtual machine.
+ Each virtual machine has a fixed number of network adapter slots with one
+ instance of this attached to each of them. Call
+ <link to="IMachine::getNetworkAdapter" /> to get the network adapter that
+ is attached to a given slot in a given machine.
+
+ Each network adapter can be in one of five attachment modes, which are
+ represented by the <link to="NetworkAttachmentType" /> enumeration;
+ see the <link to="#attachmentType" /> attribute.
+ </desc>
+
+ <attribute name="adapterType" type="NetworkAdapterType">
+ <desc>
+ Type of the virtual network adapter. Depending on this value,
+ VirtualBox will provide a different virtual network hardware
+ to the guest.
+ </desc>
+ </attribute>
+
+ <attribute name="slot" type="unsigned long" readonly="yes">
+ <desc>
+ Slot number this adapter is plugged into. Corresponds to
+ the value you pass to <link to="IMachine::getNetworkAdapter"/>
+ to obtain this instance.
+ </desc>
+ </attribute>
+
+ <attribute name="enabled" type="boolean">
+ <desc>
+ Flag whether the network adapter is present in the
+ guest system. If disabled, the virtual guest hardware will
+ not contain this network adapter. Can only be changed when
+ the VM is not running.
+ </desc>
+ </attribute>
+
+ <attribute name="MACAddress" type="wstring">
+ <desc>
+ Ethernet MAC address of the adapter, 12 hexadecimal characters. When
+ setting it to @c null or an empty string for an enabled adapter,
+ VirtualBox will generate a unique MAC address. Disabled adapters can
+ have an empty MAC address.
+ </desc>
+ </attribute>
+
+ <attribute name="attachmentType" type="NetworkAttachmentType">
+ <desc>
+ Sets/Gets network attachment type of this network adapter.
+ </desc>
+ </attribute>
+
+ <attribute name="bridgedInterface" type="wstring">
+ <desc>
+ Name of the network interface the VM should be bridged to.
+ </desc>
+ </attribute>
+
+ <attribute name="hostOnlyInterface" type="wstring">
+ <desc>
+ Name of the host only network interface the VM is attached to.
+ </desc>
+ </attribute>
+
+ <attribute name="hostOnlyNetwork" type="wstring">
+ <desc>
+ Name of the host only network the VM is attached to.
+ </desc>
+ </attribute>
+
+ <attribute name="internalNetwork" type="wstring">
+ <desc>
+ Name of the internal network the VM is attached to.
+ </desc>
+ </attribute>
+
+ <attribute name="NATNetwork" type="wstring">
+ <desc>
+ Name of the NAT network the VM is attached to.
+ </desc>
+ </attribute>
+
+ <attribute name="genericDriver" type="wstring">
+ <desc>
+ Name of the driver to use for the "Generic" network attachment type.
+ </desc>
+ </attribute>
+
+ <attribute name="cloudNetwork" type="wstring">
+ <desc>
+ Name of the cloud network the VM is attached to.
+ </desc>
+ </attribute>
+
+ <attribute name="cableConnected" type="boolean">
+ <desc>
+ Flag whether the adapter reports the cable as connected or not.
+ It can be used to report offline situations to a VM.
+ </desc>
+ </attribute>
+
+ <attribute name="lineSpeed" type="unsigned long">
+ <desc>
+ Line speed reported by custom drivers, in units of 1 kbps.
+ </desc>
+ </attribute>
+
+ <attribute name="promiscModePolicy" type="NetworkAdapterPromiscModePolicy">
+ <desc>
+ The promiscuous mode policy of the network adapter when attached to an
+ internal network, host only network or a bridge.
+ </desc>
+ </attribute>
+
+ <attribute name="traceEnabled" type="boolean">
+ <desc>
+ Flag whether network traffic from/to the network card should be traced.
+ Can only be toggled when the VM is turned off.
+ </desc>
+ </attribute>
+
+ <attribute name="traceFile" type="wstring">
+ <desc>
+ Filename where a network trace will be stored. If not set, VBox-pid.pcap
+ will be used.
+ </desc>
+ </attribute>
+
+ <attribute name="NATEngine" type="INATEngine" readonly="yes">
+ <desc>
+ Points to the NAT engine which handles the network address translation
+ for this interface. This is active only when the interface actually uses
+ NAT.
+ </desc>
+ </attribute>
+
+ <attribute name="bootPriority" type="unsigned long">
+ <desc>
+ Network boot priority of the adapter. Priority 1 is highest. If not set,
+ the priority is considered to be at the lowest possible setting.
+ </desc>
+ </attribute>
+
+ <attribute name="bandwidthGroup" type="IBandwidthGroup">
+ <desc>The bandwidth group this network adapter is assigned to.</desc>
+ </attribute>
+
+ <!-- property methods -->
+
+ <method name="getProperty" const="yes">
+ <desc>
+ Returns the value of the network attachment property with the given name.
+
+ If the requested data @a key does not exist, this function will
+ succeed and return an empty string in the @a value argument.
+
+ <result name="E_INVALIDARG">@a name is @c null or empty.</result>
+ </desc>
+ <param name="key" type="wstring" dir="in">
+ <desc>Name of the property to get.</desc>
+ </param>
+ <param name="value" type="wstring" dir="return">
+ <desc>Current property value.</desc>
+ </param>
+ </method>
+
+ <method name="setProperty">
+ <desc>
+ Sets the value of the network attachment property with the given name.
+
+ Setting the property value to @c null or an empty string is equivalent
+ to deleting the existing value.
+
+ <result name="E_INVALIDARG">@a name is @c null or empty.</result>
+ </desc>
+ <param name="key" type="wstring" dir="in">
+ <desc>Name of the property to set.</desc>
+ </param>
+ <param name="value" type="wstring" dir="in">
+ <desc>Property value to set.</desc>
+ </param>
+ </method>
+
+ <method name="getProperties" const="yes">
+ <desc>
+ Returns values for a group of properties in one call.
+
+ The names of the properties to get are specified using the @a names
+ argument which is a list of comma-separated property names or
+ an empty string if all properties are to be returned.
+ <note>Currently the value of this argument is ignored and the method
+ always returns all existing properties.</note>
+
+ The method returns two arrays, the array of property names corresponding
+ to the @a names argument and the current values of these properties.
+ Both arrays have the same number of elements with each element at the
+ given index in the first array corresponds to an element at the same
+ index in the second array.
+ </desc>
+ <param name="names" type="wstring" dir="in">
+ <desc>
+ Names of properties to get.
+ </desc>
+ </param>
+ <param name="returnNames" type="wstring" safearray="yes" dir="out">
+ <desc>Names of returned properties.</desc>
+ </param>
+ <param name="returnValues" type="wstring" safearray="yes" dir="return">
+ <desc>Values of returned properties.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+
+ <!--
+ // ISerialPort
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="PortMode"
+ uuid="7485fcfd-d603-470a-87af-26d33beb7de9"
+ >
+ <desc>
+ The PortMode enumeration represents possible communication modes for
+ the virtual serial port device.
+ </desc>
+
+ <const name="Disconnected" value="0">
+ <desc>Virtual device is not attached to any real host device.</desc>
+ </const>
+ <const name="HostPipe" value="1">
+ <desc>Virtual device is attached to a host pipe.</desc>
+ </const>
+ <const name="HostDevice" value="2">
+ <desc>Virtual device is attached to a host device.</desc>
+ </const>
+ <const name="RawFile" value="3">
+ <desc>Virtual device is attached to a raw file.</desc>
+ </const>
+ <const name="TCP" value="4">
+ <desc>Virtual device is attached to a TCP socket.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="UartType"
+ uuid="c8899d39-0b90-4265-9d02-1e38bd4d1b39"
+ >
+ <desc>
+ The UART type represents the emulated UART chip for the serial port device.
+ </desc>
+
+ <const name="U16450" value="0">
+ <desc>The most basic emulated UART which doesn't support FIFO operation.</desc>
+ </const>
+ <const name="U16550A" value="1">
+ <desc>
+ The successor of the 16450 UART introducing a 16 byte FIFO to reduce
+ operational overhead.
+ </desc>
+ </const>
+ <const name="U16750" value="2">
+ <desc>
+ This UART developed by Texas Instruments introduced a 64 byte FIFO
+ and hardware flow control.
+ </desc>
+ </const>
+ </enum>
+
+ <interface
+ name="ISerialPort" extends="$unknown"
+ uuid="5587d0f6-a227-4f23-8278-2f675eea1bb2"
+ wsmap="managed"
+ rest="managed"
+ reservedAttributes="4"
+ >
+
+ <desc>
+ The ISerialPort interface represents the virtual serial port device.
+
+ The virtual serial port device acts like an ordinary serial port
+ inside the virtual machine. This device communicates to the real
+ serial port hardware in one of two modes: host pipe or host device.
+
+ In host pipe mode, the #path attribute specifies the path to the pipe on
+ the host computer that represents a serial port. The #server attribute
+ determines if this pipe is created by the virtual machine process at
+ machine startup or it must already exist before starting machine
+ execution.
+
+ In host device mode, the #path attribute specifies the name of the
+ serial port device on the host computer.
+
+ There is also a third communication mode: the disconnected mode. In this
+ mode, the guest OS running inside the virtual machine will be able to
+ detect the serial port, but all port write operations will be discarded
+ and all port read operations will return no data.
+
+ <see><link to="IMachine::getSerialPort"/></see>
+ </desc>
+
+ <attribute name="slot" type="unsigned long" readonly="yes">
+ <desc>
+ Slot number this serial port is plugged into. Corresponds to
+ the value you pass to <link to="IMachine::getSerialPort"/>
+ to obtain this instance.
+ </desc>
+ </attribute>
+
+ <attribute name="enabled" type="boolean">
+ <desc>
+ Flag whether the serial port is enabled. If disabled,
+ the serial port will not be reported to the guest OS.
+ </desc>
+ </attribute>
+
+ <attribute name="IOBase" type="unsigned long">
+ <desc>Base I/O address of the serial port.</desc>
+ </attribute>
+
+ <attribute name="IRQ" type="unsigned long">
+ <desc>IRQ number of the serial port.</desc>
+ </attribute>
+
+ <attribute name="hostMode" type="PortMode">
+ <desc>
+ How is this port connected to the host.
+ <note>
+ Changing this attribute may fail if the conditions for
+ <link to="#path"/> are not met.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="server" type="boolean">
+ <desc>
+ Flag whether this serial port acts as a server (creates a new pipe on
+ the host) or as a client (uses the existing pipe). This attribute is
+ used only when <link to="#hostMode"/> is PortMode_HostPipe or PortMode_TCP.
+ </desc>
+ </attribute>
+
+ <attribute name="path" type="wstring">
+ <desc>
+ Path to the serial port's pipe on the host when <link to="ISerialPort::hostMode"/> is
+ PortMode_HostPipe, the host serial device name when
+ <link to="ISerialPort::hostMode"/> is PortMode_HostDevice or the TCP
+ <b>port</b> (server) or <b>hostname:port</b> (client) when
+ <link to="ISerialPort::hostMode"/> is PortMode_TCP.
+ For those cases, setting a @c null or empty string as the attribute's
+ value is an error. Otherwise, the value of this property is ignored.
+ </desc>
+ </attribute>
+
+ <attribute name="uartType" type="UartType">
+ <desc>Selects the emulated UART implementation.</desc>
+ </attribute>
+
+ </interface>
+
+ <!--
+ // IParallelPort
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IParallelPort" extends="$unknown"
+ uuid="788b87df-7708-444b-9eef-c116ce423d39"
+ wsmap="managed"
+ rest="managed"
+ reservedAttributes="4"
+ >
+
+ <desc>
+ The IParallelPort interface represents the virtual parallel port device.
+
+ The virtual parallel port device acts like an ordinary parallel port
+ inside the virtual machine. This device communicates to the real
+ parallel port hardware using the name of the parallel device on the host
+ computer specified in the #path attribute.
+
+ Each virtual parallel port device is assigned a base I/O address and an
+ IRQ number that will be reported to the guest operating system and used
+ to operate the given parallel port from within the virtual machine.
+
+ <see><link to="IMachine::getParallelPort"/></see>
+ </desc>
+
+ <attribute name="slot" type="unsigned long" readonly="yes">
+ <desc>
+ Slot number this parallel port is plugged into. Corresponds to
+ the value you pass to <link to="IMachine::getParallelPort"/>
+ to obtain this instance.
+ </desc>
+ </attribute>
+
+ <attribute name="enabled" type="boolean">
+ <desc>
+ Flag whether the parallel port is enabled. If disabled,
+ the parallel port will not be reported to the guest OS.
+ </desc>
+ </attribute>
+
+ <attribute name="IOBase" type="unsigned long">
+ <desc>Base I/O address of the parallel port.</desc>
+ </attribute>
+
+ <attribute name="IRQ" type="unsigned long">
+ <desc>IRQ number of the parallel port.</desc>
+ </attribute>
+
+ <attribute name="path" type="wstring">
+ <desc>
+ Host parallel device name. If this parallel port is enabled, setting a
+ @c null or an empty string as this attribute's value will result in
+ the parallel port behaving as if not connected to any device.
+ </desc>
+ </attribute>
+
+ </interface>
+
+
+ <!--
+ // IMachineDebugger
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="VMExecutionEngine"
+ uuid="6e3f78f9-2dfe-4ed7-863d-67cad351e9d8"
+ >
+ <desc>
+ The main execution engine of a VM.
+ </desc>
+ <const name="NotSet" value="0">
+ <desc>Has not yet been set (try again later).</desc>
+ </const>
+ <const name="Emulated" value="1">
+ <desc>Emulated thru IEM.</desc>
+ </const>
+ <const name="HwVirt" value="2">
+ <desc>Hardware assisted virtualization thru HM.</desc>
+ </const>
+ <const name="NativeApi" value="3">
+ <desc>Hardware assisted virtualization thru native API (NEM).</desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IMachineDebugger" extends="$unknown"
+ uuid="fa43579a-2272-47c4-a443-9713f19a902f"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="16" reservedAttributes="16"
+ >
+ <method name="dumpGuestCore">
+ <desc>
+ Takes a core dump of the guest.
+
+ See include/VBox/dbgfcorefmt.h for details on the file format.
+ </desc>
+ <param name="filename" type="wstring" dir="in">
+ <desc>
+ The name of the output file. The file must not exist.
+ </desc>
+ </param>
+ <param name="compression" type="wstring" dir="in">
+ <desc>
+ Reserved for future compression method indicator.
+ </desc>
+ </param>
+ </method>
+
+ <method name="dumpHostProcessCore">
+ <desc>
+ Takes a core dump of the VM process on the host.
+
+ This feature is not implemented in the 4.0.0 release but it may show up
+ in a dot release.
+ </desc>
+ <param name="filename" type="wstring" dir="in">
+ <desc>
+ The name of the output file. The file must not exist.
+ </desc>
+ </param>
+ <param name="compression" type="wstring" dir="in">
+ <desc>
+ Reserved for future compression method indicator.
+ </desc>
+ </param>
+ </method>
+
+ <method name="info">
+ <desc>
+ Interfaces with the info dumpers (DBGFInfo).
+
+ This feature is not implemented in the 4.0.0 release but it may show up
+ in a dot release.
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>
+ The name of the info item.
+ </desc>
+ </param>
+ <param name="args" type="wstring" dir="in">
+ <desc>
+ Arguments to the info dumper.
+ </desc>
+ </param>
+ <param name="info" type="wstring" dir="return">
+ <desc>
+ The into string.
+ </desc>
+ </param>
+ </method>
+
+ <method name="injectNMI">
+ <desc>
+ Inject an NMI into a running VT-x/AMD-V VM.
+ </desc>
+ </method>
+
+ <method name="modifyLogGroups">
+ <desc>
+ Modifies the group settings of the debug or release logger.
+ </desc>
+ <param name="settings" type="wstring" dir="in">
+ <desc>
+ The group settings string. See iprt/log.h for details. To target the
+ release logger, prefix the string with "release:".
+ </desc>
+ </param>
+ </method>
+
+ <method name="modifyLogFlags">
+ <desc>
+ Modifies the debug or release logger flags.
+ </desc>
+ <param name="settings" type="wstring" dir="in">
+ <desc>
+ The flags settings string. See iprt/log.h for details. To target the
+ release logger, prefix the string with "release:".
+ </desc>
+ </param>
+ </method>
+
+ <method name="modifyLogDestinations">
+ <desc>
+ Modifies the debug or release logger destinations.
+ </desc>
+ <param name="settings" type="wstring" dir="in">
+ <desc>
+ The destination settings string. See iprt/log.h for details. To target the
+ release logger, prefix the string with "release:".
+ </desc>
+ </param>
+ </method>
+
+ <method name="readPhysicalMemory">
+ <desc>
+ Reads guest physical memory, no side effects (MMIO++).
+
+ This feature is not implemented in the 4.0.0 release but may show up
+ in a dot release.
+ </desc>
+ <param name="address" type="long long" dir="in">
+ <desc>The guest physical address.</desc>
+ </param>
+ <param name="size" type="unsigned long" dir="in">
+ <desc>The number of bytes to read.</desc>
+ </param>
+ <param name="bytes" type="octet" safearray="yes" dir="return">
+ <desc>The bytes read.</desc>
+ </param>
+ </method>
+
+ <method name="writePhysicalMemory">
+ <desc>
+ Writes guest physical memory, access handles (MMIO++) are ignored.
+
+ This feature is not implemented in the 4.0.0 release but may show up
+ in a dot release.
+ </desc>
+ <param name="address" type="long long" dir="in">
+ <desc>The guest physical address.</desc>
+ </param>
+ <param name="size" type="unsigned long" dir="in">
+ <desc>The number of bytes to read.</desc>
+ </param>
+ <param name="bytes" type="octet" safearray="yes" dir="in">
+ <desc>The bytes to write.</desc>
+ </param>
+ </method>
+
+ <method name="readVirtualMemory">
+ <desc>
+ Reads guest virtual memory, no side effects (MMIO++).
+
+ This feature is not implemented in the 4.0.0 release but may show up
+ in a dot release.
+ </desc>
+ <param name="cpuId" type="unsigned long" dir="in">
+ <desc>The identifier of the Virtual CPU.</desc>
+ </param>
+ <param name="address" type="long long" dir="in">
+ <desc>The guest virtual address.</desc>
+ </param>
+ <param name="size" type="unsigned long" dir="in">
+ <desc>The number of bytes to read.</desc>
+ </param>
+ <param name="bytes" type="octet" safearray="yes" dir="return">
+ <desc>The bytes read.</desc>
+ </param>
+ </method>
+
+ <method name="writeVirtualMemory">
+ <desc>
+ Writes guest virtual memory, access handles (MMIO++) are ignored.
+
+ This feature is not implemented in the 4.0.0 release but may show up
+ in a dot release.
+ </desc>
+ <param name="cpuId" type="unsigned long" dir="in">
+ <desc>The identifier of the Virtual CPU.</desc>
+ </param>
+ <param name="address" type="long long" dir="in">
+ <desc>The guest virtual address.</desc>
+ </param>
+ <param name="size" type="unsigned long" dir="in">
+ <desc>The number of bytes to read.</desc>
+ </param>
+ <param name="bytes" type="octet" safearray="yes" dir="in">
+ <desc>The bytes to write.</desc>
+ </param>
+ </method>
+
+ <method name="loadPlugIn">
+ <desc> Loads a DBGF plug-in. </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>The plug-in name or DLL. Special name 'all' loads all installed plug-ins.</desc>
+ </param>
+ <param name="plugInName" type="wstring" dir="return">
+ <desc>The name of the loaded plug-in.</desc>
+ </param>
+ </method>
+
+ <method name="unloadPlugIn">
+ <desc>Unloads a DBGF plug-in.</desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>The plug-in name or DLL. Special name 'all' unloads all plug-ins.</desc>
+ </param>
+ </method>
+
+ <method name="detectOS">
+ <desc>
+ Tries to (re-)detect the guest OS kernel.
+
+ This feature is not implemented in the 4.0.0 release but may show up
+ in a dot release.
+ </desc>
+ <param name="os" type="wstring" dir="return">
+ <desc>
+ The detected OS kernel on success.
+ </desc>
+ </param>
+ </method>
+
+ <method name="queryOSKernelLog">
+ <desc>
+ Tries to get the kernel log (dmesg) of the guest OS.
+
+ </desc>
+ <param name="maxMessages" type="unsigned long" dir="in">
+ <desc>Max number of messages to return, counting from the end of the
+ log. If 0, there is no limit.</desc>
+ </param>
+ <param name="dmesg" type="wstring" dir="return">
+ <desc>
+ The kernel log.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getRegister">
+ <desc>
+ Gets one register.
+ </desc>
+ <param name="cpuId" type="unsigned long" dir="in">
+ <desc>The identifier of the Virtual CPU.</desc>
+ </param>
+ <param name="name" type="wstring" dir="in">
+ <desc>The register name, case is ignored.</desc>
+ </param>
+ <param name="value" type="wstring" dir="return">
+ <desc>
+ The register value. This is usually a hex value (always 0x prefixed)
+ but other format may be used for floating point registers (TBD).
+ </desc>
+ </param>
+ </method>
+
+ <method name="getRegisters">
+ <desc>
+ Gets all the registers for the given CPU.
+ </desc>
+ <param name="cpuId" type="unsigned long" dir="in">
+ <desc>The identifier of the Virtual CPU.</desc>
+ </param>
+ <param name="names" type="wstring" dir="out" safearray="yes">
+ <desc>Array containing the lowercase register names.</desc>
+ </param>
+ <param name="values" type="wstring" dir="out" safearray="yes">
+ <desc>
+ Array parallel to the names holding the register values as if the
+ register was returned by <link to="IMachineDebugger::getRegister"/>.
+ </desc>
+ </param>
+ </method>
+
+ <method name="setRegister">
+ <desc>
+ Gets one register.
+
+ This feature is not implemented in the 4.0.0 release but may show up
+ in a dot release.
+ </desc>
+ <param name="cpuId" type="unsigned long" dir="in">
+ <desc>The identifier of the Virtual CPU.</desc>
+ </param>
+ <param name="name" type="wstring" dir="in">
+ <desc>The register name, case is ignored.</desc>
+ </param>
+ <param name="value" type="wstring" dir="in">
+ <desc>
+ The new register value. Hexadecimal, decimal and octal formattings
+ are supported in addition to any special formattings returned by
+ the getters.
+ </desc>
+ </param>
+ </method>
+
+ <method name="setRegisters">
+ <desc>
+ Sets zero or more registers atomically.
+
+ This feature is not implemented in the 4.0.0 release but may show up
+ in a dot release.
+ </desc>
+ <param name="cpuId" type="unsigned long" dir="in">
+ <desc>The identifier of the Virtual CPU.</desc>
+ </param>
+ <param name="names" type="wstring" dir="in" safearray="yes">
+ <desc>Array containing the register names, case ignored.</desc>
+ </param>
+ <param name="values" type="wstring" dir="in" safearray="yes">
+ <desc>
+ Array paralell to the names holding the register values. See
+ <link to="IMachineDebugger::setRegister"/> for formatting
+ guidelines.
+ </desc>
+ </param>
+ </method>
+
+ <method name="dumpGuestStack">
+ <desc>
+ Produce a simple stack dump using the current guest state.
+
+ This feature is not implemented in the 4.0.0 release but may show up
+ in a dot release.
+ </desc>
+ <param name="cpuId" type="unsigned long" dir="in">
+ <desc>The identifier of the Virtual CPU.</desc>
+ </param>
+ <param name="stack" type="wstring" dir="return">
+ <desc>String containing the formatted stack dump.</desc>
+ </param>
+ </method>
+
+ <method name="resetStats">
+ <desc>
+ Reset VM statistics.
+ </desc>
+ <param name="pattern" type="wstring" dir="in">
+ <desc>The selection pattern. A bit similar to filename globbing.
+ Wildchars are '*' and '?', where the asterisk matches zero or
+ more characters and question mark matches exactly one character.
+ Multiple pattern can be joined by putting '|' between them.</desc>
+ </param>
+ </method>
+
+ <method name="dumpStats">
+ <desc>
+ Dumps VM statistics.
+ </desc>
+ <param name="pattern" type="wstring" dir="in">
+ <desc>The selection pattern. A bit similar to filename globbing.
+ Wildchars are '*' and '?', where the asterisk matches zero or
+ more characters and question mark matches exactly one character.
+ Multiple pattern can be joined by putting '|' between them.</desc>
+ </param>
+ </method>
+
+ <method name="getStats">
+ <desc>
+ Get the VM statistics in a XMLish format.
+ </desc>
+ <param name="pattern" type="wstring" dir="in">
+ <desc>The selection pattern. A bit similar to filename globbing.
+ Wildchars are '*' and '?', where the asterisk matches zero or
+ more characters and question mark matches exactly one character.
+ Multiple pattern can be joined by putting '|' between them.</desc>
+ </param>
+ <param name="withDescriptions" type="boolean" dir="in">
+ <desc>Whether to include the descriptions.</desc>
+ </param>
+ <param name="stats" type="wstring" dir="return">
+ <desc>The XML document containing the statistics.</desc>
+ </param>
+ </method>
+
+ <method name="getCPULoad">
+ <desc>
+ Get the load percentages (as observed by the VMM) for all virtual CPUs
+ or a specific one.
+ </desc>
+ <param name="cpuId" type="unsigned long" dir="in">
+ <desc>The ID of the virtual CPU to retrieve stats for, pass 0x7fffffff
+ or higher for the average accross all CPUs.</desc>
+ </param>
+ <param name="pctExecuting" type="unsigned long" dir="out">
+ <desc>Percentage of the interval that the CPU(s) spend executing guest code.</desc>
+ </param>
+ <param name="pctHalted" type="unsigned long" dir="out">
+ <desc>Percentage of the interval that the CPU(s) spend halted.</desc>
+ </param>
+ <param name="pctOther" type="unsigned long" dir="out">
+ <desc>Percentage of the interval that the CPU(s) preempted by the host
+ scheduler, on virtualization overhead and on other tasks.</desc>
+ </param>
+ <param name="msInterval" type="long long" dir="return">
+ <desc>The interval the percentage was calculated over in milliseconds</desc>
+ </param>
+ </method>
+
+ <method name="takeGuestSample">
+ <desc>
+ Creates a sample report of the guest and emulated device activity.
+ </desc>
+ <param name="filename" type="wstring" dir="in">
+ <desc>The file to dump the report to.</desc>
+ </param>
+ <param name="usInterval" type="unsigned long" dir="in">
+ <desc>The sample interval.</desc>
+ </param>
+ <param name="usSampleTime" type="long long" dir="in">
+ <desc>The number of microseconds to sample.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>The progress object on return.</desc>
+ </param>
+ </method>
+
+ <method name="getUVMAndVMMFunctionTable" wsmap="suppress">
+ <desc>
+ Gets the user-mode VM handle, with a reference, and the VMM function table.
+ The VM handle must be passed to VMR3ReleaseUVM when done. This can only
+ be called from within the VM process, remote calls will always fail.
+ </desc>
+ <param name="magicVersion" type="long long" dir="in">
+ <desc>The VMMR3VTABLE_MAGIC_VERSION value of the caller. The method
+ will fail if this is not compatible with the VMM function table.</desc>
+ </param>
+ <param name="VMMFunctionTable" type="long long" dir="out">
+ <desc>The VMM function table address.</desc>
+ </param>
+ <param name="UVM" type="long long" dir="return">
+ <desc>The user-mode VM handle.</desc>
+ </param>
+ </method>
+
+ <attribute name="singleStep" type="boolean">
+ <desc>Switch for enabling single-stepping.</desc>
+ </attribute>
+
+ <attribute name="executeAllInIEM" type="boolean">
+ <desc>
+ Whether to execute all the code in the instruction interpreter. This
+ is mainly for testing the interpreter and not an execution mode
+ intended for general consumption.
+ </desc>
+ </attribute>
+
+ <attribute name="logEnabled" type="boolean">
+ <desc>Switch for enabling and disabling the debug logger.</desc>
+ </attribute>
+
+ <attribute name="logDbgFlags" type="wstring" readonly="yes">
+ <desc>The debug logger flags.</desc>
+ </attribute>
+
+ <attribute name="logDbgGroups" type="wstring" readonly="yes">
+ <desc>The debug logger's group settings.</desc>
+ </attribute>
+
+ <attribute name="logDbgDestinations" type="wstring" readonly="yes">
+ <desc>The debug logger's destination settings.</desc>
+ </attribute>
+
+ <attribute name="logRelFlags" type="wstring" readonly="yes">
+ <desc>The release logger flags.</desc>
+ </attribute>
+
+ <attribute name="logRelGroups" type="wstring" readonly="yes">
+ <desc>The release logger's group settings.</desc>
+ </attribute>
+
+ <attribute name="logRelDestinations" type="wstring" readonly="yes">
+ <desc>The relase logger's destination settings.</desc>
+ </attribute>
+
+ <attribute name="executionEngine" type="VMExecutionEngine" readonly="yes">
+ <desc>Gets the main execution engine of the VM.</desc>
+ </attribute>
+
+ <attribute name="HWVirtExNestedPagingEnabled" type="boolean" readonly="yes">
+ <desc>
+ Flag indicating whether the VM is currently making use of the nested paging
+ CPU hardware virtualization extension.
+ </desc>
+ </attribute>
+
+ <attribute name="HWVirtExVPIDEnabled" type="boolean" readonly="yes">
+ <desc>
+ Flag indicating whether the VM is currently making use of the VPID
+ VT-x extension.
+ </desc>
+ </attribute>
+
+ <attribute name="HWVirtExUXEnabled" type="boolean" readonly="yes">
+ <desc>
+ Flag indicating whether the VM is currently making use of the
+ unrestricted execution feature of VT-x.
+ </desc>
+ </attribute>
+
+ <attribute name="OSName" type="wstring" readonly="yes">
+ <desc>
+ Query the guest OS kernel name as detected by the DBGF.
+
+ This feature is not implemented in the 4.0.0 release but may show up
+ in a dot release.
+ </desc>
+ </attribute>
+
+ <attribute name="OSVersion" type="wstring" readonly="yes">
+ <desc>
+ Query the guest OS kernel version string as detected by the DBGF.
+
+ This feature is not implemented in the 4.0.0 release but may show up
+ in a dot release.
+ </desc>
+ </attribute>
+
+ <attribute name="PAEEnabled" type="boolean" readonly="yes">
+ <desc>
+ Flag indicating whether the VM is currently making use of the Physical
+ Address Extension CPU feature.
+ </desc>
+ </attribute>
+
+ <attribute name="virtualTimeRate" type="unsigned long">
+ <desc>
+ The rate at which the virtual time runs expressed as a percentage.
+ The accepted range is 2% to 20000%.
+ </desc>
+ </attribute>
+
+ <attribute name="uptime" type="long long" readonly="yes">
+ <desc>VM uptime in milliseconds, i.e. time in which it could have been
+ executing guest code. Excludes the time when the VM was paused.</desc>
+ </attribute>
+
+ </interface>
+
+ <!--
+ // IUSBDeviceFilters
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IUSBDeviceFilters" extends="$unknown"
+ uuid="9709db9b-3346-49d6-8f1c-41b0c4784ff2"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="2" reservedAttributes="2"
+ >
+
+ <attribute name="deviceFilters" type="IUSBDeviceFilter" readonly="yes" safearray="yes">
+ <desc>
+ List of USB device filters associated with the machine.
+
+ If the machine is currently running, these filters are activated
+ every time a new (supported) USB device is attached to the host
+ computer that was not ignored by global filters
+ (<link to="IHost::USBDeviceFilters"/>).
+
+ These filters are also activated when the machine is powered up.
+ They are run against a list of all currently available USB
+ devices (in states
+ <link to="USBDeviceState_Available"/>,
+ <link to="USBDeviceState_Busy"/>,
+ <link to="USBDeviceState_Held"/>) that were not previously
+ ignored by global filters.
+
+ If at least one filter matches the USB device in question, this
+ device is automatically captured (attached to) the virtual USB
+ controller of this machine.
+
+ <see><link to="IUSBDeviceFilter"/>, <link to="IUSBController"/></see>
+ </desc>
+ </attribute>
+
+ <method name="createDeviceFilter">
+ <desc>
+ Creates a new USB device filter. All attributes except
+ the filter name are set to empty (any match),
+ <i>active</i> is @c false (the filter is not active).
+
+ The created filter can then be added to the list of filters using
+ <link to="#insertDeviceFilter"/>.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ The virtual machine is not mutable.
+ </result>
+
+ <see><link to="#deviceFilters"/></see>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>
+ Filter name. See <link to="IUSBDeviceFilter::name"/>
+ for more info.
+ </desc>
+ </param>
+ <param name="filter" type="IUSBDeviceFilter" dir="return">
+ <desc>Created filter object.</desc>
+ </param>
+ </method>
+
+ <method name="insertDeviceFilter">
+ <desc>
+ Inserts the given USB device to the specified position
+ in the list of filters.
+
+ Positions are numbered starting from <tt>0</tt>. If the specified
+ position is equal to or greater than the number of elements in
+ the list, the filter is added to the end of the collection.
+
+ <note>
+ Duplicates are not allowed, so an attempt to insert a
+ filter that is already in the collection, will return an
+ error.
+ </note>
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine is not mutable.
+ </result>
+ <result name="E_INVALIDARG">
+ USB device filter not created within this VirtualBox instance.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ USB device filter already in list.
+ </result>
+
+ <see><link to="#deviceFilters"/></see>
+ </desc>
+ <param name="position" type="unsigned long" dir="in">
+ <desc>Position to insert the filter to.</desc>
+ </param>
+ <param name="filter" type="IUSBDeviceFilter" dir="in">
+ <desc>USB device filter to insert.</desc>
+ </param>
+ </method>
+
+ <method name="removeDeviceFilter">
+ <desc>
+ Removes a USB device filter from the specified position in the
+ list of filters.
+
+ Positions are numbered starting from <tt>0</tt>. Specifying a
+ position equal to or greater than the number of elements in
+ the list will produce an error.
+
+ <see><link to="#deviceFilters"/></see>
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine is not mutable.
+ </result>
+ <result name="E_INVALIDARG">
+ USB device filter list empty or invalid @a position.
+ </result>
+
+ </desc>
+ <param name="position" type="unsigned long" dir="in">
+ <desc>Position to remove the filter from.</desc>
+ </param>
+ <param name="filter" type="IUSBDeviceFilter" dir="return">
+ <desc>Removed USB device filter.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <!--
+ // IUSBController
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="USBControllerType"
+ uuid="8fdd1c6a-5412-41da-ab07-7baed7d6e18e"
+ >
+ <desc>
+ The USB controller type. <link to="IUSBController::type" />.
+ </desc>
+ <const name="Null" value="0">
+ <desc>@c null value. Never used by the API.</desc>
+ </const>
+ <const name="OHCI" value="1"/>
+ <const name="EHCI" value="2"/>
+ <const name="XHCI" value="3"/>
+ <const name="Last" value="4">
+ <desc>Last element (invalid). Used for parameter checks.</desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IUSBController" extends="$unknown"
+ uuid="ee206a6e-7ff8-4a84-bd34-0c651e118bb5"
+ wsmap="managed"
+ rest="managed"
+ reservedAttributes="4"
+ >
+
+ <attribute name="name" type="wstring">
+ <desc>
+ The USB Controller name.
+ </desc>
+ </attribute>
+
+ <attribute name="type" type="USBControllerType">
+ <desc>
+ The USB Controller type.
+ </desc>
+ </attribute>
+
+ <attribute name="USBStandard" type="unsigned short" readonly="yes">
+ <desc>
+ USB standard version which the controller implements.
+ This is a BCD which means that the major version is in the
+ high byte and minor version is in the low byte.
+ </desc>
+ </attribute>
+
+ </interface>
+
+
+ <!--
+ // IUSBDevice
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="USBConnectionSpeed"
+ uuid="d2915840-ea26-4fb4-b72a-21eaf6b888ff"
+ >
+ <desc>
+ USB device/port speed state. This enumeration represents speeds at
+ which a USB device can communicate with the host.
+
+ The speed is a function of both the device itself and the port which
+ it is attached to, including hubs and cables in the path.
+
+ <note>
+ Due to differences in USB stack implementations on various hosts,
+ the reported speed may not exactly match the actual speed.
+ </note>
+
+ <see><link to="IHostUSBDevice"/></see>
+ </desc>
+
+ <const name="Null" value="0">
+ <desc>
+ @c null value. Never returned by the API.
+ </desc>
+ </const>
+ <const name="Low" value="1">
+ <desc>
+ Low speed, 1.5 Mbps.
+ </desc>
+ </const>
+ <const name="Full" value="2">
+ <desc>
+ Full speed, 12 Mbps.
+ </desc>
+ </const>
+ <const name="High" value="3">
+ <desc>
+ High speed, 480 Mbps.
+ </desc>
+ </const>
+ <const name="Super" value="4">
+ <desc>
+ SuperSpeed, 5 Gbps.
+ </desc>
+ </const>
+ <const name="SuperPlus" value="5">
+ <desc>
+ SuperSpeedPlus, 10 Gbps.
+ </desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IUSBDevice" extends="$unknown"
+ uuid="6dc83c2c-81a9-4005-9d52-fc45a78bf3f5"
+ wsmap="managed"
+ rest="managed"
+ reservedAttributes="4"
+ >
+ <desc>
+ The IUSBDevice interface represents a virtual USB device attached to the
+ virtual machine.
+
+ A collection of objects implementing this interface is stored in the
+ <link to="IConsole::USBDevices"/> attribute which lists all USB devices
+ attached to a running virtual machine's USB controller.
+ </desc>
+
+ <attribute name="id" type="uuid" mod="string" readonly="yes">
+ <desc>
+ Unique USB device ID. This ID is built from #vendorId,
+ #productId, #revision and #serialNumber.
+ </desc>
+ </attribute>
+
+ <attribute name="vendorId" type="unsigned short" readonly="yes">
+ <desc>Vendor ID.</desc>
+ </attribute>
+
+ <attribute name="productId" type="unsigned short" readonly="yes">
+ <desc>Product ID.</desc>
+ </attribute>
+
+ <attribute name="revision" type="unsigned short" readonly="yes">
+ <desc>
+ Product revision number. This is a packed BCD represented as
+ unsigned short. The high byte is the integer part and the low
+ byte is the decimal.
+ </desc>
+ </attribute>
+
+ <attribute name="manufacturer" type="wstring" readonly="yes">
+ <desc>Manufacturer string.</desc>
+ </attribute>
+
+ <attribute name="product" type="wstring" readonly="yes">
+ <desc>Product string.</desc>
+ </attribute>
+
+ <attribute name="serialNumber" type="wstring" readonly="yes">
+ <desc>Serial number string.</desc>
+ </attribute>
+
+ <attribute name="address" type="wstring" readonly="yes">
+ <desc>
+ Host-specific address of the device, uniquely
+ identifying a physically connected device in the system.
+ Note that the address of a USB device may change across
+ device re-plugs and host suspend/resume cycles or reboots.
+ </desc>
+ </attribute>
+
+ <attribute name="port" type="unsigned short" readonly="yes">
+ <desc>
+ Host USB port number on the hub the device is physically
+ connected to.
+ </desc>
+ </attribute>
+
+ <attribute name="portPath" type="wstring" readonly="yes">
+ <desc>
+ Host-specific identifier of the port (including hub) the USB
+ device is physically connected to. Note that hubs may be
+ dynamically added and removed, and that hub enumeration may not
+ be consistent across host reboots.
+ </desc>
+ </attribute>
+
+ <attribute name="version" type="unsigned short" readonly="yes">
+ <desc>
+ The major USB version of the device - 1, 2 or 3.
+ </desc>
+ </attribute>
+
+ <attribute name="speed" type="USBConnectionSpeed" readonly="yes">
+ <desc>
+ The speed at which the device is currently communicating.
+ </desc>
+ </attribute>
+
+ <attribute name="remote" type="boolean" readonly="yes">
+ <desc>
+ Whether the device is physically connected to a remote VRDE
+ client or to a local host machine.
+ </desc>
+ </attribute>
+
+ <attribute name="deviceInfo" type="wstring" readonly="yes" safearray="yes">
+ <desc>
+ Array of device attributes as single strings.
+
+ So far the following are used:
+ 0: The manufacturer string, if the device doesn't expose the ID one is taken
+ from an internal database or an empty string if none is found.
+ 1: The product string, if the device doesn't expose the ID one is taken
+ from an internal database or an empty string if none is found.
+ </desc>
+ </attribute>
+
+ <attribute name="backend" type="wstring" readonly="yes">
+ <desc>
+ The backend which will be used to communicate with this device.
+ </desc>
+ </attribute>
+
+ </interface>
+
+
+ <!--
+ // IUSBDeviceFilter
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IUSBDeviceFilter" extends="$unknown"
+ uuid="45587218-4289-ef4e-8e6a-e5b07816b631"
+ wsmap="managed"
+ rest="managed"
+ reservedAttributes="8"
+ >
+ <desc>
+ The IUSBDeviceFilter interface represents a USB device filter used
+ to perform actions on one or more USB devices.
+
+ USB device filters are used by running virtual machines to
+ automatically capture selected USB devices once they are physically
+ attached to the host computer.
+
+ A USB device is matched to a specific device filter if and only if all
+ attributes of the device filter match the corresponding attributes of the
+ device (that is, attributes are joined together using a logical AND
+ operation). On the other hand filter attributes in separate USB
+ device filters are applied as a logical OR operation. So if one
+ would like to create a match such as "this vendor id OR this product id",
+ then one would need to create two filters and specify "any match" (see below)
+ for the other unused attributes.
+
+ All filter attributes used for matching are strings. The following
+ filtering expressions are currently supported:
+
+ <ul>
+ <li><i>Interval filters</i>. Used to specify valid intervals for
+ integer device attributes (Vendor ID, Product ID, Revision and Port).
+ The format of the string is:
+
+ <tt>int:((m)|([m]-[n]))(,(m)|([m]-[n]))*</tt>
+
+ where <tt>m</tt> and <tt>n</tt> are integer numbers, either in octal
+ (starting with <tt>0</tt>), hexadecimal (starting with <tt>0x</tt>)
+ or decimal (otherwise), so that <tt>m &lt; n</tt>. If <tt>m</tt>
+ is omitted before a dash (<tt>-</tt>), the minimum possible integer
+ is assumed; if <tt>n</tt> is omitted after a dash, the maximum
+ possible integer is assumed.
+ </li>
+ <li><i>Boolean filters</i>. Used to specify acceptable values for
+ boolean device attributes. The format of the string is:
+
+ <tt>true|false|yes|no|0|1</tt>
+
+ </li>
+ <li><i>Exact match</i>. Used to specify a single value for the given
+ device attribute. Any string that doesn't start with <tt>int:</tt>
+ represents an exact match. String device attributes are compared to
+ this string in a case-sensitive manner. Integer attributes are first
+ converted to a string (see individual filter attributes) and then
+ compared in a case-insensitive manner.
+
+ </li>
+ <li><i>Any match</i>. Any value of the corresponding device attribute
+ will match the given filter. An empty or @c null string is
+ used to construct this type of filtering expressions.
+
+ </li>
+ </ul>
+
+ <note>
+ On Windows hosts, interval filters are not currently available.
+ Also all string filter attributes
+ (<link to="#manufacturer"/>, <link to="#product"/>,
+ <link to="#serialNumber"/>) are ignored, so they behave as
+ <i>any match</i> no matter what string expression is specified.
+ </note>
+
+ <see><link to="IUSBDeviceFilters::deviceFilters"/>,
+ <link to="IHostUSBDeviceFilter"/></see>
+ </desc>
+
+ <attribute name="name" type="wstring">
+ <desc>
+ Visible name for this filter.
+ This name is used to visually distinguish one filter from another,
+ so it can neither be @c null nor an empty string.
+ </desc>
+ </attribute>
+
+ <attribute name="active" type="boolean">
+ <desc>Whether this filter active or has been temporarily disabled.</desc>
+ </attribute>
+
+ <attribute name="vendorId" type="wstring">
+ <desc>
+ <link to="IUSBDevice::vendorId">Vendor ID</link> filter.
+ The string representation for the <i>exact matching</i>
+ has the form <tt>XXXX</tt>, where <tt>X</tt> is the hex digit
+ (including leading zeroes).
+ </desc>
+ </attribute>
+
+ <attribute name="productId" type="wstring">
+ <desc>
+ <link to="IUSBDevice::productId">Product ID</link> filter.
+ The string representation for the <i>exact matching</i>
+ has the form <tt>XXXX</tt>, where <tt>X</tt> is the hex digit
+ (including leading zeroes).
+ </desc>
+ </attribute>
+
+ <attribute name="revision" type="wstring">
+ <desc>
+ <link to="IUSBDevice::productId">Product revision number</link>
+ filter. The string representation for the <i>exact matching</i>
+ has the form <tt>IIFF</tt>, where <tt>I</tt> is the decimal digit
+ of the integer part of the revision, and <tt>F</tt> is the
+ decimal digit of its fractional part (including leading and
+ trailing zeros).
+ Note that for interval filters, it's best to use the hexadecimal
+ form, because the revision is stored as a 16 bit packed BCD value;
+ so the expression <tt>int:0x0100-0x0199</tt> will match any
+ revision from <tt>1.0</tt> to <tt>1.99</tt>.
+ </desc>
+ </attribute>
+
+ <attribute name="manufacturer" type="wstring">
+ <desc>
+ <link to="IUSBDevice::manufacturer">Manufacturer</link> filter.
+ </desc>
+ </attribute>
+
+ <attribute name="product" type="wstring">
+ <desc>
+ <link to="IUSBDevice::product">Product</link> filter.
+ </desc>
+ </attribute>
+
+ <attribute name="serialNumber" type="wstring">
+ <desc>
+ <link to="IUSBDevice::serialNumber">Serial number</link> filter.
+ </desc>
+ </attribute>
+
+ <attribute name="port" type="wstring">
+ <desc>
+ <link to="IUSBDevice::port">Host USB port</link> filter.
+ </desc>
+ </attribute>
+
+ <attribute name="remote" type="wstring">
+ <desc>
+ <link to="IUSBDevice::remote">Remote state</link> filter.
+ <note>
+ This filter makes sense only for machine USB filters,
+ i.e. it is ignored by IHostUSBDeviceFilter objects.
+ </note>
+ </desc>
+ </attribute>
+
+ <attribute name="maskedInterfaces" type="unsigned long">
+ <desc>
+ This is an advanced option for hiding one or more USB interfaces
+ from the guest. The value is a bit mask where the bits that are set
+ means the corresponding USB interface should be hidden, masked off
+ if you like.
+ This feature only works on Linux hosts.
+ </desc>
+ </attribute>
+
+ </interface>
+
+
+ <!--
+ // IHostUSBDevice
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="USBDeviceState"
+ uuid="b99a2e65-67fb-4882-82fd-f3e5e8193ab4"
+ >
+ <desc>
+ USB device state. This enumeration represents all possible states
+ of the USB device physically attached to the host computer regarding
+ its state on the host computer and availability to guest computers
+ (all currently running virtual machines).
+
+ Once a supported USB device is attached to the host, global USB
+ filters (<link to="IHost::USBDeviceFilters"/>) are activated. They can
+ either ignore the device, or put it to USBDeviceState_Held state, or do
+ nothing. Unless the device is ignored by global filters, filters of all
+ currently running guests (<link to="IUSBDeviceFilters::deviceFilters"/>) are
+ activated that can put it to USBDeviceState_Captured state.
+
+ If the device was ignored by global filters, or didn't match
+ any filters at all (including guest ones), it is handled by the host
+ in a normal way. In this case, the device state is determined by
+ the host and can be one of USBDeviceState_Unavailable, USBDeviceState_Busy
+ or USBDeviceState_Available, depending on the current device usage.
+
+ Besides auto-capturing based on filters, the device can be manually
+ captured by guests (<link to="IConsole::attachUSBDevice"/>) if its
+ state is USBDeviceState_Busy, USBDeviceState_Available or
+ USBDeviceState_Held.
+
+ <note>
+ Due to differences in USB stack implementations in Linux and Win32,
+ states USBDeviceState_Busy and USBDeviceState_Unavailable are applicable
+ only to the Linux version of the product. This also means that (<link
+ to="IConsole::attachUSBDevice"/>) can only succeed on Win32 if the
+ device state is USBDeviceState_Held.
+ </note>
+
+ <see><link to="IHostUSBDevice"/>, <link to="IHostUSBDeviceFilter"/></see>
+ </desc>
+
+ <const name="NotSupported" value="0">
+ <desc>
+ Not supported by the VirtualBox server, not available to guests.
+ </desc>
+ </const>
+ <const name="Unavailable" value="1">
+ <desc>
+ Being used by the host computer exclusively,
+ not available to guests.
+ </desc>
+ </const>
+ <const name="Busy" value="2">
+ <desc>
+ Being used by the host computer, potentially available to guests.
+ </desc>
+ </const>
+ <const name="Available" value="3">
+ <desc>
+ Not used by the host computer, available to guests (the host computer
+ can also start using the device at any time).
+ </desc>
+ </const>
+ <const name="Held" value="4">
+ <desc>
+ Held by the VirtualBox server (ignored by the host computer),
+ available to guests.
+ </desc>
+ </const>
+ <const name="Captured" value="5">
+ <desc>
+ Captured by one of the guest computers, not available
+ to anybody else.
+ </desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IHostUSBDevice" extends="IUSBDevice"
+ uuid="c19073dd-cc7b-431b-98b2-951fda8eab89"
+ wsmap="managed"
+ rest="managed"
+ reservedAttributes="4"
+ >
+ <desc>
+ The IHostUSBDevice interface represents a physical USB device attached
+ to the host computer.
+
+ Besides properties inherited from IUSBDevice, this interface adds the
+ <link to="#state"/> property that holds the current state of the USB
+ device.
+
+ <see><link to="IHost::USBDevices"/>,
+ <link to="IHost::USBDeviceFilters"/></see>
+ </desc>
+
+ <attribute name="state" type="USBDeviceState" readonly="yes">
+ <desc>
+ Current state of the device.
+ </desc>
+ </attribute>
+
+ <!-- @todo add class, subclass, bandwidth, configs, interfaces endpoints and such later. -->
+
+ </interface>
+
+
+ <!--
+ // IHostUSBDeviceFilter
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="USBDeviceFilterAction"
+ uuid="cbc30a49-2f4e-43b5-9da6-121320475933"
+ >
+ <desc>
+ Actions for host USB device filters.
+ <see><link to="IHostUSBDeviceFilter"/>, <link to="USBDeviceState"/></see>
+ </desc>
+
+ <const name="Null" value="0">
+ <desc>Null value (never used by the API).</desc>
+ </const>
+ <const name="Ignore" value="1">
+ <desc>Ignore the matched USB device.</desc>
+ </const>
+ <const name="Hold" value="2">
+ <desc>Hold the matched USB device.</desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IHostUSBDeviceFilter" extends="IUSBDeviceFilter"
+ uuid="01adb2d6-aedf-461c-be2c-99e91bdad8a1"
+ wsmap="managed"
+ rest="managed"
+ reservedAttributes="8"
+ >
+ <desc>
+ The IHostUSBDeviceFilter interface represents a global filter for a
+ physical USB device used by the host computer. Used indirectly in
+ <link to="IHost::USBDeviceFilters"/>.
+
+ Using filters of this type, the host computer determines the initial
+ state of the USB device after it is physically attached to the
+ host's USB controller.
+
+ <note>
+ The <link to="IUSBDeviceFilter::remote"/> attribute is ignored by this type of
+ filters, because it makes sense only for
+ <link to="IUSBDeviceFilters::deviceFilters">machine USB filters</link>.
+ </note>
+
+ <see><link to="IHost::USBDeviceFilters"/></see>
+ </desc>
+
+ <attribute name="action" type="USBDeviceFilterAction">
+ <desc>
+ Action performed by the host when an attached USB device
+ matches this filter.
+ </desc>
+ </attribute>
+
+ </interface>
+
+
+ <!--
+ // IUSBProxyBackend
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IUSBProxyBackend" extends="$unknown"
+ uuid="dfe56449-6989-4002-80cf-3607f377d40c"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>
+ The USBProxyBackend interface represents a source for USB devices available
+ to the host for attaching to the VM.
+ </desc>
+
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>
+ The unique name of the proxy backend.
+ </desc>
+ </attribute>
+
+ <attribute name="type" type="wstring" readonly="yes">
+ <desc>
+ The type of the backend.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <!--
+ // IAudioAdapter
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="AudioDriverType"
+ uuid="32b4acfd-79ab-4b7e-9a1c-92e99f4e000b"
+ >
+ <desc>
+ Host audio driver type.
+ </desc>
+
+ <const name="Default" value="0">
+ <desc>Use the default audio driver automatically determined for the host
+ that this VirtualBox instance is running on.
+ Useful for VMs which need to run on different host OSes.
+ </desc>
+ </const>
+ <!-- When changing the enum anyway, keep the enum grouped per platforms, starting
+ from oldest audio stack to newest one (if possible). -->
+ <const name="Null" value="1">
+ <desc>Null value, also means "dummy audio driver".</desc>
+ </const>
+ <const name="OSS" value="2">
+ <desc>Open Sound System (Linux / Unix hosts only).</desc>
+ </const>
+ <const name="ALSA" value="3">
+ <desc>Advanced Linux Sound Architecture (Linux hosts only).</desc>
+ </const>
+ <const name="Pulse" value="4">
+ <desc>PulseAudio (Linux hosts only).</desc>
+ </const>
+ <const name="WinMM" value="5">
+ <desc>Windows multimedia (Windows hosts only, not supported at the moment).</desc>
+ </const>
+ <const name="DirectSound" value="6">
+ <desc>DirectSound (Windows hosts only).</desc>
+ </const>
+ <const name="WAS" value="7">
+ <desc>Windows Audio Session (Windows hosts only).</desc>
+ </const>
+ <const name="CoreAudio" value="8">
+ <desc>CoreAudio (Mac hosts only).</desc>
+ </const>
+ <const name="MMPM" value="9">
+ <desc>Reserved for historical reasons.</desc>
+ </const>
+ <const name="SolAudio" value="10">
+ <desc>Reserved for historical reasons.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="AudioControllerType"
+ uuid="7afd395c-42c3-444e-8788-3ce80292f36c"
+ >
+ <desc>
+ Virtual audio controller type.
+ </desc>
+
+ <const name="AC97" value="0"/>
+ <const name="SB16" value="1"/>
+ <const name="HDA" value="2"/>
+ </enum>
+
+ <enum
+ name="AudioCodecType"
+ uuid="7b406301-f520-420c-9805-8ce11c086370"
+ >
+ <desc>
+ The exact variant of audio codec hardware presented
+ to the guest; see <link to="IAudioAdapter::audioCodec" />.
+ </desc>
+
+ <const name="Null" value="0">
+ <desc>@c null value. Never used by the API.</desc>
+ </const>
+ <const name="SB16" value="1">
+ <desc>SB16; this is the only option for the SB16 device.</desc>
+ </const>
+ <const name="STAC9700" value="2">
+ <desc>A STAC9700 AC'97 codec.</desc>
+ </const>
+ <const name="AD1980" value="3">
+ <desc>An AD1980 AC'97 codec. Recommended for Linux guests.</desc>
+ </const>
+ <const name="STAC9221" value="4">
+ <desc>A STAC9221 HDA codec.</desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IAudioAdapter" extends="$unknown"
+ uuid="5155bfd3-7ba7-45a8-b26d-c91ae3754e37"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>
+ The IAudioAdapter interface represents the virtual audio adapter of
+ the virtual machine. Used in <link to="IAudioSettings::adapter"/>.
+ </desc>
+ <attribute name="enabled" type="boolean">
+ <desc>
+ Flag whether the audio adapter is present in the
+ guest system. If disabled, the virtual guest hardware will
+ not contain any audio adapter. Can only be changed when
+ the VM is not running.
+ </desc>
+ </attribute>
+ <attribute name="enabledIn" type="boolean">
+ <desc>
+ Flag whether the audio adapter is enabled for audio
+ input. Only relevant if the adapter is enabled.
+ </desc>
+ </attribute>
+ <attribute name="enabledOut" type="boolean">
+ <desc>
+ Flag whether the audio adapter is enabled for audio
+ output. Only relevant if the adapter is enabled.
+ </desc>
+ </attribute>
+ <attribute name="audioController" type="AudioControllerType">
+ <desc>
+ The emulated audio controller.
+ </desc>
+ </attribute>
+ <attribute name="audioCodec" type="AudioCodecType">
+ <desc>
+ The exact variant of audio codec hardware presented
+ to the guest.
+ For HDA and SB16, only one variant is available, but for AC'97,
+ there are several.
+ </desc>
+ </attribute>
+ <attribute name="audioDriver" type="AudioDriverType">
+ <desc>
+ Audio driver the adapter is connected to. This setting
+ can only be changed when the VM is not running.
+ </desc>
+ </attribute>
+ <attribute name="propertiesList" type="wstring" readonly="yes" safearray="yes">
+ <desc>
+ Array of names of tunable properties, which can be supported by audio driver.
+ </desc>
+ </attribute>
+
+ <method name="setProperty">
+ <desc>
+ Sets an audio specific property string.
+
+ If you pass @c null or empty string as a key @a value, the given @a key
+ will be deleted.
+
+ </desc>
+ <param name="key" type="wstring" dir="in">
+ <desc>Name of the key to set.</desc>
+ </param>
+ <param name="value" type="wstring" dir="in">
+ <desc>Value to assign to the key.</desc>
+ </param>
+ </method>
+
+ <method name="getProperty" const="yes">
+ <desc>
+ Returns an audio specific property string.
+
+ If the requested data @a key does not exist, this function will
+ succeed and return an empty string in the @a value argument.
+
+ </desc>
+ <param name="key" type="wstring" dir="in">
+ <desc>Name of the key to get.</desc>
+ </param>
+ <param name="value" type="wstring" dir="return">
+ <desc>Value of the requested key.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <enum
+ name="AudioDirection"
+ uuid="f27d209b-040c-4ae9-beae-85f9693ca07a"
+ >
+ <desc>
+ Audio direction enumeration.
+ </desc>
+
+ <const name="Unknown" value="0">
+ <desc>Direction cannot be determined.</desc>
+ </const>
+ <const name="In" value="1">
+ <desc>Input (Recording).</desc>
+ </const>
+ <const name="Out" value="2">
+ <desc>Output (Playback).</desc>
+ </const>
+ <const name="Duplex" value="3">
+ <desc>Duplex (Recording + Playback).</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="AudioDeviceType"
+ uuid="95457071-ef88-45a9-8416-fc05b08731d2"
+ >
+ <desc>
+ Audio device type enumeration.
+ </desc>
+
+ <const name="Unknown" value="0">
+ <desc>Device type is unknown / cannot be determined</desc>
+ </const>
+ <const name="BuiltLin" value="1">
+ <desc>Built-in device (cannot be removed).</desc>
+ </const>
+ <const name="ExternalUSB" value="2">
+ <desc>External device, connected via USB.</desc>
+ </const>
+ <const name="ExternalOther" value="3">
+ <desc>External device, connected via some other method.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="AudioDeviceState"
+ uuid="45c1b969-556a-4277-8570-b438d2ef5ebe"
+ >
+ <desc>
+ Audio device state enumeration.
+ </desc>
+
+ <const name="Unknown" value="0">
+ <desc>Device state is unknown / cannot be determined</desc>
+ </const>
+ <const name="Active" value="1">
+ <desc>Device is active and can be used.</desc>
+ </const>
+ <const name="Disabled" value="2">
+ <desc>Device is in a disabled state.</desc>
+ </const>
+ <const name="NotPresent" value="3">
+ <desc>Device is marked as not being present.</desc>
+ </const>
+ <const name="Unplugged" value="4">
+ <desc>Device has been unplugged.</desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IHostAudioDevice" extends="$unknown"
+ uuid="cfde1265-3140-4048-a81f-a1e280dfbd75"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>
+ Represents an audio device provided by the host OS.
+ </desc>
+
+ <attribute name="id" type="uuid" mod="string" readonly="yes">
+ <desc>
+ Unique device ID.
+ </desc>
+ </attribute>
+
+ <attribute name="name" type="wstring">
+ <desc>
+ Friendly name of the device.
+ </desc>
+ </attribute>
+ <attribute name="type" type="AudioDeviceType">
+ <desc>
+ Device type.
+ </desc>
+ </attribute>
+ <attribute name="usage" type="AudioDirection">
+ <desc>
+ Usage type of the device.
+ </desc>
+ </attribute>
+ <attribute name="defaultIn" type="boolean">
+ <desc>
+ Whether this device is being marked as the default input
+ device by the host OS.
+ </desc>
+ </attribute>
+ <attribute name="defaultOut" type="boolean">
+ <desc>
+ Whether this device is being marked as the default output
+ device by the host OS.
+ </desc>
+ </attribute>
+ <attribute name="isHotPlug" type="boolean">
+ <desc>
+ Whether this device is being marked as a hotplug device, i.e. can
+ be removed from the system.
+ </desc>
+ </attribute>
+ <attribute name="state" type="AudioDeviceState">
+ <desc>
+ Current device state.
+ </desc>
+ </attribute>
+ <method name="getProperty" const="yes">
+ <desc>
+ Returns an audio specific property string.
+
+ If the requested data @a key does not exist, this function will
+ succeed and return an empty string in the @a value argument.
+
+ </desc>
+ <param name="key" type="wstring" dir="in">
+ <desc>Name of the key to get.</desc>
+ </param>
+ <param name="value" type="wstring" dir="return">
+ <desc>Value of the requested key.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <interface
+ name="IAudioSettings" extends="$unknown"
+ uuid="52f40b16-520e-473f-9428-3e69b0d915c3"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>
+ The IAudioSettings interface represents the audio settings for a virtual machine.
+ </desc>
+
+ <method name="getHostAudioDevice">
+ <desc>
+ Returns the machine's current host audio device for the specified usage.
+ <result name="E_NOTIMPL">
+ This method is not implemented yet.
+ </result>
+ </desc>
+ <param name="usage" type="AudioDirection" dir="in">
+ <desc>Usage to retrieve audio device for.</desc>
+ </param>
+ <param name="device" type="IHostAudioDevice" dir="return">
+ <desc>Host audio device for the specified direction.</desc>
+ </param>
+ </method>
+
+ <method name="setHostAudioDevice">
+ <desc>
+ Sets the machine's current host audio device for the specified usage.
+ <result name="E_NOTIMPL">
+ This method is not implemented yet.
+ </result>
+ </desc>
+ <param name="device" type="IHostAudioDevice" dir="in">
+ <desc>Sets the host audio device for the specified usage.</desc>
+ </param>
+ <param name="usage" type="AudioDirection" dir="in">
+ <desc>Usage to set audio device for.</desc>
+ </param>
+ </method>
+
+ <attribute name="adapter" type="IAudioAdapter" readonly="yes">
+ <desc>Associated audio adapter, always present.</desc>
+ </attribute>
+
+ </interface>
+
+ <enum
+ name="AuthType"
+ uuid="7eef6ef6-98c2-4dc2-ab35-10d2b292028d"
+ >
+ <desc>
+ VirtualBox authentication type.
+ </desc>
+
+ <const name="Null" value="0">
+ <desc>Null value, also means "no authentication".</desc>
+ </const>
+ <const name="External" value="1"/>
+ <const name="Guest" value="2"/>
+ </enum>
+
+ <!--
+ // IVRDEServer
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IVRDEServer" extends="$unknown"
+ uuid="08e25756-08a2-41af-a05f-d7c661abaebe"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="2" reservedAttributes="4"
+ >
+
+ <attribute name="enabled" type="boolean">
+ <desc>Flag if VRDE server is enabled.</desc>
+ </attribute>
+
+ <attribute name="authType" type="AuthType">
+ <desc>VRDE authentication method.</desc>
+ </attribute>
+
+ <attribute name="authTimeout" type="unsigned long">
+ <desc>Timeout for guest authentication. Milliseconds.</desc>
+ </attribute>
+
+ <attribute name="allowMultiConnection" type="boolean">
+ <desc>
+ Flag whether multiple simultaneous connections to the VM are permitted.
+ Note that this will be replaced by a more powerful mechanism in the future.
+ </desc>
+ </attribute>
+
+ <attribute name="reuseSingleConnection" type="boolean">
+ <desc>
+ Flag whether the existing connection must be dropped and a new connection
+ must be established by the VRDE server, when a new client connects in single
+ connection mode.
+ </desc>
+ </attribute>
+
+ <attribute name="VRDEExtPack" type="wstring">
+ <desc>
+ The name of Extension Pack providing VRDE for this VM. Overrides
+ <link to="ISystemProperties::defaultVRDEExtPack"/>.
+ </desc>
+ </attribute>
+
+ <attribute name="authLibrary" type="wstring">
+ <desc>
+ Library used for authentication of RDP clients by this VM. Overrides
+ <link to="ISystemProperties::VRDEAuthLibrary"/>.
+ </desc>
+ </attribute>
+
+ <attribute name="VRDEProperties" type="wstring" readonly="yes" safearray="yes">
+ <desc>
+ Array of names of properties, which are supported by this VRDE server.
+ </desc>
+ </attribute>
+
+ <method name="setVRDEProperty">
+ <desc>
+ Sets a VRDE specific property string.
+
+ If you pass @c null or empty string as a key @a value, the given @a key
+ will be deleted.
+
+ </desc>
+ <param name="key" type="wstring" dir="in">
+ <desc>Name of the key to set.</desc>
+ </param>
+ <param name="value" type="wstring" dir="in">
+ <desc>Value to assign to the key.</desc>
+ </param>
+ </method>
+
+ <method name="getVRDEProperty" const="yes">
+ <desc>
+ Returns a VRDE specific property string.
+
+ If the requested data @a key does not exist, this function will
+ succeed and return an empty string in the @a value argument.
+
+ </desc>
+ <param name="key" type="wstring" dir="in">
+ <desc>Name of the key to get.</desc>
+ </param>
+ <param name="value" type="wstring" dir="return">
+ <desc>Value of the requested key.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+
+ <!--
+ // ISharedFolder
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="ISharedFolder" extends="$unknown"
+ uuid="9622225a-5409-414b-bd16-77df7ba3451e"
+ wsmap="managed"
+ rest="managed"
+ reservedAttributes="8"
+ >
+ <desc>
+ The ISharedFolder interface represents a folder in the host computer's
+ file system accessible from the guest OS running inside a virtual
+ machine using an associated logical name.
+
+ There are three types of shared folders:
+ <ul>
+ <li><i>Global</i> (<link to="IVirtualBox::sharedFolders"/>), shared
+ folders available to all virtual machines.</li>
+ <li><i>Permanent</i> (<link to="IMachine::sharedFolders"/>),
+ VM-specific shared folders available to the given virtual machine at
+ startup.</li>
+ <li><i>Transient</i> (<link to="IConsole::sharedFolders"/>),
+ VM-specific shared folders created in the session context (for
+ example, when the virtual machine is running) and automatically
+ discarded when the session is closed (the VM is powered off).</li>
+ </ul>
+
+ Logical names of shared folders must be unique within the given scope
+ (global, permanent or transient). However, they do not need to be unique
+ across scopes. In this case, the definition of the shared folder in a
+ more specific scope takes precedence over definitions in all other
+ scopes. The order of precedence is (more specific to more general):
+ <ol>
+ <li>Transient definitions</li>
+ <li>Permanent definitions</li>
+ <li>Global definitions</li>
+ </ol>
+
+ For example, if MyMachine has a shared folder named
+ <tt>C_DRIVE</tt> (that points to <tt>C:\\</tt>), then creating a
+ transient shared folder named <tt>C_DRIVE</tt> (that points
+ to <tt>C:\\\\WINDOWS</tt>) will change the definition
+ of <tt>C_DRIVE</tt> in the guest OS so
+ that <tt>\\\\VBOXSVR\\C_DRIVE</tt> will give access
+ to <tt>C:\\WINDOWS</tt> instead of <tt>C:\\</tt> on the host
+ PC. Removing the transient shared folder <tt>C_DRIVE</tt> will restore
+ the previous (permanent) definition of <tt>C_DRIVE</tt> that points
+ to <tt>C:\\</tt> if it still exists.
+
+ Note that permanent and transient shared folders of different machines
+ are in different name spaces, so they don't overlap and don't need to
+ have unique logical names.
+
+ <note>
+ Global shared folders are not implemented in the current version of the
+ product.
+ </note>
+ </desc>
+
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>Logical name of the shared folder.</desc>
+ </attribute>
+
+ <attribute name="hostPath" type="wstring" readonly="yes">
+ <desc>Full path to the shared folder in the host file system.</desc>
+ </attribute>
+
+ <attribute name="accessible" type="boolean" readonly="yes">
+ <desc>
+ Whether the folder defined by the host path is currently
+ accessible or not.
+
+ For example, the folder can be inaccessible if it is placed
+ on the network share that is not available by the time
+ this property is read.
+ </desc>
+ </attribute>
+
+ <attribute name="writable" type="boolean">
+ <desc>
+ Whether the folder defined by the host path is writable or
+ not.
+ </desc>
+ </attribute>
+
+ <attribute name="autoMount" type="boolean">
+ <desc>
+ Whether the folder gets automatically mounted by the guest or not.
+ </desc>
+ </attribute>
+
+ <attribute name="autoMountPoint" type="wstring">
+ <desc>
+ Desired mount point in the guest for automatically mounting the folder
+ when <link to="ISharedFolder::autoMount"/> is set. For Windows and
+ OS/2 guests this should be a drive letter, while other guests it should
+ be a absolute directory. It is possible to combine the two, e.g.
+ "T:/mnt/testrsrc" will be attached to "T:" by windows and OS/2 while
+ the unixy guests will mount it at "/mnt/testrsrc".
+
+ When empty the guest will choose a mount point. The guest may do so
+ too should the specified mount point be in use or otherwise unusable.
+ </desc>
+ </attribute>
+
+ <attribute name="lastAccessError" type="wstring" readonly="yes">
+ <desc>
+ Text message that represents the result of the last accessibility
+ check.
+
+ Accessibility checks are performed each time the <link to="#accessible"/>
+ attribute is read. An empty string is returned if the last
+ accessibility check was successful. A non-empty string indicates a
+ failure and should normally describe a reason of the failure (for
+ example, a file read error).
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <!--
+ // ISession
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="Reason"
+ uuid="e7e8e097-299d-4e98-8bbc-c31c2d47d0cc"
+ >
+ <desc>
+ Internal event reason type.
+ </desc>
+
+ <const name="Unspecified" value="0">
+ <desc>Null value, means "no known reason".</desc>
+ </const>
+ <const name="HostSuspend" value="1">
+ <desc>Host is being suspended (power management event).</desc>
+ </const>
+ <const name="HostResume" value="2">
+ <desc>Host is being resumed (power management event).</desc>
+ </const>
+ <const name="HostBatteryLow" value="3">
+ <desc>Host is running low on battery (power management event).</desc>
+ </const>
+ <const name="Snapshot" value="4">
+ <desc>A snapshot of the VM is being taken.</desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IInternalSessionControl" extends="$unknown"
+ uuid="5045c372-2e8f-4d9e-ad9d-121ab1661146"
+ internal="yes"
+ wsmap="suppress"
+ >
+ <attribute name="PID" type="unsigned long" readonly="yes">
+ <desc>PID of the process that has created this Session object.
+ </desc>
+ </attribute>
+
+ <attribute name="remoteConsole" type="IConsole" readonly="yes">
+ <desc>
+ Returns the console object suitable for remote control.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+ </attribute>
+
+ <attribute name="nominalState" type="MachineState" readonly="yes">
+ <desc>Returns suitable machine state for the VM execution state. Useful
+ for choosing a sensible machine state after a complex operation which
+ failed or otherwise resulted in an unclear situation.
+ </desc>
+ </attribute>
+
+<if target="midl">
+ <method name="assignMachine">
+ <desc>
+ Assigns the machine object associated with this direct-type
+ session or informs the session that it will be a remote one
+ (if @a machine == @c null).
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+ <param name="machine" type="IMachine" dir="in"/>
+ <param name="lockType" type="LockType" dir="in"/>
+ <param name="tokenId" type="wstring" dir="in"/>
+ </method>
+</if>
+<if target="xpidl">
+ <method name="assignMachine">
+ <desc>
+ Assigns the machine object associated with this direct-type
+ session or informs the session that it will be a remote one
+ (if @a machine == @c null).
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+ <param name="machine" type="IMachine" dir="in"/>
+ <param name="lockType" type="LockType" dir="in"/>
+ <param name="token" type="IToken" dir="in"/>
+ </method>
+</if>
+
+ <method name="assignRemoteMachine">
+ <desc>
+ Assigns the machine and the (remote) console object associated with
+ this remote-type session.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+
+ </desc>
+ <param name="machine" type="IMachine" dir="in"/>
+ <param name="console" type="IConsole" dir="in"/>
+ </method>
+
+ <method name="updateMachineState">
+ <desc>
+ Updates the machine state in the VM process.
+ Must be called only in certain cases
+ (see the method implementation).
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+ <param name="machineState" type="MachineState" dir="in"/>
+ </method>
+
+ <method name="uninitialize">
+ <desc>
+ Uninitializes (closes) this session. Used by VirtualBox to close
+ the corresponding remote session when the direct session dies
+ or gets closed.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+
+ </desc>
+ </method>
+
+ <method name="onNetworkAdapterChange">
+ <desc>
+ Triggered when settings of a network adapter of the
+ associated virtual machine have changed.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+ <param name="networkAdapter" type="INetworkAdapter" dir="in"/>
+ <param name="changeAdapter" type="boolean" dir="in"/>
+ </method>
+
+ <method name="onAudioAdapterChange">
+ <desc>
+ Triggerd when settings of the audio adapter of the
+ associated virtual machine have changed.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+ <param name="audioAdapter" type="IAudioAdapter" dir="in"/>
+ </method>
+
+ <method name="onHostAudioDeviceChange">
+ <desc>
+ Triggerd when the state of a host audio device
+ has changed.
+ </desc>
+ <param name="device" type="IHostAudioDevice" dir="in" readonly="yes">
+ <desc>Device the state has been changed for.</desc>
+ </param>
+ <param name="isNew" type="boolean" dir="in" readonly="yes">
+ <desc>Whether this is a newly detected device or not.</desc>
+ </param>
+ <param name="state" type="AudioDeviceState" dir="in" readonly="yes">
+ <desc>The new device state.</desc>
+ </param>
+ <param name="errorInfo" type="IVirtualBoxErrorInfo" dir="in" readonly="yes">
+ <desc>Error information.</desc>
+ </param>
+ </method>
+
+ <method name="onSerialPortChange">
+ <desc>
+ Triggered when settings of a serial port of the
+ associated virtual machine have changed.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+ <param name="serialPort" type="ISerialPort" dir="in"/>
+ </method>
+
+ <method name="onParallelPortChange">
+ <desc>
+ Triggered when settings of a parallel port of the
+ associated virtual machine have changed.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+ <param name="parallelPort" type="IParallelPort" dir="in"/>
+ </method>
+
+ <method name="onStorageControllerChange">
+ <desc>
+ Triggered when settings of a storage controller of the
+ associated virtual machine have changed.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+ <param name="machineId" type="uuid" mod="string" dir="in">
+ <desc>The id of the machine containing the storage controller.</desc>
+ </param>
+ <param name="controllerName" type="wstring" dir="in">
+ <desc>The name of the storage controller.</desc>
+ </param>
+ </method>
+
+ <method name="onMediumChange">
+ <desc>
+ Triggered when attached media of the
+ associated virtual machine have changed.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+
+ <param name="mediumAttachment" type="IMediumAttachment" dir="in">
+ <desc>The medium attachment which changed.</desc>
+ </param>
+ <param name="force" type="boolean" dir="in">
+ <desc>If the medium change was forced.</desc>
+ </param>
+ </method>
+
+ <method name="onStorageDeviceChange">
+ <desc>
+ Triggered when attached storage devices of the
+ associated virtual machine have changed.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+
+ <param name="mediumAttachment" type="IMediumAttachment" dir="in">
+ <desc>The medium attachment which changed.</desc>
+ </param>
+ <param name="remove" type="boolean" dir="in">
+ <desc>TRUE if the device is removed, FALSE if it was added.</desc>
+ </param>
+ <param name="silent" type="boolean" dir="in">
+ <desc>TRUE if the device is is silently reconfigured without
+ notifying the guest about it.</desc>
+ </param>
+ </method>
+
+ <method name="onVMProcessPriorityChange">
+ <desc>
+ Triggered when process priority of the
+ associated virtual machine have changed.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+ <result name="VBOX_E_VM_ERROR">
+ Error from underlying level. See additional error info.
+ </result>
+
+ </desc>
+
+ <param name="priority" type="VMProcPriority" dir="in">
+ <desc>The priority which set.</desc>
+ </param>
+ </method>
+
+ <method name="onClipboardModeChange">
+ <desc>
+ Notification when the shared clipboard mode changes.
+ </desc>
+ <param name="clipboardMode" type="ClipboardMode" dir="in">
+ <desc>The new shared clipboard mode.</desc>
+ </param>
+ </method>
+
+ <method name="onClipboardFileTransferModeChange">
+ <desc>
+ Notification when the shared clipboard file transfers mode changes.
+ </desc>
+ <param name="enabled" type="boolean" dir="in">
+ <desc>Flag whether clipboard file transfers are allowed or not.</desc>
+ </param>
+ </method>
+
+ <method name="onDnDModeChange">
+ <desc>
+ Notification when the drag'n drop mode changes.
+ </desc>
+ <param name="dndMode" type="DnDMode" dir="in">
+ <desc>The new mode for drag'n drop.</desc>
+ </param>
+ </method>
+
+ <method name="onCPUChange">
+ <desc>
+ Notification when a CPU changes.
+ </desc>
+ <param name="cpu" type="unsigned long" dir="in">
+ <desc>The CPU which changed</desc>
+ </param>
+ <param name="add" type="boolean" dir="in">
+ <desc>Flag whether the CPU was added or removed</desc>
+ </param>
+ </method>
+
+ <method name="onCPUExecutionCapChange">
+ <desc>
+ Notification when the CPU execution cap changes.
+ </desc>
+ <param name="executionCap" type="unsigned long" dir="in">
+ <desc>The new CPU execution cap value. (1-100)</desc>
+ </param>
+ </method>
+
+ <method name="onVRDEServerChange">
+ <desc>
+ Triggered when settings of the VRDE server object of the
+ associated virtual machine have changed.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+ <param name="restart" type="boolean" dir="in">
+ <desc>Flag whether the server must be restarted</desc>
+ </param>
+ </method>
+
+ <method name="onRecordingChange">
+ <desc>
+ Triggered when recording settings have changed.
+ </desc>
+ <param name="enable" type="boolean" dir="in">
+ <desc>TODO</desc>
+ </param>
+ </method>
+
+ <method name="onUSBControllerChange">
+ <desc>
+ Triggered when settings of the USB controller object of the
+ associated virtual machine have changed.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+ </method>
+
+ <method name="onSharedFolderChange">
+ <desc>
+ Triggered when a permanent (global or machine) shared folder has been
+ created or removed.
+ <note>
+ We don't pass shared folder parameters in this notification because
+ the order in which parallel notifications are delivered is not defined,
+ therefore it could happen that these parameters were outdated by the
+ time of processing this notification.
+ </note>
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+ <param name="global" type="boolean" dir="in"/>
+ </method>
+
+ <method name="onGuestDebugControlChange">
+ <desc>
+ Triggered when settings of the guest debug settings of the
+ associated virtual machine have changed.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+ <param name="guestDebugControl" type="IGuestDebugControl" dir="in"/>
+ </method>
+
+ <method name="onUSBDeviceAttach">
+ <desc>
+ Triggered when a request to capture a USB device (as a result
+ of matched USB filters or direct call to
+ <link to="IConsole::attachUSBDevice"/>) has completed.
+ A @c null @a error object means success, otherwise it
+ describes a failure.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+ <param name="device" type="IUSBDevice" dir="in"/>
+ <param name="error" type="IVirtualBoxErrorInfo" dir="in"/>
+ <param name="maskedInterfaces" type="unsigned long" dir="in"/>
+ <param name="captureFilename" type="wstring" dir="in"/>
+ </method>
+
+ <method name="onUSBDeviceDetach">
+ <desc>
+ Triggered when a request to release the USB device (as a result
+ of machine termination or direct call to
+ <link to="IConsole::detachUSBDevice"/>) has completed.
+ A @c null @a error object means success, otherwise it
+ describes a failure.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Session state prevents operation.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+ <param name="id" type="uuid" mod="string" dir="in"/>
+ <param name="error" type="IVirtualBoxErrorInfo" dir="in"/>
+ </method>
+
+ <method name="onShowWindow">
+ <desc>
+ Called by <link to="IMachine::canShowConsoleWindow"/> and by
+ <link to="IMachine::showConsoleWindow"/> in order to notify
+ console listeners
+ <link to="ICanShowWindowEvent"/>
+ and <link to="IShowWindowEvent"/>.
+
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type prevents operation.
+ </result>
+
+ </desc>
+ <param name="check" type="boolean" dir="in"/>
+ <param name="canShow" type="boolean" dir="out"/>
+ <param name="winId" type="long long" dir="out"/>
+ </method>
+
+ <method name="onBandwidthGroupChange">
+ <desc>
+ Notification when one of the bandwidth groups change.
+ </desc>
+ <param name="bandwidthGroup" type="IBandwidthGroup" dir="in">
+ <desc>The bandwidth group which changed.</desc>
+ </param>
+ </method>
+
+ <method name="accessGuestProperty">
+ <desc>
+ Called by <link to="IMachine::getGuestProperty"/> and by
+ <link to="IMachine::setGuestProperty"/> in order to read and
+ modify guest properties.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Machine session is not open.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type is not direct.
+ </result>
+
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of guest property.</desc>
+ </param>
+ <param name="value" type="wstring" dir="in">
+ <desc>Value of guest property.</desc>
+ </param>
+ <param name="flags" type="wstring" dir="in">
+ <desc>Flags of guest property.</desc>
+ </param>
+ <param name="accessMode" type="unsigned long" dir="in">
+ <desc>0 = get, 1 = set, 2 = delete.</desc>
+ </param>
+ <param name="retValue" type="wstring" dir="out">
+ <desc>When getting: Value of guest property.</desc>
+ </param>
+ <param name="retTimestamp" type="long long" dir="out">
+ <desc>When getting: Timestamp of guest property.</desc>
+ </param>
+ <param name="retFlags" type="wstring" dir="out">
+ <desc>When getting: Flags of guest property.</desc>
+ </param>
+ </method>
+
+ <method name="enumerateGuestProperties" const="yes">
+ <desc>
+ Return a list of the guest properties matching a set of patterns along
+ with their values, timestamps and flags.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Machine session is not open.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type is not direct.
+ </result>
+
+ </desc>
+ <param name="patterns" type="wstring" dir="in">
+ <desc>
+ The patterns to match the properties against as a comma-separated
+ string. If this is empty, all properties currently set will be
+ returned.
+ </desc>
+ </param>
+ <param name="keys" type="wstring" dir="out" safearray="yes">
+ <desc>
+ The key names of the properties returned.
+ </desc>
+ </param>
+ <param name="values" type="wstring" dir="out" safearray="yes">
+ <desc>
+ The values of the properties returned. The array entries match the
+ corresponding entries in the @a key array.
+ </desc>
+ </param>
+ <param name="timestamps" type="long long" dir="out" safearray="yes">
+ <desc>
+ The timestamps of the properties returned. The array entries match
+ the corresponding entries in the @a key array.
+ </desc>
+ </param>
+ <param name="flags" type="wstring" dir="out" safearray="yes">
+ <desc>
+ The flags of the properties returned. The array entries match the
+ corresponding entries in the @a key array.
+ </desc>
+ </param>
+ </method>
+
+ <method name="onlineMergeMedium">
+ <desc>
+ Triggers online merging of a hard disk. Used internally when deleting
+ a snapshot while a VM referring to the same hard disk chain is running.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Machine session is not open.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type is not direct.
+ </result>
+
+ </desc>
+ <param name="mediumAttachment" type="IMediumAttachment" dir="in">
+ <desc>The medium attachment to identify the medium chain.</desc>
+ </param>
+ <param name="sourceIdx" type="unsigned long" dir="in">
+ <desc>The index of the source image in the chain.
+ Redundant, but drastically reduces IPC.</desc>
+ </param>
+ <param name="targetIdx" type="unsigned long" dir="in">
+ <desc>The index of the target image in the chain.
+ Redundant, but drastically reduces IPC.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="in">
+ <desc>
+ Progress object for this operation.
+ </desc>
+ </param>
+ </method>
+
+ <method name="reconfigureMediumAttachments">
+ <desc>
+ Reconfigure all specified medium attachments in one go, making sure
+ the current state corresponds to the specified medium.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Machine session is not open.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type is not direct.
+ </result>
+ </desc>
+ <param name="attachments" type="IMediumAttachment" dir="in" safearray="yes">
+ <desc>Array containing the medium attachments which need to be
+ reconfigured.</desc>
+ </param>
+ </method>
+
+ <method name="enableVMMStatistics">
+ <desc>
+ Enables or disables collection of VMM RAM statistics.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Machine session is not open.
+ </result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">
+ Session type is not direct.
+ </result>
+
+ </desc>
+ <param name="enable" type="boolean" dir="in">
+ <desc>True enables statistics collection.</desc>
+ </param>
+ </method>
+
+ <method name="pauseWithReason">
+ <desc>
+ Internal method for triggering a VM pause with a specified reason code.
+ The reason code can be interpreted by device/drivers and thus it might
+ behave slightly differently than a normal VM pause.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine not in Running state.
+ </result>
+ <result name="VBOX_E_VM_ERROR">
+ Virtual machine error in suspend operation.
+ </result>
+ <see><link to="IConsole::pause"/></see>
+ </desc>
+
+ <param name="reason" type="Reason" dir="in">
+ <desc>Specify the best matching reason code please.</desc>
+ </param>
+ </method>
+
+ <method name="resumeWithReason">
+ <desc>
+ Internal method for triggering a VM resume with a specified reason code.
+ The reason code can be interpreted by device/drivers and thus it might
+ behave slightly differently than a normal VM resume.
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine not in Paused state.
+ </result>
+ <result name="VBOX_E_VM_ERROR">
+ Virtual machine error in resume operation.
+ </result>
+ <see><link to="IConsole::resume"/></see>
+ </desc>
+
+ <param name="reason" type="Reason" dir="in">
+ <desc>Specify the best matching reason code please.</desc>
+ </param>
+ </method>
+
+ <method name="saveStateWithReason">
+ <desc>
+ Internal method for triggering a VM save state with a specified reason
+ code. The reason code can be interpreted by device/drivers and thus it
+ might behave slightly differently than a normal VM save state.
+
+ This call is fully synchronous, and the caller is expected to have set
+ the machine state appropriately (and has to set the follow-up machine
+ state if this call failed).
+
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine state is not one of the expected values.
+ </result>
+ <result name="VBOX_E_FILE_ERROR">
+ Failed to create directory for saved state file.
+ </result>
+ <see><link to="IMachine::saveState"/></see>
+ </desc>
+
+ <param name="reason" type="Reason" dir="in">
+ <desc>Specify the best matching reason code please.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="in">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ <param name="snapshot" type="ISnapshot" dir="in">
+ <desc>Snapshot object for which this save state operation is executed.</desc>
+ </param>
+ <param name="stateFilePath" type="wstring" dir="in">
+ <desc>File path the VM process must save the execution state to.</desc>
+ </param>
+ <param name="pauseVM" type="boolean" dir="in">
+ <desc>The VM should be paused before saving state. It is automatically
+ unpaused on error in the "vanilla save state" case.</desc>
+ </param>
+ <param name="leftPaused" type="boolean" dir="return">
+ <desc>Returns if the VM was left in paused state, which is necessary
+ in many situations (snapshots, teleportation).</desc>
+ </param>
+ </method>
+
+ <method name="cancelSaveStateWithReason">
+ <desc>
+ Internal method for cancelling a VM save state.
+ <see><link to="IInternalSessionControl::saveStateWithReason"/></see>
+ </desc>
+ </method>
+
+ </interface>
+
+ <interface
+ name="ISession" extends="$unknown"
+ uuid="c0447716-ff5a-4795-b57a-ecd5fffa18a4"
+ wsmap="managed"
+ rest="managed"
+ wrap-hint-server-addinterfaces="IInternalSessionControl"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>
+ The ISession interface represents a client process and allows for locking
+ virtual machines (represented by IMachine objects) to prevent conflicting
+ changes to the machine.
+
+ Any caller wishing to manipulate a virtual machine needs to create a session
+ object first, which lives in its own process space. Such session objects are
+ then associated with <link to="IMachine" /> objects living in the VirtualBox
+ server process to coordinate such changes.
+
+ There are two typical scenarios in which sessions are used:
+
+ <ul>
+ <li>To alter machine settings or control a running virtual machine, one
+ needs to lock a machine for a given session (client process) by calling
+ <link to="IMachine::lockMachine"/>.
+
+ Whereas multiple sessions may control a running virtual machine, only
+ one process can obtain a write lock on the machine to prevent conflicting
+ changes. A write lock is also needed if a process wants to actually run a
+ virtual machine in its own context, such as the VirtualBox GUI or
+ VBoxHeadless front-ends. They must also lock a machine for their own
+ sessions before they are allowed to power up the virtual machine.
+
+ As a result, no machine settings can be altered while another process is
+ already using it, either because that process is modifying machine settings
+ or because the machine is running.
+ </li>
+ <li>To start a VM using one of the existing VirtualBox front-ends (e.g. the
+ VirtualBox GUI or VBoxHeadless), one would use
+ <link to="IMachine::launchVMProcess"/>, which also takes a session object
+ as its first parameter. This session then identifies the caller and lets the
+ caller control the started machine (for example, pause machine execution or
+ power it down) as well as be notified about machine execution state changes.
+ </li>
+ </ul>
+
+ How sessions objects are created in a client process depends on whether you use
+ the Main API via COM or via the webservice:
+
+ <ul>
+ <li>When using the COM API directly, an object of the Session class from the
+ VirtualBox type library needs to be created. In regular COM C++ client code,
+ this can be done by calling <tt>createLocalObject()</tt>, a standard COM API.
+ This object will then act as a local session object in further calls to open
+ a session.
+ </li>
+
+ <li>In the webservice, the session manager (IWebsessionManager) instead creates
+ a session object automatically whenever <link to="IWebsessionManager::logon" />
+ is called. A managed object reference to that session object can be retrieved by
+ calling <link to="IWebsessionManager::getSessionObject" />.
+ </li>
+ </ul>
+ </desc>
+
+ <attribute name="state" type="SessionState" readonly="yes">
+ <desc>Current state of this session.</desc>
+ </attribute>
+
+ <attribute name="type" type="SessionType" readonly="yes">
+ <desc>
+ Type of this session. The value of this attribute is valid only
+ if the session currently has a machine locked (i.e. its
+ <link to="#state" /> is Locked), otherwise an error will be returned.
+ </desc>
+ </attribute>
+
+ <attribute name="name" type="wstring">
+ <desc>
+ Name of this session. Important only for VM sessions, otherwise it
+ it will be remembered, but not used for anything significant (and can
+ be left at the empty string which is the default). The value can only
+ be changed when the session state is SessionState_Unlocked. Make sure
+ that you use a descriptive name which does not conflict with the VM
+ process session names: "GUI/Qt", "GUI/SDL" and "headless".
+ </desc>
+ </attribute>
+
+ <attribute name="machine" type="IMachine" readonly="yes" rest="uuid">
+ <desc>Machine object associated with this session.</desc>
+ </attribute>
+
+ <attribute name="console" type="IConsole" readonly="yes">
+ <desc>Console object associated with this session. Only sessions
+ which locked the machine for a VM process have a non-null console.</desc>
+ </attribute>
+
+ <method name="unlockMachine">
+ <desc>
+ Unlocks a machine that was previously locked for the current session.
+
+ Calling this method is required every time a machine has been locked
+ for a particular session using the <link to="IMachine::launchVMProcess" />
+ or <link to="IMachine::lockMachine" /> calls. Otherwise the state of
+ the machine will be set to <link to="MachineState_Aborted" /> on the
+ server, and changes made to the machine settings will be lost.
+
+ Generally, it is recommended to unlock all machines explicitly
+ before terminating the application (regardless of the reason for
+ the termination).
+
+ <note>
+ Do not expect the session state (<link to="ISession::state" />
+ to return to "Unlocked" immediately after you invoke this method,
+ particularly if you have started a new VM process. The session
+ state will automatically return to "Unlocked" once the VM is no
+ longer executing, which can of course take a very long time.
+ </note>
+
+ <result name="E_UNEXPECTED">
+ Session is not locked.
+ </result>
+
+ </desc>
+ </method>
+
+ </interface>
+
+ <!--
+ // IStorageController
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <enum
+ name="StorageBus"
+ uuid="f9510869-7d07-46ba-96a6-6728fbf4adee"
+ >
+ <desc>
+ The bus type of the storage controller (IDE, SATA, SCSI, SAS or Floppy);
+ see <link to="IStorageController::bus" />.
+ </desc>
+ <const name="Null" value="0">
+ <desc>@c null value. Never used by the API.</desc>
+ </const>
+ <const name="IDE" value="1"/>
+ <const name="SATA" value="2"/>
+ <const name="SCSI" value="3"/>
+ <const name="Floppy" value="4"/>
+ <const name="SAS" value="5"/>
+ <const name="USB" value="6"/>
+ <const name="PCIe" value="7"/>
+ <const name="VirtioSCSI" value="8"/>
+ </enum>
+
+ <enum
+ name="StorageControllerType"
+ uuid="a77d457d-66a3-4368-b24c-293d0f562a9f"
+ >
+ <desc>
+ The exact variant of storage controller hardware presented
+ to the guest; see <link to="IStorageController::controllerType" />.
+ </desc>
+
+ <const name="Null" value="0">
+ <desc>@c null value. Never used by the API.</desc>
+ </const>
+ <const name="LsiLogic" value="1">
+ <desc>A SCSI controller of the LsiLogic variant.</desc>
+ </const>
+ <const name="BusLogic" value="2">
+ <desc>A SCSI controller of the BusLogic variant.</desc>
+ </const>
+ <const name="IntelAhci" value="3">
+ <desc>An Intel AHCI SATA controller; this is the only variant for SATA.</desc>
+ </const>
+ <const name="PIIX3" value="4">
+ <desc>An IDE controller of the PIIX3 variant.</desc>
+ </const>
+ <const name="PIIX4" value="5">
+ <desc>An IDE controller of the PIIX4 variant.</desc>
+ </const>
+ <const name="ICH6" value="6">
+ <desc>An IDE controller of the ICH6 variant.</desc>
+ </const>
+ <const name="I82078" value="7">
+ <desc>A floppy disk controller; this is the only variant for floppy drives.</desc>
+ </const>
+ <const name="LsiLogicSas" value="8">
+ <desc>A variant of the LsiLogic controller using SAS.</desc>
+ </const>
+ <const name="USB" value="9">
+ <desc>Special USB based storage controller.</desc>
+ </const>
+ <const name="NVMe" value="10">
+ <desc>An NVMe storage controller.</desc>
+ </const>
+ <const name="VirtioSCSI" value="11">
+ <desc>Virtio SCSI storage controller.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="ChipsetType"
+ uuid="8b4096a8-a7c3-4d3b-bbb1-05a0a51ec394"
+ >
+ <desc>
+ Type of emulated chipset (mostly southbridge).
+ </desc>
+
+ <const name="Null" value="0">
+ <desc>@c null value. Never used by the API.</desc>
+ </const>
+ <const name="PIIX3" value="1">
+ <desc>A PIIX3 (PCI IDE ISA Xcelerator) chipset.</desc>
+ </const>
+ <const name="ICH9" value="2">
+ <desc>A ICH9 (I/O Controller Hub) chipset.</desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IStorageController" extends="$unknown"
+ uuid="ddca7247-bf98-47fb-ab2f-b5177533f493"
+ wsmap="managed"
+ reservedMethods="4" reservedAttributes="8"
+ rest="managed"
+ >
+ <desc>
+ Represents a storage controller that is attached to a virtual machine
+ (<link to="IMachine" />). Just as drives (hard disks, DVDs, FDs) are
+ attached to storage controllers in a real computer, virtual drives
+ (represented by <link to="IMediumAttachment" />) are attached to virtual
+ storage controllers, represented by this interface.
+
+ As opposed to physical hardware, VirtualBox has a very generic concept
+ of a storage controller, and for purposes of the Main API, all virtual
+ storage is attached to virtual machines via instances of this interface.
+ There are five types of such virtual storage controllers: IDE, SCSI, SATA,
+ SAS and Floppy (see <link to="#bus" />). Depending on which of these four
+ is used, certain sub-types may be available and can be selected in
+ <link to="#controllerType" />.
+
+ Depending on these settings, the guest operating system might see
+ significantly different virtual hardware.
+ </desc>
+
+ <attribute name="name" type="wstring">
+ <desc>
+ Name of the storage controller, as originally specified with
+ <link to="IMachine::addStorageController" />. This then uniquely
+ identifies this controller with other method calls such as
+ <link to="IMachine::attachDevice" /> and <link to="IMachine::mountMedium" />.
+ </desc>
+ </attribute>
+
+ <attribute name="maxDevicesPerPortCount" type="unsigned long" readonly="yes">
+ <desc>
+ Maximum number of devices which can be attached to one port.
+ </desc>
+ </attribute>
+
+ <attribute name="minPortCount" type="unsigned long" readonly="yes">
+ <desc>
+ Minimum number of ports that <link to="IStorageController::portCount"/> can be set to.
+ </desc>
+ </attribute>
+
+ <attribute name="maxPortCount" type="unsigned long" readonly="yes">
+ <desc>
+ Maximum number of ports that <link to="IStorageController::portCount"/> can be set to.
+ </desc>
+ </attribute>
+
+ <attribute name="instance" type="unsigned long">
+ <desc>
+ The instance number of the device in the running VM.
+ </desc>
+ </attribute>
+
+ <attribute name="portCount" type="unsigned long">
+ <desc>
+ The number of currently usable ports on the controller.
+ The minimum and maximum number of ports for one controller are
+ stored in <link to="IStorageController::minPortCount"/>
+ and <link to="IStorageController::maxPortCount"/>.
+ </desc>
+ </attribute>
+
+ <attribute name="bus" type="StorageBus" readonly="yes">
+ <desc>
+ The bus type of the storage controller (IDE, SATA, SCSI, SAS or Floppy).
+ </desc>
+ </attribute>
+
+ <attribute name="controllerType" type="StorageControllerType">
+ <desc>
+ The exact variant of storage controller hardware presented
+ to the guest.
+ Depending on this value, VirtualBox will provide a different
+ virtual storage controller hardware to the guest.
+ For SATA, SAS and floppy controllers, only one variant is
+ available, but for IDE and SCSI, there are several.
+
+ For SCSI controllers, the default type is LsiLogic.
+ </desc>
+ </attribute>
+
+ <attribute name="useHostIOCache" type="boolean">
+ <desc>
+ If true, the storage controller emulation will use a dedicated I/O thread, enable the host I/O
+ caches and use synchronous file APIs on the host. This was the only option in the API before
+ VirtualBox 3.2 and is still the default for IDE controllers.
+
+ If false, the host I/O cache will be disabled for image files attached to this storage controller.
+ Instead, the storage controller emulation will use asynchronous I/O APIs on the host. This makes
+ it possible to turn off the host I/O caches because the emulation can handle unaligned access to
+ the file. This should be used on OS X and Linux hosts if a high I/O load is expected or many
+ virtual machines are running at the same time to prevent I/O cache related hangs.
+ This option new with the API of VirtualBox 3.2 and is now the default for non-IDE storage controllers.
+ </desc>
+ </attribute>
+
+ <attribute name="bootable" type="boolean" readonly="yes">
+ <desc>
+ Returns whether it is possible to boot from disks attached to this controller.
+ </desc>
+ </attribute>
+ </interface>
+
+<if target="wsdl">
+
+ <!--
+ // IManagedObjectRef
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IManagedObjectRef" extends="$unknown"
+ uuid="9474d09d-2313-46de-b568-a42b8718e8ed"
+ internal="yes"
+ wsmap="managed"
+ wscpp="hardcoded"
+ >
+ <desc>
+ Managed object reference.
+
+ Only within the webservice, a managed object reference (which is really
+ an opaque number) allows a webservice client to address an object
+ that lives in the address space of the webservice server.
+
+ Behind each managed object reference, there is a COM object that lives
+ in the webservice server's address space. The COM object is not freed
+ until the managed object reference is released, either by an explicit
+ call to <link to="IManagedObjectRef::release" /> or by logging off from
+ the webservice (<link to="IWebsessionManager::logoff" />), which releases
+ all objects created during the webservice session.
+
+ Whenever a method call of the VirtualBox API returns a COM object, the
+ webservice representation of that method will instead return a
+ managed object reference, which can then be used to invoke methods
+ on that object.
+ </desc>
+
+ <method name="getInterfaceName">
+ <desc>
+ Returns the name of the interface that this managed object represents,
+ for example, "IMachine", as a string.
+ </desc>
+ <param name="return" type="wstring" dir="return"/>
+ </method>
+
+ <method name="release">
+ <desc>
+ Releases this managed object reference and frees the resources that
+ were allocated for it in the webservice server process. After calling
+ this method, the identifier of the reference can no longer be used.
+ </desc>
+ </method>
+
+ </interface>
+
+ <!--
+ // IWebsessionManager
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IWebsessionManager" extends="$unknown"
+ uuid="930c8fea-453a-4a65-aca9-19ed9a872f88"
+ internal="yes"
+ wsmap="global"
+ wscpp="hardcoded"
+ >
+ <desc>
+ Websession manager. This provides essential services
+ to webservice clients.
+ </desc>
+ <method name="logon">
+ <desc>
+ Logs a new client onto the webservice and returns a managed object reference to
+ the IVirtualBox instance, which the client can then use as a basis to further
+ queries, since all calls to the VirtualBox API are based on the IVirtualBox
+ interface, in one way or the other.
+ </desc>
+ <param name="username" type="wstring" dir="in"/>
+ <param name="password" type="wstring" dir="in"/>
+ <param name="return" type="IVirtualBox" dir="return"/>
+ </method>
+
+ <method name="getSessionObject">
+ <desc>
+ Returns a managed object reference to a new ISession object for every
+ call to this method.
+
+ <see><link to="ISession"/></see>
+ </desc>
+ <param name="refIVirtualBox" type="IVirtualBox" dir="in"/>
+ <param name="return" type="ISession" dir="return"/>
+ </method>
+
+ <method name="logoff">
+ <desc>
+ Logs off the client who has previously logged on with <link to="IWebsessionManager::logon" />
+ and destroys all resources associated with the websession (most
+ importantly, all managed objects created in the server while the
+ websession was active).
+ </desc>
+ <param name="refIVirtualBox" type="IVirtualBox" dir="in"/>
+ </method>
+
+ </interface>
+
+</if>
+
+ <!--
+ // IPerformanceCollector & friends
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IPerformanceMetric" extends="$unknown"
+ uuid="81314d14-fd1c-411a-95c5-e9bb1414e632" wsmap="managed"
+ rest="managed"
+ reservedAttributes="8"
+ >
+ <desc>
+ The IPerformanceMetric interface represents parameters of the given
+ performance metric.
+ </desc>
+
+ <attribute name="metricName" type="wstring" readonly="yes">
+ <desc>
+ Name of the metric.
+ </desc>
+ </attribute>
+
+ <attribute name="object" type="$unknown" readonly="yes">
+ <desc>
+ Object this metric belongs to.
+ </desc>
+ </attribute>
+
+ <attribute name="description" type="wstring" readonly="yes">
+ <desc>
+ Textual description of the metric.
+ </desc>
+ </attribute>
+
+ <attribute name="period" type="unsigned long" readonly="yes">
+ <desc>
+ Time interval between samples, measured in seconds.
+ </desc>
+ </attribute>
+
+ <attribute name="count" type="unsigned long" readonly="yes">
+ <desc>
+ Number of recent samples retained by the performance collector for this
+ metric.
+
+ When the collected sample count exceeds this number, older samples
+ are discarded.
+ </desc>
+ </attribute>
+
+ <attribute name="unit" type="wstring" readonly="yes">
+ <desc>
+ Unit of measurement.
+ </desc>
+ </attribute>
+
+ <attribute name="minimumValue" type="long" readonly="yes">
+ <desc>
+ Minimum possible value of this metric.
+ </desc>
+ </attribute>
+
+ <attribute name="maximumValue" type="long" readonly="yes">
+ <desc>
+ Maximum possible value of this metric.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IPerformanceCollector" extends="$unknown"
+ uuid="b14290ad-cd54-400c-b858-797bcb82570e"
+ wsmap="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>
+ The IPerformanceCollector interface represents a service that collects
+ and stores performance metrics data.
+
+ Performance metrics are associated with objects of interfaces like IHost
+ and IMachine. Each object has a distinct set of performance metrics. The
+ set can be obtained with <link to="IPerformanceCollector::getMetrics"/>.
+
+ Metric data is collected at the specified intervals and is retained
+ internally. The interval and the number of retained samples can be set
+ with <link to="IPerformanceCollector::setupMetrics" />. Both metric data
+ and collection settings are not persistent, they are discarded as soon as
+ VBoxSVC process terminates. Moreover, metric settings and data associated
+ with a particular VM only exist while VM is running. They disappear as
+ soon as VM shuts down. It is not possible to set up metrics for machines
+ that are powered off. One needs to start VM first, then set up metric
+ collection parameters.
+
+ Metrics are organized hierarchically, with each level separated by a
+ slash (/) character. Generally, the scheme for metric names is like this:
+
+ <tt>Category/Metric[/SubMetric][:aggregation]</tt>
+
+ "Category/Metric" together form the base metric name. A base metric is
+ the smallest unit for which a sampling interval and the number of
+ retained samples can be set. Only base metrics can be enabled and
+ disabled. All sub-metrics are collected when their base metric is
+ collected. Collected values for any set of sub-metrics can be queried
+ with <link to="IPerformanceCollector::queryMetricsData" />.
+
+ For example "CPU/Load/User:avg" metric name stands for the "CPU"
+ category, "Load" metric, "User" submetric, "average" aggregate. An
+ aggregate function is computed over all retained data. Valid aggregate
+ functions are:
+
+ <ul>
+ <li>avg -- average</li>
+ <li>min -- minimum</li>
+ <li>max -- maximum</li>
+ </ul>
+
+ When setting up metric parameters, querying metric data, enabling or
+ disabling metrics wildcards can be used in metric names to specify a
+ subset of metrics. For example, to select all CPU-related metrics
+ use <tt>CPU/*</tt>, all averages can be queried using <tt>*:avg</tt> and
+ so on. To query metric values without aggregates <tt>*:</tt> can be used.
+
+ The valid names for base metrics are:
+
+ <ul>
+ <li>CPU/Load</li>
+ <li>CPU/MHz</li>
+ <li>RAM/Usage</li>
+ <li>RAM/VMM</li>
+ </ul>
+
+ The general sequence for collecting and retrieving the metrics is:
+ <ul>
+ <li>
+ Obtain an instance of IPerformanceCollector with
+ <link to="IVirtualBox::performanceCollector" />
+ </li>
+ <li>
+ Allocate and populate an array with references to objects the metrics
+ will be collected for. Use references to IHost and IMachine objects.
+ </li>
+ <li>
+ Allocate and populate an array with base metric names the data will
+ be collected for.
+ </li>
+ <li>
+ Call <link to="IPerformanceCollector::setupMetrics" />. From now on
+ the metric data will be collected and stored.
+ </li>
+ <li>
+ Wait for the data to get collected.
+ </li>
+ <li>
+ Allocate and populate an array with references to objects the metric
+ values will be queried for. You can re-use the object array used for
+ setting base metrics.
+ </li>
+ <li>
+ Allocate and populate an array with metric names the data will be
+ collected for. Note that metric names differ from base metric names.
+ </li>
+ <li>
+ Call <link to="IPerformanceCollector::queryMetricsData" />. The data
+ that have been collected so far are returned. Note that the values
+ are still retained internally and data collection continues.
+ </li>
+ </ul>
+
+ For an example of usage refer to the following files in VirtualBox SDK:
+ <ul>
+ <li>
+ Java: <tt>bindings/webservice/java/jax-ws/samples/metrictest.java</tt>
+ </li>
+ <li>
+ Python: <tt>bindings/xpcom/python/sample/shellcommon.py</tt>
+ </li>
+ </ul>
+ </desc>
+
+ <attribute name="metricNames" type="wstring" readonly="yes" safearray="yes">
+ <desc>
+ Array of unique names of metrics.
+
+ This array represents all metrics supported by the performance
+ collector. Individual objects do not necessarily support all of them.
+ <link to="IPerformanceCollector::getMetrics"/> can be used to get the
+ list of supported metrics for a particular object.
+ </desc>
+ </attribute>
+
+ <method name="getMetrics">
+ <desc>
+ Returns parameters of specified metrics for a set of objects.
+ <note>
+ @c Null metrics array means all metrics. @c Null object array means
+ all existing objects.
+ </note>
+ </desc>
+ <param name="metricNames" type="wstring" dir="in" safearray="yes">
+ <desc>
+ Metric name filter. Currently, only a comma-separated list of metrics
+ is supported.
+ </desc>
+ </param>
+ <param name="objects" type="$unknown" dir="in" safearray="yes">
+ <desc>
+ Set of objects to return metric parameters for.
+ </desc>
+ </param>
+ <param name="metrics" type="IPerformanceMetric" dir="return" safearray="yes">
+ <desc>
+ Array of returned metric parameters.
+ </desc>
+ </param>
+ </method>
+
+ <method name="setupMetrics">
+ <desc>
+ Sets parameters of specified base metrics for a set of objects. Returns
+ an array of <link to="IPerformanceMetric" /> describing the metrics
+ have been affected.
+ <note>
+ @c Null or empty metric name array means all metrics. @c Null or
+ empty object array means all existing objects. If metric name array
+ contains a single element and object array contains many, the single
+ metric name array element is applied to each object array element to
+ form metric/object pairs.
+ </note>
+ </desc>
+ <param name="metricNames" type="wstring" dir="in" safearray="yes">
+ <desc>
+ Metric name filter. Comma-separated list of metrics with wildcard
+ support.
+ </desc>
+ </param>
+ <param name="objects" type="$unknown" dir="in" safearray="yes">
+ <desc>
+ Set of objects to setup metric parameters for.
+ </desc>
+ </param>
+ <param name="period" type="unsigned long" dir="in">
+ <desc>
+ Time interval in seconds between two consecutive samples of
+ performance data.
+ </desc>
+ </param>
+ <param name="count" type="unsigned long" dir="in">
+ <desc>
+ Number of samples to retain in performance data history. Older
+ samples get discarded.
+ </desc>
+ </param>
+ <param name="affectedMetrics" type="IPerformanceMetric" dir="return" safearray="yes">
+ <desc>
+ Array of metrics that have been modified by the call to this method.
+ </desc>
+ </param>
+ </method>
+
+ <method name="enableMetrics">
+ <desc>
+ Turns on collecting specified base metrics. Returns an array of
+ <link to="IPerformanceMetric" /> describing the metrics have been
+ affected.
+ <note>
+ @c Null or empty metric name array means all metrics. @c Null or
+ empty object array means all existing objects. If metric name array
+ contains a single element and object array contains many, the single
+ metric name array element is applied to each object array element to
+ form metric/object pairs.
+ </note>
+ </desc>
+ <param name="metricNames" type="wstring" dir="in" safearray="yes">
+ <desc>
+ Metric name filter. Comma-separated list of metrics with wildcard
+ support.
+ </desc>
+ </param>
+ <param name="objects" type="$unknown" dir="in" safearray="yes">
+ <desc>
+ Set of objects to enable metrics for.
+ </desc>
+ </param>
+ <param name="affectedMetrics" type="IPerformanceMetric" dir="return" safearray="yes">
+ <desc>
+ Array of metrics that have been modified by the call to this method.
+ </desc>
+ </param>
+ </method>
+
+ <method name="disableMetrics">
+ <desc>
+ Turns off collecting specified base metrics. Returns an array of
+ <link to="IPerformanceMetric" /> describing the metrics have been
+ affected.
+ <note>
+ @c Null or empty metric name array means all metrics. @c Null or
+ empty object array means all existing objects. If metric name array
+ contains a single element and object array contains many, the single
+ metric name array element is applied to each object array element to
+ form metric/object pairs.
+ </note>
+ </desc>
+ <param name="metricNames" type="wstring" dir="in" safearray="yes">
+ <desc>
+ Metric name filter. Comma-separated list of metrics with wildcard
+ support.
+ </desc>
+ </param>
+ <param name="objects" type="$unknown" dir="in" safearray="yes">
+ <desc>
+ Set of objects to disable metrics for.
+ </desc>
+ </param>
+ <param name="affectedMetrics" type="IPerformanceMetric" dir="return" safearray="yes">
+ <desc>
+ Array of metrics that have been modified by the call to this method.
+ </desc>
+ </param>
+ </method>
+
+ <method name="queryMetricsData">
+ <desc>
+ Queries collected metrics data for a set of objects.
+
+ The data itself and related metric information are returned in seven
+ parallel and one flattened array of arrays. Elements of
+ <tt>returnMetricNames, returnObjects, returnUnits, returnScales,
+ returnSequenceNumbers, returnDataIndices and returnDataLengths</tt> with
+ the same index describe one set of values corresponding to a single
+ metric.
+
+ The <tt>returnData</tt> parameter is a flattened array of arrays. Each
+ start and length of a sub-array is indicated by
+ <tt>returnDataIndices</tt> and <tt>returnDataLengths</tt>. The first
+ value for metric <tt>metricNames[i]</tt> is at
+ <tt>returnData[returnIndices[i]]</tt>.
+
+ <note>
+ @c Null or empty metric name array means all metrics. @c Null or
+ empty object array means all existing objects. If metric name array
+ contains a single element and object array contains many, the single
+ metric name array element is applied to each object array element to
+ form metric/object pairs.
+ </note>
+ <note>
+ Data collection continues behind the scenes after call to
+ @c queryMetricsData. The return data can be seen as the snapshot of
+ the current state at the time of @c queryMetricsData call. The
+ internally kept metric values are not cleared by the call. This
+ allows querying different subsets of metrics or aggregates with
+ subsequent calls. If periodic querying is needed it is highly
+ suggested to query the values with @c interval*count period to avoid
+ confusion. This way a completely new set of data values will be
+ provided by each query.
+ </note>
+ </desc>
+ <param name="metricNames" type="wstring" dir="in" safearray="yes">
+ <desc>
+ Metric name filter. Comma-separated list of metrics with wildcard
+ support.
+ </desc>
+ </param>
+ <param name="objects" type="$unknown" dir="in" safearray="yes">
+ <desc>
+ Set of objects to query metrics for.
+ </desc>
+ </param>
+ <param name="returnMetricNames" type="wstring" dir="out" safearray="yes">
+ <desc>
+ Names of metrics returned in @c returnData.
+ </desc>
+ </param>
+ <param name="returnObjects" type="$unknown" dir="out" safearray="yes">
+ <desc>
+ Objects associated with metrics returned in @c returnData.
+ </desc>
+ </param>
+ <param name="returnUnits" type="wstring" dir="out" safearray="yes">
+ <desc>
+ Units of measurement for each returned metric.
+ </desc>
+ </param>
+ <param name="returnScales" type="unsigned long" dir="out" safearray="yes">
+ <desc>
+ Divisor that should be applied to return values in order to get
+ floating point values. For example:
+ <tt>(double)returnData[returnDataIndices[0]+i] / returnScales[0]</tt>
+ will retrieve the floating point value of i-th sample of the first
+ metric.
+ </desc>
+ </param>
+ <param name="returnSequenceNumbers" type="unsigned long" dir="out" safearray="yes">
+ <desc>
+ Sequence numbers of the first elements of value sequences of
+ particular metrics returned in @c returnData. For aggregate metrics
+ it is the sequence number of the sample the aggregate started
+ calculation from.
+ </desc>
+ </param>
+ <param name="returnDataIndices" type="unsigned long" dir="out" safearray="yes">
+ <desc>
+ Indices of the first elements of value sequences of particular
+ metrics returned in @c returnData.
+ </desc>
+ </param>
+ <param name="returnDataLengths" type="unsigned long" dir="out" safearray="yes">
+ <desc>
+ Lengths of value sequences of particular metrics.
+ </desc>
+ </param>
+ <param name="returnData" type="long" dir="return" safearray="yes">
+ <desc>
+ Flattened array of all metric data containing sequences of values for
+ each metric.
+ </desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <enum
+ name="NATAliasMode"
+ uuid="67772168-50d9-11df-9669-7fb714ee4fa1"
+ >
+ <desc></desc>
+ <const name="AliasLog" value="0x1">
+ <desc></desc>
+ </const>
+ <const name="AliasProxyOnly" value="0x02">
+ <desc></desc>
+ </const>
+ <const name="AliasUseSamePorts" value="0x04">
+ <desc></desc>
+ </const>
+ </enum>
+
+ <enum
+ name="NATProtocol"
+ uuid="e90164be-eb03-11de-94af-fff9b1c1b19f"
+ >
+ <desc>Protocol definitions used with NAT port-forwarding rules.</desc>
+ <const name="UDP" value="0">
+ <desc>Port-forwarding uses UDP protocol.</desc>
+ </const>
+ <const name="TCP" value="1">
+ <desc>Port-forwarding uses TCP protocol.</desc>
+ </const>
+ </enum>
+
+ <interface
+ name="INATEngine" extends="$unknown"
+ uuid="a06253a7-dcd2-44e3-8689-9c9c4b6b6234"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>Interface for managing a NAT engine which is used with a virtual machine. This
+ allows for changing NAT behavior such as port-forwarding rules. This interface is
+ used in the <link to="INetworkAdapter::NATEngine" /> attribute.</desc>
+ <attribute name="network" type="wstring">
+ <desc>The network attribute of the NAT engine (the same value is used with built-in
+ DHCP server to fill corresponding fields of DHCP leases).</desc>
+ </attribute>
+ <attribute name="hostIP" type="wstring">
+ <desc>IP of host interface to bind all opened sockets to.
+ <note>Changing this does not change binding of port forwarding.</note>
+ </desc>
+ </attribute>
+ <attribute name="TFTPPrefix" type="wstring">
+ <desc>TFTP prefix attribute which is used with the built-in DHCP server to fill
+ the corresponding fields of DHCP leases.</desc>
+ </attribute>
+ <attribute name="TFTPBootFile" type="wstring">
+ <desc>TFTP boot file attribute which is used with the built-in DHCP server to fill
+ the corresponding fields of DHCP leases.</desc>
+ </attribute>
+ <attribute name="TFTPNextServer" type="wstring">
+ <desc>TFTP server attribute which is used with the built-in DHCP server to fill
+ the corresponding fields of DHCP leases.
+ <note>The preferred form is IPv4 addresses.</note>
+ </desc>
+ </attribute>
+ <attribute name="aliasMode" type="unsigned long">
+ <desc></desc>
+ </attribute>
+ <attribute name="DNSPassDomain" type="boolean">
+ <desc>Whether the DHCP server should pass the DNS domain used by the host.</desc>
+ </attribute>
+ <attribute name="DNSProxy" type="boolean">
+ <desc>Whether the DHCP server (and the DNS traffic by NAT) should pass the address
+ of the DNS proxy and process traffic using DNS servers registered on the host.</desc>
+ </attribute>
+ <attribute name="DNSUseHostResolver" type="boolean">
+ <desc>Whether the DHCP server (and the DNS traffic by NAT) should pass the address
+ of the DNS proxy and process traffic using the host resolver mechanism.</desc>
+ </attribute>
+ <attribute name="redirects" type="wstring" readonly="yes" safearray="yes">
+ <desc>Array of NAT port-forwarding rules in string representation, in the following
+ format: "name,protocol id,host ip,host port,guest ip,guest port".</desc>
+ </attribute>
+ <attribute name="localhostReachable" type="boolean">
+ <desc>Whether traffic from the guest directed to 10.0.2.2 will reach the
+ host's loopback interface, i.e. localhost or 127.0.0.1.</desc>
+ </attribute>
+ <method name="setNetworkSettings">
+ <desc>Sets network configuration of the NAT engine.</desc>
+ <param name="mtu" type="unsigned long" dir="in">
+ <desc>MTU (maximum transmission unit) of the NAT engine in bytes.</desc>
+ </param>
+ <param name="sockSnd" type="unsigned long" dir="in">
+ <desc>Capacity of the socket send buffer in bytes when creating a new socket.</desc>
+ </param>
+ <param name="sockRcv" type="unsigned long" dir="in">
+ <desc>Capacity of the socket receive buffer in bytes when creating a new socket.</desc>
+ </param>
+ <param name="TcpWndSnd" type="unsigned long" dir="in">
+ <desc>Initial size of the NAT engine's sending TCP window in bytes when
+ establishing a new TCP connection.</desc>
+ </param>
+ <param name="TcpWndRcv" type="unsigned long" dir="in">
+ <desc>Initial size of the NAT engine's receiving TCP window in bytes when
+ establishing a new TCP connection.</desc>
+ </param>
+ </method>
+ <method name="getNetworkSettings">
+ <desc>Returns network configuration of NAT engine. See <link to="#setNetworkSettings" />
+ for parameter descriptions.</desc>
+ <param name="mtu" type="unsigned long" dir="out" />
+ <param name="sockSnd" type="unsigned long" dir="out" />
+ <param name="sockRcv" type="unsigned long" dir="out" />
+ <param name="TcpWndSnd" type="unsigned long" dir="out" />
+ <param name="TcpWndRcv" type="unsigned long" dir="out" />
+ </method>
+ <method name="addRedirect">
+ <desc>Adds a new NAT port-forwarding rule.</desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>The name of the rule. An empty name is acceptable, in which case the NAT engine
+ auto-generates one using the other parameters.</desc>
+ </param>
+ <param name="proto" type="NATProtocol" dir="in">
+ <desc>Protocol handled with the rule.</desc>
+ </param>
+ <param name="hostIP" type="wstring" dir="in">
+ <desc>IP of the host interface to which the rule should apply. An empty ip address is
+ acceptable, in which case the NAT engine binds the handling socket to any interface.</desc>
+ </param>
+ <param name="hostPort" type="unsigned short" dir="in">
+ <desc>The port number to listen on.</desc>
+ </param>
+ <param name="guestIP" type="wstring" dir="in">
+ <desc>The IP address of the guest which the NAT engine will forward matching packets
+ to. An empty IP address is acceptable, in which case the NAT engine will forward
+ packets to the first DHCP lease (x.x.x.15).</desc>
+ </param>
+ <param name="guestPort" type="unsigned short" dir="in">
+ <desc>The port number to forward.</desc>
+ </param>
+ </method>
+ <method name="removeRedirect">
+ <desc>Removes a port-forwarding rule that was previously registered.</desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>The name of the rule to delete.</desc>
+ </param>
+ </method>
+ </interface>
+
+ <!--
+ // IExtPackManager
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IExtPackPlugIn" extends="$unknown"
+ uuid="78861431-d545-44aa-8013-181b8c288554"
+ wsmap="suppress"
+ reservedAttributes="4"
+ >
+ <desc>
+ Interface for keeping information about a plug-in that ships with an
+ extension pack.
+ </desc>
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>The plug-in name.</desc>
+ </attribute>
+ <attribute name="description" type="wstring" readonly="yes">
+ <desc>The plug-in description.</desc>
+ </attribute>
+ <attribute name="frontend" type="wstring" readonly="yes">
+ <desc>
+ The name of the frontend or component name this plug-in plugs into.
+ </desc>
+ </attribute>
+ <attribute name="modulePath" type="wstring" readonly="yes">
+ <desc> The module path. </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IExtPackBase" extends="$unknown"
+ uuid="aa204a12-5b29-45a5-b5d6-c2bafcdb9b0b"
+ wsmap="suppress"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>
+ Interface for querying information about an extension pack as well as
+ accessing COM objects within it.
+ </desc>
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>The extension pack name. This is unique.</desc>
+ </attribute>
+ <attribute name="description" type="wstring" readonly="yes">
+ <desc>The extension pack description.</desc>
+ </attribute>
+ <attribute name="version" type="wstring" readonly="yes">
+ <desc>
+ The extension pack version string. This is restricted to the dotted
+ version number and optionally a build indicator. No tree revision or
+ tag will be included in the string as those things are available as
+ separate properties. An optional publisher tag may be present like for
+ <link to="IVirtualBox::version"/>.
+
+ Examples: "1.2.3", "1.2.3_BETA1" and "1.2.3_RC2".
+ </desc>
+ </attribute>
+ <attribute name="revision" type="unsigned long" readonly="yes">
+ <desc>The extension pack internal revision number.</desc>
+ </attribute>
+ <attribute name="edition" type="wstring" readonly="yes">
+ <desc>
+ Edition indicator. This is usually empty.
+
+ Can for instance be used to help distinguishing between two editions
+ of the same extension pack where only the license, service contract or
+ something differs.
+ </desc>
+ </attribute>
+ <attribute name="VRDEModule" type="wstring" readonly="yes">
+ <desc>The name of the VRDE module if the extension pack sports one.</desc>
+ </attribute>
+ <attribute name="CryptoModule" type="wstring" readonly="yes">
+ <desc>
+ The name of the crypto module if the extension pack sports one.
+ This module is required for full VM encryption.
+ </desc>
+ </attribute>
+ <attribute name="plugIns" type="IExtPackPlugIn" safearray="yes" readonly="yes">
+ <desc>Plug-ins provided by this extension pack.</desc>
+ </attribute>
+ <attribute name="usable" type="boolean" readonly="yes">
+ <desc>
+ Indicates whether the extension pack is usable or not.
+
+ There are a number of reasons why an extension pack might be unusable,
+ typical examples would be broken installation/file or that it is
+ incompatible with the current VirtualBox version.
+ </desc>
+ </attribute>
+ <attribute name="whyUnusable" type="wstring" readonly="yes">
+ <desc>
+ String indicating why the extension pack is not usable. This is an
+ empty string if usable and always a non-empty string if not usable.
+ </desc>
+ </attribute>
+ <attribute name="showLicense" type="boolean" readonly="yes">
+ <desc>Whether to show the license before installation</desc>
+ </attribute>
+ <attribute name="license" type="wstring" readonly="yes">
+ <desc>
+ The default HTML license text for the extension pack. Same as
+ calling <link to="#queryLicense">queryLicense</link> with
+ preferredLocale and preferredLanguage as empty strings and format set
+ to html.
+ </desc>
+ </attribute>
+
+ <method name="queryLicense">
+ <desc>
+ Full feature version of the license attribute.
+ </desc>
+ <param name="preferredLocale" type="wstring" dir="in">
+ <desc>
+ The preferred license locale. Pass an empty string to get the default
+ license.
+ </desc>
+ </param>
+ <param name="preferredLanguage" type="wstring" dir="in">
+ <desc>
+ The preferred license language. Pass an empty string to get the
+ default language for the locale.
+ </desc>
+ </param>
+ <param name="format" type="wstring" dir="in">
+ <desc>
+ The license format: html, rtf or txt. If a license is present there
+ will always be an HTML of it, the rich text format (RTF) and plain
+ text (txt) versions are optional. If
+ </desc>
+ </param>
+ <param name="licenseText" type="wstring" dir="return">
+ <desc>The license text.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <interface
+ name="IExtPack" extends="IExtPackBase"
+ uuid="431685da-3618-4ebc-b038-833ba829b4b2"
+ wsmap="suppress"
+ >
+ <desc>
+ Interface for querying information about an extension pack as well as
+ accessing COM objects within it.
+ </desc>
+ <method name="queryObject">
+ <desc>
+ Queries the IUnknown interface to an object in the extension pack
+ main module. This allows plug-ins and others to talk directly to an
+ extension pack.
+ </desc>
+ <param name="objUuid" type="wstring" dir="in">
+ <desc>The object ID. What exactly this is </desc>
+ </param>
+ <param name="returnInterface" type="$unknown" dir="return">
+ <desc>The queried interface.</desc>
+ </param>
+ </method>
+ </interface>
+
+ <interface
+ name="IExtPackFile" extends="IExtPackBase"
+ uuid="41304f1b-7e72-4f34-b8f6-682785620c57"
+ wsmap="suppress"
+ reservedMethods="2" reservedAttributes="4"
+ >
+ <desc>
+ Extension pack file (aka tarball, .vbox-extpack) representation returned
+ by <link to="IExtPackManager::openExtPackFile"/>. This provides the base
+ extension pack information with the addition of the file name.
+ </desc>
+ <attribute name="filePath" type="wstring" readonly="yes">
+ <desc>
+ The path to the extension pack file.
+ </desc>
+ </attribute>
+
+ <method name="install">
+ <desc>
+ Install the extension pack.
+ </desc>
+ <param name="replace" type="boolean" dir="in">
+ <desc>
+ Set this to automatically uninstall any existing extension pack with
+ the same name as the one being installed.
+ </desc>
+ </param>
+ <param name="displayInfo" type="wstring" dir="in">
+ <desc>
+ Platform specific display information. Reserved for future hacks.
+ </desc>
+ </param>
+ <param name="progess" type="IProgress" dir="return">
+ <desc>
+ Progress object for the operation.
+ </desc>
+ </param>
+ </method>
+ </interface>
+
+ <interface
+ name="IExtPackManager" extends="$unknown"
+ uuid="70401eef-c8e9-466b-9660-45cb3e9979e4"
+ wsmap="suppress"
+ reservedMethods="4" reservedAttributes="8"
+ >
+ <desc>
+ Interface for managing VirtualBox Extension Packs.
+
+ @todo Describe extension packs, how they are managed and how to create one.
+ </desc>
+
+ <attribute name="installedExtPacks" type="IExtPack" safearray="yes" readonly="yes">
+ <desc>
+ List of the installed extension packs.
+ </desc>
+ </attribute>
+
+ <method name="find">
+ <desc>
+ Returns the extension pack with the specified name if found.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ No extension pack matching @a name was found.
+ </result>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>The name of the extension pack to locate.</desc>
+ </param>
+ <param name="returnData" type="IExtPack" dir="return">
+ <desc>The extension pack if found.</desc>
+ </param>
+ </method>
+
+ <method name="openExtPackFile">
+ <desc>
+ Attempts to open an extension pack file in preparation for
+ installation.
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>The path of the extension pack tarball. This can optionally be
+ followed by a "::SHA-256=hex-digit" of the tarball. </desc>
+ </param>
+ <param name="file" type="IExtPackFile" dir="return">
+ <desc>The interface of the extension pack file object.</desc>
+ </param>
+ </method>
+
+ <method name="uninstall">
+ <desc>Uninstalls an extension pack, removing all related files.</desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>The name of the extension pack to uninstall.</desc>
+ </param>
+ <param name="forcedRemoval" type="boolean" dir="in">
+ <desc>
+ Forced removal of the extension pack. This means that the uninstall
+ hook will not be called.
+ </desc>
+ </param>
+ <param name="displayInfo" type="wstring" dir="in">
+ <desc>
+ Platform specific display information. Reserved for future hacks.
+ </desc>
+ </param>
+ <param name="progess" type="IProgress" dir="return">
+ <desc>
+ Progress object for the operation.
+ </desc>
+ </param>
+ </method>
+
+ <method name="cleanup">
+ <desc>Cleans up failed installs and uninstalls</desc>
+ </method>
+
+ <method name="queryAllPlugInsForFrontend">
+ <desc>
+ Gets the path to all the plug-in modules for a given frontend.
+
+ This is a convenience method that is intended to simplify the plug-in
+ loading process for a frontend.
+ </desc>
+ <param name="frontendName" type="wstring" dir="in">
+ <desc>The name of the frontend or component.</desc>
+ </param>
+ <param name="plugInModules" type="wstring" dir="return" safearray="yes">
+ <desc>Array containing the plug-in modules (full paths).</desc>
+ </param>
+ </method>
+
+ <method name="isExtPackUsable">
+ <desc>Check if the given extension pack is loaded and usable.</desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>The name of the extension pack to check for.</desc>
+ </param>
+ <param name="usable" type="boolean" dir="return">
+ <desc>Is the given extension pack loaded and usable.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <!--
+ // BandwidthGroupType
+ /////////////////////////////////////////////////////////////////////////
+ -->
+ <enum
+ name="BandwidthGroupType"
+ uuid="1d92b67d-dc69-4be9-ad4c-93a01e1e0c8e">
+
+ <desc>
+ Type of a bandwidth control group.
+ </desc>
+
+ <const name="Null" value="0">
+ <desc>
+ Null type, must be first.
+ </desc>
+ </const>
+
+ <const name="Disk" value="1">
+ <desc>
+ The bandwidth group controls disk I/O.
+ </desc>
+ </const>
+
+ <const name="Network" value="2">
+ <desc>
+ The bandwidth group controls network I/O.
+ </desc>
+ </const>
+
+ </enum>
+
+ <!--
+ // IBandwidthGroup
+ /////////////////////////////////////////////////////////////////////////
+ -->
+ <interface
+ name="IBandwidthGroup" extends="$unknown"
+ uuid="31587f93-2d12-4d7c-ba6d-ce51d0d5b265"
+ wsmap="managed"
+ rest="managed"
+ reservedAttributes="4"
+ >
+ <desc>Represents one bandwidth group.</desc>
+
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>Name of the group.</desc>
+ </attribute>
+
+ <attribute name="type" type="BandwidthGroupType" readonly="yes">
+ <desc>Type of the group.</desc>
+ </attribute>
+
+ <attribute name="reference" type="unsigned long" readonly="yes">
+ <desc>How many devices/medium attachments use this group.</desc>
+ </attribute>
+
+ <attribute name="maxBytesPerSec" type="long long">
+ <desc>The maximum number of bytes which can be transfered by all
+ entities attached to this group during one second.</desc>
+ </attribute>
+
+ </interface>
+
+ <!--
+ // IBandwidthControl
+ /////////////////////////////////////////////////////////////////////////
+ -->
+ <interface
+ name="IBandwidthControl" extends="$unknown"
+ uuid="48c7f4c0-c9d6-4742-957c-a6fd52e8c4ae"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="2" reservedAttributes="2"
+ >
+ <desc>
+ Controls the bandwidth groups of one machine used to cap I/O done by a VM.
+ This includes network and disk I/O.
+ </desc>
+
+ <attribute name="numGroups" type="unsigned long" readonly="yes">
+ <desc>
+ The current number of existing bandwidth groups managed.
+ </desc>
+ </attribute>
+
+ <method name="createBandwidthGroup">
+ <desc>
+ Creates a new bandwidth group.
+ </desc>
+
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the bandwidth group.</desc>
+ </param>
+ <param name="type" type="BandwidthGroupType" dir="in">
+ <desc>The type of the bandwidth group (network or disk).</desc>
+ </param>
+ <param name="maxBytesPerSec" type="long long" dir="in">
+ <desc>The maximum number of bytes which can be transfered by all
+ entities attached to this group during one second.</desc>
+ </param>
+ </method>
+
+ <method name="deleteBandwidthGroup">
+ <desc>
+ Deletes a new bandwidth group.
+ </desc>
+
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the bandwidth group to delete.</desc>
+ </param>
+ </method>
+
+ <method name="getBandwidthGroup" const="yes">
+ <desc>
+ Get a bandwidth group by name.
+ </desc>
+
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the bandwidth group to get.</desc>
+ </param>
+ <param name="bandwidthGroup" type="IBandwidthGroup" dir="return">
+ <desc>Where to store the bandwidth group on success.</desc>
+ </param>
+ </method>
+
+ <method name="getAllBandwidthGroups" const="yes">
+ <desc>
+ Get all managed bandwidth groups.
+ </desc>
+
+ <param name="bandwidthGroups" type="IBandwidthGroup" dir="return" safearray="yes">
+ <desc>The array of managed bandwidth groups.</desc>
+ </param>
+ </method>
+ </interface>
+
+ <!--
+ // IGuestDebugControl
+ /////////////////////////////////////////////////////////////////////////
+ -->
+ <enum
+ name="GuestDebugProvider"
+ uuid="acdaddc5-aa0f-4f2e-be1f-a9be2828d24a"
+ >
+ <desc>
+ The enabled guest debug provider. This enumeration represents possible
+ values for the <link to="IGuestDebugControl::debugProvider"/> attribute.
+ </desc>
+ <const name="None" value="0">
+ <desc>Guest debugging is disabled.</desc>
+ </const>
+ <const name="Native" value="1">
+ <desc>The native debugger console is enabled.</desc>
+ </const>
+ <const name="GDB" value="2">
+ <desc>The GDB remote stub is enabled.</desc>
+ </const>
+ <const name="KD" value="3">
+ <desc>The WinDbg/KD remote stub is enabled.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="GuestDebugIoProvider"
+ uuid="0cf00b1b-2ff7-414c-81c6-6cf410eaec4a"
+ >
+ <desc>
+ The enabled guest debug I/O provider. This enumeration represents possible
+ values for the <link to="IGuestDebugControl::debugIoProvider"/> attribute.
+ </desc>
+ <const name="None" value="0">
+ <desc>No connection available (only useful with
+ <link to="GuestDebugProvider_None"/>).
+ </desc>
+ </const>
+ <const name="TCP" value="1">
+ <desc>The remote stub is available through a TCP connection.</desc>
+ </const>
+ <const name="UDP" value="2">
+ <desc>The remote stub is available through a UDP connection.</desc>
+ </const>
+ <const name="IPC" value="3">
+ <desc>The remote stub is available through a IPC connection,
+ namely a named pipe on Windows or a unix socket on other hosts.</desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IGuestDebugControl" extends="$unknown"
+ uuid="1474bb3a-f096-4cd7-a857-8d8e3cea7331"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="2" reservedAttributes="2"
+ >
+ <desc>
+ Controls the guest debug settings of one virtual machine.
+ </desc>
+
+ <attribute name="debugProvider" type="GuestDebugProvider">
+ <desc>The currently active debug provider.</desc>
+ </attribute>
+
+ <attribute name="debugIoProvider" type="GuestDebugIoProvider">
+ <desc>The I/O backend for the selected debug provider.</desc>
+ </attribute>
+
+ <attribute name="debugAddress" type="wstring">
+ <desc>
+ The address to connect to or listen on,
+ depending on the type.
+ </desc>
+ </attribute>
+
+ <attribute name="debugPort" type="unsigned long">
+ <desc>
+ The port to listen on or connect to, depending on the selected I/O
+ provider. Might be ignored by some providers.
+ </desc>
+ </attribute>
+ </interface>
+
+ <!--
+ // IVirtualBoxClient
+ /////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IVirtualBoxClient" extends="$unknown"
+ uuid="d2937a8e-cb8d-4382-90ba-b7da78a74573"
+ wsmap="suppress"
+ reservedMethods="4" reservedAttributes="4"
+ >
+ <desc>
+ Convenience interface for client applications. Treat this as a
+ singleton, i.e. never create more than one instance of this interface.
+
+ At the moment only available for clients of the local API (not usable
+ via the webservice). Once the session logic is redesigned this might
+ change.
+
+ Error information handling is a bit special with IVirtualBoxClient:
+ creating an instance will always succeed. The return of the actual error
+ code/information is postponed to any attribute or method call. The
+ reason for this is that COM likes to mutilate the error code and lose
+ the detailed error information returned by instance creation.
+ </desc>
+
+ <attribute name="virtualBox" type="IVirtualBox" readonly="yes">
+ <desc>
+ Reference to the server-side API root object.
+ </desc>
+ </attribute>
+
+ <attribute name="session" type="ISession" readonly="yes">
+ <desc>
+ Create a new session object and return the reference to it.
+ </desc>
+ </attribute>
+
+ <attribute name="eventSource" type="IEventSource" readonly="yes">
+ <desc>
+ Event source for VirtualBoxClient events.
+ </desc>
+ </attribute>
+
+ <method name="checkMachineError">
+ <desc>
+ Perform error checking before using an <link to="IMachine"/> object.
+ Generally useful before starting a VM and all other uses. If anything
+ is not as it should be then this method will return an appropriate
+ error.
+ </desc>
+
+ <param name="machine" type="IMachine" dir="in">
+ <desc>The machine object to check.</desc>
+ </param>
+ </method>
+ </interface>
+
+ <!--
+ // Events
+ /////////////////////////////////////////////////////////////////////////
+ -->
+ <enum
+ name="VBoxEventType"
+ uuid="e4c5252d-7d1a-4051-8cfb-5b2d7a73d992"
+ >
+
+ <desc>
+ Type of an event.
+ See <link to="IEvent" /> for an introduction to VirtualBox event handling.
+ </desc>
+
+ <const name="Invalid" value="0">
+ <desc>
+ Invalid event, must be first.
+ </desc>
+ </const>
+
+ <const name="Any" value="1">
+ <desc>
+ Wildcard for all events.
+ Events of this type are never delivered, and only used in
+ <link to="IEventSource::registerListener"/> call to simplify registration.
+ </desc>
+ </const>
+
+ <const name="Vetoable" value="2">
+ <desc>
+ Wildcard for all vetoable events. Events of this type are never delivered, and only
+ used in <link to="IEventSource::registerListener"/> call to simplify registration.
+ </desc>
+ </const>
+
+ <const name="MachineEvent" value="3">
+ <desc>
+ Wildcard for all machine events. Events of this type are never delivered, and only used in
+ <link to="IEventSource::registerListener"/> call to simplify registration.
+ </desc>
+ </const>
+
+ <const name="SnapshotEvent" value="4">
+ <desc>
+ Wildcard for all snapshot events. Events of this type are never delivered, and only used in
+ <link to="IEventSource::registerListener"/> call to simplify registration.
+ </desc>
+ </const>
+
+ <const name="InputEvent" value="5">
+ <desc>
+ Wildcard for all input device (keyboard, mouse) events.
+ Events of this type are never delivered, and only used in
+ <link to="IEventSource::registerListener"/> call to simplify registration.
+ </desc>
+ </const>
+
+ <const name="LastWildcard" value="31">
+ <desc>
+ Last wildcard.
+ </desc>
+ </const>
+
+ <const name="OnMachineStateChanged" value="32">
+ <desc>
+ See <link to="IMachineStateChangedEvent">IMachineStateChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnMachineDataChanged" value="33">
+ <desc>
+ See <link to="IMachineDataChangedEvent">IMachineDataChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnExtraDataChanged" value="34">
+ <desc>
+ See <link to="IExtraDataChangedEvent">IExtraDataChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnExtraDataCanChange" value="35">
+ <desc>
+ See <link to="IExtraDataCanChangeEvent">IExtraDataCanChangeEvent</link>.
+ </desc>
+ </const>
+ <const name="OnMediumRegistered" value="36">
+ <desc>
+ See <link to="IMediumRegisteredEvent">IMediumRegisteredEvent</link>.
+ </desc>
+ </const>
+ <const name="OnMachineRegistered" value="37">
+ <desc>
+ See <link to="IMachineRegisteredEvent">IMachineRegisteredEvent</link>.
+ </desc>
+ </const>
+ <const name="OnSessionStateChanged" value="38">
+ <desc>
+ See <link to="ISessionStateChangedEvent">ISessionStateChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnSnapshotTaken" value="39">
+ <desc>
+ See <link to="ISnapshotTakenEvent">ISnapshotTakenEvent</link>.
+ </desc>
+ </const>
+ <const name="OnSnapshotDeleted" value="40">
+ <desc>
+ See <link to="ISnapshotDeletedEvent">ISnapshotDeletedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnSnapshotChanged" value="41">
+ <desc>
+ See <link to="ISnapshotChangedEvent">ISnapshotChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestPropertyChanged" value="42">
+ <desc>
+ See <link to="IGuestPropertyChangedEvent">IGuestPropertyChangedEvent</link>.
+ </desc>
+ </const>
+ <!-- Console events -->
+ <const name="OnMousePointerShapeChanged" value="43">
+ <desc>
+ See <link to="IMousePointerShapeChangedEvent">IMousePointerShapeChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnMouseCapabilityChanged" value="44">
+ <desc>
+ See <link to="IMouseCapabilityChangedEvent">IMouseCapabilityChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnKeyboardLedsChanged" value="45">
+ <desc>
+ See <link to="IKeyboardLedsChangedEvent">IKeyboardLedsChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnStateChanged" value="46">
+ <desc>
+ See <link to="IStateChangedEvent">IStateChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnAdditionsStateChanged" value="47">
+ <desc>
+ See <link to="IAdditionsStateChangedEvent">IAdditionsStateChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnNetworkAdapterChanged" value="48">
+ <desc>
+ See <link to="INetworkAdapterChangedEvent">INetworkAdapterChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnSerialPortChanged" value="49">
+ <desc>
+ See <link to="ISerialPortChangedEvent">ISerialPortChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnParallelPortChanged" value="50">
+ <desc>
+ See <link to="IParallelPortChangedEvent">IParallelPortChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnStorageControllerChanged" value="51">
+ <desc>
+ See <link to="IStorageControllerChangedEvent">IStorageControllerChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnMediumChanged" value="52">
+ <desc>
+ See <link to="IMediumChangedEvent">IMediumChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnVRDEServerChanged" value="53">
+ <desc>
+ See <link to="IVRDEServerChangedEvent">IVRDEServerChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnUSBControllerChanged" value="54">
+ <desc>
+ See <link to="IUSBControllerChangedEvent">IUSBControllerChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnUSBDeviceStateChanged" value="55">
+ <desc>
+ See <link to="IUSBDeviceStateChangedEvent">IUSBDeviceStateChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnSharedFolderChanged" value="56">
+ <desc>
+ See <link to="ISharedFolderChangedEvent">ISharedFolderChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnRuntimeError" value="57">
+ <desc>
+ See <link to="IRuntimeErrorEvent">IRuntimeErrorEvent</link>.
+ </desc>
+ </const>
+ <const name="OnCanShowWindow" value="58">
+ <desc>
+ See <link to="ICanShowWindowEvent">ICanShowWindowEvent</link>.
+ </desc>
+ </const>
+ <const name="OnShowWindow" value="59">
+ <desc>
+ See <link to="IShowWindowEvent">IShowWindowEvent</link>.
+ </desc>
+ </const>
+ <const name="OnCPUChanged" value="60">
+ <desc>
+ See <link to="ICPUChangedEvent">ICPUChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnVRDEServerInfoChanged" value="61">
+ <desc>
+ See <link to="IVRDEServerInfoChangedEvent">IVRDEServerInfoChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnEventSourceChanged" value="62">
+ <desc>
+ See <link to="IEventSourceChangedEvent">IEventSourceChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnCPUExecutionCapChanged" value="63">
+ <desc>
+ See <link to="ICPUExecutionCapChangedEvent">ICPUExecutionCapChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestKeyboard" value="64">
+ <desc>
+ See <link to="IGuestKeyboardEvent">IGuestKeyboardEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestMouse" value="65">
+ <desc>
+ See <link to="IGuestMouseEvent">IGuestMouseEvent</link>.
+ </desc>
+ </const>
+ <const name="OnNATRedirect" value="66">
+ <desc>
+ See <link to="INATRedirectEvent">INATRedirectEvent</link>.
+ </desc>
+ </const>
+ <const name="OnHostPCIDevicePlug" value="67">
+ <desc>
+ See <link to="IHostPCIDevicePlugEvent">IHostPCIDevicePlugEvent</link>.
+ </desc>
+ </const>
+ <const name="OnVBoxSVCAvailabilityChanged" value="68">
+ <desc>
+ See <link to="IVBoxSVCAvailabilityChangedEvent">IVBoxSVCAvailablityChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnBandwidthGroupChanged" value="69">
+ <desc>
+ See <link to="IBandwidthGroupChangedEvent">IBandwidthGroupChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestMonitorChanged" value="70">
+ <desc>
+ See <link to="IGuestMonitorChangedEvent">IGuestMonitorChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnStorageDeviceChanged" value="71">
+ <desc>
+ See <link to="IStorageDeviceChangedEvent">IStorageDeviceChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnClipboardModeChanged" value="72">
+ <desc>
+ See <link to="IClipboardModeChangedEvent">IClipboardModeChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnDnDModeChanged" value="73">
+ <desc>
+ See <link to="IDnDModeChangedEvent">IDnDModeChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnNATNetworkChanged" value="74">
+ <desc>
+ See <link to="INATNetworkChangedEvent">INATNetworkChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnNATNetworkStartStop" value="75">
+ <desc>
+ See <link to="INATNetworkStartStopEvent">INATNetworkStartStopEvent</link>.
+ </desc>
+ </const>
+ <const name="OnNATNetworkAlter" value="76">
+ <desc>
+ See <link to="INATNetworkAlterEvent">INATNetworkAlterEvent</link>.
+ </desc>
+ </const>
+ <const name="OnNATNetworkCreationDeletion" value="77">
+ <desc>
+ See <link to="INATNetworkCreationDeletionEvent">INATNetworkCreationDeletionEvent</link>.
+ </desc>
+ </const>
+ <const name="OnNATNetworkSetting" value="78">
+ <desc>
+ See <link to="INATNetworkSettingEvent">INATNetworkSettingEvent</link>.
+ </desc>
+ </const>
+ <const name="OnNATNetworkPortForward" value="79">
+ <desc>
+ See <link to="INATNetworkPortForwardEvent">INATNetworkPortForwardEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestSessionStateChanged" value="80">
+ <desc>
+ See <link to="IGuestSessionStateChangedEvent">IGuestSessionStateChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestSessionRegistered" value="81">
+ <desc>
+ See <link to="IGuestSessionRegisteredEvent">IGuestSessionRegisteredEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestProcessRegistered" value="82">
+ <desc>
+ See <link to="IGuestProcessRegisteredEvent">IGuestProcessRegisteredEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestProcessStateChanged" value="83">
+ <desc>
+ See <link to="IGuestProcessStateChangedEvent">IGuestProcessStateChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestProcessInputNotify" value="84">
+ <desc>
+ See <link to="IGuestProcessInputNotifyEvent">IGuestProcessInputNotifyEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestProcessOutput" value="85">
+ <desc>
+ See <link to="IGuestProcessOutputEvent">IGuestProcessOutputEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestFileRegistered" value="86">
+ <desc>
+ See <link to="IGuestFileRegisteredEvent">IGuestFileRegisteredEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestFileStateChanged" value="87">
+ <desc>
+ See <link to="IGuestFileStateChangedEvent">IGuestFileStateChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestFileOffsetChanged" value="88">
+ <desc>
+ See <link to="IGuestFileOffsetChangedEvent">IGuestFileOffsetChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestFileRead" value="89">
+ <desc>
+ See <link to="IGuestFileReadEvent">IGuestFileReadEvent</link>.
+
+ <note internal="yes">For performance reasons this is a separate event to
+ not unnecessarily overflow the event queue.</note>
+ </desc>
+ </const>
+ <const name="OnGuestFileWrite" value="90">
+ <desc>
+ See <link to="IGuestFileWriteEvent">IGuestFileWriteEvent</link>.
+
+ <note internal="yes">For performance reasons this is a separate event to
+ not unnecessarily overflow the event queue.</note>
+ </desc>
+ </const>
+ <const name="OnRecordingChanged" value="91">
+ <desc>
+ See <link to="IRecordingChangedEvent">IRecordingChangeEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestUserStateChanged" value="92">
+ <desc>
+ See <link to="IGuestUserStateChangedEvent">IGuestUserStateChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestMultiTouch" value="93">
+ <desc>
+ See <link to="IGuestMultiTouchEvent">IGuestMultiTouchEvent</link>.
+ </desc>
+ </const>
+ <const name="OnHostNameResolutionConfigurationChange" value="94">
+ <desc>
+ See <link to="IHostNameResolutionConfigurationChangeEvent">IHostNameResolutionConfigurationChangeEvent</link>.
+ </desc>
+ </const>
+ <const name="OnSnapshotRestored" value="95">
+ <desc>
+ See <link to="ISnapshotRestoredEvent">ISnapshotRestoredEvent</link>.
+ </desc>
+ </const>
+ <const name="OnMediumConfigChanged" value="96">
+ <desc>
+ See <link to="IMediumConfigChangedEvent">IMediumConfigChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnAudioAdapterChanged" value="97">
+ <desc>
+ See <link to="IAudioAdapterChangedEvent">IAudioAdapterChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnProgressPercentageChanged" value="98">
+ <desc>
+ See <link to="IProgressPercentageChangedEvent">IProgressPercentageChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnProgressTaskCompleted" value="99">
+ <desc>
+ See <link to="IProgressTaskCompletedEvent">IProgressTaskCompletedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnCursorPositionChanged" value="100">
+ <desc>
+ See <link to="ICursorPositionChangedEvent">ICursorPositionChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestAdditionsStatusChanged" value="101">
+ <desc>
+ See <link to="IGuestAdditionsStatusChangedEvent">IGuestAdditionsStatusChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestMonitorInfoChanged" value="102">
+ <desc>
+ See <link to="IGuestMonitorInfoChangedEvent">IGuestMonitorInfoChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestFileSizeChanged" value="103">
+ <desc>
+ See <link to="IGuestFileSizeChangedEvent">IGuestFileSizeChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnClipboardFileTransferModeChanged" value="104">
+ <desc>
+ See <link to="IClipboardFileTransferModeChangedEvent">IClipboardFileTransferModeChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnCloudProviderListChanged" value="105">
+ <desc>
+ See <link to="ICloudProviderListChangedEvent"/>.
+ </desc>
+ </const>
+ <const name="OnCloudProviderRegistered" value="106">
+ <desc>
+ See <link to="ICloudProviderRegisteredEvent"/>.
+ </desc>
+ </const>
+ <const name="OnCloudProviderUninstall" value="107">
+ <desc>
+ See <link to="ICloudProviderUninstallEvent"/>.
+ </desc>
+ </const>
+ <const name="OnCloudProfileRegistered" value="108">
+ <desc>
+ See <link to="ICloudProfileRegisteredEvent"/>.
+ </desc>
+ </const>
+ <const name="OnCloudProfileChanged" value="109">
+ <desc>
+ See <link to="ICloudProfileChangedEvent"/>.
+ </desc>
+ </const>
+ <const name="OnProgressCreated" value="110">
+ <desc>
+ See <link to="IProgressCreatedEvent"/>.
+ </desc>
+ </const>
+ <const name="OnLanguageChanged" value="111">
+ <desc>
+ See <link to="ILanguageChangedEvent"/>.
+ </desc>
+ </const>
+ <const name="OnUpdateAgentAvailable" value="112">
+ <desc>
+ See <link to="IUpdateAgentAvailableEvent">IUpdateAgentAvailableEvent</link>.
+ </desc>
+ </const>
+ <const name="OnUpdateAgentError" value="113">
+ <desc>
+ See <link to="IUpdateAgentErrorEvent">IUpdateAgentErrorEvent</link>.
+ </desc>
+ </const>
+ <const name="OnUpdateAgentSettingsChanged" value="114">
+ <desc>
+ See <link to="IUpdateAgentSettingsChangedEvent">IUpdateAgentSettingsChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnUpdateAgentStateChanged" value="115">
+ <desc>
+ See <link to="IUpdateAgentStateChangedEvent">IUpdateAgentStateChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnHostAudioDeviceChanged" value="116">
+ <desc>
+ See <link to="IHostAudioDeviceChangedEvent">IHostAudioDeviceChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnGuestDebugControlChanged" value="117">
+ <desc>
+ See <link to="IGuestDebugControlChangedEvent">IGuestDebugControlChangedEvent</link>.
+ </desc>
+ </const>
+ <const name="OnMachineGroupsChanged" value="118">
+ <desc>
+ See <link to="IMachineGroupsChangedEvent">IMachineGroupsChangedEvent</link>.
+ </desc>
+ </const>
+ <!-- End event marker -->
+ <const name="End" value="119">
+ <desc>
+ Must be last event, used for iterations and structures relying on numerical event values.
+ </desc>
+ </const>
+
+ </enum>
+
+ <interface
+ name="IEventSource" extends="$unknown"
+ uuid="9b6e1aee-35f3-4f4d-b5bb-ed0ecefd8538"
+ wsmap="managed"
+ rest="managed"
+ >
+ <desc>
+ Event source. Generally, any object which could generate events can be an event source,
+ or aggregate one. To simplify using one-way protocols such as webservices running on top of HTTP(S),
+ an event source can work with listeners in either active or passive mode. In active mode it is up to
+ the IEventSource implementation to call <link to="IEventListener::handleEvent" />, in passive mode the
+ event source keeps track of pending events for each listener and returns available events on demand.
+
+ See <link to="IEvent" /> for an introduction to VirtualBox event handling.
+ </desc>
+
+ <method name="createListener">
+ <desc>
+ Creates a new listener object, useful for passive mode.
+ </desc>
+ <param name="listener" type="IEventListener" dir="return"/>
+ </method>
+
+ <method name="createAggregator">
+ <desc>
+ Creates an aggregator event source, collecting events from multiple sources.
+ This way a single listener can listen for events coming from multiple sources,
+ using a single blocking <link to="#getEvent"/> on the returned aggregator.
+ </desc>
+ <param name="subordinates" type="IEventSource" dir="in" safearray="yes">
+ <desc>
+ Subordinate event source this one aggregates.
+ </desc>
+ </param>
+ <param name="result" type="IEventSource" dir="return">
+ <desc>
+ Event source aggregating passed sources.
+ </desc>
+ </param>
+ </method>
+
+ <method name="registerListener">
+ <desc>
+ Register an event listener.
+
+ <note>
+ To avoid system overload, the VirtualBox server process checks if passive event
+ listeners call <link to="IEventSource::getEvent"/> frequently enough. In the
+ current implementation, if more than 500 pending events are detected for a passive
+ event listener, it is forcefully unregistered by the system, and further
+ <link to="#getEvent" /> calls will return @c VBOX_E_OBJECT_NOT_FOUND.
+ </note>
+ </desc>
+ <param name="listener" type="IEventListener" dir="in">
+ <desc>Listener to register.</desc>
+ </param>
+ <param name="interesting" type="VBoxEventType" dir="in" safearray="yes">
+ <desc>
+ Event types listener is interested in. One can use wildcards like -
+ <link to="VBoxEventType_Any"/> to specify wildcards, matching more
+ than one event.
+ </desc>
+ </param>
+ <param name="active" type="boolean" dir="in">
+ <desc>
+ Which mode this listener is operating in.
+ In active mode, <link to="IEventListener::handleEvent" /> is called directly.
+ In passive mode, an internal event queue is created for this this IEventListener.
+ For each event coming in, it is added to queues for all interested registered passive
+ listeners. It is then up to the external code to call the listener's
+ <link to="IEventListener::handleEvent" /> method. When done with an event, the
+ external code must call <link to="#eventProcessed" />.
+ </desc>
+ </param>
+ </method>
+
+ <method name="unregisterListener">
+ <desc>
+ Unregister an event listener. If listener is passive, and some waitable events are still
+ in queue they are marked as processed automatically.
+ </desc>
+ <param name="listener" type="IEventListener" dir="in">
+ <desc>Listener to unregister.</desc>
+ </param>
+ </method>
+
+ <method name="fireEvent">
+ <desc>
+ Fire an event for this source.
+ </desc>
+ <param name="event" type="IEvent" dir="in">
+ <desc>Event to deliver.</desc>
+ </param>
+ <param name="timeout" type="long" dir="in">
+ <desc>
+ Maximum time to wait for event processing (if event is waitable), in ms;
+ 0 = no wait, -1 = indefinite wait.
+ </desc>
+ </param>
+ <param name="result" type="boolean" dir="return">
+ <desc>true if an event was delivered to all targets, or is non-waitable.</desc>
+ </param>
+ </method>
+
+ <method name="getEvent">
+ <desc>
+ Get events from this peer's event queue (for passive mode). Calling this method
+ regularly is required for passive event listeners to avoid system overload;
+ see <link to="IEventSource::registerListener" /> for details.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ Listener is not registered, or autounregistered.
+ </result>
+ </desc>
+ <param name="listener" type="IEventListener" dir="in">
+ <desc>Which listener to get data for.</desc>
+ </param>
+ <param name="timeout" type="long" dir="in">
+ <desc>
+ Maximum time to wait for events, in ms;
+ 0 = no wait, -1 = indefinite wait.
+ </desc>
+ </param>
+ <param name="event" type="IEvent" dir="return">
+ <desc>Event retrieved, or null if none available.</desc>
+ </param>
+ </method>
+
+ <method name="eventProcessed">
+ <desc>
+ Must be called for waitable events after a particular listener finished its
+ event processing. When all listeners of a particular event have called this
+ method, the system will then call <link to="IEvent::setProcessed" />.
+ </desc>
+ <param name="listener" type="IEventListener" dir="in">
+ <desc>Which listener processed event.</desc>
+ </param>
+ <param name="event" type="IEvent" dir="in">
+ <desc>Which event.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <interface
+ name="IEventListener" extends="$unknown"
+ uuid="67099191-32e7-4f6c-85ee-422304c71b90"
+ wsmap="managed"
+ rest="managed"
+ >
+ <desc>
+ Event listener. An event listener can work in either active or passive mode, depending on the way
+ it was registered.
+ See <link to="IEvent" /> for an introduction to VirtualBox event handling.
+ </desc>
+
+ <method name="handleEvent">
+ <desc>
+ Handle event callback for active listeners. It is not called for
+ passive listeners. After calling <link to="#handleEvent"/> on all active listeners
+ and having received acknowledgement from all passive listeners via
+ <link to="IEventSource::eventProcessed"/>, the event is marked as
+ processed and <link to="IEvent::waitProcessed"/> will return
+ immediately.
+ </desc>
+ <param name="event" type="IEvent" dir="in">
+ <desc>Event available.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <interface
+ name="IEvent" extends="$unknown"
+ uuid="0ca2adba-8f30-401b-a8cd-fe31dbe839c0"
+ wsmap="managed"
+ rest="managed"
+ >
+ <desc>
+ Abstract parent interface for VirtualBox events. Actual events will typically implement
+ a more specific interface which derives from this (see below).
+
+ <b>Introduction to VirtualBox events</b>
+
+ Generally speaking, an event (represented by this interface) signals that something
+ happened, while an event listener (see <link to="IEventListener" />) represents an
+ entity that is interested in certain events. In order for this to work with
+ unidirectional protocols (i.e. web services), the concepts of passive and active
+ listener are used.
+
+ Event consumers can register themselves as listeners, providing an array of
+ events they are interested in (see <link to="IEventSource::registerListener" />).
+ When an event triggers, the listener is notified about the event. The exact
+ mechanism of the notification depends on whether the listener was registered as
+ an active or passive listener:
+
+ <ul>
+ <li>An active listener is very similar to a callback: it is a function invoked
+ by the API. As opposed to the callbacks that were used in the API before
+ VirtualBox 4.0 however, events are now objects with an interface hierarchy.
+ </li>
+
+ <li>Passive listeners are somewhat trickier to implement, but do not require
+ a client function to be callable, which is not an option with scripting
+ languages or web service clients. Internally the <link to="IEventSource" />
+ implementation maintains an event queue for each passive listener, and
+ newly arrived events are put in this queue. When the listener calls
+ <link to="IEventSource::getEvent"/>, first element from its internal event
+ queue is returned. When the client completes processing of an event,
+ the <link to="IEventSource::eventProcessed" /> function must be called,
+ acknowledging that the event was processed. It supports implementing
+ waitable events. On passive listener unregistration, all events from its
+ queue are auto-acknowledged.
+ </li>
+ </ul>
+
+ Waitable events are useful in situations where the event generator wants to track
+ delivery or a party wants to wait until all listeners have completed the event. A
+ typical example would be a vetoable event (see <link to="IVetoEvent" />) where a
+ listeners might veto a certain action, and thus the event producer has to make
+ sure that all listeners have processed the event and not vetoed before taking
+ the action.
+
+ A given event may have both passive and active listeners at the same time.
+
+ <b>Using events</b>
+
+ Any VirtualBox object capable of producing externally visible events provides an
+ @c eventSource read-only attribute, which is of the type <link to="IEventSource" />.
+ This event source object is notified by VirtualBox once something has happened, so
+ consumers may register event listeners with this event source. To register a listener,
+ an object implementing the <link to="IEventListener" /> interface must be provided.
+ For active listeners, such an object is typically created by the consumer, while for
+ passive listeners <link to="IEventSource::createListener" /> should be used. Please
+ note that a listener created with <link to="IEventSource::createListener"/> must not be used as an active listener.
+
+ Once created, the listener must be registered to listen for the desired events
+ (see <link to="IEventSource::registerListener" />), providing an array of
+ <link to="VBoxEventType" /> enums. Those elements can either be the individual
+ event IDs or wildcards matching multiple event IDs.
+
+ After registration, the callback's <link to="IEventListener::handleEvent" /> method is
+ called automatically when the event is triggered, while passive listeners have to call
+ <link to="IEventSource::getEvent" /> and <link to="IEventSource::eventProcessed" /> in
+ an event processing loop.
+
+ The IEvent interface is an abstract parent interface for all such VirtualBox events
+ coming in. As a result, the standard use pattern inside <link to="IEventListener::handleEvent" />
+ or the event processing loop is to check the <link to="#type" /> attribute of the event and
+ then cast to the appropriate specific interface using @c QueryInterface().
+ </desc>
+
+ <attribute name="type" readonly="yes" type="VBoxEventType">
+ <desc>
+ Event type.
+ </desc>
+ </attribute>
+
+ <attribute name="source" readonly="yes" type="IEventSource">
+ <desc>
+ Source of this event.
+ </desc>
+ </attribute>
+
+ <attribute name="waitable" readonly="yes" type="boolean">
+ <desc>
+ If we can wait for this event being processed. If false, <link to="#waitProcessed"/> returns immediately,
+ and <link to="#setProcessed"/> doesn't make sense. Non-waitable events are generally better performing,
+ as no additional overhead associated with waitability imposed.
+ Waitable events are needed when one need to be able to wait for particular event processed,
+ for example for vetoable changes, or if event refers to some resource which need to be kept immutable
+ until all consumers confirmed events.
+ </desc>
+ </attribute>
+
+ <method name="setProcessed">
+ <desc>
+ Internal method called by the system when all listeners of a particular event have called
+ <link to="IEventSource::eventProcessed" />. This should not be called by client code.
+ </desc>
+ </method>
+
+ <method name="waitProcessed">
+ <desc>
+ Wait until time outs, or this event is processed. Event must be waitable for this operation to have
+ described semantics, for non-waitable returns true immediately.
+ </desc>
+ <param name="timeout" type="long" dir="in">
+ <desc>
+ Maximum time to wait for event processing, in ms;
+ 0 = no wait, -1 = indefinite wait.
+ </desc>
+ </param>
+ <param name="result" type="boolean" dir="return">
+ <desc>If this event was processed before timeout.</desc>
+ </param>
+ </method>
+ </interface>
+
+
+ <interface
+ name="IReusableEvent" extends="IEvent"
+ uuid="69bfb134-80f6-4266-8e20-16371f68fa25"
+ wsmap="managed"
+ >
+ <desc>Base abstract interface for all reusable events.</desc>
+
+ <attribute name="generation" readonly="yes" type="unsigned long">
+ <desc>Current generation of event, incremented on reuse.</desc>
+ </attribute>
+
+ <method name="reuse">
+ <desc>
+ Marks an event as reused, increments 'generation', fields shall no
+ longer be considered valid.
+ </desc>
+ </method>
+ </interface>
+
+ <interface
+ name="IMachineEvent" extends="IEvent"
+ uuid="92ed7b1a-0d96-40ed-ae46-a564d484325e"
+ wsmap="managed" id="MachineEvent"
+ >
+ <desc>Base abstract interface for all machine events.</desc>
+
+ <attribute name="machineId" readonly="yes" type="uuid" mod="string">
+ <desc>ID of the machine this event relates to.</desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IMachineStateChangedEvent" extends="IMachineEvent"
+ uuid="5748F794-48DF-438D-85EB-98FFD70D18C9"
+ wsmap="managed" autogen="VBoxEvent" id="OnMachineStateChanged"
+ >
+ <desc>Machine state change event.</desc>
+
+ <attribute name="state" readonly="yes" type="MachineState">
+ <desc>New execution state.</desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IMachineDataChangedEvent" extends="IMachineEvent"
+ uuid="abe94809-2e88-4436-83d7-50f3e64d0503"
+ wsmap="managed" autogen="VBoxEvent" id="OnMachineDataChanged"
+ >
+ <desc>
+ Any of the settings of the given machine has changed.
+ </desc>
+
+ <attribute name="temporary" readonly="yes" type="boolean">
+ <desc>@c true if the settings change is temporary. All permanent
+ settings changes will trigger an event, and only temporary settings
+ changes for running VMs will trigger an event. Note: sending events
+ for temporary changes is NOT IMPLEMENTED.</desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IMediumRegisteredEvent" extends="IEvent"
+ uuid="53fac49a-b7f1-4a5a-a4ef-a11dd9c2a458"
+ wsmap="managed" autogen="VBoxEvent" id="OnMediumRegistered"
+ >
+ <desc>
+ The given medium was registered or unregistered
+ within this VirtualBox installation.
+ </desc>
+
+ <attribute name="mediumId" readonly="yes" type="uuid" mod="string">
+ <desc>ID of the medium this event relates to.</desc>
+ </attribute>
+
+ <attribute name="mediumType" readonly="yes" type="DeviceType">
+ <desc>Type of the medium this event relates to.</desc>
+ </attribute>
+
+ <attribute name="registered" type="boolean" readonly="yes">
+ <desc>
+ If @c true, the medium was registered, otherwise it was
+ unregistered.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IMediumConfigChangedEvent" extends="IEvent"
+ uuid="dd3e2654-a161-41f1-b583-4892f4a9d5d5"
+ wsmap="managed" autogen="VBoxEvent" id="OnMediumConfigChanged"
+ >
+ <desc>
+ The configuration of the given medium was changed (location, properties,
+ child/parent or anything else).
+ </desc>
+
+ <attribute name="medium" type="IMedium" readonly="yes">
+ <desc>ID of the medium this event relates to.</desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IMachineRegisteredEvent" extends="IMachineEvent"
+ uuid="c354a762-3ff2-4f2e-8f09-07382ee25088"
+ wsmap="managed" autogen="VBoxEvent" id="OnMachineRegistered"
+ >
+ <desc>
+ The given machine was registered or unregistered
+ within this VirtualBox installation.
+ </desc>
+
+ <attribute name="registered" type="boolean" readonly="yes">
+ <desc>
+ If @c true, the machine was registered, otherwise it was
+ unregistered.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="ISessionStateChangedEvent" extends="IMachineEvent"
+ uuid="714a3eef-799a-4489-86cd-fe8e45b2ff8e"
+ wsmap="managed" autogen="VBoxEvent" id="OnSessionStateChanged"
+ >
+ <desc>
+ The state of the session for the given machine was changed.
+ <see><link to="IMachine::sessionState"/></see>
+ </desc>
+
+ <attribute name="state" type="SessionState" readonly="yes">
+ <desc>
+ New session state.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IGuestPropertyChangedEvent" extends="IMachineEvent"
+ uuid="2d0f4c6f-a77e-45c5-96d2-7ca7daae63a9"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestPropertyChanged"
+ >
+ <desc>
+ Notification when a guest property has changed.
+ </desc>
+
+ <attribute name="name" readonly="yes" type="wstring">
+ <desc>
+ The name of the property that has changed.
+ </desc>
+ </attribute>
+
+ <attribute name="value" readonly="yes" type="wstring">
+ <desc>
+ The new property value.
+ </desc>
+ </attribute>
+
+ <attribute name="flags" readonly="yes" type="wstring">
+ <desc>
+ The new property flags.
+ </desc>
+ </attribute>
+
+ <attribute name="fWasDeleted" readonly="yes" type="boolean">
+ <desc>
+ A flag which indicates that property was deleted.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="ISnapshotEvent" extends="IMachineEvent"
+ uuid="21637b0e-34b8-42d3-acfb-7e96daf77c22"
+ wsmap="managed" id="SnapshotEvent"
+ >
+ <desc>Base interface for all snapshot events.</desc>
+
+ <attribute name="snapshotId" readonly="yes" type="uuid" mod="string">
+ <desc>ID of the snapshot this event relates to.</desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="ISnapshotTakenEvent" extends="ISnapshotEvent"
+ uuid="d27c0b3d-6038-422c-b45e-6d4a0503d9f1"
+ wsmap="managed" autogen="VBoxEvent" id="OnSnapshotTaken"
+ >
+ <desc>
+ A new snapshot of the machine has been taken.
+ <see><link to="ISnapshot"/></see>
+ </desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="ISnapshotDeletedEvent" extends="ISnapshotEvent"
+ uuid="c48f3401-4a9e-43f4-b7a7-54bd285e22f4"
+ wsmap="managed" autogen="VBoxEvent" id="OnSnapshotDeleted"
+ >
+ <desc>
+ Snapshot of the given machine has been deleted.
+
+ <note>
+ This notification is delivered <b>after</b> the snapshot
+ object has been uninitialized on the server (so that any
+ attempt to call its methods will return an error).
+ </note>
+
+ <see><link to="ISnapshot"/></see>
+ </desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="ISnapshotRestoredEvent" extends="ISnapshotEvent"
+ uuid="f4d803b4-9b2d-4377-bfe6-9702e881516b"
+ wsmap="managed" autogen="VBoxEvent" id="OnSnapshotRestored"
+ >
+ <desc>
+ Snapshot of the given machine has been restored.
+ <see><link to="ISnapshot"/></see>
+ </desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="ISnapshotChangedEvent" extends="ISnapshotEvent"
+ uuid="07541941-8079-447a-a33e-47a69c7980db"
+ wsmap="managed" autogen="VBoxEvent" id="OnSnapshotChanged"
+ >
+ <desc>
+ Snapshot properties (name and/or description) have been changed.
+ <see><link to="ISnapshot"/></see>
+ </desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="IMousePointerShapeChangedEvent" extends="IEvent"
+ uuid="a6dcf6e8-416b-4181-8c4a-45ec95177aef"
+ wsmap="managed" autogen="VBoxEvent" id="OnMousePointerShapeChanged"
+ >
+ <desc>
+ Notification when the guest mouse pointer shape has
+ changed. The new shape data is given.
+ </desc>
+
+ <attribute name="visible" type="boolean" readonly="yes">
+ <desc>
+ Flag whether the pointer is visible.
+ </desc>
+ </attribute>
+ <attribute name="alpha" type="boolean" readonly="yes">
+ <desc>
+ Flag whether the pointer has an alpha channel.
+ </desc>
+ </attribute>
+ <attribute name="xhot" type="unsigned long" readonly="yes">
+ <desc>
+ The pointer hot spot X coordinate.
+ </desc>
+ </attribute>
+ <attribute name="yhot" type="unsigned long" readonly="yes">
+ <desc>
+ The pointer hot spot Y coordinate.
+ </desc>
+ </attribute>
+ <attribute name="width" type="unsigned long" readonly="yes">
+ <desc>
+ Width of the pointer shape in pixels.
+ </desc>
+ </attribute>
+ <attribute name="height" type="unsigned long" readonly="yes">
+ <desc>
+ Height of the pointer shape in pixels.
+ </desc>
+ </attribute>
+ <attribute name="shape" type="octet" safearray="yes" readonly="yes">
+ <desc>
+ Shape buffer arrays.
+
+ The @a shape buffer contains a 1-bpp (bits per pixel) AND mask
+ followed by a 32-bpp XOR (color) mask.
+
+ For pointers without alpha channel the XOR mask pixels are
+ 32-bit values: (lsb)BGR0(msb). For pointers with alpha channel
+ the XOR mask consists of (lsb)BGRA(msb) 32-bit values.
+
+ An AND mask is used for pointers with alpha channel, so if the
+ callback does not support alpha, the pointer could be
+ displayed as a normal color pointer.
+
+ The AND mask is a 1-bpp bitmap with byte aligned scanlines. The
+ size of the AND mask therefore is <tt>cbAnd = (width + 7) / 8 *
+ height</tt>. The padding bits at the end of each scanline are
+ undefined.
+
+ The XOR mask follows the AND mask on the next 4-byte aligned
+ offset: <tt>uint8_t *pXor = pAnd + (cbAnd + 3) &amp; ~3</tt>.
+ Bytes in the gap between the AND and the XOR mask are undefined.
+ The XOR mask scanlines have no gap between them and the size of
+ the XOR mask is: <tt>cXor = width * 4 * height</tt>.
+
+ <note>
+ If @a shape is 0, only the pointer visibility is changed.
+ </note>
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IMouseCapabilityChangedEvent" extends="IEvent"
+ uuid="4a773393-7a8c-4d57-b228-9ade4049a81f"
+ wsmap="managed" autogen="VBoxEvent" id="OnMouseCapabilityChanged"
+ >
+ <desc>
+ Notification when the mouse capabilities reported by the
+ guest have changed. The new capabilities are passed.
+ </desc>
+ <attribute name="supportsAbsolute" type="boolean" readonly="yes">
+ <desc>
+ Supports absolute coordinates.
+ </desc>
+ </attribute>
+ <attribute name="supportsRelative" type="boolean" readonly="yes">
+ <desc>
+ Supports relative coordinates.
+ </desc>
+ </attribute>
+ <attribute name="supportsTouchScreen" type="boolean" readonly="yes">
+ <desc>
+ Supports multi-touch events, touchscreen variant.
+ </desc>
+ </attribute>
+ <attribute name="supportsTouchPad" type="boolean" readonly="yes">
+ <desc>
+ Supports multi-touch events, touchpad variant.
+ </desc>
+ </attribute>
+ <attribute name="needsHostCursor" type="boolean" readonly="yes">
+ <desc>
+ If host cursor is needed.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IKeyboardLedsChangedEvent" extends="IEvent"
+ uuid="6DDEF35E-4737-457B-99FC-BC52C851A44F"
+ wsmap="managed" autogen="VBoxEvent" id="OnKeyboardLedsChanged"
+ >
+ <desc>
+ Notification when the guest OS executes the KBD_CMD_SET_LEDS command
+ to alter the state of the keyboard LEDs.
+ </desc>
+ <attribute name="numLock" type="boolean" readonly="yes">
+ <desc>
+ NumLock status.
+ </desc>
+ </attribute>
+ <attribute name="capsLock" type="boolean" readonly="yes">
+ <desc>
+ CapsLock status.
+ </desc>
+ </attribute>
+ <attribute name="scrollLock" type="boolean" readonly="yes">
+ <desc>
+ ScrollLock status.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IStateChangedEvent" extends="IEvent"
+ uuid="4376693C-CF37-453B-9289-3B0F521CAF27"
+ wsmap="managed" autogen="VBoxEvent" id="OnStateChanged"
+ >
+ <desc>
+ Notification when the execution state of the machine has changed.
+ The new state is given.
+ </desc>
+ <attribute name="state" type="MachineState" readonly="yes">
+ <desc>
+ New machine state.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IAdditionsStateChangedEvent" extends="IEvent"
+ uuid="D70F7915-DA7C-44C8-A7AC-9F173490446A"
+ wsmap="managed" autogen="VBoxEvent" id="OnAdditionsStateChanged"
+ >
+ <desc>
+ Notification when a Guest Additions property changes.
+ Interested callees should query IGuest attributes to
+ find out what has changed.
+ </desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="INetworkAdapterChangedEvent" extends="IEvent"
+ uuid="08889892-1EC6-4883-801D-77F56CFD0103"
+ wsmap="managed" autogen="VBoxEvent" id="OnNetworkAdapterChanged"
+ >
+ <desc>
+ Notification when a property of one of the
+ virtual <link to="IMachine::getNetworkAdapter">network adapters</link>
+ changes. Interested callees should use INetworkAdapter methods and
+ attributes to find out what has changed.
+ </desc>
+ <attribute name="networkAdapter" type="INetworkAdapter" readonly="yes">
+ <desc>
+ Network adapter that is subject to change.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IAudioAdapterChangedEvent" extends="IEvent"
+ uuid="D5ABC823-04D0-4DB6-8D66-DC2F033120E1"
+ wsmap="managed" autogen="VBoxEvent" id="OnAudioAdapterChanged"
+ >
+ <desc>
+ Notification when a property of the audio adapter changes.
+ Interested callees should use IAudioAdapter methods and attributes
+ to find out what has changed.
+ </desc>
+ <attribute name="audioAdapter" type="IAudioAdapter" readonly="yes">
+ <desc>
+ Audio adapter that is subject to change.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="ISerialPortChangedEvent" extends="IEvent"
+ uuid="3BA329DC-659C-488B-835C-4ECA7AE71C6C"
+ wsmap="managed" autogen="VBoxEvent" id="OnSerialPortChanged"
+ >
+ <desc>
+ Notification when a property of one of the
+ virtual <link to="IMachine::getSerialPort">serial ports</link> changes.
+ Interested callees should use ISerialPort methods and attributes
+ to find out what has changed.
+ </desc>
+ <attribute name="serialPort" type="ISerialPort" readonly="yes">
+ <desc>
+ Serial port that is subject to change.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IParallelPortChangedEvent" extends="IEvent"
+ uuid="813C99FC-9849-4F47-813E-24A75DC85615"
+ wsmap="managed" autogen="VBoxEvent" id="OnParallelPortChanged"
+ >
+ <desc>
+ Notification when a property of one of the
+ virtual <link to="IMachine::getParallelPort">parallel ports</link>
+ changes. Interested callees should use ISerialPort methods and
+ attributes to find out what has changed.
+ </desc>
+ <attribute name="parallelPort" type="IParallelPort" readonly="yes">
+ <desc>
+ Parallel port that is subject to change.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IStorageControllerChangedEvent" extends="IEvent"
+ uuid="6BB335CC-1C58-440C-BB7B-3A1397284C7B"
+ wsmap="managed" autogen="VBoxEvent" id="OnStorageControllerChanged"
+ >
+ <desc>
+ Notification when a
+ <link to="IMachine::storageControllers">storage controllers</link>
+ changes.
+ </desc>
+ <attribute name="machinId" type="uuid" mod="string" readonly="yes">
+ <desc>
+ The id of the machine containing the storage controller.
+ </desc>
+ </attribute>
+ <attribute name="controllerName" type="wstring" readonly="yes">
+ <desc>
+ The name of the storage controller.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IMediumChangedEvent" extends="IEvent"
+ uuid="0FE2DA40-5637-472A-9736-72019EABD7DE"
+ wsmap="managed" autogen="VBoxEvent" id="OnMediumChanged"
+ >
+ <desc>
+ Notification when a
+ <link to="IMachine::mediumAttachments">medium attachment</link>
+ changes.
+ </desc>
+ <attribute name="mediumAttachment" type="IMediumAttachment" readonly="yes">
+ <desc>
+ Medium attachment that is subject to change.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IClipboardModeChangedEvent" extends="IEvent"
+ uuid="cac21692-7997-4595-a731-3a509db604e5"
+ wsmap="managed" autogen="VBoxEvent" id="OnClipboardModeChanged"
+ >
+ <desc>
+ Notification when the shared clipboard mode changes.
+ </desc>
+ <attribute name="clipboardMode" type="ClipboardMode" readonly="yes">
+ <desc>
+ The new clipboard mode.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IClipboardFileTransferModeChangedEvent" extends="IEvent"
+ uuid="00391758-00B1-4E9D-0000-11FA00F9D583"
+ wsmap="managed" autogen="VBoxEvent" id="OnClipboardFileTransferModeChanged"
+ >
+ <desc>
+ Notification when the shared clipboard file transfer mode changes.
+ </desc>
+ <attribute name="enabled" type="boolean" readonly="yes">
+ <desc>
+ Whether file transfers are allowed or not.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IDnDModeChangedEvent" extends="IEvent"
+ uuid="b55cf856-1f8b-4692-abb4-462429fae5e9"
+ wsmap="managed" autogen="VBoxEvent" id="OnDnDModeChanged"
+ >
+ <desc>
+ Notification when the drag'n drop mode changes.
+ </desc>
+ <attribute name="dndMode" type="DnDMode" readonly="yes">
+ <desc>
+ The new drag'n drop mode.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="ICPUChangedEvent" extends="IEvent"
+ uuid="4da2dec7-71b2-4817-9a64-4ed12c17388e"
+ wsmap="managed" autogen="VBoxEvent" id="OnCPUChanged"
+ >
+ <desc>
+ Notification when a CPU changes.
+ </desc>
+ <attribute name="CPU" type="unsigned long" readonly="yes">
+ <desc>
+ The CPU which changed.
+ </desc>
+ </attribute>
+ <attribute name="add" type="boolean" readonly="yes">
+ <desc>
+ Flag whether the CPU was added or removed.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="ICPUExecutionCapChangedEvent" extends="IEvent"
+ uuid="dfa7e4f5-b4a4-44ce-85a8-127ac5eb59dc"
+ wsmap="managed" autogen="VBoxEvent" id="OnCPUExecutionCapChanged"
+ >
+ <desc>
+ Notification when the CPU execution cap changes.
+ </desc>
+ <attribute name="executionCap" type="unsigned long" readonly="yes">
+ <desc>
+ The new CPU execution cap value. (1-100)
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IGuestKeyboardEvent" extends="IEvent"
+ uuid="88394258-7006-40d4-b339-472ee3801844"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestKeyboard"
+ >
+ <desc>
+ Notification when guest keyboard event happens.
+ </desc>
+ <attribute name="scancodes" type="long" safearray="yes" readonly="yes">
+ <desc>
+ Array of scancodes.
+ </desc>
+ </attribute>
+ </interface>
+
+ <enum
+ name="GuestMouseEventMode"
+ uuid="4b500146-ebba-4b7c-bc29-69c2d57a5caf"
+ >
+
+ <desc>
+ The mode (relative, absolute, multi-touch) of a pointer event.
+
+ @todo A clear pattern seems to be emerging that we should usually have
+ multiple input devices active for different types of reporting, so we
+ should really have different event types for relative (including wheel),
+ absolute (not including wheel) and multi-touch events.
+ </desc>
+
+ <const name="Relative" value="0">
+ <desc>
+ Relative event.
+ </desc>
+ </const>
+
+ <const name="Absolute" value="1">
+ <desc>
+ Absolute event.
+ </desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IGuestMouseEvent" extends="IReusableEvent"
+ uuid="179f8647-319c-4e7e-8150-c5837bd265f6"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestMouse"
+ >
+ <desc>
+ Notification when guest mouse event happens.
+ </desc>
+
+ <attribute name="mode" type="GuestMouseEventMode" readonly="yes">
+ <desc>
+ If this event is relative, absolute or multi-touch.
+ </desc>
+ </attribute>
+
+ <attribute name="x" type="long" readonly="yes">
+ <desc>
+ New X position, or X delta.
+ </desc>
+ </attribute>
+
+ <attribute name="y" type="long" readonly="yes">
+ <desc>
+ New Y position, or Y delta.
+ </desc>
+ </attribute>
+
+ <attribute name="z" type="long" readonly="yes">
+ <desc>
+ Z delta.
+ </desc>
+ </attribute>
+
+ <attribute name="w" type="long" readonly="yes">
+ <desc>
+ W delta.
+ </desc>
+ </attribute>
+
+ <attribute name="buttons" type="long" readonly="yes">
+ <desc>
+ Button state bitmask.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IGuestMultiTouchEvent" extends="IEvent"
+ uuid="1f99d9dc-c144-4c28-9f88-e6f488db5441"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestMultiTouch"
+ >
+ <desc>
+ Notification when guest touch screen event happens.
+ </desc>
+ <attribute name="contactCount" type="long" readonly="yes">
+ <desc>
+ Number of contacts in the event.
+ </desc>
+ </attribute>
+ <attribute name="xPositions" type="short" safearray="yes" readonly="yes">
+ <desc>
+ X positions.
+ </desc>
+ </attribute>
+ <attribute name="yPositions" type="short" safearray="yes" readonly="yes">
+ <desc>
+ Y positions.
+ </desc>
+ </attribute>
+ <attribute name="contactIds" type="unsigned short" safearray="yes" readonly="yes">
+ <desc>
+ Contact identifiers.
+ </desc>
+ </attribute>
+ <attribute name="contactFlags" type="unsigned short" safearray="yes" readonly="yes">
+ <desc>
+ Contact state.
+ Bit 0: in contact.
+ Bit 1: in range.
+ </desc>
+ </attribute>
+ <attribute name="isTouchScreen" type="boolean" readonly="yes">
+ <desc>
+ Distinguishes between touchscreen and touchpad events.
+ </desc>
+ </attribute>
+ <attribute name="scanTime" type="unsigned long" readonly="yes">
+ <desc>
+ Timestamp of the event in milliseconds. Only relative time between events is important.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IGuestSessionEvent" extends="IEvent"
+ uuid="b9acd33f-647d-45ac-8fe9-f49b3183ba37"
+ wsmap="managed"
+ >
+ <desc>Base abstract interface for all guest session events.</desc>
+
+ <attribute name="session" type="IGuestSession" readonly="yes">
+ <desc>Guest session that is subject to change.</desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IGuestSessionStateChangedEvent" extends="IGuestSessionEvent"
+ uuid="327e3c00-ee61-462f-aed3-0dff6cbf9904"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestSessionStateChanged"
+ >
+ <desc>
+ Notification when a guest session changed its state.
+ </desc>
+
+ <attribute name="id" type="unsigned long" readonly="yes">
+ <desc>
+ Session ID of guest session which was changed.
+ </desc>
+ </attribute>
+ <attribute name="status" type="GuestSessionStatus" readonly="yes">
+ <desc>
+ New session status.
+ </desc>
+ </attribute>
+ <attribute name="error" type="IVirtualBoxErrorInfo" readonly="yes">
+ <desc>
+ Error information in case of new session status is indicating an error.
+
+ The attribute <link to="IVirtualBoxErrorInfo::resultDetail"/> will contain
+ the runtime (IPRT) error code from the guest. See include/iprt/err.h and
+ include/VBox/err.h for details.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IGuestSessionRegisteredEvent" extends="IGuestSessionEvent"
+ uuid="b79de686-eabd-4fa6-960a-f1756c99ea1c"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestSessionRegistered"
+ >
+ <desc>
+ Notification when a guest session was registered or unregistered.
+ </desc>
+
+ <attribute name="registered" type="boolean" readonly="yes">
+ <desc>
+ If @c true, the guest session was registered, otherwise it was
+ unregistered.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IGuestProcessEvent" extends="IGuestSessionEvent"
+ uuid="2405f0e5-6588-40a3-9b0a-68c05ba52c4b"
+ wsmap="managed"
+ >
+ <desc>Base abstract interface for all guest process events.</desc>
+
+ <attribute name="process" type="IGuestProcess" readonly="yes">
+ <desc>
+ Guest process object which is related to this event.
+ </desc>
+ </attribute>
+ <attribute name="pid" type="unsigned long" readonly="yes">
+ <desc>
+ Guest process ID (PID).
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IGuestProcessRegisteredEvent" extends="IGuestProcessEvent"
+ uuid="1d89e2b3-c6ea-45b6-9d43-dc6f70cc9f02"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestProcessRegistered"
+ >
+ <desc>
+ Notification when a guest process was registered or unregistered.
+ </desc>
+
+ <attribute name="registered" type="boolean" readonly="yes">
+ <desc>
+ If @c true, the guest process was registered, otherwise it was
+ unregistered.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IGuestProcessStateChangedEvent" extends="IGuestProcessEvent"
+ uuid="c365fb7b-4430-499f-92c8-8bed814a567a"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestProcessStateChanged"
+ >
+ <desc>
+ Notification when a guest process changed its state.
+ </desc>
+
+ <attribute name="status" type="ProcessStatus" readonly="yes">
+ <desc>
+ New guest process status.
+ </desc>
+ </attribute>
+ <attribute name="error" type="IVirtualBoxErrorInfo" readonly="yes">
+ <desc>
+ Error information in case of new session status is indicating an error.
+
+ The attribute <link to="IVirtualBoxErrorInfo::resultDetail"/> will contain
+ the runtime (IPRT) error code from the guest. See include/iprt/err.h and
+ include/VBox/err.h for details.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IGuestProcessIOEvent" extends="IGuestProcessEvent"
+ uuid="9ea9227c-e9bb-49b3-bfc7-c5171e93ef38"
+ wsmap="managed"
+ >
+ <desc>
+ Base abstract interface for all guest process input/output (IO) events.
+ </desc>
+
+ <attribute name="handle" type="unsigned long" readonly="yes">
+ <desc>
+ Input/output (IO) handle involved in this event. Usually 0 is stdin,
+ 1 is stdout and 2 is stderr.
+ </desc>
+ </attribute>
+
+ <attribute name="processed" type="unsigned long" readonly="yes">
+ <desc>
+ Processed input or output (in bytes).
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IGuestProcessInputNotifyEvent" extends="IGuestProcessIOEvent"
+ uuid="0de887f2-b7db-4616-aac6-cfb94d89ba78"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestProcessInputNotify"
+ >
+ <desc>
+ Notification when a guest process' stdin became available.
+ <note>This event is right now not implemented!</note>
+ </desc>
+
+ <attribute name="status" type="ProcessInputStatus" readonly="yes">
+ <desc>
+ Current process input status.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IGuestProcessOutputEvent" extends="IGuestProcessIOEvent"
+ uuid="d3d5f1ee-bcb2-4905-a7ab-cc85448a742b"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestProcessOutput"
+ >
+ <desc>
+ Notification when there is guest process output available for reading.
+ </desc>
+
+ <attribute name="data" type="octet" safearray="yes" readonly="yes">
+ <desc>
+ Actual output data.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IGuestFileEvent" extends="IGuestSessionEvent"
+ uuid="c8adb7b0-057d-4391-b928-f14b06b710c5"
+ wsmap="managed"
+ >
+ <desc>Base abstract interface for all guest file events.</desc>
+
+ <attribute name="file" type="IGuestFile" readonly="yes">
+ <desc>
+ Guest file object which is related to this event.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IGuestFileRegisteredEvent" extends="IGuestFileEvent"
+ uuid="d0d93830-70a2-487e-895e-d3fc9679f7b3"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestFileRegistered"
+ >
+ <desc>
+ Notification when a guest file was registered or unregistered.
+ </desc>
+
+ <attribute name="registered" type="boolean" readonly="yes">
+ <desc>
+ If @c true, the guest file was registered, otherwise it was
+ unregistered.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IGuestFileStateChangedEvent" extends="IGuestFileEvent"
+ uuid="d37fe88f-0979-486c-baa1-3abb144dc82d"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestFileStateChanged"
+ >
+ <desc>
+ Notification when a guest file changed its state.
+ </desc>
+
+ <attribute name="status" type="FileStatus" readonly="yes">
+ <desc>
+ New guest file status.
+ </desc>
+ </attribute>
+ <attribute name="error" type="IVirtualBoxErrorInfo" readonly="yes">
+ <desc>
+ Error information in case of new session status is indicating an error.
+
+ The attribute <link to="IVirtualBoxErrorInfo::resultDetail"/> will contain
+ the runtime (IPRT) error code from the guest. See include/iprt/err.h and
+ include/VBox/err.h for details.
+ </desc>
+ </attribute>
+ <!-- Note: No events for reads/writes for performance reasons.
+ See dedicated events IGuestFileReadEvent and
+ IGuestFileWriteEvent. -->
+
+ </interface>
+
+ <interface
+ name="IGuestFileIOEvent" extends="IGuestFileEvent"
+ uuid="b5191a7c-9536-4ef8-820e-3b0e17e5bbc8"
+ wsmap="managed"
+ >
+ <desc>
+ Base abstract interface for all guest file input/output (IO) events.
+ </desc>
+
+ <attribute name="offset" type="long long" readonly="yes">
+ <desc>
+ Current offset (in bytes).
+ </desc>
+ </attribute>
+ <attribute name="processed" type="unsigned long" readonly="yes">
+ <desc>
+ Processed input or output (in bytes).
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IGuestFileOffsetChangedEvent" extends="IGuestFileIOEvent"
+ uuid="e8f79a21-1207-4179-94cf-ca250036308f"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestFileOffsetChanged"
+ >
+ <desc>
+ Notification when a guest file changed its current offset via <link to="IFile::seek" />.
+ </desc>
+
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="IGuestFileSizeChangedEvent" extends="IGuestFileEvent"
+ uuid="d78374e9-486e-472f-481b-969746af2480"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestFileSizeChanged"
+ >
+ <desc>
+ Notification when a guest file changed its size via <link to="IFile::setSize" />.
+ </desc>
+
+ <attribute name="newSize" readonly="yes" type="long long"/>
+ </interface>
+
+
+ <interface
+ name="IGuestFileReadEvent" extends="IGuestFileIOEvent"
+ uuid="4ee3cbcb-486f-40db-9150-deee3fd24189"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestFileRead"
+ >
+ <desc>
+ Notification when data has been read from a guest file.
+ </desc>
+
+ <attribute name="data" type="octet" safearray="yes" readonly="yes">
+ <desc>
+ Actual data read.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IGuestFileWriteEvent" extends="IGuestFileIOEvent"
+ uuid="e062a915-3cf5-4c0a-bc90-9b8d4cc94d89"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestFileWrite"
+ >
+ <desc>
+ Notification when data has been written to a guest file.
+ </desc>
+
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="IVRDEServerChangedEvent" extends="IEvent"
+ uuid="a06fd66a-3188-4c8c-8756-1395e8cb691c"
+ wsmap="managed" autogen="VBoxEvent" id="OnVRDEServerChanged"
+ >
+ <desc>
+ Notification when a property of the
+ <link to="IMachine::VRDEServer">VRDE server</link> changes.
+ Interested callees should use IVRDEServer methods and attributes to
+ find out what has changed.
+ </desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="IVRDEServerInfoChangedEvent" extends="IEvent"
+ uuid="dd6a1080-e1b7-4339-a549-f0878115596e"
+ wsmap="managed" autogen="VBoxEvent" id="OnVRDEServerInfoChanged"
+ >
+ <desc>
+ Notification when the status of the VRDE server changes. Interested callees
+ should use <link to="IConsole::VRDEServerInfo">IVRDEServerInfo</link>
+ attributes to find out what is the current status.
+ </desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="IRecordingChangedEvent" extends="IEvent"
+ uuid="B5DDB370-08A7-4C8F-910D-47AABD67253A"
+ wsmap="managed" autogen="VBoxEvent" id="OnRecordingChanged"
+ >
+ <desc>
+ Notification when recording settings have changed.
+ </desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="IUSBControllerChangedEvent" extends="IEvent"
+ uuid="93BADC0C-61D9-4940-A084-E6BB29AF3D83"
+ wsmap="managed" autogen="VBoxEvent" id="OnUSBControllerChanged"
+ >
+ <desc>
+ Notification when a property of the virtual
+ <link to="IMachine::USBControllers">USB controllers</link> changes.
+ Interested callees should use IUSBController methods and attributes to
+ find out what has changed.
+ </desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="IUSBDeviceStateChangedEvent" extends="IEvent"
+ uuid="806da61b-6679-422a-b629-51b06b0c6d93"
+ wsmap="managed" autogen="VBoxEvent" id="OnUSBDeviceStateChanged"
+ >
+ <desc>
+ Notification when a USB device is attached to or detached from
+ the virtual USB controller.
+
+ This notification is sent as a result of the indirect
+ request to attach the device because it matches one of the
+ machine USB filters, or as a result of the direct request
+ issued by <link to="IConsole::attachUSBDevice"/> or
+ <link to="IConsole::detachUSBDevice"/>.
+
+ This notification is sent in case of both a succeeded and a
+ failed request completion. When the request succeeds, the
+ @a error parameter is @c null, and the given device has been
+ already added to (when @a attached is @c true) or removed from
+ (when @a attached is @c false) the collection represented by
+ <link to="IConsole::USBDevices"/>. On failure, the collection
+ doesn't change and the @a error parameter represents the error
+ message describing the failure.
+ </desc>
+ <attribute name="device" type="IUSBDevice" readonly="yes">
+ <desc>
+ Device that is subject to state change.
+ </desc>
+ </attribute>
+ <attribute name="attached" type="boolean" readonly="yes">
+ <desc>
+ @c true if the device was attached and @c false otherwise.
+ </desc>
+ </attribute>
+ <attribute name="error" type="IVirtualBoxErrorInfo" readonly="yes">
+ <desc>
+ @c null on success or an error message object on failure.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="ISharedFolderChangedEvent" extends="IEvent"
+ uuid="B66349B5-3534-4239-B2DE-8E1535D94C0B"
+ wsmap="managed" autogen="VBoxEvent" id="OnSharedFolderChanged"
+ >
+ <desc>
+ Notification when a shared folder is added or removed.
+ The @a scope argument defines one of three scopes:
+ <link to="IVirtualBox::sharedFolders">global shared folders</link>
+ (<link to="Scope_Global">Global</link>),
+ <link to="IMachine::sharedFolders">permanent shared folders</link> of
+ the machine (<link to="Scope_Machine">Machine</link>) or <link
+ to="IConsole::sharedFolders">transient shared folders</link> of the
+ machine (<link to="Scope_Session">Session</link>). Interested callees
+ should use query the corresponding collections to find out what has
+ changed.
+ </desc>
+ <attribute name="scope" type="Scope" readonly="yes">
+ <desc>
+ Scope of the notification.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IRuntimeErrorEvent" extends="IEvent"
+ uuid="883DD18B-0721-4CDE-867C-1A82ABAF914C"
+ wsmap="managed" autogen="VBoxEvent" autogenflags="BSTR" id="OnRuntimeError"
+ >
+ <desc>
+ Notification when an error happens during the virtual
+ machine execution.
+
+ There are three kinds of runtime errors:
+ <ul>
+ <li><i>fatal</i></li>
+ <li><i>non-fatal with retry</i></li>
+ <li><i>non-fatal warnings</i></li>
+ </ul>
+
+ <b>Fatal</b> errors are indicated by the @a fatal parameter set
+ to @c true. In case of fatal errors, the virtual machine
+ execution is always paused before calling this notification, and
+ the notification handler is supposed either to immediately save
+ the virtual machine state using <link to="IMachine::saveState"/>
+ or power it off using <link to="IConsole::powerDown"/>.
+ Resuming the execution can lead to unpredictable results.
+
+ <b>Non-fatal</b> errors and warnings are indicated by the
+ @a fatal parameter set to @c false. If the virtual machine
+ is in the Paused state by the time the error notification is
+ received, it means that the user can <i>try to resume</i> the machine
+ execution after attempting to solve the problem that caused the
+ error. In this case, the notification handler is supposed
+ to show an appropriate message to the user (depending on the
+ value of the @a id parameter) that offers several actions such
+ as <i>Retry</i>, <i>Save</i> or <i>Power Off</i>. If the user
+ wants to retry, the notification handler should continue
+ the machine execution using the <link to="IConsole::resume"/>
+ call. If the machine execution is not Paused during this
+ notification, then it means this notification is a <i>warning</i>
+ (for example, about a fatal condition that can happen very soon);
+ no immediate action is required from the user, the machine
+ continues its normal execution.
+
+ Note that in either case the notification handler
+ <b>must not</b> perform any action directly on a thread
+ where this notification is called. Everything it is allowed to
+ do is to post a message to another thread that will then talk
+ to the user and take the corresponding action.
+
+ Currently, the following error identifiers are known:
+ <ul>
+ <li><tt>"HostMemoryLow"</tt></li>
+ <li><tt>"HostAudioNotResponding"</tt></li>
+ <li><tt>"VDIStorageFull"</tt></li>
+ <li><tt>"3DSupportIncompatibleAdditions"</tt></li>
+ </ul>
+ </desc>
+ <attribute name="fatal" type="boolean" readonly="yes">
+ <desc>
+ Whether the error is fatal or not.
+ </desc>
+ </attribute>
+ <attribute name="id" type="wstring" readonly="yes">
+ <desc>
+ Error identifier.
+ </desc>
+ </attribute>
+ <attribute name="message" type="wstring" readonly="yes">
+ <desc>
+ Optional error message.
+ </desc>
+ </attribute>
+ </interface>
+
+
+ <interface
+ name="IEventSourceChangedEvent" extends="IEvent"
+ uuid="e7932cb8-f6d4-4ab6-9cbf-558eb8959a6a"
+ waitable="yes"
+ wsmap="managed" autogen="VBoxEvent" id="OnEventSourceChanged"
+ >
+ <desc>
+ Notification when an event source state changes (listener added or removed).
+ </desc>
+
+ <attribute name="listener" type="IEventListener" readonly="yes">
+ <desc>
+ Event listener which has changed.
+ </desc>
+ </attribute>
+
+ <attribute name="add" type="boolean" readonly="yes">
+ <desc>
+ Flag whether listener was added or removed.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IExtraDataChangedEvent" extends="IEvent"
+ uuid="024F00CE-6E0B-492A-A8D0-968472A94DC7"
+ wsmap="managed" autogen="VBoxEvent" autogenflags="BSTR" id="OnExtraDataChanged"
+ >
+ <desc>
+ Notification when machine specific or global extra data
+ has changed.
+ </desc>
+ <attribute name="machineId" type="uuid" mod="string" readonly="yes">
+ <desc>
+ ID of the machine this event relates to.
+ Null for global extra data changes.
+ </desc>
+ </attribute>
+ <attribute name="key" type="wstring" readonly="yes">
+ <desc>
+ Extra data key that has changed.
+ </desc>
+ </attribute>
+ <attribute name="value" type="wstring" readonly="yes">
+ <desc>
+ Extra data value for the given key.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IVetoEvent" extends="IEvent"
+ uuid="7c5e945f-2354-4267-883f-2f417d216519"
+ wsmap="managed"
+ >
+ <desc>Base abstract interface for veto events.</desc>
+
+ <method name="addVeto">
+ <desc>
+ Adds a veto on this event.
+ </desc>
+ <param name="reason" type="wstring" dir="in">
+ <desc>
+ Reason for veto, could be null or empty string.
+ </desc>
+ </param>
+ </method>
+
+ <method name="isVetoed">
+ <desc>
+ If this event was vetoed.
+ </desc>
+ <param name="result" type="boolean" dir="return">
+ <desc>
+ Reason for veto.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getVetos">
+ <desc>
+ Current veto reason list, if size is 0 - no veto.
+ </desc>
+ <param name="result" type="wstring" dir="return" safearray="yes">
+ <desc>
+ Array of reasons for veto provided by different event handlers.
+ </desc>
+ </param>
+ </method>
+
+ <method name="addApproval">
+ <desc>
+ Adds an approval on this event.
+ </desc>
+ <param name="reason" type="wstring" dir="in">
+ <desc>
+ Reason for approval, could be null or empty string.
+ </desc>
+ </param>
+ </method>
+
+ <method name="isApproved">
+ <desc>
+ If this event was approved.
+ </desc>
+ <param name="result" type="boolean" dir="return" />
+ </method>
+
+ <method name="getApprovals">
+ <desc>
+ Current approval reason list, if size is 0 - no approvals.
+ </desc>
+ <param name="result" type="wstring" dir="return" safearray="yes">
+ <desc>
+ Array of reasons for approval provided by different event handlers.
+ </desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <interface
+ name="IExtraDataCanChangeEvent" extends="IVetoEvent"
+ uuid="245d88bd-800a-40f8-87a6-170d02249a55"
+ wsmap="managed" autogen="VBoxEvent" id="OnExtraDataCanChange"
+ waitable="yes"
+ >
+ <desc>
+ Notification when someone tries to change extra data for
+ either the given machine or (if @c null) global extra data.
+ This gives the chance to veto against changes.
+ </desc>
+ <attribute name="machineId" type="uuid" mod="string" readonly="yes">
+ <desc>
+ ID of the machine this event relates to.
+ Null for global extra data changes.
+ </desc>
+ </attribute>
+ <attribute name="key" type="wstring" readonly="yes">
+ <desc>
+ Extra data key that has changed.
+ </desc>
+ </attribute>
+ <attribute name="value" type="wstring" readonly="yes">
+ <desc>
+ Extra data value for the given key.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="ICanShowWindowEvent" extends="IVetoEvent"
+ uuid="adf292b0-92c9-4a77-9d35-e058b39fe0b9"
+ wsmap="managed" autogen="VBoxEvent" id="OnCanShowWindow"
+ waitable="yes"
+ >
+ <desc>
+ Notification when a call to
+ <link to="IMachine::canShowConsoleWindow"/> is made by a
+ front-end to check if a subsequent call to
+ <link to="IMachine::showConsoleWindow"/> can succeed.
+
+ The callee should give an answer appropriate to the current
+ machine state using event veto. This answer must
+ remain valid at least until the next
+ <link to="IConsole::state">machine state</link> change.
+ </desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="IShowWindowEvent" extends="IEvent"
+ uuid="B0A0904D-2F05-4D28-855F-488F96BAD2B2"
+ wsmap="managed" autogen="VBoxEvent" id="OnShowWindow"
+ waitable="yes"
+ >
+ <desc>
+ Notification when a call to
+ <link to="IMachine::showConsoleWindow"/>
+ requests the console window to be activated and brought to
+ foreground on the desktop of the host PC.
+
+ This notification should cause the VM console process to
+ perform the requested action as described above. If it is
+ impossible to do it at a time of this notification, this
+ method should return a failure.
+
+ Note that many modern window managers on many platforms
+ implement some sort of focus stealing prevention logic, so
+ that it may be impossible to activate a window without the
+ help of the currently active application (which is supposedly
+ an initiator of this notification). In this case, this method
+ must return a non-zero identifier that represents the
+ top-level window of the VM console process. The caller, if it
+ represents a currently active process, is responsible to use
+ this identifier (in a platform-dependent manner) to perform
+ actual window activation.
+
+ This method must set @a winId to zero if it has performed all
+ actions necessary to complete the request and the console
+ window is now active and in foreground, to indicate that no
+ further action is required on the caller's side.
+ </desc>
+ <attribute name="winId" type="long long">
+ <desc>
+ Platform-dependent identifier of the top-level VM console
+ window, or zero if this method has performed all actions
+ necessary to implement the <i>show window</i> semantics for
+ the given platform and/or this VirtualBox front-end.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="INATRedirectEvent" extends="IMachineEvent"
+ uuid="24eef068-c380-4510-bc7c-19314a7352f1"
+ wsmap="managed" autogen="VBoxEvent" id="OnNATRedirect"
+ >
+ <desc>
+ Notification when NAT redirect rule added or removed.
+ </desc>
+ <attribute name="slot" type="unsigned long" readonly="yes">
+ <desc>
+ Adapter which NAT attached to.
+ </desc>
+ </attribute>
+ <attribute name="remove" type="boolean" readonly="yes">
+ <desc>
+ Whether rule remove or add.
+ </desc>
+ </attribute>
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>
+ Name of the rule.
+ </desc>
+ </attribute>
+ <attribute name="proto" type="NATProtocol" readonly="yes">
+ <desc>
+ Protocol (TCP or UDP) of the redirect rule.
+ </desc>
+ </attribute>
+ <attribute name="hostIP" type="wstring" readonly="yes">
+ <desc>
+ Host ip address to bind socket on.
+ </desc>
+ </attribute>
+ <attribute name="hostPort" type="long" readonly="yes">
+ <desc>
+ Host port to bind socket on.
+ </desc>
+ </attribute>
+ <attribute name="guestIP" type="wstring" readonly="yes">
+ <desc>
+ Guest ip address to redirect to.
+ </desc>
+ </attribute>
+ <attribute name="guestPort" type="long" readonly="yes">
+ <desc>
+ Guest port to redirect to.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IHostAudioDeviceChangedEvent" extends="IEvent"
+ waitable="yes"
+ uuid="8dcc633f-7b03-4f0a-9f40-7a784dd0835a"
+ wsmap="managed" autogen="VBoxEvent" id="OnHostAudioDeviceChangedEvent"
+ >
+ <desc>
+ Notification when a host audio device state has changed.
+ </desc>
+
+ <attribute name="device" type="IHostAudioDevice" readonly="yes">
+ <desc>
+ Host audio device that has changed.
+ </desc>
+ </attribute>
+
+ <attribute name="new" type="boolean" readonly="yes">
+ <desc>
+ @c true if the host device is a newly detected device, @c false if not.
+ </desc>
+ </attribute>
+
+ <attribute name="state" type="AudioDeviceState" readonly="yes">
+ <desc>
+ New audio device state.
+ </desc>
+ </attribute>
+
+ <attribute name="error" type="IVirtualBoxErrorInfo" readonly="yes">
+ <desc>
+ @c null on success or an error message object on failure.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IHostPCIDevicePlugEvent" extends="IMachineEvent"
+ waitable="yes"
+ uuid="a0bad6df-d612-47d3-89d4-db3992533948"
+ wsmap="managed" autogen="VBoxEvent" autogenflags="BSTR" id="OnHostPCIDevicePlug"
+ >
+ <desc>
+ Notification when host PCI device is plugged/unplugged. Plugging
+ usually takes place on VM startup, unplug - when
+ <link to="IMachine::detachHostPCIDevice"/> is called.
+
+ <see><link to="IMachine::detachHostPCIDevice"/></see>
+
+ </desc>
+
+ <attribute name="plugged" type="boolean" readonly="yes">
+ <desc>
+ If device successfully plugged or unplugged.
+ </desc>
+ </attribute>
+
+ <attribute name="success" type="boolean" readonly="yes">
+ <desc>
+ If operation was successful, if false - 'message' attribute
+ may be of interest.
+ </desc>
+ </attribute>
+
+ <attribute name="attachment" type="IPCIDeviceAttachment" readonly="yes">
+ <desc>
+ Attachment info for this device.
+ </desc>
+ </attribute>
+
+ <attribute name="message" type="wstring" readonly="yes">
+ <desc>
+ Optional error message.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IVBoxSVCAvailabilityChangedEvent" extends="IEvent"
+ uuid="97c78fcd-d4fc-485f-8613-5af88bfcfcdc"
+ wsmap="managed" autogen="VBoxEvent" id="OnVBoxSVCAvailabilityChanged"
+ >
+ <desc>
+ Notification when VBoxSVC becomes unavailable (due to a crash or similar
+ unexpected circumstances) or available again.
+ </desc>
+
+ <attribute name="available" type="boolean" readonly="yes">
+ <desc>
+ Whether VBoxSVC is available now.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IBandwidthGroupChangedEvent" extends="IEvent"
+ uuid="334df94a-7556-4cbc-8c04-043096b02d82"
+ wsmap="managed" autogen="VBoxEvent" id="OnBandwidthGroupChanged"
+ >
+ <desc>
+ Notification when one of the bandwidth groups changed
+ </desc>
+ <attribute name="bandwidthGroup" type="IBandwidthGroup" readonly="yes">
+ <desc>
+ The changed bandwidth group.
+ </desc>
+ </attribute>
+ </interface>
+
+ <enum
+ name="GuestMonitorChangedEventType"
+ uuid="ef172985-7e36-4297-95be-e46396968d66"
+ >
+
+ <desc>
+ How the guest monitor has been changed.
+ </desc>
+
+ <const name="Enabled" value="0">
+ <desc>
+ The guest monitor has been enabled by the guest.
+ </desc>
+ </const>
+
+ <const name="Disabled" value="1">
+ <desc>
+ The guest monitor has been disabled by the guest.
+ </desc>
+ </const>
+
+ <const name="NewOrigin" value="2">
+ <desc>
+ The guest monitor origin has changed in the guest.
+ </desc>
+ </const>
+ </enum>
+
+ <interface
+ name="IGuestMonitorChangedEvent" extends="IEvent"
+ uuid="0f7b8a22-c71f-4a36-8e5f-a77d01d76090"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestMonitorChanged"
+ >
+ <desc>
+ Notification when the guest enables one of its monitors.
+ </desc>
+
+ <attribute name="changeType" type="GuestMonitorChangedEventType" readonly="yes">
+ <desc>
+ What was changed for this guest monitor.
+ </desc>
+ </attribute>
+
+ <attribute name="screenId" type="unsigned long" readonly="yes">
+ <desc>
+ The monitor which was changed.
+ </desc>
+ </attribute>
+
+ <attribute name="originX" type="unsigned long" readonly="yes">
+ <desc>
+ Physical X origin relative to the primary screen.
+ Valid for Enabled and NewOrigin.
+ </desc>
+ </attribute>
+
+ <attribute name="originY" type="unsigned long" readonly="yes">
+ <desc>
+ Physical Y origin relative to the primary screen.
+ Valid for Enabled and NewOrigin.
+ </desc>
+ </attribute>
+
+ <attribute name="width" type="unsigned long" readonly="yes">
+ <desc>
+ Width of the screen.
+ Valid for Enabled.
+ </desc>
+ </attribute>
+
+ <attribute name="height" type="unsigned long" readonly="yes">
+ <desc>
+ Height of the screen.
+ Valid for Enabled.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IGuestUserStateChangedEvent" extends="IEvent"
+ uuid="39b4e759-1ec0-4c0f-857f-fbe2a737a256"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestUserStateChanged"
+ >
+ <desc>
+ Notification when a guest user changed its state.
+ </desc>
+
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>
+ Name of the guest user whose state changed.
+ </desc>
+ </attribute>
+ <attribute name="domain" type="wstring" readonly="yes">
+ <desc>
+ Name of the FQDN (fully qualified domain name) this user is bound
+ to. Optional.
+ </desc>
+ </attribute>
+ <attribute name="state" type="GuestUserState" readonly="yes">
+ <desc>
+ What was changed for this guest user. See <link to="GuestUserState"/> for
+ more information.
+ </desc>
+ </attribute>
+ <attribute name="stateDetails" type="wstring" readonly="yes">
+ <desc>
+ Optional state details, depending on the <link to="#state"/> attribute.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IStorageDeviceChangedEvent" extends="IEvent"
+ uuid="232e9151-ae84-4b8e-b0f3-5c20c35caac9"
+ wsmap="managed" autogen="VBoxEvent" id="OnStorageDeviceChanged"
+ >
+ <desc>
+ Notification when a
+ <link to="IMachine::mediumAttachments">storage device</link>
+ is attached or removed.
+ </desc>
+ <attribute name="storageDevice" type="IMediumAttachment" readonly="yes">
+ <desc>
+ Storage device that is subject to change.
+ </desc>
+ </attribute>
+ <attribute name="removed" type="boolean" readonly="yes">
+ <desc>
+ Flag whether the device was removed or added to the VM.
+ </desc>
+ </attribute>
+ <attribute name="silent" type="boolean" readonly="yes">
+ <desc>
+ Flag whether the guest should be notified about the change.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="INATNetworkChangedEvent" extends="IEvent"
+ uuid="101ae042-1a29-4a19-92cf-02285773f3b5"
+ wsmap="managed" autogen="VBoxEvent" id="OnNATNetworkChanged"
+ >
+ <!-- network name is common setting for all event types -->
+ <attribute name="networkName" type="wstring" readonly="yes"/>
+ </interface>
+
+ <!-- base class for start/stop events -->
+ <interface name="INATNetworkStartStopEvent" extends="INATNetworkChangedEvent"
+ uuid="269d8f6b-fa1e-4cee-91c7-6d8496bea3c1"
+ wsmap="managed" autogen="VBoxEvent" id="OnNATNetworkStartStop">
+ <attribute name="startEvent" type="boolean" readonly="yes">
+ <desc>
+ IsStartEvent is true when NAT network is started and false on stopping.
+ </desc>
+ </attribute>
+ </interface>
+
+ <!-- base class for modification events -->
+ <interface
+ name="INATNetworkAlterEvent" extends="INATNetworkChangedEvent"
+ uuid="d947adf5-4022-dc80-5535-6fb116815604"
+ wsmap="managed" autogen="VBoxEvent" id="OnNATNetworkAlter"
+ >
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface name="INATNetworkCreationDeletionEvent" extends="INATNetworkAlterEvent"
+ uuid="8d984a7e-b855-40b8-ab0c-44d3515b4528"
+ wsmap="managed" autogen="VBoxEvent" autogenflags="BSTR" id="OnNATNetworkCreationDeletion">
+ <attribute name="creationEvent" type="boolean" readonly="yes"/>
+ </interface>
+
+ <interface name="INATNetworkSettingEvent" extends="INATNetworkAlterEvent"
+ uuid="9db3a9e6-7f29-4aae-a627-5a282c83092c"
+ wsmap="managed" autogen="VBoxEvent" id="OnNATNetworkSetting">
+ <attribute name="enabled" type="boolean" readonly="yes"/>
+ <attribute name="network" type="wstring" readonly="yes"/>
+ <attribute name="gateway" type="wstring" readonly="yes"/>
+ <attribute name="advertiseDefaultIPv6RouteEnabled" type="boolean" readonly="yes" dtracename="advertiseDefIPv6Route"/>
+ <attribute name="needDhcpServer" type="boolean" readonly="yes"/>
+ </interface>
+
+ <interface name="INATNetworkPortForwardEvent" extends="INATNetworkAlterEvent"
+ uuid="2514881b-23d0-430a-a7ff-7ed7f05534bc"
+ wsmap="managed" autogen="VBoxEvent" id="OnNATNetworkPortForward">
+ <attribute name="create" type="boolean" readonly="yes"/>
+ <attribute name="ipv6" type="boolean" readonly="yes"/>
+ <attribute name="name" type="wstring" readonly="yes"/>
+ <attribute name="proto" type="NATProtocol" readonly="yes"/>
+ <attribute name="hostIp" type="wstring" readonly="yes"/>
+ <attribute name="hostPort" type="long" readonly="yes"/>
+ <attribute name="guestIp" type="wstring" readonly="yes"/>
+ <attribute name="guestPort" type="long" readonly="yes"/>
+ </interface>
+
+ <interface
+ name="IHostNameResolutionConfigurationChangeEvent" extends="IEvent"
+ uuid="f9b9e1cf-cb63-47a1-84fb-02c4894b89a9"
+ wsmap="managed" autogen="VBoxEvent" id="OnHostNameResolutionConfigurationChange"
+ dtracename="HostNameResCfgChangeEvent"
+ >
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="IProgressEvent" extends="IEvent"
+ uuid="daaf9016-1f04-4191-aa2f-1fac9646ae4c"
+ wsmap="managed" id="ProgressEvent">
+ <desc>Base abstract interface for all progress events.</desc>
+
+ <attribute name="progressId" readonly="yes" type="uuid" mod="string">
+ <desc>GUID of the progress this event relates to.</desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IProgressCreatedEvent" extends="IProgressEvent"
+ uuid="a85bba40-1b93-47bb-b125-dec708c30fc0"
+ wsmap="managed" autogen="VBoxEvent" id="OnProgressCreated">
+ <desc>Notification of a new progress object creation/deletion.
+ Covers purely projess objects in VBoxSVC. This
+ event is signaled on the event source of IVirtualBox, unlike
+ the other progress events.</desc>
+
+ <attribute name="create" readonly="yes" type="boolean">
+ <desc>If @c true, the progress object was created, otherwise it
+ was deleted.</desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IProgressPercentageChangedEvent" extends="IProgressEvent"
+ uuid="f05d7e60-1bcf-4218-9807-04e036cc70f1"
+ wsmap="managed" autogen="VBoxEvent" id="OnProgressPercentageChanged">
+ <desc>Progress state change event.</desc>
+
+ <attribute name="percent" readonly="yes" type="long">
+ <desc>New percent</desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IProgressTaskCompletedEvent" extends="IProgressEvent"
+ uuid="a5bbdb7d-8ce7-469f-a4c2-6476f581ff72"
+ wsmap="managed" autogen="VBoxEvent" id="OnProgressTaskCompleted">
+ <desc>Progress task completion event.</desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
+
+ <interface
+ name="ICursorPositionChangedEvent" extends="IEvent"
+ uuid="6f302674-c927-11e7-b788-33c248e71fc7"
+ wsmap="managed" autogen="VBoxEvent" id="OnCursorPositionChanged">
+ <desc>The guest reports cursor position data.</desc>
+
+ <attribute name="hasData" readonly="yes" type="boolean">
+ <desc>Event contains valid data. If not set, switch back to using the host cursor.</desc>
+ </attribute>
+ <attribute name="x" readonly="yes" type="unsigned long">
+ <desc>Reported X position</desc>
+ </attribute>
+ <attribute name="y" readonly="yes" type="unsigned long">
+ <desc>Reported Y position</desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IGuestAdditionsStatusChangedEvent" extends="IEvent"
+ uuid="a443da5b-aa82-4720-bc84-bd097b2b13b8"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestAdditionsStatusChanged">
+ <desc>The guest addition status changed.</desc>
+
+ <attribute name="facility" type="AdditionsFacilityType" readonly="yes">
+ <desc>Facility this event relates to.</desc>
+ </attribute>
+ <attribute name="status" type="AdditionsFacilityStatus" readonly="yes">
+ <desc>The new facility status.</desc>
+ </attribute>
+ <attribute name="runLevel" type="AdditionsRunLevelType" readonly="yes">
+ <desc>The new run level.</desc>
+ </attribute>
+ <attribute name="timestamp" type="long long" readonly="yes">
+ <desc>The millisecond timestamp associated with the event.</desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IGuestMonitorInfoChangedEvent" extends="IEvent"
+ uuid="0b3cdeb2-808e-11e9-b773-133d9330f849"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestMonitorInfoChanged">
+ <desc>The guest reports cursor position data.</desc>
+
+ <attribute name="output" readonly="yes" type="unsigned long">
+ <desc>The virtual display output on which the monitor has changed.</desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IUpdateAgentEvent" extends="IEvent"
+ uuid="ff58a51d-54a1-411c-93e9-3047eb4dcd21"
+ wsmap="managed">
+ <desc>
+ Abstract base interface for update agent events.
+ </desc>
+ <attribute name="agent" readonly="yes" type="IUpdateAgent">
+ <desc>Update agent this event belongs to.</desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IUpdateAgentSettingsChangedEvent" extends="IUpdateAgentEvent"
+ uuid="abef51ae-1493-49f4-aa03-efaf106bf086"
+ wsmap="managed" autogen="VBoxEvent" id="OnUpdateAgentSettingsChanged"
+ >
+ <desc>
+ Notification when update agent settings have been changed.
+ </desc>
+ <attribute name="attributeHint" readonly="yes" type="wstring"/>
+ </interface>
+
+ <interface
+ name="IUpdateAgentErrorEvent" extends="IUpdateAgentEvent"
+ uuid="2a88033d-82db-4ac2-97b5-e786c839420e"
+ wsmap="managed" autogen="VBoxEvent" id="OnUpdateAgentError"
+ >
+ <desc>
+ Notification when an update agent error occurred.
+ </desc>
+
+ <attribute name="msg" type="wstring" readonly="yes">
+ <desc>
+ Error message in human readable format.
+ </desc>
+ </attribute>
+
+ <attribute name="rcError" type="long" readonly="yes">
+ <desc>
+ IPRT-style error code.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IUpdateAgentAvailableEvent" extends="IUpdateAgentEvent"
+ uuid="243829cb-15b7-42a4-8664-7aa4e34993da"
+ wsmap="managed" autogen="VBoxEvent" id="OnUpdateAgentAvailable"
+ >
+ <desc>
+ Notification when an update is available.
+ </desc>
+
+ <attribute name="version" type="wstring" readonly="yes">
+ <desc>
+ Version of the update.
+ </desc>
+ </attribute>
+
+ <attribute name="channel" type="UpdateChannel" readonly="yes">
+ <desc>
+ Channel containing the update.
+ </desc>
+ </attribute>
+
+ <attribute name="severity" type="UpdateSeverity" readonly="yes">
+ <desc>
+ Severity of the update.
+ </desc>
+ </attribute>
+
+ <attribute name="downloadURL" type="wstring" readonly="yes">
+ <desc>
+ Download URL of the update.
+ </desc>
+ </attribute>
+
+ <attribute name="webURL" type="wstring" readonly="yes">
+ <desc>
+ Web URL of the update.
+ </desc>
+ </attribute>
+
+ <attribute name="releaseNotes" type="wstring" readonly="yes">
+ <desc>
+ Release notes of the update.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IUpdateAgentStateChangedEvent" extends="IUpdateAgentEvent"
+ uuid="eb000a0e-2079-4f47-bbcc-c6b28a4e50df"
+ wsmap="managed" autogen="VBoxEvent" id="OnUpdateAgentStateChanged"
+ >
+ <desc>
+ Notification when an update agent state has been changed.
+ </desc>
+
+ <attribute name="state" type="UpdateState" readonly="yes">
+ <desc>
+ New update agent state.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <interface
+ name="IGuestDebugControlChangedEvent" extends="IEvent"
+ uuid="a3d2799e-d3ad-4f73-91ef-7d839689f6d6"
+ wsmap="managed" autogen="VBoxEvent" id="OnGuestDebugControlChanged"
+ >
+ <desc>
+ Notification when a property of the <link to="IMachine::guestDebugControl">guest debug</link>
+ settings changes. Interested callees should use IGuestDebugControl methods and attributes
+ to find out what has changed.
+ </desc>
+ <attribute name="guestDebugControl" type="IGuestDebugControl" readonly="yes">
+ <desc>
+ Guest debug control object that is subject to change.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface
+ name="IMachineGroupsChangedEvent" extends="IMachineEvent"
+ uuid="ee37afb5-7002-4786-a5c4-a9c29e1cce75"
+ wsmap="managed" autogen="VBoxEvent" id="OnMachineGroupsChanged"
+ >
+ <desc>
+ The groups of the machine have changed.
+ </desc>
+
+ <attribute name="dummy" type="boolean" readonly="yes">
+ <desc>
+ Dummy state because you can't have an event without attributes apparently.
+ </desc>
+ </attribute>
+ </interface>
+
+ <!--
+ // Auxiliary containers
+ //////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface name="IStringArray" extends="$unknown"
+ uuid="3890b2c8-604d-11e9-92d3-53cb473db9fb"
+ wsmap="managed"
+ reservedMethods="4">
+ <desc>
+ When you need to return an array of strings asynchronously
+ (under a progress) you cannot use by-value out parameter
+ <tt>type=&quot;wstring&quot; safearray=&quot;yes&quot;
+ dir=&quot;out&quot;</tt>, hence this wrapper.
+ </desc>
+ <attribute name="values" type="wstring" safearray="yes" readonly="yes"/>
+ </interface>
+
+
+ <!--
+ // IForm
+ //////////////////////////////////////////////////////////////////////////
+ -->
+ <enum name="FormValueType"
+ uuid="5f10e2f2-911f-4f55-8afb-39c790f7dc42">
+ <const name="Boolean" value="0"/>
+ <const name="String" value="1"/>
+ <const name="Choice" value="2"/>
+ <const name="RangedInteger" value="3"/>
+ <const name="RangedInteger64" value="4"/>
+ </enum>
+
+ <interface name="IFormValue" extends="$unknown"
+ uuid="67c50afe-3e78-11e9-b25e-7768f80c0e07"
+ wsmap="managed"
+ reservedMethods="4" reservedAttributes="8">
+ <attribute name="type" type="FormValueType" readonly="yes"/>
+ <attribute name="generation" type="long" readonly="yes"/>
+ <attribute name="enabled" type="boolean" readonly="yes"/>
+ <attribute name="visible" type="boolean" readonly="yes"/>
+ <attribute name="label" type="wstring" readonly="yes"/>
+ <attribute name="description" type="wstring" readonly="yes"/>
+ <attribute name="help" type="wstring" readonly="yes"/>
+ </interface>
+
+ <interface name="IBooleanFormValue" extends="IFormValue"
+ uuid="4f4adcf6-3e87-11e9-8af2-576e84223953"
+ wsmap="managed"
+ reservedMethods="4" reservedAttributes="4">
+ <method name="getSelected">
+ <param name="selected" type="boolean" dir="return"/>
+ </method>
+ <method name="setSelected">
+ <param name="selected" type="boolean" dir="in"/>
+ <param name="progress" type="IProgress" dir="return"/>
+ </method>
+ </interface>
+
+ <interface name="IRangedIntegerFormValue" extends="IFormValue"
+ uuid="b31c4052-7bdc-11e9-8bc2-8ffdb8b19219"
+ wsmap="managed"
+ reservedMethods="4" reservedAttributes="4">
+ <attribute name="suffix" type="wstring" readonly="yes">
+ <desc>
+ Counterpart of the <link to="IFormValue::label"/> attribute.
+ May be null or empty. Usually used for units.
+ </desc>
+ </attribute>
+ <attribute name="minimum" type="long" readonly="yes"/>
+ <attribute name="maximum" type="long" readonly="yes"/>
+ <method name="getInteger">
+ <param name="value" type="long" dir="return"/>
+ </method>
+ <method name="setInteger">
+ <param name="value" type="long" dir="in"/>
+ <param name="progress" type="IProgress" dir="return"/>
+ </method>
+ </interface>
+
+ <interface name="IRangedInteger64FormValue" extends="IFormValue"
+ uuid="f01e8b48-f44d-42cc-8a83-512f6a8552f1"
+ wsmap="managed"
+ reservedMethods="4" reservedAttributes="4">
+ <attribute name="suffix" type="wstring" readonly="yes">
+ <desc>
+ Counterpart of the <link to="IFormValue::label"/> attribute.
+ May be null or empty. Usually used for units.
+ </desc>
+ </attribute>
+ <attribute name="minimum" type="long long" readonly="yes"/>
+ <attribute name="maximum" type="long long" readonly="yes"/>
+ <method name="getInteger">
+ <param name="value" type="long long" dir="return"/>
+ </method>
+ <method name="setInteger">
+ <param name="value" type="long long" dir="in"/>
+ <param name="progress" type="IProgress" dir="return"/>
+ </method>
+ </interface>
+
+ <interface name="IStringFormValue" extends="IFormValue"
+ uuid="cb6f0f2c-8384-11e9-921d-8b984e28a686"
+ wsmap="managed"
+ reservedMethods="4" reservedAttributes="4">
+ <attribute name="multiline" type="boolean" readonly="yes"/>
+ <method name="getString">
+ <param name="text" type="wstring" dir="return"/>
+ </method>
+ <method name="setString">
+ <param name="text" type="wstring" dir="in"/>
+ <param name="progress" type="IProgress" dir="return"/>
+ </method>
+
+ <attribute name="clipboardString" type="wstring" readonly="yes">
+ <desc>
+ Intnded for cases when a read-only string value is used to
+ display information and different string is to be used when
+ copying to the clipboard.
+ </desc>
+ </attribute>
+ </interface>
+
+ <interface name="IChoiceFormValue" extends="IFormValue"
+ uuid="7191cf38-3e8a-11e9-825c-ab7b2cabce23"
+ wsmap="managed"
+ reservedMethods="4" reservedAttributes="4">
+ <attribute name="values" type="wstring" safearray="yes" readonly="yes"/>
+ <method name="getSelectedIndex">
+ <param name="index" type="long" dir="return"/>
+ </method>
+ <method name="setSelectedIndex">
+ <param name="index" type="long" dir="in"/>
+ <param name="progress" type="IProgress" dir="return"/>
+ </method>
+ </interface>
+
+ <interface name="IForm" extends="$unknown"
+ uuid="d05c91e2-3e8a-11e9-8082-db8ae479ef87"
+ wsmap="managed"
+ reservedMethods="4" reservedAttributes="4">
+ <attribute name="values" type="IFormValue" safearray="yes" readonly="yes"/>
+
+ <method name="getFieldGroup">
+ <param name="field" type="wstring" dir="in"/>
+ <param name="group" type="wstring" safearray="yes" dir="return"/>
+ </method>
+
+ <method name="apply">
+ <param name="progress" type="IProgress" dir="return"/>
+ </method>
+ </interface>
+
+ <interface name="IVirtualSystemDescriptionForm" extends="IForm"
+ uuid="14c2db8a-3ee4-11e9-b872-cb9447aad965"
+ wsmap="managed"
+ reservedMethods="4" reservedAttributes="4">
+ <method name="getVirtualSystemDescription">
+ <param name="description" type="IVirtualSystemDescription" dir="return"/>
+ </method>
+ </interface>
+
+ <enum
+ name="CloudMachineState"
+ uuid="67b6d054-0154-4f5d-b71b-6ac406e1ff78"
+ >
+ <desc>Cloud instance execution state</desc>
+ <const name="Invalid" value="0">
+ <desc>Invalid state</desc>
+ </const>
+ <const name="Provisioning" value="1">
+ <desc>The machine is in the process of provisioning</desc>
+ </const>
+ <const name="Running" value="2">
+ <desc>The machine runs</desc>
+ </const>
+ <const name="Starting" value="3">
+ <desc>The machine is in the process of starting</desc>
+ </const>
+ <const name="Stopping" value="4">
+ <desc>The machine is in the process of stopping</desc>
+ </const>
+ <const name="Stopped" value="5">
+ <desc>The machine was stopped</desc>
+ </const>
+ <const name="CreatingImage" value="6">
+ <desc>The machine is in the process of creating image</desc>
+ </const>
+ <const name="Terminating" value="7">
+ <desc>The machine is in the process of terminating</desc>
+ </const>
+ <const name="Terminated" value="8">
+ <desc>The machine was terminated</desc>
+ </const>
+</enum>
+
+ <enum
+ name="CloudImageState"
+ uuid="6e5d6762-eea2-4f2c-b104-2952d0aa8a0a"
+ >
+ <desc>Cloud image state</desc>
+ <const name="Invalid" value="0">
+ <desc>Invalid state</desc>
+ </const>
+ <const name="Provisioning" value="1">
+ <desc>The image is in the process of provisioning</desc>
+ </const>
+ <const name="Importing" value="2">
+ <desc>The image is in the process of importing</desc>
+ </const>
+ <const name="Available" value="3">
+ <desc>The image is avalable</desc>
+ </const>
+ <const name="Exporting" value="4">
+ <desc>The image is in the process of exporting</desc>
+ </const>
+ <const name="Disabled" value="5">
+ <desc>The image is disabled</desc>
+ </const>
+ <const name="Deleted" value="6">
+ <desc>The image was deleted</desc>
+ </const>
+</enum>
+
+ <interface name="ICloudNetworkGatewayInfo" extends="$unknown"
+ uuid="89a63ace-0c65-11ea-ad23-0ff257c71a7f"
+ wsmap="managed"
+ reservedAttributes="5">
+ <attribute name="publicIP" type="wstring" readonly="yes"/>
+ <attribute name="secondaryPublicIP" type="wstring" readonly="yes"/>
+ <attribute name="macAddress" type="wstring" readonly="yes"/>
+ <attribute name="instanceId" type="wstring" readonly="yes"/>
+ </interface>
+
+
+ <interface name="ICloudNetworkEnvironmentInfo" extends="$unknown"
+ uuid="181dfb55-394d-44d3-9edb-af2c4472c40a"
+ wsmap="managed"
+ reservedAttributes="7">
+ <attribute name="tunnelNetworkId" type="wstring" readonly="yes"/>
+ </interface>
+
+
+ <interface name="ICloudMachine" extends="$unknown"
+ uuid="147816c8-17e0-11eb-81fa-87cea6263e1a"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="15" reservedAttributes="8"
+ >
+ <desc>
+ Virtual virtual machine (sic) in the cloud.
+
+ Reading object attributes returns cached values, use
+ <link to="#refresh"/> to refresh them.
+ </desc>
+
+ <attribute name="id" type="uuid" mod="string" readonly="yes">
+ <desc>UUID of the cloud machine.</desc>
+ </attribute>
+
+ <attribute name="accessible" type="boolean" readonly="yes"
+ wrap-hint-server="limitedcaller">
+ <desc>
+ Whether this virtual machine is currently accessible or not.
+ TBD...
+ </desc>
+ </attribute>
+
+ <attribute name="accessError" type="IVirtualBoxErrorInfo" readonly="yes"
+ wrap-hint-server="limitedcaller">
+ <desc>
+ Error information describing the reason of machine
+ inaccessibility.
+
+ Reading this property is only valid after the last call to
+ <link to="#accessible"/> returned @c false (i.e. the
+ machine is currently inaccessible). Otherwise, a @c null
+ IVirtualBoxErrorInfo object will be returned.
+ </desc>
+ </attribute>
+
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>
+ Convenience shortcut to retrieve the name of the cloud
+ machine. The name is part of the machine settings that are
+ hidden behind the settings form (see <link to="#getSettingsForm"/>).
+ </desc>
+ </attribute>
+
+ <attribute name="OSTypeId" type="wstring" readonly="yes">
+ <desc>
+ Convenience shortcut to retrieve the OS Type id of the cloud
+ machine. It is part of the machine settings that are hidden
+ behind the settings form (see <link to="#getSettingsForm"/>).
+ </desc>
+ </attribute>
+
+ <attribute name="state" type="CloudMachineState" readonly="yes">
+ <desc>
+ Machine state.
+ </desc>
+ </attribute>
+
+ <method name="refresh">
+ <desc>
+ Refresh information by reading it from the cloud.
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getDetailsForm" const="yes">
+ <desc>
+ Obtain a form with the current settings for this cloud
+ machine. The form is not editable.
+ </desc>
+ <param name="form" type="IForm" dir="return">
+ <desc>
+ A form with the cloud machine settings.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getSettingsForm">
+ <desc>
+ Obtain a form with settings for this cloud machine.
+ The form is editable.
+ </desc>
+ <param name="form" type="IForm" dir="out">
+ <desc>
+ A form with the cloud machine settings.
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="powerUp">
+ <desc>
+ Start cloud virtual machine execution.
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="reboot">
+ <desc>
+ Reboot cloud virtual machine.
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="reset">
+ <desc>
+ Forcing reset or hard reset of a cloud virtual machine.
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="shutdown">
+ <desc>
+ Shutdown cloud virtual machine.
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="powerDown">
+ <desc>
+ Initiates the power down procedure to stop the virtual machine
+ execution.
+
+ The completion of the power down procedure is tracked using the returned
+ IProgress object. After the operation is complete, the machine will go
+ to the PoweredOff state.
+ <result name="VBOX_E_INVALID_VM_STATE">
+ Virtual machine must be Running, to be powered down.
+ </result>
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="terminate">
+ <desc>
+ Terminate cloud virtual machine.
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="unregister" wrap-hint-server="limitedcaller,passcaller">
+ <desc>
+ Unregister this cloud machine, but leave the cloud artifacts
+ intact.
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="remove" wrap-hint-server="limitedcaller,passcaller">
+ <desc>
+ Unregister this cloud machine and delete all its cloud artifacts.
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getConsoleHistory">
+ <desc>
+ Get the backlog of the machine's console. If you have ever
+ seen console teletypes, this is like looking at the last few
+ meters of the paper it spewed.
+ </desc>
+ <param name="stream" type="IDataStream" dir="out">
+ <desc>
+ Data stream object for reading the console history. For now
+ we are abusing/repurposing this interface from the media
+ convertion API to avoid marshalling a huge string through
+ xpcom.
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return"><desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="createConsoleConnection">
+ <param name="sshPublicKey" type="wstring" dir="in">
+ <desc>
+ SSH public key authorized to connect to the console.
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="deleteConsoleConnection">
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <attribute name="consoleConnectionFingerprint" type="wstring" readonly="yes">
+ <desc>
+ The fingerprint of the ssh key that is authorized to access
+ the machine's console connection.
+ </desc>
+ </attribute>
+
+ <attribute name="serialConsoleCommand" type="wstring" readonly="yes">
+ <desc>
+ The shell command to establish ssh connection to the cloud
+ machine serial console.
+ </desc>
+ </attribute>
+
+ <attribute name="serialConsoleCommandWindows" type="wstring" readonly="yes">
+ <desc>
+ The PowerShell command to establish ssh connection to the
+ cloud machine serial console using PuTTY's plink.
+ </desc>
+ </attribute>
+
+ <attribute name="VNCConsoleCommand" type="wstring" readonly="yes">
+ <desc>
+ The shell command to establish ssh port forwarding for the
+ VNC connection to the cloud machine console.
+ </desc>
+ </attribute>
+
+ <attribute name="VNCConsoleCommandWindows" type="wstring" readonly="yes">
+ <desc>
+ The PowerShell command to establish ssh port forwarding for the
+ VNC connection to the cloud machine console using PuTTY's plink.
+ </desc>
+ </attribute>
+
+ </interface>
+
+ <!--
+ // ICloudClient
+ //////////////////////////////////////////////////////////////////////////
+ -->
+ <interface
+ name="ICloudClient" extends="$unknown"
+ uuid="c2db178a-7485-11ec-aec4-2fbf90681a84"
+ wsmap="managed"
+ reservedMethods="15" reservedAttributes="8"
+ >
+
+ <method name="getExportDescriptionForm">
+ <desc>
+ Returns a form for editing the virtual system description for
+ exporting a local VM into a cloud custom image.
+ </desc>
+ <param name="description" type="IVirtualSystemDescription" dir="in">
+ <desc>
+ Virtual system description to be edited.
+ </desc>
+ </param>
+ <param name="form" type="IVirtualSystemDescriptionForm" dir="out">
+ <desc>
+ An IForm instance for editing the virtual system description.
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="exportVM">
+ <desc>
+ Export local VM into the cloud, creating a custom image.
+ </desc>
+ <param name="description" type="IVirtualSystemDescription" dir="in">
+ <desc>
+ Virtual system description object which describes the
+ machine and all required parameters.
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="in">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getLaunchDescriptionForm">
+ <param name="description" type="IVirtualSystemDescription" dir="in">
+ <desc>
+ Virtual system description to be edited.
+ </desc>
+ </param>
+ <param name="form" type="IVirtualSystemDescriptionForm" dir="out">
+ <desc>
+ An IForm instance for editing the virtual system description.
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="launchVM">
+ <param name="description" type="IVirtualSystemDescription" dir="in">
+ <desc>
+ Virtual system description object which describes the
+ machine and all required parameters.
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getImportDescriptionForm">
+ <desc>
+ Returns a form for editing the virtual system description for
+ import from cloud.
+ </desc>
+ <param name="description" type="IVirtualSystemDescription" dir="in">
+ <desc>
+ Virtual system description to be edited.
+ </desc>
+ </param>
+ <param name="form" type="IVirtualSystemDescriptionForm" dir="out">
+ <desc>
+ An IForm instance for editing the virtual system description.
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="importInstance">
+ <desc>
+ Import an existing cloud instance to the local host.
+ All needed parameters are passed in the description (VSD).
+ </desc>
+ <param name="description" type="IVirtualSystemDescription" dir="in">
+ <desc>VirtualSystemDescription object which is describing a machine and all required parameters.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="in">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="getCloudMachine">
+ <desc>
+ Create an object that represents a cloud machine with the
+ specified UUID. Note that the operation is synchronous. The
+ returned machine is initiatally in inaccessible state and
+ requires a refresh to get its data from the cloud.
+ </desc>
+ <param name="id" type="uuid" mod="string" dir="in">
+ <desc>
+ UUID of a cloud machine.
+ </desc>
+ </param>
+ <param name="machine" type="ICloudMachine" dir="return">
+ <desc>
+ Object that represents the cloud machine with the specified UUID.
+ </desc>
+ </param>
+ </method>
+
+ <method name="readCloudMachineList">
+ <desc>
+ Make the list of cloud machines available via
+ <link to="#cloudMachineList"/> attribute.
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+ <attribute name="cloudMachineList" type="ICloudMachine" safearray="yes" readonly="yes">
+ <desc>
+ See <link to="#readCloudMachineList"/>.
+ </desc>
+ </attribute>
+
+ <method name="readCloudMachineStubList">
+ <desc>
+ Make the list of cloud machine stubs available via
+ <link to="#cloudMachineStubList"/> attribute.
+ Like with <link to="#getCloudMachine"/>, the returned machines
+ are initiatally inaccessible and require a refresh to get
+ their data from the cloud.
+ </desc>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+ <attribute name="cloudMachineStubList" type="ICloudMachine" safearray="yes" readonly="yes">
+ <desc>
+ See <link to="#readCloudMachineStubList"/>.
+ </desc>
+ </attribute>
+
+ <method name="addCloudMachine">
+ <desc>
+ Adopt a running instance and register it as cloud machine.
+ This is kinda like adding a local .vbox file as a local VM.
+ </desc>
+ <param name="instanceId" type="wstring" dir="in">
+ <desc>
+ ID of an instance to be added as a cloud machine.
+ </desc>
+ </param>
+ <param name="machine" type="ICloudMachine" dir="out">
+ <desc>
+ Object that represents the newly registered cloud machine.
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="createCloudMachine">
+ <desc>
+ This is transitional method that combines
+ <link to="#launchVM"/> and <link to="#addCloudMachine"/>.
+ </desc>
+ <param name="description" type="IVirtualSystemDescription" dir="in">
+ <desc>
+ Virtual system description object which describes the
+ machine and all required parameters.
+ </desc>
+ </param>
+ <param name="machine" type="ICloudMachine" dir="out">
+ <desc>
+ Object that represents the newly created cloud machine.
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="listInstances" const="yes">
+ <desc>
+ Returns the list of the instances in the Cloud.
+ </desc>
+ <param name="machineState" type="CloudMachineState" dir="in" safearray="yes">
+ <desc>State of each VM.</desc>
+ </param>
+ <param name="returnNames" type="IStringArray" dir="out">
+ <desc>VM names.</desc>
+ </param>
+ <param name="returnIds" type="IStringArray" dir="out">
+ <desc>VM ids.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="listSourceInstances" const="yes">
+ <desc>
+ Returns the list of instances in the cloud that can be
+ added/adopted as VirtualBox cloud machines.
+ </desc>
+ <param name="returnNames" type="IStringArray" dir="out">
+ <desc>Instance names.</desc>
+ </param>
+ <param name="returnIds" type="IStringArray" dir="out">
+ <desc>Instance idss.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="listImages" const="yes">
+ <desc>
+ Returns the list of the images in the Cloud.
+ </desc>
+ <param name="imageState" type="CloudImageState" dir="in" safearray="yes">
+ <desc>State of each image.</desc>
+ </param>
+ <param name="returnNames" type="IStringArray" dir="out">
+ <desc>Images names.</desc>
+ </param>
+ <param name="returnIds" type="IStringArray" dir="out">
+ <desc>Images ids.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <!-- quick hack -->
+ <method name="listBootVolumes" const="yes">
+ <desc>
+ Returns the list of boot volumes in the Cloud.
+ </desc>
+ <param name="returnNames" type="IStringArray" dir="out">
+ <desc>Boot volume names.</desc>
+ </param>
+ <param name="returnIds" type="IStringArray" dir="out">
+ <desc>Boot volume ids.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="listSourceBootVolumes" const="yes">
+ <desc>
+ Returns the list of boot volumes in the cloud that can be
+ added/adopted as VirtualBox cloud machines.
+ </desc>
+ <param name="returnNames" type="IStringArray" dir="out">
+ <desc>Boot volume names.</desc>
+ </param>
+ <param name="returnIds" type="IStringArray" dir="out">
+ <desc>Boot volume ids.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="listVnicAttachments" const="yes">
+ <desc>
+ Returns the list of the Vnic attachements in the Cloud.
+ </desc>
+ <param name="parameters" type="wstring" dir="in" safearray="yes">
+ <desc>Each parameter in the array must be in the form "name=value".</desc>
+ </param>
+ <param name="returnVnicAttachmentIds" type="IStringArray" dir="out">
+ <desc>VM ids.</desc>
+ </param>
+ <param name="returnVnicIds" type="IStringArray" dir="out">
+ <desc>VM ids.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getInstanceInfo" const="yes">
+ <desc>
+ Returns the information about an instance in the Cloud.
+ </desc>
+ <param name="uid" type="wstring" dir="in">
+ <desc>The id of instance in the Cloud.</desc>
+ </param>
+ <param name="description" type="IVirtualSystemDescription" dir="in">
+ <desc>VirtualSystemDescription object which is describing a machine</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="startInstance">
+ <desc>
+ Start an existing instance with passed id.
+ </desc>
+ <param name="uid" type="wstring" dir="in">
+ <desc>The id of instance in the Cloud.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="pauseInstance">
+ <desc>
+ Pause an existing instance with passed id.
+ </desc>
+ <param name="uid" type="wstring" dir="in">
+ <desc>The id of instance in the Cloud.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="terminateInstance">
+ <desc>
+ Terminate an existing instance with passed id.
+ </desc>
+ <param name="uid" type="wstring" dir="in">
+ <desc>the id of instance in the Cloud.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="resetInstance">
+ <desc>
+ Reset an existing instance with passed id.
+ </desc>
+ <param name="uid" type="wstring" dir="in">
+ <desc>The id of instance in the Cloud.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="createImage">
+ <desc>
+ Create an image in the Cloud.
+ </desc>
+ <param name="parameters" type="wstring" dir="in" safearray="yes">
+ <desc>Each parameter in the array must be in the form "name=value".</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="exportImage">
+ <desc>
+ Export an existing VBox image in the Cloud.
+ </desc>
+ <param name="image" type="IMedium" dir="in">
+ <desc>Reference to the existing VBox image.</desc>
+ </param>
+ <param name="parameters" type="wstring" dir="in" safearray="yes">
+ <desc>Each parameter in the array must be in the form "name=value".</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="importImage">
+ <desc>
+ Import an existing image in the Cloud to the local host.
+ </desc>
+ <param name="uid" type="wstring" dir="in">
+ <desc>the id of image in the Cloud.</desc>
+ </param>
+ <param name="parameters" type="wstring" dir="in" safearray="yes">
+ <desc>Each parameter in the array must be in the form "name=value".</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="deleteImage">
+ <desc>
+ Delete an existing image with passed id from the Cloud.
+ </desc>
+ <param name="uid" type="wstring" dir="in">
+ <desc>The id of image in the Cloud.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="getImageInfo" const="yes">
+ <desc>
+ Returns the information about an image in the Cloud.
+ </desc>
+ <param name="uid" type="wstring" dir="in">
+ <desc>The id of image in the Cloud.</desc>
+ </param>
+ <param name="infoArray" type="IStringArray" dir="out">
+ <desc>
+ An array where the image settings or properties is returned.
+ Each parameter in the array must be in the form "name=value".
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="startCloudNetworkGateway">
+ <param name="network" type="ICloudNetwork" dir="in">
+ <desc>The id of image in the Cloud.</desc>
+ </param>
+ <param name="sshPublicKey" type="wstring" dir="in">
+ <desc>The id of image in the Cloud.</desc>
+ </param>
+ <param name="gatewayInfo" type="ICloudNetworkGatewayInfo" dir="out">
+ <desc>Information about the started gateway.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="setupCloudNetworkEnvironment">
+ <param name="tunnelNetworkName" type="wstring" dir="in">
+ <desc>The name of tunnelling network to be created in the Cloud. If this parameter
+ is empty the default value "VirtualBox Tunneling Network" is assumed.</desc>
+ </param>
+ <param name="tunnelNetworkRange" type="wstring" dir="in">
+ <desc>The IP address range of tunnelling network to be created in the Cloud. If this
+ parameter is empty the default value "10.0.0.0/16" is assumed.</desc>
+ </param>
+ <param name="gatewayOsName" type="wstring" dir="in">
+ <desc>The name of the operating system to be used for cloud gateway instances.
+ The default value is "Oracle Linux".</desc>
+ </param>
+ <param name="gatewayOsVersion" type="wstring" dir="in">
+ <desc>The version of the operating system to be used for cloud gateway instances.
+ The default value is "7.8".</desc>
+ </param>
+ <param name="gatewayShape" type="wstring" dir="in">
+ <desc>The shape of cloud gateway instance. The default value is "VM.Standard2.1".</desc>
+ </param>
+ <param name="networkEnvironmentInfo" type="ICloudNetworkEnvironmentInfo" dir="out">
+ <desc>Information about the created network environment.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation completion.</desc>
+ </param>
+ </method>
+
+ <method name="getVnicInfo" const="yes">
+ <desc>
+ Returns the information about Vnic in the Cloud.
+ </desc>
+ <param name="uid" type="wstring" dir="in">
+ <desc>The id of vnic in the Cloud.</desc>
+ </param>
+ <param name="infoArray" type="IStringArray" dir="out">
+ <desc>
+ An array where the Vnic settings/properties is returned.
+ Each parameter in the array must be in the form "name=value".
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+ <method name="getSubnetSelectionForm">
+ <param name="description" type="IVirtualSystemDescription" dir="in">
+ <desc>
+ Virtual system description to be edited.
+ </desc>
+ </param>
+ <param name="form" type="IVirtualSystemDescriptionForm" dir="out">
+ <desc>
+ An IForm instance for editing the virtual system description.
+ </desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>
+ Progress object to track the operation completion.
+ </desc>
+ </param>
+ </method>
+
+
+ </interface>
+
+ <!--
+ // ICloudProfile
+ //////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="ICloudProfile" extends="$unknown"
+ uuid="b1d978b8-f7b7-4b05-900e-2a9253c00f51"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+
+ <attribute name="name" type="wstring">
+ <desc>
+ Returns the profile name.
+ </desc>
+ </attribute>
+
+ <attribute name="providerId" type="uuid" mod="string" readonly="yes">
+ <desc>
+ Returns provider identifier tied with this profile.
+ </desc>
+ </attribute>
+
+ <method name="getProperty" const="yes">
+ <desc>
+ Returns the value of the cloud profile property with the given name.
+
+ If the requested data @a name does not exist, this function will
+ succeed and return an empty string in the @a value argument.
+
+ <result name="E_INVALIDARG">@a name is @c null or empty.</result>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the property to get.</desc>
+ </param>
+ <param name="value" type="wstring" dir="return">
+ <desc>Current property value.</desc>
+ </param>
+ </method>
+
+ <method name="setProperty" const="yes">
+ <desc>
+ Sets the value of the cloud profile property with the given name.
+
+ Setting the property value to @c null or an empty string is equivalent
+ to deleting the existing value.
+
+ <result name="E_INVALIDARG">@a name is @c null or empty.</result>
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the property to set.</desc>
+ </param>
+ <param name="value" type="wstring" dir="in">
+ <desc>Property value to set.</desc>
+ </param>
+ </method>
+
+ <method name="getProperties" const="yes">
+ <desc>
+ Returns values for a group of properties in one call.
+
+ The names of the properties to get are specified using the @a names
+ argument which is a list of comma-separated property names or
+ an empty string if all properties are to be returned.
+ <note>Currently the value of this argument is ignored and the method
+ always returns all existing properties.</note>
+
+ The method returns two arrays, the array of property names corresponding
+ to the @a names argument and the current values of these properties.
+ Both arrays have the same number of elements with each element at the
+ given index in the first array corresponds to an element at the same
+ index in the second array.
+ </desc>
+ <param name="names" type="wstring" dir="in">
+ <desc>
+ Names of properties to get.
+ </desc>
+ </param>
+ <param name="returnNames" type="wstring" safearray="yes" dir="out">
+ <desc>Names of returned properties.</desc>
+ </param>
+ <param name="returnValues" type="wstring" safearray="yes" dir="return">
+ <desc>Values of returned properties.</desc>
+ </param>
+ </method>
+
+ <method name="setProperties">
+ <desc>
+ Updates profile, changing/adding/removing properties.
+
+ The names of the properties to set are passed in the @a names
+ array along with the new values for them in the @a values array. Both
+ arrays have the same number of elements with each element at the given
+ index in the first array corresponding to an element at the same index
+ in the second array.
+
+ If there is at least one property name in @a names that is not valid,
+ the method will fail before changing the values of any other properties
+ from the @a names array.
+
+ Using this method over <link to="#setProperty"/> is preferred if you
+ need to set several properties at once since it is more efficient.
+
+ Setting the property value to @c null or an empty string is equivalent
+ to deleting the existing value.
+ </desc>
+ <param name="names" type="wstring" safearray="yes" dir="in">
+ <desc>Names of properties.</desc>
+ </param>
+ <param name="values" type="wstring" safearray="yes" dir="in">
+ <desc>Values of set properties.</desc>
+ </param>
+ </method>
+
+ <method name="remove">
+ <desc>
+ Deletes a profile.
+ </desc>
+ </method>
+
+ <method name="createCloudClient">
+ <desc>
+ Creates a cloud client for this cloud profile.
+ </desc>
+ <param name="cloudClient" type="ICloudClient" dir="return">
+ <desc>
+ The cloud client object reference.
+ </desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <!--
+ // ICloudProvider
+ //////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="ICloudProvider" extends="$unknown"
+ uuid="22363cfc-07da-41ec-ac4a-3dd99db35594"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="8" reservedAttributes="16"
+ >
+
+ <attribute name="name" type="wstring" readonly="yes">
+ <desc>Returns the long name of the provider. Includes vendor and precise
+ product name spelled out in the preferred way.</desc>
+ </attribute>
+
+ <attribute name="shortName" type="wstring" readonly="yes">
+ <desc>Returns the short name of the provider. Less than 8 ASCII chars,
+ using acronyms. No vendor name, but can contain a hint if it's a 3rd
+ party implementation for this cloud provider, to keep it unique.</desc>
+ </attribute>
+
+ <attribute name="id" type="uuid" mod="string" readonly="yes">
+ <desc>Returns the UUID of this cloud provider.</desc>
+ </attribute>
+
+ <!-- if there are any generally useful, static pieces of information about
+ a particular cloud provider, please add them here. Maybe a description
+ of the functionality of the cloud provider implementation?-->
+
+ <attribute name="profiles" type="ICloudProfile" safearray="yes" readonly="yes">
+ <desc>Returns all profiles for this cloud provider.</desc>
+ </attribute>
+
+ <attribute name="profileNames" type="wstring" safearray="yes" readonly="yes">
+ <desc>Returns all profile names for this cloud provider.</desc>
+ </attribute>
+
+ <attribute name="supportedPropertyNames" type="wstring" safearray="yes" readonly="yes">
+ <desc>
+ Returns the supported property names.
+ </desc>
+ </attribute>
+
+ <method name="getPropertyDescription" const="yes">
+ <param name="name" type="wstring" dir="in">
+ <desc>Property name.</desc>
+ </param>
+ <param name="description" type="wstring" dir="return">
+ <desc>Property description.</desc>
+ </param>
+ </method>
+
+ <method name="createProfile">
+ <desc>
+ Creates a new profile.
+ </desc>
+ <param name="profileName" type="wstring" dir="in">
+ <desc>
+ The profile name. Must not exist, otherwise an error is raised.
+ </desc>
+ </param>
+ <param name="names" type="wstring" safearray="yes" dir="in">
+ <desc>Names of properties.</desc>
+ </param>
+ <param name="values" type="wstring" safearray="yes" dir="in">
+ <desc>Values of set properties.</desc>
+ </param>
+ </method>
+
+ <method name="importProfiles">
+ <desc>
+ Import the profiles from the original source
+ </desc>
+ </method>
+
+ <method name="restoreProfiles">
+ <desc>
+ Restores the old local profiles if they exist
+ </desc>
+ </method>
+
+ <method name="saveProfiles">
+ <desc>
+ Saves the local profiles
+ </desc>
+ </method>
+
+ <method name="getProfileByName">
+ <param name="profileName" type="wstring" dir="in"/>
+ <param name="profile" type="ICloudProfile" dir="return"/>
+ </method>
+
+ <method name="prepareUninstall" wrap-hint-server="passcaller">
+ <desc>
+ The caller requests the cloud provider to cease operation. Should
+ return an error if this is currently not possible (due to ongoing
+ cloud activity, possibly by a different API client). However, this
+ must not wait for the completion for a larger amount of time (ideally
+ stays below a second of execution time). If this succeeds it should
+ leave the cloud provider in a state which does not allow starting new
+ operations.
+ </desc>
+ </method>
+
+ </interface>
+
+ <!--
+ // ICloudProviderManager
+ //////////////////////////////////////////////////////////////////////////
+ -->
+ <interface
+ name="ICloudProviderManager" extends="$unknown"
+ uuid="9128800f-762e-4120-871c-a2014234a607"
+ wsmap="managed"
+ rest="managed"
+ reservedMethods="4" reservedAttributes="8"
+ >
+
+ <attribute name="providers" type="ICloudProvider" safearray="yes" readonly="yes">
+ <desc>Returns all supported cloud providers.</desc>
+ </attribute>
+
+ <method name="getProviderById">
+ <param name="providerId" type="uuid" mod="string" dir="in"/>
+ <param name="provider" type="ICloudProvider" dir="return"/>
+ </method>
+
+ <method name="getProviderByShortName">
+ <param name="providerName" type="wstring" dir="in"/>
+ <param name="provider" type="ICloudProvider" dir="return"/>
+ </method>
+
+ <method name="getProviderByName">
+ <param name="providerName" type="wstring" dir="in"/>
+ <param name="provider" type="ICloudProvider" dir="return"/>
+ </method>
+
+ </interface>
+
+ <interface name="ICloudProviderListChangedEvent" extends="IEvent"
+ uuid="a54d9cca-f23f-11ea-9755-efd0f1f792d9"
+ wsmap="managed" autogen="VBoxEvent"
+ id="OnCloudProviderListChanged"
+ >
+ <desc>
+ Each individual provider that is installed or uninstalled is
+ reported as an <link to="ICloudProviderRegisteredEvent"/>. When
+ the batch is done this event is sent and listerns can get the
+ new list.
+ </desc>
+ <attribute name="registered" type="boolean" readonly="yes"/>
+ </interface>
+
+ <interface name="ICloudProviderRegisteredEvent" extends="IEvent"
+ uuid="e28e227a-f231-11ea-9641-9b500c6d5365"
+ wsmap="managed" autogen="VBoxEvent"
+ id="OnCloudProviderRegistered"
+ >
+ <desc>
+ A cloud provider was installed or uninstalled.
+ See also <link to="ICloudProviderListChangedEvent"/>.
+ </desc>
+ <attribute name="id" type="uuid" mod="string" readonly="yes"/>
+ <attribute name="registered" type="boolean" readonly="yes"/>
+ </interface>
+
+ <interface name="ICloudProviderUninstallEvent" extends="IEvent"
+ uuid="f01f1066-f231-11ea-8eee-33bb2afb0b6e"
+ wsmap="managed" autogen="VBoxEvent"
+ id="OnCloudProviderCanUninstall" waitable="yes"
+ >
+ <desc>
+ A cloud provider is about to be uninstalled.
+ Unlike <link to="ICloudProviderRegisteredEvent"/> this one is
+ waitable and is sent <i>before</i> an attempt is made to
+ uninstall a provider. Listerns should release references to the
+ provider and related objects if they have any, or the
+ uninstallation of the provider is going to fail because it's
+ still in use.
+ </desc>
+ <attribute name="id" type="uuid" mod="string" readonly="yes"/>
+ </interface>
+
+ <!-- not autogenerated, @id is just for reference -->
+ <interface name="ICloudProfileRegisteredEvent" extends="IEvent"
+ uuid="6a5e65ba-eeb9-11ea-ae38-73242bc0f172"
+ wsmap="managed"
+ id="OnCloudProfileRegistered"
+ >
+ <attribute name="providerId" type="uuid" mod="string" readonly="yes"/>
+ <attribute name="name" type="wstring" readonly="yes"/>
+ <attribute name="registered" type="boolean" readonly="yes"/>
+ </interface>
+
+ <!-- not autogenerated, @id is just for reference -->
+ <interface name="ICloudProfileChangedEvent" extends="IEvent"
+ uuid="83795a4c-fce1-11ea-8a17-636028ae0be2"
+ wsmap="managed"
+ id="OnCloudProfileChanged"
+ >
+ <attribute name="providerId" type="uuid" mod="string" readonly="yes"/>
+ <attribute name="name" type="wstring" readonly="yes"/>
+ </interface>
+
+ <interface name="ILanguageChangedEvent" extends="IEvent"
+ uuid="28935887-782b-4c94-8410-ce557b9cfe44"
+ wsmap="managed" autogen="VBoxEvent"
+ id="OnLanguageChanged"
+ >
+ <attribute name="languageId" type="wstring" readonly="yes"/>
+ </interface>
+
+ <module name="VBoxSVC" context="LocalServer">
+ <class name="VirtualBox" uuid="B1A7A4F2-47B9-4A1E-82B2-07CCD5323C3F"
+ namespace="virtualbox.org">
+ <interface name="IVirtualBox" default="yes"/>
+ </class>
+ </module>
+
+ <module name="VBoxC" context="InprocServer" threadingModel="Free">
+ <class name="VirtualBoxClient" uuid="dd3fc71d-26c0-4fe1-bf6f-67f633265bba"
+ namespace="virtualbox.org">
+ <interface name="IVirtualBoxClient" default="yes"/>
+ </class>
+
+ <class name="Session" uuid="3C02F46D-C9D2-4F11-A384-53F0CF917214"
+ namespace="virtualbox.org">
+ <interface name="ISession" default="yes"/>
+ </class>
+ </module>
+
+</application>
+
+<if target="midl">
+<!-- Pay attention! Application uuid of this application is used in midl.xsl
+ So if you change it then change filter in "interface" and "class" template in midl.xsl too
+-->
+<application
+ name="VirtualBox System Service"
+ uuid="ec0e78e8-fa43-43e8-ac0a-02c784c4a4fa"
+ supportsErrorInfo="yes"
+>
+
+ <!--
+ // IVBoxSVC
+ // Note! This actually extends IUnknown rather than IDispatch, notdual=yes
+ // sees to that.
+ //////////////////////////////////////////////////////////////////////////
+ -->
+ <interface
+ name="IVBoxSVCRegistration" extends="$unknown" notdual="yes"
+ uuid="9e106366-4521-44cc-df95-186e4d057c83"
+ wsmap="suppress" internal="yes"
+ reservedMethods="0" reservedAttributes="0"
+ >
+ <desc>
+ Implemented by the VirtualBox class factory and registered with VBoxSDS
+ so it can retrieve IVirtualBox on behalf of other VBoxSVCs.
+ </desc>
+
+ <method name="getVirtualBox" >
+ <desc> Gets an IUnknown interface to the VirtualBox object in the VBoxSVC process. </desc>
+ <param name="result" type="$unknown" dir="return" >
+ <desc> Where to return the IUnknown interface. </desc>
+ </param>
+ </method>
+
+ </interface>
+
+ <!--
+ // IVirtualBoxSDS
+ // Note! This actually extends IUnknown rather than IDispatch, notdual=yes
+ // sees to that.
+ //////////////////////////////////////////////////////////////////////////
+ -->
+
+ <interface
+ name="IVirtualBoxSDS" extends="$unknown" notdual="yes"
+ uuid="890ed3dc-cc19-43fa-8ebf-baecb6b9ec87"
+ wsmap="suppress" internal="yes"
+ reservedMethods="0" reservedAttributes="0"
+ >
+ <desc>
+ The IVirtualBoxSDS interface represents the system-wide directory service
+ helper.
+
+ It exists only on Windows host, and its purpose is to work around design
+ flaws in Microsoft's (D)COM, in particular the local server instantiation
+ behavior.
+ </desc>
+
+ <method name="registerVBoxSVC">
+ <desc>
+ Registers a VBoxSVC instance with VBoxSDS. If the caller is not running
+ in a Windows 0 session, the method attempts to run VBoxSVC in that
+ session.
+ <result name="E_PENDING">
+ The caller is not running in a Windows session 0 and no VBoxSVC
+ is registered. VBoxSVC registration begins in Windows session 0.
+ You should call this method again later.
+ </result>
+ </desc>
+ <param name="vboxSVC" type="IVBoxSVCRegistration" dir="in">
+ <desc>Interface implemented by the VirtualBox class factory.</desc>
+ </param>
+ <param name="pid" type="long" dir="in">
+ <desc>The process ID of the VBoxSVC instance.</desc>
+ </param>
+ <param name="existingVirtualBox" type="$unknown" dir="return">
+ <desc>If there is already an VBoxSVC for this user, the an IUnknown
+ interface to its VirtualBox object is returned here, otherwise it
+ is set to NULL.</desc>
+ </param>
+ </method>
+
+ <method name="deregisterVBoxSVC">
+ <desc>Registers a VBoxSVC instance with the SDS.</desc>
+ <param name="vboxSVC" type="IVBoxSVCRegistration" dir="in">
+ <desc>Same as specified during registration.</desc>
+ </param>
+ <param name="pid" type="long" dir="in">
+ <desc>The process ID of the VBoxSVC instance (same as during registration).</desc>
+ </param>
+ </method>
+
+ <method name="launchVMProcess">
+ <desc>
+ Spawns a new process that will execute the virtual machine in the interactive
+ windows session of calling user. Any additional checks are performed by created
+ process itself
+
+ If launching the VM succeeds, the new VM process will create its own session
+ and write-lock the machine for it, preventing conflicting changes from other
+ processes. If the machine is already locked (because it is already running or
+ because another session has a write lock), launching the VM process will therefore
+ fail. Reversely, future attempts to obtain a write lock will also fail while the
+ machine is running.
+
+ Launching a VM process can take some time (a new VM is started in a new process,
+ for which memory and other resources need to be set up) but the method does
+ not wait for completion and just returns the PID of created process.
+
+ <result name="E_INVALIDARG">
+ Some of the parameters are invalid.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ Launching process for machine failed.
+ </result>
+ </desc>
+ <param name="machine" type="wstring" dir="in">
+ <desc>
+ The name or id of the machine the VM will start for.
+ </desc>
+ </param>
+ <param name="comment" type="wstring" dir="in">
+ <desc>
+ The comment for VM.
+ </desc>
+ </param>
+ <param name="frontend" type="wstring" dir="in">
+ <desc>
+ Front-end to use for the new VM process. The following are currently supported:
+ <ul>
+ <li><tt>"gui"</tt>: VirtualBox Qt GUI front-end</li>
+ <li><tt>"headless"</tt>: VBoxHeadless (VRDE Server) front-end</li>
+ <li><tt>"sdl"</tt>: VirtualBox SDL front-end</li>
+ <li><tt>""</tt>: use the per-VM default frontend if set, otherwise
+ the global default defined in the system properties. If neither
+ are set, the API will launch a <tt>"gui"</tt> session, which may
+ fail if there is no windowing environment available. See
+ <link to="IMachine::defaultFrontend"/> and
+ <link to="ISystemProperties::defaultFrontend"/>.</li>
+ </ul>
+ </desc>
+ </param>
+ <param name="environmentChanges" type="wstring" safearray="yes" dir="in">
+ <desc>
+ The list of putenv-style changes to the VM process environment.
+ See <link to="IMachine::launchVMProcess" /> for details.
+ </desc>
+ </param>
+ <param name="cmdOptions" type="wstring" dir="in">
+ <desc>
+ Additional command line options to pass to the VM process.
+ </desc>
+ </param>
+ <param name="sessionId" type="unsigned long" dir="in">
+ <desc>
+ Windows session where the VM process should be launched.
+ </desc>
+ </param>
+ <param name="pid" type="unsigned long" dir="return">
+ <desc>The PID of created process.</desc>
+ </param>
+ </method>
+
+ </interface>
+
+<!-- Warning: the name of module should coincide with real windows service name.
+ VirtualBox_Typelib.xsl and VirtualBox_TypeLibWithInterfaces.xsl uses this name to make list of COM registration
+ actions in Wix. Installer will not able to register COM windows service properly if the name of module
+ differs from SCM windows service name.
+ The Name of windows service is referenced in different places.
+ Don't forget to change it in other places too If you change it here :
+ VBoxMergeApp.wxi (cp_VBoxSDS component),
+ VBoxSDS.cpp and VBoxProxyStub.cpp
+ -->
+ <module name="VBoxSDS" context="LocalService">
+ <class name="VirtualBoxSDS" uuid="74ab5ffe-8726-4435-aa7e-876d705bcba5"
+ namespace="virtualbox.org">
+ <interface name="IVirtualBoxSDS" default="yes"/>
+ </class>
+ </module>
+</application>
+</if>
+
+</library>
+
+</idl>
+
+
+<!-- vim: set shiftwidth=2 tabstop=2 expandtab: -->
diff --git a/src/VBox/Main/idl/apiwrap-server-filelist.xsl b/src/VBox/Main/idl/apiwrap-server-filelist.xsl
new file mode 100644
index 00000000..ea231014
--- /dev/null
+++ b/src/VBox/Main/idl/apiwrap-server-filelist.xsl
@@ -0,0 +1,192 @@
+<?xml version="1.0"?>
+
+<!--
+ apiwrap-server-filelist.xsl:
+
+ XSLT stylesheet that generate a makefile include with
+ the lists of files that apiwrap-server.xsl produces
+ from VirtualBox.xidl.
+-->
+<!--
+ Copyright (C) 2015-2023 Oracle and/or its affiliates.
+
+ This file is part of VirtualBox base platform packages, as
+ available from https://www.virtualbox.org.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, in version 3 of the
+ License.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <https://www.gnu.org/licenses>.
+
+ SPDX-License-Identifier: GPL-3.0-only
+-->
+
+<xsl:stylesheet
+ version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ extension-element-prefixes="exsl">
+
+<xsl:output method="text"/>
+
+<xsl:strip-space elements="*"/>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ XSLT parameters
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<!-- Whether to generate wrappers for VBoxSDS-->
+<xsl:param name="g_fVBoxWithSDS" select="'no'"/>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ global XSLT variables
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:variable name="G_sNewLine">
+ <xsl:choose>
+ <xsl:when test="$KBUILD_HOST = 'win'">
+ <xsl:value-of select="'&#13;&#10;'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="'&#10;'"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ wildcard match, ignore everything which has no explicit match
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template match="*" mode="filelist-even-sources"/>
+<xsl:template match="*" mode="filelist-odd-sources"/>
+<xsl:template match="*" mode="filelist-headers"/>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ interface match
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template match="interface" mode="filelist-even-sources">
+ <xsl:if test="not(@internal='yes') and not(@autogen='VBoxEvent') and not(@supportsErrorInfo='no') and (position() mod 2) = 0">
+ <xsl:value-of select="concat(' \', $G_sNewLine, '&#9;$(VBOX_MAIN_APIWRAPPER_DIR)/', substring(@name, 2), 'Wrap.cpp')"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="interface" mode="filelist-odd-sources">
+ <xsl:if test="not(@internal='yes') and not(@autogen='VBoxEvent') and not(@supportsErrorInfo='no') and (position() mod 2) = 1">
+ <xsl:value-of select="concat(' \', $G_sNewLine, '&#9;$(VBOX_MAIN_APIWRAPPER_DIR)/', substring(@name, 2), 'Wrap.cpp')"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="interface" mode="filelist-headers">
+ <xsl:if test="not(@internal='yes') and not(@autogen='VBoxEvent') and not(@supportsErrorInfo='no')">
+ <xsl:value-of select="concat(' \', $G_sNewLine, '&#9;$(VBOX_MAIN_APIWRAPPER_DIR)/', substring(@name, 2), 'Wrap.h')"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ ignore all if tags except those for XPIDL or MIDL target
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template match="if" mode="filelist-even-sources">
+ <xsl:if test="(@target = 'xpidl') or (@target = 'midl')">
+ <xsl:apply-templates mode="filelist-even-sources"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="if" mode="filelist-odd-sources">
+ <xsl:if test="(@target = 'xpidl') or (@target = 'midl')">
+ <xsl:apply-templates mode="filelist-odd-sources"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="if" mode="filelist-headers">
+ <xsl:if test="(@target = 'xpidl') or (@target = 'midl')">
+ <xsl:apply-templates mode="filelist-headers"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ application match
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template match="application" mode="filelist-even-sources" name="template_app_filelist_even_sources">
+ <xsl:apply-templates mode="filelist-even-sources"/>
+</xsl:template>
+
+<xsl:template match="application" mode="filelist-odd-sources" name="template_app_filelist_odd_sources">
+ <xsl:apply-templates mode="filelist-odd-sources"/>
+</xsl:template>
+
+<xsl:template match="application" mode="filelist-headers" name="template_app_filelist_headers">
+ <xsl:apply-templates mode="filelist-headers"/>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ library match
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template match="library" mode="filelist-even-sources">
+ <xsl:apply-templates mode="filelist-even-sources"/>
+</xsl:template>
+
+<xsl:template match="library" mode="filelist-odd-sources">
+ <xsl:apply-templates mode="filelist-odd-sources"/>
+</xsl:template>
+
+<xsl:template match="library" mode="filelist-headers">
+ <xsl:apply-templates mode="filelist-headers"/>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ root match
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template match="/idl">
+ <xsl:text>VBOX_MAIN_APIWRAPPER_GEN_SRCS_EVEN := </xsl:text>
+ <xsl:apply-templates mode="filelist-even-sources"/>
+ <xsl:value-of select="concat($G_sNewLine, $G_sNewLine)"/>
+
+ <xsl:text>VBOX_MAIN_APIWRAPPER_GEN_SRCS_ODD := </xsl:text>
+ <xsl:apply-templates mode="filelist-odd-sources"/>
+ <xsl:value-of select="concat($G_sNewLine, $G_sNewLine)"/>
+
+ <xsl:text>VBOX_MAIN_APIWRAPPER_GEN_SRCS := $(VBOX_MAIN_APIWRAPPER_GEN_SRCS_EVEN) $(VBOX_MAIN_APIWRAPPER_GEN_SRCS_ODD)</xsl:text>
+ <xsl:value-of select="concat($G_sNewLine, $G_sNewLine)"/>
+
+ <xsl:text>VBOX_MAIN_APIWRAPPER_GEN_HDRS := </xsl:text>
+ <xsl:apply-templates mode="filelist-headers"/>
+ <xsl:value-of select="concat($G_sNewLine, $G_sNewLine)"/>
+</xsl:template>
+
+
+ <xsl:template match="application[@uuid='ec0e78e8-fa43-43e8-ac0a-02c784c4a4fa']" mode="filelist-even-sources" >
+ <xsl:if test="$g_fVBoxWithSDS='yes'" >
+ <xsl:call-template name="template_app_filelist_even_sources" />
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="application[@uuid='ec0e78e8-fa43-43e8-ac0a-02c784c4a4fa']" mode="filelist-headers" >
+ <xsl:if test="$g_fVBoxWithSDS='yes'" >
+ <xsl:call-template name="template_app_filelist_headers" />
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="application[@uuid='ec0e78e8-fa43-43e8-ac0a-02c784c4a4fa']" mode="filelist-odd-sources" >
+ <xsl:if test="$g_fVBoxWithSDS='yes'" >
+ <xsl:call-template name="template_app_filelist_odd_sources" />
+ </xsl:if>
+ </xsl:template>
+
+
+</xsl:stylesheet>
+<!-- vi: set tabstop=4 shiftwidth=4 expandtab: -->
+
diff --git a/src/VBox/Main/idl/apiwrap-server.xsl b/src/VBox/Main/idl/apiwrap-server.xsl
new file mode 100644
index 00000000..a864a2bd
--- /dev/null
+++ b/src/VBox/Main/idl/apiwrap-server.xsl
@@ -0,0 +1,2592 @@
+<?xml version="1.0"?>
+
+<!--
+ apiwrap-server.xsl:
+ XSLT stylesheet that generates C++ API wrappers (server side) from
+ VirtualBox.xidl.
+-->
+<!--
+ Copyright (C) 2010-2023 Oracle and/or its affiliates.
+
+ This file is part of VirtualBox base platform packages, as
+ available from https://www.virtualbox.org.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, in version 3 of the
+ License.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <https://www.gnu.org/licenses>.
+
+ SPDX-License-Identifier: GPL-3.0-only
+-->
+
+<xsl:stylesheet
+ version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ extension-element-prefixes="exsl">
+
+<xsl:output method="text"/>
+
+<xsl:strip-space elements="*"/>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ global XSLT variables
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:variable name="G_xsltFilename" select="'apiwrap-server.xsl'"/>
+
+<xsl:variable name="G_root" select="/"/>
+
+<xsl:include href="typemap-shared.inc.xsl"/>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ Keys for more efficiently looking up of types.
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:key name="G_keyEnumsByName" match="//enum[@name]" use="@name"/>
+<xsl:key name="G_keyInterfacesByName" match="//interface[@name]" use="@name"/>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+templates for file separation
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template match="interface" mode="startfile">
+ <xsl:param name="file"/>
+
+ <xsl:call-template name="xsltprocNewlineOutputHack"/>
+ <xsl:value-of select="concat($G_sNewLine, '// ##### BEGINFILE &quot;', $file, '&quot;', $G_sNewLine)"/>
+</xsl:template>
+
+<xsl:template match="interface" mode="endfile">
+ <xsl:param name="file"/>
+
+ <xsl:value-of select="concat($G_sNewLine, '// ##### ENDFILE &quot;', $file, '&quot;', $G_sNewLine)"/>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+templates for file headers/footers
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template name="fileheader">
+ <xsl:param name="class"/>
+ <xsl:param name="name"/>
+ <xsl:param name="type"/>
+
+ <xsl:text>/** @file
+</xsl:text>
+ <xsl:value-of select="concat(' * VirtualBox API class wrapper ', $type, ' for I', $class, '.')"/>
+ <xsl:text>
+ *
+ * DO NOT EDIT! This is a generated file.
+ * Generated from: src/VBox/Main/idl/VirtualBox.xidl
+ * Generator: src/VBox/Main/idl/apiwrap-server.xsl
+ */
+
+/*
+ * Copyright (C) 2010-2023 Oracle and/or its affiliates.
+ *
+ * This file is part of VirtualBox base platform packages, as
+ * available from https://www.virtualbox.org.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, in version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see &lt;https://www.gnu.org/licenses&gt;.
+ *
+ * SPDX-License-Identifier: GPL-3.0-only
+ */
+
+</xsl:text>
+</xsl:template>
+
+<!-- Emits COM_INTERFACE_ENTRY statements for the current interface node and whatever it inherits from. -->
+<xsl:template name="emitCOMInterfaces">
+ <xsl:value-of select="concat(' COM_INTERFACE_ENTRY(', @name, ')' , $G_sNewLine)"/>
+ <!-- now recurse to emit all base interfaces -->
+ <xsl:variable name="extends" select="@extends"/>
+ <xsl:if test="$extends and not($extends='$unknown') and not($extends='$errorinfo')">
+ <xsl:for-each select="key('G_keyInterfacesByName', $extends)">
+ <xsl:call-template name="emitCOMInterfaces"/>
+ </xsl:for-each>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="interface" mode="classheader">
+ <xsl:param name="addinterfaces"/>
+ <xsl:value-of select="concat('#ifndef ', substring(@name, 2), 'Wrap_H_', $G_sNewLine)"/>
+ <xsl:value-of select="concat('#define ', substring(@name, 2), 'Wrap_H_')"/>
+ <xsl:text>
+#ifndef RT_WITHOUT_PRAGMA_ONCE
+# pragma once
+#endif
+
+#include "VirtualBoxBase.h"
+#include "Wrapper.h"
+
+</xsl:text>
+ <xsl:value-of select="concat('class ATL_NO_VTABLE ', substring(@name, 2), 'Wrap')"/>
+ <xsl:text>
+ : public VirtualBoxBase
+</xsl:text>
+ <xsl:value-of select="concat(' , VBOX_SCRIPTABLE_IMPL(', @name, ')')"/>
+ <xsl:value-of select="$G_sNewLine"/>
+ <xsl:for-each select="exsl:node-set($addinterfaces)/token">
+ <xsl:value-of select="concat(' , VBOX_SCRIPTABLE_IMPL(', text(), ')')"/>
+ <xsl:value-of select="$G_sNewLine"/>
+ </xsl:for-each>
+ <xsl:text>{
+ Q_OBJECT
+
+public:
+</xsl:text>
+ <xsl:value-of select="concat(' VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(', substring(@name, 2), 'Wrap, ', @name, ')', $G_sNewLine)"/>
+ <xsl:value-of select="concat(' DECLARE_NOT_AGGREGATABLE(', substring(@name, 2), 'Wrap)', $G_sNewLine)"/>
+ <xsl:text> DECLARE_PROTECT_FINAL_CONSTRUCT()
+
+</xsl:text>
+ <xsl:value-of select="concat(' BEGIN_COM_MAP(', substring(@name, 2), 'Wrap)', $G_sNewLine)"/>
+ <xsl:text> COM_INTERFACE_ENTRY(ISupportErrorInfo)
+</xsl:text>
+ <xsl:call-template name="emitCOMInterfaces"/>
+ <xsl:value-of select="concat(' COM_INTERFACE_ENTRY2(IDispatch, ', @name, ')', $G_sNewLine)"/>
+ <xsl:variable name="manualAddInterfaces">
+ <xsl:call-template name="checkoption">
+ <xsl:with-param name="optionlist" select="@wrap-hint-server"/>
+ <xsl:with-param name="option" select="'manualaddinterfaces'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="not($manualAddInterfaces = 'true')">
+ <xsl:for-each select="exsl:node-set($addinterfaces)/token">
+ <!-- This is super tricky, as the for-each switches to the node set,
+ which means the normal document isn't available any more. We get
+ the data we need, uses a for-each to switch document and then a
+ key() to look up the interface by name. -->
+ <xsl:variable name="addifname">
+ <xsl:value-of select="string(.)"/>
+ </xsl:variable>
+ <xsl:for-each select="$G_root">
+ <xsl:for-each select="key('G_keyInterfacesByName', $addifname)">
+ <xsl:call-template name="emitCOMInterfaces"/>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:if>
+ <xsl:value-of select="concat(' VBOX_TWEAK_INTERFACE_ENTRY(', @name, ')', $G_sNewLine)"/>
+ <xsl:text> END_COM_MAP()
+
+</xsl:text>
+ <xsl:value-of select="concat(' DECLARE_COMMON_CLASS_METHODS(', substring(@name, 2), 'Wrap)', $G_sNewLine)"/>
+</xsl:template>
+
+<xsl:template match="interface" mode="classfooter">
+ <xsl:param name="addinterfaces"/>
+ <xsl:if test="@wrap-gen-hook = 'yes'">
+ <xsl:text>
+public:
+ virtual void i_callHook(const char *a_pszFunction) { RT_NOREF_PV(a_pszFunction); }
+</xsl:text>
+ </xsl:if>
+ <xsl:text>
+private:
+ DECLARE_CLS_COPY_CTOR_ASSIGN_NOOP(</xsl:text>
+ <xsl:value-of select="concat(substring(@name, 2),'Wrap')"/>
+ <xsl:text>); /* Shuts up MSC warning C4625. */
+
+};
+
+</xsl:text>
+ <xsl:value-of select="concat('#endif // !', substring(@name, 2), 'Wrap_H_', $G_sNewLine)"/>
+</xsl:template>
+
+<xsl:template match="interface" mode="codeheader">
+ <xsl:param name="addinterfaces"/>
+ <xsl:value-of select="concat('#define LOG_GROUP LOG_GROUP_MAIN_', translate(substring(@name, 2), $G_lowerCase, $G_upperCase), $G_sNewLine, $G_sNewLine)"/>
+ <xsl:value-of select="concat('#include &quot;', substring(@name, 2), 'Wrap.h&quot;', $G_sNewLine)"/>
+ <xsl:text>#include "LoggingNew.h"
+#ifdef VBOX_WITH_DTRACE_R3_MAIN
+# include "dtrace/VBoxAPI.h"
+#endif
+
+</xsl:text>
+</xsl:template>
+
+<xsl:template name="emitISupports">
+ <xsl:param name="classname"/>
+ <xsl:param name="extends"/>
+ <xsl:param name="addinterfaces"/>
+ <xsl:param name="depth"/>
+ <xsl:param name="interfacelist"/>
+
+ <xsl:choose>
+ <xsl:when test="$extends and not($extends='$unknown') and not($extends='$errorinfo')">
+ <xsl:variable name="newextends" select="key('G_keyInterfacesByName', $extends)/@extends"/>
+ <xsl:variable name="newiflist" select="concat($interfacelist, ', ', $extends)"/>
+ <xsl:call-template name="emitISupports">
+ <xsl:with-param name="classname" select="$classname"/>
+ <xsl:with-param name="extends" select="$newextends"/>
+ <xsl:with-param name="addinterfaces" select="$addinterfaces"/>
+ <xsl:with-param name="depth" select="$depth + 1"/>
+ <xsl:with-param name="interfacelist" select="$newiflist"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="addinterfaces_ns" select="exsl:node-set($addinterfaces)"/>
+ <xsl:choose>
+ <xsl:when test="count($addinterfaces_ns/token) > 0">
+ <xsl:variable name="addifname" select="$addinterfaces_ns/token[1]"/>
+ <xsl:variable name="addif" select="key('G_keyInterfacesByName', $addifname)/@extends"/>
+ <xsl:variable name="newextends" select="$addif/@extends"/>
+ <xsl:variable name="newaddinterfaces" select="$addinterfaces_ns/token[position() > 1]"/>
+ <xsl:variable name="newiflist" select="concat($interfacelist, ', ', $addifname)"/>
+ <xsl:call-template name="emitISupports">
+ <xsl:with-param name="classname" select="$classname"/>
+ <xsl:with-param name="extends" select="$newextends"/>
+ <xsl:with-param name="addinterfaces" select="$newaddinterfaces"/>
+ <xsl:with-param name="depth" select="$depth + 1"/>
+ <xsl:with-param name="interfacelist" select="$newiflist"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat('NS_IMPL_THREADSAFE_ISUPPORTS', $depth, '_CI(', $classname, ', ', $interfacelist, ')', $G_sNewLine)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="interface" mode="codefooter">
+ <xsl:param name="addinterfaces"/>
+ <xsl:text>#ifdef VBOX_WITH_XPCOM
+</xsl:text>
+ <xsl:value-of select="concat('NS_DECL_CLASSINFO(', substring(@name, 2), 'Wrap)', $G_sNewLine)"/>
+
+ <xsl:variable name="manualAddInterfaces">
+ <xsl:call-template name="checkoption">
+ <xsl:with-param name="optionlist" select="@wrap-hint-server"/>
+ <xsl:with-param name="option" select="'manualaddinterfaces'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$manualAddInterfaces = 'true'">
+ <xsl:variable name="nulladdinterfaces"></xsl:variable>
+ <xsl:call-template name="emitISupports">
+ <xsl:with-param name="classname" select="concat(substring(@name, 2), 'Wrap')"/>
+ <xsl:with-param name="extends" select="@extends"/>
+ <xsl:with-param name="addinterfaces" select="$nulladdinterfaces"/>
+ <xsl:with-param name="depth" select="1"/>
+ <xsl:with-param name="interfacelist" select="@name"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="emitISupports">
+ <xsl:with-param name="classname" select="concat(substring(@name, 2), 'Wrap')"/>
+ <xsl:with-param name="extends" select="@extends"/>
+ <xsl:with-param name="addinterfaces" select="$addinterfaces"/>
+ <xsl:with-param name="depth" select="1"/>
+ <xsl:with-param name="interfacelist" select="@name"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>#endif // VBOX_WITH_XPCOM
+</xsl:text>
+</xsl:template>
+
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ templates for dealing with names and parameters
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template name="tospace">
+ <xsl:param name="str"/>
+ <xsl:value-of select="translate($str, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_', ' ')"/>
+</xsl:template>
+
+<xsl:template name="checkoption">
+ <xsl:param name="optionlist"/>
+ <xsl:param name="option"/>
+ <xsl:value-of select="string-length($option) > 0 and contains(concat(',', translate($optionlist, ' ', ''), ','), concat(',', $option, ','))"/>
+</xsl:template>
+
+<xsl:template name="getattrlist">
+ <xsl:param name="val"/>
+ <xsl:param name="separator" select="','"/>
+
+ <xsl:if test="$val and $val != ''">
+ <xsl:choose>
+ <xsl:when test="contains($val,$separator)">
+ <token>
+ <xsl:value-of select="substring-before($val,$separator)"/>
+ </token>
+ <xsl:call-template name="getattrlist">
+ <xsl:with-param name="val" select="substring-after($val,$separator)"/>
+ <xsl:with-param name="separator" select="$separator"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <token><xsl:value-of select="$val"/></token>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="translatepublictype">
+ <xsl:param name="type"/>
+ <xsl:param name="dir"/>
+ <xsl:param name="mod"/>
+
+ <xsl:choose>
+ <xsl:when test="$type='wstring' or $type='uuid'">
+ <xsl:if test="$dir='in'">
+ <xsl:text>IN_</xsl:text>
+ </xsl:if>
+ <xsl:text>BSTR</xsl:text>
+ </xsl:when>
+
+ <xsl:when test="$type='$unknown'">
+ <xsl:text>IUnknown *</xsl:text>
+ </xsl:when>
+
+ <xsl:when test="count(key('G_keyInterfacesByName', $type)) > 0">
+ <xsl:value-of select="concat($type, ' *')"/>
+ </xsl:when>
+
+ <xsl:when test="count(key('G_keyEnumsByName', $type)) > 0">
+ <xsl:value-of select="concat($type, '_T')"/>
+ </xsl:when>
+
+ <!-- Micro optimizations: Put off wraptypefield calculation as long as possible; Check interfaces before enums. -->
+ <xsl:otherwise>
+ <!-- get C++ glue type from IDL type from table in typemap-shared.inc.xsl -->
+ <xsl:variable name="gluetypefield" select="exsl:node-set($G_aSharedTypes)/type[@idlname=$type]/@gluename"/>
+ <xsl:choose>
+ <xsl:when test="string-length($gluetypefield)">
+ <xsl:value-of select="$gluetypefield"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="fatalError">
+ <xsl:with-param name="msg" select="concat('translatepublictype: Type &quot;', $type, '&quot; is not supported.')"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="$mod='ptr'">
+ <xsl:text> *</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="translatewrappedtype">
+ <xsl:param name="type"/>
+ <xsl:param name="dir"/>
+ <xsl:param name="mod"/>
+ <xsl:param name="safearray"/>
+
+ <xsl:choose>
+ <xsl:when test="$type='wstring'">
+ <xsl:if test="$dir='in' and not($safearray='yes')">
+ <xsl:text>const </xsl:text>
+ </xsl:if>
+ <xsl:text>com::Utf8Str &amp;</xsl:text>
+ </xsl:when>
+
+ <xsl:when test="$type='uuid'">
+ <xsl:if test="$dir='in'">
+ <xsl:text>const </xsl:text>
+ </xsl:if>
+ <xsl:text>com::Guid &amp;</xsl:text>
+ </xsl:when>
+
+ <xsl:when test="$type='$unknown'">
+ <xsl:if test="$dir='in' and not($safearray='yes')">
+ <xsl:text>const </xsl:text>
+ </xsl:if>
+ <xsl:text>ComPtr&lt;IUnknown&gt; &amp;</xsl:text>
+ </xsl:when>
+
+ <xsl:when test="count(key('G_keyInterfacesByName', $type)) > 0">
+ <xsl:if test="$dir='in' and not($safearray='yes')">
+ <xsl:text>const </xsl:text>
+ </xsl:if>
+ <xsl:value-of select="concat('ComPtr&lt;', $type, '&gt; &amp;')"/>
+ </xsl:when>
+
+ <xsl:when test="count(key('G_keyEnumsByName', $type)) > 0">
+ <xsl:value-of select="concat($type, '_T')"/>
+ </xsl:when>
+
+ <!-- Micro optimizations: Put off wraptypefield calculation as long as possible; Check interfaces before enums. -->
+ <xsl:otherwise>
+ <!-- get C++ wrap type from IDL type from table in typemap-shared.inc.xsl -->
+ <xsl:variable name="wraptypefield" select="exsl:node-set($G_aSharedTypes)/type[@idlname=$type]/@gluename"/>
+ <xsl:choose>
+ <xsl:when test="string-length($wraptypefield)">
+ <xsl:value-of select="$wraptypefield"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="fatalError">
+ <xsl:with-param name="msg" select="concat('translatewrappedtype: Type &quot;', $type, '&quot; is not supported.')"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="$mod='ptr'">
+ <xsl:text> *</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="translatefmtspectype">
+ <xsl:param name="type"/>
+ <xsl:param name="dir"/>
+ <xsl:param name="mod"/>
+ <xsl:param name="safearray"/>
+ <xsl:param name="isref"/>
+
+ <!-- get C format string for IDL type from table in typemap-shared.inc.xsl -->
+ <xsl:variable name="wrapfmt" select="exsl:node-set($G_aSharedTypes)/type[@idlname=$type]/@gluefmt"/>
+ <xsl:choose>
+ <xsl:when test="$mod='ptr' or ($isref='yes' and $dir!='in')">
+ <xsl:text>%p</xsl:text>
+ </xsl:when>
+ <xsl:when test="$safearray='yes'">
+ <xsl:text>%zu</xsl:text>
+ </xsl:when>
+ <xsl:when test="string-length($wrapfmt)">
+ <xsl:value-of select="$wrapfmt"/>
+ </xsl:when>
+ <xsl:when test="$type='$unknown'">
+ <xsl:text>%p</xsl:text>
+ </xsl:when>
+ <xsl:when test="count(key('G_keyEnumsByName', $type)) > 0">
+ <xsl:text>%RU32</xsl:text>
+ </xsl:when>
+ <xsl:when test="count(key('G_keyInterfacesByName', $type)) > 0">
+ <xsl:text>%p</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="fatalError">
+ <xsl:with-param name="msg" select="concat('translatefmtcpectype: Type &quot;', $type, '&quot; is not supported.')"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="translatedtracetype">
+ <xsl:param name="type"/>
+ <xsl:param name="dir"/>
+ <xsl:param name="mod"/>
+
+ <!-- get dtrace probe type from IDL type from table in typemap-shared.inc.xsl -->
+ <xsl:variable name="dtracetypefield" select="exsl:node-set($G_aSharedTypes)/type[@idlname=$type]/@dtracename"/>
+ <xsl:choose>
+ <xsl:when test="string-length($dtracetypefield)">
+ <xsl:value-of select="$dtracetypefield"/>
+ </xsl:when>
+ <xsl:when test="$type='$unknown'">
+ <!-- <xsl:text>struct IUnknown *</xsl:text> -->
+ <xsl:text>void *</xsl:text>
+ </xsl:when>
+ <xsl:when test="count(key('G_keyEnumsByName', $type)) > 0">
+ <!-- <xsl:value-of select="concat($type, '_T')"/> - later we can emit enums into dtrace the library -->
+ <xsl:text>int</xsl:text>
+ </xsl:when>
+ <xsl:when test="count(key('G_keyInterfacesByName', $type)) > 0">
+ <!--
+ <xsl:value-of select="concat('struct ', $type, ' *')"/>
+ -->
+ <xsl:text>void *</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="fatalError">
+ <xsl:with-param name="msg" select="concat('translatedtracetype Type &quot;', $type, '&quot; is not supported.')"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="$mod='ptr'">
+ <xsl:text> *</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ templates for handling entire interfaces and their contents
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<!-- Called on interface node. -->
+<xsl:template name="emitInterface">
+ <!-- sources, headers and dtrace-probes all needs attribute lists -->
+ <xsl:variable name="addinterfaces">
+ <xsl:call-template name="getattrlist">
+ <xsl:with-param name="val" select="@wrap-hint-server-addinterfaces"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- interface sanity check, prevents crashes -->
+ <xsl:if test="(count(attribute) + count(method) + sum(@reservedMethods[number()= number()]) + sum(@reservedAttributes[number()= number()])) = 0">
+ <xsl:message terminate="yes">
+ Interface <xsl:value-of select="@name"/> is empty which causes midl generated proxy
+ stubs to crash. Please add a dummy:<xsl:value-of select="$G_sNewLine"/>
+ &lt;attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/&gt;
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$generating = 'sources'">
+ <xsl:if test="(position() mod 2) = $reminder">
+ <xsl:call-template name="emitCode">
+ <xsl:with-param name="addinterfaces" select="$addinterfaces"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$generating = 'headers'">
+ <xsl:call-template name="emitHeader">
+ <xsl:with-param name="addinterfaces" select="$addinterfaces"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$generating = 'dtrace-probes'">
+ <xsl:call-template name="emitDTraceProbes">
+ <xsl:with-param name="addinterfaces" select="$addinterfaces"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise><xsl:message terminate="yes">Otherwise oops in emitInterface</xsl:message></xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Called on a method param or attribute node. -->
+<xsl:template name="emitPublicParameter">
+ <xsl:param name="dir"/>
+
+ <xsl:variable name="gluetype">
+ <xsl:call-template name="translatepublictype">
+ <xsl:with-param name="type" select="@type"/>
+ <xsl:with-param name="dir" select="$dir"/>
+ <xsl:with-param name="mod" select="@mod"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="@safearray='yes'">
+ <xsl:choose>
+ <xsl:when test="$dir='in'">
+ <xsl:text>ComSafeArrayIn(</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>ComSafeArrayOut(</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$gluetype"/>
+ <xsl:text>, a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>)</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$gluetype"/>
+ <xsl:if test="substring($gluetype,string-length($gluetype))!='*'">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:if test="$dir != 'in'">
+ <xsl:text>*</xsl:text>
+ </xsl:if>
+ <xsl:text>a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="attribute/@type | param/@type" mode="wrapped">
+ <xsl:param name="dir"/>
+
+ <xsl:variable name="wraptype">
+ <xsl:call-template name="translatewrappedtype">
+ <xsl:with-param name="type" select="."/>
+ <xsl:with-param name="dir" select="$dir"/>
+ <xsl:with-param name="mod" select="../@mod"/>
+ <xsl:with-param name="safearray" select="../@safearray"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="lastchar">
+ <xsl:value-of select="substring($wraptype, string-length($wraptype))"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="../@safearray='yes'">
+ <xsl:if test="$dir='in'">
+ <xsl:text>const </xsl:text>
+ </xsl:if>
+ <xsl:text>std::vector&lt;</xsl:text>
+ <xsl:choose>
+ <xsl:when test="$lastchar = '&amp;'">
+ <xsl:variable name="wraptype2">
+ <xsl:value-of select="substring($wraptype, 1, string-length($wraptype)-2)"/>
+ </xsl:variable>
+ <xsl:value-of select="$wraptype2"/>
+ <xsl:if test="substring($wraptype2,string-length($wraptype2)) = '&gt;'">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="lastchar = '&gt;'">
+ <xsl:value-of select="concat($wraptype, ' ')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$wraptype"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&gt; &amp;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$wraptype"/>
+ <xsl:if test="$lastchar != '&amp;'">
+ <xsl:if test="$lastchar != '*'">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:if test="$dir != 'in'">
+ <xsl:text>*</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="../@name"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="attribute/@type | param/@type" mode="logparamtext">
+ <xsl:param name="dir"/>
+ <xsl:param name="isref"/>
+
+ <xsl:if test="$isref!='yes' and ($dir='out' or $dir='ret')">
+ <xsl:text>*</xsl:text>
+ </xsl:if>
+ <xsl:text>a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="../@name"/>
+ </xsl:call-template>
+ <xsl:text>=</xsl:text>
+ <xsl:call-template name="translatefmtspectype">
+ <xsl:with-param name="type" select="."/>
+ <xsl:with-param name="dir" select="$dir"/>
+ <xsl:with-param name="mod" select="../@mod"/>
+ <xsl:with-param name="safearray" select="../@safearray"/>
+ <xsl:with-param name="isref" select="$isref"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="attribute/@type | param/@type" mode="logparamval">
+ <xsl:param name="dir"/>
+ <xsl:param name="isref"/>
+
+ <xsl:choose>
+ <xsl:when test="../@safearray='yes' and $isref!='yes'">
+ <xsl:text>ComSafeArraySize(</xsl:text>
+ <xsl:if test="$isref!='yes' and $dir!='in'">
+ <xsl:text>*</xsl:text>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$isref!='yes' and $dir!='in'">
+ <xsl:text>*</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:text>a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="../@name"/>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="../@safearray='yes' and $isref!='yes'">
+ <xsl:text>)</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Emits the DTrace probe parameter value (using tmps), invoked on param or attribute node. -->
+<xsl:template name="emitDTraceParamValue">
+ <xsl:param name="dir"/>
+
+ <xsl:variable name="viatmpvar">
+ <xsl:for-each select="@type">
+ <xsl:call-template name="paramconversionviatmp">
+ <xsl:with-param name="dir" select="$dir"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:variable name="type" select="@type"/>
+ <xsl:choose>
+ <!-- Doesn't help to inline paramconversionviatmp: <xsl:when test="$type = 'wstring' or $type = '$unknown' or $type = 'uuid' or @safearray = 'yes' or count(key('G_keyInterfacesByName', $type)) > 0"> -->
+ <xsl:when test="$viatmpvar = 'yes'">
+ <xsl:variable name="tmpname">
+ <xsl:text>Tmp</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="@safearray = 'yes'">
+ <xsl:text>(uint32_t)</xsl:text>
+ <xsl:value-of select="$tmpname"/>
+ <xsl:text>.array().size(), </xsl:text>
+ <!-- Later:
+ <xsl:value-of select="concat($tmpname, '.array().data(), ')"/>
+ -->
+ <xsl:text>NULL /*for now*/</xsl:text>
+ </xsl:when>
+ <xsl:when test="$type = 'wstring'">
+ <xsl:value-of select="$tmpname"/>
+ <xsl:text>.str().c_str()</xsl:text>
+ </xsl:when>
+ <xsl:when test="$type = 'uuid'">
+ <xsl:value-of select="$tmpname"/>
+ <xsl:text>.uuid().toStringCurly().c_str()</xsl:text>
+ </xsl:when>
+ <xsl:when test="$type = '$unknown'">
+ <xsl:text>(void *)</xsl:text>
+ <xsl:value-of select="$tmpname"/>
+ <xsl:text>.ptr()</xsl:text>
+ </xsl:when>
+ <xsl:when test="count(key('G_keyInterfacesByName', $type)) > 0">
+ <xsl:text>(void *)</xsl:text>
+ <xsl:value-of select="$tmpname"/>
+ <xsl:text>.ptr()</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$tmpname"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:if test="$dir != 'in'">
+ <xsl:text>*</xsl:text>
+ </xsl:if>
+ <xsl:text>a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+
+ <xsl:if test="$type = 'boolean'">
+ <xsl:text> != FALSE</xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!--
+Same as emitDTraceParamValue except no temporary variables are used (they are out of scope).
+Note! There are two other instances of this code with different @dir values, see below.
+-->
+<xsl:template name="emitDTraceParamValNoTmp">
+ <!-- To speed this up, the logic of paramconversionviatmp has been duplicated/inlined here. -->
+ <xsl:variable name="type" select="@type"/>
+ <xsl:choose>
+ <xsl:when test="@safearray = 'yes'">
+ <xsl:text>0, 0</xsl:text>
+ </xsl:when>
+ <xsl:when test="$type = 'wstring' or $type = '$unknown' or $type = 'uuid' or count(key('G_keyInterfacesByName', $type)) > 0">
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="@dir != 'in'">
+ <xsl:text>*</xsl:text>
+ </xsl:if>
+ <xsl:text>a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:if test="$type = 'boolean'">
+ <xsl:text> != FALSE</xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Copy of emitDTraceParamValNoTmp with @dir = 'in' for speeding up the code (noticable difference). -->
+<xsl:template name="emitDTraceParamValNoTmp-DirIn">
+ <xsl:variable name="type" select="@type"/>
+ <xsl:choose>
+ <xsl:when test="@safearray = 'yes'">
+ <xsl:text>0, 0</xsl:text>
+ </xsl:when>
+ <xsl:when test="$type = 'wstring' or $type = '$unknown' or $type = 'uuid' or count(key('G_keyInterfacesByName', $type)) > 0">
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:if test="$type = 'boolean'">
+ <xsl:text> != FALSE</xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Copy of emitDTraceParamValNoTmp with @dir != 'in' for speeding up attributes (noticable difference). -->
+<xsl:template name="emitDTraceParamValNoTmp-DirNotIn">
+ <xsl:variable name="type" select="@type"/>
+ <xsl:choose>
+ <xsl:when test="@safearray = 'yes'">
+ <xsl:text>0, 0</xsl:text>
+ </xsl:when>
+ <xsl:when test="$type = 'wstring' or $type = '$unknown' or $type = 'uuid' or count(key('G_keyInterfacesByName', $type)) > 0">
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>*a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:if test="$type = 'boolean'">
+ <xsl:text> != FALSE</xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="attribute/@type | param/@type" mode="dtraceparamdecl">
+ <xsl:param name="dir"/>
+
+ <xsl:variable name="gluetype">
+ <xsl:call-template name="translatedtracetype">
+ <xsl:with-param name="type" select="."/>
+ <xsl:with-param name="dir" select="$dir"/>
+ <xsl:with-param name="mod" select="../@mod"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Safe arrays get an extra size parameter. -->
+ <xsl:if test="../@safearray='yes'">
+ <xsl:text>uint32_t a_c</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="../@name"/>
+ </xsl:call-template>
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+
+ <xsl:value-of select="$gluetype"/>
+ <xsl:choose>
+ <xsl:when test="../@safearray='yes'">
+ <xsl:text> *a_pa</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="substring($gluetype,string-length($gluetype))!='*'">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:text>a_</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="../@name"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- Call this to determine whether a temporary conversion variable is used for the current parameter.
+Returns empty if not needed, non-empty ('yes') if needed. -->
+<xsl:template name="paramconversionviatmp">
+ <xsl:param name="dir"/>
+ <xsl:variable name="type" select="."/>
+ <xsl:choose>
+ <xsl:when test="$type = 'wstring' or $type = '$unknown' or $type = 'uuid'">
+ <xsl:text>yes</xsl:text>
+ </xsl:when>
+ <xsl:when test="../@safearray = 'yes'">
+ <xsl:text>yes</xsl:text>
+ </xsl:when>
+ <xsl:when test="$type = 'boolean' or $type = 'long' or $type = 'long' or $type = 'long long'"/> <!-- XXX: drop this? -->
+ <xsl:when test="count(key('G_keyInterfacesByName', $type)) > 0">
+ <xsl:text>yes</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Call this to get the argument conversion class, if any is needed. -->
+<xsl:template name="paramconversionclass">
+ <xsl:param name="dir"/>
+
+ <xsl:variable name="type" select="."/>
+ <xsl:choose>
+ <xsl:when test="$type='$unknown'">
+ <xsl:if test="../@safearray='yes'">
+ <xsl:text>Array</xsl:text>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$dir='in'">
+ <xsl:text>ComTypeInConverter&lt;IUnknown&gt;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>ComTypeOutConverter&lt;IUnknown&gt;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$type='wstring'">
+ <xsl:if test="../@safearray='yes'">
+ <xsl:text>Array</xsl:text>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$dir='in'">
+ <xsl:text>BSTRInConverter</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>BSTROutConverter</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$type='uuid'">
+ <xsl:if test="../@safearray='yes'">
+ <xsl:text>Array</xsl:text>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$dir='in'">
+ <xsl:text>UuidInConverter</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>UuidOutConverter</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="count(key('G_keyInterfacesByName', $type)) > 0">
+ <xsl:if test="../@safearray='yes'">
+ <xsl:text>Array</xsl:text>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$dir='in'">
+ <xsl:text>ComTypeInConverter</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>ComTypeOutConverter</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="concat('&lt;', $type, '&gt;')"/>
+ </xsl:when>
+
+ <xsl:when test="../@safearray='yes'">
+ <xsl:text>Array</xsl:text>
+ <xsl:choose>
+ <xsl:when test="$dir='in'">
+ <xsl:text>InConverter</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>OutConverter</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:variable name="gluetype">
+ <xsl:call-template name="translatepublictype">
+ <xsl:with-param name="type" select="."/>
+ <xsl:with-param name="dir" select="$dir"/>
+ <xsl:with-param name="mod" select="../@mod"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="concat('&lt;', $gluetype, '&gt;')"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Emits code for converting the parameter to a temporary variable. -->
+<xsl:template match="attribute/@type | param/@type" mode="paramvalconversion2tmpvar">
+ <xsl:param name="dir"/>
+
+ <xsl:variable name="conversionclass">
+ <xsl:call-template name="paramconversionclass">
+ <xsl:with-param name="dir" select="$dir"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$conversionclass != ''">
+ <xsl:value-of select="$conversionclass"/>
+ <xsl:text> Tmp</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="../@name"/>
+ </xsl:call-template>
+ <xsl:text>(</xsl:text>
+ <xsl:if test="../@safearray = 'yes'">
+ <xsl:choose>
+ <xsl:when test="$dir = 'in'">
+ <xsl:text>ComSafeArrayInArg(</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>ComSafeArrayOutArg(</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ <xsl:text>a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="../@name"/>
+ </xsl:call-template>
+ <xsl:if test="../@safearray = 'yes'">
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ <xsl:text>);</xsl:text>
+ </xsl:if>
+
+</xsl:template>
+
+<!-- Partner to paramvalconversion2tmpvar that emits the parameter when calling call the internal worker method. -->
+<xsl:template match="attribute/@type | param/@type" mode="paramvalconversionusingtmp">
+ <xsl:param name="dir"/>
+
+ <xsl:variable name="viatmpvar">
+ <xsl:call-template name="paramconversionviatmp">
+ <xsl:with-param name="dir" select="$dir"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="type" select="."/>
+
+ <xsl:choose>
+ <xsl:when test="$viatmpvar = 'yes'">
+ <xsl:text>Tmp</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="../@name"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="../@safearray='yes'">
+ <xsl:text>.array()</xsl:text>
+ </xsl:when>
+ <xsl:when test="$type = 'wstring'">
+ <xsl:text>.str()</xsl:text>
+ </xsl:when>
+ <xsl:when test="$type = 'uuid'">
+ <xsl:text>.uuid()</xsl:text>
+ </xsl:when>
+ <xsl:when test="$type = '$unknown'">
+ <xsl:text>.ptr()</xsl:text>
+ </xsl:when>
+ <xsl:when test="count(key('G_keyInterfacesByName', $type)) > 0">
+ <xsl:text>.ptr()</xsl:text>
+ </xsl:when>
+ <xsl:otherwise><xsl:message terminate="yes">Oops #1</xsl:message></xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:text>a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="../@name"/>
+ </xsl:call-template>
+
+ <!-- Make sure BOOL values we pass down are either TRUE or FALSE. -->
+ <xsl:if test="$type = 'boolean' and $dir = 'in'">
+ <xsl:text> != FALSE</xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ emit attribute
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template match="attribute" mode="public">
+ <xsl:param name="target"/>
+
+ <xsl:call-template name="emitTargetBegin">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+
+ <xsl:variable name="attrbasename">
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:value-of select="concat(' STDMETHOD(COMGETTER(', $attrbasename, '))(')"/>
+ <xsl:call-template name="emitPublicParameter">
+ <xsl:with-param name="dir">out</xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>);
+</xsl:text>
+
+ <xsl:if test="not(@readonly) or @readonly!='yes'">
+ <xsl:value-of select="concat(' STDMETHOD(COMSETTER(', $attrbasename, '))(')"/>
+ <xsl:call-template name="emitPublicParameter">
+ <xsl:with-param name="dir">in</xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>);
+</xsl:text>
+ </xsl:if>
+
+ <xsl:call-template name="emitTargetEnd">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="attribute" mode="wrapped">
+ <xsl:param name="target"/>
+
+ <xsl:call-template name="emitTargetBegin">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+
+ <xsl:variable name="attrbasename">
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$attrbasename = 'MidlDoesNotLikeEmptyInterfaces'">
+ <xsl:text> //</xsl:text>
+ </xsl:if>
+
+ <xsl:value-of select="concat(' virtual HRESULT get', $attrbasename, '(')"/>
+ <xsl:variable name="passAutoCaller">
+ <xsl:call-template name="checkoption">
+ <xsl:with-param name="optionlist" select="@wrap-hint-server"/>
+ <xsl:with-param name="option" select="'passcaller'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="$passAutoCaller = 'true'">
+ <xsl:text>AutoCaller &amp;aAutoCaller, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="@type" mode="wrapped">
+ <xsl:with-param name="dir" select="'out'"/>
+ </xsl:apply-templates>
+ <xsl:text>) = 0;
+</xsl:text>
+
+ <xsl:if test="not(@readonly) or @readonly!='yes'">
+ <xsl:value-of select="concat(' virtual HRESULT set', $attrbasename, '(')"/>
+ <xsl:if test="$passAutoCaller = 'true'">
+ <xsl:text>AutoCaller &amp;aAutoCaller, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="@type" mode="wrapped">
+ <xsl:with-param name="dir" select="'in'"/>
+ </xsl:apply-templates>
+ <xsl:text>) = 0;
+</xsl:text>
+ </xsl:if>
+
+ <xsl:call-template name="emitTargetEnd">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="attribute" mode="code">
+ <xsl:param name="topclass"/>
+ <xsl:param name="dtracetopclass"/>
+ <xsl:param name="target"/>
+
+ <xsl:call-template name="emitTargetBegin">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+
+ <xsl:variable name="attrbasename">
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="limitedAutoCaller">
+ <xsl:call-template name="checkoption">
+ <xsl:with-param name="optionlist" select="@wrap-hint-server"/>
+ <xsl:with-param name="option" select="'limitedcaller'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="dtraceattrname">
+ <xsl:choose>
+ <xsl:when test="@dtracename">
+ <xsl:value-of select="@dtracename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$attrbasename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:value-of select="concat('STDMETHODIMP ', $topclass, 'Wrap::COMGETTER(', $attrbasename, ')(')"/>
+ <xsl:call-template name="emitPublicParameter">
+ <xsl:with-param name="dir">out</xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>)
+{</xsl:text>
+ <xsl:if test="$attrbasename = 'MidlDoesNotLikeEmptyInterfaces'">
+ <xsl:text>
+#if 0 /* This is a dummy attribute */</xsl:text>
+ </xsl:if>
+ <xsl:text>
+ LogRelFlow(("{%p} %s: enter </xsl:text>
+ <xsl:apply-templates select="@type" mode="logparamtext">
+ <xsl:with-param name="dir" select="'out'"/>
+ <xsl:with-param name="isref" select="'yes'"/>
+ </xsl:apply-templates>
+ <xsl:text>\n", this, </xsl:text>
+ <xsl:value-of select="concat('&quot;', $topclass, '::get', $attrbasename, '&quot;, ')"/>
+ <xsl:apply-templates select="@type" mode="logparamval">
+ <xsl:with-param name="dir" select="'out'"/>
+ <xsl:with-param name="isref" select="'yes'"/>
+ </xsl:apply-templates>
+ <xsl:text>));
+</xsl:text>
+ <xsl:if test="ancestor::interface[@wrap-gen-hook = 'yes']">
+ <xsl:text>
+ i_callHook(__FUNCTION__);</xsl:text>
+ </xsl:if>
+<xsl:text>
+ // Clear error info, to make in-process calls behave the same as
+ // cross-apartment calls or out-of-process calls.
+ VirtualBoxBase::clearError();
+
+ HRESULT hrc;
+
+ try
+ {
+ CheckComArgOutPointerValidThrow(a</xsl:text>
+ <xsl:value-of select="$attrbasename"/>
+ <xsl:text>);
+ </xsl:text>
+ <xsl:apply-templates select="@type" mode="paramvalconversion2tmpvar">
+ <xsl:with-param name="dir" select="'out'"/>
+ </xsl:apply-templates>
+ <xsl:if test="$attrbasename != 'MidlDoesNotLikeEmptyInterfaces'">
+ <xsl:text>
+#ifdef VBOX_WITH_DTRACE_R3_MAIN
+ </xsl:text>
+ <xsl:value-of select="translate(concat('VBOXAPI_', $dtracetopclass, '_GET_', $dtraceattrname, '_ENTER('), $G_lowerCase, $G_upperCase)"/>
+ <xsl:text>this);
+#endif</xsl:text>
+ </xsl:if>
+ <xsl:text>
+ </xsl:text>
+ <xsl:choose>
+ <xsl:when test="$limitedAutoCaller = 'true'">
+ <xsl:text>AutoLimitedCaller</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>AutoCaller</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text> autoCaller(this);
+ hrc = autoCaller.hrc();
+ if (SUCCEEDED(hrc))
+ {
+</xsl:text>
+ <xsl:value-of select="concat(' hrc = get', $attrbasename, '(')"/>
+ <xsl:variable name="passAutoCaller">
+ <xsl:call-template name="checkoption">
+ <xsl:with-param name="optionlist" select="@wrap-hint-server"/>
+ <xsl:with-param name="option" select="'passcaller'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="$passAutoCaller = 'true'">
+ <xsl:text>autoCaller, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="@type" mode="paramvalconversionusingtmp">
+ <xsl:with-param name="dir" select="'out'"/>
+ </xsl:apply-templates>
+ <xsl:text>);
+ }</xsl:text>
+ <xsl:if test="$attrbasename != 'MidlDoesNotLikeEmptyInterfaces'">
+ <xsl:text>
+#ifdef VBOX_WITH_DTRACE_R3_MAIN
+ </xsl:text>
+ <xsl:value-of select="translate(concat('VBOXAPI_', $dtracetopclass, '_GET_', $dtraceattrname, '_RETURN('), $G_lowerCase, $G_upperCase)"/>
+ <xsl:text>this, hrc, 0 /*normal*/,</xsl:text>
+ <xsl:call-template name="emitDTraceParamValue">
+ <xsl:with-param name="dir">out</xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>);
+#endif</xsl:text>
+ </xsl:if>
+ <xsl:text>
+ }
+ catch (HRESULT hrc2)
+ {
+ hrc = hrc2;</xsl:text>
+ <xsl:if test="$attrbasename != 'MidlDoesNotLikeEmptyInterfaces'">
+ <xsl:text>
+#ifdef VBOX_WITH_DTRACE_R3_MAIN
+ </xsl:text>
+ <xsl:value-of select="translate(concat('VBOXAPI_', $dtracetopclass, '_GET_', $dtraceattrname, '_RETURN('), $G_lowerCase, $G_upperCase)"/>
+ <xsl:text>this, hrc, 1 /*hrc exception*/,</xsl:text>
+ <xsl:call-template name="emitDTraceParamValNoTmp-DirNotIn"/>
+ <xsl:text>);
+#endif</xsl:text>
+ </xsl:if>
+ <xsl:text>
+ }
+ catch (...)
+ {
+ hrc = VirtualBoxBase::handleUnexpectedExceptions(this, RT_SRC_POS);</xsl:text>
+ <xsl:if test="$attrbasename != 'MidlDoesNotLikeEmptyInterfaces'">
+ <xsl:text>
+#ifdef VBOX_WITH_DTRACE_R3_MAIN
+ </xsl:text>
+ <xsl:value-of select="translate(concat('VBOXAPI_', $dtracetopclass, '_GET_', $dtraceattrname, '_RETURN('), $G_lowerCase, $G_upperCase)"/>
+ <xsl:text>this, hrc, 9 /*unhandled exception*/,</xsl:text>
+ <xsl:call-template name="emitDTraceParamValNoTmp-DirNotIn"/>
+ <xsl:text>);
+#endif</xsl:text>
+ </xsl:if>
+ <xsl:text>
+ }
+
+ LogRelFlow(("{%p} %s: leave </xsl:text>
+ <xsl:apply-templates select="@type" mode="logparamtext">
+ <xsl:with-param name="dir" select="'out'"/>
+ <xsl:with-param name="isref" select="''"/>
+ </xsl:apply-templates>
+ <xsl:text> hrc=%Rhrc\n", this, </xsl:text>
+ <xsl:value-of select="concat('&quot;', $topclass, '::get', $dtraceattrname, '&quot;, ')"/>
+ <xsl:apply-templates select="@type" mode="logparamval">
+ <xsl:with-param name="dir" select="'out'"/>
+ <xsl:with-param name="isref" select="''"/>
+ </xsl:apply-templates>
+ <xsl:text>, hrc));
+ return hrc;</xsl:text>
+ <xsl:if test="$attrbasename = 'MidlDoesNotLikeEmptyInterfaces'">
+ <xsl:text>
+#else /* dummy attribute */
+ NOREF(aMidlDoesNotLikeEmptyInterfaces);
+ return E_FAIL;
+#endif /* dummy attribute */</xsl:text>
+ </xsl:if>
+ <xsl:text>
+}
+</xsl:text>
+ <xsl:if test="not(@readonly) or @readonly!='yes'">
+ <xsl:text>
+</xsl:text>
+ <xsl:value-of select="concat('STDMETHODIMP ', $topclass, 'Wrap::COMSETTER(', $attrbasename, ')(')"/>
+ <xsl:call-template name="emitPublicParameter">
+ <xsl:with-param name="dir">in</xsl:with-param>
+ </xsl:call-template>
+ <!-- @todo check in parameters if possible -->
+ <xsl:text>)
+{
+ LogRelFlow(("{%p} %s: enter </xsl:text>
+ <xsl:apply-templates select="@type" mode="logparamtext">
+ <xsl:with-param name="dir" select="'in'"/>
+ <xsl:with-param name="isref" select="''"/>
+ </xsl:apply-templates>
+ <xsl:text>\n", this, </xsl:text>
+ <xsl:value-of select="concat('&quot;', $topclass, '::set', $attrbasename, '&quot;, ')"/>
+ <xsl:apply-templates select="@type" mode="logparamval">
+ <xsl:with-param name="dir" select="'in'"/>
+ <xsl:with-param name="isref" select="''"/>
+ </xsl:apply-templates>
+ <xsl:text>));
+</xsl:text>
+ <xsl:if test="ancestor::interface[@wrap-gen-hook = 'yes']">
+ <xsl:text>
+ i_callHook(__FUNCTION__);</xsl:text>
+ </xsl:if>
+<xsl:text>
+ // Clear error info, to make in-process calls behave the same as
+ // cross-apartment calls or out-of-process calls.
+ VirtualBoxBase::clearError();
+
+ HRESULT hrc;
+
+ try
+ {
+ </xsl:text>
+ <xsl:apply-templates select="@type" mode="paramvalconversion2tmpvar">
+ <xsl:with-param name="dir" select="'in'"/>
+ </xsl:apply-templates>
+ <xsl:text>
+
+#ifdef VBOX_WITH_DTRACE_R3_MAIN
+ </xsl:text>
+ <xsl:value-of select="translate(concat('VBOXAPI_', $topclass, '_SET_', $dtraceattrname, '_ENTER('), $G_lowerCase, $G_upperCase)"/>
+ <xsl:text>this, </xsl:text>
+ <xsl:call-template name="emitDTraceParamValue">
+ <xsl:with-param name="dir">in</xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>);
+#endif
+ </xsl:text>
+ <xsl:choose>
+ <xsl:when test="$limitedAutoCaller = 'true'">
+ <xsl:text>AutoLimitedCaller</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>AutoCaller</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text> autoCaller(this);
+ hrc = autoCaller.hrc();
+ if (SUCCEEDED(hrc))
+ {
+</xsl:text>
+ <xsl:value-of select="concat(' hrc = set', $attrbasename, '(')"/>
+ <xsl:if test="$passAutoCaller = 'true'">
+ <xsl:text>autoCaller, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="@type" mode="paramvalconversionusingtmp">
+ <xsl:with-param name="dir" select="'in'"/>
+ </xsl:apply-templates>
+ <xsl:text>);
+ }
+#ifdef VBOX_WITH_DTRACE_R3_MAIN
+ </xsl:text>
+ <xsl:value-of select="translate(concat('VBOXAPI_', $dtracetopclass, '_SET_', $dtraceattrname, '_RETURN('), $G_lowerCase, $G_upperCase)"/>
+ <xsl:text>this, hrc, 0 /*normal*/,</xsl:text>
+ <xsl:call-template name="emitDTraceParamValue">
+ <xsl:with-param name="dir">in</xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>);
+#endif
+ }
+ catch (HRESULT hrc2)
+ {
+ hrc = hrc2;
+#ifdef VBOX_WITH_DTRACE_R3_MAIN
+ </xsl:text>
+ <xsl:value-of select="translate(concat('VBOXAPI_', $dtracetopclass, '_SET_', $dtraceattrname, '_RETURN('), $G_lowerCase, $G_upperCase)"/>
+ <xsl:text>this, hrc, 1 /*hrc exception*/,</xsl:text>
+ <xsl:call-template name="emitDTraceParamValNoTmp-DirIn"/>
+ <xsl:text>);
+#endif
+ }
+ catch (...)
+ {
+ hrc = VirtualBoxBase::handleUnexpectedExceptions(this, RT_SRC_POS);
+#ifdef VBOX_WITH_DTRACE_R3_MAIN
+ </xsl:text>
+ <xsl:value-of select="translate(concat('VBOXAPI_', $dtracetopclass, '_SET_', $dtraceattrname, '_RETURN('), $G_lowerCase, $G_upperCase)"/>
+ <xsl:text>this, hrc, 9 /*unhandled exception*/,</xsl:text>
+ <xsl:call-template name="emitDTraceParamValNoTmp-DirIn"/>
+ <xsl:text>);
+#endif
+ }
+
+ LogRelFlow(("{%p} %s: leave hrc=%Rhrc\n", this, </xsl:text>
+ <xsl:value-of select="concat('&quot;', $topclass, '::set', $attrbasename, '&quot;, ')"/>
+ <xsl:text>hrc));
+ return hrc;
+}
+</xsl:text>
+ </xsl:if>
+
+ <xsl:call-template name="emitTargetEnd">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="xsltprocNewlineOutputHack"/>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ Emit DTrace probes for the given attribute.
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template match="attribute" mode="dtrace-probes">
+ <xsl:param name="topclass"/>
+ <xsl:param name="dtracetopclass"/>
+ <xsl:param name="target"/>
+
+ <xsl:variable name="dtraceattrname">
+ <xsl:choose>
+ <xsl:when test="@dtracename">
+ <xsl:value-of select="@dtracename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- attrbasename -->
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="@name != 'midlDoesNotLikeEmptyInterfaces'">
+ <xsl:text> probe </xsl:text>
+ <!-- <xsl:value-of select="concat($dtracetopclass, '__get__', $dtraceattrname, '__enter(struct ', $topclass)"/> -->
+ <xsl:value-of select="concat($dtracetopclass, '__get__', $dtraceattrname, '__enter(void')"/>
+ <xsl:text> *a_pThis);
+ probe </xsl:text>
+ <!-- <xsl:value-of select="concat($dtracetopclass, '__get__', $dtraceattrname, '__return(struct ', $topclass, ' *a_pThis')"/> -->
+ <xsl:value-of select="concat($dtracetopclass, '__get__', $dtraceattrname, '__return(void *a_pThis')"/>
+ <xsl:text>, uint32_t a_hrc, int32_t enmWhy, </xsl:text>
+ <xsl:apply-templates select="@type" mode="dtraceparamdecl">
+ <xsl:with-param name="dir">out</xsl:with-param>
+ </xsl:apply-templates>
+ <xsl:text>);
+</xsl:text>
+ </xsl:if>
+ <xsl:if test="(not(@readonly) or @readonly!='yes') and @name != 'midlDoesNotLikeEmptyInterfaces'">
+ <xsl:text> probe </xsl:text>
+ <!-- <xsl:value-of select="concat($topclass, '__set__', $dtraceattrname, '__enter(struct ', $topclass, ' *a_pThis, ')"/>-->
+ <xsl:value-of select="concat($topclass, '__set__', $dtraceattrname, '__enter(void *a_pThis, ')"/>
+ <xsl:apply-templates select="@type" mode="dtraceparamdecl">
+ <xsl:with-param name="dir" select="'in'"/>
+ </xsl:apply-templates>
+ <xsl:text>);
+ probe </xsl:text>
+ <!-- <xsl:value-of select="concat($dtracetopclass, '__set__', $dtraceattrname, '__return(struct ', $topclass, ' *a_pThis')"/> -->
+ <xsl:value-of select="concat($dtracetopclass, '__set__', $dtraceattrname, '__return(void *a_pThis')"/>
+ <xsl:text>, uint32_t a_hrc, int32_t enmWhy, </xsl:text>
+ <xsl:apply-templates select="@type" mode="dtraceparamdecl">
+ <xsl:with-param name="dir">in</xsl:with-param>
+ </xsl:apply-templates>
+ <xsl:text>);
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ Emit all attributes of an interface (current node).
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template name="emitAttributes">
+ <xsl:param name="topclass"/>
+ <xsl:param name="dtracetopclass"/>
+ <xsl:param name="pmode"/>
+
+ <xsl:variable name="name" select="@name"/>
+ <!-- first recurse to emit all base interfaces -->
+ <xsl:variable name="extends" select="@extends"/>
+ <xsl:if test="$extends and not($extends='$unknown') and not($extends='$errorinfo')">
+ <xsl:for-each select="key('G_keyInterfacesByName', $extends)">
+ <xsl:call-template name="emitAttributes">
+ <xsl:with-param name="topclass" select="$topclass"/>
+ <xsl:with-param name="pmode" select="$pmode"/>
+ <xsl:with-param name="dtracetopclass" select="$dtracetopclass"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$pmode='code'">
+ <xsl:text>//
+</xsl:text>
+ <xsl:value-of select="concat('// ', $name, ' properties')"/>
+ <xsl:text>
+//
+
+</xsl:text>
+ </xsl:when>
+ <xsl:when test="$pmode != 'dtrace-probes'">
+ <xsl:value-of select="concat($G_sNewLine, ' /** @name ', translate(substring($pmode, 1, 1), $G_lowerCase, $G_upperCase), substring($pmode,2), ' ', $name, ' properties', $G_sNewLine)"/>
+ <xsl:text> * @{ */
+</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="$pmode='public'">
+ <xsl:apply-templates select="./attribute | ./if" mode="public">
+ <xsl:with-param name="emitmode" select="'attribute'"/>
+ </xsl:apply-templates>
+ <xsl:variable name="reservedAttributes" select="@reservedAttributes"/>
+ <xsl:if test="$reservedAttributes > 0">
+ <!-- tricky way to do a "for" loop without recursion -->
+ <xsl:for-each select="(//*)[position() &lt;= $reservedAttributes]">
+ <xsl:text> STDMETHOD(COMGETTER(InternalAndReservedAttribute</xsl:text>
+ <xsl:value-of select="concat(position(), $name)"/>
+ <xsl:text>))(ULONG *aReserved);&#x0A;</xsl:text>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$pmode='wrapped'">
+ <xsl:apply-templates select="./attribute | ./if" mode="wrapped">
+ <xsl:with-param name="emitmode" select="'attribute'"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$pmode='code'">
+ <xsl:apply-templates select="./attribute | ./if" mode="code">
+ <xsl:with-param name="topclass" select="$topclass"/>
+ <xsl:with-param name="dtracetopclass" select="$dtracetopclass"/>
+ <xsl:with-param name="emitmode" select="'attribute'"/>
+ </xsl:apply-templates>
+ <xsl:variable name="reservedAttributes" select="@reservedAttributes"/>
+ <xsl:if test="$reservedAttributes > 0">
+ <!-- tricky way to do a "for" loop without recursion -->
+ <xsl:for-each select="(//*)[position() &lt;= $reservedAttributes]">
+ <xsl:value-of select="concat('STDMETHODIMP ', $topclass, 'Wrap::COMGETTER(InternalAndReservedAttribute', position(), $name, ')(ULONG *aReserved)&#x0A;')"/>
+ <xsl:text>{
+ NOREF(aReserved);
+ return E_NOTIMPL;
+}
+
+</xsl:text>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$pmode = 'dtrace-probes'">
+ <xsl:apply-templates select="./attribute | ./if" mode="dtrace-probes">
+ <xsl:with-param name="topclass" select="$topclass"/>
+ <xsl:with-param name="dtracetopclass" select="$dtracetopclass"/>
+ <xsl:with-param name="emitmode" select="'attribute'"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise><xsl:message terminate="yes">Otherwise oops in emitAttributes</xsl:message></xsl:otherwise>
+ </xsl:choose>
+
+ <!-- close doxygen @name -->
+ <xsl:if test="($pmode != 'code') and ($pmode != 'dtrace-probes')" >
+ <xsl:text> /** @} */
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="emitTargetBegin">
+ <xsl:param name="target"/>
+
+ <xsl:choose>
+ <xsl:when test="$target = ''"/>
+ <xsl:when test="$target = 'xpidl'">
+ <xsl:text>#ifdef VBOX_WITH_XPCOM
+</xsl:text>
+ </xsl:when>
+ <xsl:when test="$target = 'midl'">
+ <xsl:text>#ifndef VBOX_WITH_XPCOM
+</xsl:text>
+ </xsl:when>
+ <xsl:otherwise><xsl:message terminate="yes">Otherwise oops in emitTargetBegin: target=<xsl:value-of select="$target"/></xsl:message></xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="emitTargetEnd">
+ <xsl:param name="target"/>
+
+ <xsl:choose>
+ <xsl:when test="$target = ''"/>
+ <xsl:when test="$target = 'xpidl'">
+ <xsl:text>#endif /* VBOX_WITH_XPCOM */
+</xsl:text>
+ </xsl:when>
+ <xsl:when test="$target = 'midl'">
+ <xsl:text>#endif /* !VBOX_WITH_XPCOM */
+</xsl:text>
+ </xsl:when>
+ <xsl:otherwise><xsl:message terminate="yes">Otherwise oops in emitTargetEnd target=<xsl:value-of select="$target"/></xsl:message></xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ emit method
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template match="method" mode="public">
+ <xsl:param name="target"/>
+
+ <xsl:call-template name="emitTargetBegin">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+
+ <xsl:variable name="methodindent">
+ <xsl:call-template name="tospace">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:text> STDMETHOD(</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>)(</xsl:text>
+ <xsl:for-each select="param">
+ <xsl:call-template name="emitPublicParameter">
+ <xsl:with-param name="dir" select="@dir"/>
+ </xsl:call-template>
+ <xsl:if test="not(position()=last())">
+ <xsl:text>,
+ </xsl:text>
+ <xsl:value-of select="$methodindent"/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:text>);
+</xsl:text>
+
+ <xsl:call-template name="emitTargetEnd">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="method" mode="wrapped">
+ <xsl:param name="target"/>
+
+ <xsl:call-template name="emitTargetBegin">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+
+ <xsl:variable name="methodindent">
+ <xsl:call-template name="tospace">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:text> virtual HRESULT </xsl:text>
+ <xsl:call-template name="uncapitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>(</xsl:text>
+ <xsl:variable name="passAutoCaller">
+ <xsl:call-template name="checkoption">
+ <xsl:with-param name="optionlist" select="@wrap-hint-server"/>
+ <xsl:with-param name="option" select="'passcaller'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="$passAutoCaller = 'true'">
+ <xsl:text>AutoCaller &amp;aAutoCaller</xsl:text>
+ <xsl:if test="count(param) > 0">
+ <xsl:text>,
+ </xsl:text>
+ <xsl:value-of select="$methodindent"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:for-each select="param">
+ <xsl:apply-templates select="@type" mode="wrapped">
+ <xsl:with-param name="dir" select="@dir"/>
+ </xsl:apply-templates>
+ <xsl:if test="not(position()=last())">
+ <xsl:text>,
+ </xsl:text>
+ <xsl:value-of select="$methodindent"/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:text>) = 0;
+</xsl:text>
+
+ <xsl:call-template name="emitTargetEnd">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="method" mode="code">
+ <xsl:param name="topclass"/>
+ <xsl:param name="dtracetopclass"/>
+ <xsl:param name="target"/>
+
+ <xsl:call-template name="emitTargetBegin">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+
+ <xsl:variable name="methodindent">
+ <xsl:call-template name="tospace">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="methodclassindent">
+ <xsl:call-template name="tospace">
+ <xsl:with-param name="str" select="concat($topclass, @name)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="methodbasename">
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="limitedAutoCaller">
+ <xsl:call-template name="checkoption">
+ <xsl:with-param name="optionlist" select="@wrap-hint-server"/>
+ <xsl:with-param name="option" select="'limitedcaller'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="dtracemethodname">
+ <xsl:choose>
+ <xsl:when test="@dtracename">
+ <xsl:value-of select="@dtracename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@name"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="dtracenamehack"> <!-- Ugly hack to deal with Session::assignMachine and similar. -->
+ <xsl:if test="name(..) = 'if'">
+ <xsl:value-of select="concat('__', ../@target)"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:value-of select="concat('STDMETHODIMP ', $topclass, 'Wrap::', $methodbasename, '(')"/>
+ <xsl:for-each select="param">
+ <xsl:call-template name="emitPublicParameter">
+ <xsl:with-param name="dir" select="@dir"/>
+ </xsl:call-template>
+ <xsl:if test="not(position()=last())">
+ <xsl:text>,
+ </xsl:text>
+ <xsl:value-of select="$methodclassindent"/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:text>)
+{
+ LogRelFlow(("{%p} %s: enter</xsl:text>
+ <xsl:for-each select="param">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="@type" mode="logparamtext">
+ <xsl:with-param name="dir" select="@dir"/>
+ <xsl:with-param name="isref" select="'yes'"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ <xsl:text>\n", this</xsl:text>
+ <xsl:value-of select="concat(', &quot;', $topclass, '::', @name, '&quot;')"/>
+ <xsl:for-each select="param">
+ <xsl:text>, </xsl:text>
+ <xsl:apply-templates select="@type" mode="logparamval">
+ <xsl:with-param name="dir" select="@dir"/>
+ <xsl:with-param name="isref" select="'yes'"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ <xsl:text>));
+</xsl:text>
+ <xsl:if test="ancestor::interface[@wrap-gen-hook = 'yes']">
+ <xsl:text>
+ i_callHook(__FUNCTION__);</xsl:text>
+ </xsl:if>
+<xsl:text>
+ // Clear error info, to make in-process calls behave the same as
+ // cross-apartment calls or out-of-process calls.
+ VirtualBoxBase::clearError();
+
+ HRESULT hrc;
+
+ try
+ {
+</xsl:text>
+ <!-- @todo check in parameters if possible -->
+ <xsl:for-each select="param">
+ <xsl:if test="@dir!='in'">
+ <xsl:text> CheckComArgOutPointerValidThrow(a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>);
+</xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+<xsl:text>
+</xsl:text>
+ <xsl:for-each select="param">
+ <xsl:text>
+ </xsl:text>
+ <xsl:apply-templates select="@type" mode="paramvalconversion2tmpvar">
+ <xsl:with-param name="dir" select="@dir"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ <xsl:text>
+
+#ifdef VBOX_WITH_DTRACE_R3_MAIN
+ </xsl:text>
+ <xsl:value-of select="translate(concat('VBOXAPI_', $dtracetopclass, '_', $dtracemethodname, substring($dtracenamehack, 2), '_ENTER('), $G_lowerCase, $G_upperCase)"/>
+ <xsl:text>this</xsl:text>
+ <xsl:for-each select="param[@dir='in']">
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="emitDTraceParamValue">
+ <xsl:with-param name="dir" select="@dir"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <xsl:text>);
+#endif
+ </xsl:text>
+ <xsl:choose>
+ <xsl:when test="$limitedAutoCaller = 'true'">
+ <xsl:text>AutoLimitedCaller</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>AutoCaller</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text> autoCaller(this);
+ hrc = autoCaller.hrc();
+ if (SUCCEEDED(hrc))
+ {
+</xsl:text>
+ <xsl:value-of select="concat(' hrc = ', @name, '(')"/>
+ <xsl:variable name="passAutoCaller">
+ <xsl:call-template name="checkoption">
+ <xsl:with-param name="optionlist" select="@wrap-hint-server"/>
+ <xsl:with-param name="option" select="'passcaller'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="$passAutoCaller = 'true'">
+ <xsl:text>autoCaller</xsl:text>
+ <xsl:if test="count(param) > 0">
+ <xsl:text>,
+ </xsl:text>
+ <xsl:value-of select="$methodindent"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:for-each select="param">
+ <xsl:apply-templates select="@type" mode="paramvalconversionusingtmp">
+ <xsl:with-param name="dir" select="@dir"/>
+ </xsl:apply-templates>
+ <xsl:if test="not(position()=last())">
+ <xsl:text>,
+ </xsl:text>
+ <xsl:value-of select="$methodindent"/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:text>);
+ }
+#ifdef VBOX_WITH_DTRACE_R3_MAIN
+ </xsl:text>
+ <xsl:value-of select="translate(concat('VBOXAPI_', $dtracetopclass, '_', $dtracemethodname, substring($dtracenamehack, 2), '_RETURN('), $G_lowerCase, $G_upperCase)"/>
+ <xsl:text>this, hrc, 0 /*normal*/</xsl:text>
+ <xsl:for-each select="param">
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="emitDTraceParamValue">
+ <xsl:with-param name="dir" select="@dir"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <xsl:text>);
+#endif
+ }
+ catch (HRESULT hrc2)
+ {
+ hrc = hrc2;
+#ifdef VBOX_WITH_DTRACE_R3_MAIN
+ </xsl:text>
+ <xsl:value-of select="translate(concat('VBOXAPI_', $dtracetopclass, '_', $dtracemethodname, substring($dtracenamehack, 2), '_RETURN('), $G_lowerCase, $G_upperCase)"/>
+ <xsl:text>this, hrc, 1 /*hrc exception*/</xsl:text>
+ <xsl:for-each select="param">
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="emitDTraceParamValNoTmp"/>
+ </xsl:for-each>
+ <xsl:text>);
+#endif
+ }
+ catch (...)
+ {
+ hrc = VirtualBoxBase::handleUnexpectedExceptions(this, RT_SRC_POS);
+#ifdef VBOX_WITH_DTRACE_R3_MAIN
+ </xsl:text>
+ <xsl:value-of select="translate(concat('VBOXAPI_', $dtracetopclass, '_', $dtracemethodname, substring($dtracenamehack, 2), '_RETURN('), $G_lowerCase, $G_upperCase)"/>
+ <xsl:text>this, hrc, 9 /*unhandled exception*/</xsl:text>
+ <xsl:for-each select="param">
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="emitDTraceParamValNoTmp"/>
+ </xsl:for-each>
+ <xsl:text>);
+#endif
+ }
+
+ LogRelFlow(("{%p} %s: leave</xsl:text>
+ <xsl:for-each select="param">
+ <xsl:if test="@dir!='in'">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="@type" mode="logparamtext">
+ <xsl:with-param name="dir" select="@dir"/>
+ <xsl:with-param name="isref" select="''"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:text> hrc=%Rhrc\n", this</xsl:text>
+ <xsl:value-of select="concat(', &quot;', $topclass, '::', @name, '&quot;')"/>
+ <xsl:for-each select="param">
+ <xsl:if test="@dir!='in'">
+ <xsl:text>, </xsl:text>
+ <xsl:apply-templates select="@type" mode="logparamval">
+ <xsl:with-param name="dir" select="@dir"/>
+ <xsl:with-param name="isref" select="''"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:text>, hrc));
+ return hrc;
+}
+</xsl:text>
+
+ <xsl:call-template name="emitTargetEnd">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+
+ <xsl:text>
+</xsl:text>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ Emits the DTrace probes for a method.
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template match="method" mode="dtrace-probes">
+ <xsl:param name="topclass"/>
+ <xsl:param name="dtracetopclass"/>
+ <xsl:param name="target"/>
+
+ <xsl:variable name="dtracemethodname">
+ <xsl:choose>
+ <xsl:when test="@dtracename">
+ <xsl:value-of select="@dtracename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@name"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="dtracenamehack"> <!-- Ugly hack to deal with Session::assignMachine and similar. -->
+ <xsl:if test="name(..) = 'if'">
+ <xsl:value-of select="concat('__', ../@target)"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:text> probe </xsl:text>
+ <!-- <xsl:value-of select="concat($dtracetopclass, '__', $dtracemethodname, $dtracenamehack, '__enter(struct ', $dtracetopclass, ' *a_pThis')"/> -->
+ <xsl:value-of select="concat($dtracetopclass, '__', $dtracemethodname, $dtracenamehack, '__enter(void *a_pThis')"/>
+ <xsl:for-each select="param[@dir='in']">
+ <xsl:text>, </xsl:text>
+ <xsl:apply-templates select="@type" mode="dtraceparamdecl">
+ <xsl:with-param name="dir" select="'@dir'"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ <xsl:text>);
+ probe </xsl:text>
+ <!-- <xsl:value-of select="concat($dtracetopclass, '__', $dtracemethodname, '__return(struct ', $dtracetopclass, ' *a_pThis')"/> -->
+ <xsl:value-of select="concat($dtracetopclass, '__', $dtracemethodname, $dtracenamehack, '__return(void *a_pThis')"/>
+ <xsl:text>, uint32_t a_hrc, int32_t enmWhy</xsl:text>
+ <xsl:for-each select="param">
+ <xsl:text>, </xsl:text>
+ <xsl:apply-templates select="@type" mode="dtraceparamdecl">
+ <xsl:with-param name="dir" select="'@dir'"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ <xsl:text>);
+</xsl:text>
+
+</xsl:template>
+
+
+<xsl:template name="emitIf">
+ <xsl:param name="passmode"/>
+ <xsl:param name="target"/>
+ <xsl:param name="topclass"/>
+ <xsl:param name="emitmode"/>
+ <xsl:param name="dtracetopclass"/>
+
+ <xsl:if test="($target = 'xpidl') or ($target = 'midl')">
+ <xsl:choose>
+ <xsl:when test="$passmode='public'">
+ <xsl:choose>
+ <xsl:when test="$emitmode='method'">
+ <xsl:apply-templates select="method" mode="public">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$emitmode='attribute'">
+ <xsl:apply-templates select="attribute" mode="public">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$passmode='wrapped'">
+ <xsl:choose>
+ <xsl:when test="$emitmode='method'">
+ <xsl:apply-templates select="method" mode="wrapped">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$emitmode='attribute'">
+ <xsl:apply-templates select="attribute" mode="wrapped">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$passmode='code'">
+ <xsl:choose>
+ <xsl:when test="$emitmode='method'">
+ <xsl:apply-templates select="method" mode="code">
+ <xsl:with-param name="target" select="$target"/>
+ <xsl:with-param name="topclass" select="$topclass"/>
+ <xsl:with-param name="dtracetopclass" select="$dtracetopclass"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$emitmode='attribute'">
+ <xsl:apply-templates select="attribute" mode="code">
+ <xsl:with-param name="target" select="$target"/>
+ <xsl:with-param name="topclass" select="$topclass"/>
+ <xsl:with-param name="dtracetopclass" select="$dtracetopclass"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$passmode = 'dtrace-probes'">
+ <xsl:choose>
+ <xsl:when test="$emitmode = 'method'">
+ <xsl:apply-templates select="method" mode="dtrace-probes">
+ <xsl:with-param name="target" select="$target"/>
+ <xsl:with-param name="topclass" select="$topclass"/>
+ <xsl:with-param name="dtracetopclass" select="$dtracetopclass"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$emitmode = 'attribute'">
+ <xsl:apply-templates select="attribute" mode="dtrace-probes">
+ <xsl:with-param name="target" select="$target"/>
+ <xsl:with-param name="topclass" select="$topclass"/>
+ <xsl:with-param name="dtracetopclass" select="$dtracetopclass"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="if" mode="public">
+ <xsl:param name="emitmode"/>
+
+ <xsl:call-template name="emitIf">
+ <xsl:with-param name="passmode" select="'public'"/>
+ <xsl:with-param name="target" select="@target"/>
+ <xsl:with-param name="emitmode" select="$emitmode"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="if" mode="wrapped">
+ <xsl:param name="emitmode"/>
+
+ <xsl:call-template name="emitIf">
+ <xsl:with-param name="passmode" select="'wrapped'"/>
+ <xsl:with-param name="target" select="@target"/>
+ <xsl:with-param name="emitmode" select="$emitmode"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="if" mode="code">
+ <xsl:param name="topclass"/>
+ <xsl:param name="emitmode"/>
+ <xsl:param name="dtracetopclass"/>
+
+ <xsl:call-template name="emitIf">
+ <xsl:with-param name="passmode" select="'code'"/>
+ <xsl:with-param name="target" select="@target"/>
+ <xsl:with-param name="emitmode" select="$emitmode"/>
+ <xsl:with-param name="topclass" select="$topclass"/>
+ <xsl:with-param name="dtracetopclass" select="$dtracetopclass"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="if" mode="dtrace-probes">
+ <xsl:param name="topclass"/>
+ <xsl:param name="emitmode"/>
+ <xsl:param name="dtracetopclass"/>
+
+ <xsl:call-template name="emitIf">
+ <xsl:with-param name="passmode" select="'dtrace-probes'"/>
+ <xsl:with-param name="target" select="@target"/>
+ <xsl:with-param name="emitmode" select="$emitmode"/>
+ <xsl:with-param name="topclass" select="$topclass"/>
+ <xsl:with-param name="dtracetopclass" select="$dtracetopclass"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ emit all methods of the current interface
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template name="emitMethods">
+ <xsl:param name="topclass"/>
+ <xsl:param name="pmode"/>
+ <xsl:param name="dtracetopclass"/>
+
+ <xsl:variable name="name" select="@name"/>
+ <!-- first recurse to emit all base interfaces -->
+ <xsl:variable name="extends" select="@extends"/>
+ <xsl:if test="$extends and not($extends='$unknown') and not($extends='$errorinfo')">
+ <xsl:for-each select="key('G_keyInterfacesByName', $extends)">
+ <xsl:call-template name="emitMethods">
+ <xsl:with-param name="topclass" select="$topclass"/>
+ <xsl:with-param name="pmode" select="$pmode"/>
+ <xsl:with-param name="dtracetopclass" select="$dtracetopclass"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$pmode='code'">
+ <xsl:text>//
+</xsl:text>
+ <xsl:value-of select="concat('// ', $name, ' methods')"/>
+ <xsl:text>
+//
+
+</xsl:text>
+ </xsl:when>
+ <xsl:when test="$pmode='dtrace-probes'"/>
+ <xsl:otherwise>
+ <xsl:value-of select="concat($G_sNewLine, ' /** @name ', translate(substring($pmode, 1, 1), $G_lowerCase, $G_upperCase), substring($pmode,2), ' ', $name, ' methods', $G_sNewLine)"/>
+ <xsl:text> * @{ */
+</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="$pmode='public'">
+ <xsl:apply-templates select="./method | ./if" mode="public">
+ <xsl:with-param name="emitmode" select="'method'"/>
+ </xsl:apply-templates>
+ <xsl:variable name="reservedMethods" select="@reservedMethods"/>
+ <xsl:if test="$reservedMethods > 0">
+ <!-- tricky way to do a "for" loop without recursion -->
+ <xsl:for-each select="(//*)[position() &lt;= $reservedMethods]">
+ <xsl:text> STDMETHOD(InternalAndReservedMethod</xsl:text>
+ <xsl:value-of select="concat(position(), $name)"/>
+ <xsl:text>)();&#x0A;</xsl:text>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$pmode='wrapped'">
+ <xsl:apply-templates select="./method | ./if" mode="wrapped">
+ <xsl:with-param name="emitmode" select="'method'"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$pmode='code'">
+ <xsl:apply-templates select="./method | ./if" mode="code">
+ <xsl:with-param name="topclass" select="$topclass"/>
+ <xsl:with-param name="dtracetopclass" select="$dtracetopclass"/>
+ <xsl:with-param name="emitmode" select="'method'"/>
+ </xsl:apply-templates>
+ <xsl:variable name="reservedMethods" select="@reservedMethods"/>
+ <xsl:if test="$reservedMethods > 0">
+ <!-- tricky way to do a "for" loop without recursion -->
+ <xsl:for-each select="(//*)[position() &lt;= $reservedMethods]">
+ <xsl:value-of select="concat('STDMETHODIMP ', $topclass, 'Wrap::InternalAndReservedMethod', position(), $name, '()&#x0A;')"/>
+ <xsl:text>{
+ return E_NOTIMPL;
+}
+
+</xsl:text>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$pmode='dtrace-probes'">
+ <xsl:apply-templates select="./method | ./if" mode="dtrace-probes">
+ <xsl:with-param name="topclass" select="$topclass"/>
+ <xsl:with-param name="dtracetopclass" select="$dtracetopclass"/>
+ <xsl:with-param name="emitmode" select="'method'"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+
+ <!-- close doxygen @name -->
+ <xsl:if test="($pmode != 'code') and ($pmode != 'dtrace-probes')" >
+ <xsl:text> /** @} */
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ emit all attributes and methods declarations of the current interface
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template name="emitInterfaceDecls">
+ <xsl:param name="pmode"/>
+
+ <!-- attributes -->
+ <xsl:call-template name="emitAttributes">
+ <xsl:with-param name="pmode" select="$pmode"/>
+ </xsl:call-template>
+
+ <!-- methods -->
+ <xsl:call-template name="emitMethods">
+ <xsl:with-param name="pmode" select="$pmode"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ emit auxiliary method declarations of the current interface
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template name="emitAuxMethodDecls">
+ <!-- currently nothing, maybe later some generic FinalConstruct/... helper declaration for ComObjPtr -->
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ emit the header file of the current interface
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template name="emitHeader">
+ <xsl:param name="addinterfaces"/>
+
+ <xsl:variable name="filename" select="concat(substring(@name, 2), 'Wrap.h')"/>
+
+ <xsl:apply-templates select="." mode="startfile">
+ <xsl:with-param name="file" select="$filename"/>
+ </xsl:apply-templates>
+ <xsl:call-template name="fileheader">
+ <xsl:with-param name="name" select="$filename"/>
+ <xsl:with-param name="class" select="substring(@name, 2)"/>
+ <xsl:with-param name="type" select="'header'"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="." mode="classheader">
+ <xsl:with-param name="addinterfaces" select="$addinterfaces"/>
+ </xsl:apply-templates>
+
+ <!-- interface attributes/methods (public) -->
+ <xsl:call-template name="emitInterfaceDecls">
+ <xsl:with-param name="pmode" select="'public'"/>
+ </xsl:call-template>
+
+ <xsl:for-each select="exsl:node-set($addinterfaces)/token">
+ <!-- This is super tricky, as the for-each switches to the node set,
+ which means the normal document isn't available any more. We get
+ the data we need, uses a for-each to switch document and then a
+ key() to look up the interface by name. -->
+ <xsl:variable name="addifname">
+ <xsl:value-of select="string(.)"/>
+ </xsl:variable>
+ <xsl:for-each select="$G_root">
+ <xsl:for-each select="key('G_keyInterfacesByName', $addifname)">
+ <xsl:call-template name="emitInterfaceDecls">
+ <xsl:with-param name="pmode" select="'public'"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:for-each>
+
+ <!-- auxiliary methods (public) -->
+ <xsl:call-template name="emitAuxMethodDecls"/>
+
+ <!-- switch to private -->
+ <xsl:text>
+private:</xsl:text>
+
+ <!-- wrapped interface attributes/methods (private) -->
+ <xsl:call-template name="emitInterfaceDecls">
+ <xsl:with-param name="pmode" select="'wrapped'"/>
+ </xsl:call-template>
+
+ <xsl:for-each select="exsl:node-set($addinterfaces)/token">
+ <!-- This is super tricky, as the for-each switches to the node set,
+ which means the normal document isn't available any more. We get
+ the data we need, uses a for-each to switch document and then a
+ key() to look up the interface by name. -->
+ <xsl:variable name="addifname">
+ <xsl:value-of select="string(.)"/>
+ </xsl:variable>
+ <xsl:for-each select="$G_root">
+ <xsl:for-each select="key('G_keyInterfacesByName', $addifname)">
+ <xsl:call-template name="emitInterfaceDecls">
+ <xsl:with-param name="pmode" select="'wrapped'"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:for-each>
+
+ <xsl:apply-templates select="." mode="classfooter"/>
+ <xsl:apply-templates select="." mode="endfile">
+ <xsl:with-param name="file" select="$filename"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ emit all attributes and methods definitions (pmode=code) or probes (pmode=dtrace-probes) of the current interface
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template name="emitInterfaceDefs">
+ <xsl:param name="addinterfaces"/>
+ <xsl:param name="pmode" select="'code'"/>
+
+ <xsl:variable name="topclass" select="substring(@name, 2)"/>
+ <xsl:variable name="dtracetopclass">
+ <xsl:choose>
+ <xsl:when test="@dtracename"><xsl:value-of select="@dtracename"/></xsl:when>
+ <xsl:otherwise><xsl:value-of select="$topclass"/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$pmode = 'code'">
+ <xsl:value-of select="concat('DEFINE_EMPTY_CTOR_DTOR(', $topclass, 'Wrap)', $G_sNewLine, $G_sNewLine)"/>
+ </xsl:if>
+
+ <!-- attributes -->
+ <xsl:call-template name="emitAttributes">
+ <xsl:with-param name="topclass" select="$topclass"/>
+ <xsl:with-param name="dtracetopclass" select="$dtracetopclass"/>
+ <xsl:with-param name="pmode" select="$pmode"/>
+ </xsl:call-template>
+
+ <xsl:for-each select="exsl:node-set($addinterfaces)/token">
+ <!-- This is super tricky, as the for-each switches to the node set,
+ which means the normal document isn't available any more. We get
+ the data we need, uses a for-each to switch document and then a
+ key() to look up the interface by name. -->
+ <xsl:variable name="addifname">
+ <xsl:value-of select="string(.)"/>
+ </xsl:variable>
+ <xsl:for-each select="$G_root">
+ <xsl:for-each select="key('G_keyInterfacesByName', $addifname)">
+ <xsl:call-template name="emitAttributes">
+ <xsl:with-param name="topclass" select="$topclass"/>
+ <xsl:with-param name="dtracetopclass" select="$dtracetopclass"/>
+ <xsl:with-param name="pmode" select="$pmode"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:for-each>
+
+ <!-- methods -->
+ <xsl:call-template name="xsltprocNewlineOutputHack"/>
+ <xsl:call-template name="emitMethods">
+ <xsl:with-param name="topclass" select="$topclass"/>
+ <xsl:with-param name="dtracetopclass" select="$dtracetopclass"/>
+ <xsl:with-param name="pmode" select="$pmode"/>
+ </xsl:call-template>
+
+ <xsl:for-each select="exsl:node-set($addinterfaces)/token">
+ <!-- This is super tricky, as the for-each switches to the node set,
+ which means the normal document isn't available any more. We get
+ the data we need, uses a for-each to switch document and then a
+ key() to look up the interface by name. -->
+ <xsl:variable name="addifname">
+ <xsl:value-of select="string(.)"/>
+ </xsl:variable>
+ <xsl:for-each select="$G_root">
+ <xsl:for-each select="key('G_keyInterfacesByName', $addifname)">
+ <xsl:call-template name="emitMethods">
+ <xsl:with-param name="topclass" select="$topclass"/>
+ <xsl:with-param name="dtracetopclass" select="$dtracetopclass"/>
+ <xsl:with-param name="pmode" select="$pmode"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:for-each>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ emit auxiliary method declarations of the current interface
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template name="emitAuxMethodDefs">
+ <xsl:param name="pmode" select="'code'"/>
+ <!-- currently nothing, maybe later some generic FinalConstruct/... implementation -->
+</xsl:template>
+
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ emit the code file of the current interface
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template name="emitCode">
+ <xsl:param name="addinterfaces"/>
+
+ <xsl:variable name="filename" select="concat(substring(@name, 2), 'Wrap.cpp')"/>
+
+ <xsl:apply-templates select="." mode="startfile">
+ <xsl:with-param name="file" select="$filename"/>
+ </xsl:apply-templates>
+ <xsl:call-template name="fileheader">
+ <xsl:with-param name="name" select="$filename"/>
+ <xsl:with-param name="class" select="substring(@name, 2)"/>
+ <xsl:with-param name="type" select="'code'"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="." mode="codeheader">
+ <xsl:with-param name="addinterfaces" select="$addinterfaces"/>
+ </xsl:apply-templates>
+
+ <!-- interface attributes/methods (public) -->
+ <xsl:call-template name="emitInterfaceDefs">
+ <xsl:with-param name="addinterfaces" select="$addinterfaces"/>
+ </xsl:call-template>
+
+ <!-- auxiliary methods (public) -->
+ <xsl:call-template name="emitAuxMethodDefs"/>
+
+ <xsl:apply-templates select="." mode="codefooter">
+ <xsl:with-param name="addinterfaces" select="$addinterfaces"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="." mode="endfile">
+ <xsl:with-param name="file" select="$filename"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ emit the DTrace probes for the current interface
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template name="emitDTraceProbes">
+ <xsl:param name="addinterfaces"/>
+
+ <!-- interface attributes/methods (public) -->
+ <xsl:call-template name="emitInterfaceDefs">
+ <xsl:with-param name="addinterfaces" select="$addinterfaces"/>
+ <xsl:with-param name="pmode">dtrace-probes</xsl:with-param>
+ </xsl:call-template>
+
+ <!-- auxiliary methods (public) -->
+ <xsl:call-template name="emitAuxMethodDefs">
+ <xsl:with-param name="pmode">dtrace-probes</xsl:with-param>
+ </xsl:call-template>
+
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ wildcard match, ignore everything which has no explicit match
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template match="*"/>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ ignore all if tags except those for XPIDL or MIDL target
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template match="if">
+ <xsl:if test="(@target = 'xpidl') or (@target = 'midl')">
+ <xsl:apply-templates/>
+ </xsl:if>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ interface match
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template match="interface">
+ <xsl:if test="not(@internal='yes') and not(@autogen='VBoxEvent') and not(@supportsErrorInfo='no')">
+ <xsl:call-template name="emitInterface"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ application match
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template match="application">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ library match
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template match="library">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ root match
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template match="/idl">
+ <xsl:choose>
+ <xsl:when test="$generating = 'headers'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="$generating = 'sources'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="$generating = 'dtrace-probes'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ Unknown string parameter value: generating='<xsl:value-of select="$generating"/>'
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
+<!-- vi: set tabstop=4 shiftwidth=4 expandtab: -->
diff --git a/src/VBox/Main/idl/comimpl.xsl b/src/VBox/Main/idl/comimpl.xsl
new file mode 100644
index 00000000..5119bbfb
--- /dev/null
+++ b/src/VBox/Main/idl/comimpl.xsl
@@ -0,0 +1,1182 @@
+<xsl:stylesheet version = '1.0'
+ xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
+ xmlns:vbox="http://www.virtualbox.org/"
+ xmlns:exsl="http://exslt.org/common"
+ extension-element-prefixes="exsl">
+
+<!--
+ comimpl.xsl:
+ XSLT stylesheet that generates COM C++ classes implementing
+ interfaces described in VirtualBox.xidl.
+ For now we generate implementation for events, as they are
+ rather trivial container classes for their read-only attributes.
+ Further extension to other interfaces is possible and anticipated.
+-->
+<!--
+ Copyright (C) 2010-2023 Oracle and/or its affiliates.
+
+ This file is part of VirtualBox base platform packages, as
+ available from https://www.virtualbox.org.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, in version 3 of the
+ License.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <https://www.gnu.org/licenses>.
+
+ SPDX-License-Identifier: GPL-3.0-only
+-->
+
+<xsl:output
+ method="text"
+ version="1.0"
+ encoding="utf-8"
+ indent="no"/>
+
+<xsl:include href="typemap-shared.inc.xsl" />
+
+<!-- $G_kind contains what kind of COM class implementation we generate -->
+<xsl:variable name="G_xsltFilename" select="'autogen.xsl'" />
+<xsl:variable name="G_generateBstrVariants" select="'no'" />
+
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ Keys for more efficiently looking up of types.
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:key name="G_keyEnumsByName" match="//enum[@name]" use="@name"/>
+<xsl:key name="G_keyInterfacesByName" match="//interface[@name]" use="@name"/>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template name="fileheader">
+ <xsl:param name="name" />
+ <xsl:text>/** @file </xsl:text>
+ <xsl:value-of select="$name"/>
+ <xsl:text>
+ * DO NOT EDIT! This is a generated file.
+ * Generated from: src/VBox/Main/idl/VirtualBox.xidl (VirtualBox's interface definitions in XML)
+ * Generator: src/VBox/Main/idl/comimpl.xsl
+ */
+
+/*
+ * Copyright (C) 2010-2023 Oracle and/or its affiliates.
+ *
+ * This file is part of VirtualBox base platform packages, as
+ * available from https://www.virtualbox.org.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, in version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see &lt;https://www.gnu.org/licenses&gt;.
+ *
+ * SPDX-License-Identifier: GPL-3.0-only
+ */
+
+</xsl:text>
+</xsl:template>
+
+<xsl:template name="genComEntry">
+ <xsl:param name="name" />
+ <xsl:variable name="extends">
+ <xsl:value-of select="key('G_keyInterfacesByName', $name)/@extends" />
+ </xsl:variable>
+
+ <xsl:value-of select="concat(' COM_INTERFACE_ENTRY(', $name, ')&#10;')" />
+ <xsl:choose>
+ <xsl:when test="$extends='$unknown'">
+ <!-- Reached base -->
+ </xsl:when>
+ <xsl:when test="count(key('G_keyInterfacesByName', $extends)) > 0">
+ <xsl:call-template name="genComEntry">
+ <xsl:with-param name="name" select="$extends" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="fatalError">
+ <xsl:with-param name="msg" select="concat('No idea how to process it: ', $extends)" />
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="typeIdl2Back">
+ <xsl:param name="type" />
+ <xsl:param name="safearray" />
+ <xsl:param name="param" />
+ <xsl:param name="dir" />
+ <xsl:param name="mod" />
+ <xsl:param name="utf8str" select="'no'" />
+
+ <xsl:choose>
+ <xsl:when test="$safearray='yes'">
+ <xsl:variable name="elemtype">
+ <xsl:call-template name="typeIdl2Back">
+ <xsl:with-param name="type" select="$type" />
+ <xsl:with-param name="safearray" select="''" />
+ <xsl:with-param name="dir" select="'in'" />
+ <xsl:with-param name="utf8str" select="$utf8str" />
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$param and ($dir='in')">
+ <xsl:value-of select="concat('ComSafeArrayIn(',$elemtype,',', $param,')')"/>
+ </xsl:when>
+ <xsl:when test="$param and ($dir='out')">
+ <xsl:value-of select="concat('ComSafeArrayOut(',$elemtype,', ', $param, ')')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat('com::SafeArray&lt;',$elemtype,'&gt;')"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$mod='ptr'">
+ <xsl:value-of select="'BYTE *'" />
+ </xsl:when>
+ <xsl:when test="(($type='wstring') or ($type='uuid'))">
+ <xsl:choose>
+ <xsl:when test="$param and ($dir='in') and ($utf8str!='yes')">
+ <xsl:value-of select="'CBSTR'"/>
+ </xsl:when>
+ <xsl:when test="$param and ($dir='in') and ($utf8str='yes')">
+ <xsl:value-of select="'const Utf8Str &amp;'"/>
+ </xsl:when>
+ <xsl:when test="$param and ($dir='out')">
+ <xsl:value-of select="'BSTR'"/>
+ </xsl:when>
+ <xsl:when test="$param and ($dir='out') and ($utf8str='yes')">
+ <xsl:value-of select="'Utf8Str &amp;'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="'Utf8Str'"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="count(key('G_keyEnumsByName', $type)) > 0">
+ <xsl:value-of select="concat($type,'_T')"/>
+ </xsl:when>
+ <xsl:when test="count(key('G_keyInterfacesByName', $type)) > 0">
+ <xsl:choose>
+ <xsl:when test="$param">
+ <xsl:value-of select="concat($type,' *')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat('ComPtr&lt;',$type,'&gt;')"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$type='boolean'">
+ <xsl:value-of select="'BOOL'" />
+ </xsl:when>
+ <xsl:when test="$type='octet'">
+ <xsl:value-of select="'BYTE'" />
+ </xsl:when>
+ <xsl:when test="$type='unsigned short'">
+ <xsl:value-of select="'USHORT'" />
+ </xsl:when>
+ <xsl:when test="$type='short'">
+ <xsl:value-of select="'SHORT'" />
+ </xsl:when>
+ <xsl:when test="$type='unsigned long'">
+ <xsl:value-of select="'ULONG'" />
+ </xsl:when>
+ <xsl:when test="$type='long'">
+ <xsl:value-of select="'LONG'" />
+ </xsl:when>
+ <xsl:when test="$type='unsigned long long'">
+ <xsl:value-of select="'ULONG64'" />
+ </xsl:when>
+ <xsl:when test="$type='long long'">
+ <xsl:value-of select="'LONG64'" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="fatalError">
+ <xsl:with-param name="msg" select="concat('Unhandled type: ', $type)" />
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="$dir='out'">
+ <xsl:value-of select="' *'"/>
+ </xsl:if>
+ <xsl:if test="$param and not($param='_')">
+ <xsl:value-of select="concat(' ', $param)"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<!-- Checks if interface $name has any string attributes, producing '1' for each string attrib.
+ No output if no string attributes -->
+<xsl:template name="hasStringAttributes">
+ <xsl:param name="name" />
+
+ <!-- Recurse into parent interfaces: -->
+ <xsl:variable name="extends">
+ <xsl:value-of select="key('G_keyInterfacesByName', $name)/@extends" />
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$extends='IEvent'">
+ </xsl:when>
+ <xsl:when test="$extends='IReusableEvent'">
+ </xsl:when>
+ <xsl:when test="count(key('G_keyInterfacesByName', $extends)) > 0">
+ <xsl:call-template name="hasStringAttributes">
+ <xsl:with-param name="name" select="$extends" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="fatalError">
+ <xsl:with-param name="msg" select="concat('No idea how to process it: ', $name)" />
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <!-- Find immediate string and uuid attributes and output '1' for each one: -->
+ <xsl:for-each select="key('G_keyInterfacesByName', $name)/attribute[(@type = 'wstring' or @type = 'uuid') and (@name != 'midlDoesNotLikeEmptyInterfaces')]">
+ <xsl:text>1</xsl:text>
+ </xsl:for-each>
+</xsl:template>
+
+
+<xsl:template name="genSetParam">
+ <xsl:param name="member"/>
+ <xsl:param name="param"/>
+ <xsl:param name="type"/>
+ <xsl:param name="safearray"/>
+ <xsl:param name="internal"/>
+
+ <xsl:choose>
+ <xsl:when test="$safearray='yes'">
+ <xsl:variable name="elemtype">
+ <xsl:call-template name="typeIdl2Back">
+ <xsl:with-param name="type" select="$type" />
+ <xsl:with-param name="safearray" select="''" />
+ <xsl:with-param name="dir" select="'in'" />
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:text> SafeArray&lt;</xsl:text><xsl:value-of select="$elemtype"/>
+ <xsl:text>&gt; aArr(ComSafeArrayInArg(</xsl:text><xsl:value-of select="$param"/><xsl:text>));&#10;</xsl:text>
+ <xsl:text> return </xsl:text><xsl:value-of select="$member"/><xsl:text>.initFrom(aArr);&#10;</xsl:text>
+ </xsl:when>
+ <xsl:when test="($type='wstring') or ($type='uuid')">
+ <xsl:text> return </xsl:text><xsl:value-of select="$member"/><xsl:text>.assignEx(</xsl:text>
+ <xsl:value-of select="$param"/><xsl:text>);&#10;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat(' ', $member, ' = ', $param, ';&#10;')"/>
+ <xsl:if test="$internal!='yes'">
+ <xsl:text> return S_OK;&#10;</xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="genRetParam">
+ <xsl:param name="member"/>
+ <xsl:param name="param"/>
+ <xsl:param name="type"/>
+ <xsl:param name="safearray"/>
+ <xsl:choose>
+ <xsl:when test="$safearray='yes'">
+ <xsl:variable name="elemtype">
+ <xsl:call-template name="typeIdl2Back">
+ <xsl:with-param name="type" select="$type" />
+ <xsl:with-param name="safearray" select="''" />
+ <xsl:with-param name="dir" select="'in'" />
+ </xsl:call-template>
+ </xsl:variable>
+<!-- @todo String arrays probably needs work, I doubt we're generating sensible code for them at the moment. -->
+ <xsl:text> SafeArray&lt;</xsl:text><xsl:value-of select="$elemtype"/><xsl:text>&gt; result;&#10;</xsl:text>
+ <xsl:text> HRESULT hrc = </xsl:text><xsl:value-of select="$member"/><xsl:text>.cloneTo(result);&#10;</xsl:text>
+ <xsl:text> if (SUCCEEDED(hrc))&#10;</xsl:text>
+ <xsl:text> result.detachTo(ComSafeArrayOutArg(</xsl:text><xsl:value-of select="$param"/><xsl:text>));&#10;</xsl:text>
+ <xsl:text> return hrc;&#10;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="($type='wstring') or ($type = 'uuid')">
+ <xsl:text> return </xsl:text><xsl:value-of select="$member"/><xsl:text>.cloneToEx(</xsl:text>
+ <xsl:value-of select="$param"/><xsl:text>);&#10;</xsl:text>
+ </xsl:when>
+ <xsl:when test="count(key('G_keyInterfacesByName', $type)) > 0">
+ <xsl:text> return </xsl:text><xsl:value-of select="$member"/><xsl:text>.queryInterfaceTo(</xsl:text>
+ <xsl:value-of select="$param"/><xsl:text>);&#10;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text> *</xsl:text><xsl:value-of select="$param"/><xsl:text> = </xsl:text>
+ <xsl:value-of select="$member"/><xsl:text>;&#10;</xsl:text>
+ <xsl:text> return S_OK;&#10;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="genFormalParams">
+ <xsl:param name="name" />
+ <xsl:param name="utf8str" />
+ <xsl:variable name="extends">
+ <xsl:value-of select="key('G_keyInterfacesByName', $name)/@extends" />
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$extends='IEvent'">
+ </xsl:when>
+ <xsl:when test="$extends='IReusableEvent'">
+ </xsl:when>
+ <xsl:when test="count(key('G_keyInterfacesByName', $extends)) > 0">
+ <xsl:call-template name="genFormalParams">
+ <xsl:with-param name="name" select="$extends" />
+ <xsl:with-param name="utf8str" select="$utf8str" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="fatalError">
+ <xsl:with-param name="msg" select="concat('No idea how to process it: ', $name)" />
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:for-each select="key('G_keyInterfacesByName', $name)/attribute[@name != 'midlDoesNotLikeEmptyInterfaces']">
+ <xsl:variable name="aName" select="concat('a_',@name)"/>
+ <xsl:variable name="aTypeName">
+ <xsl:call-template name="typeIdl2Back">
+ <xsl:with-param name="type" select="@type" />
+ <xsl:with-param name="safearray" select="@safearray" />
+ <xsl:with-param name="param" select="$aName" />
+ <xsl:with-param name="dir" select="'in'" />
+ <xsl:with-param name="mod" select="@mod" />
+ <xsl:with-param name="utf8str" select="$utf8str" />
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="concat(', ',$aTypeName)"/>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template name="genCallParams">
+ <xsl:param name="name" />
+ <xsl:variable name="extends">
+ <xsl:value-of select="key('G_keyInterfacesByName', $name)/@extends" />
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$extends='IEvent'">
+ </xsl:when>
+ <xsl:when test="$extends='IReusableEvent'">
+ </xsl:when>
+ <xsl:when test="count(key('G_keyInterfacesByName', $extends)) > 0">
+ <xsl:call-template name="genCallParams">
+ <xsl:with-param name="name" select="$extends" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="fatalError">
+ <xsl:with-param name="msg" select="concat('No idea how to process it: ', $name)" />
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:for-each select="key('G_keyInterfacesByName', $name)/attribute[@name != 'midlDoesNotLikeEmptyInterfaces']">
+ <xsl:variable name="aName" select="concat('a_',@name)"/>
+ <xsl:choose>
+ <xsl:when test="@safearray='yes'">
+ <xsl:value-of select="concat(', ComSafeArrayInArg(',$aName,')')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat(', ',$aName)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template name="genAttrInitCode">
+ <xsl:param name="name" />
+ <xsl:param name="obj" />
+ <xsl:variable name="extends">
+ <xsl:value-of select="key('G_keyInterfacesByName', $name)/@extends" />
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$extends='IEvent'">
+ </xsl:when>
+ <xsl:when test="$extends='IReusableEvent'">
+ </xsl:when>
+ <xsl:when test="count(key('G_keyInterfacesByName', $extends)) > 0">
+ <xsl:call-template name="genAttrInitCode">
+ <xsl:with-param name="name" select="$extends" />
+ <xsl:with-param name="obj" select="$obj" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="fatalError">
+ <xsl:with-param name="msg" select="concat('No idea how to process it: ', $name)" />
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:for-each select="key('G_keyInterfacesByName', $name)/attribute[@name != 'midlDoesNotLikeEmptyInterfaces']">
+ <xsl:variable name="aName" select="concat('a_',@name)"/>
+ <xsl:variable name="aTypeName">
+ <xsl:call-template name="typeIdl2Back">
+ <xsl:with-param name="type" select="@type" />
+ <xsl:with-param name="safearray" select="@safearray" />
+ <xsl:with-param name="param" select="$aName" />
+ <xsl:with-param name="dir" select="'in'" />
+ <xsl:with-param name="mod" select="@mod" />
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="aType">
+ <xsl:call-template name="typeIdl2Back">
+ <xsl:with-param name="type" select="@type" />
+ <xsl:with-param name="safearray" select="@safearray" />
+ <xsl:with-param name="param" select="'_'" />
+ <xsl:with-param name="dir" select="'in'" />
+ <xsl:with-param name="mod" select="@mod" />
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="@safearray='yes'">
+ <xsl:variable name="elemtype">
+ <xsl:call-template name="typeIdl2Back">
+ <xsl:with-param name="type" select="@type" />
+ <xsl:with-param name="safearray" select="''" />
+ <xsl:with-param name="dir" select="'in'" />
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:text> if (SUCCEEDED(hrc))&#10;</xsl:text>
+ <xsl:value-of select="concat(' hrc = ',$obj, '->set_', @name, '(ComSafeArrayInArg(a_', @name, '));&#10;')"/>
+ </xsl:when>
+ <xsl:when test="(@type='wstring') or (@type = 'uuid')">
+ <xsl:text> if (SUCCEEDED(hrc))&#10;</xsl:text>
+ <xsl:value-of select="concat(' hrc = ',$obj, '->set_', @name, '(',$aName, ');&#10;')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat(' ',$obj, '->set_', @name, '(',$aName, ');&#10;')"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template name="genImplList">
+ <xsl:param name="impl" />
+ <xsl:param name="name" />
+ <xsl:param name="depth" />
+ <xsl:param name="parents" />
+
+ <xsl:variable name="extends">
+ <xsl:value-of select="key('G_keyInterfacesByName', $name)/@extends" />
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$name='IEvent'">
+ <xsl:value-of select=" '#ifdef VBOX_WITH_XPCOM&#10;'" />
+ <xsl:value-of select="concat('NS_DECL_CLASSINFO(', $impl, ')&#10;')" />
+ <xsl:value-of select="concat('NS_IMPL_THREADSAFE_ISUPPORTS',$depth,'_CI(', $impl, $parents, ', IEvent)&#10;')" />
+ <xsl:value-of select=" '#endif&#10;&#10;'"/>
+ </xsl:when>
+ <xsl:when test="count(key('G_keyInterfacesByName', $extends)) > 0">
+ <xsl:call-template name="genImplList">
+ <xsl:with-param name="impl" select="$impl" />
+ <xsl:with-param name="name" select="$extends" />
+ <xsl:with-param name="depth" select="$depth+1" />
+ <xsl:with-param name="parents" select="concat($parents, ', ', $name)" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="fatalError">
+ <xsl:with-param name="msg" select="concat('No idea how to process it: ', $name)" />
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="genAttrCode">
+ <xsl:param name="name" />
+ <xsl:param name="depth" />
+ <xsl:param name="parents" />
+ <xsl:param name="fGenBstr" />
+
+ <xsl:variable name="extends">
+ <xsl:value-of select="key('G_keyInterfacesByName', $name)/@extends" />
+ </xsl:variable>
+
+ <xsl:for-each select="key('G_keyInterfacesByName', $name)/attribute">
+ <xsl:variable name="mName">
+ <xsl:value-of select="concat('m_', @name)" />
+ </xsl:variable>
+ <xsl:variable name="mType">
+ <xsl:call-template name="typeIdl2Back">
+ <xsl:with-param name="type" select="@type" />
+ <xsl:with-param name="safearray" select="@safearray" />
+ <xsl:with-param name="dir" select="'in'" />
+ <xsl:with-param name="mod" select="@mod" />
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="pName">
+ <xsl:value-of select="concat('a_', @name)" />
+ </xsl:variable>
+ <xsl:variable name="pTypeNameOut">
+ <xsl:call-template name="typeIdl2Back">
+ <xsl:with-param name="type" select="@type" />
+ <xsl:with-param name="safearray" select="@safearray" />
+ <xsl:with-param name="param" select="$pName" />
+ <xsl:with-param name="dir" select="'out'" />
+ <xsl:with-param name="mod" select="@mod" />
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="pTypeNameIn">
+ <xsl:call-template name="typeIdl2Back">
+ <xsl:with-param name="type" select="@type" />
+ <xsl:with-param name="safearray" select="@safearray" />
+ <xsl:with-param name="param" select="$pName" />
+ <xsl:with-param name="dir" select="'in'" />
+ <xsl:with-param name="mod" select="@mod" />
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="capsName">
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name" />
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:value-of select=" '&#10;'" />
+ <xsl:value-of select="concat(' // attribute ', @name,'&#10;')" />
+ <xsl:value-of select=" 'private:&#10;'" />
+ <xsl:value-of select="concat(' ', $mType, ' ', $mName,';&#10;')" />
+ <xsl:value-of select=" 'public:&#10;'" />
+ <xsl:value-of select="concat(' STDMETHOD(COMGETTER(', $capsName,'))(',$pTypeNameOut,') RT_OVERRIDE&#10; {&#10;')" />
+ <xsl:call-template name="genRetParam">
+ <xsl:with-param name="type" select="@type" />
+ <xsl:with-param name="member" select="$mName" />
+ <xsl:with-param name="param" select="$pName" />
+ <xsl:with-param name="safearray" select="@safearray" />
+ </xsl:call-template>
+ <xsl:value-of select=" ' }&#10;'" />
+
+ <xsl:if test="not(@readonly='yes')">
+ <xsl:value-of select="concat(' STDMETHOD(COMSETTER(', $capsName,'))(',$pTypeNameIn,') RT_OVERRIDE&#10; {&#10;')" />
+ <xsl:call-template name="genSetParam">
+ <xsl:with-param name="type" select="@type" />
+ <xsl:with-param name="member" select="$mName" />
+ <xsl:with-param name="param" select="$pName" />
+ <xsl:with-param name="safearray" select="@safearray" />
+ <xsl:with-param name="internal" select="'no'" />
+ </xsl:call-template>
+ <xsl:value-of select=" ' }&#10;'" />
+ </xsl:if>
+
+ <xsl:text> // purely internal setter&#10;</xsl:text>
+ <xsl:if test="(@type='wstring') or (@type = 'uuid')">
+ <xsl:text> inline HRESULT set_</xsl:text><xsl:value-of select="@name"/><xsl:text>(const Utf8Str &amp;a_rString)&#10;</xsl:text>
+ <xsl:text> {&#10;</xsl:text>
+ <xsl:text> return </xsl:text><xsl:value-of select="$mName"/><xsl:text>.assignEx(a_rString);&#10;</xsl:text>
+ <xsl:text> }&#10;</xsl:text>
+ </xsl:if>
+ <xsl:if test="not((@type='wstring') or (@type = 'uuid')) or $fGenBstr">
+ <xsl:text> inline </xsl:text>
+ <xsl:choose>
+ <xsl:when test="(@safearray='yes') or (@type='wstring') or (@type = 'uuid')">
+ <xsl:text>HRESULT</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>void</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="concat(' set_', @name,'(',$pTypeNameIn, ')&#10; {&#10;')" />
+ <xsl:call-template name="genSetParam">
+ <xsl:with-param name="type" select="@type" />
+ <xsl:with-param name="member" select="$mName" />
+ <xsl:with-param name="param" select="$pName" />
+ <xsl:with-param name="safearray" select="@safearray" />
+ <xsl:with-param name="internal" select="'yes'" />
+ </xsl:call-template>
+ <xsl:value-of select=" ' }&#10;'" />
+ </xsl:if>
+
+ </xsl:for-each>
+
+ <xsl:choose>
+ <xsl:when test="$extends='IEvent'">
+ <xsl:value-of select=" ' // skipping IEvent attributes &#10;'" />
+ </xsl:when>
+ <xsl:when test="$extends='IReusableEvent'">
+ <xsl:value-of select=" ' // skipping IReusableEvent attributes &#10;'" />
+ </xsl:when>
+ <xsl:when test="$extends='IVetoEvent'">
+ <xsl:value-of select=" ' // skipping IVetoEvent attributes &#10;'" />
+ </xsl:when>
+ <xsl:when test="count(key('G_keyInterfacesByName', $extends)) > 0">
+ <xsl:call-template name="genAttrCode">
+ <xsl:with-param name="name" select="$extends" />
+ <xsl:with-param name="depth" select="$depth+1" />
+ <xsl:with-param name="parents" select="concat($parents, ', ', @name)" />
+ <xsl:with-param name="fGenBstr" select="$fGenBstr" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="fatalError">
+ <xsl:with-param name="msg" select="concat('No idea how to process it: ', $extends)" />
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="genReinitFunction">
+ <xsl:param name="name"/>
+ <xsl:param name="evname"/>
+ <xsl:param name="ifname"/>
+ <xsl:param name="implName"/>
+ <xsl:param name="utf8str"/>
+
+ <xsl:value-of select="concat('DECLHIDDEN(HRESULT) Reinit', $evname, '(IEvent *aEvent')"/>
+ <xsl:call-template name="genFormalParams">
+ <xsl:with-param name="name" select="$ifname" />
+ <xsl:with-param name="utf8str" select="'no'" />
+ </xsl:call-template>
+ <xsl:text>)&#10;</xsl:text>
+ <xsl:text>{&#10;</xsl:text>
+ <xsl:text> </xsl:text><xsl:value-of select="$implName"/><xsl:text> *pEvtImpl = dynamic_cast&lt;</xsl:text>
+ <xsl:value-of select="$implName"/><xsl:text> *&gt;(aEvent);&#10;</xsl:text>
+ <xsl:text> if (pEvtImpl)&#10;</xsl:text>
+ <xsl:text> {&#10;</xsl:text>
+ <xsl:text> pEvtImpl->Reuse();&#10;</xsl:text>
+ <xsl:text> HRESULT hrc = S_OK;&#10;</xsl:text>
+ <xsl:call-template name="genAttrInitCode">
+ <xsl:with-param name="name" select="$name" />
+ <xsl:with-param name="obj" select="'pEvtImpl'" />
+ </xsl:call-template>
+ <xsl:text> return hrc;&#10;</xsl:text>
+ <xsl:text> }&#10;</xsl:text>
+ <xsl:text> return E_INVALIDARG;&#10;</xsl:text>
+ <xsl:text>}&#10;</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template name="genCreateFunction">
+ <xsl:param name="name"/>
+ <xsl:param name="evname"/>
+ <xsl:param name="ifname"/>
+ <xsl:param name="implName"/>
+ <xsl:param name="waitable"/>
+ <xsl:param name="evid"/>
+ <xsl:param name="utf8str"/>
+
+ <xsl:value-of select="concat('DECLHIDDEN(HRESULT) Create', $evname, '(IEvent **aEvent, IEventSource *aSource')"/>
+ <xsl:call-template name="genFormalParams">
+ <xsl:with-param name="name" select="$ifname" />
+ <xsl:with-param name="utf8str" select="$utf8str" />
+ </xsl:call-template>
+ <xsl:text>)&#10;</xsl:text>
+ <xsl:text>{&#10;</xsl:text>
+ <xsl:text> ComObjPtr&lt;</xsl:text><xsl:value-of select="$implName"/><xsl:text>&gt; EvtObj;&#10;</xsl:text>
+ <xsl:text> HRESULT hrc = EvtObj.createObject();&#10;</xsl:text>
+ <xsl:text> if (SUCCEEDED(hrc))&#10;</xsl:text>
+ <xsl:text> {&#10;</xsl:text>
+ <xsl:text> hrc = EvtObj-&gt;init(aSource, VBoxEventType_</xsl:text><xsl:value-of select="$evid"/>
+ <xsl:text>, </xsl:text><xsl:value-of select="$waitable" /><xsl:text> /*waitable*/);&#10;</xsl:text>
+ <xsl:call-template name="genAttrInitCode">
+ <xsl:with-param name="name" select="$name" />
+ <xsl:with-param name="obj" select="'EvtObj'" />
+ </xsl:call-template>
+ <xsl:text> if (SUCCEEDED(hrc))&#10;</xsl:text>
+ <xsl:text> {&#10;</xsl:text>
+ <xsl:text> hrc = EvtObj.queryInterfaceTo(aEvent);&#10;</xsl:text>
+ <xsl:text> if (SUCCEEDED(hrc))&#10;</xsl:text>
+ <xsl:text> return hrc;&#10;</xsl:text>
+ <xsl:text> }&#10;</xsl:text>
+ <xsl:text> }&#10;</xsl:text>
+ <xsl:text> *aEvent = NULL;&#10;</xsl:text>
+ <xsl:text> return hrc;&#10;</xsl:text>
+ <xsl:text>}&#10;</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template name="genFireFunction">
+ <xsl:param name="evname"/>
+ <xsl:param name="ifname"/>
+ <xsl:param name="utf8str"/>
+
+ <xsl:value-of select="concat('DECLHIDDEN(HRESULT) Fire', $evname, '(IEventSource *aSource')"/>
+ <xsl:call-template name="genFormalParams">
+ <xsl:with-param name="name" select="$ifname" />
+ <xsl:with-param name="utf8str" select="$utf8str" />
+ </xsl:call-template>
+ <xsl:text>)&#10;</xsl:text>
+ <xsl:text>{&#10;</xsl:text>
+ <xsl:text> AssertReturn(aSource, E_INVALIDARG);&#10;</xsl:text>
+ <xsl:text> ComPtr&lt;IEvent&gt; ptrEvent;&#10;</xsl:text>
+ <xsl:text> HRESULT hrc = </xsl:text>
+ <xsl:value-of select="concat('Create', $evname, '(ptrEvent.asOutParam(), aSource')"/>
+ <xsl:call-template name="genCallParams">
+ <xsl:with-param name="name" select="$ifname" />
+ </xsl:call-template>
+ <xsl:text>);&#10;</xsl:text>
+ <xsl:text> if (SUCCEEDED(hrc))&#10;</xsl:text>
+ <xsl:text> {&#10;</xsl:text>
+ <xsl:text> BOOL fDeliveredIgnored = FALSE;&#10;</xsl:text>
+ <xsl:text> hrc = aSource-&gt;FireEvent(ptrEvent, /* do not wait for delivery */ 0, &amp;fDeliveredIgnored);&#10;</xsl:text>
+ <xsl:text> AssertComRC(hrc);&#10;</xsl:text>
+ <xsl:text> }&#10;</xsl:text>
+ <xsl:text> return hrc;&#10;</xsl:text>
+ <xsl:text>}&#10;</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template name="genEventImpl">
+ <xsl:param name="implName" />
+ <xsl:param name="isVeto" />
+ <xsl:param name="isReusable" />
+
+ <xsl:value-of select="concat('class ATL_NO_VTABLE ',$implName,
+ '&#10; : public VirtualBoxBase&#10; , VBOX_SCRIPTABLE_IMPL(',
+ @name, ')&#10;{&#10;')" />
+ <xsl:value-of select="'public:&#10;'" />
+ <xsl:value-of select="concat(' VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(', $implName, ', ', @name, ')&#10;')" />
+ <xsl:value-of select="concat(' DECLARE_NOT_AGGREGATABLE(', $implName, ')&#10;')" />
+ <xsl:value-of select=" ' DECLARE_PROTECT_FINAL_CONSTRUCT()&#10;'" />
+ <xsl:value-of select="concat(' BEGIN_COM_MAP(', $implName, ')&#10;')" />
+ <xsl:value-of select=" ' COM_INTERFACE_ENTRY(ISupportErrorInfo)&#10;'" />
+ <xsl:value-of select="concat(' COM_INTERFACE_ENTRY(', @name, ')&#10;')" />
+ <xsl:value-of select="concat(' COM_INTERFACE_ENTRY2(IDispatch, ', @name, ')&#10;')" />
+ <xsl:value-of select="concat(' VBOX_TWEAK_INTERFACE_ENTRY(', @name, ')&#10;')" />
+
+ <xsl:call-template name="genComEntry">
+ <xsl:with-param name="name" select="@name" />
+ </xsl:call-template>
+ <xsl:value-of select=" ' END_COM_MAP()&#10;'" />
+ <xsl:value-of select="concat(' ',$implName,'() { Log12((&quot;',$implName,' %p\n&quot;, this)); }&#10;')" />
+ <xsl:value-of select="concat(' virtual ~',$implName,'() { Log12((&quot;~',$implName,' %p\n&quot;, this)); uninit(); }&#10;')" />
+ <xsl:text><![CDATA[
+ HRESULT FinalConstruct()
+ {
+ BaseFinalConstruct();
+ return mEvent.createObject();
+ }
+ void FinalRelease()
+ {
+ uninit();
+ BaseFinalRelease();
+ }
+ STDMETHOD(COMGETTER(Type))(VBoxEventType_T *aType) RT_OVERRIDE
+ {
+ return mEvent->COMGETTER(Type)(aType);
+ }
+ STDMETHOD(COMGETTER(Source))(IEventSource * *aSource) RT_OVERRIDE
+ {
+ return mEvent->COMGETTER(Source)(aSource);
+ }
+ STDMETHOD(COMGETTER(Waitable))(BOOL *aWaitable) RT_OVERRIDE
+ {
+ return mEvent->COMGETTER(Waitable)(aWaitable);
+ }
+ STDMETHOD(SetProcessed)() RT_OVERRIDE
+ {
+ return mEvent->SetProcessed();
+ }
+ STDMETHOD(WaitProcessed)(LONG aTimeout, BOOL *aResult) RT_OVERRIDE
+ {
+ return mEvent->WaitProcessed(aTimeout, aResult);
+ }
+ void uninit()
+ {
+ if (!mEvent.isNull())
+ {
+ mEvent->uninit();
+ mEvent.setNull();
+ }
+ }
+]]></xsl:text>
+ <xsl:choose>
+ <xsl:when test="$isVeto='yes'">
+<xsl:text><![CDATA[
+ HRESULT init(IEventSource *aSource, VBoxEventType_T aType, BOOL aWaitable = TRUE)
+ {
+ NOREF(aWaitable);
+ return mEvent->init(aSource, aType);
+ }
+ STDMETHOD(AddVeto)(IN_BSTR aVeto) RT_OVERRIDE
+ {
+ return mEvent->AddVeto(aVeto);
+ }
+ STDMETHOD(IsVetoed)(BOOL *aResult) RT_OVERRIDE
+ {
+ return mEvent->IsVetoed(aResult);
+ }
+ STDMETHOD(GetVetos)(ComSafeArrayOut(BSTR, aVetos)) RT_OVERRIDE
+ {
+ return mEvent->GetVetos(ComSafeArrayOutArg(aVetos));
+ }
+ STDMETHOD(AddApproval)(IN_BSTR aReason) RT_OVERRIDE
+ {
+ return mEvent->AddApproval(aReason);
+ }
+ STDMETHOD(IsApproved)(BOOL *aResult) RT_OVERRIDE
+ {
+ return mEvent->IsApproved(aResult);
+ }
+ STDMETHOD(GetApprovals)(ComSafeArrayOut(BSTR, aReasons)) RT_OVERRIDE
+ {
+ return mEvent->GetApprovals(ComSafeArrayOutArg(aReasons));
+ }
+private:
+ ComObjPtr<VBoxVetoEvent> mEvent;
+]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="$isReusable='yes'">
+ <xsl:text>
+<![CDATA[
+ HRESULT init(IEventSource *aSource, VBoxEventType_T aType, BOOL aWaitable = FALSE)
+ {
+ mGeneration = 1;
+ return mEvent->init(aSource, aType, aWaitable);
+ }
+ STDMETHOD(COMGETTER(Generation))(ULONG *aGeneration) RT_OVERRIDE
+ {
+ *aGeneration = mGeneration;
+ return S_OK;
+ }
+ STDMETHOD(Reuse)() RT_OVERRIDE
+ {
+ ASMAtomicIncU32((volatile uint32_t *)&mGeneration);
+ return S_OK;
+ }
+private:
+ volatile ULONG mGeneration;
+ ComObjPtr<VBoxEvent> mEvent;
+]]></xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+<xsl:text><![CDATA[
+ HRESULT init(IEventSource *aSource, VBoxEventType_T aType, BOOL aWaitable)
+ {
+ return mEvent->init(aSource, aType, aWaitable);
+ }
+private:
+ ComObjPtr<VBoxEvent> mEvent;
+]]></xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <!-- Before we generate attribute code, we check and make sure there are attributes here. -->
+ <xsl:if test="count(attribute) = 0 and @name != 'INATNetworkAlterEvent'">
+ <xsl:call-template name="fatalError">
+ <xsl:with-param name="msg">error: <xsl:value-of select="@name"/> has no attributes</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="genAttrCode">
+ <xsl:with-param name="name" select="@name" />
+ <xsl:with-param name="fGenBstr" select="($G_generateBstrVariants = 'yes') or (contains(@autogenflags, 'BSTR'))" />
+ </xsl:call-template>
+ <xsl:value-of select="'};&#10;'" />
+
+
+ <xsl:call-template name="genImplList">
+ <xsl:with-param name="impl" select="$implName" />
+ <xsl:with-param name="name" select="@name" />
+ <xsl:with-param name="depth" select="'1'" />
+ <xsl:with-param name="parents" select="''" />
+ </xsl:call-template>
+
+ <!-- Associate public functions. -->
+ <xsl:variable name="evname">
+ <xsl:value-of select="substring(@name, 2)" />
+ </xsl:variable>
+ <xsl:variable name="evid">
+ <xsl:value-of select="concat('On', substring(@name, 2, string-length(@name)-6))" />
+ </xsl:variable>
+ <xsl:variable name="ifname">
+ <xsl:value-of select="@name" />
+ </xsl:variable>
+ <xsl:variable name="waitable">
+ <xsl:choose>
+ <xsl:when test="@waitable='yes'">
+ <xsl:value-of select="'TRUE'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="'FALSE'"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="hasStringAttribs">
+ <xsl:call-template name="hasStringAttributes">
+ <xsl:with-param name="name" select="@name"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Generate ReinitXxxxEvent functions if reusable. -->
+ <xsl:if test="$isReusable='yes'">
+ <xsl:call-template name="genReinitFunction">
+ <xsl:with-param name="name" select="@name"/>
+ <xsl:with-param name="evname" select="$evname"/>
+ <xsl:with-param name="ifname" select="$ifname"/>
+ <xsl:with-param name="implName" select="$implName"/>
+ <xsl:with-param name="utf8str" select="'yes'"/>
+ </xsl:call-template>
+
+ <xsl:if test="($hasStringAttribs != '') and (($G_generateBstrVariants = 'yes') or (contains(@autogenflags, 'BSTR')))">
+ <xsl:call-template name="genReinitFunction">
+ <xsl:with-param name="name" select="@name"/>
+ <xsl:with-param name="evname" select="$evname"/>
+ <xsl:with-param name="ifname" select="$ifname"/>
+ <xsl:with-param name="implName" select="$implName"/>
+ <xsl:with-param name="utf8str" select="'no'"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+
+ <!-- Generate the CreateXxxxEvent function. -->
+ <xsl:call-template name="genCreateFunction">
+ <xsl:with-param name="name" select="@name"/>
+ <xsl:with-param name="evname" select="$evname"/>
+ <xsl:with-param name="ifname" select="$ifname"/>
+ <xsl:with-param name="implName" select="$implName"/>
+ <xsl:with-param name="waitable" select="$waitable"/>
+ <xsl:with-param name="evid" select="$evid"/>
+ <xsl:with-param name="utf8str" select="'yes'"/>
+ </xsl:call-template>
+
+ <xsl:if test="($hasStringAttribs != '') and (($G_generateBstrVariants = 'yes') or (contains(@autogenflags, 'BSTR')))">
+ <xsl:call-template name="genCreateFunction">
+ <xsl:with-param name="name" select="@name"/>
+ <xsl:with-param name="evname" select="$evname"/>
+ <xsl:with-param name="ifname" select="$ifname"/>
+ <xsl:with-param name="implName" select="$implName"/>
+ <xsl:with-param name="waitable" select="$waitable"/>
+ <xsl:with-param name="evid" select="$evid"/>
+ <xsl:with-param name="utf8str" select="'no'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <!-- Generate the FireXxxxEvent function. -->
+ <xsl:call-template name="genFireFunction">
+ <xsl:with-param name="evname" select="$evname"/>
+ <xsl:with-param name="ifname" select="$ifname"/>
+ <xsl:with-param name="utf8str" select="'yes'"/>
+ </xsl:call-template>
+
+ <xsl:if test="($hasStringAttribs != '') and (($G_generateBstrVariants = 'yes') or (contains(@autogenflags, 'BSTR')))">
+ <xsl:call-template name="genFireFunction">
+ <xsl:with-param name="evname" select="$evname"/>
+ <xsl:with-param name="ifname" select="$ifname"/>
+ <xsl:with-param name="utf8str" select="'no'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+</xsl:template>
+
+
+<!--
+ Produces VBoxEvents.cpp
+ -->
+<xsl:template name="genCommonEventCode">
+ <xsl:call-template name="fileheader">
+ <xsl:with-param name="name" select="'VBoxEvents.cpp'" />
+ </xsl:call-template>
+
+<xsl:text><![CDATA[
+#define LOG_GROUP LOG_GROUP_MAIN_EVENT
+#include <VBox/com/array.h>
+#include <VBox/log.h>
+#include <iprt/asm.h>
+#include "VBoxEvents.h"
+
+]]></xsl:text>
+
+ <!-- Interfaces -->
+ <xsl:for-each select="//interface[@autogen=$G_kind]">
+ <xsl:value-of select="concat('// ', @name, ' implementation code')" />
+ <xsl:call-template name="xsltprocNewlineOutputHack"/>
+ <xsl:variable name="implName">
+ <xsl:value-of select="substring(@name, 2)" />
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$G_kind='VBoxEvent'">
+ <xsl:variable name="isVeto">
+ <xsl:if test="@extends='IVetoEvent'">
+ <xsl:value-of select="'yes'" />
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="isReusable">
+ <xsl:if test="@extends='IReusableEvent'">
+ <xsl:value-of select="'yes'" />
+ </xsl:if>
+ </xsl:variable>
+ <xsl:call-template name="genEventImpl">
+ <xsl:with-param name="implName" select="$implName" />
+ <xsl:with-param name="isVeto" select="$isVeto" />
+ <xsl:with-param name="isReusable" select="$isReusable" />
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+
+</xsl:template>
+
+
+<!--
+ Produces VBoxEvents.h
+ -->
+<xsl:template name="genCommonEventHeader">
+ <xsl:call-template name="fileheader">
+ <xsl:with-param name="name" select="'VBoxEvents.h'" />
+ </xsl:call-template>
+
+ <xsl:text><![CDATA[
+#include "EventImpl.h"
+
+]]></xsl:text>
+
+ <!-- Simple methods for firing off events. -->
+ <xsl:text>/** @name Fire off events&#10;</xsl:text>
+ <xsl:text> * @{ */&#10;</xsl:text>
+ <xsl:for-each select="//interface[@autogen='VBoxEvent']">
+ <xsl:value-of select="concat('/** Fire an ', @name, ' event. */&#10;')" />
+ <xsl:variable name="evname">
+ <xsl:value-of select="substring(@name, 2)" />
+ </xsl:variable>
+ <xsl:variable name="ifname">
+ <xsl:value-of select="@name" />
+ </xsl:variable>
+ <xsl:variable name="hasStringAttribs">
+ <xsl:call-template name="hasStringAttributes">
+ <xsl:with-param name="name" select="@name"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:value-of select="concat('DECLHIDDEN(HRESULT) Fire', $evname, '(IEventSource *aSource')"/>
+ <xsl:call-template name="genFormalParams">
+ <xsl:with-param name="name" select="$ifname" />
+ <xsl:with-param name="utf8str" select="'yes'" />
+ </xsl:call-template>
+ <xsl:text>);&#10;</xsl:text>
+
+ <xsl:if test="($hasStringAttribs != '') and (($G_generateBstrVariants = 'yes') or (contains(@autogenflags, 'BSTR')))">
+ <xsl:value-of select="concat('DECLHIDDEN(HRESULT) Fire', $evname, '(IEventSource *aSource')"/>
+ <xsl:call-template name="genFormalParams">
+ <xsl:with-param name="name" select="$ifname" />
+ <xsl:with-param name="utf8str" select="'no'" />
+ </xsl:call-template>
+ <xsl:text>);&#10;</xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:text>/** @} */&#10;&#10;</xsl:text>
+
+ <!-- Event instantiation methods. -->
+ <xsl:text>/** @name Instantiate events&#10;</xsl:text>
+ <xsl:text> * @{ */&#10;</xsl:text>
+ <xsl:for-each select="//interface[@autogen='VBoxEvent']">
+ <xsl:value-of select="concat('/** Create an ', @name, ' event. */&#10;')" />
+ <xsl:variable name="evname">
+ <xsl:value-of select="substring(@name, 2)" />
+ </xsl:variable>
+ <xsl:variable name="ifname">
+ <xsl:value-of select="@name" />
+ </xsl:variable>
+ <xsl:variable name="hasStringAttribs">
+ <xsl:call-template name="hasStringAttributes">
+ <xsl:with-param name="name" select="@name"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:value-of select="concat('DECLHIDDEN(HRESULT) Create', $evname, '(IEvent **aEvent, IEventSource *aSource')"/>
+ <xsl:call-template name="genFormalParams">
+ <xsl:with-param name="name" select="$ifname" />
+ <xsl:with-param name="utf8str" select="'yes'" />
+ </xsl:call-template>
+ <xsl:text>);&#10;</xsl:text>
+
+ <xsl:if test="($hasStringAttribs != '') and (($G_generateBstrVariants = 'yes') or (contains(@autogenflags, 'BSTR')))">
+ <xsl:value-of select="concat('DECLHIDDEN(HRESULT) Create', $evname, '(IEvent **aEvent, IEventSource *aSource')"/>
+ <xsl:call-template name="genFormalParams">
+ <xsl:with-param name="name" select="$ifname" />
+ <xsl:with-param name="utf8str" select="'no'" />
+ </xsl:call-template>
+ <xsl:text>);&#10;</xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:text>/** @} */&#10;</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+
+ <!-- Reinitialization methods for reusable events. -->
+ <xsl:text>/** @name Re-init reusable events&#10;</xsl:text>
+ <xsl:text> * @{ */&#10;</xsl:text>
+ <xsl:for-each select="//interface[@autogen='VBoxEvent']">
+ <xsl:if test="@extends='IReusableEvent'">
+ <xsl:value-of select="concat('/** Re-init an ', @name, ' event. */&#10;')" />
+ <xsl:variable name="evname">
+ <xsl:value-of select="substring(@name, 2)" />
+ </xsl:variable>
+ <xsl:variable name="ifname">
+ <xsl:value-of select="@name" />
+ </xsl:variable>
+ <xsl:variable name="hasStringAttribs">
+ <xsl:call-template name="hasStringAttributes">
+ <xsl:with-param name="name" select="@name"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:value-of select="concat('DECLHIDDEN(HRESULT) Reinit', $evname, '(IEvent *aEvent')"/>
+ <xsl:call-template name="genFormalParams">
+ <xsl:with-param name="name" select="$ifname" />
+ <xsl:with-param name="utf8str" select="'yes'" />
+ </xsl:call-template>
+ <xsl:text>);&#10;</xsl:text>
+
+ <xsl:if test="($hasStringAttribs != '') and (($G_generateBstrVariants = 'yes') or (contains(@autogenflags, 'BSTR')))">
+ <xsl:value-of select="concat('DECLHIDDEN(HRESULT) Reinit', $evname, '(IEvent *aEvent')"/>
+ <xsl:call-template name="genFormalParams">
+ <xsl:with-param name="name" select="$ifname" />
+ <xsl:with-param name="utf8str" select="'no'" />
+ </xsl:call-template>
+ <xsl:text>);&#10;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:text>/** @} */&#10;</xsl:text>
+
+</xsl:template>
+
+<xsl:template match="/">
+ <!-- Global code -->
+ <xsl:choose>
+ <xsl:when test="$G_kind='VBoxEvent'">
+ <xsl:call-template name="genCommonEventCode">
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$G_kind='VBoxEventHeader'">
+ <xsl:call-template name="genCommonEventHeader">
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="fatalError">
+ <xsl:with-param name="msg" select="concat('Request unsupported: ', $G_kind)" />
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/src/VBox/Main/idl/docstrip.xsl b/src/VBox/Main/idl/docstrip.xsl
new file mode 100644
index 00000000..549e4a35
--- /dev/null
+++ b/src/VBox/Main/idl/docstrip.xsl
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+
+<!--
+ Copies the source XIDL file to the output, except that all <desc>
+ tags are stripped in the process. This is to generate a copy
+ of VirtualBox.xidl which is then used as a source for generating
+ the COM/XPCOM headers, the webservice files, the Qt bindings and
+ others. The idea is that updating the documentation tags in the
+ original XIDL should not cause a full recompile of nearly all of
+ VirtualBox.
+-->
+<!--
+ Copyright (C) 2009-2023 Oracle and/or its affiliates.
+
+ This file is part of VirtualBox base platform packages, as
+ available from https://www.virtualbox.org.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, in version 3 of the
+ License.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <https://www.gnu.org/licenses>.
+
+ SPDX-License-Identifier: GPL-3.0-only
+-->
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:output method="xml" indent="yes" encoding="utf-8" />
+
+<!-- copy everything unless there's a more specific template -->
+<xsl:template match="@*|node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+</xsl:template>
+
+<!-- swallow desc -->
+<xsl:template match="desc" />
+
+<!-- swallow all comments -->
+<xsl:template match="comment()" />
+
+</xsl:stylesheet>
+
diff --git a/src/VBox/Main/idl/doxygen.xsl b/src/VBox/Main/idl/doxygen.xsl
new file mode 100644
index 00000000..50d05169
--- /dev/null
+++ b/src/VBox/Main/idl/doxygen.xsl
@@ -0,0 +1,774 @@
+<?xml version="1.0"?>
+
+<!--
+ * A template to generate a generic IDL file from the generic interface
+ * definition expressed in XML. The generated file is intended solely to
+ * generate the documentation using Doxygen.
+-->
+<!--
+ Copyright (C) 2006-2023 Oracle and/or its affiliates.
+
+ This file is part of VirtualBox base platform packages, as
+ available from https://www.virtualbox.org.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, in version 3 of the
+ License.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <https://www.gnu.org/licenses>.
+
+ SPDX-License-Identifier: GPL-3.0-only
+-->
+
+<xsl:stylesheet
+ version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:str="http://xsltsl.org/string"
+ exclude-result-prefixes="str"
+>
+<!-- The exclude-result-prefixes attribute is needed since otherwise the <tt>
+ tag added for the ID in interface and enum descriptions would get the
+ namespace, confusing doxygen completely. -->
+
+<xsl:import href="string.xsl"/>
+
+<!-- Don't indent the output, as it's not exactly html but IDL.
+ (doxygen 1.9.6 gets confused by <dl> indent.) -->
+<xsl:output method="html" indent="no"/>
+
+<xsl:strip-space elements="*"/>
+
+
+<!--
+// Doxygen transformation rules
+/////////////////////////////////////////////////////////////////////////////
+-->
+
+<!--
+ * all text elements that are not explicitly matched are normalized
+ * (all whitespace chars are converted to single spaces)
+-->
+<!--xsl:template match="desc//text()">
+ <xsl:value-of select="concat(' ',normalize-space(.),' ')"/>
+</xsl:template-->
+
+<!--
+ Replace /* and */ sequences in the text so they won't confuse doxygen with
+ comment nesting (see IPerformanceCollector). Doxygen doesn't have any escape
+ sequence for '/' nor for '*', and xsltproc is in html mode so we cannot easily
+ output dummy elements. So, we replace the '*' with '@SLASH-ASTERISK@' and
+ '@ASTERISK-SLASH@' and run sed afterwards to change them to sequences with
+ a dummy 'b' element in-between the characters (&#42; does not work).
+
+ TODO: Find better fix for this.
+
+ ~~Also, strip leading whitespace from the first child of a 'desc' element so
+ that doxygen 1.9.6 doesn't confuse the text for a tt or pre block (older
+ versions (1.8.13) didn't used to do this).~~ - fixed by MARKDOWN_SUPPORT=NO.
+ -->
+<xsl:template match="desc//text()" name="default-text-processing">
+ <xsl:param name="text" select="."/>
+
+ <!-- xsl:variable name="stripped">
+ <xsl:choose>
+ <xsl:when test="parent::desc and position() = 1">
+ <xsl:call-template name="strip-left">
+ <xsl:with-param name="text" select="$text"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$text"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable -->
+
+ <xsl:variable name="subst1">
+ <xsl:call-template name="str:subst">
+ <!-- xsl:with-param name="text" select="$stripped" / -->
+ <xsl:with-param name="text" select="$text" />
+ <xsl:with-param name="replace" select="'/*'" />
+ <xsl:with-param name="with" select="'/@SLASH-ASTERISK@'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="subst2">
+ <xsl:call-template name="str:subst">
+ <xsl:with-param name="text" select="$subst1" />
+ <xsl:with-param name="replace" select="'*/'" />
+ <xsl:with-param name="with" select="'@ASTERISK-SLASH@/'" />
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- xsl:value-of select="concat('-dbg-',position(),'-gbd-')"/ -->
+ <xsl:value-of select="$subst2"/>
+</xsl:template>
+
+<!-- Strips leading spaces from $text. Helper for default-text-processing. -->
+<xsl:template name="strip-left">
+ <xsl:param name="text"/>
+ <xsl:choose>
+ <xsl:when test="string-length($text) > 0 and (substring($text, 1, 1) = ' ' or substring($text, 1, 1) = '&#x0A;' or substring($text, 1, 1) = '&#x0D;')">
+ <xsl:call-template name="strip-left">
+ <xsl:with-param name="text" select="substring($text, 2)"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:value-of select="$text"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+
+<!--
+ * all elements that are not explicitly matched are considered to be html tags
+ * and copied w/o modifications
+-->
+<xsl:template match="desc//*">
+ <xsl:copy>
+ <xsl:apply-templates/>
+ </xsl:copy>
+</xsl:template>
+
+<!--
+ * special treatment of <tt>, making sure that Doxygen will not interpret its
+ * contents (assuming it is a leaf tag)
+-->
+<xsl:template match="desc//tt/text()">
+ <xsl:variable name="subst1">
+ <xsl:call-template name="str:subst">
+ <xsl:with-param name="text" select="." />
+ <xsl:with-param name="replace" select="'::'" />
+ <xsl:with-param name="with" select="'\::'" />
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:call-template name="default-text-processing">
+ <xsl:with-param name="text" select="$subst1"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!--
+ * same like desc//* but place <ol> at start of line otherwise Doxygen will not
+ * find it
+-->
+<xsl:template match="desc//ol">
+ <xsl:text>&#x0A;</xsl:text>
+ <xsl:copy>
+ <xsl:apply-templates/>
+ </xsl:copy>
+</xsl:template>
+
+<!--
+ * same like desc//* but place <ul> at start of line otherwise Doxygen will not
+ * find it
+-->
+<xsl:template match="desc//ul">
+ <xsl:text>&#x0A;</xsl:text>
+ <xsl:copy>
+ <xsl:apply-templates/>
+ </xsl:copy>
+</xsl:template>
+
+<!--
+ * same like desc//* but place <pre> at start of line otherwise Doxygen will not
+ * find it
+-->
+<xsl:template match="desc//pre">
+ <xsl:text>&#x0A;</xsl:text>
+ <xsl:copy>
+ <xsl:apply-templates/>
+ </xsl:copy>
+</xsl:template>
+
+<!--
+ * paragraph
+-->
+<xsl:template match="desc//p">
+ <xsl:text>&#x0A;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&#x0A;</xsl:text>
+</xsl:template>
+
+<!--
+ * link
+-->
+<xsl:template match="desc//link">
+ <xsl:text>@link </xsl:text>
+ <!--
+ * sometimes Doxygen is stupid and cannot resolve global enums properly,
+ * thinking they are members of the current class. Fix it by adding ::
+ * in front of any @to value that doesn't start with #.
+ -->
+ <xsl:choose>
+ <xsl:when test="not(starts-with(@to, '#')) and not(contains(@to, '::'))">
+ <xsl:text>::</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ <!--
+ * Doxygen doesn't understand autolinks like Class::func() if Class
+ * doesn't actually contain a func with no arguments. Fix it.
+ -->
+ <xsl:choose>
+ <xsl:when test="substring(@to, string-length(@to)-1)='()'">
+ <xsl:value-of select="substring-before(@to, '()')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@to"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text> </xsl:text>
+ <xsl:choose>
+ <xsl:when test="normalize-space(text())">
+ <xsl:value-of select="normalize-space(text())"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="starts-with(@to, '#')">
+ <xsl:value-of select="substring-after(@to, '#')"/>
+ </xsl:when>
+ <xsl:when test="starts-with(@to, '::')">
+ <xsl:value-of select="substring-after(@to, '::')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@to"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>@endlink</xsl:text>
+ <!--
+ * insert a dummy empty B element to distinctly separate @endlink
+ * from the following text
+ -->
+ <xsl:element name="b"/>
+</xsl:template>
+
+<!--
+ * note
+-->
+<xsl:template match="desc/note">
+ <xsl:if test="not(@internal='yes')">
+ <xsl:text>&#x0A;@note </xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&#x0A;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<!--
+ * see
+-->
+<xsl:template match="desc/see">
+ <xsl:text>&#x0A;@see </xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * common comment prologue (handles group IDs)
+-->
+<xsl:template match="desc" mode="begin">
+ <xsl:param name="id" select="@group | preceding::descGroup[1]/@id"/>
+ <xsl:text>/**&#x0A;</xsl:text>
+ <xsl:if test="$id">
+ <xsl:value-of select="concat(' @ingroup ',$id,'&#x0A;')"/>
+ </xsl:if>
+</xsl:template>
+
+<!--
+ * common brief comment prologue (handles group IDs)
+-->
+<xsl:template match="desc" mode="begin_brief">
+ <xsl:param name="id" select="@group | preceding::descGroup[1]/@id"/>
+ <xsl:text>/**&#x0A;</xsl:text>
+ <xsl:if test="$id">
+ <xsl:value-of select="concat(' @ingroup ',$id,'&#x0A;')"/>
+ </xsl:if>
+ <xsl:text> @brief </xsl:text>
+</xsl:template>
+
+<!--
+ * common middle part of the comment block
+-->
+<xsl:template match="desc" mode="middle">
+ <xsl:apply-templates select="text() | *[not(self::note or self::see)]"/>
+ <xsl:apply-templates select="note"/>
+ <xsl:apply-templates select="see"/>
+</xsl:template>
+
+<!--
+ * result part of the comment block
+-->
+<xsl:template match="desc" mode="results">
+ <xsl:if test="result">
+ <xsl:text>
+@par Expected result codes:
+ </xsl:text>
+ <table>
+ <xsl:for-each select="result">
+ <tr>
+ <xsl:choose>
+ <xsl:when test="ancestor::library/result[@name=current()/@name]">
+ <td><xsl:value-of select=
+ "concat('@link ::',@name,' ',@name,' @endlink')"/></td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td><xsl:value-of select="@name"/></td>
+ </xsl:otherwise>
+ </xsl:choose>
+ <td>
+ <xsl:apply-templates select="text() | *[not(self::note or self::see or
+ self::result)]"/>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </xsl:if>
+</xsl:template>
+
+
+<!--
+ * comment for interfaces
+-->
+<xsl:template match="interface/desc">
+ <xsl:apply-templates select="." mode="begin"/>
+ <xsl:apply-templates select="." mode="middle"/>
+@par Interface ID:
+<tt>{<xsl:call-template name="str:to-upper">
+ <xsl:with-param name="text" select="../@uuid"/>
+ </xsl:call-template>}</tt>
+ <xsl:text>&#x0A;*/&#x0A;</xsl:text>
+</xsl:template>
+
+<!--
+ * comment for attributes
+-->
+<xsl:template match="attribute/desc">
+ <xsl:apply-templates select="." mode="begin"/>
+ <xsl:apply-templates select="text() | *[not(self::note or self::see or self::result)]"/>
+ <xsl:apply-templates select="." mode="results"/>
+ <xsl:apply-templates select="note"/>
+ <xsl:if test="../@mod='ptr'">
+ <xsl:text>
+
+@warning This attribute is non-scriptable. In particular, this also means that an
+attempt to get or set it from a process other than the process that has created and
+owns the object will most likely fail or crash your application.
+</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="see"/>
+ <xsl:text>&#x0A;*/&#x0A;</xsl:text>
+</xsl:template>
+
+<!--
+ * comment for methods
+-->
+<xsl:template match="method/desc">
+ <xsl:apply-templates select="." mode="begin"/>
+ <xsl:apply-templates select="text() | *[not(self::note or self::see or self::result)]"/>
+ <xsl:for-each select="../param">
+ <xsl:apply-templates select="desc"/>
+ </xsl:for-each>
+ <xsl:apply-templates select="." mode="results"/>
+ <xsl:apply-templates select="note"/>
+ <xsl:apply-templates select="../param/desc/note"/>
+ <xsl:if test="../param/@mod='ptr'">
+ <xsl:text>
+
+@warning This method is non-scriptable. In particular, this also means that an
+attempt to call it from a process other than the process that has created and
+owns the object will most likely fail or crash your application.
+</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="see"/>
+ <xsl:text>&#x0A;*/&#x0A;</xsl:text>
+</xsl:template>
+
+<!--
+ * comment for method parameters
+-->
+<xsl:template match="method/param/desc">
+ <xsl:text>&#x0A;@param </xsl:text>
+ <xsl:value-of select="../@name"/>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="text() | *[not(self::note or self::see)]"/>
+ <xsl:text>&#x0A;</xsl:text>
+</xsl:template>
+
+<!--
+ * comment for enums
+-->
+<xsl:template match="enum/desc">
+ <xsl:apply-templates select="." mode="begin"/>
+ <xsl:apply-templates select="." mode="middle"/>
+@par Interface ID:
+<tt>{<xsl:call-template name="str:to-upper">
+ <xsl:with-param name="text" select="../@uuid"/>
+ </xsl:call-template>}</tt>
+ <xsl:text>&#x0A;*/&#x0A;</xsl:text>
+</xsl:template>
+
+<!--
+ * comment for enum values
+-->
+<xsl:template match="enum/const/desc">
+ <xsl:apply-templates select="." mode="begin_brief"/>
+ <xsl:apply-templates select="." mode="middle"/>
+ <xsl:text>&#x0A;*/&#x0A;</xsl:text>
+</xsl:template>
+
+<!--
+ * comment for result codes
+-->
+<xsl:template match="result/desc">
+ <xsl:apply-templates select="." mode="begin_brief"/>
+ <xsl:apply-templates select="." mode="middle"/>
+ <xsl:text>&#x0A;*/&#x0A;</xsl:text>
+</xsl:template>
+
+<!--
+ * ignore descGroups by default (processed in /idl)
+-->
+<xsl:template match="descGroup"/>
+
+<!--
+// templates
+/////////////////////////////////////////////////////////////////////////////
+-->
+
+
+<!--
+ * header
+-->
+<xsl:template match="/idl">
+/*
+ * DO NOT EDIT! This is a generated file.
+ *
+ * Doxygen IDL definition for VirtualBox Main API (COM interfaces)
+ * generated from XIDL (XML interface definition).
+ *
+ * Source : src/VBox/Main/idl/VirtualBox.xidl
+ * Generator : src/VBox/Main/idl/doxygen.xsl
+ *
+ * This IDL is generated using some generic OMG IDL-like syntax SOLELY
+ * for the purpose of generating the documentation using Doxygen and
+ * is not syntactically valid.
+ *
+ * DO NOT USE THIS HEADER IN ANY OTHER WAY!
+ */
+
+ <!-- general description -->
+ <xsl:text>/** @mainpage &#x0A;</xsl:text>
+ <xsl:apply-templates select="desc" mode="middle"/>
+ <xsl:text>&#x0A;*/&#x0A;</xsl:text>
+
+ <!-- group (module) definitions -->
+ <xsl:for-each select="//descGroup">
+ <xsl:if test="@id and (@title or desc)">
+ <xsl:value-of select="concat('/** @defgroup ', @id, ' ', @title, '&#x0A;')"/>
+ <xsl:apply-templates select="desc" mode="middle"/>
+ <xsl:text>&#x0A;*/&#x0A;</xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+
+ <!-- everything else -->
+ <xsl:apply-templates select="*[not(self::desc)]"/>
+
+</xsl:template>
+
+
+<!--
+ * accept all <if>s
+-->
+<xsl:template match="if">
+ <xsl:apply-templates/>
+</xsl:template>
+
+
+<!--
+ * cpp_quote (ignore)
+-->
+<xsl:template match="cpp">
+</xsl:template>
+
+
+<!--
+ * #ifdef statement (@if attribute)
+-->
+<xsl:template match="@if" mode="begin">
+ <xsl:text>#if </xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text>&#x0A;</xsl:text>
+</xsl:template>
+<xsl:template match="@if" mode="end">
+ <xsl:text>#endif&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * libraries
+-->
+<xsl:template match="application">
+ <!-- result codes -->
+ <xsl:for-each select="result">
+ <xsl:apply-templates select="."/>
+ </xsl:for-each>
+ <!-- all enums go first -->
+ <xsl:apply-templates select="enum | if/enum"/>
+ <!-- everything else but result codes and enums -->
+ <xsl:apply-templates select="*[not(self::result or self::enum) and
+ not(self::if[result] or self::if[enum])]"/>
+</xsl:template>
+
+
+<!--
+ * result codes
+-->
+<xsl:template match="application//result">
+ <xsl:apply-templates select="@if" mode="begin"/>
+ <xsl:apply-templates select="desc"/>
+ <xsl:value-of select="concat('const HRESULT ',@name,' = ',@value,';')"/>
+ <xsl:text>&#x0A;</xsl:text>
+ <xsl:apply-templates select="@if" mode="end"/>
+</xsl:template>
+
+
+<!--
+ * interfaces
+-->
+<xsl:template match="interface">
+ <xsl:apply-templates select="desc"/>
+ <xsl:text>interface </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text> : </xsl:text>
+ <xsl:value-of select="@extends"/>
+ <xsl:text>&#x0A;{&#x0A;</xsl:text>
+ <!-- attributes (properties) -->
+ <xsl:apply-templates select="attribute"/>
+ <!-- methods -->
+ <xsl:apply-templates select="method"/>
+ <!-- 'if' enclosed elements, unsorted -->
+ <xsl:apply-templates select="if"/>
+ <!-- -->
+ <xsl:text>}; /* interface </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text> */&#x0A;&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * attributes
+-->
+<xsl:template match="interface//attribute">
+ <xsl:apply-templates select="@if" mode="begin"/>
+ <xsl:apply-templates select="desc"/>
+ <xsl:text> </xsl:text>
+ <xsl:if test="@readonly='yes'">
+ <xsl:text>readonly </xsl:text>
+ </xsl:if>
+ <xsl:text>attribute </xsl:text>
+ <xsl:apply-templates select="@type"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>;&#x0A;</xsl:text>
+ <xsl:apply-templates select="@if" mode="end"/>
+ <xsl:text>&#x0A;</xsl:text>
+</xsl:template>
+
+<!--
+ * methods
+-->
+<xsl:template match="interface//method">
+ <xsl:apply-templates select="@if" mode="begin"/>
+ <xsl:apply-templates select="desc"/>
+ <xsl:text> void </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:if test="param">
+ <xsl:text> (&#x0A;</xsl:text>
+ <xsl:for-each select="param [position() != last()]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="."/>
+ <xsl:text>,&#x0A;</xsl:text>
+ </xsl:for-each>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="param [last()]"/>
+ <xsl:text>&#x0A; );&#x0A;</xsl:text>
+ </xsl:if>
+ <xsl:if test="not(param)">
+ <xsl:text>();&#x0A;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="@if" mode="end"/>
+ <xsl:text>&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * co-classes
+-->
+<xsl:template match="module/class">
+ <!-- class and contract id: later -->
+ <!-- CLSID_xxx declarations for XPCOM, for compatibility with Win32: later -->
+</xsl:template>
+
+
+<!--
+ * enums
+-->
+<xsl:template match="enum">
+ <xsl:apply-templates select="desc"/>
+ <xsl:text>enum </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>&#x0A;{&#x0A;</xsl:text>
+ <xsl:for-each select="const">
+ <xsl:apply-templates select="desc"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="../@name"/>
+ <xsl:text>_</xsl:text>
+ <xsl:value-of select="@name"/> = <xsl:value-of select="@value"/>
+ <xsl:text>,&#x0A;</xsl:text>
+ </xsl:for-each>
+ <xsl:text>};&#x0A;&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * method parameters
+-->
+<xsl:template match="method/param">
+ <xsl:choose>
+ <xsl:when test="@dir='in'">in </xsl:when>
+ <xsl:when test="@dir='out'">out </xsl:when>
+ <xsl:when test="@dir='return'">[retval] out </xsl:when>
+ <xsl:otherwise>in</xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="@type"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="@name"/>
+</xsl:template>
+
+
+<!--
+ * attribute/parameter type conversion
+-->
+<xsl:template match="attribute/@type | param/@type">
+ <xsl:variable name="self_target" select="current()/ancestor::if/@target"/>
+
+ <xsl:choose>
+ <!-- modifiers (ignored for 'enumeration' attributes)-->
+ <xsl:when test="name(current())='type' and ../@mod">
+ <xsl:choose>
+ <xsl:when test="../@mod='ptr'">
+ <xsl:choose>
+ <!-- standard types -->
+ <!--xsl:when test=".='result'">??</xsl:when-->
+ <xsl:when test=".='boolean'">booleanPtr</xsl:when>
+ <xsl:when test=".='octet'">octetPtr</xsl:when>
+ <xsl:when test=".='short'">shortPtr</xsl:when>
+ <xsl:when test=".='unsigned short'">ushortPtr</xsl:when>
+ <xsl:when test=".='long'">longPtr</xsl:when>
+ <xsl:when test=".='long long'">llongPtr</xsl:when>
+ <xsl:when test=".='unsigned long'">ulongPtr</xsl:when>
+ <xsl:when test=".='unsigned long long'">ullongPtr</xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
+ <xsl:text>attribute 'mod=</xsl:text>
+ <xsl:value-of select="concat('&quot;',../@mod,'&quot;')"/>
+ <xsl:text>' cannot be used with type </xsl:text>
+ <xsl:value-of select="concat('&quot;',current(),'&quot;!')"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="../@mod='string'">
+ <xsl:choose>
+ <!-- standard types -->
+ <!--xsl:when test=".='result'">??</xsl:when-->
+ <xsl:when test=".='uuid'">wstringUUID</xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
+ <xsl:text>attribute 'mod=</xsl:text>
+ <xsl:value-of select="concat('&quot;',../@mod,'&quot;')"/>
+ <xsl:text>' cannot be used with type </xsl:text>
+ <xsl:value-of select="concat('&quot;',current(),'&quot;!')"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
+ <xsl:value-of select="concat('value &quot;',../@mod,'&quot; ')"/>
+ <xsl:text>of attribute 'mod' is invalid!</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- no modifiers -->
+ <xsl:otherwise>
+ <xsl:choose>
+ <!-- standard types -->
+ <xsl:when test=".='result'">result</xsl:when>
+ <xsl:when test=".='boolean'">boolean</xsl:when>
+ <xsl:when test=".='octet'">octet</xsl:when>
+ <xsl:when test=".='short'">short</xsl:when>
+ <xsl:when test=".='unsigned short'">unsigned short</xsl:when>
+ <xsl:when test=".='long'">long</xsl:when>
+ <xsl:when test=".='long long'">long long</xsl:when>
+ <xsl:when test=".='unsigned long'">unsigned long</xsl:when>
+ <xsl:when test=".='unsigned long long'">unsigned long long</xsl:when>
+ <xsl:when test=".='char'">char</xsl:when>
+ <xsl:when test=".='wchar'">wchar</xsl:when>
+ <xsl:when test=".='string'">string</xsl:when>
+ <xsl:when test=".='wstring'">wstring</xsl:when>
+ <!-- UUID type -->
+ <xsl:when test=".='uuid'">uuid</xsl:when>
+ <!-- system interface types -->
+ <xsl:when test=".='$unknown'">$unknown</xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <!-- enum types -->
+ <xsl:when test="
+ (ancestor::library/application/enum[@name=current()])
+ or (ancestor::library/if/application/enum[@name=current()])
+ or (ancestor::library/application/if[@target=$self_target]/enum[@name=current()])
+ or (ancestor::library/if/application/if[@target=$self_target]/enum[@name=current()])
+ ">
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <!-- custom interface types -->
+ <xsl:when test="
+ ( (ancestor::library/application/interface[@name=current()])
+ or (ancestor::library/if/application/interface[@name=current()])
+ or (ancestor::library/application/if[@target=$self_target]/interface[@name=current()])
+ or (ancestor::library/if/application/if[@target=$self_target]/interface[@name=current()])
+ )
+ ">
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <!-- other types -->
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Unknown parameter type: </xsl:text>
+ <xsl:value-of select="."/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="../@safearray='yes'">
+ <xsl:text>[]</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/src/VBox/Main/idl/midl.xsl b/src/VBox/Main/idl/midl.xsl
new file mode 100644
index 00000000..8405be8b
--- /dev/null
+++ b/src/VBox/Main/idl/midl.xsl
@@ -0,0 +1,924 @@
+<?xml version="1.0"?>
+<!-- $Id: midl.xsl $ -->
+
+<!--
+ * A template to generate a MS IDL compatible interface definition file
+ * from the generic interface definition expressed in XML.
+-->
+<!--
+ Copyright (C) 2006-2023 Oracle and/or its affiliates.
+
+ This file is part of VirtualBox base platform packages, as
+ available from https://www.virtualbox.org.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, in version 3 of the
+ License.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <https://www.gnu.org/licenses>.
+
+ SPDX-License-Identifier: GPL-3.0-only
+-->
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:output method="text"/>
+
+<xsl:strip-space elements="*"/>
+
+<!-- Whether to generate proxy code and type library ('yes'), or just the type-library. -->
+<xsl:param name="g_fGenProxy" select="'no'"/>
+
+<!-- Whether to generate coclass and interfaces for VBoxSDS-->
+<xsl:param name="g_fVBoxWithSDS" select="'no'"/>
+
+<xsl:include href="typemap-shared.inc.xsl"/>
+
+
+<!--
+// templates
+/////////////////////////////////////////////////////////////////////////////
+-->
+
+<!--
+ * not explicitly matched elements and attributes
+-->
+<xsl:template match="*"/>
+
+
+<!--
+ * header
+-->
+ <xsl:template match="/idl">
+ <xsl:text>
+/*
+ * DO NOT EDIT! This is a generated file.
+ *
+ * MS IDL (MIDL) definition for VirtualBox Main API (COM interfaces)
+ * generated from XIDL (XML interface definition).
+ *
+ * Source : src/VBox/Main/idl/VirtualBox.xidl
+ * Generator : src/VBox/Main/idl/midl.xsl
+ */
+
+#if (__midl >= 501)
+midl_pragma warning(disable:2039) /* Disable warning MIDL2039 regarding interface not being automation
+ marshaling conformant and requiring NT 4.0 SP4 or greater. */
+midl_pragma warning(disable:2456) /* Disable warning MIDL2456 regarding SAFEARRAY(interface pointer). */
+midl_pragma warning(disable:2111) /* Disable warning MIDL2111 regarding identifier lengths exceeding 31 chars. */
+#endif
+
+import "unknwn.idl";
+
+</xsl:text>
+ <xsl:apply-templates/>
+</xsl:template>
+
+
+<!--
+ * ignore all |if|s except those for MIDL target
+-->
+<xsl:template match="if">
+ <xsl:if test="@target='midl'">
+ <xsl:apply-templates/>
+ </xsl:if>
+</xsl:template>
+<xsl:template match="if" mode="forward">
+ <xsl:if test="@target='midl'">
+ <xsl:apply-templates mode="forward"/>
+ </xsl:if>
+</xsl:template>
+<xsl:template match="if" mode="forwarder">
+ <xsl:param name="nameOnly"/>
+ <xsl:if test="@target='midl'">
+ <xsl:apply-templates mode="forwarder">
+ <xsl:with-param name="nameOnly" select="$nameOnly"/>
+ </xsl:apply-templates>
+ </xsl:if>
+</xsl:template>
+
+
+<!--
+ * cpp_quote
+-->
+<xsl:template match="cpp">
+ <xsl:text>cpp_quote("</xsl:text>
+ <xsl:value-of select="@line"/>
+ <xsl:text>")&#x0A;&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * #if statement (@if attribute)
+-->
+<xsl:template match="@if" mode="begin">
+ <xsl:text>#if </xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text>&#x0A;</xsl:text>
+</xsl:template>
+<xsl:template match="@if" mode="end">
+ <xsl:text>#endif&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * libraries
+-->
+<xsl:template match="library">
+ <xsl:if test="$g_fGenProxy = 'yes'">
+ <!-- Declare everything outside the library and then reference these
+ from inside the library statement. See:
+ http://msdn.microsoft.com/en-us/library/windows/desktop/aa366841(v=vs.85).aspx -->
+ <xsl:text>&#x0A;</xsl:text>
+ <!-- forward declarations -->
+ <xsl:apply-templates select="descendant::application/if | descendant::application/interface" mode="forward"/>
+ <xsl:text>&#x0A;</xsl:text>
+ <!-- all enums go first -->
+ <xsl:apply-templates select="descendant::application/enum | descendant::application/if[enum]"/>
+ <!-- declare the interfaces -->
+ <xsl:apply-templates select="descendant::application/if | descendant::application/interface"/>
+ </xsl:if>
+
+[
+ uuid(<xsl:value-of select="@uuid"/>),
+ version(<xsl:value-of select="@version"/>),
+ helpstring("<xsl:value-of select="@name"/> Type Library")
+]
+<xsl:text>library </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>&#x0A;{&#x0A;</xsl:text>
+ <xsl:text>&#x0A;importlib("stdole2.tlb");&#x0A;&#x0A;</xsl:text>
+ <!-- result codes -->
+ <xsl:for-each select="application/result">
+ <xsl:apply-templates select="."/>
+ </xsl:for-each>
+ <xsl:text>&#x0A;</xsl:text>
+ <xsl:text>&#x0A;</xsl:text>
+ <xsl:choose>
+ <xsl:when test="$g_fGenProxy = 'yes'">
+ <!-- reference enums and interfaces -->
+ <xsl:apply-templates select="descendant::application/if | descendant::application/interface" mode="forward"/>
+ <xsl:apply-templates select="descendant::application/enum | descendant::application/if[enum]" mode="forward"/>
+ <!-- the modules (i.e. everything else) -->
+ <xsl:apply-templates select="descendant::application/module | descendant::application/if[module]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- forward declarations -->
+ <xsl:apply-templates select="descendant::application/if | descendant::application/interface" mode="forward"/>
+ <!-- all enums go first -->
+ <xsl:apply-templates select="descendant::application/enum | descendant::application/if[enum]"/>
+ <!-- everything else but result codes and enums -->
+ <xsl:apply-templates select=" descendant::application/interface | descendant::application/if[interface]
+ | descendant::application/module | descendant::application/if[module]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!-- -->
+ <xsl:text>}; /* library </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text> */&#x0A;&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * applications
+-->
+<xsl:template match="application">
+ <xsl:apply-templates/>
+</xsl:template>
+<xsl:template match="application" mode="forward">
+ <xsl:apply-templates mode="forward"/>
+</xsl:template>
+
+
+<!--
+ * result codes
+-->
+<xsl:template match="result">
+ <xsl:text>cpp_quote("</xsl:text>
+ <xsl:value-of select="concat('#define ',@name,' ((HRESULT)',@value, ')')"/>
+ <xsl:text>")&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * forward declarations
+-->
+<xsl:template match="interface" mode="forward" name="template_interface_forward">
+ <xsl:text>interface </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>;&#x0A;</xsl:text>
+</xsl:template>
+
+
+<xsl:template match="enum" mode="forward">
+ <xsl:text>enum </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>;&#x0A;&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * interfaces
+-->
+<xsl:template match="interface" name="template_interface">[
+ uuid(<xsl:value-of select="@uuid"/>),
+ object,
+<xsl:if test="not(@notdual = 'yes')"> dual,</xsl:if>
+ oleautomation
+<xsl:if test="$g_fGenProxy = 'yes'">
+ <!-- Indicates to the typelib that we are using a proxy stub DLL and that interfaces
+ should have any ProxyStubClsid32 or TypeLib keys in the registry. -->
+ <xsl:text> , proxy</xsl:text>
+</xsl:if>
+]
+<xsl:text>interface </xsl:text>
+ <xsl:variable name="name" select="@name"/>
+ <xsl:value-of select="$name"/>
+ <xsl:text> : </xsl:text>
+ <xsl:choose>
+ <xsl:when test="(@extends = '$unknown') and (@notdual = 'yes')">IUnknown</xsl:when>
+ <xsl:when test="@extends='$unknown'">IDispatch</xsl:when>
+ <xsl:when test="@extends='$errorinfo'">IErrorInfo</xsl:when>
+ <!-- TODO/FIXME/BUGBUG: The above $errorinfo value causes the following warning (/W4):
+warning MIDL2460 : dual interface should be derived from IDispatch : IVirtualBoxErrorInfo [ Interface 'IVirtualBoxErrorInfo' ]
+ -->
+ <xsl:otherwise><xsl:value-of select="@extends"/></xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="xsltprocNewlineOutputHack"/>
+ <xsl:text>{&#x0A;</xsl:text>
+ <!-- attributes (properties) -->
+ <xsl:apply-templates select="attribute"/>
+ <xsl:variable name="reservedAttributes" select="@reservedAttributes"/>
+ <xsl:if test="$reservedAttributes > 0">
+ <!-- tricky way to do a "for" loop without recursion -->
+ <xsl:for-each select="(//*)[position() &lt;= $reservedAttributes]">
+ <xsl:text> [propget] HRESULT InternalAndReservedAttribute</xsl:text>
+ <xsl:value-of select="concat(position(), $name)"/>
+ <xsl:text> ([out, retval] ULONG *aReserved);&#x0A;&#x0A;</xsl:text>
+ </xsl:for-each>
+ </xsl:if>
+ <!-- methods -->
+ <xsl:apply-templates select="method"/>
+ <xsl:variable name="reservedMethods" select="@reservedMethods"/>
+ <xsl:if test="$reservedMethods > 0">
+ <!-- tricky way to do a "for" loop without recursion -->
+ <xsl:for-each select="(//*)[position() &lt;= $reservedMethods]">
+ <xsl:text> HRESULT InternalAndReservedMethod</xsl:text>
+ <xsl:value-of select="concat(position(), $name)"/>
+ <xsl:text>();&#x0A;&#x0A;</xsl:text>
+ </xsl:for-each>
+ </xsl:if>
+ <!-- 'if' enclosed elements, unsorted -->
+ <xsl:apply-templates select="if"/>
+ <!-- -->
+ <xsl:text>}; /* interface </xsl:text>
+ <xsl:value-of select="$name"/>
+ <xsl:text> */&#x0A;&#x0A;</xsl:text>
+ <!-- Interface implementation forwarder macro -->
+ <xsl:text>/* Interface implementation forwarder macro */&#x0A;</xsl:text>
+ <!-- 1) individual methods -->
+ <xsl:apply-templates select="attribute" mode="forwarder"/>
+ <xsl:apply-templates select="method" mode="forwarder"/>
+ <xsl:apply-templates select="if" mode="forwarder"/>
+ <!-- 2) COM_FORWARD_Interface_TO(smth) -->
+ <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$name"/>
+ <xsl:text>_TO(smth) </xsl:text>
+ <xsl:apply-templates select="attribute" mode="forwarder">
+ <xsl:with-param name="nameOnly" select="'yes'"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="method" mode="forwarder">
+ <xsl:with-param name="nameOnly" select="'yes'"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="if" mode="forwarder">
+ <xsl:with-param name="nameOnly" select="'yes'"/>
+ </xsl:apply-templates>
+ <xsl:text>")&#x0A;</xsl:text>
+ <!-- 3) COM_FORWARD_Interface_TO_OBJ(obj) -->
+ <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$name"/>
+ <xsl:text>_TO_OBJ(obj) COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$name"/>
+ <xsl:text>_TO ((obj)->)")&#x0A;</xsl:text>
+ <!-- 4) COM_FORWARD_Interface_TO_BASE(base) -->
+ <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$name"/>
+ <xsl:text>_TO_BASE(base) COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$name"/>
+ <xsl:text>_TO (base::)")&#x0A;</xsl:text>
+ <!-- end -->
+ <xsl:text>&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * attributes
+-->
+<xsl:template match="interface//attribute">
+ <xsl:apply-templates select="@if" mode="begin"/>
+ <!-- getter -->
+ <xsl:text> [propget] HRESULT </xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text> ([out, retval] </xsl:text>
+ <xsl:if test="@safearray='yes'">
+ <xsl:text>SAFEARRAY(</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="@type"/>
+ <xsl:if test="@safearray='yes'">
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ <xsl:text> * a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>);&#x0A;</xsl:text>
+ <!-- setter -->
+ <xsl:if test="not(@readonly='yes')">
+ <xsl:text> [propput] HRESULT </xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text> ([in] </xsl:text>
+ <xsl:if test="@safearray='yes'">
+ <xsl:text>SAFEARRAY(</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="@type"/>
+ <xsl:if test="@safearray='yes'">
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ <xsl:text> a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>);&#x0A;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="@if" mode="end"/>
+ <xsl:text>&#x0A;</xsl:text>
+</xsl:template>
+
+<xsl:template match="interface//attribute" mode="forwarder">
+
+ <!-- if nameOnly='yes' then only the macro name is composed
+ followed by a space -->
+ <xsl:param name="nameOnly"/>
+
+ <xsl:variable name="parent" select="ancestor::interface"/>
+
+ <xsl:apply-templates select="@if" mode="begin"/>
+
+ <xsl:choose>
+ <xsl:when test="$nameOnly='yes'">
+ <!-- getter: COM_FORWARD_Interface_GETTER_Name_TO(smth) -->
+ <xsl:text>COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_GETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO (smth) </xsl:text>
+ <!-- setter: COM_FORWARD_Interface_SETTER_Name_TO(smth) -->
+ <xsl:if test="not(@readonly='yes')">
+ <xsl:text>COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_SETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO (smth) </xsl:text>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- getter: COM_FORWARD_Interface_GETTER_Name_TO(smth) -->
+ <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_GETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO(smth) HRESULT STDMETHODCALLTYPE get_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text> (</xsl:text>
+ <xsl:choose>
+ <xsl:when test="@safearray='yes'">
+ <xsl:text>SAFEARRAY *</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@type"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text> * a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>) { return smth get_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text> (a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>); }")&#x0A;</xsl:text>
+ <!-- getter: COM_FORWARD_Interface_GETTER_Name_TO_OBJ(obj) -->
+ <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_GETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO_OBJ(obj) COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_GETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO ((obj)->)")&#x0A;</xsl:text>
+ <!-- getter: COM_FORWARD_Interface_GETTER_Name_TO_BASE(base) -->
+ <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_GETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO_BASE(base) COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_GETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO (base::)")&#x0A;</xsl:text>
+ <!-- -->
+ <xsl:if test="not(@readonly='yes')">
+ <!-- setter: COM_FORWARD_Interface_SETTER_Name_TO(smth) -->
+ <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_SETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO(smth) HRESULT STDMETHODCALLTYPE put_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text> (</xsl:text>
+ <xsl:choose>
+ <xsl:when test="@safearray='yes'">
+ <xsl:text>SAFEARRAY *</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@type"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text> a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>) { return smth put_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text> (a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>); }")&#x0A;</xsl:text>
+ <!-- setter: COM_FORWARD_Interface_SETTER_Name_TO_OBJ(obj) -->
+ <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_SETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO_OBJ(obj) COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_SETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO ((obj)->)")&#x0A;</xsl:text>
+ <!-- setter: COM_FORWARD_Interface_SETTER_Name_TO_BASE(base) -->
+ <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_SETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO_BASE(base) COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_SETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO (base::)")&#x0A;</xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:apply-templates select="@if" mode="end"/>
+
+</xsl:template>
+
+
+<!--
+ * methods
+-->
+<xsl:template match="interface//method">
+ <xsl:apply-templates select="@if" mode="begin"/>
+ <xsl:text> HRESULT </xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="param">
+ <xsl:text> (&#x0A;</xsl:text>
+ <xsl:for-each select="param [position() != last()]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="."/>
+ <xsl:text>,&#x0A;</xsl:text>
+ </xsl:for-each>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="param [last()]"/>
+ <xsl:text>&#x0A; );&#x0A;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise test="not(param)">
+ <xsl:text>();&#x0A;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="@if" mode="end"/>
+ <xsl:text>&#x0A;</xsl:text>
+</xsl:template>
+
+<xsl:template match="interface//method" mode="forwarder">
+
+ <!-- if nameOnly='yes' then only the macro name is composed followed by \ -->
+ <xsl:param name="nameOnly"/>
+
+ <xsl:variable name="parent" select="ancestor::interface"/>
+
+ <xsl:apply-templates select="@if" mode="begin"/>
+
+ <xsl:choose>
+ <xsl:when test="$nameOnly='yes'">
+ <!-- COM_FORWARD_Interface_Method_TO(smth) -->
+ <xsl:text>COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO (smth) </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO(smth) HRESULT STDMETHODCALLTYPE </xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="param">
+ <xsl:text> (</xsl:text>
+ <xsl:for-each select="param [position() != last()]">
+ <xsl:apply-templates select="." mode="forwarder"/>
+ <xsl:text>, </xsl:text>
+ </xsl:for-each>
+ <xsl:apply-templates select="param [last()]" mode="forwarder"/>
+ <xsl:text>) { return smth </xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text> (</xsl:text>
+ <xsl:for-each select="param [position() != last()]">
+ <xsl:text>a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>, </xsl:text>
+ </xsl:for-each>
+ <xsl:text>a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="param [last()]/@name"/>
+ </xsl:call-template>
+ <xsl:text>); }</xsl:text>
+ </xsl:when>
+ <xsl:otherwise test="not(param)">
+ <xsl:text>() { return smth </xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>(); }</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>")&#x0A;</xsl:text>
+ <!-- COM_FORWARD_Interface_Method_TO_OBJ(obj) -->
+ <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO_OBJ(obj) COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO ((obj)->)")&#x0A;</xsl:text>
+ <!-- COM_FORWARD_Interface_Method_TO_BASE(base) -->
+ <xsl:text>cpp_quote("#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO_BASE(base) COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO (base::)")&#x0A;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:apply-templates select="@if" mode="end"/>
+
+</xsl:template>
+
+
+<!--
+ * modules
+-->
+<xsl:template match="module">
+ <xsl:apply-templates select="class"/>
+</xsl:template>
+
+
+<!--
+ * co-classes
+-->
+<xsl:template match="module/class" name="template_class">[
+ uuid(<xsl:value-of select="@uuid"/>)
+]
+<xsl:text>coclass </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>&#x0A;{&#x0A;</xsl:text>
+ <xsl:for-each select="interface">
+ <xsl:text> </xsl:text>
+ <xsl:if test="@default='yes'">
+ <xsl:text>[default] </xsl:text>
+ </xsl:if>
+ <xsl:text>interface </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>;&#x0A;</xsl:text>
+ </xsl:for-each>
+ <xsl:for-each select="eventsink">
+ <xsl:text> </xsl:text>
+ <xsl:choose>
+ <xsl:when test="@default='yes'"><xsl:text>[default,source]</xsl:text></xsl:when>
+ <xsl:otherwise><xsl:text>[source]</xsl:text></xsl:otherwise>
+ </xsl:choose>
+ <xsl:text> interface </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>;&#x0A;</xsl:text>
+ </xsl:for-each>
+ <xsl:text>&#x0A;}; /* coclass </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text> */&#x0A;&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * enums
+-->
+<xsl:template match="enum">[
+ uuid(<xsl:value-of select="@uuid"/>),
+ v1_enum
+]
+<xsl:text>typedef enum &#x0A;{&#x0A;</xsl:text>
+ <xsl:for-each select="const">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="concat(../@name,'_',@name)"/> = <xsl:value-of select="@value"/>
+ <xsl:choose>
+ <xsl:when test="position()!=last()"><xsl:text>,&#x0A;</xsl:text></xsl:when>
+ <xsl:otherwise><xsl:text>&#x0A;</xsl:text></xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ <xsl:text>} </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>;&#x0A;&#x0A;</xsl:text>
+ <!-- -->
+ <xsl:value-of select="concat('/* cross-platform type name for ', @name, ' */&#x0A;')"/>
+ <xsl:value-of select="concat('cpp_quote(&quot;#define ', @name, '_T', ' ',
+ @name, '&quot;)&#x0A;&#x0A;')"/>
+ <xsl:text>&#x0A;&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * method parameters
+-->
+<xsl:template match="method/param">
+ <xsl:text>[</xsl:text>
+ <xsl:choose>
+ <xsl:when test="@dir='in'">in</xsl:when>
+ <xsl:when test="@dir='out'">out</xsl:when>
+ <xsl:when test="@dir='return'">out, retval</xsl:when>
+ <xsl:otherwise>in</xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>] </xsl:text>
+ <xsl:if test="@safearray='yes'">
+ <xsl:text>SAFEARRAY(</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="@type"/>
+ <xsl:if test="@safearray='yes'">
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ <xsl:if test="@dir='out' or @dir='return'">
+ <xsl:text> *</xsl:text>
+ </xsl:if>
+ <xsl:text> a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="method/param" mode="forwarder">
+ <xsl:choose>
+ <xsl:when test="@safearray='yes'">
+ <xsl:text>SAFEARRAY *</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@type"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="@dir='out' or @dir='return' or @safearray='yes'">
+ <xsl:text> *</xsl:text>
+ </xsl:if>
+ <xsl:text> a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+</xsl:template>
+
+
+<!--
+ * attribute/parameter type conversion
+-->
+<xsl:template match="attribute/@type | param/@type">
+ <xsl:variable name="self_target" select="current()/ancestor::if/@target"/>
+
+ <xsl:choose>
+ <!-- modifiers -->
+ <xsl:when test="name(current())='type' and ../@mod">
+ <xsl:choose>
+ <xsl:when test="../@mod='ptr'">
+ <xsl:choose>
+ <!-- standard types -->
+ <!--xsl:when test=".='result'">??</xsl:when-->
+ <xsl:when test=".='boolean'">BOOL *</xsl:when>
+ <xsl:when test=".='octet'">BYTE *</xsl:when>
+ <xsl:when test=".='short'">SHORT *</xsl:when>
+ <xsl:when test=".='unsigned short'">USHORT *</xsl:when>
+ <xsl:when test=".='long'">LONG *</xsl:when>
+ <xsl:when test=".='long long'">LONG64 *</xsl:when>
+ <xsl:when test=".='unsigned long'">ULONG *</xsl:when>
+ <xsl:when test=".='unsigned long long'">
+ <xsl:message terminate="yes">
+ <xsl:value-of select="'&quot;unsigned long long&quot; no longer supported'" />
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
+ <xsl:text>attribute 'mod=</xsl:text>
+ <xsl:value-of select="concat('&quot;',../@mod,'&quot;')"/>
+ <xsl:text>' cannot be used with type </xsl:text>
+ <xsl:value-of select="concat('&quot;',current(),'&quot;!')"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="../@mod='string'">
+ <xsl:choose>
+ <!-- standard types -->
+ <!--xsl:when test=".='result'">??</xsl:when-->
+ <xsl:when test=".='uuid'">BSTR</xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
+ <xsl:text>attribute 'mod=</xsl:text>
+ <xsl:value-of select="concat('&quot;',../@mod,'&quot;')"/>
+ <xsl:text>' cannot be used with type </xsl:text>
+ <xsl:value-of select="concat('&quot;',current(),'&quot;!')"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
+ <xsl:value-of select="concat('value &quot;',../@mod,'&quot; ')"/>
+ <xsl:text>of attribute 'mod' is invalid!</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- no modifiers -->
+ <xsl:otherwise>
+ <xsl:choose>
+ <!-- standard types -->
+ <xsl:when test=".='result'">HRESULT</xsl:when>
+ <xsl:when test=".='boolean'">BOOL</xsl:when>
+ <xsl:when test=".='octet'">BYTE</xsl:when>
+ <xsl:when test=".='short'">SHORT</xsl:when>
+ <xsl:when test=".='unsigned short'">USHORT</xsl:when>
+ <xsl:when test=".='long'">LONG</xsl:when>
+ <xsl:when test=".='long long'">LONG64</xsl:when>
+ <xsl:when test=".='unsigned long'">ULONG</xsl:when>
+ <xsl:when test=".='char'">CHAR</xsl:when>
+ <xsl:when test=".='string'">CHAR *</xsl:when>
+ <xsl:when test=".='wchar'">OLECHAR</xsl:when>
+ <xsl:when test=".='wstring'">BSTR</xsl:when>
+ <!-- UUID type -->
+ <xsl:when test=".='uuid'">GUID</xsl:when>
+ <!-- system interface types -->
+ <xsl:when test=".='$unknown'">IUnknown *</xsl:when>
+ <xsl:when test=".='unsigned long long'">
+ <xsl:message terminate="yes">
+ <xsl:value-of select="'&quot;unsigned long long&quot; no longer supported'" />
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <!-- enum types -->
+ <xsl:when test="
+ (ancestor::library/application/enum[@name=current()])
+ or (ancestor::library/if/application/enum[@name=current()])
+ or (ancestor::library/application/if[@target=$self_target]/enum[@name=current()])
+ or (ancestor::library/if/application/if[@target=$self_target]/enum[@name=current()])
+ ">
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <!-- custom interface types -->
+ <xsl:when test="
+ ( (ancestor::library/application/interface[@name=current()])
+ or (ancestor::library/if/application/interface[@name=current()])
+ or (ancestor::library/application/if[@target=$self_target]/interface[@name=current()])
+ or (ancestor::library/if/application/if[@target=$self_target]/interface[@name=current()])
+ )
+ ">
+ <xsl:value-of select="."/><xsl:text> *</xsl:text>
+ </xsl:when>
+ <!-- other types -->
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Unknown parameter type: </xsl:text>
+ <xsl:value-of select="."/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+
+<!-- Filters for switch on/off VBoxSDS definitions -->
+
+<xsl:template match="if[@target='midl']/application[@uuid='ec0e78e8-fa43-43e8-ac0a-02c784c4a4fa']//module/class" >
+ <xsl:if test="$g_fVBoxWithSDS='yes'" >
+ <xsl:call-template name="template_class" />
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="if[@target='midl']/application[@uuid='ec0e78e8-fa43-43e8-ac0a-02c784c4a4fa']/if//interface
+ | application[@uuid='ec0e78e8-fa43-43e8-ac0a-02c784c4a4fa']//interface" >
+ <xsl:if test="$g_fVBoxWithSDS='yes'" >
+ <xsl:call-template name="template_interface" />
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="if[@target='midl']/application[@uuid='ec0e78e8-fa43-43e8-ac0a-02c784c4a4fa']//interface" mode="forward" >
+ <xsl:if test="$g_fVBoxWithSDS='yes'" >
+ <xsl:call-template name="template_interface_forward" />
+ </xsl:if>
+</xsl:template>
+
+
+</xsl:stylesheet>
diff --git a/src/VBox/Main/idl/stringify-enums.xsl b/src/VBox/Main/idl/stringify-enums.xsl
new file mode 100644
index 00000000..43a5c55a
--- /dev/null
+++ b/src/VBox/Main/idl/stringify-enums.xsl
@@ -0,0 +1,251 @@
+<?xml version="1.0"?>
+
+<!--
+ stringify-enums.xsl - Generates stringify functions for all the enums in VirtualBox.xidl.
+-->
+<!--
+ Copyright (C) 2022-2023 Oracle and/or its affiliates.
+
+ This file is part of VirtualBox base platform packages, as
+ available from https://www.virtualbox.org.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, in version 3 of the
+ License.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <https://www.gnu.org/licenses>.
+
+ SPDX-License-Identifier: GPL-3.0-only
+-->
+
+<xsl:stylesheet
+ version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ extension-element-prefixes="exsl">
+
+<xsl:output method="text"/>
+
+<xsl:strip-space elements="*"/>
+
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ Parameters
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:param name="G_kind">source</xsl:param>
+
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+templates for file headers
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template name="fileheader">
+ <xsl:param name="class"/>
+ <xsl:param name="name"/>
+ <xsl:param name="type"/>
+
+ <xsl:text>/** @file
+ * VirtualBox API Enum Stringifier - </xsl:text>
+ <xsl:choose>
+ <xsl:when test="$G_kind = 'header'">Header</xsl:when>
+ <xsl:when test="$G_kind = 'source'">Definition</xsl:when>
+ </xsl:choose>
+<xsl:text>.
+ *
+ * DO NOT EDIT! This is a generated file.
+ * Generated from: src/VBox/Main/idl/VirtualBox.xidl
+ * Generator: src/VBox/Main/idl/stringify-enums.xsl
+ */
+
+/*
+ * Copyright (C) 2022-2023 Oracle and/or its affiliates.
+ *
+ * This file is part of VirtualBox base platform packages, as
+ * available from https://www.virtualbox.org.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, in version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see &lt;https://www.gnu.org/licenses&gt;.
+ *
+ * SPDX-License-Identifier: GPL-3.0-only
+ */
+
+</xsl:text>
+</xsl:template>
+
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ Emits a function prototype for the header file.
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template name="emitEnumStringifyPrototype">
+ <xsl:text>const char *stringify</xsl:text><xsl:value-of select="@name"/><xsl:text>(</xsl:text>
+ <xsl:value-of select="@name"/><xsl:text>_T aValue) RT_NOEXCEPT;
+</xsl:text>
+</xsl:template>
+
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ Emits a function definition for the source file.
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template name="emitEnumStringifyFunction">
+ <xsl:text>
+
+const char *stringify</xsl:text><xsl:value-of select="@name"/><xsl:text>(</xsl:text>
+ <xsl:value-of select="@name"/><xsl:text>_T aValue) RT_NOEXCEPT
+{
+ switch (aValue)
+ {
+</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text> default:
+ AssertMsgFailedReturn(("%d / %#x\n", aValue, aValue), formatUnknown("</xsl:text>
+ <xsl:value-of select="@name"/><xsl:text>", (int)aValue));
+ }
+}
+</xsl:text>
+</xsl:template>
+
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ wildcard match, ignore everything which has no explicit match
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template match="*"/>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ ignore all if tags except those for XPIDL or MIDL target
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template match="if">
+ <xsl:if test="(@target = 'xpidl') or (@target = 'midl')">
+ <xsl:apply-templates/>
+ </xsl:if>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ const match - emits case statemtns
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template match="const">
+ <!-- HACK ALERT! There are 4 enums in MachineState that have duplicate values,
+ we exploit the existing @wsmap="suppress" markers on these to
+ avoid generating code which doesn't compile. -->
+ <xsl:if test="not(@wsmap) or @wsmap != 'suppress'">
+ <xsl:text> case </xsl:text><xsl:value-of select="../@name"/>
+ <xsl:text>_</xsl:text>
+ <xsl:value-of select="@name"/><xsl:text>:
+ return "</xsl:text><xsl:value-of select="@name"/><xsl:text>";
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ enum match
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template match="enum">
+ <xsl:choose>
+ <xsl:when test="$G_kind = 'header'">
+ <xsl:call-template name="emitEnumStringifyPrototype"/>
+ </xsl:when>
+ <xsl:when test="$G_kind = 'source'">
+ <xsl:call-template name="emitEnumStringifyFunction"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ application match
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template match="application">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ library match
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template match="library">
+ <xsl:apply-templates/>
+</xsl:template>
+
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ root match
+ - - - - - - - - - - - - - - - - - - - - - - -->
+<xsl:template match="/idl">
+ <xsl:choose>
+ <xsl:when test="$G_kind = 'header'">
+ <xsl:call-template name="fileheader"/>
+ <xsl:text>
+#ifndef INCLUDED_GENERATED_StringifyEnums_h
+#define INCLUDED_GENERATED_StringifyEnums_h
+#ifndef RT_WITHOUT_PRAGMA_ONCE
+# pragma once
+#endif
+
+#include "VBox/com/VirtualBox.h"
+
+</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>
+#endif /* INCLUDED_GENERATED_StringifyEnums_h */
+</xsl:text>
+ </xsl:when>
+
+ <xsl:when test="$G_kind = 'source'">
+ <xsl:call-template name="fileheader"/>
+ <xsl:text>
+
+/*********************************************************************************************************************************
+* Header Files *
+*********************************************************************************************************************************/
+#include "StringifyEnums.h"
+
+#include "iprt/asm.h"
+#include "iprt/assert.h"
+#include "iprt/string.h"
+
+
+/*********************************************************************************************************************************
+* Global Variables *
+*********************************************************************************************************************************/
+typedef char UNKNOWNBUF[64];
+static UNKNOWNBUF s_aszUnknown[16];
+static uint32_t volatile s_iUnknown = 0;
+
+
+static const char *formatUnknown(const char *pszName, int iValue)
+{
+ size_t iUnknown = ASMAtomicIncU32(&amp;s_iUnknown) % RT_ELEMENTS(s_aszUnknown);
+ char *pszBuf = s_aszUnknown[iUnknown];
+ RTStrPrintf(pszBuf, sizeof(UNKNOWNBUF), "Unk-%s-%#x", pszName, iValue);
+ return pszBuf;
+}
+
+</xsl:text>
+ <xsl:apply-templates/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ Unknown string parameter value: G_kind='<xsl:value-of select="$G_kind"/>'
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
+<!-- vi: set tabstop=4 shiftwidth=4 expandtab: -->
diff --git a/src/VBox/Main/idl/typemap-shared.inc.xsl b/src/VBox/Main/idl/typemap-shared.inc.xsl
new file mode 100644
index 00000000..225eea81
--- /dev/null
+++ b/src/VBox/Main/idl/typemap-shared.inc.xsl
@@ -0,0 +1,571 @@
+<!--
+ typemap-shared.inc.xsl:
+ this gets included from other XSLT stylesheets including those
+ for the webservice, so we can share some definitions that must
+ be the same for all of them (like method prefixes/suffices).
+-->
+<!--
+ Copyright (C) 2006-2023 Oracle and/or its affiliates.
+
+ This file is part of VirtualBox base platform packages, as
+ available from https://www.virtualbox.org.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, in version 3 of the
+ License.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <https://www.gnu.org/licenses>.
+
+ SPDX-License-Identifier: GPL-3.0-only
+-->
+
+
+<xsl:stylesheet
+ version="1.0"
+ targetNamespace="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:vbox="http://www.virtualbox.org/">
+
+<xsl:variable name="G_xsltIncludeFilename" select="'typemap-shared.inc.xsl'" />
+
+<xsl:variable name="G_lowerCase" select="'abcdefghijklmnopqrstuvwxyz'" />
+<xsl:variable name="G_upperCase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
+<xsl:variable name="G_sNewLine">
+ <xsl:text>
+</xsl:text>
+</xsl:variable>
+
+<!-- List of white space characters that the strip functions will remove -->
+<xsl:variable name="G_sWhiteSpace" select="' &#10;&#13;&#09;'"/>
+
+<!-- target namespace; this must match the xmlns:vbox in stylesheet opening tags! -->
+<xsl:variable name="G_targetNamespace"
+ select='"http://www.virtualbox.org/"' />
+<xsl:variable name="G_targetNamespaceSeparator"
+ select='""' />
+
+<!-- ENCODING SCHEME
+
+ See: http://www-128.ibm.com/developerworks/webservices/library/ws-whichwsdl/
+
+ Essentially "document" style means that each SOAP message is a complete and
+ self-explanatory document that does not rely on outside information for
+ validation.
+
+ By contrast, the (older) "RPC" style allows for much shorter SOAP messages
+ that do not contain validation info like all types that are used, but then
+ again, caller and receiver must have agreed on a valid format in some other way.
+ With RPC, WSDL typically looks like this:
+
+ <message name="myMethodRequest">
+ <part name="x" type="xsd:int"/>
+ <part name="y" type="xsd:float"/>
+ </message>
+
+ This is why today "document" style is preferred. However, with document style,
+ one _cannot_ use "type" in <part> elements. Instead, one must use "element"
+ attributes that refer to <element> items in the type section. Like this:
+
+ <types>
+ <schema>
+ <element name="xElement" type="xsd:int"/>
+ <element name="yElement" type="xsd:float"/>
+ </schema>
+ </types>
+
+ <message name="myMethodRequest">
+ <part name="x" element="xElement"/>
+ <part name="y" element="yElement"/>
+ </message>
+
+ The "encoded" and "literal" sub-styles then only determine whether the
+ individual types in the soap messages carry additional information in
+ attributes. "Encoded" was only used with RPC styles, really, and even that
+ is not widely supported any more.
+
+-->
+<!-- These are the settings: all the other XSLTs react on this and are supposed
+ to be able to generate both valid RPC and document-style code. The only
+ allowed values are 'rpc' or 'document'. -->
+<xsl:variable name="G_basefmt"
+ select='"document"' />
+<xsl:variable name="G_parmfmt"
+ select='"literal"' />
+<!-- <xsl:variable name="G_basefmt"
+ select='"rpc"' />
+<xsl:variable name="G_parmfmt"
+ select='"encoded"' /> -->
+
+<!-- with document style, this is how we name the request and return element structures -->
+<xsl:variable name="G_requestElementVarName"
+ select='"req"' />
+<xsl:variable name="G_responseElementVarName"
+ select='"resp"' />
+<!-- this is how we name the result parameter in messages -->
+<xsl:variable name="G_result"
+ select='"returnval"' />
+
+<!-- we represent interface attributes by creating "get" and "set" methods; these
+ are the prefixes we use for that -->
+<xsl:variable name="G_attributeGetPrefix"
+ select='"get"' />
+<xsl:variable name="G_attributeSetPrefix"
+ select='"set"' />
+<!-- separator between class name and method/attribute name; would be "::" in C++
+ but i'm unsure whether WSDL appreciates that (WSDL only) -->
+<xsl:variable name="G_classSeparator"
+ select='"_"' />
+<!-- for each interface method, we need to create both a "request" and a "response"
+ message; these are the suffixes we append to the method names for that -->
+<xsl:variable name="G_methodRequest"
+ select='"RequestMsg"' />
+<xsl:variable name="G_methodResponse"
+ select='"ResultMsg"' />
+<!-- suffix for element declarations that describe request message parameters (WSDL only) -->
+<xsl:variable name="G_requestMessageElementSuffix"
+ select='""' />
+<!-- suffix for element declarations that describe request message parameters (WSDL only) -->
+<xsl:variable name="G_responseMessageElementSuffix"
+ select='"Response"' />
+<!-- suffix for portType names (WSDL only) -->
+<xsl:variable name="G_portTypeSuffix"
+ select='"PortType"' />
+<!-- suffix for binding names (WSDL only) -->
+<xsl:variable name="G_bindingSuffix"
+ select='"Binding"' />
+<!-- schema type to use for object references; while it is theoretically
+ possible to use a self-defined type (e.g. some vboxObjRef type that's
+ really an int), gSOAP gets a bit nasty and creates complicated structs
+ for function parameters when these types are used as output parameters.
+ So we just use "int" even though it's not as lucid.
+ One setting is for the WSDL emitter, one for the C++ emitter -->
+<!--
+<xsl:variable name="G_typeObjectRef"
+ select='"xsd:unsignedLong"' />
+<xsl:variable name="G_typeObjectRef_gsoapH"
+ select='"ULONG64"' />
+<xsl:variable name="G_typeObjectRef_CPP"
+ select='"WSDLT_ID"' />
+-->
+<xsl:variable name="G_typeObjectRef"
+ select='"xsd:string"' />
+<xsl:variable name="G_typeObjectRef_gsoapH"
+ select='"std::string"' />
+<xsl:variable name="G_typeObjectRef_CPP"
+ select='"std::string"' />
+<!-- and what to call first the object parameter -->
+<xsl:variable name="G_nameObjectRef"
+ select='"_this"' />
+<!-- gSOAP encodes underscores with USCORE so this is used in our C++ code -->
+<xsl:variable name="G_nameObjectRefEncoded"
+ select='"_USCOREthis"' />
+
+<!-- type to represent enums within C++ COM callers -->
+<xsl:variable name="G_funcPrefixInputEnumConverter"
+ select='"EnumSoap2Com_"' />
+<xsl:variable name="G_funcPrefixOutputEnumConverter"
+ select='"EnumCom2Soap_"' />
+
+<!-- type to represent structs within C++ COM callers -->
+<xsl:variable name="G_funcPrefixOutputStructConverter"
+ select='"StructCom2Soap_"' />
+
+<xsl:variable name="G_aSharedTypes">
+ <type idlname="octet" xmlname="unsignedByte" cname="unsigned char" gluename="BYTE" gluefmt="%RU8" javaname="byte" dtracename="uint8_t" />
+ <type idlname="boolean" xmlname="boolean" cname="bool" gluename="BOOL" gluefmt="%RTbool" javaname="Boolean" dtracename="int8_t" />
+ <type idlname="short" xmlname="short" cname="short" gluename="SHORT" gluefmt="%RI16" javaname="Short" dtracename="int16_t" />
+ <type idlname="unsigned short" xmlname="unsignedShort" cname="unsigned short" gluename="USHORT" gluefmt="%RU16" javaname="Integer" dtracename="uint16_t" />
+ <type idlname="long" xmlname="int" cname="int" gluename="LONG" gluefmt="%RI32" javaname="Integer" dtracename="int32_t" />
+ <type idlname="unsigned long" xmlname="unsignedInt" cname="unsigned int" gluename="ULONG" gluefmt="%RU32" javaname="Long" dtracename="uint32_t" />
+ <type idlname="long long" xmlname="long" cname="LONG64" gluename="LONG64" gluefmt="%RI64" javaname="Long" dtracename="int64_t" />
+ <type idlname="unsigned long long" xmlname="unsignedLong" cname="ULONG64" gluename="ULONG64" gluefmt="%RU64" javaname="BigInteger" dtracename="uint64_t" />
+ <type idlname="double" xmlname="double" cname="double" gluename="DOUBLE" gluefmt="%#RX64" javaname="Double" dtracename="double" />
+ <type idlname="float" xmlname="float" cname="float" gluename="FLOAT" gluefmt="%#RX32" javaname="Float" dtracename="float" />
+ <type idlname="wstring" xmlname="string" cname="std::string" gluename="BSTR" gluefmt="%ls" javaname="String" dtracename="const char *"/>
+ <type idlname="uuid" xmlname="string" cname="std::string" gluename="BSTR" gluefmt="%ls" javaname="String" dtracename="const char *"/>
+ <type idlname="result" xmlname="unsignedInt" cname="unsigned int" gluename="HRESULT" gluefmt="%Rhrc" javaname="Long" dtracename="int32_t" />
+</xsl:variable>
+
+<!--
+ warning:
+ -->
+
+<xsl:template name="warning">
+ <xsl:param name="msg" />
+
+ <xsl:message terminate="no">
+ <xsl:value-of select="concat('[', $G_xsltFilename, '] Warning in ', $msg)" />
+ </xsl:message>
+</xsl:template>
+
+<!--
+ fatalError:
+ -->
+
+<xsl:template name="fatalError">
+ <xsl:param name="msg" />
+
+ <xsl:message terminate="yes">
+ <xsl:value-of select="concat('[', $G_xsltFilename, '] Error in ', $msg)" />
+ </xsl:message>
+</xsl:template>
+
+<!--
+ debugMsg
+ -->
+
+<xsl:template name="debugMsg">
+ <xsl:param name="msg" />
+
+ <xsl:if test="$G_argDebug">
+ <xsl:message terminate="no">
+ <xsl:value-of select="concat('[', $G_xsltFilename, '] ', $msg)" />
+ </xsl:message>
+ </xsl:if>
+</xsl:template>
+
+<!--
+ uncapitalize
+ -->
+
+<xsl:template name="uncapitalize">
+ <xsl:param name="str" select="."/>
+ <xsl:value-of select="
+ concat(
+ translate(substring($str,1,1),$G_upperCase,$G_lowerCase),
+ substring($str,2)
+ )
+ "/>
+</xsl:template>
+<!--
+ uncapitalize in the way JAX-WS understands, see #2910
+ -->
+
+<xsl:template name="uncapitalize2">
+ <xsl:param name="str" select="."/>
+ <xsl:variable name="strlen">
+ <xsl:value-of select="string-length($str)"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$strlen>1">
+ <xsl:choose>
+ <xsl:when test="contains($G_upperCase,substring($str,1,1))
+ and
+ contains($G_upperCase,substring($str,2,1))">
+ <xsl:variable name="cdr">
+ <xsl:call-template name="uncapitalize2">
+ <xsl:with-param name="str" select="substring($str,2)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="
+ concat(
+ translate(substring($str,1,1),
+ $G_upperCase,
+ $G_lowerCase),
+ $cdr
+ )
+ "/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!--<xsl:value-of select="concat(substring($str,1,1),$cdr)"/>-->
+ <xsl:value-of select="$str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$strlen=1">
+ <xsl:value-of select="
+ translate($str,
+ $G_upperCase,
+ $G_lowerCase)
+ "/>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<!--
+ capitalize
+ -->
+
+<xsl:template name="capitalize">
+ <xsl:param name="str" select="."/>
+ <xsl:value-of select="
+ concat(
+ translate(substring($str,1,1),$G_lowerCase,$G_upperCase),
+ substring($str,2)
+ )
+ "/>
+</xsl:template>
+
+<!--
+ makeGetterName:
+ -->
+<xsl:template name="makeGetterName">
+ <xsl:param name="attrname" />
+ <xsl:variable name="capsname"><xsl:call-template name="capitalize"><xsl:with-param name="str" select="$attrname" /></xsl:call-template></xsl:variable>
+ <xsl:value-of select="concat($G_attributeGetPrefix, $capsname)" />
+</xsl:template>
+
+<!--
+ makeSetterName:
+ -->
+<xsl:template name="makeSetterName">
+ <xsl:param name="attrname" />
+ <xsl:variable name="capsname"><xsl:call-template name="capitalize"><xsl:with-param name="str" select="$attrname" /></xsl:call-template></xsl:variable>
+ <xsl:value-of select="concat($G_attributeSetPrefix, $capsname)" />
+</xsl:template>
+
+<!--
+ makeJaxwsMethod: compose idevInterfaceMethod out of IDEVInterface::method
+ -->
+<xsl:template name="makeJaxwsMethod">
+ <xsl:param name="ifname" />
+ <xsl:param name="methodname" />
+ <xsl:variable name="uncapsif"><xsl:call-template name="uncapitalize2"><xsl:with-param name="str" select="$ifname" /></xsl:call-template></xsl:variable>
+ <xsl:variable name="capsmethod"><xsl:call-template name="capitalize"><xsl:with-param name="str" select="$methodname" /></xsl:call-template></xsl:variable>
+ <xsl:value-of select="concat($uncapsif, $capsmethod)" />
+</xsl:template>
+
+
+<!--
+ makeJaxwsMethod2: compose iInterfaceMethod out of IInterface::method
+ -->
+<xsl:template name="makeJaxwsMethod2">
+ <xsl:param name="ifname" />
+ <xsl:param name="methodname" />
+ <xsl:variable name="uncapsif"><xsl:call-template name="uncapitalize"><xsl:with-param name="str" select="$ifname" /></xsl:call-template></xsl:variable>
+ <xsl:variable name="capsmethod"><xsl:call-template name="capitalize"><xsl:with-param name="str" select="$methodname" /></xsl:call-template></xsl:variable>
+ <xsl:value-of select="concat($uncapsif, $capsmethod)" />
+</xsl:template>
+
+<!--
+ emitNewline:
+ -->
+<xsl:template name="emitNewline">
+ <xsl:text>
+</xsl:text>
+</xsl:template>
+
+<!--
+ emitNewlineIndent8:
+ -->
+<xsl:template name="emitNewlineIndent8">
+ <xsl:text>
+ </xsl:text>
+</xsl:template>
+
+<!--
+ escapeUnderscores
+ -->
+<xsl:template name="escapeUnderscores">
+ <xsl:param name="string" />
+ <xsl:if test="contains($string, '_')">
+ <xsl:value-of select="substring-before($string, '_')" />_USCORE<xsl:call-template name="escapeUnderscores"><xsl:with-param name="string"><xsl:value-of select="substring-after($string, '_')" /></xsl:with-param></xsl:call-template>
+ </xsl:if>
+ <xsl:if test="not(contains($string, '_'))"><xsl:value-of select="$string" />
+ </xsl:if>
+</xsl:template>
+
+<!--
+ xsltprocNewlineOutputHack - emits a single new line.
+
+ Hack Alert! This template helps xsltproc split up the output text elements
+ and avoid reallocating them into the MB range. Calls to this
+ template is made occationally while generating larger output
+ file. It's not necessary for small stuff like header.
+
+ The trick we're playing on xsltproc has to do with CDATA
+ and/or the escape setting of the xsl:text element. It forces
+ xsltproc to allocate a new output element, thus preventing
+ things from growing out of proportions and slowing us down.
+
+ This was successfully employed to reduce a 18+ seconds run to
+ around one second (possibly less due to kmk overhead).
+ -->
+<xsl:template name="xsltprocNewlineOutputHack">
+ <xsl:text disable-output-escaping="yes"><![CDATA[
+]]></xsl:text>
+</xsl:template>
+
+
+<!--
+ string-to-upper - translates the string to uppercase.
+ -->
+<xsl:template name="string-to-upper">
+ <xsl:param name="str" select="."/>
+ <xsl:value-of select="translate($str, $G_lowerCase, $G_upperCase)"/>
+</xsl:template>
+
+<!--
+ string-to-lower - translates the string to lowercase.
+ -->
+<xsl:template name="string-to-lower">
+ <xsl:param name="str" select="."/>
+ <xsl:value-of select="translate($str, $G_upperCase, $G_lowerCase)"/>
+</xsl:template>
+
+<!--
+ string-replace - Replace all occurencees of needle in haystack.
+ -->
+<xsl:template name="string-replace">
+ <xsl:param name="haystack"/>
+ <xsl:param name="needle"/>
+ <xsl:param name="replacement"/>
+ <xsl:param name="onlyfirst" select="false"/>
+ <xsl:choose>
+ <xsl:when test="contains($haystack, $needle)">
+ <xsl:value-of select="substring-before($haystack, $needle)"/>
+ <xsl:value-of select="$replacement"/>
+ <xsl:call-template name="string-replace">
+ <xsl:with-param name="haystack" select="substring-after($haystack, $needle)"/>
+ <xsl:with-param name="needle" select="$needle"/>
+ <xsl:with-param name="replacement" select="$replacement"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$haystack"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!--
+ string-replace-first - Replace the _first_ occurence of needle in haystack.
+ -->
+<xsl:template name="string-replace-first">
+ <xsl:param name="haystack"/>
+ <xsl:param name="needle"/>
+ <xsl:param name="replacement"/>
+ <xsl:choose>
+ <xsl:when test="contains($haystack, $needle)">
+ <xsl:value-of select="substring-before($haystack, $needle)"/>
+ <xsl:value-of select="$replacement"/>
+ <xsl:value-of select="substring-after($haystack, $needle)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$haystack"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!--
+ strip-string-right - String trailing white space from a string.
+ -->
+<xsl:template name="strip-string-right">
+ <xsl:param name="text"/>
+
+ <!-- Check for trailing whitespace. -->
+ <xsl:choose>
+ <xsl:when test="contains($G_sWhiteSpace, substring($text, string-length($text), 1))">
+ <xsl:call-template name="strip-string-right">
+ <xsl:with-param name="text" select="substring($text, 1, string-length($text) - 1)"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- No trailing white space. Return the string. -->
+ <xsl:otherwise>
+ <xsl:value-of select="$text"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!--
+ strip-string-left - String leading white space from a string.
+ -->
+<xsl:template name="strip-string-left">
+ <xsl:param name="text"/>
+
+ <!-- Check for leading white space. To optimize for speed, we check a couple
+ of longer space sequences first. -->
+ <xsl:choose>
+ <xsl:when test="starts-with($text, ' ')"> <!-- 8 leading spaces -->
+ <xsl:call-template name="strip-string-left">
+ <xsl:with-param name="text" select="substring($text, 9)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="starts-with($text, ' ')"> <!-- 4 leading spaces -->
+ <xsl:call-template name="strip-string-left">
+ <xsl:with-param name="text" select="substring($text, 5)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="starts-with($text, ' ')"> <!-- 2 leading spaces -->
+ <xsl:call-template name="strip-string-left">
+ <xsl:with-param name="text" select="substring($text, 3)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($G_sWhiteSpace, substring($text, 1, 1))">
+ <xsl:if test="string-length($text) > 0">
+ <xsl:call-template name="strip-string">
+ <xsl:with-param name="text" select="substring($text, 2)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+
+ <!-- No leading white space. Return the string. -->
+ <xsl:otherwise>
+ <xsl:value-of select="$text"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<!--
+ strip-string - String leading and trailing white space from a string.
+ -->
+<xsl:template name="strip-string">
+ <xsl:param name="text"/>
+
+ <!-- Check for leading white space. To optimize for speed, we check a couple
+ of longer space sequences first. -->
+ <xsl:choose>
+ <xsl:when test="starts-with($text, ' ')"> <!-- 8 leading spaces -->
+ <xsl:call-template name="strip-string">
+ <xsl:with-param name="text" select="substring($text, 9)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="starts-with($text, ' ')"> <!-- 4 leading spaces -->
+ <xsl:call-template name="strip-string">
+ <xsl:with-param name="text" select="substring($text, 5)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="starts-with($text, ' ')"> <!-- 2 leading spaces -->
+ <xsl:call-template name="strip-string">
+ <xsl:with-param name="text" select="substring($text, 3)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($G_sWhiteSpace, substring($text, 1, 1))">
+ <xsl:if test="string-length($text) > 0">
+ <xsl:call-template name="strip-string">
+ <xsl:with-param name="text" select="substring($text, 2)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+
+ <!-- Then check for trailing whitespace. -->
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="contains($G_sWhiteSpace, substring($text, string-length($text), 1))">
+ <xsl:call-template name="strip-string-right">
+ <xsl:with-param name="text" select="substring($text, 1, string-length($text) - 1)"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- No leading or trailing white space. Return the string. -->
+ <xsl:otherwise>
+ <xsl:value-of select="$text"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/src/VBox/Main/idl/xpidl.xsl b/src/VBox/Main/idl/xpidl.xsl
new file mode 100644
index 00000000..439fb5a3
--- /dev/null
+++ b/src/VBox/Main/idl/xpidl.xsl
@@ -0,0 +1,1124 @@
+<?xml version="1.0"?>
+<!-- $Id: xpidl.xsl $ -->
+
+<!--
+ * A template to generate a XPCOM IDL compatible interface definition file
+ * from the generic interface definition expressed in XML.
+-->
+<!--
+ Copyright (C) 2006-2023 Oracle and/or its affiliates.
+
+ This file is part of VirtualBox base platform packages, as
+ available from https://www.virtualbox.org.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, in version 3 of the
+ License.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <https://www.gnu.org/licenses>.
+
+ SPDX-License-Identifier: GPL-3.0-only
+-->
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:output method="text"/>
+
+<xsl:strip-space elements="*"/>
+
+<xsl:include href="typemap-shared.inc.xsl"/>
+
+
+<!-- - - - - - - - - - - - - - - - - - - - - - -
+ XSLT parameters
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<!-- xpidl doesn't support enums. This parameter performs certain hacks that helps
+ us bridge the gap and get similar behaviour as msidl.
+
+ The https://bugzilla.mozilla.org/show_bug.cgi?id=8781 bug discusses why xpidl
+ doesn't do enums. It boils down to the gcc short-enum option and similar
+ portability concerns.
+ -->
+<xsl:param name="g_fHackEnumsOntoCppEnums" select="'yes'"/>
+
+
+<!--
+// templates
+/////////////////////////////////////////////////////////////////////////////
+-->
+
+
+<!--
+ * not explicitly matched elements and attributes
+-->
+<xsl:template match="*"/>
+
+
+<!--
+ * header
+-->
+<xsl:template match="/idl">
+ <xsl:text>
+/*
+ * DO NOT EDIT! This is a generated file.
+ *
+ * XPCOM IDL (XPIDL) definition for VirtualBox Main API (COM interfaces)
+ * generated from XIDL (XML interface definition).
+ *
+ * Source : src/VBox/Main/idl/VirtualBox.xidl
+ * Generator : src/VBox/Main/idl/xpidl.xsl
+ */
+
+#include "nsISupports.idl"
+#include "nsIException.idl"
+
+</xsl:text>
+ <!-- native typedefs for the 'mod="ptr"' attribute -->
+ <xsl:text>
+[ptr] native booleanPtr (PRBool);
+[ptr] native octetPtr (PRUint8);
+[ptr] native shortPtr (PRInt16);
+[ptr] native ushortPtr (PRUint16);
+[ptr] native longPtr (PRInt32);
+[ptr] native llongPtr (PRInt64);
+[ptr] native ulongPtr (PRUint32);
+[ptr] native ullongPtr (PRUint64);
+<!-- charPtr is already defined in nsrootidl.idl -->
+<!-- [ptr] native charPtr (char) -->
+[ptr] native stringPtr (string);
+[ptr] native wcharPtr (wchar);
+[ptr] native wstringPtr (wstring);
+
+</xsl:text>
+ <xsl:apply-templates/>
+</xsl:template>
+
+
+<!--
+ * ignore all |if|s except those for XPIDL target
+-->
+<xsl:template match="if">
+ <xsl:if test="@target='xpidl'">
+ <xsl:apply-templates/>
+ </xsl:if>
+</xsl:template>
+<xsl:template match="if" mode="forward">
+ <xsl:if test="@target='xpidl'">
+ <xsl:apply-templates mode="forward"/>
+ </xsl:if>
+</xsl:template>
+<xsl:template match="if" mode="forwarder">
+ <xsl:if test="@target='midl'">
+ <xsl:apply-templates mode="forwarder"/>
+ </xsl:if>
+</xsl:template>
+
+
+<!--
+ * cpp_quote
+-->
+<xsl:template match="cpp">
+ <xsl:if test="text()">
+ <xsl:text>%{C++</xsl:text>
+ <xsl:value-of select="text()"/>
+ <xsl:text>&#x0A;%}&#x0A;&#x0A;</xsl:text>
+ </xsl:if>
+ <xsl:if test="not(text()) and @line">
+ <xsl:text>%{C++&#x0A;</xsl:text>
+ <xsl:value-of select="@line"/>
+ <xsl:text>&#x0A;%}&#x0A;&#x0A;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+
+<!--
+ * #if statement (@if attribute)
+ * @note
+ * xpidl doesn't support any preprocessor defines other than #include
+ * (it just ignores them), so the generated IDL will most likely be
+ * invalid. So for now we forbid using @if attributes
+-->
+<xsl:template match="@if" mode="begin">
+ <xsl:message terminate="yes">
+ @if attributes are not currently allowed because xpidl lacks
+ support for #ifdef and stuff.
+ </xsl:message>
+ <xsl:text>#if </xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text>&#x0A;</xsl:text>
+</xsl:template>
+<xsl:template match="@if" mode="end">
+ <xsl:text>#endif&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * libraries
+-->
+<xsl:template match="library">
+ <xsl:text>%{C++&#x0A;</xsl:text>
+ <xsl:text>#ifndef VBOX_EXTERN_C&#x0A;</xsl:text>
+ <xsl:text># ifdef __cplusplus&#x0A;</xsl:text>
+ <xsl:text># define VBOX_EXTERN_C extern "C"&#x0A;</xsl:text>
+ <xsl:text># else // !__cplusplus&#x0A;</xsl:text>
+ <xsl:text># define VBOX_EXTERN_C extern&#x0A;</xsl:text>
+ <xsl:text># endif // !__cplusplus&#x0A;</xsl:text>
+ <xsl:text>#endif // !VBOX_EXTERN_C&#x0A;</xsl:text>
+ <!-- result codes -->
+ <xsl:text>// result codes declared in API spec&#x0A;</xsl:text>
+ <xsl:for-each select="application/result">
+ <xsl:apply-templates select="."/>
+ </xsl:for-each>
+ <xsl:text>%}&#x0A;&#x0A;</xsl:text>
+ <!-- forward declarations -->
+ <xsl:apply-templates select="application/if | application/interface" mode="forward"/>
+ <xsl:text>&#x0A;</xsl:text>
+ <!-- all enums go first -->
+ <xsl:apply-templates select="application/enum | application/if/enum"/>
+ <!-- everything else but result codes and enums
+ <xsl:apply-templates select="*[not(self::application/result or self::application/enum) and
+ not(self::application[result] or self::application/if[enum])]"/> -->
+ <!-- the modules (i.e. everything else) -->
+ <xsl:apply-templates select="application/interface | application/if[interface]
+ | application/module | application/if[module]"/>
+ <!-- -->
+</xsl:template>
+
+
+ <!--
+ * applications
+-->
+<xsl:template match="application">
+ <xsl:apply-templates/>
+</xsl:template>
+<xsl:template match="application" mode="forward">
+ <xsl:apply-templates mode="forward"/>
+</xsl:template>
+
+<!--
+ * result codes
+-->
+<xsl:template match="result">
+ <xsl:value-of select="concat('#define ',@name,' ((nsresult)',@value, ')')"/>
+ <xsl:text>&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * forward declarations
+-->
+<xsl:template match="interface" mode="forward">
+ <xsl:text>interface </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>;&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * interfaces
+-->
+<xsl:template match="interface">[
+ uuid(<xsl:value-of select="@uuid"/>),
+ scriptable
+]
+<xsl:text>interface </xsl:text>
+ <xsl:variable name="name" select="@name"/>
+ <xsl:value-of select="$name"/>
+ <xsl:text> : </xsl:text>
+ <xsl:choose>
+ <xsl:when test="@extends='$unknown'">nsISupports</xsl:when>
+ <xsl:when test="@extends='$errorinfo'">nsIException</xsl:when>
+ <xsl:otherwise><xsl:value-of select="@extends"/></xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="xsltprocNewlineOutputHack"/>
+ <xsl:text>{&#x0A;</xsl:text>
+ <!-- attributes (properties) -->
+ <xsl:apply-templates select="attribute"/>
+ <xsl:variable name="reservedAttributes" select="@reservedAttributes"/>
+ <xsl:if test="$reservedAttributes > 0">
+ <!-- tricky way to do a "for" loop without recursion -->
+ <xsl:for-each select="(//*)[position() &lt;= $reservedAttributes]">
+ <xsl:text> readonly attribute unsigned long InternalAndReservedAttribute</xsl:text>
+ <xsl:value-of select="concat(position(), $name)"/>
+ <xsl:text>;&#x0A;&#x0A;</xsl:text>
+ </xsl:for-each>
+ </xsl:if>
+ <!-- methods -->
+ <xsl:apply-templates select="method"/>
+ <xsl:variable name="reservedMethods" select="@reservedMethods"/>
+ <xsl:if test="$reservedMethods > 0">
+ <!-- tricky way to do a "for" loop without recursion -->
+ <xsl:for-each select="(//*)[position() &lt;= $reservedMethods]">
+ <xsl:text> void InternalAndReservedMethod</xsl:text>
+ <xsl:value-of select="concat(position(), $name)"/>
+ <xsl:text>();&#x0A;&#x0A;</xsl:text>
+ </xsl:for-each>
+ </xsl:if>
+ <!-- 'if' enclosed elements, unsorted -->
+ <xsl:apply-templates select="if"/>
+ <!-- -->
+ <xsl:text>}; /* interface </xsl:text>
+ <xsl:value-of select="$name"/>
+ <xsl:text> */&#x0A;&#x0A;</xsl:text>
+ <!-- Interface implementation forwarder macro -->
+ <xsl:text>/* Interface implementation forwarder macro */&#x0A;</xsl:text>
+ <xsl:text>%{C++&#x0A;</xsl:text>
+ <!-- 1) individual methods -->
+ <xsl:apply-templates select="attribute" mode="forwarder"/>
+ <xsl:apply-templates select="method" mode="forwarder"/>
+ <xsl:apply-templates select="if" mode="forwarder"/>
+ <!-- 2) COM_FORWARD_Interface_TO(smth) -->
+ <xsl:text>#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$name"/>
+ <xsl:text>_TO(smth) NS_FORWARD_</xsl:text>
+ <xsl:call-template name="string-to-upper">
+ <xsl:with-param name="str" select="$name"/>
+ </xsl:call-template>
+ <xsl:text> (smth)&#x0A;</xsl:text>
+ <!-- 3) COM_FORWARD_Interface_TO_OBJ(obj) -->
+ <xsl:text>#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$name"/>
+ <xsl:text>_TO_OBJ(obj) COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$name"/>
+ <xsl:text>_TO ((obj)->)&#x0A;</xsl:text>
+ <!-- 4) COM_FORWARD_Interface_TO_BASE(base) -->
+ <xsl:text>#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$name"/>
+ <xsl:text>_TO_BASE(base) COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$name"/>
+ <xsl:text>_TO (base::)&#x0A;&#x0A;</xsl:text>
+ <!-- -->
+ <xsl:text>// for compatibility with Win32&#x0A;</xsl:text>
+ <xsl:text>VBOX_EXTERN_C const nsID IID_</xsl:text>
+ <xsl:value-of select="$name"/>
+ <xsl:text>;&#x0A;</xsl:text>
+ <xsl:text>%}&#x0A;&#x0A;</xsl:text>
+ <!-- end -->
+</xsl:template>
+
+
+<!--
+ * attributes
+-->
+<xsl:template match="interface//attribute">
+ <xsl:apply-templates select="@if" mode="begin"/>
+ <xsl:if test="@mod='ptr'">
+ <!-- attributes using native types must be non-scriptable -->
+ <xsl:text> [noscript]&#x0A;</xsl:text>
+ </xsl:if>
+ <xsl:choose>
+ <!-- safearray pseudo attribute -->
+ <xsl:when test="@safearray='yes'">
+ <!-- getter -->
+ <xsl:text> void get</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text> (&#x0A;</xsl:text>
+ <!-- array size -->
+ <xsl:text> out unsigned long </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>Size,&#x0A;</xsl:text>
+ <!-- array pointer -->
+ <xsl:text> [array, size_is(</xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>Size), retval] out </xsl:text>
+ <xsl:apply-templates select="@type"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>&#x0A; );&#x0A;</xsl:text>
+ <!-- setter -->
+ <xsl:if test="not(@readonly='yes')">
+ <xsl:text> void set</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text> (&#x0A;</xsl:text>
+ <!-- array size -->
+ <xsl:text> in unsigned long </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>Size,&#x0A;</xsl:text>
+ <!-- array pointer -->
+ <xsl:text> [array, size_is(</xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>Size)] in </xsl:text>
+ <xsl:apply-templates select="@type"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>&#x0A; );&#x0A;</xsl:text>
+ </xsl:if>
+ </xsl:when>
+ <!-- normal attribute -->
+ <xsl:otherwise>
+ <xsl:text> </xsl:text>
+ <xsl:if test="@readonly='yes'">
+ <xsl:text>readonly </xsl:text>
+ </xsl:if>
+ <xsl:text>attribute </xsl:text>
+ <xsl:apply-templates select="@type"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>;&#x0A;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="@if" mode="end"/>
+ <xsl:text>&#x0A;</xsl:text>
+</xsl:template>
+
+<xsl:template match="interface//attribute" mode="forwarder">
+
+ <xsl:variable name="parent" select="ancestor::interface"/>
+
+ <xsl:apply-templates select="@if" mode="begin"/>
+
+ <!-- getter: COM_FORWARD_Interface_GETTER_Name_TO(smth) -->
+ <xsl:text>#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_GETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO(smth) NS_IMETHOD Get</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text> (</xsl:text>
+ <xsl:if test="@safearray='yes'">
+ <xsl:text>PRUint32 * a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>Size, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="@type" mode="forwarder"/>
+ <xsl:if test="@safearray='yes'">
+ <xsl:text> *</xsl:text>
+ </xsl:if>
+ <xsl:text> * a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>) { return smth Get</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text> (</xsl:text>
+ <xsl:if test="@safearray='yes'">
+ <xsl:text>a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>Size, </xsl:text>
+ </xsl:if>
+ <xsl:text>a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>); }&#x0A;</xsl:text>
+ <!-- getter: COM_FORWARD_Interface_GETTER_Name_TO_OBJ(obj) -->
+ <xsl:text>#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_GETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO_OBJ(obj) COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_GETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO ((obj)->)&#x0A;</xsl:text>
+ <!-- getter: COM_FORWARD_Interface_GETTER_Name_TO_BASE(base) -->
+ <xsl:text>#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_GETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO_BASE(base) COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_GETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO (base::)&#x0A;</xsl:text>
+ <!-- -->
+ <xsl:if test="not(@readonly='yes')">
+ <!-- setter: COM_FORWARD_Interface_SETTER_Name_TO(smth) -->
+ <xsl:text>#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_SETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO(smth) NS_IMETHOD Set</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text> (</xsl:text>
+ <xsl:if test="@safearray='yes'">
+ <xsl:text>PRUint32 a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>Size, </xsl:text>
+ </xsl:if>
+ <xsl:if test="not(@safearray='yes') and (@type='string' or @type='wstring')">
+ <xsl:text>const </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="@type" mode="forwarder"/>
+ <xsl:if test="@safearray='yes'">
+ <xsl:text> *</xsl:text>
+ </xsl:if>
+ <xsl:text> a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>) { return smth Set</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text> (a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>); }&#x0A;</xsl:text>
+ <!-- setter: COM_FORWARD_Interface_SETTER_Name_TO_OBJ(obj) -->
+ <xsl:text>#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_SETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO_OBJ(obj) COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_SETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO ((obj)->)&#x0A;</xsl:text>
+ <!-- setter: COM_FORWARD_Interface_SETTER_Name_TO_BASE(base) -->
+ <xsl:text>#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_SETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO_BASE(base) COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_SETTER_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO (base::)&#x0A;</xsl:text>
+ </xsl:if>
+
+ <xsl:apply-templates select="@if" mode="end"/>
+
+</xsl:template>
+
+
+<!--
+ * methods
+-->
+<xsl:template match="interface//method">
+ <xsl:apply-templates select="@if" mode="begin"/>
+ <xsl:if test="param/@mod='ptr'">
+ <!-- methods using native types must be non-scriptable -->
+ <xsl:text> [noscript]&#x0A;</xsl:text>
+ </xsl:if>
+ <xsl:text> void </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:if test="param">
+ <xsl:text> (&#x0A;</xsl:text>
+ <xsl:for-each select="param [position() != last()]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="."/>
+ <xsl:text>,&#x0A;</xsl:text>
+ </xsl:for-each>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="param [last()]"/>
+ <xsl:text>&#x0A; );&#x0A;</xsl:text>
+ </xsl:if>
+ <xsl:if test="not(param)">
+ <xsl:text>();&#x0A;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="@if" mode="end"/>
+ <xsl:text>&#x0A;</xsl:text>
+</xsl:template>
+
+<xsl:template match="interface//method" mode="forwarder">
+
+ <xsl:variable name="parent" select="ancestor::interface"/>
+
+ <xsl:apply-templates select="@if" mode="begin"/>
+
+ <xsl:text>#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO(smth) NS_IMETHOD </xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="param">
+ <xsl:text> (</xsl:text>
+ <xsl:for-each select="param [position() != last()]">
+ <xsl:apply-templates select="." mode="forwarder"/>
+ <xsl:text>, </xsl:text>
+ </xsl:for-each>
+ <xsl:apply-templates select="param [last()]" mode="forwarder"/>
+ <xsl:text>) { return smth </xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text> (</xsl:text>
+ <xsl:for-each select="param [position() != last()]">
+ <xsl:if test="@safearray='yes'">
+ <xsl:text>a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>Size+++, </xsl:text>
+ </xsl:if>
+ <xsl:text>a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>, </xsl:text>
+ </xsl:for-each>
+ <xsl:if test="param [last()]/@safearray='yes'">
+ <xsl:text>a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="param [last()]/@name"/>
+ </xsl:call-template>
+ <xsl:text>Size, </xsl:text>
+ </xsl:if>
+ <xsl:text>a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="param [last()]/@name"/>
+ </xsl:call-template>
+ <xsl:text>); }</xsl:text>
+ </xsl:when>
+ <xsl:otherwise test="not(param)">
+ <xsl:text>() { return smth </xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>(); }</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#x0A;</xsl:text>
+ <!-- COM_FORWARD_Interface_Method_TO_OBJ(obj) -->
+ <xsl:text>#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO_OBJ(obj) COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO ((obj)->)&#x0A;</xsl:text>
+ <!-- COM_FORWARD_Interface_Method_TO_BASE(base) -->
+ <xsl:text>#define COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO_BASE(base) COM_FORWARD_</xsl:text>
+ <xsl:value-of select="$parent/@name"/>
+ <xsl:text>_</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_TO (base::)&#x0A;</xsl:text>
+
+ <xsl:apply-templates select="@if" mode="end"/>
+
+</xsl:template>
+
+
+<!--
+ * modules
+-->
+<xsl:template match="module">
+ <xsl:apply-templates select="class"/>
+</xsl:template>
+
+
+<!--
+ * co-classes
+-->
+<xsl:template match="module/class">
+ <!-- class and contract id -->
+ <xsl:text>%{C++&#x0A;</xsl:text>
+ <xsl:text>// Definitions for module </xsl:text>
+ <xsl:value-of select="../@name"/>
+ <xsl:text>, class </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>:&#x0A;</xsl:text>
+ <xsl:text>#define NS_</xsl:text>
+ <xsl:call-template name="string-to-upper">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>_CID { \&#x0A;</xsl:text>
+ <xsl:text> 0x</xsl:text><xsl:value-of select="substring(@uuid,1,8)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,10,4)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,15,4)"/>
+ <xsl:text>, \&#x0A; </xsl:text>
+ <xsl:text>{ 0x</xsl:text><xsl:value-of select="substring(@uuid,20,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,22,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,25,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,27,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,29,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,31,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,33,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,35,2)"/>
+ <xsl:text> } \&#x0A;}&#x0A;</xsl:text>
+ <xsl:text>#define NS_</xsl:text>
+ <xsl:call-template name="string-to-upper">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <!-- Contract ID -->
+ <xsl:text>_CONTRACTID &quot;@</xsl:text>
+ <xsl:value-of select="@namespace"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>;1&quot;&#x0A;</xsl:text>
+ <!-- CLSID_xxx declarations for XPCOM, for compatibility with Win32 -->
+ <xsl:text>// for compatibility with Win32&#x0A;</xsl:text>
+ <xsl:text>VBOX_EXTERN_C const nsCID CLSID_</xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>;&#x0A;</xsl:text>
+ <xsl:text>%}&#x0A;&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * enums
+-->
+<xsl:template match="enum">[
+ uuid(<xsl:value-of select="@uuid"/>),
+ scriptable
+]
+<xsl:text>interface </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>&#x0A;{&#x0A;</xsl:text>
+ <xsl:for-each select="const">
+ <xsl:text> const PRUint32 </xsl:text>
+ <xsl:value-of select="@name"/> = <xsl:value-of select="@value"/>
+ <xsl:text>;&#x0A;</xsl:text>
+ </xsl:for-each>
+ <xsl:text>};&#x0A;&#x0A;</xsl:text>
+ <xsl:choose>
+
+ <xsl:when test="$g_fHackEnumsOntoCppEnums = 'yes'">
+ <xsl:text>
+/* IDL typedef for enum </xsl:text><xsl:value-of select="@name" /><xsl:text> and C++ mappings. */
+%{C++
+#ifndef VBOX_WITH_XPCOM_CPP_ENUM_HACK
+%}
+typedef PRUint32 </xsl:text><xsl:value-of select="concat(@name, '_T')" /><xsl:text>;
+%{C++
+</xsl:text>
+ <xsl:for-each select="const">
+ <xsl:value-of select="concat('# define ', ../@name, '_', @name, ' ', ../@name, '::', @name, '&#x0A;')"/>
+ </xsl:for-each>
+ <xsl:text>#else /* VBOX_WITH_XPCOM_CPP_ENUM_HACK */
+typedef enum </xsl:text>
+ <xsl:value-of select="concat(@name, '_T')" />
+ <xsl:text> {
+</xsl:text>
+ <xsl:for-each select="const">
+ <xsl:value-of select="concat(' ', ../@name, '_', @name, ' = ', ../@name, '::', @name, ',&#x0A;')"/>
+ </xsl:for-each>
+ <xsl:value-of select="concat(' ', @name, '_32BitHack = 0x7fffffff', '&#x0A;')"/>
+ <xsl:text>} </xsl:text><xsl:value-of select="concat(@name, '_T')"/><xsl:text>;
+# ifdef AssertCompileSize
+AssertCompileSize(</xsl:text><xsl:value-of select="concat(@name, '_T')"/><xsl:text>, sizeof(PRUint32));
+# endif
+#endif /* VBOX_WITH_XPCOM_CPP_ENUM_HACK */
+%}
+
+</xsl:text>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- -->
+ <xsl:value-of select="concat('/* cross-platform type name for ', @name, ' */&#x0A;')"/>
+ <xsl:text>%{C++&#x0A;</xsl:text>
+ <xsl:value-of select="concat('#define ', @name, '_T', ' ',
+ 'PRUint32&#x0A;')"/>
+ <xsl:text>%}&#x0A;&#x0A;</xsl:text>
+ <!-- -->
+ <xsl:value-of select="concat('/* cross-platform constants for ', @name, ' */&#x0A;')"/>
+ <xsl:text>%{C++&#x0A;</xsl:text>
+ <xsl:for-each select="const">
+ <xsl:value-of select="concat('#define ', ../@name, '_', @name, ' ',
+ ../@name, '::', @name, '&#x0A;')"/>
+ </xsl:for-each>
+ <xsl:text>%}&#x0A;&#x0A;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+
+<!--
+ * method parameters
+-->
+<xsl:template match="method/param">
+ <xsl:choose>
+ <!-- safearray parameters -->
+ <xsl:when test="@safearray='yes'">
+ <!-- array size -->
+ <xsl:choose>
+ <xsl:when test="@dir='in'">in </xsl:when>
+ <xsl:when test="@dir='out'">out </xsl:when>
+ <xsl:when test="@dir='return'">out </xsl:when>
+ <xsl:otherwise>in </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>unsigned long </xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>Size,&#x0A;</xsl:text>
+ <!-- array pointer -->
+ <xsl:text> [array, size_is(</xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>Size)</xsl:text>
+ <xsl:choose>
+ <xsl:when test="@dir='in'">] in </xsl:when>
+ <xsl:when test="@dir='out'">] out </xsl:when>
+ <xsl:when test="@dir='return'"> , retval] out </xsl:when>
+ <xsl:otherwise>] in </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="@type"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="@name"/>
+ </xsl:when>
+ <!-- normal and array parameters -->
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="@dir='in'">in </xsl:when>
+ <xsl:when test="@dir='out'">out </xsl:when>
+ <xsl:when test="@dir='return'">[retval] out </xsl:when>
+ <xsl:otherwise>in </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="@type"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="@name"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="method/param" mode="forwarder">
+ <xsl:if test="@safearray='yes'">
+ <xsl:text>PRUint32</xsl:text>
+ <xsl:if test="@dir='out' or @dir='return'">
+ <xsl:text> *</xsl:text>
+ </xsl:if>
+ <xsl:text> a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+ <xsl:text>Size, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="@type" mode="forwarder"/>
+ <xsl:if test="@dir='out' or @dir='return'">
+ <xsl:text> *</xsl:text>
+ </xsl:if>
+ <xsl:if test="@safearray='yes'">
+ <xsl:text> *</xsl:text>
+ </xsl:if>
+ <xsl:text> a</xsl:text>
+ <xsl:call-template name="capitalize">
+ <xsl:with-param name="str" select="@name"/>
+ </xsl:call-template>
+</xsl:template>
+
+
+<!--
+ * attribute/parameter type conversion
+-->
+<xsl:template match="attribute/@type | param/@type">
+ <xsl:variable name="self_target" select="current()/ancestor::if/@target"/>
+
+ <xsl:choose>
+ <!-- modifiers (ignored for 'enumeration' attributes)-->
+ <xsl:when test="name(current())='type' and ../@mod">
+ <xsl:choose>
+ <xsl:when test="../@mod='ptr'">
+ <xsl:choose>
+ <!-- standard types -->
+ <!--xsl:when test=".='result'">??</xsl:when-->
+ <xsl:when test=".='boolean'">booleanPtr</xsl:when>
+ <xsl:when test=".='octet'">octetPtr</xsl:when>
+ <xsl:when test=".='short'">shortPtr</xsl:when>
+ <xsl:when test=".='unsigned short'">ushortPtr</xsl:when>
+ <xsl:when test=".='long'">longPtr</xsl:when>
+ <xsl:when test=".='long long'">llongPtr</xsl:when>
+ <xsl:when test=".='unsigned long'">ulongPtr</xsl:when>
+ <xsl:when test=".='unsigned long long'">ullongPtr</xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
+ <xsl:text>attribute 'mod=</xsl:text>
+ <xsl:value-of select="concat('&quot;',../@mod,'&quot;')"/>
+ <xsl:text>' cannot be used with type </xsl:text>
+ <xsl:value-of select="concat('&quot;',current(),'&quot;!')"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="../@mod='string'">
+ <xsl:choose>
+ <!-- standard types -->
+ <!--xsl:when test=".='result'">??</xsl:when-->
+ <xsl:when test=".='uuid'">wstring</xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
+ <xsl:text>attribute 'mod=</xsl:text>
+ <xsl:value-of select="concat('&quot;',../@mod,'&quot;')"/>
+ <xsl:text>' cannot be used with type </xsl:text>
+ <xsl:value-of select="concat('&quot;',current(),'&quot;!')"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
+ <xsl:value-of select="concat('value &quot;',../@mod,'&quot; ')"/>
+ <xsl:text>of attribute 'mod' is invalid!</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- no modifiers -->
+ <xsl:otherwise>
+ <xsl:choose>
+ <!-- standard types -->
+ <xsl:when test=".='result'">nsresult</xsl:when>
+ <xsl:when test=".='boolean'">boolean</xsl:when>
+ <xsl:when test=".='octet'">octet</xsl:when>
+ <xsl:when test=".='short'">short</xsl:when>
+ <xsl:when test=".='unsigned short'">unsigned short</xsl:when>
+ <xsl:when test=".='long'">long</xsl:when>
+ <xsl:when test=".='long long'">long long</xsl:when>
+ <xsl:when test=".='unsigned long'">unsigned long</xsl:when>
+ <xsl:when test=".='unsigned long long'">unsigned long long</xsl:when>
+ <xsl:when test=".='char'">char</xsl:when>
+ <xsl:when test=".='wchar'">wchar</xsl:when>
+ <xsl:when test=".='string'">string</xsl:when>
+ <xsl:when test=".='wstring'">wstring</xsl:when>
+ <!-- UUID type -->
+ <xsl:when test=".='uuid'">
+ <xsl:choose>
+ <xsl:when test="name(..)='attribute'">
+ <xsl:choose>
+ <xsl:when test="../@readonly='yes'">
+ <xsl:text>nsIDPtr</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:value-of select="../@name"/>
+ <xsl:text>: Non-readonly uuid attributes are not supported!</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="name(..)='param'">
+ <xsl:choose>
+ <xsl:when test="../@dir='in' and not(../@safearray='yes')">
+ <xsl:text>nsIDRef</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>nsIDPtr</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ <!-- system interface types -->
+ <xsl:when test=".='$unknown'">nsISupports</xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <!-- enum types -->
+ <xsl:when test="
+ (ancestor::library/application/enum[@name=current()]) or
+ (ancestor::library/application/if[@target=$self_target]/enum[@name=current()])
+ ">
+ <xsl:choose>
+ <xsl:when test="$g_fHackEnumsOntoCppEnums = 'yes'">
+ <xsl:value-of select="concat(., '_T')" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>PRUint32</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- custom interface types -->
+ <xsl:when test="
+ (ancestor::library/application/interface[@name=current()]) or
+ (ancestor::library/application/if[@target=$self_target]/interface[@name=current()])
+ ">
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <!-- other types -->
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Unknown parameter type: </xsl:text>
+ <xsl:value-of select="."/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="attribute/@type | param/@type" mode="forwarder">
+
+ <xsl:variable name="self_target" select="current()/ancestor::if/@target"/>
+
+ <xsl:choose>
+ <!-- modifiers (ignored for 'enumeration' attributes)-->
+ <xsl:when test="name(current())='type' and ../@mod">
+ <xsl:choose>
+ <xsl:when test="../@mod='ptr'">
+ <xsl:choose>
+ <!-- standard types -->
+ <!--xsl:when test=".='result'">??</xsl:when-->
+ <xsl:when test=".='boolean'">PRBool *</xsl:when>
+ <xsl:when test=".='octet'">PRUint8 *</xsl:when>
+ <xsl:when test=".='short'">PRInt16 *</xsl:when>
+ <xsl:when test=".='unsigned short'">PRUint16 *</xsl:when>
+ <xsl:when test=".='long'">PRInt32 *</xsl:when>
+ <xsl:when test=".='long long'">PRInt64 *</xsl:when>
+ <xsl:when test=".='unsigned long'">PRUint32 *</xsl:when>
+ <xsl:when test=".='unsigned long long'">PRUint64 *</xsl:when>
+ <xsl:when test=".='char'">char *</xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
+ <xsl:text>attribute 'mod=</xsl:text>
+ <xsl:value-of select="concat('&quot;',../@mod,'&quot;')"/>
+ <xsl:text>' cannot be used with type </xsl:text>
+ <xsl:value-of select="concat('&quot;',current(),'&quot;!')"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="../@mod='string'">
+ <xsl:choose>
+ <!-- standard types -->
+ <!--xsl:when test=".='result'">??</xsl:when-->
+ <xsl:when test=".='uuid'">PRUnichar *</xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:value-of select="concat(../../../@name,'::',../../@name,'::',../@name,': ')"/>
+ <xsl:text>attribute 'mod=</xsl:text>
+ <xsl:value-of select="concat('&quot;',../@mod,'&quot;')"/>
+ <xsl:text>' cannot be used with type </xsl:text>
+ <xsl:value-of select="concat('&quot;',current(),'&quot;!')"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ <!-- no modifiers -->
+ <xsl:otherwise>
+ <xsl:choose>
+ <!-- standard types -->
+ <xsl:when test=".='result'">nsresult</xsl:when>
+ <xsl:when test=".='boolean'">PRBool</xsl:when>
+ <xsl:when test=".='octet'">PRUint8</xsl:when>
+ <xsl:when test=".='short'">PRInt16</xsl:when>
+ <xsl:when test=".='unsigned short'">PRUint16</xsl:when>
+ <xsl:when test=".='long'">PRInt32</xsl:when>
+ <xsl:when test=".='long long'">PRInt64</xsl:when>
+ <xsl:when test=".='unsigned long'">PRUint32</xsl:when>
+ <xsl:when test=".='unsigned long long'">PRUint64</xsl:when>
+ <xsl:when test=".='char'">char</xsl:when>
+ <xsl:when test=".='wchar'">PRUnichar</xsl:when>
+ <!-- string types -->
+ <xsl:when test=".='string'">char *</xsl:when>
+ <xsl:when test=".='wstring'">PRUnichar *</xsl:when>
+ <!-- UUID type -->
+ <xsl:when test=".='uuid'">
+ <xsl:choose>
+ <xsl:when test="name(..)='attribute'">
+ <xsl:choose>
+ <xsl:when test="../@readonly='yes'">
+ <xsl:text>nsID *</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="name(..)='param'">
+ <xsl:choose>
+ <xsl:when test="../@dir='in' and not(../@safearray='yes')">
+ <xsl:text>const nsID &amp;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>nsID *</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ <!-- system interface types -->
+ <xsl:when test=".='$unknown'">nsISupports *</xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <!-- enum types -->
+ <xsl:when test="
+ (ancestor::library/application/enum[@name=current()]) or
+ (ancestor::library/application/if[@target=$self_target]/enum[@name=current()])
+ ">
+ <xsl:text>PRUint32</xsl:text>
+ </xsl:when>
+ <!-- custom interface types -->
+ <xsl:when test="
+ (ancestor::library/application/interface[@name=current()]) or
+ (ancestor::library/application/if[@target=$self_target]/interface[@name=current()])
+ ">
+ <xsl:value-of select="."/>
+ <xsl:text> *</xsl:text>
+ </xsl:when>
+ <!-- other types -->
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Filters for switch off VBoxSDS definitions -->
+
+<xsl:template match="application[@uuid='ec0e78e8-fa43-43e8-ac0a-02c784c4a4fa']//module/class" />
+
+<xsl:template match="application[@uuid='ec0e78e8-fa43-43e8-ac0a-02c784c4a4fa']/if//interface
+| application[@uuid='ec0e78e8-fa43-43e8-ac0a-02c784c4a4fa']//interface" />
+
+<xsl:template match="application[@uuid='ec0e78e8-fa43-43e8-ac0a-02c784c4a4fa']//interface" mode="forward" />
+
+
+</xsl:stylesheet>
+
diff --git a/src/VBox/Main/idl/xpidl_iid.xsl b/src/VBox/Main/idl/xpidl_iid.xsl
new file mode 100644
index 00000000..cebaaed8
--- /dev/null
+++ b/src/VBox/Main/idl/xpidl_iid.xsl
@@ -0,0 +1,172 @@
+<?xml version="1.0"?>
+<!-- $Id: xpidl_iid.xsl $ -->
+
+<!--
+ * A template to generate a header file containing IIDs for XPCOM
+ * from the generic interface definition expressed in XML.
+-->
+
+<!--
+ Copyright (C) 2006-2023 Oracle and/or its affiliates.
+
+ This file is part of VirtualBox base platform packages, as
+ available from https://www.virtualbox.org.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, in version 3 of the
+ License.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <https://www.gnu.org/licenses>.
+
+ SPDX-License-Identifier: GPL-3.0-only
+-->
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:output method="text"/>
+
+<xsl:strip-space elements="*"/>
+
+<!--
+// templates
+/////////////////////////////////////////////////////////////////////////////
+-->
+
+
+<!--
+ * not explicitly matched elements and attributes
+-->
+<xsl:template match="*"/>
+
+
+<!--
+ * header
+-->
+<xsl:template match="/idl">
+ <xsl:text>
+/*
+ * DO NOT EDIT! This is a generated file.
+ *
+ * XPCOM C definitions for VirtualBox Main API (IIDs for COM interfaces)
+ * generated from XIDL (XML interface definition).
+ *
+ * Source : src/VBox/Main/idl/VirtualBox.xidl
+ * Generator : src/VBox/Main/idl/xpidl_iid.xsl
+ */
+
+#ifndef nsID_h__
+struct nsID
+{
+ unsigned int m0;
+ unsigned short m1;
+ unsigned short m2;
+ unsigned char m3[8];
+};
+
+typedef struct nsID nsID;
+typedef struct nsID nsIID;
+typedef struct nsID nsCID;
+#endif /* nsID_h__ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>
+
+#ifdef __cplusplus
+}
+#endif
+
+</xsl:text>
+</xsl:template>
+
+
+<!--
+ * ignore all |if|s except those for XPIDL target
+-->
+<xsl:template match="if">
+ <xsl:if test="@target='xpidl'">
+ <xsl:apply-templates/>
+ </xsl:if>
+</xsl:template>
+
+
+<!--
+ * libraries
+-->
+<xsl:template match="library">
+ <xsl:apply-templates select="application/if | application/interface"/>
+ <xsl:apply-templates select="application/module"/>
+</xsl:template>
+
+
+<!--
+ * interfaces
+-->
+<xsl:template match="interface">
+ <xsl:text>const nsID IID_</xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text> = {&#x0A;</xsl:text>
+ <xsl:text> 0x</xsl:text><xsl:value-of select="substring(@uuid,1,8)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,10,4)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,15,4)"/>
+ <xsl:text>, \&#x0A; </xsl:text>
+ <xsl:text>{ 0x</xsl:text><xsl:value-of select="substring(@uuid,20,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,22,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,25,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,27,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,29,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,31,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,33,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,35,2)"/>
+ <xsl:text> } \&#x0A;};&#x0A;&#x0A;</xsl:text>
+</xsl:template>
+
+
+<!--
+ * modules
+-->
+<xsl:template match="module">
+ <xsl:apply-templates select="class"/>
+</xsl:template>
+
+
+<!--
+ * co-classes
+-->
+<xsl:template match="module/class">
+ <xsl:text>const nsCID CLSID_</xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text> = {&#x0A;</xsl:text>
+ <xsl:text> 0x</xsl:text><xsl:value-of select="substring(@uuid,1,8)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,10,4)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,15,4)"/>
+ <xsl:text>, \&#x0A; </xsl:text>
+ <xsl:text>{ 0x</xsl:text><xsl:value-of select="substring(@uuid,20,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,22,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,25,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,27,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,29,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,31,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,33,2)"/>
+ <xsl:text>, 0x</xsl:text><xsl:value-of select="substring(@uuid,35,2)"/>
+ <xsl:text> } \&#x0A;};&#x0A;&#x0A;</xsl:text>
+</xsl:template>
+
+
+<xsl:template match="application[@uuid='ec0e78e8-fa43-43e8-ac0a-02c784c4a4fa']//module/class" />
+
+<xsl:template match="application[@uuid='ec0e78e8-fa43-43e8-ac0a-02c784c4a4fa']/if//interface
+| application[@uuid='ec0e78e8-fa43-43e8-ac0a-02c784c4a4fa']//interface" />
+
+</xsl:stylesheet>
+