VirtualBox

source: vbox/trunk/doc/manual/en_US/SDKRef.xml@ 49894

Last change on this file since 49894 was 49525, checked in by vboxsync, 11 years ago

manual/SDKRef: touch up the C binding documentation

File size: 226.2 KB
Line 
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
3"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
4<book>
5 <bookinfo>
6 <title>$VBOX_PRODUCT<superscript>®</superscript></title>
7
8 <subtitle>Programming Guide and Reference</subtitle>
9
10 <edition>Version $VBOX_VERSION_STRING</edition>
11
12 <corpauthor>$VBOX_VENDOR</corpauthor>
13
14 <address>http://www.virtualbox.org</address>
15
16 <copyright>
17 <year>2004-$VBOX_C_YEAR</year>
18
19 <holder>$VBOX_VENDOR</holder>
20 </copyright>
21 </bookinfo>
22
23 <chapter>
24 <title>Introduction</title>
25
26 <para>VirtualBox comes with comprehensive support for third-party
27 developers. This Software Development Kit (SDK) contains all the
28 documentation and interface files that are needed to write code that
29 interacts with VirtualBox.</para>
30
31 <sect1>
32 <title>Modularity: the building blocks of VirtualBox</title>
33
34 <para>VirtualBox is cleanly separated into several layers, which can be
35 visualized like in the picture below:</para>
36
37 <mediaobject>
38 <imageobject>
39 <imagedata align="center" fileref="images/vbox-components.png"
40 width="12cm" />
41 </imageobject>
42 </mediaobject>
43
44 <para>The orange area represents code that runs in kernel mode, the blue
45 area represents userspace code.</para>
46
47 <para>At the bottom of the stack resides the hypervisor -- the core of
48 the virtualization engine, controlling execution of the virtual machines
49 and making sure they do not conflict with each other or whatever the
50 host computer is doing otherwise.</para>
51
52 <para>On top of the hypervisor, additional internal modules provide
53 extra functionality. For example, the RDP server, which can deliver the
54 graphical output of a VM remotely to an RDP client, is a separate module
55 that is only loosely tacked into the virtual graphics device. Live
56 Migration and Resource Monitor are additional modules currently in the
57 process of being added to VirtualBox.</para>
58
59 <para>What is primarily of interest for purposes of the SDK is the API
60 layer block that sits on top of all the previously mentioned blocks.
61 This API, which we call the <emphasis role="bold">"Main API"</emphasis>,
62 exposes the entire feature set of the virtualization engine below. It is
63 completely documented in this SDK Reference -- see <xref
64 linkend="sdkref_classes" /> and <xref linkend="sdkref_enums" /> -- and
65 available to anyone who wishes to control VirtualBox programmatically.
66 We chose the name "Main API" to differentiate it from other programming
67 interfaces of VirtualBox that may be publicly accessible.</para>
68
69 <para>With the Main API, you can create, configure, start, stop and
70 delete virtual machines, retrieve performance statistics about running
71 VMs, configure the VirtualBox installation in general, and more. In
72 fact, internally, the front-end programs
73 <computeroutput>VirtualBox</computeroutput> and
74 <computeroutput>VBoxManage</computeroutput> use nothing but this API as
75 well -- there are no hidden backdoors into the virtualization engine for
76 our own front-ends. This ensures the entire Main API is both
77 well-documented and well-tested. (The same applies to
78 <computeroutput>VBoxHeadless</computeroutput>, which is not shown in the
79 image.)</para>
80 </sect1>
81
82 <sect1 id="webservice-or-com">
83 <title>Two guises of the same "Main API": the web service or
84 COM/XPCOM</title>
85
86 <para>There are several ways in which the Main API can be called by
87 other code:<orderedlist>
88 <listitem>
89 <para>VirtualBox comes with a <emphasis role="bold">web
90 service</emphasis> that maps nearly the entire Main API. The web
91 service ships in a stand-alone executable
92 (<computeroutput>vboxwebsrv</computeroutput>) that, when running,
93 acts as an HTTP server, accepts SOAP connections and processes
94 them.</para>
95
96 <para>Since the entire web service API is publicly described in a
97 web service description file (in WSDL format), you can write
98 client programs that call the web service in any language with a
99 toolkit that understands WSDL. These days, that includes most
100 programming languages that are available: Java, C++, .NET, PHP,
101 Python, Perl and probably many more.</para>
102
103 <para>All of this is explained in detail in subsequent chapters of
104 this book.</para>
105
106 <para>There are two ways in which you can write client code that
107 uses the web service:<orderedlist>
108 <listitem>
109 <para>For Java as well as Python, the SDK contains
110 easy-to-use classes that allow you to use the web service in
111 an object-oriented, straightforward manner. We shall refer
112 to this as the <emphasis role="bold">"object-oriented web
113 service (OOWS)"</emphasis>.</para>
114
115 <para>The OO bindings for Java are described in <xref
116 linkend="javaapi" />, those for Python in <xref lang=""
117 linkend="glue-python-ws" />.</para>
118 </listitem>
119
120 <listitem>
121 <para>Alternatively, you can use the web service directly,
122 without the object-oriented client layer. We shall refer to
123 this as the <emphasis role="bold">"raw web
124 service"</emphasis>.</para>
125
126 <para>You will then have neither native object orientation
127 nor full type safety, since web services are neither
128 object-oriented nor stateful. However, in this way, you can
129 write client code even in languages for which we do not ship
130 object-oriented client code; all you need is a programming
131 language with a toolkit that can parse WSDL and generate
132 client wrapper code from it.</para>
133
134 <para>We describe this further in <xref
135 linkend="raw-webservice" />, with samples for Java and
136 Perl.</para>
137 </listitem>
138 </orderedlist></para>
139 </listitem>
140
141 <listitem>
142 <para>Internally, for portability and easier maintenance, the Main
143 API is implemented using the <emphasis role="bold">Component
144 Object Model (COM),</emphasis> an interprocess mechanism for
145 software components originally introduced by Microsoft for
146 Microsoft Windows. On a Windows host, VirtualBox will use
147 Microsoft COM; on other hosts where COM is not present, it ships
148 with XPCOM, a free software implementation of COM originally
149 created by the Mozilla project for their browsers.</para>
150
151 <para>So, if you are familiar with COM and the C++ programming
152 language (or with any other programming language that can handle
153 COM/XPCOM objects, such as Java, Visual Basic or C#), then you can
154 use the COM/XPCOM API directly. VirtualBox comes with all
155 necessary files and documentation to build fully functional COM
156 applications. For an introduction, please see <xref
157 linkend="api_com" /> below.</para>
158
159 <para>The VirtualBox front-ends (the graphical user interfaces as
160 well as the command line), which are all written in C++, use
161 COM/XPCOM to call the Main API. Technically, the web service is
162 another front-end to this COM API, mapping almost all of it to
163 SOAP clients.</para>
164 </listitem>
165 </orderedlist></para>
166
167 <para>If you wonder which way to choose, here are a few
168 comparisons:<table>
169 <title>Comparison web service vs. COM/XPCOM</title>
170
171 <tgroup cols="2">
172 <tbody>
173 <row>
174 <entry><emphasis role="bold">Web service</emphasis></entry>
175
176 <entry><emphasis role="bold">COM/XPCOM</emphasis></entry>
177 </row>
178
179 <row>
180 <entry><emphasis role="bold">Pro:</emphasis> Easy to use with
181 Java and Python with the object-oriented web service;
182 extensive support even with other languages (C++, .NET, PHP,
183 Perl and others)</entry>
184
185 <entry><emphasis role="bold">Con:</emphasis> Usable from
186 languages where COM bridge available (most languages on
187 Windows platform, Python and C++ on other hosts)</entry>
188 </row>
189
190 <row>
191 <entry><emphasis role="bold">Pro:</emphasis> Client can be on
192 remote machine</entry>
193
194 <entry><emphasis role="bold">Con: </emphasis>Client must be on
195 the same host where virtual machine is executed</entry>
196 </row>
197
198 <row>
199 <entry><emphasis role="bold">Con: </emphasis>Significant
200 overhead due to XML marshalling over the wire for each method
201 call</entry>
202
203 <entry><emphasis role="bold">Pro: </emphasis>Relatively low
204 invocation overhead</entry>
205 </row>
206 </tbody>
207 </tgroup>
208 </table></para>
209
210 <para>In the following chapters, we will describe the different ways in
211 which to program VirtualBox, starting with the method that is easiest to
212 use and then increase complexity as we go along.</para>
213 </sect1>
214
215 <sect1 id="api_soap_intro">
216 <title>About web services in general</title>
217
218 <para>Web services are a particular type of programming interface.
219 Whereas, with "normal" programming, a program calls an application
220 programming interface (API) defined by another program or the operating
221 system and both sides of the interface have to agree on the calling
222 convention and, in most cases, use the same programming language, web
223 services use Internet standards such as HTTP and XML to
224 communicate.<footnote>
225 <para>In some ways, web services promise to deliver the same thing
226 as CORBA and DCOM did years ago. However, while these previous
227 technologies relied on specific binary protocols and thus proved to
228 be difficult to use between diverging platforms, web services
229 circumvent these incompatibilities by using text-only standards like
230 HTTP and XML. On the downside (and, one could say, typical of things
231 related to XML), a lot of standards are involved before a web
232 service can be implemented. Many of the standards invented around
233 XML are used one way or another. As a result, web services are slow
234 and verbose, and the details can be incredibly messy. The relevant
235 standards here are called SOAP and WSDL, where SOAP describes the
236 format of the messages that are exchanged (an XML document wrapped
237 in an HTTP header), and WSDL is an XML format that describes a
238 complete API provided by a web service. WSDL in turn uses XML Schema
239 to describe types, which is not exactly terse either. However, as
240 you will see from the samples provided in this chapter, the
241 VirtualBox web service shields you from these details and is easy to
242 use.</para>
243 </footnote></para>
244
245 <para>In order to successfully use a web service, a number of things are
246 required -- primarily, a web service accepting connections; service
247 descriptions; and then a client that connects to that web service. The
248 connections are governed by the SOAP standard, which describes how
249 messages are to be exchanged between a service and its clients; the
250 service descriptions are governed by WSDL.</para>
251
252 <para>In the case of VirtualBox, this translates into the following
253 three components:<orderedlist>
254 <listitem>
255 <para>The VirtualBox web service (the "server"): this is the
256 <computeroutput>vboxwebsrv</computeroutput> executable shipped
257 with VirtualBox. Once you start this executable (which acts as a
258 HTTP server on a specific TCP/IP port), clients can connect to the
259 web service and thus control a VirtualBox installation.</para>
260 </listitem>
261
262 <listitem>
263 <para>VirtualBox also comes with WSDL files that describe the
264 services provided by the web service. You can find these files in
265 the <computeroutput>sdk/bindings/webservice/</computeroutput>
266 directory. These files are understood by the web service toolkits
267 that are shipped with most programming languages and enable you to
268 easily access a web service even if you don't use our
269 object-oriented client layers. VirtualBox is shipped with
270 pregenerated web service glue code for several languages (Python,
271 Perl, Java).</para>
272 </listitem>
273
274 <listitem>
275 <para>A client that connects to the web service in order to
276 control the VirtualBox installation.</para>
277
278 <para>Unless you play with some of the samples shipped with
279 VirtualBox, this needs to be written by you.</para>
280 </listitem>
281 </orderedlist></para>
282 </sect1>
283
284 <sect1 id="runvboxwebsrv">
285 <title>Running the web service</title>
286
287 <para>The web service ships in an stand-alone executable,
288 <computeroutput>vboxwebsrv</computeroutput>, that, when running, acts as
289 a HTTP server, accepts SOAP connections and processes them -- remotely
290 or from the same machine.<note>
291 <para>The web service executable is not contained with the
292 VirtualBox SDK, but instead ships with the standard VirtualBox
293 binary package for your specific platform. Since the SDK contains
294 only platform-independent text files and documentation, the binaries
295 are instead shipped with the platform-specific packages. For this
296 reason the information how to run it as a service is included in the
297 VirtualBox documentation.</para>
298 </note></para>
299
300 <para>The <computeroutput>vboxwebsrv</computeroutput> program, which
301 implements the web service, is a text-mode (console) program which,
302 after being started, simply runs until it is interrupted with Ctrl-C or
303 a kill command.</para>
304
305 <para>Once the web service is started, it acts as a front-end to the
306 VirtualBox installation of the user account that it is running under. In
307 other words, if the web service is run under the user account of
308 <computeroutput>user1</computeroutput>, it will see and manipulate the
309 virtual machines and other data represented by the VirtualBox data of
310 that user (for example, on a Linux machine, under
311 <computeroutput>/home/user1/.config/VirtualBox</computeroutput>; see the
312 VirtualBox User Manual for details on where this data is stored).</para>
313
314 <sect2 id="vboxwebsrv-ref">
315 <title>Command line options of vboxwebsrv</title>
316
317 <para>The web service supports the following command line
318 options:</para>
319
320 <itemizedlist>
321 <listitem>
322 <para><computeroutput>--help</computeroutput> (or
323 <computeroutput>-h</computeroutput>): print a brief summary of
324 command line options.</para>
325 </listitem>
326
327 <listitem>
328 <para><computeroutput>--background</computeroutput> (or
329 <computeroutput>-b</computeroutput>): run the web service as a
330 background daemon. This option is not supported on Windows
331 hosts.</para>
332 </listitem>
333
334 <listitem>
335 <para><computeroutput>--host</computeroutput> (or
336 <computeroutput>-H</computeroutput>): This specifies the host to
337 bind to and defaults to "localhost".</para>
338 </listitem>
339
340 <listitem>
341 <para><computeroutput>--port</computeroutput> (or
342 <computeroutput>-p</computeroutput>): This specifies which port to
343 bind to on the host and defaults to 18083.</para>
344 </listitem>
345
346 <listitem>
347 <para><computeroutput>--ssl</computeroutput> (or
348 <computeroutput>-s</computeroutput>): This enables SSL support.</para>
349 </listitem>
350
351 <listitem>
352 <para><computeroutput>--keyfile</computeroutput> (or
353 <computeroutput>-K</computeroutput>): This specifies the file name
354 containing the server private key and the certificate. This is a
355 mandatory parameter if SSL is enabled.</para>
356 </listitem>
357
358 <listitem>
359 <para><computeroutput>--passwordfile</computeroutput> (or
360 <computeroutput>-a</computeroutput>): This specifies the file name
361 containing the password for the server private key. If unspecified
362 or an empty string is specified this is interpreted as an empty
363 password (i.e. the private key is not protected by a password). If
364 the file name <computeroutput>-</computeroutput> is specified then
365 then the password is read from the standard input stream, otherwise
366 from the specified file. The user is responsible for appropriate
367 access rights to protect the confidential password.</para>
368 </listitem>
369
370 <listitem>
371 <para><computeroutput>--cacert</computeroutput> (or
372 <computeroutput>-c</computeroutput>): This specifies the file name
373 containing the CA certificate appropriate for the server
374 certificate.</para>
375 </listitem>
376
377 <listitem>
378 <para><computeroutput>--capath</computeroutput> (or
379 <computeroutput>-C</computeroutput>): This specifies the directory
380 containing several CA certificates appropriate for the server
381 certificate.</para>
382 </listitem>
383
384 <listitem>
385 <para><computeroutput>--dhfile</computeroutput> (or
386 <computeroutput>-D</computeroutput>): This specifies the file name
387 containing the DH key. Alternatively it can contain the number of
388 bits of the DH key to generate. If left empty, RSA is used.</para>
389 </listitem>
390
391 <listitem>
392 <para><computeroutput>--randfile</computeroutput> (or
393 <computeroutput>-r</computeroutput>): This specifies the file name
394 containing the seed for the random number generator. If left empty,
395 an operating system specific source of the seed.</para>
396 </listitem>
397
398 <listitem>
399 <para><computeroutput>--timeout</computeroutput> (or
400 <computeroutput>-t</computeroutput>): This specifies the session
401 timeout, in seconds, and defaults to 300 (five minutes). A web
402 service client that has logged on but makes no calls to the web
403 service will automatically be disconnected after the number of
404 seconds specified here, as if it had called the
405 <computeroutput>IWebSessionManager::logoff()</computeroutput>
406 method provided by the web service itself.</para>
407
408 <para>It is normally vital that each web service client call this
409 method, as the web service can accumulate large amounts of memory
410 when running, especially if a web service client does not properly
411 release managed object references. As a result, this timeout value
412 should not be set too high, especially on machines with a high
413 load on the web service, or the web service may eventually deny
414 service.</para>
415 </listitem>
416
417 <listitem>
418 <para><computeroutput>--check-interval</computeroutput> (or
419 <computeroutput>-i</computeroutput>): This specifies the interval
420 in which the web service checks for timed-out clients, in seconds,
421 and defaults to 5. This normally does not need to be
422 changed.</para>
423 </listitem>
424
425 <listitem>
426 <para><computeroutput>--threads</computeroutput> (or
427 <computeroutput>-T</computeroutput>): This specifies the maximum
428 number or worker threads, and defaults to 100. This normally does
429 not need to be changed.</para>
430 </listitem>
431
432 <listitem>
433 <para><computeroutput>--keepalive</computeroutput> (or
434 <computeroutput>-k</computeroutput>): This specifies the maximum
435 number of requests which can be sent in one web service connection,
436 and defaults to 100. This normally does not need to be changed.</para>
437 </listitem>
438
439 <listitem>
440 <para><computeroutput>--authentication</computeroutput> (or
441 <computeroutput>-A</computeroutput>): This specifies the desired
442 web service authentication method. If the parameter is not
443 specified or the empty string is specified it does not change the
444 authentication method, otherwise it is set to the specified value.
445 Using this parameter is a good measure against accidental
446 misconfiguration, as the web service ensures periodically that it
447 isn't changed.</para>
448 </listitem>
449
450 <listitem>
451 <para><computeroutput>--verbose</computeroutput> (or
452 <computeroutput>-v</computeroutput>): Normally, the web service
453 outputs only brief messages to the console each time a request is
454 served. With this option, the web service prints much more detailed
455 data about every request and the COM methods that those requests
456 are mapped to internally, which can be useful for debugging client
457 programs.</para>
458 </listitem>
459
460 <listitem>
461 <para><computeroutput>--pidfile</computeroutput> (or
462 <computeroutput>-P</computeroutput>): Name of the PID file which is
463 created when the daemon was started.</para>
464 </listitem>
465
466 <listitem>
467 <para><computeroutput>--logfile</computeroutput> (or
468 <computeroutput>-F</computeroutput>)
469 <computeroutput>&lt;file&gt;</computeroutput>: If this is
470 specified, the web service not only prints its output to the
471 console, but also writes it to the specified file. The file is
472 created if it does not exist; if it does exist, new output is
473 appended to it. This is useful if you run the web service
474 unattended and need to debug problems after they have
475 occurred.</para>
476 </listitem>
477
478 <listitem>
479 <para><computeroutput>--logrotate</computeroutput> (or
480 <computeroutput>-R</computeroutput>): Number of old log files to
481 keep, defaults to 10. Log rotation is disabled if set to 0.</para>
482 </listitem>
483
484 <listitem>
485 <para><computeroutput>--logsize</computeroutput> (or
486 <computeroutput>-S</computeroutput>): Maximum size of log file in
487 bytes, defaults to 100MB. Log rotation is triggered if the file
488 grows beyond this limit.</para>
489 </listitem>
490
491 <listitem>
492 <para><computeroutput>--loginterval</computeroutput> (or
493 <computeroutput>-I</computeroutput>): Maximum time interval to be
494 put in a log file before rotation is triggered, in seconds, and
495 defaults to one day.</para>
496 </listitem>
497 </itemizedlist>
498 </sect2>
499
500 <sect2 id="websrv_authenticate">
501 <title>Authenticating at web service logon</title>
502
503 <para>As opposed to the COM/XPCOM variant of the Main API, a client
504 that wants to use the web service must first log on by calling the
505 <computeroutput>IWebsessionManager::logon()</computeroutput> API (see
506 <xref linkend="IWebsessionManager__logon" />) that is specific to the
507 web service. Logon is necessary for the web service to be stateful;
508 internally, it maintains a session for each client that connects to
509 it.</para>
510
511 <para>The <computeroutput>IWebsessionManager::logon()</computeroutput>
512 API takes a user name and a password as arguments, which the web
513 service then passes to a customizable authentication plugin that
514 performs the actual authentication.</para>
515
516 <para>For testing purposes, it is recommended that you first disable
517 authentication with this command:<screen>VBoxManage setproperty websrvauthlibrary null</screen></para>
518
519 <para><warning>
520 <para>This will cause all logons to succeed, regardless of user
521 name or password. This should of course not be used in a
522 production environment.</para>
523 </warning>Generally, the mechanism by which clients are
524 authenticated is configurable by way of the
525 <computeroutput>VBoxManage</computeroutput> command:</para>
526
527 <para><screen>VBoxManage setproperty websrvauthlibrary default|null|&lt;library&gt;</screen></para>
528
529 <para>This way you can specify any shared object/dynamic link module
530 that conforms with the specifications for VirtualBox external
531 authentication modules as laid out in section <emphasis
532 role="bold">VRDE authentication</emphasis> of the VirtualBox User
533 Manual; the web service uses the same kind of modules as the
534 VirtualBox VRDE server. For technical details on VirtualBox external
535 authentication modules see <xref linkend="vbox-auth" /></para>
536
537 <para>By default, after installation, the web service uses the
538 VBoxAuth module that ships with VirtualBox. This module uses PAM on
539 Linux hosts to authenticate users. Any valid username/password
540 combination is accepted, it does not have to be the username and
541 password of the user running the web service daemon. Unless
542 <computeroutput>vboxwebsrv</computeroutput> runs as root, PAM
543 authentication can fail, because sometimes the file
544 <computeroutput>/etc/shadow</computeroutput>, which is used by PAM, is
545 not readable. On most Linux distribution PAM uses a suid root helper
546 internally, so make sure you test this before deploying it. One can
547 override this behavior by setting the environment variable
548 <computeroutput>VBOX_PAM_ALLOW_INACTIVE</computeroutput> which will
549 suppress failures when unable to read the shadow password file. Please
550 use this variable carefully, and only if you fully understand what
551 you're doing.</para>
552 </sect2>
553 </sect1>
554 </chapter>
555
556 <chapter>
557 <title>Environment-specific notes</title>
558
559 <para>The Main API described in <xref linkend="sdkref_classes" /> and
560 <xref linkend="sdkref_enums" /> is mostly identical in all the supported
561 programming environments which have been briefly mentioned in the
562 introduction of this book. As a result, the Main API's general concepts
563 described in <xref linkend="concepts" /> are the same whether you use the
564 object-oriented web service (OOWS) for JAX-WS or a raw web service
565 connection via, say, Perl, or whether you use C++ COM bindings.</para>
566
567 <para>Some things are different depending on your environment, however.
568 These differences are explained in this chapter.</para>
569
570 <sect1 id="glue">
571 <title>Using the object-oriented web service (OOWS)</title>
572
573 <para>As explained in <xref linkend="webservice-or-com" />, VirtualBox
574 ships with client-side libraries for Java, Python and PHP that allow you
575 to use the VirtualBox web service in an intuitive, object-oriented way.
576 These libraries shield you from the client-side complications of managed
577 object references and other implementation details that come with the
578 VirtualBox web service. (If you are interested in these complications,
579 have a look at <xref linkend="raw-webservice" />).</para>
580
581 <para>We recommend that you start your experiments with the VirtualBox
582 web service by using our object-oriented client libraries for JAX-WS, a
583 web service toolkit for Java, which enables you to write code to
584 interact with VirtualBox in the simplest manner possible.</para>
585
586 <para>As "interfaces", "attributes" and "methods" are COM concepts,
587 please read the documentation in <xref linkend="sdkref_classes" /> and
588 <xref linkend="sdkref_enums" /> with the following notes in mind.</para>
589
590 <para>The OOWS bindings attempt to map the Main API as closely as
591 possible to the Java, Python and PHP languages. In other words, objects
592 are objects, interfaces become classes, and you can call methods on
593 objects as you would on local objects.</para>
594
595 <para>The main difference remains with attributes: to read an attribute,
596 call a "getXXX" method, with "XXX" being the attribute name with a
597 capitalized first letter. So when the Main API Reference says that
598 <computeroutput>IMachine</computeroutput> has a "name" attribute (see
599 <xref linkend="IMachine__name" xreflabel="IMachine::name" />), call
600 <computeroutput>getName()</computeroutput> on an IMachine object to
601 obtain a machine's name. Unless the attribute is marked as read-only in
602 the documentation, there will also be a corresponding "set"
603 method.</para>
604
605 <sect2 id="glue-jax-ws">
606 <title>The object-oriented web service for JAX-WS</title>
607
608 <para>JAX-WS is a powerful toolkit by Sun Microsystems to build both
609 server and client code with Java. It is part of Java 6 (JDK 1.6), but
610 can also be obtained separately for Java 5 (JDK 1.5). The VirtualBox
611 SDK comes with precompiled OOWS bindings working with both Java 5 and
612 6.</para>
613
614 <para>The following sections explain how to get the JAX-WS sample code
615 running and explain a few common practices when using the JAX-WS
616 object-oriented web service.</para>
617
618 <sect3>
619 <title>Preparations</title>
620
621 <para>Since JAX-WS is already integrated into Java 6, no additional
622 preparations are needed for Java 6.</para>
623
624 <para>If you are using Java 5 (JDK 1.5.x), you will first need to
625 download and install an external JAX-WS implementation, as Java 5
626 does not support JAX-WS out of the box; for example, you can
627 download one from here: <ulink
628 url="https://jax-ws.dev.java.net/2.1.4/JAXWS2.1.4-20080502.jar">https://jax-ws.dev.java.net/2.1.4/JAXWS2.1.4-20080502.jar</ulink>.
629 Then perform the installation (<computeroutput>java -jar
630 JAXWS2.1.4-20080502.jar</computeroutput>).</para>
631 </sect3>
632
633 <sect3>
634 <title>Getting started: running the sample code</title>
635
636 <para>To run the OOWS for JAX-WS samples that we ship with the SDK,
637 perform the following steps: <orderedlist>
638 <listitem>
639 <para>Open a terminal and change to the directory where the
640 JAX-WS samples reside.<footnote>
641 <para>In
642 <computeroutput>sdk/bindings/glue/java/</computeroutput>.</para>
643 </footnote> Examine the header of
644 <computeroutput>Makefile</computeroutput> to see if the
645 supplied variables (Java compiler, Java executable) and a few
646 other details match your system settings.</para>
647 </listitem>
648
649 <listitem>
650 <para>To start the VirtualBox web service, open a second
651 terminal and change to the directory where the VirtualBox
652 executables are located. Then type:<screen>./vboxwebsrv -v</screen></para>
653
654 <para>The web service now waits for connections and will run
655 until you press Ctrl+C in this second terminal. The -v
656 argument causes it to log all connections to the terminal.
657 (See <xref linkend="runvboxwebsrv" os="" /> for details on how
658 to run the web service.)</para>
659 </listitem>
660
661 <listitem>
662 <para>Back in the first terminal and still in the samples
663 directory, to start a simple client example just type:<screen>make run16</screen></para>
664
665 <para>if you're on a Java 6 system; on a Java 5 system, run
666 <computeroutput>make run15</computeroutput> instead.</para>
667
668 <para>This should work on all Unix-like systems such as Linux
669 and Solaris. For Windows systems, use commands similar to what
670 is used in the Makefile.</para>
671
672 <para>This will compile the
673 <computeroutput>clienttest.java</computeroutput> code on the
674 first call and then execute the resulting
675 <computeroutput>clienttest</computeroutput> class to show the
676 locally installed VMs (see below).</para>
677 </listitem>
678 </orderedlist></para>
679
680 <para>The <computeroutput>clienttest</computeroutput> sample
681 imitates a few typical command line tasks that
682 <computeroutput>VBoxManage</computeroutput>, VirtualBox's regular
683 command-line front-end, would provide (see the VirtualBox User
684 Manual for details). In particular, you can run:<itemizedlist>
685 <listitem>
686 <para><computeroutput>java clienttest show
687 vms</computeroutput>: show the virtual machines that are
688 registered locally.</para>
689 </listitem>
690
691 <listitem>
692 <para><computeroutput>java clienttest list
693 hostinfo</computeroutput>: show various information about the
694 host this VirtualBox installation runs on.</para>
695 </listitem>
696
697 <listitem>
698 <para><computeroutput>java clienttest startvm
699 &lt;vmname|uuid&gt;</computeroutput>: start the given virtual
700 machine.</para>
701 </listitem>
702 </itemizedlist></para>
703
704 <para>The <computeroutput>clienttest.java</computeroutput> sample
705 code illustrates common basic practices how to use the VirtualBox
706 OOWS for JAX-WS, which we will explain in more detail in the
707 following chapters.</para>
708 </sect3>
709
710 <sect3>
711 <title>Logging on to the web service</title>
712
713 <para>Before a web service client can do anything useful, two
714 objects need to be created, as can be seen in the
715 <computeroutput>clienttest</computeroutput> constructor:<orderedlist>
716 <listitem>
717 <para>An instance of <xref linkend="IWebsessionManager"
718 xreflabel="IWebsessionManager" />, which is an interface
719 provided by the web service to manage "web sessions" -- that
720 is, stateful connections to the web service with persistent
721 objects upon which methods can be invoked.</para>
722
723 <para>In the OOWS for JAX-WS, the IWebsessionManager class
724 must be constructed explicitly, and a URL must be provided in
725 the constructor that specifies where the web service (the
726 server) awaits connections. The code in
727 <computeroutput>clienttest.java</computeroutput> connects to
728 "http://localhost:18083/", which is the default.</para>
729
730 <para>The port number, by default 18083, must match the port
731 number given to the
732 <computeroutput>vboxwebsrv</computeroutput> command line; see
733 <xref linkend="vboxwebsrv-ref" />.</para>
734 </listitem>
735
736 <listitem>
737 <para>After that, the code calls <xref
738 linkend="IWebsessionManager__logon"
739 xreflabel="IWebsessionManager::logon()" />, which is the first
740 call that actually communicates with the server. This
741 authenticates the client with the web service and returns an
742 instance of <xref linkend="IVirtualBox"
743 xreflabel="IVirtualBox" />, the most fundamental interface of
744 the VirtualBox web service, from which all other functionality
745 can be derived.</para>
746
747 <para>If logon doesn't work, please take another look at <xref
748 linkend="websrv_authenticate" />.</para>
749 </listitem>
750 </orderedlist></para>
751 </sect3>
752
753 <sect3>
754 <title>Object management</title>
755
756 <para>The current OOWS for JAX-WS has certain memory management
757 related limitations. When you no longer need an object, call its
758 <xref linkend="IManagedObjectRef__release"
759 xreflabel="IManagedObjectRef::release()" /> method explicitly, which
760 frees appropriate managed reference, as is required by the raw
761 web service; see <xref linkend="managed-object-references" /> for
762 details. This limitation may be reconsidered in a future version of
763 the VirtualBox SDK.</para>
764 </sect3>
765 </sect2>
766
767 <sect2 id="glue-python-ws">
768 <title>The object-oriented web service for Python</title>
769
770 <para>VirtualBox comes with two flavors of a Python API: one for web
771 service, discussed here, and one for the COM/XPCOM API discussed in
772 <xref linkend="pycom" />. The client code is mostly similar, except
773 for the initialization part, so it is up to the application developer
774 to choose the appropriate technology. Moreover, a common Python glue
775 layer exists, abstracting out concrete platform access details, see
776 <xref linkend="glue-python" />.</para>
777
778 <para>As indicated in <xref linkend="webservice-or-com" />, the
779 COM/XPCOM API gives better performance without the SOAP overhead, and
780 does not require a web server to be running. On the other hand, the
781 COM/XPCOM Python API requires a suitable Python bridge for your Python
782 installation (VirtualBox ships the most important ones for each
783 platform<footnote>
784 <para>On On Mac OS X only the Python versions bundled with the OS
785 are officially supported. This means Python 2.3 for 10.4, Python
786 2.5 for 10.5 and Python 2.5 and 2.6 for 10.6.</para>
787 </footnote>). On Windows, you can use the Main API from Python if the Win32 extensions
788 package for Python<footnote>
789 <para>See <ulink
790 url="http://sourceforge.net/project/showfiles.php?group_id=78018">http://sourceforge.net/project/showfiles.php?group_id=78018</ulink>.</para>
791 </footnote> is installed. Version of Python Win32 extensions earlier than 2.16 are known to have bugs,
792 leading to issues with VirtualBox Python bindings, and also some early builds of Python 2.5 for Windows have issues with
793 reporting platform name on some Windows versions, so please make sure to use latest available Python
794 and Win32 extensions.</para>
795
796 <para>The VirtualBox OOWS for Python relies on the Python ZSI SOAP
797 implementation (see <ulink
798 url="http://pywebsvcs.sourceforge.net/zsi.html">http://pywebsvcs.sourceforge.net/zsi.html</ulink>),
799 which you will need to install locally before trying the examples.
800 Most Linux distributions come with package for ZSI, such as
801 <computeroutput>python-zsi</computeroutput> in Ubuntu.</para>
802
803 <para>To get started, open a terminal and change to the
804 <computeroutput>bindings/glue/python/sample</computeroutput>
805 directory, which contains an example of a simple interactive shell
806 able to control a VirtualBox instance. The shell is written using the
807 API layer, thereby hiding different implementation details, so it is
808 actually an example of code share among XPCOM, MSCOM and web services.
809 If you are interested in how to interact with the web services layer
810 directly, have a look at
811 <computeroutput>install/vboxapi/__init__.py</computeroutput> which
812 contains the glue layer for all target platforms (i.e. XPCOM, MSCOM
813 and web services).</para>
814
815 <para>To start the shell, perform the following commands: <screen>/opt/VirtualBox/vboxwebsrv -t 0
816 # start web service with object autocollection disabled
817export VBOX_PROGRAM_PATH=/opt/VirtualBox
818 # your VirtualBox installation directory
819export VBOX_SDK_PATH=/home/youruser/vbox-sdk
820 # where you've extracted the SDK
821./vboxshell.py -w </screen>See <xref linkend="vboxshell" /> for more
822 details on the shell's functionality. For you, as a VirtualBox
823 application developer, the vboxshell sample could be interesting as an
824 example of how to write code targeting both local and remote cases
825 (COM/XPCOM and SOAP). The common part of the shell is the same -- the
826 only difference is how it interacts with the invocation layer. You can
827 use the <computeroutput>connect</computeroutput> shell command to
828 connect to remote VirtualBox servers; in this case you can skip
829 starting the local web server.</para>
830 </sect2>
831
832 <sect2>
833 <title>The object-oriented web service for PHP</title>
834
835 <para>VirtualBox also comes with object-oriented web service (OOWS)
836 wrappers for PHP5. These wrappers rely on the PHP SOAP
837 Extension<footnote>
838 <para>See <ulink url="???">http://www.php.net/soap</ulink>.</para>
839 </footnote>, which can be installed by configuring PHP with
840 <computeroutput>--enable-soap</computeroutput>.</para>
841 </sect2>
842 </sect1>
843
844 <sect1 id="raw-webservice">
845 <title>Using the raw web service with any language</title>
846
847 <para>The following examples show you how to use the raw web service,
848 without the object-oriented client-side code that was described in the
849 previous chapter.</para>
850
851 <para>Generally, when reading the documentation in <xref
852 linkend="sdkref_classes" /> and <xref linkend="sdkref_enums" />, due to
853 the limitations of SOAP and WSDL lined out in <xref
854 linkend="rawws-conventions" />, please have the following notes in
855 mind:</para>
856
857 <para><orderedlist>
858 <listitem>
859 <para>Any COM method call becomes a <emphasis role="bold">plain
860 function call</emphasis> in the raw web service, with the object
861 as an additional first parameter (before the "real" parameters
862 listed in the documentation). So when the documentation says that
863 the <computeroutput>IVirtualBox</computeroutput> interface
864 supports the <computeroutput>createMachine()</computeroutput>
865 method (see <xref linkend="IVirtualBox__createMachine"
866 xreflabel="IVirtualBox::createMachine()" />), the web service
867 operation is
868 <computeroutput>IVirtualBox_createMachine(...)</computeroutput>,
869 and a managed object reference to an
870 <computeroutput>IVirtualBox</computeroutput> object must be passed
871 as the first argument.</para>
872 </listitem>
873
874 <listitem>
875 <para>For <emphasis role="bold">attributes</emphasis> in
876 interfaces, there will be at least one "get" function; there will
877 also be a "set" function, unless the attribute is "readonly". The
878 attribute name will be appended to the "get" or "set" prefix, with
879 a capitalized first letter. So, the "version" readonly attribute
880 of the <computeroutput>IVirtualBox</computeroutput> interface can
881 be retrieved by calling
882 <computeroutput>IVirtualBox_getVersion(vbox)</computeroutput>,
883 with <computeroutput>vbox</computeroutput> being the VirtualBox
884 object.</para>
885 </listitem>
886
887 <listitem>
888 <para>Whenever the API documentation says that a method (or an
889 attribute getter) returns an <emphasis
890 role="bold">object</emphasis>, it will returned a managed object
891 reference in the web service instead. As said above, managed
892 object references should be released if the web service client
893 does not log off again immediately!</para>
894 </listitem>
895 </orderedlist></para>
896
897 <para></para>
898
899 <sect2 id="webservice-java-sample">
900 <title>Raw web service example for Java with Axis</title>
901
902 <para>Axis is an older web service toolkit created by the Apache
903 foundation. If your distribution does not have it installed, you can
904 get a binary from <ulink
905 url="http://www.apache.org">http://www.apache.org</ulink>. The
906 following examples assume that you have Axis 1.4 installed.</para>
907
908 <para>The VirtualBox SDK ships with an example for Axis that, again,
909 is called <computeroutput>clienttest.java</computeroutput> and that
910 imitates a few of the commands of
911 <computeroutput>VBoxManage</computeroutput> over the wire.</para>
912
913 <para>Then perform the following steps:<orderedlist>
914 <listitem>
915 <para>Create a working directory somewhere. Under your
916 VirtualBox installation directory, find the
917 <computeroutput>sdk/webservice/samples/java/axis/</computeroutput>
918 directory and copy the file
919 <computeroutput>clienttest.java</computeroutput> to your working
920 directory.</para>
921 </listitem>
922
923 <listitem>
924 <para>Open a terminal in your working directory. Execute the
925 following command:<screen> java org.apache.axis.wsdl.WSDL2Java /path/to/vboxwebService.wsdl</screen></para>
926
927 <para>The <computeroutput>vboxwebService.wsdl</computeroutput>
928 file should be located in the
929 <computeroutput>sdk/webservice/</computeroutput>
930 directory.</para>
931
932 <para>If this fails, your Apache Axis may not be located on your
933 system classpath, and you may have to adjust the CLASSPATH
934 environment variable. Something like this:<screen>export CLASSPATH="/path-to-axis-1_4/lib/*":$CLASSPATH</screen></para>
935
936 <para>Use the directory where the Axis JAR files are located.
937 Mind the quotes so that your shell passes the "*" character to
938 the java executable without expanding. Alternatively, add a
939 corresponding <computeroutput>-classpath</computeroutput>
940 argument to the "java" call above.</para>
941
942 <para>If the command executes successfully, you should see an
943 "org" directory with subdirectories containing Java source files
944 in your working directory. These classes represent the
945 interfaces that the VirtualBox web service offers, as described
946 by the WSDL file.</para>
947
948 <para>This is the bit that makes using web services so
949 attractive to client developers: if a language's toolkit
950 understands WSDL, it can generate large amounts of support code
951 automatically. Clients can then easily use this support code and
952 can be done with just a few lines of code.</para>
953 </listitem>
954
955 <listitem>
956 <para>Next, compile the
957 <computeroutput>clienttest.java</computeroutput> source:<screen>javac clienttest.java </screen></para>
958
959 <para>This should yield a "clienttest.class" file.</para>
960 </listitem>
961
962 <listitem>
963 <para>To start the VirtualBox web service, open a second
964 terminal and change to the directory where the VirtualBox
965 executables are located. Then type:<screen>./vboxwebsrv -v</screen></para>
966
967 <para>The web service now waits for connections and will run
968 until you press Ctrl+C in this second terminal. The -v argument
969 causes it to log all connections to the terminal. (See <xref
970 linkend="runvboxwebsrv" os="" /> for details on how to run the
971 web service.)</para>
972 </listitem>
973
974 <listitem>
975 <para>Back in the original terminal where you compiled the Java
976 source, run the resulting binary, which will then connect to the
977 web service:<screen>java clienttest</screen></para>
978
979 <para>The client sample will connect to the web service (on
980 localhost, but the code could be changed to connect remotely if
981 the web service was running on a different machine) and make a
982 number of method calls. It will output the version number of
983 your VirtualBox installation and a list of all virtual machines
984 that are currently registered (with a bit of seemingly random
985 data, which will be explained later).</para>
986 </listitem>
987 </orderedlist></para>
988 </sect2>
989
990 <sect2 id="raw-webservice-perl">
991 <title>Raw web service example for Perl</title>
992
993 <para>We also ship a small sample for Perl. It uses the SOAP::Lite
994 perl module to communicate with the VirtualBox web service.</para>
995
996 <para>The
997 <computeroutput>sdk/bindings/webservice/perl/lib/</computeroutput>
998 directory contains a pre-generated Perl module that allows for
999 communicating with the web service from Perl. You can generate such a
1000 module yourself using the "stubmaker" tool that comes with SOAP::Lite,
1001 but since that tool is slow as well as sometimes unreliable, we are
1002 shipping a working module with the SDK for your convenience.</para>
1003
1004 <para>Perform the following steps:<orderedlist>
1005 <listitem>
1006 <para>If SOAP::Lite is not yet installed on your system, you
1007 will need to install the package first. On Debian-based systems,
1008 the package is called
1009 <computeroutput>libsoap-lite-perl</computeroutput>; on Gentoo,
1010 it's <computeroutput>dev-perl/SOAP-Lite</computeroutput>.</para>
1011 </listitem>
1012
1013 <listitem>
1014 <para>Open a terminal in the
1015 <computeroutput>sdk/bindings/webservice/perl/samples/</computeroutput>
1016 directory.</para>
1017 </listitem>
1018
1019 <listitem>
1020 <para>To start the VirtualBox web service, open a second
1021 terminal and change to the directory where the VirtualBox
1022 executables are located. Then type:<screen>./vboxwebsrv -v</screen></para>
1023
1024 <para>The web service now waits for connections and will run
1025 until you press Ctrl+C in this second terminal. The -v argument
1026 causes it to log all connections to the terminal. (See <xref
1027 linkend="runvboxwebsrv" os="" /> for details on how to run the
1028 web service.)</para>
1029 </listitem>
1030
1031 <listitem>
1032 <para>In the first terminal with the Perl sample, run the
1033 clienttest.pl script:<screen>perl -I ../lib clienttest.pl</screen></para>
1034 </listitem>
1035 </orderedlist></para>
1036 </sect2>
1037
1038 <sect2>
1039 <title>Programming considerations for the raw web service</title>
1040
1041 <para>If you use the raw web service, you need to keep a number of
1042 things in mind, or you will sooner or later run into issues that are
1043 not immediately obvious. By contrast, the object-oriented client-side
1044 libraries described in <xref linkend="glue" /> take care of these
1045 things automatically and thus greatly simplify using the web
1046 service.</para>
1047
1048 <sect3 id="rawws-conventions">
1049 <title>Fundamental conventions</title>
1050
1051 <para>If you are familiar with other web services, you may find the
1052 VirtualBox web service to behave a bit differently to accommodate
1053 for the fact that VirtualBox web service more or less maps the
1054 VirtualBox Main COM API. The following main differences had to be
1055 taken care of:<itemizedlist>
1056 <listitem>
1057 <para>Web services, as expressed by WSDL, are not
1058 object-oriented. Even worse, they are normally stateless (or,
1059 in web services terminology, "loosely coupled"). Web service
1060 operations are entirely procedural, and one cannot normally
1061 make assumptions about the state of a web service between
1062 function calls.</para>
1063
1064 <para>In particular, this normally means that you cannot work
1065 on objects in one method call that were created by another
1066 call.</para>
1067 </listitem>
1068
1069 <listitem>
1070 <para>By contrast, the VirtualBox Main API, being expressed in
1071 COM, is object-oriented and works entirely on objects, which
1072 are grouped into public interfaces, which in turn have
1073 attributes and methods associated with them.</para>
1074 </listitem>
1075 </itemizedlist> For the VirtualBox web service, this results in
1076 three fundamental conventions:<orderedlist>
1077 <listitem>
1078 <para>All <emphasis role="bold">function names</emphasis> in
1079 the VirtualBox web service consist of an interface name and a
1080 method name, joined together by an underscore. This is because
1081 there are only functions ("operations") in WSDL, but no
1082 classes, interfaces, or methods.</para>
1083
1084 <para>In addition, all calls to the VirtualBox web service
1085 (except for logon, see below) take a <emphasis
1086 role="bold">managed object reference</emphasis> as the first
1087 argument, representing the object upon which the underlying
1088 method is invoked. (Managed object references are explained in
1089 detail below; see <xref
1090 linkend="managed-object-references" />.)</para>
1091
1092 <para>So, when one would normally code, in the pseudo-code of
1093 an object-oriented language, to invoke a method upon an
1094 object:<screen>IMachine machine;
1095result = machine.getName();</screen></para>
1096
1097 <para>In the VirtualBox web service, this looks something like
1098 this (again, pseudo-code):<screen>IMachineRef machine;
1099result = IMachine_getName(machine);</screen></para>
1100 </listitem>
1101
1102 <listitem>
1103 <para>To make the web service stateful, and objects persistent
1104 between method calls, the VirtualBox web service introduces a
1105 <emphasis role="bold">session manager</emphasis> (by way of
1106 the <xref linkend="IWebsessionManager"
1107 xreflabel="IWebsessionManager" /> interface), which manages
1108 object references. Any client wishing to interact with the web
1109 service must first log on to the session manager and in turn
1110 receives a managed object reference to an object that supports
1111 the <xref linkend="IVirtualBox" xreflabel="IVirtualBox" />
1112 interface (the basic interface in the Main API).</para>
1113 </listitem>
1114 </orderedlist></para>
1115
1116 <para>In other words, as opposed to other web services, <emphasis
1117 role="bold">the VirtualBox web service is both object-oriented and
1118 stateful.</emphasis></para>
1119 </sect3>
1120
1121 <sect3>
1122 <title>Example: A typical web service client session</title>
1123
1124 <para>A typical short web service session to retrieve the version
1125 number of the VirtualBox web service (to be precise, the underlying
1126 Main API version number) looks like this:<orderedlist>
1127 <listitem>
1128 <para>A client logs on to the web service by calling <xref
1129 linkend="IWebsessionManager__logon"
1130 xreflabel="IWebsessionManager::logon()" /> with a valid user
1131 name and password. See <xref linkend="websrv_authenticate" />
1132 for details about how authentication works.</para>
1133 </listitem>
1134
1135 <listitem>
1136 <para>On the server side,
1137 <computeroutput>vboxwebsrv</computeroutput> creates a session,
1138 which persists until the client calls <xref
1139 linkend="IWebsessionManager__logoff"
1140 xreflabel="IWebsessionManager::logoff()" /> or the session
1141 times out after a configurable period of inactivity (see <xref
1142 linkend="vboxwebsrv-ref" />).</para>
1143
1144 <para>For the new session, the web service creates an instance
1145 of <xref linkend="IVirtualBox" xreflabel="IVirtualBox" />.
1146 This interface is the most central one in the Main API and
1147 allows access to all other interfaces, either through
1148 attributes or method calls. For example, IVirtualBox contains
1149 a list of all virtual machines that are currently registered
1150 (as they would be listed on the left side of the VirtualBox
1151 main program).</para>
1152
1153 <para>The web service then creates a managed object reference
1154 for this instance of IVirtualBox and returns it to the calling
1155 client, which receives it as the return value of the logon
1156 call. Something like this:</para>
1157
1158 <screen>string oVirtualBox;
1159oVirtualBox = webservice.IWebsessionManager_logon("user", "pass");</screen>
1160
1161 <para>(The managed object reference "oVirtualBox" is just a
1162 string consisting of digits and dashes. However, it is a
1163 string with a meaning and will be checked by the web service.
1164 For details, see below. As hinted above, <xref
1165 linkend="IWebsessionManager__logon"
1166 xreflabel="IWebsessionManager::logon()" /> is the
1167 <emphasis>only</emphasis> operation provided by the web
1168 service which does not take a managed object reference as the
1169 first argument!)</para>
1170 </listitem>
1171
1172 <listitem>
1173 <para>The VirtualBox Main API documentation says that the
1174 <computeroutput>IVirtualBox</computeroutput> interface has a
1175 <xref linkend="IVirtualBox__version" xreflabel="version" />
1176 attribute, which is a string. For each attribute, there is a
1177 "get" and a "set" method in COM, which maps to according
1178 operations in the web service. So, to retrieve the "version"
1179 attribute of this <computeroutput>IVirtualBox</computeroutput>
1180 object, the web service client does this:<screen>string version;
1181version = webservice.IVirtualBox_getVersion(oVirtualBox);
1182
1183print version;</screen></para>
1184
1185 <para>And it will print
1186 "$VBOX_VERSION_MAJOR.$VBOX_VERSION_MINOR.$VBOX_VERSION_BUILD".</para>
1187 </listitem>
1188
1189 <listitem>
1190 <para>The web service client calls <xref
1191 linkend="IWebsessionManager__logoff"
1192 xreflabel="IWebsessionManager::logoff()" /> with the
1193 VirtualBox managed object reference. This will clean up all
1194 allocated resources.</para>
1195 </listitem>
1196 </orderedlist></para>
1197 </sect3>
1198
1199 <sect3 id="managed-object-references">
1200 <title>Managed object references</title>
1201
1202 <para>To a web service client, a managed object reference looks like
1203 a string: two 64-bit hex numbers separated by a dash. This string,
1204 however, represents a COM object that "lives" in the web service
1205 process. The two 64-bit numbers encoded in the managed object
1206 reference represent a session ID (which is the same for all objects
1207 in the same web service session, i.e. for all objects after one
1208 logon) and a unique object ID within that session.</para>
1209
1210 <para>Managed object references are created in two
1211 situations:<orderedlist>
1212 <listitem>
1213 <para>When a client logs on, by calling <xref
1214 linkend="IWebsessionManager__logon"
1215 xreflabel="IWebsessionManager::logon()" />.</para>
1216
1217 <para>Upon logon, the websession manager creates one instance
1218 of <xref linkend="IVirtualBox" xreflabel="IVirtualBox" /> and
1219 another object of <xref linkend="ISession"
1220 xreflabel="ISession" /> representing the web service session.
1221 This can be retrieved using <xref
1222 linkend="IWebsessionManager__getSessionObject"
1223 xreflabel="IWebsessionManager::getSessionObject()" />.</para>
1224
1225 <para>(Technically, there is always only one <xref
1226 linkend="IVirtualBox" xreflabel="IVirtualBox" /> object, which
1227 is shared between all sessions and clients, as it is a COM
1228 singleton. However, each session receives its own managed
1229 object reference to it. The <xref linkend="ISession"
1230 xreflabel="ISession" /> object, however, is created and
1231 destroyed for each session.)</para>
1232 </listitem>
1233
1234 <listitem>
1235 <para>Whenever a web service clients invokes an operation
1236 whose COM implementation creates COM objects.</para>
1237
1238 <para>For example, <xref linkend="IVirtualBox__createMachine"
1239 xreflabel="IVirtualBox::createMachine()" /> creates a new
1240 instance of <xref linkend="IMachine" xreflabel="IMachine" />;
1241 the COM object returned by the COM method call is then wrapped
1242 into a managed object reference by the web server, and this
1243 reference is returned to the web service client.</para>
1244 </listitem>
1245 </orderedlist></para>
1246
1247 <para>Internally, in the web service process, each managed object
1248 reference is simply a small data structure, containing a COM pointer
1249 to the "real" COM object, the web session ID and the object ID. This
1250 structure is allocated on creation and stored efficiently in hashes,
1251 so that the web service can look up the COM object quickly whenever
1252 a web service client wishes to make a method call. The random
1253 session ID also ensures that one web service client cannot intercept
1254 the objects of another.</para>
1255
1256 <para>Managed object references are not destroyed automatically and
1257 must be released by explicitly calling <xref
1258 linkend="IManagedObjectRef__release"
1259 xreflabel="IManagedObjectRef::release()" />. This is important, as
1260 otherwise hundreds or thousands of managed object references (and
1261 corresponding COM objects, which can consume much more memory!) can
1262 pile up in the web service process and eventually cause it to deny
1263 service.</para>
1264
1265 <para>To reiterate: The underlying COM object, which the reference
1266 points to, is only freed if the managed object reference is
1267 released. It is therefore vital that web service clients properly
1268 clean up after the managed object references that are returned to
1269 them.</para>
1270
1271 <para>When a web service client calls <xref
1272 linkend="IWebsessionManager__logoff"
1273 xreflabel="IWebsessionManager::logoff()" />, all managed object
1274 references created during the session are automatically freed. For
1275 short-lived sessions that do not create a lot of objects, logging
1276 off may therefore be sufficient, although it is certainly not "best
1277 practice".</para>
1278 </sect3>
1279
1280 <sect3>
1281 <title>Some more detail about web service operation</title>
1282
1283 <sect4 id="soap">
1284 <title>SOAP messages</title>
1285
1286 <para>Whenever a client makes a call to a web service, this
1287 involves a complicated procedure internally. These calls are
1288 remote procedure calls. Each such procedure call typically
1289 consists of two "message" being passed, where each message is a
1290 plain-text HTTP request with a standard HTTP header and a special
1291 XML document following. This XML document encodes the name of the
1292 procedure to call and the argument names and values passed to
1293 it.</para>
1294
1295 <para>To give you an idea of what such a message looks like,
1296 assuming that a web service provides a procedure called
1297 "SayHello", which takes a string "name" as an argument and returns
1298 "Hello" with a space and that name appended, the request message
1299 could look like this:</para>
1300
1301 <para><screen>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
1302&lt;SOAP-ENV:Envelope
1303 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
1304 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
1305 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
1306 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
1307 xmlns:test="http://test/"&gt;
1308&lt;SOAP-ENV:Body&gt;
1309 &lt;test:SayHello&gt;
1310 &lt;name&gt;Peter&lt;/name&gt;
1311 &lt;/test:SayHello&gt;
1312 &lt;/SOAP-ENV:Body&gt;
1313&lt;/SOAP-ENV:Envelope&gt;</screen>A similar message -- the "response" message
1314 -- would be sent back from the web service to the client,
1315 containing the return value "Hello Peter".</para>
1316
1317 <para>Most programming languages provide automatic support to
1318 generate such messages whenever code in that programming language
1319 makes such a request. In other words, these programming languages
1320 allow for writing something like this (in pseudo-C++ code):</para>
1321
1322 <para><screen>webServiceClass service("localhost", 18083); // server and port
1323string result = service.SayHello("Peter"); // invoke remote procedure</screen>and
1324 would, for these two pseudo-lines, automatically perform these
1325 steps:</para>
1326
1327 <para><orderedlist>
1328 <listitem>
1329 <para>prepare a connection to a web service running on port
1330 18083 of "localhost";</para>
1331 </listitem>
1332
1333 <listitem>
1334 <para>for the <computeroutput>SayHello()</computeroutput>
1335 function of the web service, generate a SOAP message like in
1336 the above example by encoding all arguments of the remote
1337 procedure call (which could involve all kinds of type
1338 conversions and complex marshalling for arrays and
1339 structures);</para>
1340 </listitem>
1341
1342 <listitem>
1343 <para>connect to the web service via HTTP and send that
1344 message;</para>
1345 </listitem>
1346
1347 <listitem>
1348 <para>wait for the web service to send a response
1349 message;</para>
1350 </listitem>
1351
1352 <listitem>
1353 <para>decode that response message and put the return value
1354 of the remote procedure into the "result" variable.</para>
1355 </listitem>
1356 </orderedlist></para>
1357 </sect4>
1358
1359 <sect4 id="wsdl">
1360 <title>Service descriptions in WSDL</title>
1361
1362 <para>In the above explanations about SOAP, it was left open how
1363 the programming language learns about how to translate function
1364 calls in its own syntax into proper SOAP messages. In other words,
1365 the programming language needs to know what operations the web
1366 service supports and what types of arguments are required for the
1367 operation's data in order to be able to properly serialize and
1368 deserialize the data to and from the web service. For example, if
1369 a web service operation expects a number in "double" floating
1370 point format for a particular parameter, the programming language
1371 cannot send to it a string instead.</para>
1372
1373 <para>For this, the Web Service Definition Language (WSDL) was
1374 invented, another XML substandard that describes exactly what
1375 operations the web service supports and, for each operation, which
1376 parameters and types are needed with each request and response
1377 message. WSDL descriptions can be incredibly verbose, and one of
1378 the few good things that can be said about this standard is that
1379 it is indeed supported by most programming languages.</para>
1380
1381 <para>So, if it is said that a programming language "supports" web
1382 services, this typically means that a programming language has
1383 support for parsing WSDL files and somehow integrating the remote
1384 procedure calls into the native language syntax -- for example,
1385 like in the Java sample shown in <xref
1386 linkend="webservice-java-sample" />.</para>
1387
1388 <para>For details about how programming languages support web
1389 services, please refer to the documentation that comes with the
1390 individual languages. Here are a few pointers:</para>
1391
1392 <orderedlist>
1393 <listitem>
1394 <para>For <emphasis role="bold">C++,</emphasis> among many
1395 others, the gSOAP toolkit is a good option. Parts of gSOAP are
1396 also used in VirtualBox to implement the VirtualBox web
1397 service.</para>
1398 </listitem>
1399
1400 <listitem>
1401 <para>For <emphasis role="bold">Java,</emphasis> there are
1402 several implementations already described in this document
1403 (see <xref linkend="glue-jax-ws" /> and <xref
1404 linkend="webservice-java-sample" />).</para>
1405 </listitem>
1406
1407 <listitem>
1408 <para><emphasis role="bold">Perl</emphasis> supports WSDL via
1409 the SOAP::Lite package. This in turn comes with a tool called
1410 <computeroutput>stubmaker.pl</computeroutput> that allows you
1411 to turn any WSDL file into a Perl package that you can import.
1412 (You can also import any WSDL file "live" by having it parsed
1413 every time the script runs, but that can take a while.) You
1414 can then code (again, assuming the above example):<screen>my $result = servicename-&gt;sayHello("Peter");</screen></para>
1415
1416 <para>A sample that uses SOAP::Lite was described in <xref
1417 linkend="raw-webservice-perl" />.</para>
1418 </listitem>
1419 </orderedlist>
1420 </sect4>
1421 </sect3>
1422 </sect2>
1423 </sect1>
1424
1425 <sect1 id="api_com">
1426 <title>Using COM/XPCOM directly</title>
1427
1428 <para>If you do not require <emphasis>remote</emphasis> procedure calls
1429 such as those offered by the VirtualBox web service, and if you know
1430 Python or C++ as well as COM, you might find it preferable to program
1431 VirtualBox's Main API directly via COM.</para>
1432
1433 <para>COM stands for "Component Object Model" and is a standard
1434 originally introduced by Microsoft in the 1990s for Microsoft Windows.
1435 It allows for organizing software in an object-oriented way and across
1436 processes; code in one process may access objects that live in another
1437 process.</para>
1438
1439 <para>COM has several advantages: it is language-neutral, meaning that
1440 even though all of VirtualBox is internally written in C++, programs
1441 written in other languages could communicate with it. COM also cleanly
1442 separates interface from implementation, so that external programs need
1443 not know anything about the messy and complicated details of VirtualBox
1444 internals.</para>
1445
1446 <para>On a Windows host, all parts of VirtualBox will use the COM
1447 functionality that is native to Windows. On other hosts (including
1448 Linux), VirtualBox comes with a built-in implementation of XPCOM, as
1449 originally created by the Mozilla project, which we have enhanced to
1450 support interprocess communication on a level comparable to Microsoft
1451 COM. Internally, VirtualBox has an abstraction layer that allows the
1452 same VirtualBox code to work both with native COM as well as our XPCOM
1453 implementation.</para>
1454
1455 <sect2 id="pycom">
1456 <title>Python COM API</title>
1457
1458 <para>On Windows, Python scripts can use COM and VirtualBox interfaces
1459 to control almost all aspects of virtual machine execution. As an
1460 example, use the following commands to instantiate the VirtualBox
1461 object and start a VM: <screen>
1462 vbox = win32com.client.Dispatch("VirtualBox.VirtualBox")
1463 session = win32com.client.Dispatch("VirtualBox.Session")
1464 mach = vbox.findMachine("uuid or name of machine to start")
1465 progress = mach.launchVMProcess(session, "gui", "")
1466 progress.waitForCompletion(-1)
1467 </screen> Also, see
1468 <computeroutput>/bindings/glue/python/samples/vboxshell.py</computeroutput>
1469 for more advanced usage scenarious. However, unless you have specific
1470 requirements, we strongly recommend to use the generic glue layer
1471 described in the next section to access MS COM objects.</para>
1472 </sect2>
1473
1474 <sect2 id="glue-python">
1475 <title>Common Python bindings layer</title>
1476
1477 <para>As different wrappers ultimately provide access to the same
1478 underlying API, and to simplify porting and development of Python
1479 application using the VirtualBox Main API, we developed a common glue
1480 layer that abstracts out most platform-specific details from the
1481 application and allows the developer to focus on application logic.
1482 The VirtualBox installer automatically sets up this glue layer for the
1483 system default Python install. See below for details on how to set up
1484 the glue layer if you want to use a different Python
1485 installation.</para>
1486
1487 <para>In this layer, the class
1488 <computeroutput>VirtualBoxManager</computeroutput> hides most
1489 platform-specific details. It can be used to access both the local
1490 (COM) and the web service based API. The following code can be used by
1491 an application to use the glue layer.</para>
1492
1493 <screen># This code assumes vboxapi.py from VirtualBox distribution
1494# being in PYTHONPATH, or installed system-wide
1495from vboxapi import VirtualBoxManager
1496
1497# This code initializes VirtualBox manager with default style
1498# and parameters
1499virtualBoxManager = VirtualBoxManager(None, None)
1500
1501# Alternatively, one can be more verbose, and initialize
1502# glue with web service backend, and provide authentication
1503# information
1504virtualBoxManager = VirtualBoxManager("WEBSERVICE",
1505 {'url':'http://myhost.com::18083/',
1506 'user':'me',
1507 'password':'secret'}) </screen>
1508
1509 <para>We supply the <computeroutput>VirtualBoxManager</computeroutput>
1510 constructor with 2 arguments: style and parameters. Style defines
1511 which bindings style to use (could be "MSCOM", "XPCOM" or
1512 "WEBSERVICE"), and if set to <computeroutput>None</computeroutput>
1513 defaults to usable platform bindings (MS COM on Windows, XPCOM on
1514 other platforms). The second argument defines parameters, passed to
1515 the platform-specific module, as we do in the second example, where we
1516 pass username and password to be used to authenticate against the web
1517 service.</para>
1518
1519 <para>After obtaining the
1520 <computeroutput>VirtualBoxManager</computeroutput> instance, one can
1521 perform operations on the IVirtualBox class. For example, the
1522 following code will a start virtual machine by name or ID:</para>
1523
1524 <screen>from vboxapi import VirtualBoxManager
1525mgr = VirtualBoxManager(None, None)
1526vbox = mgr.vbox
1527name = "Linux"
1528mach = vbox.findMachine(name)
1529session = mgr.mgr.getSessionObject(vbox)
1530progress = mach.launchVMProcess(session, "gui", "")
1531progress.waitForCompletion(-1)
1532mgr.closeMachineSession(session)
1533 </screen>
1534 <para>
1535 Following code will print all registered machines and their log folders
1536 </para>
1537 <screen>from vboxapi import VirtualBoxManager
1538mgr = VirtualBoxManager(None, None)
1539vbox = mgr.vbox
1540
1541for m in mgr.getArray(vbox, 'machines'):
1542print "Machine '%s' logs in '%s'" %(m.name, m.logFolder)
1543 </screen>
1544
1545 <para>Code above demonstrates cross-platform access to array properties
1546 (certain limitations prevent one from using
1547 <computeroutput>vbox.machines</computeroutput> to access a list of
1548 available virtual machines in case of XPCOM), and a mechanism of
1549 uniform session creation and closing
1550 (<computeroutput>mgr.mgr.getSessionObject()</computeroutput>).</para>
1551
1552 <para>In case you want to use the glue layer with a different Python
1553 installation, use these steps in a shell to add the necessary
1554 files:</para>
1555
1556 <screen> # cd VBOX_INSTALL_PATH/sdk/installer
1557 # PYTHON vboxapisetup.py install</screen>
1558 </sect2>
1559
1560 <sect2 id="cppcom">
1561 <title>C++ COM API</title>
1562
1563 <para>C++ is the language that VirtualBox itself is written in, so C++
1564 is the most direct way to use the Main API -- but it is not
1565 necessarily the easiest, as using COM and XPCOM has its own set of
1566 complications.</para>
1567
1568 <para>VirtualBox ships with sample programs that demonstrate how to
1569 use the Main API to implement a number of tasks on your host platform.
1570 These samples can be found in the
1571 <computeroutput>/bindings/xpcom/samples</computeroutput> directory for
1572 Linux, Mac OS X and Solaris and
1573 <computeroutput>/bindings/mscom/samples</computeroutput> for Windows.
1574 The two samples are actually different, because the one for Windows
1575 uses native COM, whereas the other uses our XPCOM implementation, as
1576 described above.</para>
1577
1578 <para>Since COM and XPCOM are conceptually very similar but vary in
1579 the implementation details, we have created a "glue" layer that
1580 shields COM client code from these differences. All VirtualBox uses is
1581 this glue layer, so the same code written once works on both Windows
1582 hosts (with native COM) as well as on other hosts (with our XPCOM
1583 implementation). It is recommended to always use this glue code
1584 instead of using the COM and XPCOM APIs directly, as it is very easy
1585 to make your code completely independent from the platform it is
1586 running on.<!-- A third sample,
1587 <computeroutput>tstVBoxAPIGlue.cpp</computeroutput>, illustrates how to
1588 use the glue layer.
1589--></para>
1590
1591 <para>In order to encapsulate platform differences between Microsoft
1592 COM and XPCOM, the following items should be kept in mind when using
1593 the glue layer:</para>
1594
1595 <para><orderedlist>
1596 <listitem>
1597 <para><emphasis role="bold">Attribute getters and
1598 setters.</emphasis> COM has the notion of "attributes" in
1599 interfaces, which roughly compare to C++ member variables in
1600 classes. The difference is that for each attribute declared in
1601 an interface, COM automatically provides a "get" method to
1602 return the attribute's value. Unless the attribute has been
1603 marked as "readonly", a "set" attribute is also provided.</para>
1604
1605 <para>To illustrate, the IVirtualBox interface has a "version"
1606 attribute, which is read-only and of the "wstring" type (the
1607 standard string type in COM). As a result, you can call the
1608 "get" method for this attribute to retrieve the version number
1609 of VirtualBox.</para>
1610
1611 <para>Unfortunately, the implementation differs between COM and
1612 XPCOM. Microsoft COM names the "get" method like this:
1613 <computeroutput>get_Attribute()</computeroutput>, whereas XPCOM
1614 uses this syntax:
1615 <computeroutput>GetAttribute()</computeroutput> (and accordingly
1616 for "set" methods). To hide these differences, the VirtualBox
1617 glue code provides the
1618 <computeroutput>COMGETTER(attrib)</computeroutput> and
1619 <computeroutput>COMSETTER(attrib)</computeroutput> macros. So,
1620 <computeroutput>COMGETTER(version)()</computeroutput> (note, two
1621 pairs of brackets) expands to
1622 <computeroutput>get_Version()</computeroutput> on Windows and
1623 <computeroutput>GetVersion()</computeroutput> on other
1624 platforms.</para>
1625 </listitem>
1626
1627 <listitem>
1628 <para><emphasis role="bold">Unicode conversions.</emphasis>
1629 While the rest of the modern world has pretty much settled on
1630 encoding strings in UTF-8, COM, unfortunately, uses UCS-16
1631 encoding. This requires a lot of conversions, in particular
1632 between the VirtualBox Main API and the Qt GUI, which, like the
1633 rest of Qt, likes to use UTF-8.</para>
1634
1635 <para>To facilitate these conversions, VirtualBox provides the
1636 <computeroutput>com::Bstr</computeroutput> and
1637 <computeroutput>com::Utf8Str</computeroutput> classes, which
1638 support all kinds of conversions back and forth.</para>
1639 </listitem>
1640
1641 <listitem>
1642 <para><emphasis role="bold">COM autopointers.</emphasis>
1643 Possibly the greatest pain of using COM -- reference counting --
1644 is alleviated by the
1645 <computeroutput>ComPtr&lt;&gt;</computeroutput> template
1646 provided by the <computeroutput>ptr.h</computeroutput> file in
1647 the glue layer.</para>
1648 </listitem>
1649 </orderedlist></para>
1650 </sect2>
1651
1652 <sect2 id="event-queue">
1653 <title>Event queue processing</title>
1654
1655 <para>Both VirtualBox client programs and frontends should
1656 periodically perform processing of the main event queue, and do that
1657 on the application's main thread. In case of a typical GUI Windows/Mac
1658 OS application this happens automatically in the GUI's dispatch loop.
1659 However, for CLI only application, the appropriate actions have to be
1660 taken. For C++ applications, the VirtualBox SDK provided glue method
1661 <screen>
1662 int EventQueue::processEventQueue(uint32_t cMsTimeout)
1663 </screen> can be used for both blocking and non-blocking operations.
1664 For the Python bindings, a common layer provides the method <screen>
1665 VirtualBoxManager.waitForEvents(ms)
1666 </screen> with similar semantics.</para>
1667
1668 <para>Things get somewhat more complicated for situations where an
1669 application using VirtualBox cannot directly control the main event
1670 loop and the main event queue is separated from the event queue of the
1671 programming librarly (for example in case of Qt on Unix platforms). In
1672 such a case, the application developer is advised to use a
1673 platform/toolkit specific event injection mechanism to force event
1674 queue checks either based on periodical timer events delivered to the
1675 main thread, or by using custom platform messages to notify the main
1676 thread when events are available. See the VBoxSDL and Qt (VirtualBox)
1677 frontends as examples.</para>
1678 </sect2>
1679
1680 <sect2 id="vbcom">
1681 <title>Visual Basic and Visual Basic Script (VBS) on Windows
1682 hosts</title>
1683
1684 <para>On Windows hosts, one can control some of the VirtualBox Main
1685 API functionality from VBS scripts, and pretty much everything from
1686 Visual Basic programs.<footnote>
1687 <para>The difference results from the way VBS treats COM
1688 safearrays, which are used to keep lists in the Main API. VBS
1689 expects every array element to be a
1690 <computeroutput>VARIANT</computeroutput>, which is too strict a
1691 limitation for any high performance API. We may lift this
1692 restriction for interface APIs in a future version, or
1693 alternatively provide conversion APIs.</para>
1694 </footnote></para>
1695
1696 <para>VBS is scripting language available in any recent Windows
1697 environment. As an example, the following VBS code will print
1698 VirtualBox version: <screen>
1699 set vb = CreateObject("VirtualBox.VirtualBox")
1700 Wscript.Echo "VirtualBox version " &amp; vb.version
1701 </screen> See
1702 <computeroutput>bindings/mscom/vbs/sample/vboxinfo.vbs</computeroutput>
1703 for the complete sample.</para>
1704
1705 <para>Visual Basic is a popular high level language capable of
1706 accessing COM objects. The following VB code will iterate over all
1707 available virtual machines:<screen>
1708 Dim vb As VirtualBox.IVirtualBox
1709
1710 vb = CreateObject("VirtualBox.VirtualBox")
1711 machines = ""
1712 For Each m In vb.Machines
1713 m = m &amp; " " &amp; m.Name
1714 Next
1715 </screen> See
1716 <computeroutput>bindings/mscom/vb/sample/vboxinfo.vb</computeroutput>
1717 for the complete sample.</para>
1718 </sect2>
1719
1720 <sect2 id="cbinding">
1721 <title>C binding to XPCOM API</title>
1722
1723 <note>
1724 <para>This section currently applies to Linux, Mac OS X and Solaris
1725 hosts only.</para>
1726 </note>
1727
1728 <para>Starting with version 2.2, VirtualBox offers a C binding for the
1729 XPCOM API.</para>
1730
1731 <para>The C binding provides a layer enabling object creation, method
1732 invocation and attribute access from C.</para>
1733
1734 <sect3 id="c-gettingstarted">
1735 <title>Getting started</title>
1736
1737 <para>The following sections describe how to use the C binding in a
1738 C program.</para>
1739
1740 <para>As part of the SDK, a sample program is provided which
1741 demonstrates using the C binding to initialize XPCOM, get handles for
1742 VirtualBox and Session objects, make calls to list and start virtual
1743 machines, monitor events, and uninitialize resources when done. The
1744 program uses the VBoxGlue library to open the C binding layer during
1745 runtime.</para>
1746
1747 <para>The sample program
1748 <computeroutput>tstXPCOMCGlue</computeroutput> is located in the bin
1749 directory and can be run without arguments. It lists registered
1750 machines on the host along with some additional information and ask
1751 for a machine to start. The source for this program is available in
1752 <computeroutput>sdk/bindings/xpcom/cbinding/samples/</computeroutput>
1753 directory. The source for the VBoxGlue library is available in the
1754 <computeroutput>sdk/bindings/xpcom/cbinding/</computeroutput>
1755 directory.</para>
1756 </sect3>
1757
1758 <sect3 id="c-initialization">
1759 <title>XPCOM initialization</title>
1760
1761 <para>Just like in C++, XPCOM needs to be initialized before it can
1762 be used. The <computeroutput>VBoxCAPI_v4_3.h</computeroutput> header
1763 provides the interface to the C binding. Here's how to initialize
1764 XPCOM:</para>
1765
1766 <screen>#include "VBoxCAPI_v4_3.h"
1767...
1768PCVBOXXPCOM g_pVBoxFuncs = NULL;
1769IVirtualBox *vbox = NULL;
1770ISession *session = NULL;
1771
1772/*
1773 * VBoxGetXPCOMCFunctions() is the only function exported by
1774 * VBoxXPCOMC.so and the only one needed to make virtualbox
1775 * work with C. This functions gives you the pointer to the
1776 * function table (g_pVBoxFuncs).
1777 *
1778 * Once you get the function table, then how and which functions
1779 * to use is explained below.
1780 *
1781 * g_pVBoxFuncs-&gt;pfnComInitialize does all the necessary startup
1782 * action and provides us with pointers to vbox and session handles.
1783 * It should be matched by a call to g_pVBoxFuncs-&gt;pfnComUninitialize()
1784 * when done.
1785 */
1786
1787g_pVBoxFuncs = VBoxGetXPCOMCFunctions(VBOX_XPCOMC_VERSION);
1788g_pVBoxFuncs-&gt;pfnComInitialize(IVIRTUALBOX_IID_STR, &amp;vbox,
1789 ISESSION_IID_STR, &amp;session);</screen>
1790
1791 <para>If either <computeroutput>vbox</computeroutput> or
1792 <computeroutput>session</computeroutput> is still
1793 <computeroutput>NULL</computeroutput>, initialization failed and the
1794 XPCOM API cannot be used.</para>
1795
1796 <para>There is now also a way to use the
1797 <xref linkend="IVirtualBoxClient" xreflabel="IVirtualBoxClient" />
1798 helper interface, which in comparison to the original (and still
1799 available) initialization method above simplifies creating multiple
1800 sessions, and also allows handling termination and crashes of the API
1801 server (VBoxSVC) in a graceful way. See the sample program how this
1802 is used.</para>
1803 </sect3>
1804
1805 <sect3 id="c-invocation">
1806 <title>XPCOM method invocation</title>
1807
1808 <para>Method invocation is straightforward. It looks pretty much
1809 like the C++ way, augmented with an extra indirection due to
1810 accessing the vtable and passing a pointer to the object as the
1811 first argument to serve as the <computeroutput>this</computeroutput>
1812 pointer.</para>
1813
1814 <para>Using the C binding, all method invocations return a numeric
1815 result code.</para>
1816
1817 <para>If an interface is specified as returning an object, a pointer
1818 to a pointer to the appropriate object must be passed as the last
1819 argument. The method will then store an object pointer in that
1820 location.</para>
1821
1822 <para>In other words, to call an object's method what you need
1823 is</para>
1824
1825 <screen>IObject *object;
1826nsresult rc;
1827...
1828/*
1829 * Calling void IObject::method(arg, ...)
1830 */
1831rc = object-&gt;vtbl-&gt;Method(object, arg, ...);
1832
1833...
1834IFoo *foo;
1835/*
1836 * Calling IFoo IObject::method(arg, ...)
1837 */
1838rc = object-&gt;vtbl-&gt;Method(object, args, ..., &amp;foo);</screen>
1839
1840 <para>As a real-world example of a method invocation, let's call
1841 <xref linkend="IMachine__launchVMProcess"
1842 xreflabel="IMachine::launchVMProcess" /> which returns an
1843 IProgress object. Note again that the method name is
1844 capitalized.</para>
1845
1846 <screen>IProgress *progress;
1847...
1848rc = vbox-&gt;vtbl-&gt;LaunchVMProcess(
1849 machine, /* this */
1850 session, /* arg 1 */
1851 sessionType, /* arg 2 */
1852 env, /* arg 3 */
1853 &amp;progress /* Out */
1854);</screen>
1855 </sect3>
1856
1857 <sect3 id="c-attributes">
1858 <title>XPCOM attribute access</title>
1859
1860 <para>A construct similar to calling non-void methods is used to
1861 access object attributes. For each attribute there exists a getter
1862 method, the name of which is composed of
1863 <computeroutput>Get</computeroutput> followed by the capitalized
1864 attribute name. Unless the attribute is read-only, an analogous
1865 <computeroutput>Set</computeroutput> method exists. Let's apply
1866 these rules to read the <xref linkend="IVirtualBox__revision"
1867 xreflabel="IVirtualBox::revision" /> attribute.</para>
1868
1869 <para>Using the <computeroutput>IVirtualBox</computeroutput> handle
1870 <computeroutput>vbox</computeroutput> obtained above, calling its
1871 <computeroutput>GetRevision</computeroutput> method looks like
1872 this:</para>
1873
1874 <screen>PRUint32 rev;
1875
1876rc = vbox-&gt;vtbl-&gt;GetRevision(vbox, &amp;rev);
1877if (NS_SUCCEEDED(rc))
1878{
1879 printf("Revision: %u\n", (unsigned)rev);
1880}</screen>
1881
1882 <para>All objects with their methods and attributes are documented
1883 in <xref linkend="sdkref_classes" />.</para>
1884 </sect3>
1885
1886 <sect3 id="c-string-handling">
1887 <title>String handling</title>
1888
1889 <para>When dealing with strings you have to be aware of a string's
1890 encoding and ownership.</para>
1891
1892 <para>Internally, XPCOM uses UTF-16 encoded strings. A set of
1893 conversion functions is provided to convert other encodings to and
1894 from UTF-16. The type of a UTF-16 character is
1895 <computeroutput>PRUnichar</computeroutput>. Strings of UTF-16
1896 characters are arrays of that type. Most string handling functions
1897 take pointers to that type. Prototypes for the following conversion
1898 functions are declared in
1899 <computeroutput>VBoxCAPI_v4_3.h</computeroutput>.</para>
1900
1901 <sect4>
1902 <title>Conversion of UTF-16 to and from UTF-8</title>
1903
1904 <screen>int (*pfnUtf16ToUtf8)(const PRUnichar *pwszString, char **ppszString);
1905int (*pfnUtf8ToUtf16)(const char *pszString, PRUnichar **ppwszString);</screen>
1906 </sect4>
1907
1908 <sect4>
1909 <title>Ownership</title>
1910
1911 <para>The ownership of a string determines who is responsible for
1912 releasing resources associated with the string. Whenever XPCOM
1913 creates a string, ownership is transferred to the caller. To avoid
1914 resource leaks, the caller should release resources once the
1915 string is no longer needed.</para>
1916 </sect4>
1917 </sect3>
1918
1919 <sect3 id="c-uninitialization">
1920 <title>XPCOM uninitialization</title>
1921
1922 <para>Uninitialization is performed by
1923 <computeroutput>g_pVBoxFuncs-&gt;pfnComUninitialize().</computeroutput>
1924 If your program can exit from more than one place, it is a good idea
1925 to install this function as an exit handler with Standard C's
1926 <computeroutput>atexit()</computeroutput> just after calling
1927 <computeroutput>g_pVBoxFuncs-&gt;pfnComInitialize()</computeroutput>
1928 , e.g. <screen>#include &lt;stdlib.h&gt;
1929#include &lt;stdio.h&gt;
1930
1931...
1932
1933/*
1934 * Make sure g_pVBoxFuncs-&gt;pfnComUninitialize() is called at exit, no
1935 * matter if we return from the initial call to main or call exit()
1936 * somewhere else. Note that atexit registered functions are not
1937 * called upon abnormal termination, i.e. when calling abort() or
1938 * signal(). Separate provisions must be taken for these cases.
1939 */
1940
1941if (atexit(g_pVBoxFuncs-&gt;pfnComUninitialize()) != 0) {
1942 fprintf(stderr, "failed to register g_pVBoxFuncs-&gt;pfnComUninitialize()\n");
1943 exit(EXIT_FAILURE);
1944}</screen></para>
1945
1946 <para>Another idea would be to write your own <computeroutput>void
1947 myexit(int status)</computeroutput> function, calling
1948 <computeroutput>g_pVBoxFuncs-&gt;pfnComUninitialize()</computeroutput>
1949 followed by the real <computeroutput>exit()</computeroutput>, and
1950 use it instead of <computeroutput>exit()</computeroutput> throughout
1951 your program and at the end of
1952 <computeroutput>main.</computeroutput></para>
1953
1954 <para>If you expect the program to be terminated by a signal (e.g.
1955 user types CTRL-C sending SIGINT) you might want to install a signal
1956 handler setting a flag noting that a signal was sent and then
1957 calling
1958 <computeroutput>g_pVBoxFuncs-&gt;pfnComUninitialize()</computeroutput>
1959 later on, <emphasis>not</emphasis> from the handler itself.</para>
1960
1961 <para>That said, if a client program forgets to call
1962 <computeroutput>g_pVBoxFuncs-&gt;pfnComUninitialize()</computeroutput>
1963 before it terminates, there is a mechanism in place which will
1964 eventually release references held by the client.</para>
1965 </sect3>
1966
1967 <sect3 id="c-linking">
1968 <title>Compiling and linking</title>
1969
1970 <para>A program using the C binding has to open the library during
1971 runtime using the help of glue code provided and as shown in the
1972 example <computeroutput>tstXPCOMCGlue.c</computeroutput>.
1973 Compilation and linking can be achieved, e.g., with a makefile
1974 fragment similar to</para>
1975
1976 <screen># Where is the XPCOM include directory?
1977INCS_XPCOM = -I../../include
1978# Where is the glue code directory?
1979GLUE_DIR = ..
1980GLUE_INC = -I..
1981
1982#Compile Glue Library
1983VBoxXPCOMCGlue.o: $(GLUE_DIR)/VBoxXPCOMCGlue.c
1984 $(CC) $(CFLAGS) $(INCS_XPCOM) $(GLUE_INC) -o $@ -c $&lt;
1985
1986# Compile.
1987program.o: program.c VBoxCAPI_v4_3.h
1988 $(CC) $(CFLAGS) $(INCS_XPCOM) $(GLUE_INC) -o $@ -c $&lt;
1989
1990# Link.
1991program: program.o VBoxXPCOMCGlue.o
1992 $(CC) -o $@ $^ -ldl</screen>
1993 </sect3>
1994 </sect2>
1995 </sect1>
1996 </chapter>
1997
1998 <chapter id="concepts">
1999 <title>Basic VirtualBox concepts; some examples</title>
2000
2001 <para>The following explains some basic VirtualBox concepts such as the
2002 VirtualBox object, sessions and how virtual machines are manipulated and
2003 launched using the Main API. The coding examples use a pseudo-code style
2004 closely related to the object-oriented web service (OOWS) for JAX-WS.
2005 Depending on which environment you are using, you will need to adjust the
2006 examples.</para>
2007
2008 <sect1>
2009 <title>Obtaining basic machine information. Reading attributes</title>
2010
2011 <para>Any program using the Main API will first need access to the
2012 global VirtualBox object (see <xref linkend="IVirtualBox"
2013 xreflabel="IVirtualBox" />), from which all other functionality of the
2014 API is derived. With the OOWS for JAX-WS, this is returned from the
2015 <xref linkend="IWebsessionManager__logon"
2016 xreflabel="IWebsessionManager::logon()" /> call.</para>
2017
2018 <para>To enumerate virtual machines, one would look at the "machines"
2019 array attribute in the VirtualBox object (see <xref
2020 linkend="IVirtualBox__machines" xreflabel="IVirtualBox::machines" />).
2021 This array contains all virtual machines currently registered with the
2022 host, each of them being an instance of <xref linkend="IMachine"
2023 xreflabel="IMachine" />. From each such instance, one can query
2024 additional information, such as the UUID, the name, memory, operating
2025 system and more by looking at the attributes; see the attributes list in
2026 <xref linkend="IMachine" xreflabel="IMachine documentation" />.</para>
2027
2028 <para>As mentioned in the preceding chapters, depending on your
2029 programming environment, attributes are mapped to corresponding "get"
2030 and (if the attribute is not read-only) "set" methods. So when the
2031 documentation says that IMachine has a "<xref linkend="IMachine__name"
2032 xreflabel="name" />" attribute, this means you need to code something
2033 like the following to get the machine's name:<screen>IMachine machine = ...;
2034String name = machine.getName();</screen>Boolean attribute getters can
2035 sometimes be called <computeroutput>isAttribute()</computeroutput> due
2036 to JAX-WS naming conventions.</para>
2037 </sect1>
2038
2039 <sect1>
2040 <title>Changing machine settings. Sessions</title>
2041
2042 <para>As said in the previous section, to read a machine's attribute,
2043 one invokes the corresponding "get" method. One would think that to
2044 change settings of a machine, it would suffice to call the corresponding
2045 "set" method -- for example, to set a VM's memory to 1024 MB, one would
2046 call <computeroutput>setMemorySize(1024)</computeroutput>. Try that, and
2047 you will get an error: "The machine is not mutable."</para>
2048
2049 <para>So unfortunately, things are not that easy. VirtualBox is a
2050 complicated environment in which multiple processes compete for possibly
2051 the same resources, especially machine settings. As a result, machines
2052 must be "locked" before they can either be modified or started. This is
2053 to prevent multiple processes from making conflicting changes to a
2054 machine: it should, for example, not be allowed to change the memory
2055 size of a virtual machine while it is running. (You can't add more
2056 memory to a real computer while it is running either, at least not to an
2057 ordinary PC.) Also, two processes must not change settings at the same
2058 time, or start a machine at the same time.</para>
2059
2060 <para>These requirements are implemented in the Main API by way of
2061 "sessions", in particular, the <xref linkend="ISession"
2062 xreflabel="ISession" /> interface. Each process which talks to
2063 VirtualBox needs its own instance of ISession. In the web service, you
2064 cannot create such an object, but
2065 <computeroutput>vboxwebsrv</computeroutput> creates one for you when you
2066 log on, which you can obtain by calling <xref
2067 linkend="IWebsessionManager__getSessionObject"
2068 xreflabel="IWebsessionManager::getSessionObject()" />.</para>
2069
2070 <para>This session object must then be used like a mutex semaphore in
2071 common programming environments. Before you can change machine settings,
2072 you must write-lock the machine by calling <xref
2073 linkend="IMachine__lockMachine" xreflabel="IMachine::lockMachine()" />
2074 with your process's session object.</para>
2075
2076 <para>After the machine has been locked, the <xref
2077 linkend="ISession__machine" xreflabel="ISession::machine" /> attribute
2078 contains a copy of the original IMachine object upon which the session
2079 was opened, but this copy is "mutable": you can invoke "set" methods on
2080 it.</para>
2081
2082 <para>When done making the changes to the machine, you must call <xref
2083 linkend="IMachine__saveSettings"
2084 xreflabel="IMachine::saveSettings()" />, which will copy the changes you
2085 have made from your "mutable" machine back to the real machine and write
2086 them out to the machine settings XML file. This will make your changes
2087 permanent.</para>
2088
2089 <para>Finally, it is important to always unlock the machine again, by
2090 calling <xref linkend="ISession__unlockMachine"
2091 xreflabel="ISession::unlockMachine()" />. Otherwise, when the calling
2092 process end, the machine will receive the "aborted" state, which can
2093 lead to loss of data.</para>
2094
2095 <para>So, as an example, the sequence to change a machine's memory to
2096 1024 MB is something like this:<screen>IWebsessionManager mgr ...;
2097IVirtualBox vbox = mgr.logon(user, pass);
2098...
2099IMachine machine = ...; // read-only machine
2100ISession session = mgr.getSessionObject();
2101machine.lockMachine(session, LockType.Write); // machine is now locked for writing
2102IMachine mutable = session.getMachine(); // obtain the mutable machine copy
2103mutable.setMemorySize(1024);
2104mutable.saveSettings(); // write settings to XML
2105session.unlockMachine();</screen></para>
2106 </sect1>
2107
2108 <sect1>
2109 <title>Launching virtual machines</title>
2110
2111 <para>To launch a virtual machine, you call <xref
2112 linkend="IMachine__launchVMProcess"
2113 xreflabel="IMachine::launchVMProcess()" />. In doing so, the caller
2114 instructs the VirtualBox engine to start a new process with the virtual
2115 machine in it, since to the host, each virtual machine looks like a
2116 single process, even if it has hundreds of its own processes inside.
2117 (This new VM process in turn obtains a write lock on the machine, as
2118 described above, to prevent conflicting changes from other processes;
2119 this is why opening another session will fail while the VM is
2120 running.)</para>
2121
2122 <para>Starting a machine looks something like this:<screen>IWebsessionManager mgr ...;
2123IVirtualBox vbox = mgr.logon(user, pass);
2124...
2125IMachine machine = ...; // read-only machine
2126ISession session = mgr.getSessionObject();
2127IProgress prog = machine.launchVMProcess(session,
2128 "gui", // session type
2129 ""); // possibly environment setting
2130prog.waitForCompletion(10000); // give the process 10 secs
2131if (prog.getResultCode() != 0) // check success
2132 System.out.println("Cannot launch VM!")</screen></para>
2133
2134 <para>The caller's session object can then be used as a sort of remote
2135 control to the VM process that was launched. It contains a "console"
2136 object (see <xref linkend="ISession__console"
2137 xreflabel="ISession::console" />) with which the VM can be paused,
2138 stopped, snapshotted or other things.</para>
2139 </sect1>
2140
2141 <sect1>
2142 <title>VirtualBox events</title>
2143
2144 <para>In VirtualBox, "events" provide a uniform mechanism to register
2145 for and consume specific events. A VirtualBox client can register an
2146 "event listener" (represented by the <xref linkend="IEventListener"
2147 xreflabel="IEventListener" /> interface), which will then get notified
2148 by the server when an event (represented by the <xref linkend="IEvent"
2149 xreflabel="IEvent" /> interface) happens.</para>
2150
2151 <para>The IEvent interface is an abstract parent interface for all
2152 events that can occur in VirtualBox. The actual events that the server
2153 sends out are then of one of the specific subclasses, for example <xref
2154 linkend="IMachineStateChangedEvent"
2155 xreflabel="IMachineStateChangedEvent" /> or <xref
2156 linkend="IMediumChangedEvent" xreflabel="IMediumChangedEvent" />.</para>
2157
2158 <para>As an example, the VirtualBox GUI waits for machine events and can
2159 thus update its display when the machine state changes or machine
2160 settings are modified, even if this happens in another client. This is
2161 how the GUI can automatically refresh its display even if you manipulate
2162 a machine from another client, for example, from VBoxManage.</para>
2163
2164 <para>To register an event listener to listen to events, use code like
2165 this:<screen>EventSource es = console.getEventSource();
2166IEventListener listener = es.createListener();
2167VBoxEventType aTypes[] = (VBoxEventType.OnMachineStateChanged);
2168 // list of event types to listen for
2169es.registerListener(listener, aTypes, false /* active */);
2170 // register passive listener
2171IEvent ev = es.getEvent(listener, 1000);
2172 // wait up to one second for event to happen
2173if (ev != null)
2174{
2175 // downcast to specific event interface (in this case we have only registered
2176 // for one type, otherwise IEvent::type would tell us)
2177 IMachineStateChangedEvent mcse = IMachineStateChangedEvent.queryInterface(ev);
2178 ... // inspect and do something
2179 es.eventProcessed(listener, ev);
2180}
2181...
2182es.unregisterListener(listener); </screen></para>
2183
2184 <para>A graphical user interface would probably best start its own
2185 thread to wait for events and then process these in a loop.</para>
2186
2187 <para>The events mechanism was introduced with VirtualBox 3.3 and
2188 replaces various callback interfaces which were called for each event in
2189 the interface. The callback mechanism was not compatible with scripting
2190 languages, local Java bindings and remote web services as they do not
2191 support callbacks. The new mechanism with events and event listeners
2192 works with all of these.</para>
2193
2194 <para>To simplify developement of application using events, concept of
2195 event aggregator was introduced. Essentially it's mechanism to aggregate
2196 multiple event sources into single one, and then work with this single
2197 aggregated event source instead of original sources. As an example, one
2198 can evaluate demo recorder in VirtualBox Python shell, shipped with SDK
2199 - it records mouse and keyboard events, represented as separate event
2200 sources. Code is essentially like this:<screen>
2201 listener = console.eventSource.createListener()
2202 agg = console.eventSource.createAggregator([console.keyboard.eventSource, console.mouse.eventSource])
2203 agg.registerListener(listener, [ctx['global'].constants.VBoxEventType_Any], False)
2204 registered = True
2205 end = time.time() + dur
2206 while time.time() &lt; end:
2207 ev = agg.getEvent(listener, 1000)
2208 processEent(ev)
2209 agg.unregisterListener(listener)</screen> Without using aggregators
2210 consumer have to poll on both sources, or start multiple threads to
2211 block on those sources.</para>
2212 </sect1>
2213 </chapter>
2214
2215 <chapter id="vboxshell">
2216 <title>The VirtualBox shell</title>
2217
2218 <para>VirtualBox comes with an extensible shell, which allows you to
2219 control your virtual machines from the command line. It is also a
2220 nontrivial example of how to use the VirtualBox APIs from Python, for all
2221 three COM/XPCOM/WS styles of the API.</para>
2222
2223 <para>You can easily extend this shell with your own commands. Create a
2224 subdirectory named <computeroutput>.config/VirtualBox/shexts</computeroutput>
2225 below your home directory (respectively <computeroutput>.VirtualBox/shexts</computeroutput> on a Windows system and <computeroutput>Library/VirtualBox/shexts</computeroutput> on OS X) and put a Python file implementing your shell
2226 extension commands in this directory. This file must contain an array
2227 named <computeroutput>commands</computeroutput> containing your command
2228 definitions: <screen>
2229 commands = {
2230 'cmd1': ['Command cmd1 help', cmd1],
2231 'cmd2': ['Command cmd2 help', cmd2]
2232 }
2233 </screen> For example, to create a command for creating hard drive
2234 images, the following code can be used: <screen>
2235 def createHdd(ctx,args):
2236 # Show some meaningful error message on wrong input
2237 if (len(args) &lt; 3):
2238 print "usage: createHdd sizeM location type"
2239 return 0
2240
2241 # Get arguments
2242 size = int(args[1])
2243 loc = args[2]
2244 if len(args) &gt; 3:
2245 format = args[3]
2246 else:
2247 # And provide some meaningful defaults
2248 format = "vdi"
2249
2250 # Call VirtualBox API, using context's fields
2251 hdd = ctx['vb'].createHardDisk(format, loc)
2252 # Access constants using ctx['global'].constants
2253 progress = hdd.createBaseStorage(size, (ctx['global'].constants.MediumVariant_Standard, ))
2254 # use standard progress bar mechanism
2255 ctx['progressBar'](progress)
2256
2257
2258 # Report errors
2259 if not hdd.id:
2260 print "cannot create disk (file %s exist?)" %(loc)
2261 return 0
2262
2263 # Give user some feedback on success too
2264 print "created HDD with id: %s" %(hdd.id)
2265
2266 # 0 means continue execution, other values mean exit from the interpreter
2267 return 0
2268
2269 commands = {
2270 'myCreateHDD': ['Create virtual HDD, createHdd size location type', createHdd]
2271 }
2272 </screen> Just store the above text in the file
2273 <computeroutput>createHdd</computeroutput> (or any other meaningful name)
2274 in <computeroutput>.config/VirtualBox/shexts/</computeroutput>. Start the
2275 VirtualBox shell, or just issue the
2276 <computeroutput>reloadExts</computeroutput> command, if the shell is
2277 already running. Your new command will now be available.</para>
2278 </chapter>
2279
2280 <!--$VIRTUALBOX_MAIN_API_REFERENCE-->
2281
2282 <chapter id="hgcm">
2283 <title>Host-Guest Communication Manager</title>
2284
2285 <para>The VirtualBox Host-Guest Communication Manager (HGCM) allows a
2286 guest application or a guest driver to call a host shared library. The
2287 following features of VirtualBox are implemented using HGCM: <itemizedlist>
2288 <listitem>
2289 <para>Shared Folders</para>
2290 </listitem>
2291
2292 <listitem>
2293 <para>Shared Clipboard</para>
2294 </listitem>
2295
2296 <listitem>
2297 <para>Guest configuration interface</para>
2298 </listitem>
2299 </itemizedlist></para>
2300
2301 <para>The shared library contains a so called HGCM service. The guest HGCM
2302 clients establish connections to the service to call it. When calling a
2303 HGCM service the client supplies a function code and a number of
2304 parameters for the function.</para>
2305
2306 <sect1>
2307 <title>Virtual hardware implementation</title>
2308
2309 <para>HGCM uses the VMM virtual PCI device to exchange data between the
2310 guest and the host. The guest always acts as an initiator of requests. A
2311 request is constructed in the guest physical memory, which must be
2312 locked by the guest. The physical address is passed to the VMM device
2313 using a 32 bit <computeroutput>out edx, eax</computeroutput>
2314 instruction. The physical memory must be allocated below 4GB by 64 bit
2315 guests.</para>
2316
2317 <para>The host parses the request header and data and queues the request
2318 for a host HGCM service. The guest continues execution and usually waits
2319 on a HGCM event semaphore.</para>
2320
2321 <para>When the request has been processed by the HGCM service, the VMM
2322 device sets the completion flag in the request header, sets the HGCM
2323 event and raises an IRQ for the guest. The IRQ handler signals the HGCM
2324 event semaphore and all HGCM callers check the completion flag in the
2325 corresponding request header. If the flag is set, the request is
2326 considered completed.</para>
2327 </sect1>
2328
2329 <sect1>
2330 <title>Protocol specification</title>
2331
2332 <para>The HGCM protocol definitions are contained in the
2333 <computeroutput>VBox/VBoxGuest.h</computeroutput></para>
2334
2335 <sect2>
2336 <title>Request header</title>
2337
2338 <para>HGCM request structures contains a generic header
2339 (VMMDevHGCMRequestHeader): <table>
2340 <title>HGCM Request Generic Header</title>
2341
2342 <tgroup cols="2">
2343 <tbody>
2344 <row>
2345 <entry><emphasis role="bold">Name</emphasis></entry>
2346
2347 <entry><emphasis role="bold">Description</emphasis></entry>
2348 </row>
2349
2350 <row>
2351 <entry>size</entry>
2352
2353 <entry>Size of the entire request.</entry>
2354 </row>
2355
2356 <row>
2357 <entry>version</entry>
2358
2359 <entry>Version of the header, must be set to
2360 <computeroutput>0x10001</computeroutput>.</entry>
2361 </row>
2362
2363 <row>
2364 <entry>type</entry>
2365
2366 <entry>Type of the request.</entry>
2367 </row>
2368
2369 <row>
2370 <entry>rc</entry>
2371
2372 <entry>HGCM return code, which will be set by the VMM
2373 device.</entry>
2374 </row>
2375
2376 <row>
2377 <entry>reserved1</entry>
2378
2379 <entry>A reserved field 1.</entry>
2380 </row>
2381
2382 <row>
2383 <entry>reserved2</entry>
2384
2385 <entry>A reserved field 2.</entry>
2386 </row>
2387
2388 <row>
2389 <entry>flags</entry>
2390
2391 <entry>HGCM flags, set by the VMM device.</entry>
2392 </row>
2393
2394 <row>
2395 <entry>result</entry>
2396
2397 <entry>The HGCM result code, set by the VMM device.</entry>
2398 </row>
2399 </tbody>
2400 </tgroup>
2401 </table> <note>
2402 <itemizedlist>
2403 <listitem>
2404 <para>All fields are 32 bit.</para>
2405 </listitem>
2406
2407 <listitem>
2408 <para>Fields from <computeroutput>size</computeroutput> to
2409 <computeroutput>reserved2</computeroutput> are a standard VMM
2410 device request header, which is used for other interfaces as
2411 well.</para>
2412 </listitem>
2413 </itemizedlist>
2414 </note></para>
2415
2416 <para>The <emphasis role="bold">type</emphasis> field indicates the
2417 type of the HGCM request: <table>
2418 <title>Request Types</title>
2419
2420 <tgroup cols="2">
2421 <tbody>
2422 <row>
2423 <entry><emphasis role="bold">Name (decimal
2424 value)</emphasis></entry>
2425
2426 <entry><emphasis role="bold">Description</emphasis></entry>
2427 </row>
2428
2429 <row>
2430 <entry>VMMDevReq_HGCMConnect
2431 (<computeroutput>60</computeroutput>)</entry>
2432
2433 <entry>Connect to a HGCM service.</entry>
2434 </row>
2435
2436 <row>
2437 <entry>VMMDevReq_HGCMDisconnect
2438 (<computeroutput>61</computeroutput>)</entry>
2439
2440 <entry>Disconnect from the service.</entry>
2441 </row>
2442
2443 <row>
2444 <entry>VMMDevReq_HGCMCall32
2445 (<computeroutput>62</computeroutput>)</entry>
2446
2447 <entry>Call a HGCM function using the 32 bit
2448 interface.</entry>
2449 </row>
2450
2451 <row>
2452 <entry>VMMDevReq_HGCMCall64
2453 (<computeroutput>63</computeroutput>)</entry>
2454
2455 <entry>Call a HGCM function using the 64 bit
2456 interface.</entry>
2457 </row>
2458
2459 <row>
2460 <entry>VMMDevReq_HGCMCancel
2461 (<computeroutput>64</computeroutput>)</entry>
2462
2463 <entry>Cancel a HGCM request currently being processed by a
2464 host HGCM service.</entry>
2465 </row>
2466 </tbody>
2467 </tgroup>
2468 </table></para>
2469
2470 <para>The <emphasis role="bold">flags</emphasis> field may contain:
2471 <table>
2472 <title>Flags</title>
2473
2474 <tgroup cols="2">
2475 <tbody>
2476 <row>
2477 <entry><emphasis role="bold">Name (hexadecimal
2478 value)</emphasis></entry>
2479
2480 <entry><emphasis role="bold">Description</emphasis></entry>
2481 </row>
2482
2483 <row>
2484 <entry>VBOX_HGCM_REQ_DONE
2485 (<computeroutput>0x00000001</computeroutput>)</entry>
2486
2487 <entry>The request has been processed by the host
2488 service.</entry>
2489 </row>
2490
2491 <row>
2492 <entry>VBOX_HGCM_REQ_CANCELLED
2493 (<computeroutput>0x00000002</computeroutput>)</entry>
2494
2495 <entry>This request was cancelled.</entry>
2496 </row>
2497 </tbody>
2498 </tgroup>
2499 </table></para>
2500 </sect2>
2501
2502 <sect2>
2503 <title>Connect</title>
2504
2505 <para>The connection request must be issued by the guest HGCM client
2506 before it can call the HGCM service (VMMDevHGCMConnect): <table>
2507 <title>Connect request</title>
2508
2509 <tgroup cols="2">
2510 <tbody>
2511 <row>
2512 <entry><emphasis role="bold">Name</emphasis></entry>
2513
2514 <entry><emphasis role="bold">Description</emphasis></entry>
2515 </row>
2516
2517 <row>
2518 <entry>header</entry>
2519
2520 <entry>The generic HGCM request header with type equal to
2521 VMMDevReq_HGCMConnect
2522 (<computeroutput>60</computeroutput>).</entry>
2523 </row>
2524
2525 <row>
2526 <entry>type</entry>
2527
2528 <entry>The type of the service location information (32
2529 bit).</entry>
2530 </row>
2531
2532 <row>
2533 <entry>location</entry>
2534
2535 <entry>The service location information (128 bytes).</entry>
2536 </row>
2537
2538 <row>
2539 <entry>clientId</entry>
2540
2541 <entry>The client identifier assigned to the connecting
2542 client by the HGCM subsystem (32 bit).</entry>
2543 </row>
2544 </tbody>
2545 </tgroup>
2546 </table> The <emphasis role="bold">type</emphasis> field tells the
2547 HGCM how to look for the requested service: <table>
2548 <title>Location Information Types</title>
2549
2550 <tgroup cols="2">
2551 <tbody>
2552 <row>
2553 <entry><emphasis role="bold">Name (hexadecimal
2554 value)</emphasis></entry>
2555
2556 <entry><emphasis role="bold">Description</emphasis></entry>
2557 </row>
2558
2559 <row>
2560 <entry>VMMDevHGCMLoc_LocalHost
2561 (<computeroutput>0x1</computeroutput>)</entry>
2562
2563 <entry>The requested service is a shared library located on
2564 the host and the location information contains the library
2565 name.</entry>
2566 </row>
2567
2568 <row>
2569 <entry>VMMDevHGCMLoc_LocalHost_Existing
2570 (<computeroutput>0x2</computeroutput>)</entry>
2571
2572 <entry>The requested service is a preloaded one and the
2573 location information contains the service name.</entry>
2574 </row>
2575 </tbody>
2576 </tgroup>
2577 </table> <note>
2578 <para>Currently preloaded HGCM services are hard-coded in
2579 VirtualBox: <itemizedlist>
2580 <listitem>
2581 <para>VBoxSharedFolders</para>
2582 </listitem>
2583
2584 <listitem>
2585 <para>VBoxSharedClipboard</para>
2586 </listitem>
2587
2588 <listitem>
2589 <para>VBoxGuestPropSvc</para>
2590 </listitem>
2591
2592 <listitem>
2593 <para>VBoxSharedOpenGL</para>
2594 </listitem>
2595 </itemizedlist></para>
2596 </note> There is no difference between both types of HGCM services,
2597 only the location mechanism is different.</para>
2598
2599 <para>The client identifier is returned by the host and must be used
2600 in all subsequent requests by the client.</para>
2601 </sect2>
2602
2603 <sect2>
2604 <title>Disconnect</title>
2605
2606 <para>This request disconnects the client and makes the client
2607 identifier invalid (VMMDevHGCMDisconnect): <table>
2608 <title>Disconnect request</title>
2609
2610 <tgroup cols="2">
2611 <tbody>
2612 <row>
2613 <entry><emphasis role="bold">Name</emphasis></entry>
2614
2615 <entry><emphasis role="bold">Description</emphasis></entry>
2616 </row>
2617
2618 <row>
2619 <entry>header</entry>
2620
2621 <entry>The generic HGCM request header with type equal to
2622 VMMDevReq_HGCMDisconnect
2623 (<computeroutput>61</computeroutput>).</entry>
2624 </row>
2625
2626 <row>
2627 <entry>clientId</entry>
2628
2629 <entry>The client identifier previously returned by the
2630 connect request (32 bit).</entry>
2631 </row>
2632 </tbody>
2633 </tgroup>
2634 </table></para>
2635 </sect2>
2636
2637 <sect2>
2638 <title>Call32 and Call64</title>
2639
2640 <para>Calls the HGCM service entry point (VMMDevHGCMCall) using 32 bit
2641 or 64 bit addresses: <table>
2642 <title>Call request</title>
2643
2644 <tgroup cols="2">
2645 <tbody>
2646 <row>
2647 <entry><emphasis role="bold">Name</emphasis></entry>
2648
2649 <entry><emphasis role="bold">Description</emphasis></entry>
2650 </row>
2651
2652 <row>
2653 <entry>header</entry>
2654
2655 <entry>The generic HGCM request header with type equal to
2656 either VMMDevReq_HGCMCall32
2657 (<computeroutput>62</computeroutput>) or
2658 VMMDevReq_HGCMCall64
2659 (<computeroutput>63</computeroutput>).</entry>
2660 </row>
2661
2662 <row>
2663 <entry>clientId</entry>
2664
2665 <entry>The client identifier previously returned by the
2666 connect request (32 bit).</entry>
2667 </row>
2668
2669 <row>
2670 <entry>function</entry>
2671
2672 <entry>The function code to be processed by the service (32
2673 bit).</entry>
2674 </row>
2675
2676 <row>
2677 <entry>cParms</entry>
2678
2679 <entry>The number of following parameters (32 bit). This
2680 value is 0 if the function requires no parameters.</entry>
2681 </row>
2682
2683 <row>
2684 <entry>parms</entry>
2685
2686 <entry>An array of parameter description structures
2687 (HGCMFunctionParameter32 or
2688 HGCMFunctionParameter64).</entry>
2689 </row>
2690 </tbody>
2691 </tgroup>
2692 </table></para>
2693
2694 <para>The 32 bit parameter description (HGCMFunctionParameter32)
2695 consists of 32 bit type field and 8 bytes of an opaque value, so 12
2696 bytes in total. The 64 bit variant (HGCMFunctionParameter64) consists
2697 of the type and 12 bytes of a value, so 16 bytes in total.</para>
2698
2699 <para><table>
2700 <title>Parameter types</title>
2701
2702 <tgroup cols="2">
2703 <tbody>
2704 <row>
2705 <entry><emphasis role="bold">Type</emphasis></entry>
2706
2707 <entry><emphasis role="bold">Format of the
2708 value</emphasis></entry>
2709 </row>
2710
2711 <row>
2712 <entry>VMMDevHGCMParmType_32bit (1)</entry>
2713
2714 <entry>A 32 bit value.</entry>
2715 </row>
2716
2717 <row>
2718 <entry>VMMDevHGCMParmType_64bit (2)</entry>
2719
2720 <entry>A 64 bit value.</entry>
2721 </row>
2722
2723 <row>
2724 <entry>VMMDevHGCMParmType_PhysAddr (3)</entry>
2725
2726 <entry>A 32 bit size followed by a 32 bit or 64 bit guest
2727 physical address.</entry>
2728 </row>
2729
2730 <row>
2731 <entry>VMMDevHGCMParmType_LinAddr (4)</entry>
2732
2733 <entry>A 32 bit size followed by a 32 bit or 64 bit guest
2734 linear address. The buffer is used both for guest to host
2735 and for host to guest data.</entry>
2736 </row>
2737
2738 <row>
2739 <entry>VMMDevHGCMParmType_LinAddr_In (5)</entry>
2740
2741 <entry>Same as VMMDevHGCMParmType_LinAddr but the buffer is
2742 used only for host to guest data.</entry>
2743 </row>
2744
2745 <row>
2746 <entry>VMMDevHGCMParmType_LinAddr_Out (6)</entry>
2747
2748 <entry>Same as VMMDevHGCMParmType_LinAddr but the buffer is
2749 used only for guest to host data.</entry>
2750 </row>
2751
2752 <row>
2753 <entry>VMMDevHGCMParmType_LinAddr_Locked (7)</entry>
2754
2755 <entry>Same as VMMDevHGCMParmType_LinAddr but the buffer is
2756 already locked by the guest.</entry>
2757 </row>
2758
2759 <row>
2760 <entry>VMMDevHGCMParmType_LinAddr_Locked_In (1)</entry>
2761
2762 <entry>Same as VMMDevHGCMParmType_LinAddr_In but the buffer
2763 is already locked by the guest.</entry>
2764 </row>
2765
2766 <row>
2767 <entry>VMMDevHGCMParmType_LinAddr_Locked_Out (1)</entry>
2768
2769 <entry>Same as VMMDevHGCMParmType_LinAddr_Out but the buffer
2770 is already locked by the guest.</entry>
2771 </row>
2772 </tbody>
2773 </tgroup>
2774 </table></para>
2775
2776 <para>The</para>
2777 </sect2>
2778
2779 <sect2>
2780 <title>Cancel</title>
2781
2782 <para>This request cancels a call request (VMMDevHGCMCancel): <table>
2783 <title>Cancel request</title>
2784
2785 <tgroup cols="2">
2786 <tbody>
2787 <row>
2788 <entry><emphasis role="bold">Name</emphasis></entry>
2789
2790 <entry><emphasis role="bold">Description</emphasis></entry>
2791 </row>
2792
2793 <row>
2794 <entry>header</entry>
2795
2796 <entry>The generic HGCM request header with type equal to
2797 VMMDevReq_HGCMCancel
2798 (<computeroutput>64</computeroutput>).</entry>
2799 </row>
2800 </tbody>
2801 </tgroup>
2802 </table></para>
2803 </sect2>
2804 </sect1>
2805
2806 <sect1>
2807 <title>Guest software interface</title>
2808
2809 <para>The guest HGCM clients can call HGCM services from both drivers
2810 and applications.</para>
2811
2812 <sect2>
2813 <title>The guest driver interface</title>
2814
2815 <para>The driver interface is implemented in the VirtualBox guest
2816 additions driver (VBoxGuest), which works with the VMM virtual device.
2817 Drivers must use the VBox Guest Library (VBGL), which provides an API
2818 for HGCM clients (<computeroutput>VBox/VBoxGuestLib.h</computeroutput>
2819 and <computeroutput>VBox/VBoxGuest.h</computeroutput>).</para>
2820
2821 <para><screen>
2822DECLVBGL(int) VbglHGCMConnect (VBGLHGCMHANDLE *pHandle, VBoxGuestHGCMConnectInfo *pData);
2823 </screen> Connects to the service: <screen>
2824 VBoxGuestHGCMConnectInfo data;
2825
2826 memset (&amp;data, sizeof (VBoxGuestHGCMConnectInfo));
2827
2828 data.result = VINF_SUCCESS;
2829 data.Loc.type = VMMDevHGCMLoc_LocalHost_Existing;
2830 strcpy (data.Loc.u.host.achName, "VBoxSharedFolders");
2831
2832 rc = VbglHGCMConnect (&amp;handle, &amp;data);
2833
2834 if (RT_SUCCESS (rc))
2835 {
2836 rc = data.result;
2837 }
2838
2839 if (RT_SUCCESS (rc))
2840 {
2841 /* Get the assigned client identifier. */
2842 ulClientID = data.u32ClientID;
2843 }
2844 </screen></para>
2845
2846 <para><screen>
2847DECLVBGL(int) VbglHGCMDisconnect (VBGLHGCMHANDLE handle, VBoxGuestHGCMDisconnectInfo *pData);
2848 </screen> Disconnects from the service. <screen>
2849 VBoxGuestHGCMDisconnectInfo data;
2850
2851 RtlZeroMemory (&amp;data, sizeof (VBoxGuestHGCMDisconnectInfo));
2852
2853 data.result = VINF_SUCCESS;
2854 data.u32ClientID = ulClientID;
2855
2856 rc = VbglHGCMDisconnect (handle, &amp;data);
2857 </screen></para>
2858
2859 <para><screen>
2860DECLVBGL(int) VbglHGCMCall (VBGLHGCMHANDLE handle, VBoxGuestHGCMCallInfo *pData, uint32_t cbData);
2861 </screen> Calls a function in the service. <screen>
2862typedef struct _VBoxSFRead
2863{
2864 VBoxGuestHGCMCallInfo callInfo;
2865
2866 /** pointer, in: SHFLROOT
2867 * Root handle of the mapping which name is queried.
2868 */
2869 HGCMFunctionParameter root;
2870
2871 /** value64, in:
2872 * SHFLHANDLE of object to read from.
2873 */
2874 HGCMFunctionParameter handle;
2875
2876 /** value64, in:
2877 * Offset to read from.
2878 */
2879 HGCMFunctionParameter offset;
2880
2881 /** value64, in/out:
2882 * Bytes to read/How many were read.
2883 */
2884 HGCMFunctionParameter cb;
2885
2886 /** pointer, out:
2887 * Buffer to place data to.
2888 */
2889 HGCMFunctionParameter buffer;
2890
2891} VBoxSFRead;
2892
2893/** Number of parameters */
2894#define SHFL_CPARMS_READ (5)
2895
2896...
2897
2898 VBoxSFRead data;
2899
2900 /* The call information. */
2901 data.callInfo.result = VINF_SUCCESS; /* Will be returned by HGCM. */
2902 data.callInfo.u32ClientID = ulClientID; /* Client identifier. */
2903 data.callInfo.u32Function = SHFL_FN_READ; /* The function code. */
2904 data.callInfo.cParms = SHFL_CPARMS_READ; /* Number of parameters. */
2905
2906 /* Initialize parameters. */
2907 data.root.type = VMMDevHGCMParmType_32bit;
2908 data.root.u.value32 = pMap-&gt;root;
2909
2910 data.handle.type = VMMDevHGCMParmType_64bit;
2911 data.handle.u.value64 = hFile;
2912
2913 data.offset.type = VMMDevHGCMParmType_64bit;
2914 data.offset.u.value64 = offset;
2915
2916 data.cb.type = VMMDevHGCMParmType_32bit;
2917 data.cb.u.value32 = *pcbBuffer;
2918
2919 data.buffer.type = VMMDevHGCMParmType_LinAddr_Out;
2920 data.buffer.u.Pointer.size = *pcbBuffer;
2921 data.buffer.u.Pointer.u.linearAddr = (uintptr_t)pBuffer;
2922
2923 rc = VbglHGCMCall (handle, &amp;data.callInfo, sizeof (data));
2924
2925 if (RT_SUCCESS (rc))
2926 {
2927 rc = data.callInfo.result;
2928 *pcbBuffer = data.cb.u.value32; /* This is returned by the HGCM service. */
2929 }
2930 </screen></para>
2931 </sect2>
2932
2933 <sect2>
2934 <title>Guest application interface</title>
2935
2936 <para>Applications call the VirtualBox Guest Additions driver to
2937 utilize the HGCM interface. There are IOCTL's which correspond to the
2938 <computeroutput>Vbgl*</computeroutput> functions: <itemizedlist>
2939 <listitem>
2940 <para><computeroutput>VBOXGUEST_IOCTL_HGCM_CONNECT</computeroutput></para>
2941 </listitem>
2942
2943 <listitem>
2944 <para><computeroutput>VBOXGUEST_IOCTL_HGCM_DISCONNECT</computeroutput></para>
2945 </listitem>
2946
2947 <listitem>
2948 <para><computeroutput>VBOXGUEST_IOCTL_HGCM_CALL</computeroutput></para>
2949 </listitem>
2950 </itemizedlist></para>
2951
2952 <para>These IOCTL's get the same input buffer as
2953 <computeroutput>VbglHGCM*</computeroutput> functions and the output
2954 buffer has the same format as the input buffer. The same address can
2955 be used as the input and output buffers.</para>
2956
2957 <para>For example see the guest part of shared clipboard, which runs
2958 as an application and uses the HGCM interface.</para>
2959 </sect2>
2960 </sect1>
2961
2962 <sect1>
2963 <title>HGCM Service Implementation</title>
2964
2965 <para>The HGCM service is a shared library with a specific set of entry
2966 points. The library must export the
2967 <computeroutput>VBoxHGCMSvcLoad</computeroutput> entry point: <screen>
2968extern "C" DECLCALLBACK(DECLEXPORT(int)) VBoxHGCMSvcLoad (VBOXHGCMSVCFNTABLE *ptable)
2969 </screen></para>
2970
2971 <para>The service must check the
2972 <computeroutput>ptable-&gt;cbSize</computeroutput> and
2973 <computeroutput>ptable-&gt;u32Version</computeroutput> fields of the
2974 input structure and fill the remaining fields with function pointers of
2975 entry points and the size of the required client buffer size.</para>
2976
2977 <para>The HGCM service gets a dedicated thread, which calls service
2978 entry points synchronously, that is the service will be called again
2979 only when a previous call has returned. However, the guest calls can be
2980 processed asynchronously. The service must call a completion callback
2981 when the operation is actually completed. The callback can be issued
2982 from another thread as well.</para>
2983
2984 <para>Service entry points are listed in the
2985 <computeroutput>VBox/hgcmsvc.h</computeroutput> in the
2986 <computeroutput>VBOXHGCMSVCFNTABLE</computeroutput> structure. <table>
2987 <title>Service entry points</title>
2988
2989 <tgroup cols="2">
2990 <tbody>
2991 <row>
2992 <entry><emphasis role="bold">Entry</emphasis></entry>
2993
2994 <entry><emphasis role="bold">Description</emphasis></entry>
2995 </row>
2996
2997 <row>
2998 <entry>pfnUnload</entry>
2999
3000 <entry>The service is being unloaded.</entry>
3001 </row>
3002
3003 <row>
3004 <entry>pfnConnect</entry>
3005
3006 <entry>A client <computeroutput>u32ClientID</computeroutput>
3007 is connected to the service. The
3008 <computeroutput>pvClient</computeroutput> parameter points to
3009 an allocated memory buffer which can be used by the service to
3010 store the client information.</entry>
3011 </row>
3012
3013 <row>
3014 <entry>pfnDisconnect</entry>
3015
3016 <entry>A client is being disconnected.</entry>
3017 </row>
3018
3019 <row>
3020 <entry>pfnCall</entry>
3021
3022 <entry>A guest client calls a service function. The
3023 <computeroutput>callHandle</computeroutput> must be used in
3024 the VBOXHGCMSVCHELPERS::pfnCallComplete callback when the call
3025 has been processed.</entry>
3026 </row>
3027
3028 <row>
3029 <entry>pfnHostCall</entry>
3030
3031 <entry>Called by the VirtualBox host components to perform
3032 functions which should be not accessible by the guest. Usually
3033 this entry point is used by VirtualBox to configure the
3034 service.</entry>
3035 </row>
3036
3037 <row>
3038 <entry>pfnSaveState</entry>
3039
3040 <entry>The VM state is being saved and the service must save
3041 relevant information using the SSM API
3042 (<computeroutput>VBox/ssm.h</computeroutput>).</entry>
3043 </row>
3044
3045 <row>
3046 <entry>pfnLoadState</entry>
3047
3048 <entry>The VM is being restored from the saved state and the
3049 service must load the saved information and be able to
3050 continue operations from the saved state.</entry>
3051 </row>
3052 </tbody>
3053 </tgroup>
3054 </table></para>
3055 </sect1>
3056 </chapter>
3057
3058 <chapter id="rdpweb">
3059 <title>RDP Web Control</title>
3060
3061 <para>The VirtualBox <emphasis>RDP Web Control</emphasis> (RDPWeb)
3062 provides remote access to a running VM. RDPWeb is a RDP (Remote Desktop
3063 Protocol) client based on Flash technology and can be used from a Web
3064 browser with a Flash plugin.</para>
3065
3066 <sect1>
3067 <title>RDPWeb features</title>
3068
3069 <para>RDPWeb is embedded into a Web page and can connect to VRDP server
3070 in order to displays the VM screen and pass keyboard and mouse events to
3071 the VM.</para>
3072 </sect1>
3073
3074 <sect1>
3075 <title>RDPWeb reference</title>
3076
3077 <para>RDPWeb consists of two required components:<itemizedlist>
3078 <listitem>
3079 <para>Flash movie
3080 <computeroutput>RDPClientUI.swf</computeroutput></para>
3081 </listitem>
3082
3083 <listitem>
3084 <para>JavaScript helpers
3085 <computeroutput>webclient.js</computeroutput></para>
3086 </listitem>
3087 </itemizedlist></para>
3088
3089 <para>The VirtualBox SDK contains sample HTML code
3090 including:<itemizedlist>
3091 <listitem>
3092 <para>JavaScript library for embedding Flash content
3093 <computeroutput>SWFObject.js</computeroutput></para>
3094 </listitem>
3095
3096 <listitem>
3097 <para>Sample HTML page
3098 <computeroutput>webclient3.html</computeroutput></para>
3099 </listitem>
3100 </itemizedlist></para>
3101
3102 <sect2>
3103 <title>RDPWeb functions</title>
3104
3105 <para><computeroutput>RDPClientUI.swf</computeroutput> and
3106 <computeroutput>webclient.js</computeroutput> work with each other.
3107 JavaScript code is responsible for a proper SWF initialization,
3108 delivering mouse events to the SWF and processing resize requests from
3109 the SWF. On the other hand, the SWF contains a few JavaScript callable
3110 methods, which are used both from
3111 <computeroutput>webclient.js</computeroutput> and the user HTML
3112 page.</para>
3113
3114 <sect3>
3115 <title>JavaScript functions</title>
3116
3117 <para><computeroutput>webclient.js</computeroutput> contains helper
3118 functions. In the following table ElementId refers to an HTML
3119 element name or attribute, and Element to the HTML element itself.
3120 HTML code<programlisting>
3121 &lt;div id="FlashRDP"&gt;
3122 &lt;/div&gt;
3123</programlisting> would have ElementId equal to FlashRDP and Element equal to
3124 the div element.</para>
3125
3126 <para><itemizedlist>
3127 <listitem>
3128 <programlisting>RDPWebClient.embedSWF(SWFFileName, ElementId)</programlisting>
3129
3130 <para>Uses SWFObject library to replace the HTML element with
3131 the Flash movie.</para>
3132 </listitem>
3133
3134 <listitem>
3135 <programlisting>RDPWebClient.isRDPWebControlById(ElementId)</programlisting>
3136
3137 <para>Returns true if the given id refers to a RDPWeb Flash
3138 element.</para>
3139 </listitem>
3140
3141 <listitem>
3142 <programlisting>RDPWebClient.isRDPWebControlByElement(Element)</programlisting>
3143
3144 <para>Returns true if the given element is a RDPWeb Flash
3145 element.</para>
3146 </listitem>
3147
3148 <listitem>
3149 <programlisting>RDPWebClient.getFlashById(ElementId)</programlisting>
3150
3151 <para>Returns an element, which is referenced by the given id.
3152 This function will try to resolve any element, event if it is
3153 not a Flash movie.</para>
3154 </listitem>
3155 </itemizedlist></para>
3156 </sect3>
3157
3158 <sect3>
3159 <title>Flash methods callable from JavaScript</title>
3160
3161 <para><computeroutput>RDPWebClienUI.swf</computeroutput> methods can
3162 be called directly from JavaScript code on a HTML page.</para>
3163
3164 <itemizedlist>
3165 <listitem>
3166 <para>getProperty(Name)</para>
3167 </listitem>
3168
3169 <listitem>
3170 <para>setProperty(Name)</para>
3171 </listitem>
3172
3173 <listitem>
3174 <para>connect()</para>
3175 </listitem>
3176
3177 <listitem>
3178 <para>disconnect()</para>
3179 </listitem>
3180
3181 <listitem>
3182 <para>keyboardSendCAD()</para>
3183 </listitem>
3184 </itemizedlist>
3185 </sect3>
3186
3187 <sect3>
3188 <title>Flash JavaScript callbacks</title>
3189
3190 <para><computeroutput>RDPWebClienUI.swf</computeroutput> calls
3191 JavaScript functions provided by the HTML page.</para>
3192 </sect3>
3193 </sect2>
3194
3195 <sect2>
3196 <title>Embedding RDPWeb in an HTML page</title>
3197
3198 <para>It is necessary to include
3199 <computeroutput>webclient.js</computeroutput> helper script. If
3200 SWFObject library is used, the
3201 <computeroutput>swfobject.js</computeroutput> must be also included
3202 and RDPWeb flash content can be embedded to a Web page using dynamic
3203 HTML. The HTML must include a "placeholder", which consists of 2
3204 <computeroutput>div</computeroutput> elements.</para>
3205 </sect2>
3206 </sect1>
3207
3208 <sect1>
3209 <title>RDPWeb change log</title>
3210
3211 <sect2>
3212 <title>Version 1.2.28</title>
3213
3214 <itemizedlist>
3215 <listitem>
3216 <para><computeroutput>keyboardLayout</computeroutput>,
3217 <computeroutput>keyboardLayouts</computeroutput>,
3218 <computeroutput>UUID</computeroutput> properties.</para>
3219 </listitem>
3220
3221 <listitem>
3222 <para>Support for German keyboard layout on the client.</para>
3223 </listitem>
3224
3225 <listitem>
3226 <para>Rebranding to Oracle.</para>
3227 </listitem>
3228 </itemizedlist>
3229 </sect2>
3230
3231 <sect2>
3232 <title>Version 1.1.26</title>
3233
3234 <itemizedlist>
3235 <listitem>
3236 <para><computeroutput>webclient.js</computeroutput> is a part of
3237 the distribution package.</para>
3238 </listitem>
3239
3240 <listitem>
3241 <para><computeroutput>lastError</computeroutput> property.</para>
3242 </listitem>
3243
3244 <listitem>
3245 <para><computeroutput>keyboardSendScancodes</computeroutput> and
3246 <computeroutput>keyboardSendCAD</computeroutput> methods.</para>
3247 </listitem>
3248 </itemizedlist>
3249 </sect2>
3250
3251 <sect2>
3252 <title>Version 1.0.24</title>
3253
3254 <itemizedlist>
3255 <listitem>
3256 <para>Initial release.</para>
3257 </listitem>
3258 </itemizedlist>
3259 </sect2>
3260 </sect1>
3261 </chapter>
3262
3263 <chapter id="vbox-auth">
3264 <title>VirtualBox external authentication modules</title>
3265
3266 <para>VirtualBox supports arbitrary external modules to perform
3267 authentication. The module is used when the authentication method is set
3268 to "external" for a particular VM VRDE access and the library was
3269 specified with <computeroutput>VBoxManage setproperty
3270 vrdeauthlibrary</computeroutput>. Web service also use the authentication
3271 module which was specified with <computeroutput>VBoxManage setproperty
3272 websrvauthlibrary</computeroutput>.</para>
3273
3274 <para>This library will be loaded by the VM or web service process on
3275 demand, i.e. when the first remote desktop connection is made by a client
3276 or when a client that wants to use the web service logs on.</para>
3277
3278 <para>External authentication is the most flexible as the external handler
3279 can both choose to grant access to everyone (like the "null"
3280 authentication method would) and delegate the request to the guest
3281 authentication component. When delegating the request to the guest
3282 component, the handler will still be called afterwards with the option to
3283 override the result.</para>
3284
3285 <para>An authentication library is required to implement exactly one entry
3286 point:</para>
3287
3288 <screen>#include "VBoxAuth.h"
3289
3290/**
3291 * Authentication library entry point.
3292 *
3293 * Parameters:
3294 *
3295 * szCaller The name of the component which calls the library (UTF8).
3296 * pUuid Pointer to the UUID of the accessed virtual machine. Can be NULL.
3297 * guestJudgement Result of the guest authentication.
3298 * szUser User name passed in by the client (UTF8).
3299 * szPassword Password passed in by the client (UTF8).
3300 * szDomain Domain passed in by the client (UTF8).
3301 * fLogon Boolean flag. Indicates whether the entry point is called
3302 * for a client logon or the client disconnect.
3303 * clientId Server side unique identifier of the client.
3304 *
3305 * Return code:
3306 *
3307 * AuthResultAccessDenied Client access has been denied.
3308 * AuthResultAccessGranted Client has the right to use the
3309 * virtual machine.
3310 * AuthResultDelegateToGuest Guest operating system must
3311 * authenticate the client and the
3312 * library must be called again with
3313 * the result of the guest
3314 * authentication.
3315 *
3316 * Note: When 'fLogon' is 0, only pszCaller, pUuid and clientId are valid and the return
3317 * code is ignored.
3318 */
3319AuthResult AUTHCALL AuthEntry(
3320 const char *szCaller,
3321 PAUTHUUID pUuid,
3322 AuthGuestJudgement guestJudgement,
3323 const char *szUser,
3324 const char *szPassword
3325 const char *szDomain
3326 int fLogon,
3327 unsigned clientId)
3328{
3329 /* Process request against your authentication source of choice. */
3330 // if (authSucceeded(...))
3331 // return AuthResultAccessGranted;
3332 return AuthResultAccessDenied;
3333}</screen>
3334
3335 <para>A note regarding the UUID implementation of the
3336 <computeroutput>pUuid</computeroutput> argument: VirtualBox uses a
3337 consistent binary representation of UUIDs on all platforms. For this
3338 reason the integer fields comprising the UUID are stored as little endian
3339 values. If you want to pass such UUIDs to code which assumes that the
3340 integer fields are big endian (often also called network byte order), you
3341 need to adjust the contents of the UUID to e.g. achieve the same string
3342 representation. The required changes are:<itemizedlist>
3343 <listitem>
3344 <para>reverse the order of byte 0, 1, 2 and 3</para>
3345 </listitem>
3346
3347 <listitem>
3348 <para>reverse the order of byte 4 and 5</para>
3349 </listitem>
3350
3351 <listitem>
3352 <para>reverse the order of byte 6 and 7.</para>
3353 </listitem>
3354 </itemizedlist>Using this conversion you will get identical results when
3355 converting the binary UUID to the string representation.</para>
3356
3357 <para>The <computeroutput>guestJudgement</computeroutput> argument
3358 contains information about the guest authentication status. For the first
3359 call, it is always set to
3360 <computeroutput>AuthGuestNotAsked</computeroutput>. In case the
3361 <computeroutput>AuthEntry</computeroutput> function returns
3362 <computeroutput>AuthResultDelegateToGuest</computeroutput>, a guest
3363 authentication will be attempted and another call to the
3364 <computeroutput>AuthEntry</computeroutput> is made with its result. This
3365 can be either granted / denied or no judgement (the guest component chose
3366 for whatever reason to not make a decision). In case there is a problem
3367 with the guest authentication module (e.g. the Additions are not installed
3368 or not running or the guest did not respond within a timeout), the "not
3369 reacted" status will be returned.</para>
3370 </chapter>
3371
3372 <chapter id="javaapi">
3373 <title>Using Java API</title>
3374
3375 <sect1>
3376 <title>Introduction</title>
3377
3378 <para>VirtualBox can be controlled by a Java API, both locally
3379 (COM/XPCOM) and from remote (SOAP) clients. As with the Python bindings,
3380 a generic glue layer tries to hide all platform differences, allowing
3381 for source and binary compatibility on different platforms.</para>
3382 </sect1>
3383
3384 <sect1>
3385 <title>Requirements</title>
3386
3387 <para>To use the Java bindings, there are certain requirements depending
3388 on the platform. First of all, you need JDK 1.5 (Java 5) or later. Also
3389 please make sure that the version of the VirtualBox API .jar file
3390 exactly matches the version of VirtualBox you use. To avoid confusion,
3391 the VirtualBox API provides versioning in the Java package name, e.g.
3392 the package is named <computeroutput>org.virtualbox_3_2</computeroutput>
3393 for VirtualBox version 3.2. <itemizedlist>
3394 <listitem>
3395 <para><emphasis role="bold">XPCOM:</emphasis> - for all platforms,
3396 but Microsoft Windows. A Java bridge based on JavaXPCOM is shipped
3397 with VirtualBox. The classpath must contain
3398 <computeroutput>vboxjxpcom.jar</computeroutput> and the
3399 <computeroutput>vbox.home</computeroutput> property must be set to
3400 location where the VirtualBox binaries are. Please make sure that
3401 the JVM bitness matches bitness of VirtualBox you use as the XPCOM
3402 bridge relies on native libraries.</para>
3403
3404 <para>Start your application like this: <programlisting>
3405 java -cp vboxjxpcom.jar -Dvbox.home=/opt/virtualbox MyProgram
3406 </programlisting></para>
3407 </listitem>
3408
3409 <listitem>
3410 <para><emphasis role="bold">COM:</emphasis> - for Microsoft
3411 Windows. We rely on <computeroutput>Jacob</computeroutput> - a
3412 generic Java to COM bridge - which has to be installed seperately.
3413 See <ulink
3414 url="http://sourceforge.net/projects/jacob-project/">http://sourceforge.net/projects/jacob-project/</ulink>
3415 for installation instructions. Also, the VirtualBox provided
3416 <computeroutput>vboxjmscom.jar</computeroutput> must be in the
3417 class path.</para>
3418
3419 <para>Start your application like this: <programlisting>
3420 java -cp vboxjmscom.jar;c:\jacob\jacob.jar -Djava.library.path=c:\jacob MyProgram
3421 </programlisting></para>
3422 </listitem>
3423
3424 <listitem>
3425 <para><emphasis role="bold">SOAP</emphasis> - all platforms. Java
3426 6 is required, as it comes with builtin support for SOAP via the
3427 JAX-WS library. Also, the VirtualBox provided
3428 <computeroutput>vbojws.jar</computeroutput> must be in the class
3429 path. In the SOAP case it's possible to create several
3430 VirtualBoxManager instances to communicate with multiple
3431 VirtualBox hosts.</para>
3432
3433 <para>Start your application like this: <programlisting>
3434 java -cp vboxjws.jar MyProgram
3435 </programlisting></para>
3436 </listitem>
3437 </itemizedlist></para>
3438
3439 <para>Exception handling is also generalized by the generic glue layer,
3440 so that all methods could throw
3441 <computeroutput>VBoxException</computeroutput> containing human-readable
3442 text message (see <computeroutput>getMessage()</computeroutput> method)
3443 along with wrapped original exception (see
3444 <computeroutput>getWrapped()</computeroutput> method).</para>
3445 </sect1>
3446
3447 <sect1>
3448 <title>Example</title>
3449
3450 <para>This example shows a simple use case of the Java API. Differences
3451 for SOAP vs. local version are minimal, and limited to the connection
3452 setup phase (see <computeroutput>ws</computeroutput> variable). In the
3453 SOAP case it's possible to create several VirtualBoxManager instances to
3454 communicate with multiple VirtualBox hosts. <programlisting>
3455 import org.virtualbox_4_3.*;
3456 ....
3457 VirtualBoxManager mgr = VirtualBoxManager.createInstance(null);
3458 boolean ws = false; // or true, if we need the SOAP version
3459 if (ws)
3460 {
3461 String url = "http://myhost:18034";
3462 String user = "test";
3463 String passwd = "test";
3464 mgr.connect(url, user, passwd);
3465 }
3466 IVirtualBox vbox = mgr.getVBox();
3467 System.out.println("VirtualBox version: " + vbox.getVersion() + "\n");
3468 // get first VM name
3469 String m = vbox.getMachines().get(0).getName();
3470 System.out.println("\nAttempting to start VM '" + m + "'");
3471 // start it
3472 mgr.startVm(m, null, 7000);
3473
3474 if (ws)
3475 mgr.disconnect();
3476
3477 mgr.cleanup();
3478 </programlisting> For more a complete example, see
3479 <computeroutput>TestVBox.java</computeroutput>, shipped with the
3480 SDK. It contains exception handling and error printing code, which
3481 is important for reliable larger scale projects.</para>
3482 </sect1>
3483 </chapter>
3484
3485 <chapter>
3486 <title>License information</title>
3487
3488 <para>The sample code files shipped with the SDK are generally licensed
3489 liberally to make it easy for anyone to use this code for their own
3490 application code.</para>
3491
3492 <para>The Java files under
3493 <computeroutput>bindings/webservice/java/jax-ws/</computeroutput> (library
3494 files for the object-oriented web service) are, by contrast, licensed
3495 under the GNU Lesser General Public License (LGPL) V2.1.</para>
3496
3497 <para>See
3498 <computeroutput>sdk/bindings/webservice/java/jax-ws/src/COPYING.LIB</computeroutput>
3499 for the full text of the LGPL 2.1.</para>
3500
3501 <para>When in doubt, please refer to the individual source code files
3502 shipped with this SDK.</para>
3503 </chapter>
3504
3505 <chapter>
3506 <title>Main API change log</title>
3507
3508 <para>Generally, VirtualBox will maintain API compatibility within a major
3509 release; a major release occurs when the first or the second of the three
3510 version components of VirtualBox change (that is, in the x.y.z scheme, a
3511 major release is one where x or y change, but not when only z
3512 changes).</para>
3513
3514 <para>In other words, updates like those from 2.0.0 to 2.0.2 will not come
3515 with API breakages.</para>
3516
3517 <para>Migration between major releases most likely will lead to API
3518 breakage, so please make sure you updated code accordingly. The OOWS Java
3519 wrappers enforce that mechanism by putting VirtualBox classes into
3520 version-specific packages such as
3521 <computeroutput>org.virtualbox_2_2</computeroutput>. This approach allows
3522 for connecting to multiple VirtualBox versions simultaneously from the
3523 same Java application.</para>
3524
3525 <para>The following sections list incompatible changes that the Main API
3526 underwent since the original release of this SDK Reference with VirtualBox
3527 2.0. A change is deemed "incompatible" only if it breaks existing client
3528 code (e.g. changes in method parameter lists, renamed or removed
3529 interfaces and similar). In other words, the list does not contain new
3530 interfaces, methods or attributes or other changes that do not affect
3531 existing client code.</para>
3532
3533 <sect1>
3534 <title>Incompatible API changes with version 4.3</title>
3535
3536 <itemizedlist>
3537 <listitem>
3538 <para>The explicit medium locking methods
3539 <xref linkend="IMedium__lockRead" xreflabel="IMedium::lockRead()" />
3540 and <xref linkend="IMedium__lockWrite" xreflabel="IMedium::lockWrite()" />
3541 have been redesigned. They return a lock token object reference
3542 now, and calling the <xref linkend="IToken__abandon"
3543 xreflabel="IToken::abandon()" /> method (or letting the reference
3544 count to this object drop to 0) will unlock it. This eliminates
3545 the rather common problem that an API client crash left behind
3546 locks, and also improves the safety (API clients can't release
3547 locks they didn't obtain).</para>
3548 </listitem>
3549
3550 <listitem>
3551 <para>The parameter list of <xref linkend="IAppliance__write"
3552 xreflabel="IAppliance::write()" /> has been changed slightly, to
3553 allow multiple flags to be passed.</para>
3554 </listitem>
3555
3556 <listitem>
3557 <para><computeroutput>IMachine::delete</computeroutput>
3558 has been renamed to <xref linkend="IMachine__deleteConfig"
3559 xreflabel="IMachine::deleteConfig()" />, to improve API client
3560 binding compatibility.</para>
3561 </listitem>
3562
3563 <listitem>
3564 <para><computeroutput>IMachine::export</computeroutput>
3565 has been renamed to <xref linkend="IMachine__exportTo"
3566 xreflabel="IMachine::exportTo()" />, to improve API client binding
3567 compatibility.</para>
3568 </listitem>
3569
3570 <listitem>
3571 <para>For <xref linkend="IMachine__launchVMProcess"
3572 xreflabel="IMachine::launchVMProcess()"/> the meaning of the
3573 <computeroutput>type</computeroutput> parameter has changed slightly.
3574 Empty string now means that the per-VM or global default frontend
3575 is launched. Most callers of this method should use the empty string
3576 now, unless they really want to override the default and launch a
3577 particular frontend.</para>
3578 </listitem>
3579
3580 <listitem>
3581 <para>Medium management APIs were changed as follows:<itemizedlist>
3582
3583 <listitem>
3584 <para>The type of attribute
3585 <xref linkend="IMedium__variant" xreflabel="IMedium::variant()"/>
3586 changed from <computeroutput>unsigned long</computeroutput>
3587 to <computeroutput>safe-array MediumVariant</computeroutput>.
3588 It is an array of flags instead of a set of flags which were stored inside one variable.
3589 </para>
3590 </listitem>
3591
3592 <listitem>
3593 <para>The parameter list for <xref
3594 linkend="IMedium__cloneTo"
3595 xreflabel="IMedium::cloneTo()" /> was modified.</para>
3596 The type of parameter variant was changed from unsigned long to safe-array MediumVariant.
3597 </listitem>
3598
3599 <listitem>
3600 <para>The parameter list for <xref
3601 linkend="IMedium__createBaseStorage"
3602 xreflabel="IMedium::createBaseStorage()" /> was modified.</para>
3603 The type of parameter variant was changed from unsigned long to safe-array MediumVariant.
3604 </listitem>
3605
3606 <listitem>
3607 <para>The parameter list for <xref
3608 linkend="IMedium__createDiffStorage"
3609 xreflabel="IMedium::createDiffStorage()" /> was modified.</para>
3610 The type of parameter variant was changed from unsigned long to safe-array MediumVariant.
3611 </listitem>
3612
3613 <listitem>
3614 <para>The parameter list for <xref
3615 linkend="IMedium__cloneToBase"
3616 xreflabel="IMedium::cloneToBase()" /> was modified.</para>
3617 The type of parameter variant was changed from unsigned long to safe-array MediumVariant.
3618 </listitem>
3619 </itemizedlist></para>
3620 </listitem>
3621
3622 <listitem>
3623 <para>The type of attribute
3624 <xref linkend="IMediumFormat__capabilities"
3625 xreflabel="IMediumFormat::capabilities()"/>
3626 changed from <computeroutput>unsigned long</computeroutput>
3627 to <computeroutput>safe-array MediumFormatCapabilities</computeroutput>.
3628 It is an array of flags instead of a set of flags which were stored inside one variable.
3629 </para>
3630 </listitem>
3631
3632 <listitem>
3633 <para>The attribute <xref linkend="IMedium__logicalSize"
3634 xreflabel="IMedium::logicalSize()" /> now returns the logical
3635 size of exactly this medium object (whether it is a base or diff
3636 image). The old behavior was no longer acceptable, as each image
3637 can have a different capacity.</para>
3638 </listitem>
3639
3640 <listitem>
3641 <para>Guest control APIs - such as <xref linkend="IGuest"
3642 xreflabel="IGuest" />, <xref linkend="IGuestSession"
3643 xreflabel="IGuestSession" />, <xref linkend="IGuestProcess"
3644 xreflabel="IGuestProcess" /> and so on - now emit own events to provide
3645 clients much finer control and the ability to write own frontends for
3646 guest operations. The event <xref linkend="IGuestSessionEvent"
3647 xreflabel="IGuestSessionEvent" /> acts as an abstract base class
3648 for all guest control events. Certain guest events contain a
3649 <xref linkend="IVirtualBoxErrorInfo" xreflabel="IVirtualBoxErrorInfo" /> member
3650 to provide more information in case of an error happened on the
3651 guest side.</para>
3652 </listitem>
3653
3654 <listitem>
3655 <para>Guest control sessions on the guest started by <xref
3656 linkend="IGuest__createSession" xreflabel="IGuest::createSession()" />
3657 now are dedicated guest processes to provide more safety and performance
3658 for certain operations. Also, the <xref linkend="IGuest__createSession"
3659 xreflabel="IGuest::createSession()" /> call does not wait for the
3660 guest session being created anymore due to the dedicated guest session
3661 processes just mentioned. This also will enable webservice clients to
3662 handle guest session creation more gracefully. To wait for a guest
3663 session being started, use the newly added attribute <xref
3664 linkend="IGuestSession__status" xreflabel="IGuestSession::status()" />
3665 to query the current guest session status.</para>
3666 </listitem>
3667
3668 <listitem>
3669 <para>The <xref linkend="IGuestFile" xreflabel="IGuestFile" />
3670 APIs are now implemented to provide native guest file access from
3671 the host.</para>
3672 </listitem>
3673
3674 <listitem>
3675 <para>The parameter list for <xref
3676 linkend="IGuest__updateGuestAdditions"
3677 xreflabel="IMedium::updateGuestAdditions()" /> was modified.</para>
3678 It now supports specifying optional command line arguments for the
3679 Guest Additions installer performing the actual update on the guest.
3680 </listitem>
3681
3682 <listitem>
3683 <para>A new event <xref linkend="IGuestUserStateChangedEvent"
3684 xreflabel="IGuestUserStateChangedEvent" /> was introduced to provide
3685 guest user status updates to the host via event listeners. To use this
3686 event there needs to be at least the 4.3 Guest Additions installed on
3687 the guest. At the moment only the states "Idle" and "InUse" of the
3688 <xref linkend="GuestUserState"
3689 xreflabel="GuestUserState" /> enum are supported on
3690 Windows guests, starting at Windows 2000 SP2.</para>
3691 </listitem>
3692
3693 <listitem>
3694 <para>
3695 The attribute <xref linkend="IGuestSession__protocolVersion"
3696 xreflabel="IGuestSession::protocolVersion"/> was added to provide a
3697 convenient way to lookup the guest session's protocol version it
3698 uses to communicate with the installed Guest Additions on the guest.
3699 Older Guest Additions will set the protocol version to 1, whereas
3700 Guest Additions 4.3 will set the protocol version to 2. This might
3701 change in the future as new features arise.</para>
3702 </listitem>
3703
3704 <listitem>
3705 <para><computeroutput>IDisplay::getScreenResolution</computeroutput>
3706 has been extended to return the display position in the guest.</para>
3707 </listitem>
3708
3709 <listitem>
3710 <para>
3711 The <xref linkend="IUSBController" xreflabel="IUSBController"/>
3712 class is not a singleton of <xref linkend="IMachine" xreflabel="IMachine"/>
3713 anymore but <xref linkend="IMachine" xreflabel="IMachine"/> contains
3714 a list of USB controllers present in the VM. The USB device filter
3715 handling was moved to <xref linkend="IUSBDeviceFilters" xreflabel="IUSBDeviceFilters"/>.
3716 </para>
3717 </listitem>
3718 </itemizedlist>
3719 </sect1>
3720
3721 <sect1>
3722 <title>Incompatible API changes with version 4.2</title>
3723
3724 <itemizedlist>
3725 <listitem>
3726 <para>Guest control APIs for executing guest processes, working with
3727 guest files or directories have been moved to the newly introduced
3728 <xref linkend="IGuestSession" xreflabel="IGuestSession" /> interface which
3729 can be created by calling <xref linkend="IGuest__createSession"
3730 xreflabel="IGuest::createSession()" />.</para>
3731
3732 <para>A guest session will act as a
3733 guest user's impersonation so that the guest credentials only have to
3734 be provided when creating a new guest session. There can be up to 32
3735 guest sessions at once per VM, each session serving up to 2048 guest
3736 processes running or files opened.</para>
3737
3738 <para>Instead of working with process or directory handles before
3739 version 4.2, there now are the dedicated interfaces
3740 <xref linkend="IGuestProcess" xreflabel="IGuestProcess" />,
3741 <xref linkend="IGuestDirectory" xreflabel="IGuestDirectory" /> and
3742 <xref linkend="IGuestFile" xreflabel="IGuestFile" />. To retrieve more
3743 information of a file system object the new interface
3744 <xref linkend="IGuestFsObjInfo" xreflabel="IGuestFsObjInfo" /> has been
3745 introduced.</para>
3746
3747 <para>Even though the guest control API was changed it is backwards
3748 compatible so that it can be used with older installed Guest
3749 Additions. However, to use upcoming features like process termination
3750 or waiting for input / output new Guest Additions must be installed when
3751 these features got implemented.</para>
3752
3753 <para>The following limitations apply:
3754 <itemizedlist>
3755 <listitem><para>The <xref linkend="IGuestFile" xreflabel="IGuestFile" />
3756 interface is not fully implemented yet.</para>
3757 </listitem>
3758 <listitem><para>The symbolic link APIs
3759 <xref linkend="IGuestSession__symlinkCreate"
3760 xreflabel="IGuestSession::symlinkCreate()" />,
3761 <xref linkend="IGuestSession__symlinkExists"
3762 xreflabel="IGuestSession::symlinkExists()" />,
3763 <xref linkend="IGuestSession__symlinkRead"
3764 xreflabel="IGuestSession::symlinkRead()" />,
3765 <xref linkend="IGuestSession__symlinkRemoveDirectory"
3766 xreflabel="IGuestSession::symlinkRemoveDirectory()" /> and
3767 <xref linkend="IGuestSession__symlinkRemoveFile"
3768 xreflabel="IGuestSession::symlinkRemoveFile()" /> are not
3769 implemented yet.</para>
3770 </listitem>
3771 <listitem><para>The directory APIs
3772 <xref linkend="IGuestSession__directoryRemove"
3773 xreflabel="IGuestSession::directoryRemove()" />,
3774 <xref linkend="IGuestSession__directoryRemoveRecursive"
3775 xreflabel="IGuestSession::directoryRemoveRecursive()" />,
3776 <xref linkend="IGuestSession__directoryRename"
3777 xreflabel="IGuestSession::directoryRename()" /> and
3778 <xref linkend="IGuestSession__directorySetACL"
3779 xreflabel="IGuestSession::directorySetACL()" /> are not
3780 implemented yet.</para>
3781 </listitem>
3782 <listitem><para>The temporary file creation API
3783 <xref linkend="IGuestSession__fileCreateTemp"
3784 xreflabel="IGuestSession::fileCreateTemp()" /> is not
3785 implemented yet.</para>
3786 </listitem>
3787 <listitem><para>Guest process termination via
3788 <xref linkend="IProcess__terminate"
3789 xreflabel="IProcess::terminate()" /> is not
3790 implemented yet.</para>
3791 </listitem>
3792 <listitem><para>Waiting for guest process output via
3793 <xref linkend="ProcessWaitForFlag__StdOut" xreflabel="ProcessWaitForFlag::StdOut" />
3794 and <xref linkend="ProcessWaitForFlag__StdErr" xreflabel="ProcessWaitForFlag::StdErr" />
3795 is not implemented yet.</para><para>To wait for process output, <xref linkend="IProcess__read"
3796 xreflabel="IProcess::read()" /> with appropriate flags still can be used to periodically
3797 check for new output data to arrive. Note that <xref linkend="ProcessCreateFlag__WaitForStdOut"
3798 xreflabel="ProcessCreateFlag::WaitForStdOut" /> and / or
3799 <xref linkend="ProcessCreateFlag__WaitForStdErr" xreflabel="ProcessCreateFlag::WaitForStdErr" />
3800 need to be specified when creating a guest process via <xref linkend="IGuestSession__processCreate"
3801 xreflabel="IGuestSession::processCreate()" /> or <xref linkend="IGuestSession__processCreateEx"
3802 xreflabel="IGuestSession::processCreateEx()" />.</para>
3803 </listitem>
3804 <listitem>
3805 <para>ACL (Access Control List) handling in general is not implemented yet.</para>
3806 </listitem>
3807 </itemizedlist>
3808 </para>
3809 </listitem>
3810
3811 <listitem>
3812 <para>The <xref linkend="LockType" xreflabel="LockType" />
3813 enumeration now has an additional value <computeroutput>VM</computeroutput>
3814 which tells <xref linkend="IMachine__lockMachine"
3815 xreflabel="IMachine::lockMachine()" /> to create a full-blown
3816 object structure for running a VM. This was the previous behavior
3817 with <computeroutput>Write</computeroutput>, which now only creates
3818 the minimal object structure to save time and resources (at the
3819 moment the Console object is still created, but all sub-objects
3820 such as Display, Keyboard, Mouse, Guest are not.</para>
3821 </listitem>
3822
3823 <listitem>
3824 <para>Machines can be put in groups (actually an array of groups).
3825 The primary group affects the default placement of files belonging
3826 to a VM. <xref linkend="IVirtualBox__createMachine"
3827 xreflabel="IVirtualBox::createMachine()"/> and
3828 <xref linkend="IVirtualBox__composeMachineFilename"
3829 xreflabel="IVirtualBox::composeMachineFilename()"/> have been
3830 adjusted accordingly, the former taking an array of groups as an
3831 additional parameter and the latter taking a group as an additional
3832 parameter. The create option handling has been changed for those two
3833 methods, too.</para>
3834 </listitem>
3835
3836 <listitem>
3837 <para>The method IVirtualBox::findMedium() has been removed, since
3838 it provides a subset of the functionality of <xref linkend="IVirtualBox__openMedium"
3839 xreflabel="IVirtualBox::openMedium()" />.</para>
3840 </listitem>
3841
3842 <listitem>
3843 <para>The use of acronyms in API enumeration, interface, attribute
3844 and method names has been made much more consistent, previously they
3845 sometimes were lowercase and sometimes mixed case. They are now
3846 consistently all caps:<table>
3847 <title>Renamed identifiers in VirtualBox 4.2</title>
3848
3849 <tgroup cols="2" style="verywide">
3850 <tbody>
3851 <row>
3852 <entry><emphasis role="bold">Old name</emphasis></entry>
3853
3854 <entry><emphasis role="bold">New name</emphasis></entry>
3855 </row>
3856 <row>
3857 <entry>PointingHidType</entry>
3858 <entry><xref linkend="PointingHIDType" xreflabel="PointingHIDType"/></entry>
3859 </row>
3860 <row>
3861 <entry>KeyboardHidType</entry>
3862 <entry><xref linkend="KeyboardHIDType" xreflabel="KeyboardHIDType"/></entry>
3863 </row>
3864 <row>
3865 <entry>IPciAddress</entry>
3866 <entry><xref linkend="IPCIAddress" xreflabel="IPCIAddress"/></entry>
3867 </row>
3868 <row>
3869 <entry>IPciDeviceAttachment</entry>
3870 <entry><xref linkend="IPCIDeviceAttachment" xreflabel="IPCIDeviceAttachment"/></entry>
3871 </row>
3872 <row>
3873 <entry>IMachine::pointingHidType</entry>
3874 <entry><xref linkend="IMachine__pointingHIDType" xreflabel="IMachine::pointingHIDType"/></entry>
3875 </row>
3876 <row>
3877 <entry>IMachine::keyboardHidType</entry>
3878 <entry><xref linkend="IMachine__keyboardHIDType" xreflabel="IMachine::keyboardHIDType"/></entry>
3879 </row>
3880 <row>
3881 <entry>IMachine::hpetEnabled</entry>
3882 <entry><xref linkend="IMachine__HPETEnabled" xreflabel="IMachine::HPETEnabled"/></entry>
3883 </row>
3884 <row>
3885 <entry>IMachine::sessionPid</entry>
3886 <entry><xref linkend="IMachine__sessionPID" xreflabel="IMachine::sessionPID"/></entry>
3887 </row>
3888 <row>
3889 <entry>IMachine::ioCacheEnabled</entry>
3890 <entry><xref linkend="IMachine__IOCacheEnabled" xreflabel="IMachine::IOCacheEnabled"/></entry>
3891 </row>
3892 <row>
3893 <entry>IMachine::ioCacheSize</entry>
3894 <entry><xref linkend="IMachine__IOCacheSize" xreflabel="IMachine::IOCacheSize"/></entry>
3895 </row>
3896 <row>
3897 <entry>IMachine::pciDeviceAssignments</entry>
3898 <entry><xref linkend="IMachine__PCIDeviceAssignments" xreflabel="IMachine::PCIDeviceAssignments"/></entry>
3899 </row>
3900 <row>
3901 <entry>IMachine::attachHostPciDevice()</entry>
3902 <entry><xref linkend="IMachine__attachHostPCIDevice" xreflabel="IMachine::attachHostPCIDevice"/></entry>
3903 </row>
3904 <row>
3905 <entry>IMachine::detachHostPciDevice()</entry>
3906 <entry><xref linkend="IMachine__detachHostPCIDevice" xreflabel="IMachine::detachHostPCIDevice()"/></entry>
3907 </row>
3908 <row>
3909 <entry>IConsole::attachedPciDevices</entry>
3910 <entry><xref linkend="IConsole__attachedPCIDevices" xreflabel="IConsole::attachedPCIDevices"/></entry>
3911 </row>
3912 <row>
3913 <entry>IHostNetworkInterface::dhcpEnabled</entry>
3914 <entry><xref linkend="IHostNetworkInterface__DHCPEnabled" xreflabel="IHostNetworkInterface::DHCPEnabled"/></entry>
3915 </row>
3916 <row>
3917 <entry>IHostNetworkInterface::enableStaticIpConfig()</entry>
3918 <entry><xref linkend="IHostNetworkInterface__enableStaticIPConfig" xreflabel="IHostNetworkInterface::enableStaticIPConfig()"/></entry>
3919 </row>
3920 <row>
3921 <entry>IHostNetworkInterface::enableStaticIpConfigV6()</entry>
3922 <entry><xref linkend="IHostNetworkInterface__enableStaticIPConfigV6" xreflabel="IHostNetworkInterface::enableStaticIPConfigV6()"/></entry>
3923 </row>
3924 <row>
3925 <entry>IHostNetworkInterface::enableDynamicIpConfig()</entry>
3926 <entry><xref linkend="IHostNetworkInterface__enableDynamicIPConfig" xreflabel="IHostNetworkInterface::enableDynamicIPConfig()"/></entry>
3927 </row>
3928 <row>
3929 <entry>IHostNetworkInterface::dhcpRediscover()</entry>
3930 <entry><xref linkend="IHostNetworkInterface__DHCPRediscover" xreflabel="IHostNetworkInterface::DHCPRediscover()"/></entry>
3931 </row>
3932 <row>
3933 <entry>IHost::Acceleration3DAvailable</entry>
3934 <entry><xref linkend="IHost__acceleration3DAvailable" xreflabel="IHost::acceleration3DAvailable"/></entry>
3935 </row>
3936 <row>
3937 <entry>IGuestOSType::recommendedPae</entry>
3938 <entry><xref linkend="IGuestOSType__recommendedPAE" xreflabel="IGuestOSType::recommendedPAE"/></entry>
3939 </row>
3940 <row>
3941 <entry>IGuestOSType::recommendedDvdStorageController</entry>
3942 <entry><xref linkend="IGuestOSType__recommendedDVDStorageController" xreflabel="IGuestOSType::recommendedDVDStorageController"/></entry>
3943 </row>
3944 <row>
3945 <entry>IGuestOSType::recommendedDvdStorageBus</entry>
3946 <entry><xref linkend="IGuestOSType__recommendedDVDStorageBus" xreflabel="IGuestOSType::recommendedDVDStorageBus"/></entry>
3947 </row>
3948 <row>
3949 <entry>IGuestOSType::recommendedHdStorageController</entry>
3950 <entry><xref linkend="IGuestOSType__recommendedHDStorageController" xreflabel="IGuestOSType::recommendedHDStorageController"/></entry>
3951 </row>
3952 <row>
3953 <entry>IGuestOSType::recommendedHdStorageBus</entry>
3954 <entry><xref linkend="IGuestOSType__recommendedHDStorageBus" xreflabel="IGuestOSType::recommendedHDStorageBus"/></entry>
3955 </row>
3956 <row>
3957 <entry>IGuestOSType::recommendedUsbHid</entry>
3958 <entry><xref linkend="IGuestOSType__recommendedUSBHID" xreflabel="IGuestOSType::recommendedUSBHID"/></entry>
3959 </row>
3960 <row>
3961 <entry>IGuestOSType::recommendedHpet</entry>
3962 <entry><xref linkend="IGuestOSType__recommendedHPET" xreflabel="IGuestOSType::recommendedHPET"/></entry>
3963 </row>
3964 <row>
3965 <entry>IGuestOSType::recommendedUsbTablet</entry>
3966 <entry><xref linkend="IGuestOSType__recommendedUSBTablet" xreflabel="IGuestOSType::recommendedUSBTablet"/></entry>
3967 </row>
3968 <row>
3969 <entry>IGuestOSType::recommendedRtcUseUtc</entry>
3970 <entry><xref linkend="IGuestOSType__recommendedRTCUseUTC" xreflabel="IGuestOSType::recommendedRTCUseUTC"/></entry>
3971 </row>
3972 <row>
3973 <entry>IGuestOSType::recommendedUsb</entry>
3974 <entry><xref linkend="IGuestOSType__recommendedUSB" xreflabel="IGuestOSType::recommendedUSB"/></entry>
3975 </row>
3976 <row>
3977 <entry>INetworkAdapter::natDriver</entry>
3978 <entry><xref linkend="INetworkAdapter__NATEngine" xreflabel="INetworkAdapter::NATEngine"/></entry>
3979 </row>
3980 <row>
3981 <entry>IUSBController::enabledEhci</entry>
3982 <entry>IUSBController::enabledEHCI"</entry>
3983 </row>
3984 <row>
3985 <entry>INATEngine::tftpPrefix</entry>
3986 <entry><xref linkend="INATEngine__TFTPPrefix" xreflabel="INATEngine::TFTPPrefix"/></entry>
3987 </row>
3988 <row>
3989 <entry>INATEngine::tftpBootFile</entry>
3990 <entry><xref linkend="INATEngine__TFTPBootFile" xreflabel="INATEngine::TFTPBootFile"/></entry>
3991 </row>
3992 <row>
3993 <entry>INATEngine::tftpNextServer</entry>
3994 <entry><xref linkend="INATEngine__TFTPNextServer" xreflabel="INATEngine::TFTPNextServer"/></entry>
3995 </row>
3996 <row>
3997 <entry>INATEngine::dnsPassDomain</entry>
3998 <entry><xref linkend="INATEngine__DNSPassDomain" xreflabel="INATEngine::DNSPassDomain"/></entry>
3999 </row>
4000 <row>
4001 <entry>INATEngine::dnsProxy</entry>
4002 <entry><xref linkend="INATEngine__DNSProxy" xreflabel="INATEngine::DNSProxy"/></entry>
4003 </row>
4004 <row>
4005 <entry>INATEngine::dnsUseHostResolver</entry>
4006 <entry><xref linkend="INATEngine__DNSUseHostResolver" xreflabel="INATEngine::DNSUseHostResolver"/></entry>
4007 </row>
4008 <row>
4009 <entry>VBoxEventType::OnHostPciDevicePlug</entry>
4010 <entry><xref linkend="VBoxEventType__OnHostPCIDevicePlug" xreflabel="VBoxEventType::OnHostPCIDevicePlug"/></entry>
4011 </row>
4012 <row>
4013 <entry>ICPUChangedEvent::cpu</entry>
4014 <entry><xref linkend="ICPUChangedEvent__CPU" xreflabel="ICPUChangedEvent::CPU"/></entry>
4015 </row>
4016 <row>
4017 <entry>INATRedirectEvent::hostIp</entry>
4018 <entry><xref linkend="INATRedirectEvent__hostIP" xreflabel="INATRedirectEvent::hostIP"/></entry>
4019 </row>
4020 <row>
4021 <entry>INATRedirectEvent::guestIp</entry>
4022 <entry><xref linkend="INATRedirectEvent__guestIP" xreflabel="INATRedirectEvent::guestIP"/></entry>
4023 </row>
4024 <row>
4025 <entry>IHostPciDevicePlugEvent</entry>
4026 <entry><xref linkend="IHostPCIDevicePlugEvent" xreflabel="IHostPCIDevicePlugEvent"/></entry>
4027 </row>
4028 </tbody>
4029 </tgroup></table></para>
4030 </listitem>
4031 </itemizedlist>
4032 </sect1>
4033
4034 <sect1>
4035 <title>Incompatible API changes with version 4.1</title>
4036
4037 <itemizedlist>
4038 <listitem>
4039 <para>The method <xref linkend="IAppliance__importMachines"
4040 xreflabel="IAppliance::importMachines()" /> has one more parameter
4041 now, which allows to configure the import process in more detail.
4042 </para>
4043 </listitem>
4044
4045 <listitem>
4046 <para>The method <xref linkend="IVirtualBox__openMedium"
4047 xreflabel="IVirtualBox::openMedium()" /> has one more parameter
4048 now, which allows resolving duplicate medium UUIDs without the need
4049 for external tools.</para>
4050 </listitem>
4051
4052 <listitem>
4053 <para>The <xref linkend="INetworkAdapter" xreflabel="INetworkAdapter"/>
4054 interface has been cleaned up. The various methods to activate an
4055 attachment type have been replaced by the
4056 <xref linkend="INetworkAdapter__attachmentType" xreflabel="INetworkAdapter::attachmentType"/> setter.</para>
4057 <para>Additionally each attachment mode now has its own attribute,
4058 which means that host only networks no longer share the settings with
4059 bridged interfaces.</para>
4060 <para>To allow introducing new network attachment implementations
4061 without making API changes, the concept of a generic network
4062 attachment driver has been introduced, which is configurable through
4063 key/value properties.</para>
4064 </listitem>
4065
4066 <listitem>
4067 <para>This version introduces the guest facilities concept. A guest
4068 facility either represents a module or feature the guest is running or
4069 offering, which is defined by <xref linkend="AdditionsFacilityType"
4070 xreflabel="AdditionsFacilityType"/>. Each facility is member of a
4071 <xref linkend="AdditionsFacilityClass" xreflabel="AdditionsFacilityClass"/>
4072 and has a current status indicated by <xref linkend="AdditionsFacilityStatus"
4073 xreflabel="AdditionsFacilityStatus"/>, together with a timestamp (in ms) of
4074 the last status update.</para>
4075 <para>To address the above concept, the following changes were made:
4076 <itemizedlist>
4077 <listitem>
4078 <para>
4079 In the <xref linkend="IGuest" xreflabel="IGuest"/> interface, the following were removed:
4080 <itemizedlist>
4081 <listitem>
4082 <para>the <computeroutput>supportsSeamless</computeroutput> attribute;</para>
4083 </listitem>
4084 <listitem>
4085 <para>the <computeroutput>supportsGraphics</computeroutput> attribute;</para>
4086 </listitem>
4087 </itemizedlist>
4088 </para>
4089 </listitem>
4090 <listitem>
4091 <para>
4092 The function <xref linkend="IGuest__getFacilityStatus" xreflabel="IGuest::getFacilityStatus()"/>
4093 was added. It quickly provides a facility's status without the need to get the facility
4094 collection with <xref linkend="IGuest__facilities" xreflabel="IGuest::facilities"/>.
4095 </para>
4096 </listitem>
4097 <listitem>
4098 <para>
4099 The attribute <xref linkend="IGuest__facilities" xreflabel="IGuest::facilities"/>
4100 was added to provide an easy to access collection of all currently known guest
4101 facilities, that is, it contains all facilies where at least one status update was
4102 made since the guest was started.
4103 </para>
4104 </listitem>
4105 <listitem>
4106 <para>
4107 The interface <xref linkend="IAdditionsFacility" xreflabel="IAdditionsFacility"/>
4108 was added to represent a single facility returned by
4109 <xref linkend="IGuest__facilities" xreflabel="IGuest::facilities"/>.
4110 </para>
4111 </listitem>
4112 <listitem>
4113 <para>
4114 <xref linkend="AdditionsFacilityStatus" xreflabel="AdditionsFacilityStatus"/>
4115 was added to represent a facility's overall status.
4116 </para>
4117 </listitem>
4118 <listitem>
4119 <para>
4120 <xref linkend="AdditionsFacilityType" xreflabel="AdditionsFacilityType"/> and
4121 <xref linkend="AdditionsFacilityClass" xreflabel="AdditionsFacilityClass"/> were
4122 added to represent the facility's type and class.
4123 </para>
4124 </listitem>
4125 </itemizedlist>
4126 </para>
4127 </listitem>
4128 </itemizedlist>
4129 </sect1>
4130
4131 <sect1>
4132 <title>Incompatible API changes with version 4.0</title>
4133
4134 <itemizedlist>
4135 <listitem>
4136 <para>A new Java glue layer replacing the previous OOWS JAX-WS
4137 bindings was introduced. The new library allows for uniform code
4138 targeting both local (COM/XPCOM) and remote (SOAP) transports. Now,
4139 instead of <computeroutput>IWebsessionManager</computeroutput>, the
4140 new class <computeroutput>VirtualBoxManager</computeroutput> must be
4141 used. See <xref linkend="javaapi" xreflabel="Java API chapter" />
4142 for details.</para>
4143 </listitem>
4144
4145 <listitem>
4146 <para>The confusingly named and impractical session APIs were
4147 changed. In existing client code, the following changes need to be
4148 made:<itemizedlist>
4149 <listitem>
4150 <para>Replace any
4151 <computeroutput>IVirtualBox::openSession(uuidMachine,
4152 ...)</computeroutput> API call with the machine's <xref
4153 linkend="IMachine__lockMachine"
4154 xreflabel="IMachine::lockMachine()" /> call and a
4155 <computeroutput>LockType.Write</computeroutput> argument. The
4156 functionality is unchanged, but instead of "opening a direct
4157 session on a machine" all documentation now refers to
4158 "obtaining a write lock on a machine for the client
4159 session".</para>
4160 </listitem>
4161
4162 <listitem>
4163 <para>Similarly, replace any
4164 <computeroutput>IVirtualBox::openExistingSession(uuidMachine,
4165 ...)</computeroutput> call with the machine's <xref
4166 linkend="IMachine__lockMachine"
4167 xreflabel="IMachine::lockMachine()" /> call and a
4168 <computeroutput>LockType.Shared</computeroutput> argument.
4169 Whereas it was previously impossible to connect a client
4170 session to a running VM process in a race-free manner, the new
4171 API will atomically either write-lock the machine for the
4172 current session or establish a remote link to an existing
4173 session. Existing client code which tried calling both
4174 <computeroutput>openSession()</computeroutput> and
4175 <computeroutput>openExistingSession()</computeroutput> can now
4176 use this one call instead.</para>
4177 </listitem>
4178
4179 <listitem>
4180 <para>Third, replace any
4181 <computeroutput>IVirtualBox::openRemoteSession(uuidMachine,
4182 ...)</computeroutput> call with the machine's <xref
4183 linkend="IMachine__launchVMProcess"
4184 xreflabel="IMachine::launchVMProcess()" /> call. The
4185 functionality is unchanged.</para>
4186 </listitem>
4187
4188 <listitem>
4189 <para>The <xref linkend="SessionState"
4190 xreflabel="SessionState" /> enum was adjusted accordingly:
4191 "Open" is now "Locked", "Closed" is now "Unlocked", "Closing"
4192 is now "Unlocking".</para>
4193 </listitem>
4194 </itemizedlist></para>
4195 </listitem>
4196
4197 <listitem>
4198 <para>Virtual machines created with VirtualBox 4.0 or later no
4199 longer register their media in the global media registry in the
4200 <computeroutput>VirtualBox.xml</computeroutput> file. Instead, such
4201 machines list all their media in their own machine XML files. As a
4202 result, a number of media-related APIs had to be modified again.
4203 <itemizedlist>
4204 <listitem>
4205 <para>Neither <xref linkend="IVirtualBox__createHardDisk"
4206 xreflabel="IVirtualBox::createHardDisk()" /> nor <xref
4207 linkend="IVirtualBox__openMedium"
4208 xreflabel="IVirtualBox::openMedium()" /> register media
4209 automatically any more.</para>
4210 </listitem>
4211
4212 <listitem>
4213 <para><xref linkend="IMachine__attachDevice"
4214 xreflabel="IMachine::attachDevice()" /> and <xref
4215 linkend="IMachine__mountMedium"
4216 xreflabel="IMachine::mountMedium()" /> now take an IMedium
4217 object instead of a UUID as an argument. It is these two calls
4218 which add media to a registry now (either a machine registry
4219 for machines created with VirtualBox 4.0 or later or the
4220 global registry otherwise). As a consequence, if a medium is
4221 opened but never attached to a machine, it is no longer added
4222 to any registry any more.</para>
4223 </listitem>
4224
4225 <listitem>
4226 <para>To reduce code duplication, the APIs
4227 IVirtualBox::findHardDisk(), getHardDisk(), findDVDImage(),
4228 getDVDImage(), findFloppyImage() and getFloppyImage() have all
4229 been merged into IVirtualBox::findMedium(), and
4230 IVirtualBox::openHardDisk(), openDVDImage() and
4231 openFloppyImage() have all been merged into <xref
4232 linkend="IVirtualBox__openMedium"
4233 xreflabel="IVirtualBox::openMedium()" />.</para>
4234 </listitem>
4235
4236 <listitem>
4237 <para>The rare use case of changing the UUID and parent UUID
4238 of a medium previously handled by
4239 <computeroutput>openHardDisk()</computeroutput> is now in a
4240 separate IMedium::setIDs method.</para>
4241 </listitem>
4242
4243 <listitem>
4244 <para><computeroutput>ISystemProperties::get/setDefaultHardDiskFolder()</computeroutput>
4245 have been removed since disk images are now by default placed
4246 in each machine's folder.</para>
4247 </listitem>
4248
4249 <listitem>
4250 <para>The <xref linkend="ISystemProperties__infoVDSize"
4251 xreflabel="ISystemProperties::infoVDSize" /> attribute
4252 replaces the <computeroutput>getMaxVDISize()</computeroutput>
4253 API call; this now uses bytes instead of megabytes.</para>
4254 </listitem>
4255 </itemizedlist></para>
4256 </listitem>
4257
4258 <listitem>
4259 <para>Machine management APIs were enhanced as follows:<itemizedlist>
4260 <listitem>
4261 <para><xref linkend="IVirtualBox__createMachine"
4262 xreflabel="IVirtualBox::createMachine()" /> is no longer
4263 restricted to creating machines in the default "Machines"
4264 folder, but can now create machines at arbitrary locations.
4265 For this to work, the parameter list had to be changed.</para>
4266 </listitem>
4267
4268 <listitem>
4269 <para>The long-deprecated
4270 <computeroutput>IVirtualBox::createLegacyMachine()</computeroutput>
4271 API has been removed.</para>
4272 </listitem>
4273
4274 <listitem>
4275 <para>To reduce code duplication and for consistency with the
4276 aforementioned media APIs,
4277 <computeroutput>IVirtualBox::getMachine()</computeroutput> has
4278 been merged with <xref linkend="IVirtualBox__findMachine"
4279 xreflabel="IVirtualBox::findMachine()" />, and
4280 <computeroutput>IMachine::getSnapshot()</computeroutput> has
4281 been merged with <xref linkend="IMachine__findSnapshot"
4282 xreflabel="IMachine::findSnapshot()" />.</para>
4283 </listitem>
4284
4285 <listitem>
4286 <para><computeroutput>IVirtualBox::unregisterMachine()</computeroutput>
4287 was replaced with <xref linkend="IMachine__unregister"
4288 xreflabel="IMachine::unregister()" /> with additional
4289 functionality for cleaning up machine files.</para>
4290 </listitem>
4291
4292 <listitem>
4293 <para><computeroutput>IConsole::forgetSavedState</computeroutput>
4294 has been renamed to <xref
4295 linkend="IConsole__discardSavedState"
4296 xreflabel="IConsole::discardSavedState()" />.</para>
4297 </listitem>
4298 </itemizedlist></para>
4299 </listitem>
4300
4301 <listitem>
4302 <para>All event callbacks APIs were replaced with a new, generic
4303 event mechanism that can be used both locally (COM, XPCOM) and
4304 remotely (web services). Also, the new mechanism is usable from
4305 scripting languages and a local Java. See <xref linkend="IEvent"
4306 xreflabel="events" /> for details. The new concept will require
4307 changes to all clients that used event callbacks.</para>
4308 </listitem>
4309
4310 <listitem>
4311 <para><computeroutput>additionsActive()</computeroutput> was
4312 replaced with <xref linkend="IGuest__additionsRunLevel"
4313 xreflabel="additionsRunLevel()" /> and <xref
4314 linkend="IGuest__getAdditionsStatus"
4315 xreflabel="getAdditionsStatus()" /> in order to support a more
4316 detailed status of the current Guest Additions loading/readiness
4317 state. <xref linkend="IGuest__additionsVersion"
4318 xreflabel="IGuest::additionsVersion()" /> no longer returns the
4319 Guest Additions interface version but the installed Guest Additions
4320 version and revision in form of
4321 <computeroutput>3.3.0r12345</computeroutput>.</para>
4322 </listitem>
4323
4324 <listitem>
4325 <para>To address shared folders auto-mounting support, the following
4326 APIs were extended to require an additional
4327 <computeroutput>automount</computeroutput> parameter: <itemizedlist>
4328 <listitem>
4329 <para><xref linkend="IVirtualBox__createSharedFolder"
4330 xreflabel="IVirtualBox::createSharedFolder()" /></para>
4331 </listitem>
4332
4333 <listitem>
4334 <para><xref linkend="IMachine__createSharedFolder"
4335 xreflabel="IMachine::createSharedFolder()" /></para>
4336 </listitem>
4337
4338 <listitem>
4339 <para><xref linkend="IConsole__createSharedFolder"
4340 xreflabel="IConsole::createSharedFolder()" /></para>
4341 </listitem>
4342 </itemizedlist> Also, a new property named
4343 <computeroutput>autoMount</computeroutput> was added to the <xref
4344 linkend="ISharedFolder" xreflabel="ISharedFolder" />
4345 interface.</para>
4346 </listitem>
4347
4348 <listitem>
4349 <para>The appliance (OVF) APIs were enhanced as
4350 follows:<itemizedlist>
4351 <listitem>
4352 <para><computeroutput>IMachine::export</computeroutput>
4353 received an extra parameter
4354 <computeroutput>location</computeroutput>, which is used to
4355 decide for the disk naming.</para>
4356 </listitem>
4357
4358 <listitem>
4359 <para><xref linkend="IAppliance__write"
4360 xreflabel="IAppliance::write()" /> received an extra parameter
4361 <computeroutput>manifest</computeroutput>, which can suppress
4362 creating the manifest file on export.</para>
4363 </listitem>
4364
4365 <listitem>
4366 <para><xref linkend="IVFSExplorer__entryList"
4367 xreflabel="IVFSExplorer::entryList()" /> received two extra
4368 parameters <computeroutput>sizes</computeroutput> and
4369 <computeroutput>modes</computeroutput>, which contains the
4370 sizes (in bytes) and the file access modes (in octal form) of
4371 the returned files.</para>
4372 </listitem>
4373 </itemizedlist></para>
4374 </listitem>
4375
4376 <listitem>
4377 <para>Support for remote desktop access to virtual machines has been
4378 cleaned up to allow third party implementations of the remote
4379 desktop server. This is called the VirtualBox Remote Desktop
4380 Extension (VRDE) and can be added to VirtualBox by installing the
4381 corresponding extension package; see the VirtualBox User Manual for
4382 details.</para>
4383
4384 <para>The following API changes were made to support the VRDE
4385 interface: <itemizedlist>
4386 <listitem>
4387 <para><computeroutput>IVRDPServer</computeroutput> has been
4388 renamed to <xref linkend="IVRDEServer"
4389 xreflabel="IVRDEServer" />.</para>
4390 </listitem>
4391
4392 <listitem>
4393 <para><computeroutput>IRemoteDisplayInfo</computeroutput> has
4394 been renamed to <xref linkend="IVRDEServerInfo"
4395 xreflabel="IVRDEServerInfo" />.</para>
4396 </listitem>
4397
4398 <listitem>
4399 <para><xref linkend="IMachine__VRDEServer"
4400 xreflabel="IMachine::VRDEServer" /> replaces
4401 <computeroutput>VRDPServer.</computeroutput></para>
4402 </listitem>
4403
4404 <listitem>
4405 <para><xref linkend="IConsole__VRDEServerInfo"
4406 xreflabel="IConsole::VRDEServerInfo" /> replaces
4407 <computeroutput>RemoteDisplayInfo</computeroutput>.</para>
4408 </listitem>
4409
4410 <listitem>
4411 <para><xref linkend="ISystemProperties__VRDEAuthLibrary"
4412 xreflabel="ISystemProperties::VRDEAuthLibrary" /> replaces
4413 <computeroutput>RemoteDisplayAuthLibrary</computeroutput>.</para>
4414 </listitem>
4415
4416 <listitem>
4417 <para>The following methods have been implemented in
4418 <computeroutput>IVRDEServer</computeroutput> to support
4419 generic VRDE properties: <itemizedlist>
4420 <listitem>
4421 <para><xref linkend="IVRDEServer__setVRDEProperty"
4422 xreflabel="IVRDEServer::setVRDEProperty" /></para>
4423 </listitem>
4424
4425 <listitem>
4426 <para><xref linkend="IVRDEServer__getVRDEProperty"
4427 xreflabel="IVRDEServer::getVRDEProperty" /></para>
4428 </listitem>
4429
4430 <listitem>
4431 <para><xref linkend="IVRDEServer__VRDEProperties"
4432 xreflabel="IVRDEServer::VRDEProperties" /></para>
4433 </listitem>
4434 </itemizedlist></para>
4435
4436 <para>A few implementation-specific attributes of the old
4437 <computeroutput>IVRDPServer</computeroutput> interface have
4438 been removed and replaced with properties: <itemizedlist>
4439 <listitem>
4440 <para><computeroutput>IVRDPServer::Ports</computeroutput>
4441 has been replaced with the
4442 <computeroutput>"TCP/Ports"</computeroutput> property.
4443 The property value is a string, which contains a
4444 comma-separated list of ports or ranges of ports. Use a
4445 dash between two port numbers to specify a range.
4446 Example:
4447 <computeroutput>"5000,5010-5012"</computeroutput></para>
4448 </listitem>
4449
4450 <listitem>
4451 <para><computeroutput>IVRDPServer::NetAddress</computeroutput>
4452 has been replaced with the
4453 <computeroutput>"TCP/Address"</computeroutput> property.
4454 The property value is an IP address string. Example:
4455 <computeroutput>"127.0.0.1"</computeroutput></para>
4456 </listitem>
4457
4458 <listitem>
4459 <para><computeroutput>IVRDPServer::VideoChannel</computeroutput>
4460 has been replaced with the
4461 <computeroutput>"VideoChannel/Enabled"</computeroutput>
4462 property. The property value is either
4463 <computeroutput>"true"</computeroutput> or
4464 <computeroutput>"false"</computeroutput></para>
4465 </listitem>
4466
4467 <listitem>
4468 <para><computeroutput>IVRDPServer::VideoChannelQuality</computeroutput>
4469 has been replaced with the
4470 <computeroutput>"VideoChannel/Quality"</computeroutput>
4471 property. The property value is a string which contain a
4472 decimal number in range 10..100. Invalid values are
4473 ignored and the quality is set to the default value 75.
4474 Example: <computeroutput>"50"</computeroutput></para>
4475 </listitem>
4476 </itemizedlist></para>
4477 </listitem>
4478 </itemizedlist></para>
4479 </listitem>
4480
4481 <listitem>
4482 <para>The VirtualBox external authentication module interface has
4483 been updated and made more generic. Because of that,
4484 <computeroutput>VRDPAuthType</computeroutput> enumeration has been
4485 renamed to <xref linkend="AuthType" xreflabel="AuthType" />.</para>
4486 </listitem>
4487 </itemizedlist>
4488 </sect1>
4489
4490 <sect1>
4491 <title>Incompatible API changes with version 3.2</title>
4492
4493 <itemizedlist>
4494 <listitem>
4495 <para>The following interfaces were renamed for consistency:
4496 <itemizedlist>
4497 <listitem>
4498 <para>IMachine::getCpuProperty() is now <xref
4499 linkend="IMachine__getCPUProperty"
4500 xreflabel="IMachine::getCPUProperty()" />;</para>
4501 </listitem>
4502
4503 <listitem>
4504 <para>IMachine::setCpuProperty() is now <xref
4505 linkend="IMachine__setCPUProperty"
4506 xreflabel="IMachine::setCPUProperty()" />;</para>
4507 </listitem>
4508
4509 <listitem>
4510 <para>IMachine::getCpuIdLeaf() is now <xref
4511 linkend="IMachine__getCPUIDLeaf"
4512 xreflabel="IMachine::getCPUIDLeaf()" />;</para>
4513 </listitem>
4514
4515 <listitem>
4516 <para>IMachine::setCpuIdLeaf() is now <xref
4517 linkend="IMachine__setCPUIDLeaf"
4518 xreflabel="IMachine::setCPUIDLeaf()" />;</para>
4519 </listitem>
4520
4521 <listitem>
4522 <para>IMachine::removeCpuIdLeaf() is now <xref
4523 linkend="IMachine__removeCPUIDLeaf"
4524 xreflabel="IMachine::removeCPUIDLeaf()" />;</para>
4525 </listitem>
4526
4527 <listitem>
4528 <para>IMachine::removeAllCpuIdLeafs() is now <xref
4529 linkend="IMachine__removeAllCPUIDLeaves"
4530 xreflabel="IMachine::removeAllCPUIDLeaves()" />;</para>
4531 </listitem>
4532
4533 <listitem>
4534 <para>the CpuPropertyType enum is now <xref
4535 linkend="CPUPropertyType"
4536 xreflabel="CPUPropertyType" />.</para>
4537 </listitem>
4538
4539 <listitem>
4540 <para>IVirtualBoxCallback::onSnapshotDiscarded() is now
4541 IVirtualBoxCallback::onSnapshotDeleted.</para>
4542 </listitem>
4543 </itemizedlist></para>
4544 </listitem>
4545
4546 <listitem>
4547 <para>When creating a VM configuration with <xref
4548 linkend="IVirtualBox__createMachine"
4549 xreflabel="IVirtualBox::createMachine" />) it is now possible to
4550 ignore existing configuration files which would previously have
4551 caused a failure. For this the
4552 <computeroutput>override</computeroutput> parameter was
4553 added.</para>
4554 </listitem>
4555
4556 <listitem>
4557 <para>Deleting snapshots via <xref
4558 linkend="IConsole__deleteSnapshot"
4559 xreflabel="IConsole::deleteSnapshot()" /> is now possible while the
4560 associated VM is running in almost all cases. The API is unchanged,
4561 but client code that verifies machine states to determine whether
4562 snapshots can be deleted may need to be adjusted.</para>
4563 </listitem>
4564
4565 <listitem>
4566 <para>The IoBackendType enumeration was replaced with a boolean flag
4567 (see <xref linkend="IStorageController__useHostIOCache"
4568 xreflabel="IStorageController::useHostIOCache" />).</para>
4569 </listitem>
4570
4571 <listitem>
4572 <para>To address multi-monitor support, the following APIs were
4573 extended to require an additional
4574 <computeroutput>screenId</computeroutput> parameter: <itemizedlist>
4575 <listitem>
4576 <para><xref linkend="IMachine__querySavedThumbnailSize"
4577 xreflabel="IMachine::querySavedThumbnailSize()" /></para>
4578 </listitem>
4579
4580 <listitem>
4581 <para><xref linkend="IMachine__readSavedThumbnailToArray"
4582 xreflabel="IMachine::readSavedThumbnailToArray()" /></para>
4583 </listitem>
4584
4585 <listitem>
4586 <para><xref linkend="IMachine__querySavedScreenshotPNGSize"
4587 xreflabel="IMachine::querySavedScreenshotPNGSize()" /></para>
4588 </listitem>
4589
4590 <listitem>
4591 <para><xref linkend="IMachine__readSavedScreenshotPNGToArray"
4592 xreflabel="IMachine::readSavedScreenshotPNGToArray()" /></para>
4593 </listitem>
4594 </itemizedlist></para>
4595 </listitem>
4596
4597 <listitem>
4598 <para>The <computeroutput>shape</computeroutput> parameter of
4599 IConsoleCallback::onMousePointerShapeChange was changed from a
4600 implementation-specific pointer to a safearray, enabling scripting
4601 languages to process pointer shapes.</para>
4602 </listitem>
4603 </itemizedlist>
4604 </sect1>
4605
4606 <sect1>
4607 <title>Incompatible API changes with version 3.1</title>
4608
4609 <itemizedlist>
4610 <listitem>
4611 <para>Due to the new flexibility in medium attachments that was
4612 introduced with version 3.1 (in particular, full flexibility with
4613 attaching CD/DVD drives to arbitrary controllers), we seized the
4614 opportunity to rework all interfaces dealing with storage media to
4615 make the API more flexible as well as logical. The <xref
4616 linkend="IStorageController" xreflabel="IStorageController" />,
4617 <xref linkend="IMedium" xreflabel="IMedium" />, <xref
4618 linkend="IMediumAttachment" xreflabel="IMediumAttachment" /> and,
4619 <xref linkend="IMachine" xreflabel="IMachine" /> interfaces were
4620 affected the most. Existing code using them to configure storage and
4621 media needs to be carefully checked.</para>
4622
4623 <para>All media (hard disks, floppies and CDs/DVDs) are now
4624 uniformly handled through the <xref linkend="IMedium"
4625 xreflabel="IMedium" /> interface. The device-specific interfaces
4626 (<code>IHardDisk</code>, <code>IDVDImage</code>,
4627 <code>IHostDVDDrive</code>, <code>IFloppyImage</code> and
4628 <code>IHostFloppyDrive</code>) have been merged into IMedium; CD/DVD
4629 and floppy media no longer need special treatment. The device type
4630 of a medium determines in which context it can be used. Some
4631 functionality was moved to the other storage-related
4632 interfaces.</para>
4633
4634 <para><code>IMachine::attachHardDisk</code> and similar methods have
4635 been renamed and generalized to deal with any type of drive and
4636 medium. <xref linkend="IMachine__attachDevice"
4637 xreflabel="IMachine::attachDevice()" /> is the API method for adding
4638 any drive to a storage controller. The floppy and DVD/CD drives are
4639 no longer handled specially, and that means you can have more than
4640 one of them. As before, drives can only be changed while the VM is
4641 powered off. Mounting (or unmounting) removable media at runtime is
4642 possible with <xref linkend="IMachine__mountMedium"
4643 xreflabel="IMachine::mountMedium()" />.</para>
4644
4645 <para>Newly created virtual machines have no storage controllers
4646 associated with them. Even the IDE Controller needs to be created
4647 explicitly. The floppy controller is now visible as a separate
4648 controller, with a new storage bus type. For each storage bus type
4649 you can query the device types which can be attached, so that it is
4650 not necessary to hardcode any attachment rules.</para>
4651
4652 <para>This required matching changes e.g. in the callback interfaces
4653 (the medium specific change notification was replaced by a generic
4654 medium change notification) and removing associated enums (e.g.
4655 <code>DriveState</code>). In many places the incorrect use of the
4656 plural form "media" was replaced by "medium", to improve
4657 consistency.</para>
4658 </listitem>
4659
4660 <listitem>
4661 <para>Reading the <xref linkend="IMedium__state"
4662 xreflabel="IMedium::state" /> attribute no longer
4663 automatically performs an accessibility check; a new method <xref
4664 linkend="IMedium__refreshState"
4665 xreflabel="IMedium::refreshState()" /> does this. The attribute only
4666 returns the state any more.</para>
4667 </listitem>
4668
4669 <listitem>
4670 <para>There were substantial changes related to snapshots, triggered
4671 by the "branched snapshots" functionality introduced with version
4672 3.1. IConsole::discardSnapshot was renamed to <xref
4673 linkend="IConsole__deleteSnapshot"
4674 xreflabel="IConsole::deleteSnapshot()" />.
4675 IConsole::discardCurrentState and
4676 IConsole::discardCurrentSnapshotAndState were removed; corresponding
4677 new functionality is in <xref linkend="IConsole__restoreSnapshot"
4678 xreflabel="IConsole::restoreSnapshot()" />. Also, when <xref
4679 linkend="IConsole__takeSnapshot"
4680 xreflabel="IConsole::takeSnapshot()" /> is called on a running
4681 virtual machine, a live snapshot will be created. The old behavior
4682 was to temporarily pause the virtual machine while creating an
4683 online snapshot.</para>
4684 </listitem>
4685
4686 <listitem>
4687 <para>The <computeroutput>IVRDPServer</computeroutput>,
4688 <computeroutput>IRemoteDisplayInfo"</computeroutput> and
4689 <computeroutput>IConsoleCallback</computeroutput> interfaces were
4690 changed to reflect VRDP server ability to bind to one of available
4691 ports from a list of ports.</para>
4692
4693 <para>The <computeroutput>IVRDPServer::port</computeroutput>
4694 attribute has been replaced with
4695 <computeroutput>IVRDPServer::ports</computeroutput>, which is a
4696 comma-separated list of ports or ranges of ports.</para>
4697
4698 <para>An <computeroutput>IRemoteDisplayInfo::port"</computeroutput>
4699 attribute has been added for querying the actual port VRDP server
4700 listens on.</para>
4701
4702 <para>An IConsoleCallback::onRemoteDisplayInfoChange() notification
4703 callback has been added.</para>
4704 </listitem>
4705
4706 <listitem>
4707 <para>The parameter lists for the following functions were
4708 modified:<itemizedlist>
4709 <listitem>
4710 <para><xref linkend="IHost__removeHostOnlyNetworkInterface"
4711 xreflabel="IHost::removeHostOnlyNetworkInterface()" /></para>
4712 </listitem>
4713
4714 <listitem>
4715 <para><xref linkend="IHost__removeUSBDeviceFilter"
4716 xreflabel="IHost::removeUSBDeviceFilter()" /></para>
4717 </listitem>
4718 </itemizedlist></para>
4719 </listitem>
4720
4721 <listitem>
4722 <para>In the OOWS bindings for JAX-WS, the behavior of structures
4723 changed: for one, we implemented natural structures field access so
4724 you can just call a "get" method to obtain a field. Secondly,
4725 setters in structures were disabled as they have no expected effect
4726 and were at best misleading.</para>
4727 </listitem>
4728 </itemizedlist>
4729 </sect1>
4730
4731 <sect1>
4732 <title>Incompatible API changes with version 3.0</title>
4733
4734 <itemizedlist>
4735 <listitem>
4736 <para>In the object-oriented web service bindings for JAX-WS, proper
4737 inheritance has been introduced for some classes, so explicit
4738 casting is no longer needed to call methods from a parent class. In
4739 particular, IHardDisk and other classes now properly derive from
4740 <xref linkend="IMedium" xreflabel="IMedium" />.</para>
4741 </listitem>
4742
4743 <listitem>
4744 <para>All object identifiers (machines, snapshots, disks, etc)
4745 switched from GUIDs to strings (now still having string
4746 representation of GUIDs inside). As a result, no particular internal
4747 structure can be assumed for object identifiers; instead, they
4748 should be treated as opaque unique handles. This change mostly
4749 affects Java and C++ programs; for other languages, GUIDs are
4750 transparently converted to strings.</para>
4751 </listitem>
4752
4753 <listitem>
4754 <para>The uses of NULL strings have been changed greatly. All out
4755 parameters now use empty strings to signal a null value. For in
4756 parameters both the old NULL and empty string is allowed. This
4757 change was necessary to support more client bindings, especially
4758 using the web service API. Many of them either have no special NULL
4759 value or have trouble dealing with it correctly in the respective
4760 library code.</para>
4761 </listitem>
4762
4763 <listitem>
4764 <para>Accidentally, the <code>TSBool</code> interface still appeared
4765 in 3.0.0, and was removed in 3.0.2. This is an SDK bug, do not use
4766 the SDK for VirtualBox 3.0.0 for developing clients.</para>
4767 </listitem>
4768
4769 <listitem>
4770 <para>The type of <xref linkend="IVirtualBoxErrorInfo__resultCode"
4771 xreflabel="IVirtualBoxErrorInfo::resultCode" /> changed from
4772 <computeroutput>result</computeroutput> to
4773 <computeroutput>long</computeroutput>.</para>
4774 </listitem>
4775
4776 <listitem>
4777 <para>The parameter list of IVirtualBox::openHardDisk was
4778 changed.</para>
4779 </listitem>
4780
4781 <listitem>
4782 <para>The method IConsole::discardSavedState was renamed to
4783 IConsole::forgetSavedState, and a parameter was added.</para>
4784 </listitem>
4785
4786 <listitem>
4787 <para>The method IConsole::powerDownAsync was renamed to <xref
4788 linkend="IConsole__powerDown" xreflabel="IConsole::powerDown" />,
4789 and the previous method with that name was deleted. So effectively a
4790 parameter was added.</para>
4791 </listitem>
4792
4793 <listitem>
4794 <para>In the <xref linkend="IFramebuffer"
4795 xreflabel="IFramebuffer" /> interface, the following were
4796 removed:<itemizedlist>
4797 <listitem>
4798 <para>the <computeroutput>operationSupported</computeroutput>
4799 attribute;</para>
4800
4801 <para>(as a result, the
4802 <computeroutput>FramebufferAccelerationOperation</computeroutput>
4803 enum was no longer needed and removed as well);</para>
4804 </listitem>
4805
4806 <listitem>
4807 <para>the <computeroutput>solidFill()</computeroutput>
4808 method;</para>
4809 </listitem>
4810
4811 <listitem>
4812 <para>the <computeroutput>copyScreenBits()</computeroutput>
4813 method.</para>
4814 </listitem>
4815 </itemizedlist></para>
4816 </listitem>
4817
4818 <listitem>
4819 <para>In the <xref linkend="IDisplay" xreflabel="IDisplay" />
4820 interface, the following were removed:<itemizedlist>
4821 <listitem>
4822 <para>the
4823 <computeroutput>setupInternalFramebuffer()</computeroutput>
4824 method;</para>
4825 </listitem>
4826
4827 <listitem>
4828 <para>the <computeroutput>lockFramebuffer()</computeroutput>
4829 method;</para>
4830 </listitem>
4831
4832 <listitem>
4833 <para>the <computeroutput>unlockFramebuffer()</computeroutput>
4834 method;</para>
4835 </listitem>
4836
4837 <listitem>
4838 <para>the
4839 <computeroutput>registerExternalFramebuffer()</computeroutput>
4840 method.</para>
4841 </listitem>
4842 </itemizedlist></para>
4843 </listitem>
4844 </itemizedlist>
4845 </sect1>
4846
4847 <sect1>
4848 <title>Incompatible API changes with version 2.2</title>
4849
4850 <itemizedlist>
4851 <listitem>
4852 <para>Added explicit version number into JAX-WS Java package names,
4853 such as <computeroutput>org.virtualbox_2_2</computeroutput>,
4854 allowing connect to multiple VirtualBox clients from single Java
4855 application.</para>
4856 </listitem>
4857
4858 <listitem>
4859 <para>The interfaces having a "2" suffix attached to them with
4860 version 2.1 were renamed again to have that suffix removed. This
4861 time around, this change involves only the name, there are no
4862 functional differences.</para>
4863
4864 <para>As a result, IDVDImage2 is now IDVDImage; IHardDisk2 is now
4865 IHardDisk; IHardDisk2Attachment is now IHardDiskAttachment.</para>
4866
4867 <para>Consequentially, all related methods and attributes that had a
4868 "2" suffix have been renamed; for example, IMachine::attachHardDisk2
4869 now becomes IMachine::attachHardDisk().</para>
4870 </listitem>
4871
4872 <listitem>
4873 <para>IVirtualBox::openHardDisk has an extra parameter for opening a
4874 disk read/write or read-only.</para>
4875 </listitem>
4876
4877 <listitem>
4878 <para>The remaining collections were replaced by more performant
4879 safe-arrays. This affects the following collections:</para>
4880
4881 <itemizedlist>
4882 <listitem>
4883 <para>IGuestOSTypeCollection</para>
4884 </listitem>
4885
4886 <listitem>
4887 <para>IHostDVDDriveCollection</para>
4888 </listitem>
4889
4890 <listitem>
4891 <para>IHostFloppyDriveCollection</para>
4892 </listitem>
4893
4894 <listitem>
4895 <para>IHostUSBDeviceCollection</para>
4896 </listitem>
4897
4898 <listitem>
4899 <para>IHostUSBDeviceFilterCollection</para>
4900 </listitem>
4901
4902 <listitem>
4903 <para>IProgressCollection</para>
4904 </listitem>
4905
4906 <listitem>
4907 <para>ISharedFolderCollection</para>
4908 </listitem>
4909
4910 <listitem>
4911 <para>ISnapshotCollection</para>
4912 </listitem>
4913
4914 <listitem>
4915 <para>IUSBDeviceCollection</para>
4916 </listitem>
4917
4918 <listitem>
4919 <para>IUSBDeviceFilterCollection</para>
4920 </listitem>
4921 </itemizedlist>
4922 </listitem>
4923
4924 <listitem>
4925 <para>Since "Host Interface Networking" was renamed to "bridged
4926 networking" and host-only networking was introduced, all associated
4927 interfaces needed renaming as well. In detail:</para>
4928
4929 <itemizedlist>
4930 <listitem>
4931 <para>The HostNetworkInterfaceType enum has been renamed to
4932 <xref linkend="HostNetworkInterfaceMediumType"
4933 xreflabel="HostNetworkInterfaceMediumType" /></para>
4934 </listitem>
4935
4936 <listitem>
4937 <para>The IHostNetworkInterface::type attribute has been renamed
4938 to <xref linkend="IHostNetworkInterface__mediumType"
4939 xreflabel="IHostNetworkInterface::mediumType" /></para>
4940 </listitem>
4941
4942 <listitem>
4943 <para>INetworkAdapter::attachToHostInterface() has been renamed
4944 to INetworkAdapter::attachToBridgedInterface</para>
4945 </listitem>
4946
4947 <listitem>
4948 <para>In the IHost interface, createHostNetworkInterface() has
4949 been renamed to <xref
4950 linkend="IHost__createHostOnlyNetworkInterface"
4951 xreflabel="createHostOnlyNetworkInterface()" /></para>
4952 </listitem>
4953
4954 <listitem>
4955 <para>Similarly, removeHostNetworkInterface() has been renamed
4956 to <xref linkend="IHost__removeHostOnlyNetworkInterface"
4957 xreflabel="removeHostOnlyNetworkInterface()" /></para>
4958 </listitem>
4959 </itemizedlist>
4960 </listitem>
4961 </itemizedlist>
4962 </sect1>
4963
4964 <sect1>
4965 <title>Incompatible API changes with version 2.1</title>
4966
4967 <itemizedlist>
4968 <listitem>
4969 <para>With VirtualBox 2.1, error codes were added to many error
4970 infos that give the caller a machine-readable (numeric) feedback in
4971 addition to the error string that has always been available. This is
4972 an ongoing process, and future versions of this SDK reference will
4973 document the error codes for each method call.</para>
4974 </listitem>
4975
4976 <listitem>
4977 <para>The hard disk and other media interfaces were completely
4978 redesigned. This was necessary to account for the support of VMDK,
4979 VHD and other image types; since backwards compatibility had to be
4980 broken anyway, we seized the moment to redesign the interfaces in a
4981 more logical way.</para>
4982
4983 <itemizedlist>
4984 <listitem>
4985 <para>Previously, the old IHardDisk interface had several
4986 derivatives called IVirtualDiskImage, IVMDKImage, IVHDImage,
4987 IISCSIHardDisk and ICustomHardDisk for the various disk formats
4988 supported by VirtualBox. The new IHardDisk2 interface that comes
4989 with version 2.1 now supports all hard disk image formats
4990 itself.</para>
4991 </listitem>
4992
4993 <listitem>
4994 <para>IHardDiskFormat is a new interface to describe the
4995 available back-ends for hard disk images (e.g. VDI, VMDK, VHD or
4996 iSCSI). The IHardDisk2::format attribute can be used to find out
4997 the back-end that is in use for a particular hard disk image.
4998 ISystemProperties::hardDiskFormats[] contains a list of all
4999 back-ends supported by the system. <xref
5000 linkend="ISystemProperties__defaultHardDiskFormat"
5001 xreflabel="ISystemProperties::defaultHardDiskFormat" /> contains
5002 the default system format.</para>
5003 </listitem>
5004
5005 <listitem>
5006 <para>In addition, the new <xref linkend="IMedium"
5007 xreflabel="IMedium" /> interface is a generic interface for hard
5008 disk, DVD and floppy images that contains the attributes and
5009 methods shared between them. It can be considered a parent class
5010 of the more specific interfaces for those images, which are now
5011 IHardDisk2, IDVDImage2 and IFloppyImage2.</para>
5012
5013 <para>In each case, the "2" versions of these interfaces replace
5014 the earlier versions that did not have the "2" suffix.
5015 Previously, the IDVDImage and IFloppyImage interfaces were
5016 entirely unrelated to IHardDisk.</para>
5017 </listitem>
5018
5019 <listitem>
5020 <para>As a result, all parts of the API that previously
5021 referenced IHardDisk, IDVDImage or IFloppyImage or any of the
5022 old subclasses are gone and will have replacements that use
5023 IHardDisk2, IDVDImage2 and IFloppyImage2; see, for example,
5024 IMachine::attachHardDisk2.</para>
5025 </listitem>
5026
5027 <listitem>
5028 <para>In particular, the IVirtualBox::hardDisks2 array replaces
5029 the earlier IVirtualBox::hardDisks collection.</para>
5030 </listitem>
5031 </itemizedlist>
5032 </listitem>
5033
5034 <listitem>
5035 <para><xref linkend="IGuestOSType" xreflabel="IGuestOSType" /> was
5036 extended to group operating systems into families and for 64-bit
5037 support.</para>
5038 </listitem>
5039
5040 <listitem>
5041 <para>The <xref linkend="IHostNetworkInterface"
5042 xreflabel="IHostNetworkInterface" /> interface was completely
5043 rewritten to account for the changes in how Host Interface
5044 Networking is now implemented in VirtualBox 2.1.</para>
5045 </listitem>
5046
5047 <listitem>
5048 <para>The IVirtualBox::machines2[] array replaces the former
5049 IVirtualBox::machines collection.</para>
5050 </listitem>
5051
5052 <listitem>
5053 <para>Added <xref linkend="IHost__getProcessorFeature"
5054 xreflabel="IHost::getProcessorFeature()" /> and <xref
5055 linkend="ProcessorFeature" xreflabel="ProcessorFeature" />
5056 enumeration.</para>
5057 </listitem>
5058
5059 <listitem>
5060 <para>The parameter list for <xref
5061 linkend="IVirtualBox__createMachine"
5062 xreflabel="IVirtualBox::createMachine()" /> was modified.</para>
5063 </listitem>
5064
5065 <listitem>
5066 <para>Added IMachine::pushGuestProperty.</para>
5067 </listitem>
5068
5069 <listitem>
5070 <para>New attributes in IMachine: <xref
5071 linkend="IMachine__accelerate3DEnabled"
5072 xreflabel="accelerate3DEnabled" />, HWVirtExVPIDEnabled, <xref
5073 linkend="IMachine__guestPropertyNotificationPatterns"
5074 xreflabel="guestPropertyNotificationPatterns" />, <xref
5075 linkend="IMachine__CPUCount" xreflabel="CPUCount" />.</para>
5076 </listitem>
5077
5078 <listitem>
5079 <para>Added <xref linkend="IConsole__powerUpPaused"
5080 xreflabel="IConsole::powerUpPaused()" /> and <xref
5081 linkend="IConsole__getGuestEnteredACPIMode"
5082 xreflabel="IConsole::getGuestEnteredACPIMode()" />.</para>
5083 </listitem>
5084
5085 <listitem>
5086 <para>Removed ResourceUsage enumeration.</para>
5087 </listitem>
5088 </itemizedlist>
5089 </sect1>
5090 </chapter>
5091</book>
5092<!-- vim: set shiftwidth=2 tabstop=2 expandtab: -->
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette