Devel
  Threads by month 
                
            - ----- 2025 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
March 2010
- 90 participants
- 347 discussions
 
                        
                    31 Mar '10
                    
                        ---
 docs/contact.html.in |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/docs/contact.html.in b/docs/contact.html.in
index 09f8e35..c9dceda 100644
--- a/docs/contact.html.in
+++ b/docs/contact.html.in
@@ -21,7 +21,7 @@
 	</ul>
       </dd>
 
-      <dt><a href="">libvirt-users(a)redhat.com</a></dt>
+      <dt><a href="https://www.redhat.com/archives/libvirt-users/">libvirt-users(a)redhat.com</a></dt>
       <dd>This list a place for discussions involving libvirt <strong>users</strong>. Topics for discussion include
 	<ul>
 	  <li>Usage of libvirt / virsh</li>
-- 
1.6.3.3
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            2
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            [libvirt] [PATCH] Fix apibuild.py warning about virNWFilterLookupByUUIDString
                        
                        
by Matthias Bolte 31 Mar '10
                    by Matthias Bolte 31 Mar '10
31 Mar '10
                    
                        The function name was written with capital I in the Filter part.
---
 src/libvirt.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/libvirt.c b/src/libvirt.c
index 138dd31..5247fe7 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -11333,7 +11333,7 @@ error:
 }
 
 /**
- * virNWFIlterLookupByUUIDString:
+ * virNWFilterLookupByUUIDString:
  * @conn: pointer to the hypervisor connection
  * @uuidstr: the string UUID for the nwfilter
  *
-- 
1.6.3.3
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            2
                            
                          
                          
                            
    
                          
                        
                    
                    
                        Hi Daniel,
Can you please provide a valid patch for 'brctl' utility, to support
'vepa' mode.
 
 
Regards,
Srikanth.
                    
                  
                  
                          
                            
                            3
                            
                          
                          
                            
                            2
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            [libvirt] [PATCH] Blank out invalid interface names with escaped letters etc.
                        
                        
by Stefan Berger 31 Mar '10
                    by Stefan Berger 31 Mar '10
31 Mar '10
                    
                        Hunt interface names through a regular expression matcher to check whether they only contain valid characters.
Valid characters in this code are currently a-z,A-Z,0-9, and '_'.
Signed-off-by: Stefan Berger <stefanb(a)us.ibm.com>
---
 src/conf/domain_conf.c |   22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)
Index: libvirt-acl/src/conf/domain_conf.c
===================================================================
--- libvirt-acl.orig/src/conf/domain_conf.c
+++ libvirt-acl/src/conf/domain_conf.c
@@ -28,6 +28,7 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include <dirent.h>
+#include <regex.h>
 
 #include "virterror_internal.h"
 #include "datatypes.h"
@@ -1776,6 +1777,23 @@ cleanup:
 }
 
 
+static bool
+isValidIfname(const char *ifname) {
+    int rc = 1;
+    regex_t regex_ifname;
+
+    if (regcomp(®ex_ifname, "^[a-zA-Z0-9_]+$",
+                REG_NOSUB|REG_EXTENDED) != 0)
+        return 0;
+
+    if (regexec(®ex_ifname, ifname, 0, NULL, 0) != 0)
+        rc = 0;
+
+    regfree(®ex_ifname);
+    return rc;
+}
+
+
 
 /* Parse the XML definition for a network interface
  * @param node XML nodeset to parse for net definition
@@ -1859,8 +1877,10 @@ virDomainNetDefParseXML(virCapsPtr caps,
                        xmlStrEqual(cur->name, BAD_CAST "target")) {
                 ifname = virXMLPropString(cur, "dev");
                 if ((ifname != NULL) &&
-                    (STRPREFIX((const char*)ifname, "vnet"))) {
+                    ((STRPREFIX((const char*)ifname, "vnet")) ||
+                     (!isValidIfname(ifname)))) {
                     /* An auto-generated target name, blank it out */
+                    /* blank out invalid interface names */
                     VIR_FREE(ifname);
                 }
             } else if ((script == NULL) &&
                    
                  
                  
                          
                            
                            3
                            
                          
                          
                            
                            2
                            
                          
                          
                            
    
                          
                        
                     
                        
                    31 Mar '10
                    
                        virStrToLong* guarantees (via strtol) that the end pointer will be set
to the point at which parsing stopped (even on failure, this point is
the start of the input string).
* src/esx/esx_driver.c (esxGetVersion): Remove pointless
conditional.
* src/qemu/qemu_conf.c (qemuParseCommandLinePCI)
(qemuParseCommandLineUSB, qemuParseCommandLineSmp): Likewise.
* src/qemu/qemu_monitor_text.c
(qemuMonitorTextGetMigrationStatus): Likewise.
---
 src/esx/esx_driver.c         |    6 ++----
 src/qemu/qemu_conf.c         |   14 ++++++--------
 src/qemu/qemu_monitor_text.c |    6 +++---
 3 files changed, 11 insertions(+), 15 deletions(-)
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
index bbe8a51..f07493e 100644
--- a/src/esx/esx_driver.c
+++ b/src/esx/esx_driver.c
@@ -690,13 +690,11 @@ esxGetVersion(virConnectPtr conn, unsigned long *version)
     temp = (char *)priv->host->service->about->version;
     /* Expecting 'major.minor.release' format */
-    if (virStrToLong_ui(temp, &temp, 10, &major) < 0 || temp == NULL ||
-        *temp != '.') {
+    if (virStrToLong_ui(temp, &temp, 10, &major) < 0 || *temp != '.') {
         goto failure;
     }
-    if (virStrToLong_ui(temp + 1, &temp, 10, &minor) < 0 || temp == NULL ||
-        *temp != '.') {
+    if (virStrToLong_ui(temp + 1, &temp, 10, &minor) < 0 || *temp != '.') {
         goto failure;
     }
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 8f6f7ec..5d0b211 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -5217,14 +5217,14 @@ qemuParseCommandLinePCI(const char *val)
     }
     start = val + strlen("host=");
-    if (virStrToLong_i(start, &end, 16, &bus) < 0 || !end || *end != ':') {
+    if (virStrToLong_i(start, &end, 16, &bus) < 0 || *end != ':') {
         qemuReportError(VIR_ERR_INTERNAL_ERROR,
                         _("cannot extract PCI device bus '%s'"), val);
         VIR_FREE(def);
         goto cleanup;
     }
     start = end + 1;
-    if (virStrToLong_i(start, &end, 16, &slot) < 0 || !end || *end != '.') {
+    if (virStrToLong_i(start, &end, 16, &slot) < 0 || *end != '.') {
         qemuReportError(VIR_ERR_INTERNAL_ERROR,
                         _("cannot extract PCI device slot '%s'"), val);
         VIR_FREE(def);
@@ -5275,7 +5275,7 @@ qemuParseCommandLineUSB(const char *val)
     start = val + strlen("host:");
     if (strchr(start, ':')) {
-        if (virStrToLong_i(start, &end, 16, &first) < 0 || !end || *end != ':') {
+        if (virStrToLong_i(start, &end, 16, &first) < 0 || *end != ':') {
             qemuReportError(VIR_ERR_INTERNAL_ERROR,
                             _("cannot extract USB device vendor '%s'"), val);
             VIR_FREE(def);
@@ -5289,7 +5289,7 @@ qemuParseCommandLineUSB(const char *val)
             goto cleanup;
         }
     } else {
-        if (virStrToLong_i(start, &end, 10, &first) < 0 || !end || *end != '.') {
+        if (virStrToLong_i(start, &end, 10, &first) < 0 || *end != '.') {
             qemuReportError(VIR_ERR_INTERNAL_ERROR,
                              _("cannot extract USB device bus '%s'"), val);
             VIR_FREE(def);
@@ -5573,13 +5573,11 @@ qemuParseCommandLineSmp(virDomainDefPtr dom,
     for (i = 0; i < nkws; i++) {
         if (vals[i] == NULL) {
             if (i > 0 ||
-                virStrToLong_i(kws[i], &end, 10, &n) < 0 ||
-                !end || *end != '\0')
+                virStrToLong_i(kws[i], &end, 10, &n) < 0 || *end != '\0')
                 goto syntax;
             dom->vcpus = n;
         } else {
-            if (virStrToLong_i(vals[i], &end, 10, &n) < 0 ||
-                !end || *end != '\0')
+            if (virStrToLong_i(vals[i], &end, 10, &n) < 0 || *end != '\0')
                 goto syntax;
             if (STREQ(kws[i], "sockets"))
                 sockets = n;
diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c
index 1596e59..a199de7 100644
--- a/src/qemu/qemu_monitor_text.c
+++ b/src/qemu/qemu_monitor_text.c
@@ -1075,7 +1075,7 @@ int qemuMonitorTextGetMigrationStatus(qemuMonitorPtr mon,
                 goto done;
             tmp += strlen(MIGRATION_TRANSFER_PREFIX);
-            if (virStrToLong_ull(tmp, &end, 10, transferred) < 0 || !end) {
+            if (virStrToLong_ull(tmp, &end, 10, transferred) < 0) {
                 qemuReportError(VIR_ERR_INTERNAL_ERROR,
                                 _("cannot parse migration data transferred statistic %s"), tmp);
                 goto cleanup;
@@ -1087,7 +1087,7 @@ int qemuMonitorTextGetMigrationStatus(qemuMonitorPtr mon,
                 goto done;
             tmp += strlen(MIGRATION_REMAINING_PREFIX);
-            if (virStrToLong_ull(tmp, &end, 10, remaining) < 0 || !end) {
+            if (virStrToLong_ull(tmp, &end, 10, remaining) < 0) {
                 qemuReportError(VIR_ERR_INTERNAL_ERROR,
                                 _("cannot parse migration data remaining statistic %s"), tmp);
                 goto cleanup;
@@ -1098,7 +1098,7 @@ int qemuMonitorTextGetMigrationStatus(qemuMonitorPtr mon,
                 goto done;
             tmp += strlen(MIGRATION_TOTAL_PREFIX);
-            if (virStrToLong_ull(tmp, &end, 10, total) < 0 || !end) {
+            if (virStrToLong_ull(tmp, &end, 10, total) < 0) {
                 qemuReportError(VIR_ERR_INTERNAL_ERROR,
                                 _("cannot parse migration data total statistic %s"), tmp);
                 goto cleanup;
-- 
1.6.6.1
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            2
                            
                          
                          
                            
    
                          
                        
                    
                    
                        I need to get libvirt version. Using function
virConnecGetLibVersion(), I've return message like
   errore: unknown error
My system settings are:
   Kernel: 2.6.33
   Hypervisor: QEMU 0.12.3
   Libvirt: 0.7.6 (cloned from git)
The code that fails is in src/libvirt.c:1656
   =========================================================
       if (conn->driver->libvirtVersion) {
           ret = conn->driver->libvirtVersion(conn, libVer);
           if (ret < 0)
               goto error;
           return ret;
       }
       *libVer = LIBVIR_VERSION_NUMBER;
       ret = 0;
   error:
       virDispatchError(conn);
       return ret;
   }
   =========================================================
I noticed that conn->driver->libvirtVersion is NULL for all the
hypervisors except the remote one (src/remote/remote_driver.c), hence
it always dispatch an unknown error. I checked the current libvirt
code (always cloned from git), and the bug is also present.
Is this a bug, or this is a well known behavior?
If this is a bug, a possible solution could be to add the code line
   return ret;
before "error:" label. This is my debugged code
   =========================================================
       if (conn->driver->libvirtVersion) {
           ret = conn->driver->libvirtVersion(conn, libVer);
           if (ret < 0)
               goto error;
           return ret;
       }
       *libVer = LIBVIR_VERSION_NUMBER;
       ret = 0;
       return ret; /* POSSIBLE BUG SOLUTION */
   error:
       virDispatchError(conn);
       return ret;
   }
   =========================================================
Have a good day!
--
PAOLO SMIRAGLIA
Via Avigliana 13/5
10138 Torino (TO)
Tel: 0039 333 52 73 593
E-Mail: paolo.smiraglia(a)gmail.com
- - - - -
MSN: mastronano(a)hotmail.com
Jabber: mastronano(a)jabber.linux.it
Skype: paolo.smiraglia
                    
                  
                  
                          
                            
                            3
                            
                          
                          
                            
                            3
                            
                          
                          
                            
    
                          
                        
                    
                    
                        Call me lazy: some shells use exit (e.g. sh), others use quit (e.g. ftp),
but I never remember which.  So it's faster to write a patch to make
virsh take both than it is to take a 50-50 guess, and get it wrong
in half of my attempts.
* tools/virsh.c (commands): Add 'exit'.
* tools/virsh.pod: Document it.
---
So, how many 'exit's in virsh will it take for me to have saved
more time than I spent writing up this commit message and email? :)
 tools/virsh.c   |    1 +
 tools/virsh.pod |    2 +-
 2 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/tools/virsh.c b/tools/virsh.c
index ddcc052..5c56fa6 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -8254,6 +8254,7 @@ static const vshCmdDef commands[] = {
     {"pwd", cmdPwd, NULL, info_pwd},
 #endif
     {"quit", cmdQuit, NULL, info_quit},
+    {"exit", cmdQuit, NULL, info_quit},
     {"reboot", cmdReboot, opts_reboot, info_reboot},
     {"restore", cmdRestore, opts_restore, info_restore},
     {"resume", cmdResume, opts_resume, info_resume},
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 9434f31..fc4a70c 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -65,7 +65,7 @@ The following commands are generic i.e. not specific to a domain.
 This prints a small synopsis about all commands available for B<virsh>
 B<help> I<command> will print out a detailed help message on that command.
-=item B<quit>
+=item B<quit>, B<exit>
 quit this interactive terminal
-- 
1.6.6.1
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            2
                            
                          
                          
                            
    
                          
                        
                     
                        
                    31 Mar '10
                    
                        FYI,
>From 3cda0eb487d9cafa89cd7595ed0d43ee2a93b8fc Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering(a)redhat.com>
Date: Wed, 31 Mar 2010 16:32:38 +0200
Subject: [PATCH] maint: fix cpp indentation syntax-check failure
* src/esx/esx_vi_types.h: Filter through cppi.
---
 src/esx/esx_vi_types.h |    7 +++----
 1 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/src/esx/esx_vi_types.h b/src/esx/esx_vi_types.h
index a61cdc1..d3c7115 100644
--- a/src/esx/esx_vi_types.h
+++ b/src/esx/esx_vi_types.h
@@ -1,4 +1,3 @@
-
 /*
  * esx_vi_types.h: client for the VMware VI API 2.5 to manage ESX hosts
  *
@@ -50,7 +49,7 @@ typedef struct _esxVI_DateTime esxVI_DateTime;
 typedef struct _esxVI_Fault esxVI_Fault;
 typedef struct _esxVI_ManagedObjectReference esxVI_ManagedObjectReference;
-#include "esx_vi_types.generated.typedef"
+# include "esx_vi_types.generated.typedef"
@@ -70,7 +69,7 @@ enum _esxVI_Type {
     esxVI_Type_Fault,
     esxVI_Type_ManagedObjectReference,
-#include "esx_vi_types.generated.typeenum"
+# include "esx_vi_types.generated.typeenum"
     esxVI_Type_Other,
 };
@@ -294,6 +293,6 @@ int esxVI_ManagedObjectReference_Deserialize
-#include "esx_vi_types.generated.h"
+# include "esx_vi_types.generated.h"
 #endif /* __ESX_VI_TYPES_H__ */
--
1.7.0.3.513.gc8ed0
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            [libvirt] [PATCH] esx: Generate most SOAP mapping and improve inheritance handling
                        
                        
by Matthias Bolte 31 Mar '10
                    by Matthias Bolte 31 Mar '10
31 Mar '10
                    
                        The Python script generates the mappings based on the type descriptions
in the esx_vi_generator.input file.
This also improves the inheritance handling and allows to get rid of the
ugly, inflexible, and error prone _base/_super approach. Now every struct
that represents a SOAP type contains a _type member, that allows to
recreate C++-like dynamic dispatch for "method" calls in C.
---
 src/Makefile.am                |   23 +-
 src/esx/.gitignore             |    1 +
 src/esx/esx_driver.c           |   10 +-
 src/esx/esx_vi.c               |   51 +-
 src/esx/esx_vi.h               |    7 +-
 src/esx/esx_vi_generator.input |  426 ++++++++
 src/esx/esx_vi_generator.py    | 1025 ++++++++++++++++++
 src/esx/esx_vi_methods.c       |   44 +-
 src/esx/esx_vi_types.c         | 2258 +++++-----------------------------------
 src/esx/esx_vi_types.h         | 1090 +-------------------
 10 files changed, 1868 insertions(+), 3067 deletions(-)
 create mode 100644 src/esx/.gitignore
 create mode 100644 src/esx/esx_vi_generator.input
 create mode 100755 src/esx/esx_vi_generator.py
diff --git a/src/Makefile.am b/src/Makefile.am
index c661a5c..54792b4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -26,6 +26,8 @@ INCLUDES =							\
 
 EXTRA_DIST = $(conf_DATA)
 
+BUILT_SOURCES =
+
 if WITH_NETWORK
 UUID=$(shell uuidgen 2>/dev/null)
 endif
@@ -250,6 +252,20 @@ ESX_DRIVER_SOURCES =						\
 		esx/esx_vi_types.c esx/esx_vi_types.h		\
 		esx/esx_vmx.c esx/esx_vmx.h
 
+ESX_DRIVER_GENERATED =							\
+		esx/esx_vi_types.generated.c				\
+		esx/esx_vi_types.generated.h				\
+		esx/esx_vi_types.generated.typedef			\
+		esx/esx_vi_types.generated.typeenum			\
+		esx/esx_vi_types.generated.typetostring			\
+		esx/esx_vi_types.generated.typefromstring
+
+ESX_DRIVER_EXTRA_DIST =						\
+		esx/README						\
+		esx/esx_vi_generator.input				\
+		esx/esx_vi_generator.py					\
+		$(ESX_DRIVER_GENERATED)
+
 NETWORK_DRIVER_SOURCES =					\
 		network/bridge_driver.h network/bridge_driver.c
 
@@ -594,7 +610,10 @@ libvirt_driver_one_la_SOURCES = $(ONE_DRIVER_SOURCES)
 endif
 
 
+BUILT_SOURCES += $(ESX_DRIVER_GENERATED)
 
+$(ESX_DRIVER_GENERATED): $(srcdir)/esx/esx_vi_generator.input $(srcdir)/esx/esx_vi_generator.py
+	-srcdir=$(srcdir) $(srcdir)/esx/esx_vi_generator.py
 
 if WITH_ESX
 if WITH_DRIVER_MODULES
@@ -610,6 +629,7 @@ if WITH_DRIVER_MODULES
 libvirt_driver_esx_la_LDFLAGS += -module -avoid-version
 endif
 libvirt_driver_esx_la_SOURCES = $(ESX_DRIVER_SOURCES)
+libvirt_driver_esx_la_DEPENDENCIES = $(ESX_DRIVER_GENERATED)
 endif
 
 if WITH_NETWORK
@@ -784,6 +804,7 @@ EXTRA_DIST +=							\
 		$(VBOX_DRIVER_SOURCES)				\
 		$(XENAPI_DRIVER_SOURCES)			\
 		$(ESX_DRIVER_SOURCES)				\
+		$(ESX_DRIVER_EXTRA_DIST)			\
 		$(NETWORK_DRIVER_SOURCES)			\
 		$(INTERFACE_DRIVER_SOURCES)			\
 		$(STORAGE_DRIVER_SOURCES)			\
@@ -867,7 +888,7 @@ EXTRA_DIST += \
   libvirt_macvtap.syms		\
   libvirt_daemon.syms
 
-BUILT_SOURCES = libvirt.syms
+BUILT_SOURCES += libvirt.syms
 
 libvirt.syms: libvirt_public.syms $(USED_SYM_FILES)
 	rm -f $@-tmp $@
diff --git a/src/esx/.gitignore b/src/esx/.gitignore
new file mode 100644
index 0000000..29e1d48
--- /dev/null
+++ b/src/esx/.gitignore
@@ -0,0 +1 @@
+*.generated.*
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
index bbe8a51..663c560 100644
--- a/src/esx/esx_driver.c
+++ b/src/esx/esx_driver.c
@@ -1924,8 +1924,14 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)
              perfEntityMetric = perfEntityMetric->_next) {
             VIR_DEBUG0("perfEntityMetric ...");
 
-            for (perfMetricIntSeries = perfEntityMetric->value;
-                 perfMetricIntSeries != NULL;
+            perfMetricIntSeries =
+              esxVI_PerfMetricIntSeries_DynamicCast(perfEntityMetric->value);
+
+            if (perfMetricIntSeries == NULL) {
+                VIR_ERROR0("QueryPerf returned object with unexpected type");
+            }
+
+            for (; perfMetricIntSeries != NULL;
                  perfMetricIntSeries = perfMetricIntSeries->_next) {
                 VIR_DEBUG0("perfMetricIntSeries ...");
 
diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c
index 326add7..c1fd4b4 100644
--- a/src/esx/esx_vi.c
+++ b/src/esx/esx_vi.c
@@ -3,7 +3,7 @@
  * esx_vi.c: client for the VMware VI API 2.5 to manage ESX hosts
  *
  * Copyright (C) 2010 Red Hat, Inc.
- * Copyright (C) 2009 Matthias Bolte <matthias.bolte(a)googlemail.com>
+ * Copyright (C) 2009-2010 Matthias Bolte <matthias.bolte(a)googlemail.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -480,12 +480,12 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url,
          dynamicProperty = dynamicProperty->_next) {
         if (STREQ(dynamicProperty->name, "vmFolder")) {
             if (esxVI_ManagedObjectReference_CastFromAnyType
-                  (dynamicProperty->val, &ctx->vmFolder, "Folder")) {
+                  (dynamicProperty->val, &ctx->vmFolder)) {
                 goto failure;
             }
         } else if (STREQ(dynamicProperty->name, "hostFolder")) {
             if (esxVI_ManagedObjectReference_CastFromAnyType
-                  (dynamicProperty->val, &ctx->hostFolder, "Folder")) {
+                  (dynamicProperty->val, &ctx->hostFolder)) {
                 goto failure;
             }
         } else {
@@ -725,6 +725,21 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName,
                                  "Call to '%s' returned an empty result, "
                                  "expecting a non-empty result", methodName);
                     goto failure;
+                } else if ((*response)->node->next != NULL) {
+                    ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR,
+                                 "Call to '%s' returned a list, expecting "
+                                 "exactly one item", methodName);
+                    goto failure;
+                }
+
+                break;
+
+              case esxVI_Occurrence_RequiredList:
+                if ((*response)->node == NULL) {
+                    ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR,
+                                 "Call to '%s' returned an empty result, "
+                                 "expecting a non-empty result", methodName);
+                    goto failure;
                 }
 
                 break;
@@ -740,7 +755,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName,
 
                 break;
 
-              case esxVI_Occurrence_List:
+              case esxVI_Occurrence_OptionalList:
                 /* Any amount of items is valid */
                 break;
 
@@ -821,10 +836,11 @@ esxVI_Enumeration_CastFromAnyType(const esxVI_Enumeration *enumeration,
 
     *value = 0; /* undefined */
 
-    if (STRNEQ(anyType->other, enumeration->type)) {
+    if (anyType->type != enumeration->type) {
         ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR,
-                     "Expecting type '%s' but found '%s'", enumeration->type,
-                     anyType->other);
+                     "Expecting type '%s' but found '%s'",
+                     esxVI_Type_ToString(enumeration->type),
+                     esxVI_Type_ToString(anyType->type));
         return -1;
     }
 
@@ -837,7 +853,7 @@ esxVI_Enumeration_CastFromAnyType(const esxVI_Enumeration *enumeration,
 
     ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR,
                  "Unknown value '%s' for %s", anyType->value,
-                 enumeration->type);
+                 esxVI_Type_ToString(enumeration->type));
 
     return -1;
 }
@@ -870,7 +886,8 @@ esxVI_Enumeration_Serialize(const esxVI_Enumeration *enumeration,
         return -1;
     }
 
-    ESV_VI__XML_TAG__OPEN(output, element, enumeration->type);
+    ESV_VI__XML_TAG__OPEN(output, element,
+                          esxVI_Type_ToString(enumeration->type));
 
     virBufferAdd(output, name, -1);
 
@@ -906,7 +923,7 @@ esxVI_Enumeration_Deserialize(const esxVI_Enumeration *enumeration,
     }
 
     ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "Unknown value '%s' for %s",
-                 name, enumeration->type);
+                 name, esxVI_Type_ToString(enumeration->type));
 
   cleanup:
     VIR_FREE(name);
@@ -1009,7 +1026,7 @@ esxVI_List_CastFromAnyType(esxVI_AnyType *anyType, esxVI_List **list,
         return -1;
     }
 
-    for (childNode = anyType->_node->children; childNode != NULL;
+    for (childNode = anyType->node->children; childNode != NULL;
          childNode = childNode->next) {
         if (childNode->type != XML_ELEMENT_NODE) {
             ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR,
@@ -1151,7 +1168,7 @@ esxVI_BuildFullTraversalSpecItem(esxVI_SelectionSpec **fullTraversalSpecList,
     }
 
     if (esxVI_TraversalSpec_Alloc(&traversalSpec) < 0 ||
-        esxVI_String_DeepCopyValue(&traversalSpec->_base->name, name) < 0 ||
+        esxVI_String_DeepCopyValue(&traversalSpec->name, name) < 0 ||
         esxVI_String_DeepCopyValue(&traversalSpec->type, type) < 0 ||
         esxVI_String_DeepCopyValue(&traversalSpec->path, path) < 0) {
         goto failure;
@@ -1177,7 +1194,8 @@ esxVI_BuildFullTraversalSpecItem(esxVI_SelectionSpec **fullTraversalSpecList,
     }
 
     if (esxVI_SelectionSpec_AppendToList(fullTraversalSpecList,
-                                         traversalSpec->_base) < 0) {
+                                         esxVI_SelectionSpec_DynamicCast
+                                           (traversalSpec)) < 0) {
         goto failure;
     }
 
@@ -1721,8 +1739,7 @@ esxVI_LookupResourcePoolByHostSystem
          dynamicProperty = dynamicProperty->_next) {
         if (STREQ(dynamicProperty->name, "parent")) {
             if (esxVI_ManagedObjectReference_CastFromAnyType
-                  (dynamicProperty->val, &managedObjectReference,
-                   "ComputeResource") < 0) {
+                  (dynamicProperty->val, &managedObjectReference) < 0) {
                 goto failure;
             }
 
@@ -1756,7 +1773,7 @@ esxVI_LookupResourcePoolByHostSystem
          dynamicProperty = dynamicProperty->_next) {
         if (STREQ(dynamicProperty->name, "resourcePool")) {
             if (esxVI_ManagedObjectReference_CastFromAnyType
-                  (dynamicProperty->val, resourcePool, "ResourcePool") < 0) {
+                  (dynamicProperty->val, resourcePool) < 0) {
                 goto failure;
             }
 
@@ -2231,7 +2248,7 @@ esxVI_LookupPendingTaskInfoListByVirtualMachine
          dynamicProperty = dynamicProperty->_next) {
         if (STREQ(dynamicProperty->name, "recentTask")) {
             if (esxVI_ManagedObjectReference_CastListFromAnyType
-                  (dynamicProperty->val, &recentTaskList, "Task") < 0) {
+                  (dynamicProperty->val, &recentTaskList) < 0) {
                 goto failure;
             }
 
diff --git a/src/esx/esx_vi.h b/src/esx/esx_vi.h
index 1349a1b..555dad5 100644
--- a/src/esx/esx_vi.h
+++ b/src/esx/esx_vi.h
@@ -2,7 +2,7 @@
 /*
  * esx_vi.h: client for the VMware VI API 2.5 to manage ESX hosts
  *
- * Copyright (C) 2009 Matthias Bolte <matthias.bolte(a)googlemail.com>
+ * Copyright (C) 2009-2010 Matthias Bolte <matthias.bolte(a)googlemail.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -61,8 +61,9 @@ enum _esxVI_ProductVersion {
 enum _esxVI_Occurrence {
     esxVI_Occurrence_Undefined = 0,
     esxVI_Occurrence_RequiredItem,
+    esxVI_Occurrence_RequiredList,
     esxVI_Occurrence_OptionalItem,
-    esxVI_Occurrence_List,
+    esxVI_Occurrence_OptionalList,
     esxVI_Occurrence_None
 };
 
@@ -132,7 +133,7 @@ struct _esxVI_EnumerationValue {
 };
 
 struct _esxVI_Enumeration {
-    const char *type;
+    esxVI_Type type;
     esxVI_EnumerationValue values[10];
 };
 
diff --git a/src/esx/esx_vi_generator.input b/src/esx/esx_vi_generator.input
new file mode 100644
index 0000000..06dddbf
--- /dev/null
+++ b/src/esx/esx_vi_generator.input
@@ -0,0 +1,426 @@
+#
+# Definitions of vSphere API 2.5 enumeration and objects types used as input
+# for the esx_vi_generator.py script.
+#
+# This format is line-based, so end-of-line is important.
+#
+#
+# Enumeration definition:
+#
+# enum <name>
+#     <value>
+#     ...
+# end
+#
+#
+# Object definition:
+#
+# object <name> [extends <name>]
+#     <type> <name> <occurrence>
+#     ...
+# end
+#
+# Possible values for the <occurrence> field are:
+#
+#  - r  for a required item
+#  - rl for a required list
+#  - o  for an optional item
+#  - ol for an optional list
+#  - i  for an ignored item or list
+#
+# Object member sequence has to match the WSDL sequence
+#
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# Enumerations
+#
+
+enum ManagedEntityStatus
+    gray
+    green
+    yellow
+    red
+end
+
+
+enum ObjectUpdateKind
+    modify
+    enter
+    leave
+end
+
+
+enum PerfStatsType
+    absolute
+    delta
+    rate
+end
+
+
+enum PerfSummaryType
+    average
+    maximum
+    minimum
+    latest
+    summation
+    none
+end
+
+
+enum PropertyChangeOp
+    add
+    remove
+    assign
+    indirectRemove
+end
+
+
+enum SharesLevel
+    low
+    normal
+    high
+    custom
+end
+
+
+enum TaskInfoState
+    queued
+    running
+    success
+    error
+end
+
+
+enum VirtualMachineMovePriority
+    lowPriority
+    highPriority
+    defaultPriority
+end
+
+
+enum VirtualMachinePowerState
+    poweredOff
+    poweredOn
+    suspended
+end
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# Objects
+#
+
+object AboutInfo
+    String                                   name                           r
+    String                                   fullName                       r
+    String                                   vendor                         r
+    String                                   version                        r
+    String                                   build                          r
+    String                                   localeVersion                  o
+    String                                   localeBuild                    o
+    String                                   osType                         r
+    String                                   productLineId                  r
+    String                                   apiType                        r
+    String                                   apiVersion                     r
+end
+
+
+object ChoiceOption extends OptionType
+    ElementDescription                       choiceInfo                     rl
+    Int                                      defaultIndex                   o
+end
+
+
+object Description
+    String                                   label                          r
+    String                                   summary                        r
+end
+
+
+object DynamicProperty
+    String                                   name                           r
+    AnyType                                  val                            r
+end
+
+
+object ElementDescription extends Description
+    String                                   key                            r
+end
+
+
+object Event
+    Int                                      key                            r
+    Int                                      chainId                        r
+    DateTime                                 createdTime                    r
+    String                                   userName                       r
+    DatacenterEventArgument                  datacenter                     i
+    ComputeResourceEventArgument             computeResource                i
+    HostEventArgument                        host                           i
+    VmEventArgument                          vm                             i
+    String                                   fullFormattedMessage           o
+end
+
+
+object HostCpuIdInfo
+    Int                                      level                          r
+    String                                   vendor                         o
+    String                                   eax                            o
+    String                                   ebx                            o
+    String                                   ecx                            o
+    String                                   edx                            o
+end
+
+
+object ObjectContent
+    ManagedObjectReference                   obj                            r
+    DynamicProperty                          propSet                        ol
+    MissingProperty                          missingSet                     i
+end
+
+
+object ObjectSpec
+    ManagedObjectReference                   obj                            r
+    Boolean                                  skip                           o
+    SelectionSpec                            selectSet                      ol
+end
+
+
+object ObjectUpdate
+    ObjectUpdateKind                         kind                           r
+    ManagedObjectReference                   obj                            r
+    PropertyChange                           changeSet                      ol
+    MissingProperty                          missingSet                     i
+end
+
+
+object OptionType
+    Boolean                                  valueIsReadonly                o
+end
+
+
+object PerfCounterInfo
+    Int                                      key                            r
+    ElementDescription                       nameInfo                       r
+    ElementDescription                       groupInfo                      r
+    ElementDescription                       unitInfo                       r
+    PerfSummaryType                          rollupType                     r
+    PerfStatsType                            statsType                      r
+    Int                                      level                          o
+    Int                                      associatedCounterId            ol
+end
+
+
+object PerfEntityMetric extends PerfEntityMetricBase
+    PerfSampleInfo                           sampleInfo                     ol
+    PerfMetricSeries                         value                          ol
+end
+
+
+object PerfEntityMetricBase
+    ManagedObjectReference                   entity                         r
+end
+
+
+object PerfMetricId
+    Int                                      counterId                      r
+    String                                   instance                       r
+end
+
+
+object PerfMetricIntSeries extends PerfMetricSeries
+    Long                                     value                          ol
+end
+
+
+object PerfMetricSeries
+    PerfMetricId                             id                             r
+end
+
+
+object PerfQuerySpec
+    ManagedObjectReference                   entity                         r
+    DateTime                                 startTime                      o
+    DateTime                                 endTime                        o
+    Int                                      maxSample                      o
+    PerfMetricId                             metricId                       ol
+    Int                                      intervalId                     o
+    String                                   format                         o
+end
+
+
+object PerfSampleInfo
+    DateTime                                 timestamp                      r
+    Int                                      interval                       r
+end
+
+
+object PropertyChange
+    String                                   name                           r
+    PropertyChangeOp                         op                             r
+    AnyType                                  val                            o
+end
+
+
+object PropertyFilterSpec
+    PropertySpec                             propSet                        rl
+    ObjectSpec                               objectSet                      rl
+end
+
+
+object PropertyFilterUpdate
+    ManagedObjectReference                   filter                         r
+    ObjectUpdate                             objectSet                      ol
+    MissingObject                            missingSet                     i
+end
+
+
+object PropertySpec
+    String                                   type                           r
+    Boolean                                  all                            o
+    String                                   pathSet                        ol
+end
+
+
+object ResourceAllocationInfo
+    Long                                     reservation                    o
+    Boolean                                  expandableReservation          o
+    Long                                     limit                          o
+    SharesInfo                               shares                         o
+    Long                                     overheadLimit                  o
+end
+
+
+object ResourcePoolResourceUsage
+    Long                                     reservationUsed                r
+    Long                                     reservationUsedForVm           r
+    Long                                     unreservedForPool              r
+    Long                                     unreservedForVm                r
+    Long                                     overallUsage                   r
+    Long                                     maxUsage                       r
+end
+
+
+object SelectionSpec
+    String                                   name                           o
+end
+
+
+object ServiceContent
+    ManagedObjectReference                   rootFolder                     r
+    ManagedObjectReference                   propertyCollector              r
+    ManagedObjectReference                   viewManager                    o
+    AboutInfo                                about                          r
+    ManagedObjectReference                   setting                        o
+    ManagedObjectReference                   userDirectory                  o
+    ManagedObjectReference                   sessionManager                 o
+    ManagedObjectReference                   authorizationManager           o
+    ManagedObjectReference                   perfManager                    o
+    ManagedObjectReference                   scheduledTaskManager           o
+    ManagedObjectReference                   alarmManager                   o
+    ManagedObjectReference                   eventManager                   o
+    ManagedObjectReference                   taskManager                    o
+    ManagedObjectReference                   extensionManager               o
+    ManagedObjectReference                   customizationSpecManager       o
+    ManagedObjectReference                   customFieldsManager            o
+    ManagedObjectReference                   accountManager                 o
+    ManagedObjectReference                   diagnosticManager              o
+    ManagedObjectReference                   licenseManager                 o
+    ManagedObjectReference                   searchIndex                    o
+    ManagedObjectReference                   fileManager                    o
+    ManagedObjectReference                   virtualDiskManager             o
+    ManagedObjectReference                   virtualizationManager          o
+end
+
+
+object SharesInfo
+    Int                                      shares                         r
+    SharesLevel                              level                          r
+end
+
+
+object TaskInfo
+    String                                   key                            r
+    ManagedObjectReference                   task                           r
+    String                                   name                           o
+    String                                   descriptionId                  r
+    ManagedObjectReference                   entity                         o
+    String                                   entityName                     o
+    ManagedObjectReference                   locked                         ol
+    TaskInfoState                            state                          r
+    Boolean                                  cancelled                      r
+    Boolean                                  cancelable                     r
+    LocalizedMethodFault                     error                          i
+    AnyType                                  result                         o
+    Int                                      progress                       o
+    TaskReason                               reason                         i
+    DateTime                                 queueTime                      r
+    DateTime                                 startTime                      o
+    DateTime                                 completeTime                   o
+    Int                                      eventChainId                   r
+end
+
+
+object TraversalSpec extends SelectionSpec
+    String                                   type                           r
+    String                                   path                           r
+    Boolean                                  skip                           o
+    SelectionSpec                            selectSet                      ol
+end
+
+
+object UpdateSet
+    String                                   version                        r
+    PropertyFilterUpdate                     filterSet                      ol
+end
+
+
+object UserSession
+    String                                   key                            r
+    String                                   userName                       r
+    String                                   fullName                       r
+    DateTime                                 loginTime                      r
+    DateTime                                 lastActiveTime                 r
+    String                                   locale                         r
+    String                                   messageLocale                  r
+end
+
+
+object VirtualMachineConfigSpec
+    String                                   changeVersion                  o
+    String                                   name                           o
+    String                                   version                        o
+    String                                   uuid                           o
+    Long                                     npivNodeWorldWideName          ol
+    Long                                     npivPortWorldWideName          ol
+    String                                   npivWorldWideNameType          o
+    String                                   npivWorldWideNameOp            o
+    String                                   locationId                     o
+    String                                   guestId                        o
+    String                                   alternateGuestName             o
+    String                                   annotation                     o
+    VirtualMachineFileInfo                   files                          i
+    ToolsConfigInfo                          tools                          i
+    VirtualMachineFlagInfo                   flags                          i
+    VirtualMachineConsolePreferences         consolePreferences             i
+    VirtualMachineDefaultPowerOpInfo         powerOpInfo                    i
+    Int                                      numCPUs                        o
+    Long                                     memoryMB                       o
+    VirtualDeviceConfigSpec                  deviceChange                   i
+    ResourceAllocationInfo                   cpuAllocation                  o
+    ResourceAllocationInfo                   memoryAllocation               o
+    VirtualMachineAffinityInfo               cpuAffinity                    i
+    VirtualMachineAffinityInfo               memoryAffinity                 i
+    VirtualMachineNetworkShaperInfo          networkShaper                  i
+    VirtualMachineCpuIdInfoSpec              cpuFeatureMask                 i
+    OptionValue                              extraConfig                    i
+    String                                   swapPlacement                  o
+    VirtualMachineBootOptions                bootOptions                    i
+end
+
+
+object VirtualMachineQuestionInfo
+    String                                   id                             r
+    String                                   text                           r
+    ChoiceOption                             choice                         r
+    VirtualMachineMessage                    message                        i
+end
diff --git a/src/esx/esx_vi_generator.py b/src/esx/esx_vi_generator.py
new file mode 100755
index 0000000..5ca6138
--- /dev/null
+++ b/src/esx/esx_vi_generator.py
@@ -0,0 +1,1025 @@
+#!/usr/bin/python
+
+#
+# esx_vi_generator.py: generates most of the SOAP type mapping code
+#
+# Copyright (C) 2010 Matthias Bolte <matthias.bolte(a)googlemail.com>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+#
+
+import sys
+import os
+import os.path
+
+
+
+
+
+
+class Property:
+    OCCURRENCE__REQUIRED_ITEM = "r"
+    OCCURRENCE__REQUIRED_LIST = "rl"
+    OCCURRENCE__OPTIONAL_ITEM = "o"
+    OCCURRENCE__OPTIONAL_LIST = "ol"
+    OCCURRENCE__IGNORED = "i"
+
+    valid_occurrences = [OCCURRENCE__REQUIRED_ITEM,
+                         OCCURRENCE__REQUIRED_LIST,
+                         OCCURRENCE__OPTIONAL_ITEM,
+                         OCCURRENCE__OPTIONAL_LIST,
+                         OCCURRENCE__IGNORED]
+
+    def __init__(self, type, name, occurrence):
+        self.type = type
+        self.name = name
+        self.occurrence = occurrence
+
+    def is_enum(self):
+        global predefined_enums
+        global enums_by_name
+
+        return self.type in predefined_enums or self.type in enums_by_name
+
+    def generate_struct_member(self):
+        if self.occurrence == Property.OCCURRENCE__IGNORED:
+            return "    /* FIXME: %s is currently ignored */\n" % self.name
+        else:
+            string = "    %s%s; " % (self.get_type_string(), self.name)
+
+            while len(string) < 59:
+                string += " "
+
+            return string + "/* %s */\n" % self.get_occurrence_string()
+
+    def generate_free_code(self):
+        if self.type == "String" and \
+           self.occurrence not in [Property.OCCURRENCE__REQUIRED_LIST,
+                                   Property.OCCURRENCE__OPTIONAL_LIST,
+                                   Property.OCCURRENCE__IGNORED]:
+            return "    VIR_FREE(item->%s);\n" % self.name
+        elif self.is_enum():
+            return ""
+        else:
+            if self.occurrence == Property.OCCURRENCE__IGNORED:
+                return "    /* FIXME: %s is currently ignored */\n" % self.name
+            else:
+                return "    esxVI_%s_Free(&item->%s);\n" % (self.type, self.name)
+
+    def generate_validate_code(self):
+        if self.occurrence in [Property.OCCURRENCE__REQUIRED_ITEM,
+                               Property.OCCURRENCE__REQUIRED_LIST]:
+            return "    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(%s)\n" % self.name
+        elif self.occurrence == Property.OCCURRENCE__IGNORED:
+            return "    /* FIXME: %s is currently ignored */\n" % self.name
+        else:
+            return ""
+
+    def generate_deep_copy_code(self):
+        if self.occurrence == Property.OCCURRENCE__IGNORED:
+            return "    /* FIXME: %s is currently ignored */\n" % self.name
+        elif self.occurrence in [Property.OCCURRENCE__REQUIRED_LIST,
+                                 Property.OCCURRENCE__OPTIONAL_LIST]:
+            return "    ESX_VI__TEMPLATE__PROPERTY__DEEP_COPY_LIST(%s, %s)\n" % (self.type, self.name)
+        elif self.type == "String":
+            return "    ESX_VI__TEMPLATE__PROPERTY__DEEP_COPY_VALUE(String, %s)\n" % self.name
+        else:
+            return "    ESX_VI__TEMPLATE__PROPERTY__DEEP_COPY(%s, %s)\n" % (self.type, self.name)
+
+    def generate_serialize_code(self):
+        if self.occurrence == Property.OCCURRENCE__IGNORED:
+            return "    /* FIXME: %s is currently ignored */\n" % self.name
+        elif self.occurrence in [Property.OCCURRENCE__REQUIRED_LIST,
+                                 Property.OCCURRENCE__OPTIONAL_LIST]:
+            return "    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_LIST(%s, %s)\n" % (self.type, self.name)
+        elif self.type == "String":
+            return "    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, %s)\n" % self.name
+        else:
+            return "    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(%s, %s)\n" % (self.type, self.name)
+
+    def generate_deserialize_code(self):
+        if self.occurrence == Property.OCCURRENCE__IGNORED:
+            return "    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_IGNORE(%s) /* FIXME */\n" % self.name
+        elif self.occurrence in [Property.OCCURRENCE__REQUIRED_LIST,
+                                 Property.OCCURRENCE__OPTIONAL_LIST]:
+            return "    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_LIST(%s, %s)\n" % (self.type, self.name)
+        elif self.type == "String":
+            return "    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, %s)\n" % self.name
+        else:
+            return "    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(%s, %s)\n" % (self.type, self.name)
+
+    def get_type_string(self):
+        if self.type == "String" and \
+           self.occurrence not in [Property.OCCURRENCE__REQUIRED_LIST,
+                                   Property.OCCURRENCE__OPTIONAL_LIST]:
+            return "char *"
+        elif self.is_enum():
+            return "esxVI_%s " % self.type
+        else:
+            return "esxVI_%s *" % self.type
+
+    def get_occurrence_string(self):
+        if self.occurrence == Property.OCCURRENCE__REQUIRED_ITEM:
+            return "required"
+        elif self.occurrence == Property.OCCURRENCE__REQUIRED_LIST:
+            return "required, list"
+        elif self.occurrence == Property.OCCURRENCE__OPTIONAL_ITEM:
+            return "optional"
+        elif self.occurrence == Property.OCCURRENCE__OPTIONAL_LIST:
+            return "optional, list"
+
+        raise ValueError("unknown cardinality value '%s'" % self.cardinality)
+
+
+
+
+
+
+
+
+class Object:
+    FEATURE__DYNAMIC_CAST = (1 << 1)
+    FEATURE__LIST         = (1 << 2)
+    FEATURE__DEEP_COPY    = (1 << 3)
+    FEATURE__ANY_TYPE     = (1 << 4)
+    FEATURE__SERIALIZE    = (1 << 5)
+    FEATURE__DESERIALIZE  = (1 << 6)
+
+    def __init__(self, name, extends, properties, features = 0, extended_by = None):
+        self.name = name
+        self.extends = extends
+        self.features = features | Object.FEATURE__SERIALIZE | Object.FEATURE__DESERIALIZE
+        self.properties = properties
+        self.extended_by = extended_by
+
+        self.properties_by_name = {}
+
+        for property in self.properties:
+            self.properties_by_name[property.name] = property
+
+    def generate_struct_members(self, add_banner = False, struct_gap = False):
+        global objects_by_name
+        members = ""
+
+        if self.extends is None:
+            struct_gap = True
+            string = "    esxVI_Type _type; "
+
+            while len(string) < 59:
+                string += " "
+
+            members += string + "/* required */\n"
+
+        if struct_gap and self.extends is None:
+            members += "\n"
+
+        if self.extends is not None:
+            members += objects_by_name[self.extends].generate_struct_members(add_banner = True, struct_gap = False) + "\n"
+
+        if self.extends is not None or add_banner:
+            members += "    /* %s */\n" % self.name
+
+        for property in self.properties:
+            members += property.generate_struct_member()
+
+        if len(self.properties) < 1:
+            members += "    /* no properties */\n"
+
+        return members
+
+    def generate_free_code(self, add_banner = False):
+        global objects_by_name
+        source = ""
+
+        if self.extends is not None:
+            source += objects_by_name[self.extends].generate_free_code(add_banner = True) + "\n"
+
+        if self.extends is not None or add_banner:
+            source += "    /* %s */\n" % self.name
+
+        if len(self.properties) < 1:
+            source += "    /* no properties */\n"
+        else:
+            string = ""
+
+            for property in self.properties:
+                string += property.generate_free_code()
+
+            if len(string) < 1:
+                source += "    /* no properties to be freed */\n"
+            else:
+                source += string
+
+        return source
+
+    def generate_validate_code(self, add_banner = False):
+        global objects_by_name
+        source = ""
+
+        if self.extends is not None:
+            source += objects_by_name[self.extends].generate_validate_code(add_banner = True) + "\n"
+
+        if self.extends is not None or add_banner:
+            source += "    /* %s */\n" % self.name
+
+        if len(self.properties) < 1:
+            source += "    /* no properties */\n"
+        else:
+            string = ""
+
+            for property in self.properties:
+                string += property.generate_validate_code()
+
+            if len(string) < 1:
+                source += "    /* no required properties */\n"
+            else:
+                source += string
+
+        return source
+
+    def generate_dynamic_cast_code(self):
+        global objects_by_name
+        source = ""
+
+        if self.extended_by is not None:
+            source += "    /* %s */\n" % self.name
+
+            for extended_by in self.extended_by:
+                source += "    ESX_VI__TEMPLATE__DYNAMIC_CAST__ACCEPT(%s)\n" % extended_by
+
+            for extended_by in self.extended_by:
+                source += objects_by_name[extended_by].generate_dynamic_cast_code()
+
+        return source
+
+    def generate_deep_copy_code(self, add_banner = False):
+        global objects_by_name
+        source = ""
+
+        if self.extends is not None:
+            source += objects_by_name[self.extends].generate_deep_copy_code(add_banner = True) + "\n"
+
+        if self.extends is not None or add_banner:
+            source += "    /* %s */\n" % self.name
+
+        if len(self.properties) < 1:
+            source += "    /* no properties */\n"
+        else:
+            string = ""
+
+            for property in self.properties:
+                string += property.generate_deep_copy_code()
+
+            if len(string) < 1:
+                source += "    /* no properties to be deep copied */\n"
+            else:
+                source += string
+
+        return source
+
+    def generate_serialize_code(self, add_banner = False):
+        global objects_by_name
+        source = ""
+
+        if self.extends is not None:
+            source += objects_by_name[self.extends].generate_serialize_code(add_banner = True) + "\n"
+
+        if self.extends is not None or add_banner:
+            source += "    /* %s */\n" % self.name
+
+        if len(self.properties) < 1:
+            source += "    /* no properties */\n"
+        else:
+            for property in self.properties:
+                source += property.generate_serialize_code()
+
+        return source
+
+    def generate_deserialize_code(self, add_banner = False):
+        global objects_by_name
+        source = ""
+
+        if self.extends is not None:
+            source += objects_by_name[self.extends].generate_deserialize_code(add_banner = True) + "\n"
+
+        if self.extends is not None or add_banner:
+            source += "    /* %s */\n" % self.name
+
+        if len(self.properties) < 1:
+            source += "    /* no properties */\n"
+        else:
+            for property in self.properties:
+                source += property.generate_deserialize_code()
+
+        return source
+
+    def generate_typedef(self):
+        return "typedef struct _esxVI_%s esxVI_%s;\n" % (self.name, self.name)
+
+    def generate_typeenum(self):
+        return "    esxVI_Type_%s,\n" % self.name
+
+    def generate_typetostring(self):
+        string = "          case esxVI_Type_%s:\n" % self.name
+        string += "            return \"%s\";\n\n" % self.name
+
+        return string
+
+    def generate_typefromstring(self):
+        string =  "           else if (STREQ(type, \"%s\")) {\n" % self.name
+        string += "               return esxVI_Type_%s;\n" % self.name
+        string += "           }\n"
+
+        return string
+
+    def generate_header(self):
+        header = "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"
+        header += " * VI Type: %s\n" % self.name
+
+        if self.extends is not None:
+            header += " *          extends %s\n" % self.extends
+
+        first = True
+
+        if self.extended_by is not None:
+            for extended_by in self.extended_by:
+                if first:
+                    header += " *          extended by %s\n" % extended_by
+                    first = False
+                else:
+                    header += " *                      %s\n" % extended_by
+
+        header += " */\n\n"
+
+        # struct
+        header += "struct _esxVI_%s {\n" % self.name
+
+        if self.features & Object.FEATURE__LIST:
+            string = "    esxVI_%s *_next; " % self.name
+        else:
+            string = "    esxVI_%s *_unused; " % self.name
+
+        while len(string) < 59:
+            string += " "
+
+        header += string + "/* optional */\n"
+
+        header += self.generate_struct_members(struct_gap = True)
+
+        header += "};\n\n"
+
+        # functions
+        header += "int esxVI_%s_Alloc(esxVI_%s **item);\n" % (self.name, self.name)
+        header += "void esxVI_%s_Free(esxVI_%s **item);\n" % (self.name, self.name)
+        header += "int esxVI_%s_Validate(esxVI_%s *item);\n" % (self.name, self.name)
+
+        if self.features & Object.FEATURE__DYNAMIC_CAST:
+            if self.extended_by is not None or self.extends is not None:
+                header += "esxVI_%s *esxVI_%s_DynamicCast(void *item);\n" % (self.name, self.name)
+            else:
+                report_error("cannot add dynamic cast support for an untyped object")
+
+        if self.features & Object.FEATURE__LIST:
+            header += "int esxVI_%s_AppendToList(esxVI_%s **list, esxVI_%s *item);\n" % (self.name, self.name, self.name)
+
+        if self.features & Object.FEATURE__DEEP_COPY:
+            header += "int esxVI_%s_DeepCopy(esxVI_%s **dst, esxVI_%s *src);\n" % (self.name, self.name, self.name)
+
+            if self.features & Object.FEATURE__LIST:
+                header += "int esxVI_%s_DeepCopyList(esxVI_%s **dstList, esxVI_%s *srcList);\n" % (self.name, self.name, self.name)
+
+        if self.features & Object.FEATURE__ANY_TYPE:
+            header += "int esxVI_%s_CastFromAnyType(esxVI_AnyType *anyType, esxVI_%s **item);\n" % (self.name, self.name)
+
+            if self.features & Object.FEATURE__LIST:
+                header += "int esxVI_%s_CastListFromAnyType(esxVI_AnyType *anyType, esxVI_%s **list);\n" % (self.name, self.name)
+
+        if self.features & Object.FEATURE__SERIALIZE:
+            header += "int esxVI_%s_Serialize(esxVI_%s *item, const char *element, virBufferPtr output);\n" % (self.name, self.name)
+
+            if self.features & Object.FEATURE__LIST:
+                header += "int esxVI_%s_SerializeList(esxVI_%s *list, const char *element, virBufferPtr output);\n" % (self.name, self.name)
+
+        if self.features & Object.FEATURE__DESERIALIZE:
+            header += "int esxVI_%s_Deserialize(xmlNodePtr node, esxVI_%s **item);\n" % (self.name, self.name)
+
+            if self.features & Object.FEATURE__LIST:
+                header += "int esxVI_%s_DeserializeList(xmlNodePtr node, esxVI_%s **list);\n" % (self.name, self.name)
+
+        header += "\n\n\n"
+
+        return header
+
+    def generate_source(self):
+        source = "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"
+        source += " * VI Type: %s\n" % self.name
+
+        if self.extends is not None:
+            source += " *          extends %s\n" % self.extends
+
+        first = True
+
+        if self.extended_by is not None:
+            for extended_by in self.extended_by:
+                if first:
+                    source += " *          extended by %s\n" % extended_by
+                    first = False
+                else:
+                    source += " *                      %s\n" % extended_by
+
+        source += " */\n\n"
+
+        # functions
+        source += "/* esxVI_%s_Alloc */\n" % self.name
+        source += "ESX_VI__TEMPLATE__ALLOC(%s)\n\n" % self.name
+
+        # free
+        if self.extended_by is None:
+            source += "/* esxVI_%s_Free */\n" % self.name
+            source += "ESX_VI__TEMPLATE__FREE(%s,\n" % self.name
+            source += "{\n"
+
+            if self.features & Object.FEATURE__LIST:
+                source += "    esxVI_%s_Free(&item->_next);\n\n" % self.name
+
+            source += self.generate_free_code()
+
+            source += "})\n\n"
+        else:
+            source += "/* esxVI_%s_Free */\n" % self.name
+            source += "ESX_VI__TEMPLATE__DYNAMIC_FREE(%s,\n" % self.name
+            source += "{\n"
+
+            for extended_by in self.extended_by:
+                source += "    ESX_VI__TEMPLATE__DISPATCH__FREE(%s)\n" % extended_by
+
+            source += "},\n"
+            source += "{\n"
+
+            if self.features & Object.FEATURE__LIST:
+                source += "    esxVI_%s_Free(&item->_next);\n\n" % self.name
+
+            source += self.generate_free_code()
+
+            source += "})\n\n"
+
+        # validate
+        source += "/* esxVI_%s_Validate */\n" % self.name
+        source += "ESX_VI__TEMPLATE__VALIDATE(%s,\n" % self.name
+        source += "{\n"
+
+        source += self.generate_validate_code()
+
+        source += "})\n\n"
+
+        # dynamic cast
+        if self.features & Object.FEATURE__DYNAMIC_CAST:
+            if self.extended_by is not None or self.extends is not None:
+                source += "/* esxVI_%s_DynamicCast */\n" % self.name
+                source += "ESX_VI__TEMPLATE__DYNAMIC_CAST(%s,\n" % self.name
+                source += "{\n"
+
+                source += self.generate_dynamic_cast_code()
+
+                source += "})\n\n"
+            else:
+                report_error("cannot add dynamic cast support for an untyped object")
+
+        # append to list
+        if self.features & Object.FEATURE__LIST:
+            source += "/* esxVI_%s_AppendToList */\n" % self.name
+            source += "ESX_VI__TEMPLATE__LIST__APPEND(%s)\n\n" % self.name
+
+        # deep copy
+        if self.extended_by is None:
+            if self.features & Object.FEATURE__DEEP_COPY:
+                source += "/* esxVI_%s_DeepCopy */\n" % self.name
+                source += "ESX_VI__TEMPLATE__DEEP_COPY(%s,\n" % self.name
+                source += "{\n"
+
+                source += self.generate_deep_copy_code()
+
+                source += "})\n\n"
+
+                if self.features & Object.FEATURE__LIST:
+                    source += "/* esxVI_%s_DeepCopyList */\n" % self.name
+                    source += "ESX_VI__TEMPLATE__LIST__DEEP_COPY(%s)\n\n" % self.name
+        else:
+            if self.features & Object.FEATURE__DEEP_COPY:
+                source += "/* esxVI_%s_DeepCopy */\n" % self.name
+                source += "ESX_VI__TEMPLATE__DYNAMIC_DEEP_COPY(%s)\n" % self.name
+                source += "{\n"
+
+                for extended_by in self.extended_by:
+                    source += "    ESX_VI__TEMPLATE__DISPATCH__DEEP_COPY(%s)\n" % extended_by
+
+                source += "},\n"
+                source += "{\n"
+
+                source += self.generate_deep_copy_code()
+
+                source += "})\n\n"
+
+                if self.features & Object.FEATURE__LIST:
+                    source += "/* esxVI_%s_DeepCopyList */\n" % self.name
+                    source += "ESX_VI__TEMPLATE__LIST__DEEP_COPY(%s)\n\n" % self.name
+
+        # cast from any type
+        if self.features & Object.FEATURE__ANY_TYPE:
+            source += "/* esxVI_%s_CastFromAnyType */\n" % self.name
+            source += "ESX_VI__TEMPLATE__CAST_FROM_ANY_TYPE(%s)\n" % self.name
+
+            if self.features & Object.FEATURE__LIST:
+                source += "/* esxVI_%s_CastListFromAnyType */\n" % self.name
+                source += "ESX_VI__TEMPLATE__LIST__CAST_FROM_ANY_TYPE(%s)\n\n" % self.name
+
+        # serialize
+        if self.extended_by is None:
+            if self.features & Object.FEATURE__SERIALIZE:
+                source += "/* esxVI_%s_Serialize */\n" % self.name
+                source += "ESX_VI__TEMPLATE__SERIALIZE(%s,\n" % self.name
+                source += "{\n"
+
+                source += self.generate_serialize_code()
+
+                source += "})\n\n"
+
+                if self.features & Object.FEATURE__LIST:
+                    source += "/* esxVI_%s_SerializeList */\n" % self.name
+                    source += "ESX_VI__TEMPLATE__LIST__SERIALIZE(%s)\n\n" % self.name
+        else:
+            if self.features & Object.FEATURE__SERIALIZE:
+                source += "/* esxVI_%s_Serialize */\n" % self.name
+                source += "ESX_VI__TEMPLATE__DYNAMIC_SERIALIZE(%s,\n" % self.name
+                source += "{\n"
+
+                for extended_by in self.extended_by:
+                    source += "    ESX_VI__TEMPLATE__DISPATCH__SERIALIZE(%s)\n" % extended_by
+
+                source += "},\n"
+                source += "{\n"
+
+                source += self.generate_serialize_code()
+
+                source += "})\n\n"
+
+                if self.features & Object.FEATURE__LIST:
+                    source += "/* esxVI_%s_SerializeList */\n" % self.name
+                    source += "ESX_VI__TEMPLATE__LIST__SERIALIZE(%s)\n\n" % self.name
+
+        # deserilaize
+        if self.features & Object.FEATURE__DESERIALIZE:
+            source += "/* esxVI_%s_Deserialize */\n" % self.name
+            source += "ESX_VI__TEMPLATE__DESERIALIZE(%s,\n" % self.name
+            source += "{\n"
+
+            source += self.generate_deserialize_code()
+
+            source += "})\n\n"
+
+            if self.features & Object.FEATURE__LIST:
+                source += "/* esxVI_%s_DeserializeList */\n" % self.name
+                source += "ESX_VI__TEMPLATE__LIST__DESERIALIZE(%s)\n\n" % self.name
+
+        source += "\n\n"
+
+        return source
+
+
+
+
+
+
+
+
+class Enum:
+    FEATURE__ANY_TYPE = (1 << 1)
+    FEATURE__SERIALIZE = (1 << 2)
+    FEATURE__DESERIALIZE = (1 << 3)
+
+
+    def __init__(self, name, values, features = 0):
+        self.name = name
+        self.values = values
+        self.features = features | Enum.FEATURE__SERIALIZE | Enum.FEATURE__DESERIALIZE
+
+    def generate_typedef(self):
+        return "typedef enum _esxVI_%s esxVI_%s;\n" % (self.name, self.name)
+
+    def generate_typeenum(self):
+        return "    esxVI_Type_%s,\n" % self.name
+
+    def generate_typetostring(self):
+        string = "          case esxVI_Type_%s:\n" % self.name
+        string += "            return \"%s\";\n\n" % self.name
+
+        return string
+
+    def generate_typefromstring(self):
+        string =  "           else if (STREQ(type, \"%s\")) {\n" % self.name
+        string += "               return esxVI_Type_%s;\n" % self.name
+        string += "           }\n"
+
+        return string
+
+    def generate_header(self):
+        header = "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"
+        header += " * VI Enum: %s\n" % self.name
+        header += " */\n\n"
+
+        # enum
+        header += "enum _esxVI_%s {\n" % self.name
+        header += "    esxVI_%s_Undefined = 0,\n" % self.name
+
+        for value in self.values:
+            header += "    esxVI_%s_%s,\n" % (self.name, capitalize_first(value))
+
+        header += "};\n\n"
+
+        # functions
+        if self.features & Enum.FEATURE__ANY_TYPE:
+            header += "int esxVI_%s_CastFromAnyType(esxVI_AnyType *anyType, esxVI_%s *item);\n" % (self.name, self.name)
+
+        if self.features & Enum.FEATURE__SERIALIZE:
+            header += "int esxVI_%s_Serialize(esxVI_%s item, const char *element, virBufferPtr output);\n" % (self.name, self.name)
+
+        if self.features & Enum.FEATURE__DESERIALIZE:
+            header += "int esxVI_%s_Deserialize(xmlNodePtr node, esxVI_%s *item);\n" % (self.name, self.name)
+
+        header += "\n\n\n"
+
+        return header
+
+    def generate_source(self):
+        source = "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"
+        source += " * VI Enum: %s\n" % self.name
+        source += " */\n\n"
+
+        source += "static const esxVI_Enumeration _esxVI_%s_Enumeration = {\n" % self.name
+        source += "    esxVI_Type_%s, {\n" % self.name
+
+        for value in self.values:
+            source += "        { \"%s\", esxVI_%s_%s },\n" % (value, self.name, capitalize_first(value))
+
+        source += "        { NULL, -1 },\n"
+        source += "    },\n"
+        source += "};\n\n"
+
+        # functions
+        if self.features & Enum.FEATURE__ANY_TYPE:
+            source += "/* esxVI_%s_CastFromAnyType */\n" % self.name
+            source += "ESX_VI__TEMPLATE__ENUMERATION__CAST_FROM_ANY_TYPE(%s)\n\n" % self.name
+
+        if self.features & Enum.FEATURE__SERIALIZE:
+            source += "/* esxVI_%s_Serialize */\n" % self.name
+            source += "ESX_VI__TEMPLATE__ENUMERATION__SERIALIZE(%s)\n\n" % self.name
+
+        if self.features & Enum.FEATURE__DESERIALIZE:
+            source += "/* esxVI_%s_Deserialize */\n" % self.name
+            source += "ESX_VI__TEMPLATE__ENUMERATION__DESERIALIZE(%s)\n\n" % self.name
+
+        source += "\n\n"
+
+        return source
+
+
+
+
+
+def report_error(message):
+    print "error: " + message
+    sys.exit(1)
+
+
+
+def usage():
+    print "%s <input-filename> <output-directory>" % sys.argv[0]
+    sys.exit(0)
+
+
+
+def capitalize_first(string):
+    return string[:1].upper() + string[1:]
+
+
+
+def parse_object(block):
+    # expected format: object <name> [extends <name>]
+    header_items = block[0][1].split()
+
+    if len(header_items) < 2:
+        report_error("line %d: invalid block header" % (number))
+
+    assert header_items[0] == "object"
+
+    name = header_items[1]
+    extends = None
+
+    if len(header_items) > 2:
+        if header_items[2] != "extends":
+            report_error("line %d: invalid block header" % (number))
+        else:
+            extends = header_items[3]
+
+    properties = []
+
+    for line in block[1:]:
+        # expected format: <type> <name> <occurrence>
+        items = line[1].split()
+
+        if len(items) != 3:
+            report_error("line %d: invalid property" % line[0])
+
+        if items[2] not in Property.valid_occurrences:
+            report_error("line %d: invalid occurrence" % line[0])
+
+        properties.append(Property(type = items[0], name = items[1],
+                                   occurrence = items[2]))
+
+    return Object(name = name, extends = extends, properties = properties)
+
+
+
+def parse_enum(block):
+    # expected format: enum <name>
+    header_items = block[0][1].split()
+
+    if len(header_items) < 2:
+        report_error("line %d: invalid block header" % (number))
+
+    assert header_items[0] == "enum"
+
+    name = header_items[1]
+
+    values = []
+
+    for line in block[1:]:
+        # expected format: <value>
+        values.append(line[1])
+
+    return Enum(name = name, values = values)
+
+
+
+def inherit_features(obj):
+    if obj.extended_by is not None:
+        for extended_by in obj.extended_by:
+            objects_by_name[extended_by].features |= obj.features
+
+    if obj.extends is not None:
+        objects_by_name[obj.extends].features |= obj.features
+
+    if obj.extended_by is not None:
+        for extended_by in obj.extended_by:
+            inherit_features(objects_by_name[extended_by])
+
+
+
+def is_known_type(type):
+    return type in predefined_objects or \
+           type in predefined_enums or \
+           type in objects_by_name or \
+           type in enums_by_name
+
+
+
+def open_and_print(filename):
+    if filename.startswith("./"):
+        print "  GEN    " + filename[2:]
+    else:
+        print "  GEN    " + filename
+
+    return open(filename, "wb")
+
+
+
+
+
+
+
+
+
+
+predefined_enums = ["Boolean"]
+
+predefined_objects = ["AnyType",
+                      "Int",
+                      "Long",
+                      "String",
+                      "DateTime",
+                      "ManagedObjectReference"]
+
+
+additional_enum_features = { "ManagedEntityStatus"      : Enum.FEATURE__ANY_TYPE,
+                             "TaskInfoState"            : Enum.FEATURE__ANY_TYPE,
+                             "VirtualMachinePowerState" : Enum.FEATURE__ANY_TYPE }
+
+
+additional_object_features = { "Event"                      : Object.FEATURE__LIST,
+                               "HostCpuIdInfo"              : Object.FEATURE__ANY_TYPE | Object.FEATURE__LIST,
+                               "ManagedObjectReference"     : Object.FEATURE__ANY_TYPE,
+                               "ObjectContent"              : Object.FEATURE__DEEP_COPY | Object.FEATURE__LIST,
+                               "PerfCounterInfo"            : Object.FEATURE__LIST,
+                               "PerfEntityMetric"           : Object.FEATURE__LIST,
+                               "PerfQuerySpec"              : Object.FEATURE__LIST,
+                               "PerfMetricIntSeries"        : Object.FEATURE__DYNAMIC_CAST,
+                               "PropertyFilterSpec"         : Object.FEATURE__LIST,
+                               "ResourcePoolResourceUsage"  : Object.FEATURE__ANY_TYPE,
+                               "SelectionSpec"              : Object.FEATURE__DYNAMIC_CAST,
+                               "SharesInfo"                 : Object.FEATURE__ANY_TYPE,
+                               "TaskInfo"                   : Object.FEATURE__ANY_TYPE | Object.FEATURE__LIST,
+                               "UserSession"                : Object.FEATURE__ANY_TYPE,
+                               "VirtualMachineQuestionInfo" : Object.FEATURE__ANY_TYPE }
+
+
+removed_object_features = { "DynamicProperty"          : Object.FEATURE__SERIALIZE,
+                            "ObjectContent"            : Object.FEATURE__SERIALIZE,
+                            "ObjectUpdate"             : Object.FEATURE__SERIALIZE,
+                            "PropertyChange"           : Object.FEATURE__SERIALIZE,
+                            "PropertyFilterUpdate"     : Object.FEATURE__SERIALIZE,
+                            "TaskInfo"                 : Object.FEATURE__SERIALIZE,
+                            "UpdateSet"                : Object.FEATURE__SERIALIZE,
+                            "VirtualMachineConfigInfo" : Object.FEATURE__SERIALIZE }
+
+
+
+
+if "srcdir" in os.environ:
+    input_filename = os.path.join(os.environ["srcdir"], "esx/esx_vi_generator.input")
+    output_dirname = os.path.join(os.environ["srcdir"], "esx")
+else:
+    input_filename = os.path.join(os.getcwd(), "esx_vi_generator.input")
+    output_dirname = os.getcwd()
+
+
+
+typedef = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.typedef"))
+typeenum = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.typeenum"))
+typetostring = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.typetostring"))
+typefromstring = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.typefromstring"))
+header = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.h"))
+source = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.c"))
+
+
+
+number = 0
+objects_by_name = {}
+enums_by_name = {}
+block = None
+
+
+
+for line in file(input_filename, "rb").readlines():
+    number += 1
+
+    if "#" in line:
+        line = line[:line.index("#")]
+
+    line = line.lstrip().rstrip()
+
+    if len(line) < 1:
+        continue
+
+    if line.startswith("object") or line.startswith("enum"):
+        if block is not None:
+            report_error("line %d: nested block found" % (number))
+        else:
+            block = []
+
+    if block is not None:
+        if line == "end":
+            if block[0][1].startswith("object"):
+                obj = parse_object(block)
+                objects_by_name[obj.name] = obj
+            else:
+                enum = parse_enum(block)
+                enums_by_name[enum.name] = enum
+
+            block = None
+        else:
+            block.append((number, line))
+
+
+
+for enum in enums_by_name.values():
+    # apply additional features
+    if enum.name in additional_enum_features:
+        enum.features |= additional_enum_features[enum.name]
+
+
+
+for obj in objects_by_name.values():
+    for property in obj.properties:
+        if property.occurrence != Property.OCCURRENCE__IGNORED and \
+           not is_known_type(property.type):
+            report_error("object '%s' contains unknown property type '%s'" % (obj.name, property.type))
+
+    if obj.extends is not None:
+        if not is_known_type(obj.extends):
+            report_error("object '%s' extends unknown object '%s'" % (obj.name, obj.extends))
+
+    # detect list usage
+    for property in obj.properties:
+        if (property.occurrence == Property.OCCURRENCE__REQUIRED_LIST or \
+            property.occurrence == Property.OCCURRENCE__OPTIONAL_LIST) and \
+           property.type not in predefined_objects:
+            objects_by_name[property.type].features |= Object.FEATURE__LIST
+
+    # apply/remove additional features
+    if obj.name in additional_object_features:
+        obj.features |= additional_object_features[obj.name]
+
+    if obj.name in removed_object_features:
+        obj.features &= ~removed_object_features[obj.name]
+
+    # spread deep copy onto properties
+    if obj.features & Object.FEATURE__DEEP_COPY:
+        for property in obj.properties:
+            if property.occurrence != Property.OCCURRENCE__IGNORED and \
+               property.type not in predefined_objects:
+                objects_by_name[property.type].features |= Object.FEATURE__DEEP_COPY
+
+    # detect extended_by relation
+    if obj.extends is not None:
+        extended_obj = objects_by_name[obj.extends]
+
+        if extended_obj.extended_by is None:
+            extended_obj.extended_by = [obj.name]
+        else:
+            extended_obj.extended_by.append(obj.name)
+
+
+
+
+
+for obj in objects_by_name.values():
+    inherit_features(obj)
+
+
+
+
+
+typedef.write("/* Generated by esx_vi_generator.py */\n\n\n\n")
+typeenum.write("/* Generated by esx_vi_generator.py */\n\n")
+typetostring.write("/* Generated by esx_vi_generator.py */\n\n")
+typefromstring.write("/* Generated by esx_vi_generator.py */\n\n")
+header.write("/* Generated by esx_vi_generator.py */\n\n\n\n")
+source.write("/* Generated by esx_vi_generator.py */\n\n\n\n")
+
+
+typedef.write("/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n" +
+              " * VI Enums\n" +
+              " */\n\n")
+
+
+
+names = enums_by_name.keys()
+names.sort()
+
+
+for name in names:
+    typedef.write(enums_by_name[name].generate_typedef())
+    typeenum.write(enums_by_name[name].generate_typeenum())
+    typetostring.write(enums_by_name[name].generate_typetostring())
+    typefromstring.write(enums_by_name[name].generate_typefromstring())
+    header.write(enums_by_name[name].generate_header())
+    source.write(enums_by_name[name].generate_source())
+
+
+
+typedef.write("\n\n\n" +
+              "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n" +
+              " * VI Types\n" +
+              " */\n\n")
+
+typeenum.write("\n")
+
+typetostring.write("\n")
+
+typefromstring.write("\n")
+
+
+
+names = objects_by_name.keys()
+names.sort()
+
+
+for name in names:
+    typedef.write(objects_by_name[name].generate_typedef())
+    typeenum.write(objects_by_name[name].generate_typeenum())
+    typetostring.write(objects_by_name[name].generate_typetostring())
+    typefromstring.write(objects_by_name[name].generate_typefromstring())
+    header.write(objects_by_name[name].generate_header())
+    source.write(objects_by_name[name].generate_source())
diff --git a/src/esx/esx_vi_methods.c b/src/esx/esx_vi_methods.c
index 07cd82a..f1234ae 100644
--- a/src/esx/esx_vi_methods.c
+++ b/src/esx/esx_vi_methods.c
@@ -304,7 +304,7 @@ ESX_VI__METHOD(RetrieveProperties,
                (esxVI_Context *ctx,
                 esxVI_PropertyFilterSpec *specSet, /* list */
                 esxVI_ObjectContent **objectContentList),
-               List,
+               OptionalList,
 {
     ESX_VI__METHOD__CHECK_SERVICE()
     ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(objectContentList)
@@ -344,8 +344,7 @@ ESX_VI__METHOD(PowerOnVM_Task,
                                               virtualMachine)
 },
 {
-    if (esxVI_ManagedObjectReference_Deserialize(response->node, task,
-                                                 "Task") < 0) {
+    if (esxVI_ManagedObjectReference_Deserialize(response->node, task) < 0) {
         goto failure;
     }
 })
@@ -369,8 +368,7 @@ ESX_VI__METHOD(PowerOffVM_Task,
                                               virtualMachine)
 },
 {
-    if (esxVI_ManagedObjectReference_Deserialize(response->node, task,
-                                                 "Task") < 0) {
+    if (esxVI_ManagedObjectReference_Deserialize(response->node, task) < 0) {
         goto failure;
     }
 })
@@ -394,8 +392,7 @@ ESX_VI__METHOD(SuspendVM_Task,
                                               virtualMachine)
 },
 {
-    if (esxVI_ManagedObjectReference_Deserialize(response->node, task,
-                                                 "Task") < 0) {
+    if (esxVI_ManagedObjectReference_Deserialize(response->node, task) < 0) {
         goto failure;
     }
 })
@@ -428,8 +425,7 @@ ESX_VI__METHOD(MigrateVM_Task,
     ESX_VI__METHOD__PARAMETER__SERIALIZE(VirtualMachinePowerState, state)
 },
 {
-    if (esxVI_ManagedObjectReference_Deserialize(response->node, task,
-                                                 "Task") < 0) {
+    if (esxVI_ManagedObjectReference_Deserialize(response->node, task) < 0) {
         goto failure;
     }
 })
@@ -456,8 +452,7 @@ ESX_VI__METHOD(ReconfigVM_Task,
     ESX_VI__METHOD__PARAMETER__SERIALIZE(VirtualMachineConfigSpec, spec)
 },
 {
-    if (esxVI_ManagedObjectReference_Deserialize(response->node, task,
-                                                 "Task") < 0) {
+    if (esxVI_ManagedObjectReference_Deserialize(response->node, task) < 0) {
         goto failure;
     }
 })
@@ -490,8 +485,7 @@ ESX_VI__METHOD(RegisterVM_Task,
     ESX_VI__METHOD__PARAMETER__SERIALIZE(ManagedObjectReference, host)
 },
 {
-    if (esxVI_ManagedObjectReference_Deserialize(response->node, task,
-                                                 "Task") < 0) {
+    if (esxVI_ManagedObjectReference_Deserialize(response->node, task) < 0) {
         goto failure;
     }
 })
@@ -583,8 +577,8 @@ ESX_VI__METHOD(CreateFilter,
     ESX_VI__METHOD__PARAMETER__SERIALIZE(Boolean, partialUpdates)
 },
 {
-    if (esxVI_ManagedObjectReference_Deserialize(response->node, propertyFilter,
-                                                 "PropertyFilter") < 0) {
+    if (esxVI_ManagedObjectReference_Deserialize(response->node,
+                                                 propertyFilter) < 0) {
         goto failure;
     }
 })
@@ -684,7 +678,7 @@ ESX_VI__METHOD(ValidateMigration,
                 esxVI_ManagedObjectReference *pool,
                 esxVI_ManagedObjectReference *host,
                 esxVI_Event **eventList),
-               List,
+               OptionalList,
 {
     ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(eventList)
 },
@@ -736,10 +730,8 @@ ESX_VI__METHOD(FindByIp,
     ESX_VI__METHOD__PARAMETER__SERIALIZE(Boolean, vmSearch)
 },
 {
-    if (esxVI_ManagedObjectReference_Deserialize
-          (response->node, managedObjectReference,
-           vmSearch == esxVI_Boolean_True ? "VirtualMachine"
-                                          : "HostSystem") < 0) {
+    if (esxVI_ManagedObjectReference_Deserialize(response->node,
+                                                 managedObjectReference) < 0) {
         goto failure;
     }
 })
@@ -771,10 +763,8 @@ ESX_VI__METHOD(FindByUuid,
     ESX_VI__METHOD__PARAMETER__SERIALIZE(Boolean, vmSearch)
 },
 {
-    if (esxVI_ManagedObjectReference_Deserialize
-          (response->node, managedObjectReference,
-           vmSearch == esxVI_Boolean_True ? "VirtualMachine"
-                                          : "HostSystem") < 0) {
+    if (esxVI_ManagedObjectReference_Deserialize(response->node,
+                                                 managedObjectReference) < 0) {
         goto failure;
     }
 })
@@ -789,7 +779,7 @@ ESX_VI__METHOD(QueryAvailablePerfMetric,
                 esxVI_DateTime *endTime,
                 esxVI_Int *intervalId,
                 esxVI_PerfMetricId **perfMetricIdList),
-               List,
+               OptionalList,
 {
     ESX_VI__METHOD__CHECK_SERVICE()
     ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(perfMetricIdList)
@@ -820,7 +810,7 @@ ESX_VI__METHOD(QueryPerfCounter,
                (esxVI_Context *ctx,
                 esxVI_Int *counterId, /* list */
                 esxVI_PerfCounterInfo **perfCounterInfoList),
-               List,
+               OptionalList,
 {
     ESX_VI__METHOD__CHECK_SERVICE()
     ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(perfCounterInfoList)
@@ -848,7 +838,7 @@ ESX_VI__METHOD(QueryPerf,
                (esxVI_Context *ctx,
                 esxVI_PerfQuerySpec *querySpec, /* list */
                 esxVI_PerfEntityMetric **perfEntityMetricList),
-               List,
+               OptionalList,
 {
     ESX_VI__METHOD__CHECK_SERVICE()
     ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(perfEntityMetricList)
diff --git a/src/esx/esx_vi_types.c b/src/esx/esx_vi_types.c
index 87a13cb..6f257b2 100644
--- a/src/esx/esx_vi_types.c
+++ b/src/esx/esx_vi_types.c
@@ -64,11 +64,17 @@
 
 
 
-#define ESX_VI__TEMPLATE__ALLOC(_type)                                        \
+#define ESX_VI__TEMPLATE__ALLOC(__type)                                       \
     int                                                                       \
-    esxVI_##_type##_Alloc(esxVI_##_type **ptrptr)                             \
+    esxVI_##__type##_Alloc(esxVI_##__type **ptrptr)                           \
     {                                                                         \
-        return esxVI_Alloc((void **)ptrptr, sizeof(esxVI_##_type));           \
+        if (esxVI_Alloc((void **)ptrptr, sizeof (esxVI_##__type)) < 0) {      \
+            return -1;                                                        \
+        }                                                                     \
+                                                                              \
+        (*ptrptr)->_type = esxVI_Type_##__type;                               \
+                                                                              \
+        return 0;                                                             \
     }
 
 
@@ -92,11 +98,18 @@
 
 
 
-#define ESX_VI__TEMPLATE__VALIDATE(_type, _require)                           \
+#define ESX_VI__TEMPLATE__VALIDATE(__type, _require)                          \
     int                                                                       \
-    esxVI_##_type##_Validate(esxVI_##_type *item)                             \
+    esxVI_##__type##_Validate(esxVI_##__type *item)                           \
     {                                                                         \
-        const char *type_name = #_type;                                       \
+        const char *type_name = esxVI_Type_ToString(esxVI_Type_##__type);     \
+                                                                              \
+        if (item->_type <= esxVI_Type_Undefined ||                            \
+            item->_type >= esxVI_Type_Other) {                                \
+            ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR,                              \
+                         "%s object has invalid dynamic type", type_name);    \
+            return -1;                                                        \
+        }                                                                     \
                                                                               \
         _require                                                              \
                                                                               \
@@ -105,11 +118,31 @@
 
 
 
-#define ESX_VI__TEMPLATE__VALIDATE_NOOP(_type)                                \
+#define ESX_VI__TEMPLATE__DEEP_COPY(_type, _deep_copy)                        \
     int                                                                       \
-    esxVI_##_type##_Validate(esxVI_##_type *item ATTRIBUTE_UNUSED)            \
+    esxVI_##_type##_DeepCopy(esxVI_##_type **dest, esxVI_##_type *src)        \
     {                                                                         \
+        if (dest == NULL || *dest != NULL) {                                  \
+            ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "Invalid argument");         \
+            return -1;                                                        \
+        }                                                                     \
+                                                                              \
+        if (src == NULL) {                                                    \
+            return 0;                                                         \
+        }                                                                     \
+                                                                              \
+        if (esxVI_##_type##_Alloc(dest) < 0) {                                \
+            goto failure;                                                     \
+        }                                                                     \
+                                                                              \
+        _deep_copy                                                            \
+                                                                              \
         return 0;                                                             \
+                                                                              \
+      failure:                                                                \
+        esxVI_##_type##_Free(dest);                                           \
+                                                                              \
+        return -1;                                                            \
     }
 
 
@@ -184,19 +217,20 @@
             return -1;                                                        \
         }                                                                     \
                                                                               \
-        if (STRNEQ(anyType->other, #_type)) {                                 \
+        if (anyType->type != esxVI_Type_##_type) {                            \
             ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR,                              \
                          "Expecting type '%s' but found '%s'",                \
-                         #_type, anyType->other);                             \
+                         esxVI_Type_ToString(esxVI_Type_##_type),             \
+                         anyType->other);                                     \
             return -1;                                                        \
         }                                                                     \
                                                                               \
-        return esxVI_##_type##_Deserialize(anyType->_node, ptrptr);           \
+        return esxVI_##_type##_Deserialize(anyType->node, ptrptr);            \
     }
 
 
 
-#define ESX_VI__TEMPLATE__SERIALIZE_EXTRA(_type, _type_string, _serialize)    \
+#define ESX_VI__TEMPLATE__SERIALIZE_EXTRA(_type, _extra, _serialize)          \
     int                                                                       \
     esxVI_##_type##_Serialize(esxVI_##_type *item,                            \
                               const char *element, virBufferPtr output)       \
@@ -210,11 +244,14 @@
             return 0;                                                         \
         }                                                                     \
                                                                               \
+        _extra                                                                \
+                                                                              \
         if (esxVI_##_type##_Validate(item) < 0) {                             \
             return -1;                                                        \
         }                                                                     \
                                                                               \
-        ESV_VI__XML_TAG__OPEN(output, element, _type_string);                 \
+        ESV_VI__XML_TAG__OPEN(output, element,                                \
+                              esxVI_Type_ToString(esxVI_Type_##_type));       \
                                                                               \
         _serialize                                                            \
                                                                               \
@@ -226,7 +263,7 @@
 
 
 #define ESX_VI__TEMPLATE__SERIALIZE(_type, _serialize)                        \
-    ESX_VI__TEMPLATE__SERIALIZE_EXTRA(_type, #_type, _serialize)
+    ESX_VI__TEMPLATE__SERIALIZE_EXTRA(_type, /* nothing */, _serialize)
 
 
 
@@ -328,6 +365,31 @@
 
 
 
+/*
+ * Macros for property handling to be used as part of other macros
+ */
+
+#define ESX_VI__TEMPLATE__PROPERTY__DEEP_COPY(_type, _name)                   \
+    if (esxVI_##_type##_DeepCopy(&(*dest)->_name, src->_name) < 0) {          \
+        goto failure;                                                         \
+    }
+
+
+
+#define ESX_VI__TEMPLATE__PROPERTY__DEEP_COPY_LIST(_type, _name)              \
+    if (esxVI_##_type##_DeepCopyList(&(*dest)->_name, src->_name) < 0) {      \
+        goto failure;                                                         \
+    }
+
+
+
+#define ESX_VI__TEMPLATE__PROPERTY__DEEP_COPY_VALUE(_type, _name)             \
+    if (esxVI_##_type##_DeepCopyValue(&(*dest)->_name, src->_name) < 0) {     \
+        goto failure;                                                         \
+    }
+
+
+
 #define ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(_type, _name)                   \
     if (esxVI_##_type##_Serialize(item->_name, #_name, output) < 0) {         \
         return -1;                                                            \
@@ -360,23 +422,17 @@
 
 
 
-#define ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(_type, _name)           \
+#define ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_IGNORE(_name)                 \
     if (xmlStrEqual(childNode->name, BAD_CAST #_name)) {                      \
-        if (esxVI_##_type##_DeserializeValue(childNode,                       \
-                                             &(*ptrptr)->_name) < 0) {        \
-            goto failure;                                                     \
-        }                                                                     \
-                                                                              \
         continue;                                                             \
     }
 
 
 
-#define ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(_type, _expected,    \
-                                                        _name)                \
+#define ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(_type, _name)           \
     if (xmlStrEqual(childNode->name, BAD_CAST #_name)) {                      \
-        if (esxVI_##_type##_Deserialize(childNode, &(*ptrptr)->_name,         \
-                                        _expected) < 0) {                     \
+        if (esxVI_##_type##_DeserializeValue(childNode,                       \
+                                             &(*ptrptr)->_name) < 0) {        \
             goto failure;                                                     \
         }                                                                     \
                                                                               \
@@ -385,13 +441,6 @@
 
 
 
-#define ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_NOOP(_name)                   \
-    if (xmlStrEqual(childNode->name, BAD_CAST #_name)) {                      \
-        continue;                                                             \
-    }
-
-
-
 #define ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_LIST(_type, _name)            \
     if (xmlStrEqual(childNode->name, BAD_CAST #_name)) {                      \
         esxVI_##_type *_name##Item = NULL;                                    \
@@ -427,6 +476,10 @@
 
 
 
+/*
+ * Macros to implement enumerations
+ */
+
 #define ESX_VI__TEMPLATE__ENUMERATION__CAST_FROM_ANY_TYPE(_type)              \
     int                                                                       \
     esxVI_##_type##_CastFromAnyType(esxVI_AnyType *anyType,                   \
@@ -459,20 +512,102 @@
 
 
 
+/*
+ * Macros to implement dynamic dispatched functions
+ */
+
+#define ESX_VI__TEMPLATE__DISPATCH(__type, _dispatch, _error_return)          \
+    switch (item->_type) {                                                    \
+      _dispatch                                                               \
+                                                                              \
+      case esxVI_Type_##__type:                                               \
+        break;                                                                \
+                                                                              \
+      default:                                                                \
+        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR,                                  \
+                     "Call to %s for unexpected type '%s'", __FUNCTION__,     \
+                     esxVI_Type_ToString(item->_type));                       \
+        return _error_return;                                                 \
+    }
+
+
+
+#define ESX_VI__TEMPLATE__DISPATCH__FREE(_type)                               \
+    case esxVI_Type_##_type:                                                  \
+      esxVI_##_type##_Free((esxVI_##_type **)ptrptr);                         \
+      return;
+
+
+
+#define ESX_VI__TEMPLATE__DISPATCH__DEEP_COPY(_type)                          \
+    case esxVI_Type_##_type:                                                  \
+      return esxVI_##_type##_DeepCopy((esxVI_##_type **)dst,                  \
+                                      (esxVI_##_type *)src);
+
+
+
+#define ESX_VI__TEMPLATE__DISPATCH__SERIALIZE(_type)                          \
+    case esxVI_Type_##_type:                                                  \
+      return esxVI_##_type##_Serialize((esxVI_##_type *)item, element,        \
+                                       output);
+
+
+
+#define ESX_VI__TEMPLATE__DYNAMIC_FREE(__type, _dispatch, _body)              \
+    ESX_VI__TEMPLATE__FREE(__type,                                            \
+      ESX_VI__TEMPLATE__DISPATCH(__type, _dispatch, /* nothing */)            \
+      _body)
+
+
+
+#define ESX_VI__TEMPLATE__DYNAMIC_CAST(__type, _accept)                       \
+    esxVI_##__type *                                                          \
+    esxVI_##__type##_DynamicCast(void *item)                                  \
+    {                                                                         \
+        if (item == NULL) {                                                   \
+            ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "Invalid argument");         \
+            return NULL;                                                      \
+        }                                                                     \
+                                                                              \
+        _accept                                                               \
+                                                                              \
+        return NULL;                                                          \
+    }
+
+
+
+#define ESX_VI__TEMPLATE__DYNAMIC_CAST__ACCEPT(__type)                        \
+    if (((esxVI_Object *)item)->_type == esxVI_Type_##__type) {               \
+        return item;                                                          \
+    }
+
+
+
+#define ESX_VI__TEMPLATE__DYNAMIC_SERIALIZE(__type, _dispatch, _serialize)    \
+    ESX_VI__TEMPLATE__SERIALIZE_EXTRA(__type,                                 \
+      ESX_VI__TEMPLATE__DISPATCH(__type, _dispatch, -1),                      \
+      _serialize)
+
+
+
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  * XSI: Type
  */
 
 const char *
-esxVI_Type_Name(esxVI_Type type)
+esxVI_Type_ToString(esxVI_Type type)
 {
     switch (type) {
+      default:
       case esxVI_Type_Undefined:
-        return "undefined";
+        return "<undefined>";
 
       case esxVI_Type_Boolean:
         return "xsd:boolean";
 
+      case esxVI_Type_AnyType:
+        return "xsd:anyType";
+
       case esxVI_Type_String:
         return "xsd:string";
 
@@ -485,14 +620,53 @@ esxVI_Type_Name(esxVI_Type type)
       case esxVI_Type_Long:
         return "xsd:long";
 
-      case esxVI_Type_Other:
-        return "other";
+      case esxVI_Type_DateTime:
+        return "xsd:dateTime";
 
-      default:
-        return "unknown";
+      case esxVI_Type_Fault:
+        return "Fault";
+
+      case esxVI_Type_ManagedObjectReference:
+        return "ManagedObjectReference";
+
+#include "esx_vi_types.generated.typetostring"
+
+      case esxVI_Type_Other:
+        return "<other>";
     }
 }
 
+esxVI_Type
+esxVI_Type_FromString(const char *type)
+{
+    if (type == NULL || STREQ(type, "<undefined>")) {
+        return esxVI_Type_Undefined;
+    } else if (STREQ(type, "xsd:boolean")) {
+        return esxVI_Type_Boolean;
+    } else if (STREQ(type, "xsd:anyType")) {
+        return esxVI_Type_AnyType;
+    } else if (STREQ(type, "xsd:string")) {
+        return esxVI_Type_String;
+    } else if (STREQ(type, "xsd:short")) {
+        return esxVI_Type_Short;
+    } else if (STREQ(type, "xsd:int")) {
+        return esxVI_Type_Int;
+    } else if (STREQ(type, "xsd:long")) {
+        return esxVI_Type_Long;
+    } else if (STREQ(type, "xsd:dateTime")) {
+        return esxVI_Type_DateTime;
+    } else if (STREQ(type, "Fault")) {
+        return esxVI_Type_Fault;
+    } else if (STREQ(type, "ManagedObjectReference")) {
+        return esxVI_Type_ManagedObjectReference;
+    }
+
+#include "esx_vi_types.generated.typefromstring"
+
+    else {
+        return esxVI_Type_Other;
+    }
+}
 
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -500,7 +674,7 @@ esxVI_Type_Name(esxVI_Type type)
  */
 
 static const esxVI_Enumeration _esxVI_Boolean_Enumeration = {
-    "xsd:boolean", {
+    esxVI_Type_Boolean, {
         { "true", esxVI_Boolean_True },
         { "false", esxVI_Boolean_False },
         { NULL, -1 },
@@ -525,7 +699,7 @@ ESX_VI__TEMPLATE__ALLOC(AnyType);
 /* esxVI_AnyType_Free */
 ESX_VI__TEMPLATE__FREE(AnyType,
 {
-    xmlFreeNode(item->_node);
+    xmlFreeNode(item->node);
     VIR_FREE(item->other);
     VIR_FREE(item->value);
 });
@@ -536,9 +710,9 @@ esxVI_AnyType_ExpectType(esxVI_AnyType *anyType, esxVI_Type type)
     if (anyType->type != type) {
         ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR,
                      "Expecting type '%s' but found '%s'",
-                     esxVI_Type_Name(type),
+                     esxVI_Type_ToString(type),
                      anyType->type != esxVI_Type_Other
-                       ? esxVI_Type_Name(anyType->type)
+                       ? esxVI_Type_ToString(anyType->type)
                        : anyType->other);
         return -1;
     }
@@ -562,9 +736,10 @@ esxVI_AnyType_DeepCopy(esxVI_AnyType **dest, esxVI_AnyType *src)
         goto failure;
     }
 
-    (*dest)->_node = xmlCopyNode(src->_node, 1);
+    (*dest)->_type = src->_type;
+    (*dest)->node = xmlCopyNode(src->node, 1);
 
-    if ((*dest)->_node == NULL) {
+    if ((*dest)->node == NULL) {
         ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "Could not copy an XML node");
         goto failure;
     }
@@ -612,7 +787,7 @@ esxVI_AnyType_DeepCopy(esxVI_AnyType **dest, esxVI_AnyType *src)
 int
 esxVI_AnyType_Deserialize(xmlNodePtr node, esxVI_AnyType **anyType)
 {
-    long long number;
+    long long int number;
 
     if (anyType == NULL || *anyType != NULL) {
         ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "Invalid argument");
@@ -623,9 +798,9 @@ esxVI_AnyType_Deserialize(xmlNodePtr node, esxVI_AnyType **anyType)
         return -1;
     }
 
-    (*anyType)->_node = xmlCopyNode(node, 1);
+    (*anyType)->node = xmlCopyNode(node, 1);
 
-    if ((*anyType)->_node == NULL) {
+    if ((*anyType)->node == NULL) {
         ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "Could not copy an XML node");
         goto failure;
     }
@@ -641,6 +816,15 @@ esxVI_AnyType_Deserialize(xmlNodePtr node, esxVI_AnyType **anyType)
         goto failure;
     }
 
+    (*anyType)->type = esxVI_Type_FromString((*anyType)->other);
+
+    if ((*anyType)->type == esxVI_Type_Undefined) {
+        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR,
+                     "Unknown value '%s' for AnyType 'type' property",
+                     (*anyType)->other);
+        goto failure;
+    }
+
     (*anyType)->value =
       (char *)xmlNodeListGetString(node->doc, node->children, 1);
 
@@ -669,13 +853,11 @@ esxVI_AnyType_Deserialize(xmlNodePtr node, esxVI_AnyType **anyType)
                 goto failure;                                                 \
             }                                                                 \
                                                                               \
-            (*anyType)->type = esxVI_Type_##_type;                            \
             (*anyType)->_name = number;                                       \
         } while (0)
 
-    if (STREQ((*anyType)->other, "xsd:boolean")) {
-        (*anyType)->type = esxVI_Type_Boolean;
-
+    switch ((*anyType)->type) {
+      case esxVI_Type_Boolean:
         if (STREQ((*anyType)->value, "true")) {
             (*anyType)->boolean = esxVI_Boolean_True;
         } else if (STREQ((*anyType)->value, "false")) {
@@ -686,15 +868,27 @@ esxVI_AnyType_Deserialize(xmlNodePtr node, esxVI_AnyType **anyType)
                          (*anyType)->value);
             goto failure;
         }
-    } else if (STREQ((*anyType)->other, "xsd:string")) {
-        (*anyType)->type = esxVI_Type_String;
+
+        break;
+
+      case esxVI_Type_String:
         (*anyType)->string = (*anyType)->value;
-    } else if (STREQ((*anyType)->other, "xsd:short")) {
+        break;
+
+      case esxVI_Type_Short:
         _DESERIALIZE_NUMBER(Short, "xsd:short", int16, INT16_MIN, INT16_MAX);
-    } else if (STREQ((*anyType)->other, "xsd:int")) {
+        break;
+
+      case esxVI_Type_Int:
         _DESERIALIZE_NUMBER(Int, "xsd:int", int32, INT32_MIN, INT32_MAX);
-    } else if (STREQ((*anyType)->other, "xsd:long")) {
+        break;
+
+      case esxVI_Type_Long:
         _DESERIALIZE_NUMBER(Long, "xsd:long", int64, INT64_MIN, INT64_MAX);
+        break;
+
+      default:
+        break;
     }
 
 #undef _DESERIALIZE_NUMBER
@@ -724,6 +918,12 @@ ESX_VI__TEMPLATE__FREE(String,
     VIR_FREE(item->value);
 });
 
+/* esxVI_String_Validate */
+ESX_VI__TEMPLATE__VALIDATE(String,
+{
+    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(value)
+})
+
 /* esxVI_String_AppendToList */
 ESX_VI__TEMPLATE__LIST__APPEND(String);
 
@@ -782,30 +982,11 @@ esxVI_String_AppendValueListToList(esxVI_String **stringList,
     return -1;
 }
 
-int
-esxVI_String_DeepCopy(esxVI_String **dest, esxVI_String *src)
+/* esxVI_String_DeepCopy */
+ESX_VI__TEMPLATE__DEEP_COPY(String,
 {
-    if (dest == NULL || *dest != NULL) {
-        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "Invalid argument");
-        return -1;
-    }
-
-    if (src == NULL) {
-        return 0;
-    }
-
-    if (esxVI_String_Alloc(dest) < 0 ||
-        esxVI_String_DeepCopyValue(&(*dest)->value, src->value)) {
-        goto failure;
-    }
-
-    return 0;
-
-  failure:
-    esxVI_String_Free(dest);
-
-    return -1;
-}
+    ESX_VI__TEMPLATE__PROPERTY__DEEP_COPY_VALUE(String, value)
+})
 
 /* esxVI_String_DeepCopyList */
 ESX_VI__TEMPLATE__LIST__DEEP_COPY(String);
@@ -865,37 +1046,11 @@ esxVI_String_SerializeValue(const char *value, const char *element,
     return 0;
 }
 
-int
-esxVI_String_Deserialize(xmlNodePtr node, esxVI_String **string)
+/* esxVI_String_Deserialize */
+ESX_VI__TEMPLATE__DESERIALIZE(String,
 {
-    if (string == NULL || *string != NULL) {
-        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "Invalid argument");
-        return -1;
-    }
-
-    if (esxVI_String_Alloc(string) < 0) {
-        return -1;
-    }
-
-    (*string)->value =
-      (char *)xmlNodeListGetString(node->doc, node->children, 1);
-
-    if ((*string)->value == NULL) {
-        (*string)->value = strdup("");
-
-        if ((*string)->value == NULL) {
-            virReportOOMError();
-            goto failure;
-        }
-    }
-
-    return 0;
-
-  failure:
-    esxVI_String_Free(string);
-
-    return -1;
-}
+    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, value)
+})
 
 /* esxVI_String_DeserializeList */
 ESX_VI__TEMPLATE__LIST__DESERIALIZE(String);
@@ -938,39 +1093,21 @@ ESX_VI__TEMPLATE__FREE(Int,
 });
 
 /* esxVI_Int_Validate */
-ESX_VI__TEMPLATE__VALIDATE_NOOP(Int);
+ESX_VI__TEMPLATE__VALIDATE(Int,
+{
+})
 
 /* esxVI_Int_AppendToList */
 ESX_VI__TEMPLATE__LIST__APPEND(Int);
 
-int
-esxVI_Int_DeepCopy(esxVI_Int **dest, esxVI_Int *src)
+/* esxVI_Int_DeepCopy */
+ESX_VI__TEMPLATE__DEEP_COPY(Int,
 {
-    if (dest == NULL || *dest != NULL) {
-        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "Invalid argument");
-        return -1;
-    }
-
-    if (src == NULL) {
-        return 0;
-    }
-
-    if (esxVI_Int_Alloc(dest) < 0) {
-        goto failure;
-    }
-
     (*dest)->value = src->value;
-
-    return 0;
-
-  failure:
-    esxVI_Int_Free(dest);
-
-    return -1;
-}
+})
 
 /* esxVI_Int_Serialize */
-ESX_VI__TEMPLATE__SERIALIZE_EXTRA(Int, "xsd:int",
+ESX_VI__TEMPLATE__SERIALIZE(Int,
 {
     virBufferVSprintf(output, "%d", (int)item->value);
 });
@@ -997,13 +1134,15 @@ ESX_VI__TEMPLATE__FREE(Long,
 });
 
 /* esxVI_Long_Validate */
-ESX_VI__TEMPLATE__VALIDATE_NOOP(Long);
+ESX_VI__TEMPLATE__VALIDATE(Long,
+{
+})
 
 /* esxVI_Long_AppendToList */
 ESX_VI__TEMPLATE__LIST__APPEND(Long);
 
 /* esxVI_Long_Serialize */
-ESX_VI__TEMPLATE__SERIALIZE_EXTRA(Long, "xsd:long",
+ESX_VI__TEMPLATE__SERIALIZE(Long,
 {
     virBufferVSprintf(output, "%lld", (long long int)item->value);
 });
@@ -1036,7 +1175,7 @@ ESX_VI__TEMPLATE__VALIDATE(DateTime,
 });
 
 /* esxVI_DateTime_Serialize */
-ESX_VI__TEMPLATE__SERIALIZE_EXTRA(DateTime, "xsd:dateTime",
+ESX_VI__TEMPLATE__SERIALIZE(DateTime,
 {
     virBufferAdd(output, item->value, -1);
 });
@@ -1074,184 +1213,6 @@ esxVI_DateTime_Deserialize(xmlNodePtr node, esxVI_DateTime **dateTime)
 
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: ManagedEntityStatus
- */
-
-static const esxVI_Enumeration _esxVI_ManagedEntityStatus_Enumeration = {
-    "ManagedEntityStatus", {
-        { "gray", esxVI_ManagedEntityStatus_Gray },
-        { "green", esxVI_ManagedEntityStatus_Green },
-        { "yellow", esxVI_ManagedEntityStatus_Yellow },
-        { "red", esxVI_ManagedEntityStatus_Red },
-        { NULL, -1 },
-    },
-};
-
-/* esxVI_ManagedEntityStatus_CastFromAnyType */
-ESX_VI__TEMPLATE__ENUMERATION__CAST_FROM_ANY_TYPE(ManagedEntityStatus);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: ObjectUpdateKind
- */
-
-static const esxVI_Enumeration _esxVI_ObjectUpdateKind_Enumeration = {
-    "ObjectUpdateKind", {
-        { "enter", esxVI_ObjectUpdateKind_Enter },
-        { "leave", esxVI_ObjectUpdateKind_Leave },
-        { "modify", esxVI_ObjectUpdateKind_Modify },
-        { NULL, -1 },
-    },
-};
-
-/* esxVI_ObjectUpdateKind_Deserialize */
-ESX_VI__TEMPLATE__ENUMERATION__DESERIALIZE(ObjectUpdateKind);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: PerfSummaryType
- */
-
-static const esxVI_Enumeration _esxVI_PerfSummaryType_Enumeration = {
-    "PerfSummaryType", {
-        { "average", esxVI_PerfSummaryType_Average },
-        { "latest", esxVI_PerfSummaryType_Latest },
-        { "maximum", esxVI_PerfSummaryType_Maximum },
-        { "minimum", esxVI_PerfSummaryType_Minimum },
-        { "none", esxVI_PerfSummaryType_None },
-        { "summation", esxVI_PerfSummaryType_Summation },
-        { NULL, -1 },
-    },
-};
-
-/* esxVI_PerfSummaryType_Deserialize */
-ESX_VI__TEMPLATE__ENUMERATION__DESERIALIZE(PerfSummaryType);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: PerfStatsType
- */
-
-static const esxVI_Enumeration _esxVI_PerfStatsType_Enumeration = {
-    "PerfStatsType", {
-        { "absolute", esxVI_PerfStatsType_Absolute },
-        { "delta", esxVI_PerfStatsType_Delta },
-        { "rate", esxVI_PerfStatsType_Rate },
-        { NULL, -1 },
-    },
-};
-
-/* esxVI_PerfStatsType_Deserialize */
-ESX_VI__TEMPLATE__ENUMERATION__DESERIALIZE(PerfStatsType);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: PropertyChangeOp
- */
-
-static const esxVI_Enumeration _esxVI_PropertyChangeOp_Enumeration = {
-    "PropertyChangeOp", {
-        { "add", esxVI_PropertyChangeOp_Add },
-        { "remove", esxVI_PropertyChangeOp_Remove },
-        { "assign", esxVI_PropertyChangeOp_Assign },
-        { "indirectRemove", esxVI_PropertyChangeOp_IndirectRemove },
-        { NULL, -1 },
-    },
-};
-
-/* esxVI_PropertyChangeOp_Deserialize */
-ESX_VI__TEMPLATE__ENUMERATION__DESERIALIZE(PropertyChangeOp);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: SharesLevel
- */
-
-static const esxVI_Enumeration _esxVI_SharesLevel_Enumeration = {
-    "SharesLevel", {
-        { "custom", esxVI_SharesLevel_Custom },
-        { "high", esxVI_SharesLevel_High },
-        { "low", esxVI_SharesLevel_Low },
-        { "normal", esxVI_SharesLevel_Normal },
-        { NULL, -1 },
-    },
-};
-
-/* esxVI_SharesLevel_Serialize */
-ESX_VI__TEMPLATE__ENUMERATION__SERIALIZE(SharesLevel);
-
-/* esxVI_SharesLevel_Deserialize */
-ESX_VI__TEMPLATE__ENUMERATION__DESERIALIZE(SharesLevel);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: TaskInfoState
- */
-
-static const esxVI_Enumeration _esxVI_TaskInfoState_Enumeration = {
-    "TaskInfoState", {
-        { "error", esxVI_TaskInfoState_Error },
-        { "queued", esxVI_TaskInfoState_Queued },
-        { "running", esxVI_TaskInfoState_Running },
-        { "success", esxVI_TaskInfoState_Success },
-        { NULL, -1 },
-    },
-};
-
-/* esxVI_TaskInfoState_CastFromAnyType */
-ESX_VI__TEMPLATE__ENUMERATION__CAST_FROM_ANY_TYPE(TaskInfoState);
-
-/* esxVI_TaskInfoState_Deserialize */
-ESX_VI__TEMPLATE__ENUMERATION__DESERIALIZE(TaskInfoState);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: VirtualMachineMovePriority
- */
-
-static const esxVI_Enumeration _esxVI_VirtualMachineMovePriority_Enumeration = {
-    "VirtualMachineMovePriority", {
-        { "lowPriority", esxVI_VirtualMachineMovePriority_LowPriority },
-        { "highPriority", esxVI_VirtualMachineMovePriority_HighPriority },
-        { "defaultPriority", esxVI_VirtualMachineMovePriority_DefaultPriority },
-        { NULL, -1 },
-    },
-};
-
-/* esxVI_VirtualMachineMovePriority_Serialize */
-ESX_VI__TEMPLATE__ENUMERATION__SERIALIZE(VirtualMachineMovePriority);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: VirtualMachinePowerState
- */
-
-static const esxVI_Enumeration _esxVI_VirtualMachinePowerState_Enumeration = {
-    "VirtualMachinePowerState", {
-        { "poweredOff", esxVI_VirtualMachinePowerState_PoweredOff },
-        { "poweredOn", esxVI_VirtualMachinePowerState_PoweredOn },
-        { "suspended", esxVI_VirtualMachinePowerState_Suspended },
-        { NULL, -1 },
-    },
-};
-
-/* esxVI_VirtualMachinePowerState_CastFromAnyType */
-ESX_VI__TEMPLATE__ENUMERATION__CAST_FROM_ANY_TYPE(VirtualMachinePowerState);
-
-/* esxVI_VirtualMachinePowerState_Serialize */
-ESX_VI__TEMPLATE__ENUMERATION__SERIALIZE(VirtualMachinePowerState);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  * VI Type: Fault
  */
 
@@ -1277,7 +1238,7 @@ ESX_VI__TEMPLATE__DESERIALIZE(Fault,
 {
     ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, faultcode);
     ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, faultstring);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_NOOP(detail); /* FIXME */
+    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_IGNORE(detail); /* FIXME */
 });
 
 
@@ -1298,128 +1259,21 @@ ESX_VI__TEMPLATE__FREE(ManagedObjectReference,
     VIR_FREE(item->value);
 });
 
-int
-esxVI_ManagedObjectReference_DeepCopy(esxVI_ManagedObjectReference **dest,
-                                      esxVI_ManagedObjectReference *src)
+/* esxVI_ManagedObjectReference_DeepCopy */
+ESX_VI__TEMPLATE__DEEP_COPY(ManagedObjectReference,
 {
-    if (dest == NULL || *dest != NULL) {
-        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "Invalid argument");
-        return -1;
-    }
-
-    if (src == NULL) {
-        return 0;
-    }
-
-    if (esxVI_ManagedObjectReference_Alloc(dest) < 0 ||
-        esxVI_String_DeepCopyValue(&(*dest)->type, src->type) < 0 ||
-        esxVI_String_DeepCopyValue(&(*dest)->value, src->value) < 0) {
-        goto failure;
-    }
-
-    return 0;
-
-  failure:
-    esxVI_ManagedObjectReference_Free(dest);
-
-    return -1;
-}
+    ESX_VI__TEMPLATE__PROPERTY__DEEP_COPY_VALUE(String, type)
+    ESX_VI__TEMPLATE__PROPERTY__DEEP_COPY_VALUE(String, value)
+})
 
 /* esxVI_ManagedObjectReference_AppendToList */
 ESX_VI__TEMPLATE__LIST__APPEND(ManagedObjectReference);
 
-int
-esxVI_ManagedObjectReference_CastFromAnyType
-  (esxVI_AnyType *anyType,
-   esxVI_ManagedObjectReference **managedObjectReference,
-   const char *expectedType)
-{
-    if (anyType == NULL || managedObjectReference == NULL ||
-        *managedObjectReference != NULL) {
-        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "Invalid argument");
-        return -1;
-    }
-
-    if (STRNEQ(anyType->other, "ManagedObjectReference")) {
-        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR,
-                     "Expecting type 'ManagedObjectReference' but found '%s'",
-                     anyType->other);
-        return -1;
-    }
-
-    return esxVI_ManagedObjectReference_Deserialize(anyType->_node,
-                                                    managedObjectReference,
-                                                    expectedType);
-}
-
-int
-esxVI_ManagedObjectReference_CastListFromAnyType
-  (esxVI_AnyType *anyType,
-   esxVI_ManagedObjectReference **managedObjectReferenceList,
-   const char *expectedType)
-{
-    int result = 0;
-    xmlNodePtr childNode = NULL;
-    esxVI_AnyType *childAnyType = NULL;
-    esxVI_ManagedObjectReference *managedObjectReference = NULL;
-
-    if (managedObjectReferenceList == NULL ||
-        *managedObjectReferenceList != NULL) {
-        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "Invalid argument");
-        goto failure;
-    }
-
-    if (anyType == NULL) {
-        return 0;
-    }
-
-    if (STRNEQ(anyType->other, "ArrayOfManagedObjectReference")) {
-        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR,
-                     "Expecting type to be 'ArrayOfManagedObjectReference' "
-                     "but found '%s'", anyType->other);
-        goto failure;
-    }
-
-    for (childNode = anyType->_node->children; childNode != NULL;
-         childNode = childNode->next) {
-        if (childNode->type != XML_ELEMENT_NODE) {
-            ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR,
-                         "Wrong XML element type %d", childNode->type);
-            goto failure;
-        }
-
-        esxVI_AnyType_Free(&childAnyType);
-
-        if (esxVI_AnyType_Deserialize(childNode, &childAnyType) < 0) {
-            goto failure;
-        }
-
-        managedObjectReference = NULL;
-
-        if (esxVI_ManagedObjectReference_CastFromAnyType
-              (childAnyType, &managedObjectReference, expectedType) < 0) {
-            goto failure;
-        }
-
-        if (esxVI_ManagedObjectReference_AppendToList
-              (managedObjectReferenceList, managedObjectReference) < 0) {
-            goto failure;
-        }
-    }
-
+/* esxVI_ManagedObjectReference_CastFromAnyType */
+ESX_VI__TEMPLATE__CAST_FROM_ANY_TYPE(ManagedObjectReference)
 
-  cleanup:
-    esxVI_AnyType_Free(&childAnyType);
-
-    return result;
-
-  failure:
-    esxVI_ManagedObjectReference_Free(managedObjectReferenceList);
-
-    result = -1;
-
-    goto cleanup;
-}
+/* esxVI_ManagedObjectReference_CastListFromAnyType */
+ESX_VI__TEMPLATE__LIST__CAST_FROM_ANY_TYPE(ManagedObjectReference)
 
 int
 esxVI_ManagedObjectReference_Serialize
@@ -1454,8 +1308,7 @@ ESX_VI__TEMPLATE__LIST__SERIALIZE(ManagedObjectReference);
 
 int
 esxVI_ManagedObjectReference_Deserialize
-  (xmlNodePtr node, esxVI_ManagedObjectReference **managedObjectReference,
-   const char *expectedType)
+  (xmlNodePtr node, esxVI_ManagedObjectReference **managedObjectReference)
 {
     if (managedObjectReference == NULL || *managedObjectReference != NULL) {
         ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "Invalid argument");
@@ -1475,14 +1328,6 @@ esxVI_ManagedObjectReference_Deserialize
         goto failure;
     }
 
-    if (expectedType != NULL &&
-        STRNEQ(expectedType, (*managedObjectReference)->type)) {
-        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR,
-                     "Expected type '%s' but found '%s'", expectedType,
-                     (*managedObjectReference)->type);
-        goto failure;
-    }
-
     if (esxVI_String_DeserializeValue(node,
                                       &(*managedObjectReference)->value) < 0) {
         goto failure;
@@ -1496,1533 +1341,4 @@ esxVI_ManagedObjectReference_Deserialize
     return -1;
 }
 
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: DynamicProperty
- */
-
-/* esxVI_DynamicProperty_Alloc */
-ESX_VI__TEMPLATE__ALLOC(DynamicProperty);
-
-/* esxVI_DynamicProperty_Free */
-ESX_VI__TEMPLATE__FREE(DynamicProperty,
-{
-    esxVI_DynamicProperty_Free(&item->_next);
-
-    VIR_FREE(item->name);
-    esxVI_AnyType_Free(&item->val);
-});
-
-/* esxVI_DynamicProperty_Validate */
-ESX_VI__TEMPLATE__VALIDATE(DynamicProperty,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(name);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(val);
-});
-
-int
-esxVI_DynamicProperty_DeepCopy(esxVI_DynamicProperty **dest,
-                               esxVI_DynamicProperty *src)
-{
-    if (dest == NULL || *dest != NULL) {
-        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "Invalid argument");
-        return -1;
-    }
-
-    if (src == NULL) {
-        return 0;
-    }
-
-    if (esxVI_DynamicProperty_Alloc(dest) < 0 ||
-        esxVI_String_DeepCopyValue(&(*dest)->name, src->name) < 0 ||
-        esxVI_AnyType_DeepCopy(&(*dest)->val, src->val) < 0) {
-        goto failure;
-    }
-
-    return 0;
-
-  failure:
-    esxVI_DynamicProperty_Free(dest);
-
-    return -1;
-}
-
-/* esxVI_DynamicProperty_DeepCopyList */
-ESX_VI__TEMPLATE__LIST__DEEP_COPY(DynamicProperty);
-
-/* esxVI_DynamicProperty_AppendToList */
-ESX_VI__TEMPLATE__LIST__APPEND(DynamicProperty);
-
-/* esxVI_DynamicProperty_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(DynamicProperty,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, name);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(AnyType, val);
-});
-
-/* esxVI_DynamicProperty_DeserializeList */
-ESX_VI__TEMPLATE__LIST__DESERIALIZE(DynamicProperty);
-
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: HostCpuIdInfo
- */
-
-/* esxVI_HostCpuIdInfo_Alloc */
-ESX_VI__TEMPLATE__ALLOC(HostCpuIdInfo);
-
-/* esxVI_HostCpuIdInfo_Free */
-ESX_VI__TEMPLATE__FREE(HostCpuIdInfo,
-{
-    esxVI_HostCpuIdInfo_Free(&item->_next);
-
-    esxVI_Int_Free(&item->level);
-    VIR_FREE(item->vendor);
-    VIR_FREE(item->eax);
-    VIR_FREE(item->ebx);
-    VIR_FREE(item->ecx);
-    VIR_FREE(item->edx);
-});
-
-/* esxVI_HostCpuIdInfo_Validate */
-ESX_VI__TEMPLATE__VALIDATE(HostCpuIdInfo,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(level);
-});
-
-/* esxVI_HostCpuIdInfo_CastFromAnyType */
-ESX_VI__TEMPLATE__CAST_FROM_ANY_TYPE(HostCpuIdInfo);
-
-/* esxVI_HostCpuIdInfo_CastListFromAnyType */
-ESX_VI__TEMPLATE__LIST__CAST_FROM_ANY_TYPE(HostCpuIdInfo);
-
-/* esxVI_HostCpuIdInfo_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(HostCpuIdInfo,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Int, level);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, vendor);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, eax);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, ebx);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, ecx);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, edx);
-});
-
-/* esxVI_HostCpuIdInfo_DeserializeList */
-ESX_VI__TEMPLATE__LIST__DESERIALIZE(HostCpuIdInfo);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: SelectionSpec
- */
-
-/* esxVI_SelectionSpec_Alloc */
-ESX_VI__TEMPLATE__ALLOC(SelectionSpec);
-
-void
-esxVI_SelectionSpec_Free(esxVI_SelectionSpec **selectionSpec)
-{
-    esxVI_SelectionSpec *local = NULL;
-
-    if (selectionSpec == NULL || *selectionSpec == NULL) {
-        return;
-    }
-
-    esxVI_SelectionSpec_Free(&(*selectionSpec)->_next);
-
-    if ((*selectionSpec)->_super != NULL) {
-        /*
-         * Explicitly set this pointer to NULL here, otherwise this is will
-         * result in a dangling pointer. The actual memory of this object is
-         * freed by a call from the esxVI_TraversalSpec_Free function to the
-         * esxVI_SelectionSpec_Free function with the base pointer.
-         *
-         * Use a local copy of the pointer and set the reference to NULL,
-         * otherwise Valgrind complains about invalid writes.
-         */
-        local = *selectionSpec;
-        *selectionSpec = NULL;
-
-        esxVI_TraversalSpec_Free(&local->_super);
-    } else {
-        VIR_FREE((*selectionSpec)->name);
-
-        VIR_FREE(*selectionSpec);
-    }
-}
-
-/* esxVI_SelectionSpec_Validate */
-ESX_VI__TEMPLATE__VALIDATE(SelectionSpec,
-{
-    if (item->_super != NULL) {
-        return esxVI_TraversalSpec_Validate(item->_super);
-    }
-
-    /* All properties are optional */
-    (void)type_name;
-});
-
-/* esxVI_SelectionSpec_AppendToList */
-ESX_VI__TEMPLATE__LIST__APPEND(SelectionSpec);
-
-int
-esxVI_SelectionSpec_Serialize(esxVI_SelectionSpec *selectionSpec,
-                              const char *element, virBufferPtr output)
-{
-    if (element == NULL || output == NULL) {
-        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "Invalid argument");
-        return -1;
-    }
-
-    if (selectionSpec == NULL) {
-        return 0;
-    }
-
-    if (selectionSpec->_super != NULL) {
-        return esxVI_TraversalSpec_Serialize(selectionSpec->_super, element,
-                                             output);
-    }
-
-    if (esxVI_SelectionSpec_Validate(selectionSpec) < 0) {
-        return -1;
-    }
-
-    ESV_VI__XML_TAG__OPEN(output, element, "SelectionSpec");
-
-    if (esxVI_String_SerializeValue(selectionSpec->name, "name", output) < 0) {
-        return -1;
-    }
-
-    ESV_VI__XML_TAG__CLOSE(output, element);
-
-    return 0;
-}
-
-/* esxVI_SelectionSpec_SerializeList */
-ESX_VI__TEMPLATE__LIST__SERIALIZE(SelectionSpec);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: TraversalSpec extends SelectionSpec
- */
-
-int
-esxVI_TraversalSpec_Alloc(esxVI_TraversalSpec **traversalSpec)
-{
-    if (esxVI_Alloc((void **)traversalSpec, sizeof(esxVI_TraversalSpec)) < 0) {
-        return -1;
-    }
-
-    if (esxVI_SelectionSpec_Alloc(&(*traversalSpec)->_base) < 0) {
-        esxVI_TraversalSpec_Free(traversalSpec);
-        return -1;
-    }
-
-    (*traversalSpec)->_base->_super = *traversalSpec;
-
-    return 0;
-}
-
-void
-esxVI_TraversalSpec_Free(esxVI_TraversalSpec **traversalSpec)
-{
-    esxVI_TraversalSpec *local = NULL;
-
-    if (traversalSpec == NULL || *traversalSpec == NULL) {
-        return;
-    }
-
-    /*
-     * Need to store the traversalSpec pointer in a local variable here,
-     * because it is possible that the traversalSpec pointer and the _super
-     * pointer represent the same location in memory, e.g. if
-     * esxVI_SelectionSpec_Free calls esxVI_TraversalSpec_Free with the _super
-     * pointer as argument. Setting the _super pointer to NULL sets the
-     * traversalSpec pointer also to NULL, because we're working on a reference
-     * to this pointer here.
-     *
-     * Also use a local copy of the pointer and set the reference to NULL,
-     * otherwise Valgrind complains about invalid writes.
-     */
-    local = *traversalSpec;
-    *traversalSpec = NULL;
-
-    /*
-     * Setting the _super pointer to NULL here is important, otherwise
-     * esxVI_SelectionSpec_Free would call esxVI_TraversalSpec_Free again,
-     * resulting in both functions calling each other trying to free the
-     * _base/_super object until a stackoverflow occurs.
-     */
-    local->_base->_super = NULL;
-
-    esxVI_SelectionSpec_Free(&local->_base);
-    VIR_FREE(local->type);
-    VIR_FREE(local->path);
-    esxVI_SelectionSpec_Free(&local->selectSet);
-
-    VIR_FREE(local);
-}
-
-/* esxVI_TraversalSpec_Validate */
-ESX_VI__TEMPLATE__VALIDATE(TraversalSpec,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(type);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(path);
-});
-
-/* esxVI_TraversalSpec_Serialize */
-ESX_VI__TEMPLATE__SERIALIZE(TraversalSpec,
-{
-    if (esxVI_String_SerializeValue(item->_base->name, "name", output) < 0) {
-        return -1;
-    }
-
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, type);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, path);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(Boolean, skip);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_LIST(SelectionSpec, selectSet);
-});
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: ObjectSpec
- */
-
-/* esxVI_ObjectSpec_Alloc */
-ESX_VI__TEMPLATE__ALLOC(ObjectSpec);
-
-/* esxVI_ObjectSpec_Free */
-ESX_VI__TEMPLATE__FREE(ObjectSpec,
-{
-    esxVI_ObjectSpec_Free(&item->_next);
-
-    esxVI_ManagedObjectReference_Free(&item->obj);
-    esxVI_SelectionSpec_Free(&item->selectSet);
-});
-
-/* esxVI_ObjectSpec_Validate */
-ESX_VI__TEMPLATE__VALIDATE(ObjectSpec,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(obj);
-});
-
-/* esxVI_ObjectSpec_AppendToList */
-ESX_VI__TEMPLATE__LIST__APPEND(ObjectSpec);
-
-/* esxVI_ObjectSpec_Serialize */
-ESX_VI__TEMPLATE__SERIALIZE(ObjectSpec,
-{
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(ManagedObjectReference, obj);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(Boolean, skip);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_LIST(SelectionSpec, selectSet);
-});
-
-/* esxVI_ObjectSpec_SerializeList */
-ESX_VI__TEMPLATE__LIST__SERIALIZE(ObjectSpec);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PropertyChange
- */
-
-/* esxVI_PropertyChange_Alloc */
-ESX_VI__TEMPLATE__ALLOC(PropertyChange);
-
-/* esxVI_PropertyChange_Free */
-ESX_VI__TEMPLATE__FREE(PropertyChange,
-{
-    esxVI_PropertyChange_Free(&item->_next);
-
-    VIR_FREE(item->name);
-    esxVI_AnyType_Free(&item->val);
-});
-
-/* esxVI_PropertyChange_Validate */
-ESX_VI__TEMPLATE__VALIDATE(PropertyChange,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(name);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(op);
-});
-
-/* esxVI_PropertyChange_AppendToList */
-ESX_VI__TEMPLATE__LIST__APPEND(PropertyChange);
-
-/* esxVI_PropertyChange_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(PropertyChange,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, name);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(PropertyChangeOp, op);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(AnyType, val);
-});
-
-/* esxVI_PropertyChange_DeserializeList */
-ESX_VI__TEMPLATE__LIST__DESERIALIZE(PropertyChange);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PropertySpec
- */
-
-/* esxVI_PropertySpec_Alloc */
-ESX_VI__TEMPLATE__ALLOC(PropertySpec);
-
-/* esxVI_PropertySpec_Free */
-ESX_VI__TEMPLATE__FREE(PropertySpec,
-{
-    esxVI_PropertySpec_Free(&item->_next);
-
-    VIR_FREE(item->type);
-    esxVI_String_Free(&item->pathSet);
-});
-
-/* esxVI_PropertySpec_Validate */
-ESX_VI__TEMPLATE__VALIDATE(PropertySpec,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(type);
-});
-
-/* esxVI_PropertySpec_AppendToList */
-ESX_VI__TEMPLATE__LIST__APPEND(PropertySpec);
-
-/* esxVI_PropertySpec_Serialize */
-ESX_VI__TEMPLATE__SERIALIZE(PropertySpec,
-{
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, type);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(Boolean, all);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_LIST(String, pathSet);
-});
-
-/* esxVI_PropertySpec_SerializeList */
-ESX_VI__TEMPLATE__LIST__SERIALIZE(PropertySpec);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PropertyFilterSpec
- */
-
-/* esxVI_PropertyFilterSpec_Alloc */
-ESX_VI__TEMPLATE__ALLOC(PropertyFilterSpec);
-
-/* esxVI_PropertyFilterSpec_Free */
-ESX_VI__TEMPLATE__FREE(PropertyFilterSpec,
-{
-    esxVI_PropertyFilterSpec_Free(&item->_next);
-
-    esxVI_PropertySpec_Free(&item->propSet);
-    esxVI_ObjectSpec_Free(&item->objectSet);
-});
-
-/* esxVI_PropertyFilterSpec_Validate */
-ESX_VI__TEMPLATE__VALIDATE(PropertyFilterSpec,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(propSet);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(objectSet);
-});
-
-/* esxVI_PropertyFilterSpec_AppendToList */
-ESX_VI__TEMPLATE__LIST__APPEND(PropertyFilterSpec);
-
-/* esxVI_PropertyFilterSpec_Serialize */
-ESX_VI__TEMPLATE__SERIALIZE(PropertyFilterSpec,
-{
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_LIST(PropertySpec, propSet);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_LIST(ObjectSpec, objectSet);
-});
-
-/* esxVI_PropertyFilterSpec_SerializeList */
-ESX_VI__TEMPLATE__LIST__SERIALIZE(PropertyFilterSpec);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: ObjectContent
- */
-
-/* esxVI_ObjectContent_Alloc */
-ESX_VI__TEMPLATE__ALLOC(ObjectContent);
-
-/* esxVI_ObjectContent_Free */
-ESX_VI__TEMPLATE__FREE(ObjectContent,
-{
-    esxVI_ObjectContent_Free(&item->_next);
-
-    esxVI_ManagedObjectReference_Free(&item->obj);
-    esxVI_DynamicProperty_Free(&item->propSet);
-    /*esxVI_MissingProperty_Free(&item->missingSet);*//* FIXME */
-});
-
-/* esxVI_ObjectContent_Validate */
-ESX_VI__TEMPLATE__VALIDATE(ObjectContent,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(obj);
-});
-
-/* esxVI_ObjectContent_AppendToList */
-ESX_VI__TEMPLATE__LIST__APPEND(ObjectContent);
-
-int
-esxVI_ObjectContent_DeepCopy(esxVI_ObjectContent **dest,
-                             esxVI_ObjectContent *src)
-{
-    if (dest == NULL || *dest != NULL) {
-        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "Invalid argument");
-        return -1;
-    }
-
-    if (src == NULL) {
-        return 0;
-    }
-
-    if (esxVI_ObjectContent_Alloc(dest) < 0 ||
-        esxVI_ManagedObjectReference_DeepCopy(&(*dest)->obj, src->obj) < 0 ||
-        esxVI_DynamicProperty_DeepCopyList(&(*dest)->propSet,
-                                           src->propSet) < 0) {
-        goto failure;
-    }
-
-#if 0 /* FIXME */
-    if (esxVI_MissingProperty_DeepCopyList(&(*dest)->missingSet,
-                                           src->missingSet) < 0) {
-        goto failure;
-    }
-#endif
-
-    return 0;
-
-  failure:
-    esxVI_ObjectContent_Free(dest);
-
-    return -1;
-}
-
-/* esxVI_ObjectContent_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(ObjectContent,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     NULL, obj);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_LIST(DynamicProperty, propSet);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_NOOP(missingSet); /* FIXME */
-});
-
-/* esxVI_ObjectContent_DeserializeList */
-ESX_VI__TEMPLATE__LIST__DESERIALIZE(ObjectContent);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: ObjectUpdate
- */
-
-/* esxVI_ObjectUpdate_Alloc */
-ESX_VI__TEMPLATE__ALLOC(ObjectUpdate);
-
-/* esxVI_ObjectUpdate_Free */
-ESX_VI__TEMPLATE__FREE(ObjectUpdate,
-{
-    esxVI_ObjectUpdate_Free(&item->_next);
-
-    esxVI_ManagedObjectReference_Free(&item->obj);
-    esxVI_PropertyChange_Free(&item->changeSet);
-    /*esxVI_MissingProperty_Free(&item->missingSet);*//* FIXME */
-});
-
-/* esxVI_ObjectUpdate_Validate */
-ESX_VI__TEMPLATE__VALIDATE(ObjectUpdate,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(kind);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(obj);
-});
-
-/* esxVI_ObjectUpdate_AppendToList */
-ESX_VI__TEMPLATE__LIST__APPEND(ObjectUpdate);
-
-/* esxVI_ObjectUpdate_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(ObjectUpdate,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(ObjectUpdateKind, kind);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     NULL, obj);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_LIST(PropertyChange, changeSet);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_NOOP(missingSet); /* FIXME */
-});
-
-/* esxVI_ObjectUpdate_DeserializeList */
-ESX_VI__TEMPLATE__LIST__DESERIALIZE(ObjectUpdate);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PropertyFilterUpdate
- */
-
-/* esxVI_PropertyFilterUpdate_Alloc */
-ESX_VI__TEMPLATE__ALLOC(PropertyFilterUpdate);
-
-/* esxVI_PropertyFilterUpdate_Free */
-ESX_VI__TEMPLATE__FREE(PropertyFilterUpdate,
-{
-    esxVI_PropertyFilterUpdate_Free(&item->_next);
-
-    esxVI_ManagedObjectReference_Free(&item->filter);
-    esxVI_ObjectUpdate_Free(&item->objectSet);
-    /*esxVI_MissingProperty_Free(&item->missingSet);*//* FIXME */
-});
-
-/* esxVI_PropertyFilterUpdate_Validate */
-ESX_VI__TEMPLATE__VALIDATE(PropertyFilterUpdate,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(filter);
-});
-
-/* esxVI_PropertyFilterUpdate_AppendToList */
-ESX_VI__TEMPLATE__LIST__APPEND(PropertyFilterUpdate);
-
-/* esxVI_PropertyFilterUpdate_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(PropertyFilterUpdate,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     NULL, filter);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_LIST(ObjectUpdate, objectSet);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_NOOP(missingSet); /* FIXME */
-});
-
-/* esxVI_PropertyFilterUpdate_DeserializeList */
-ESX_VI__TEMPLATE__LIST__DESERIALIZE(PropertyFilterUpdate);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: AboutInfo
- */
-
-/* esxVI_AboutInfo_Alloc */
-ESX_VI__TEMPLATE__ALLOC(AboutInfo);
-
-/* esxVI_AboutInfo_Free */
-ESX_VI__TEMPLATE__FREE(AboutInfo,
-{
-    VIR_FREE(item->name);
-    VIR_FREE(item->fullName);
-    VIR_FREE(item->vendor);
-    VIR_FREE(item->version);
-    VIR_FREE(item->build);
-    VIR_FREE(item->localeVersion);
-    VIR_FREE(item->localeBuild);
-    VIR_FREE(item->osType);
-    VIR_FREE(item->productLineId);
-    VIR_FREE(item->apiType);
-    VIR_FREE(item->apiVersion);
-});
-
-/* esxVI_AboutInfo_Validate */
-ESX_VI__TEMPLATE__VALIDATE(AboutInfo,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(name);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(fullName);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(vendor);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(version);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(build);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(localeVersion);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(localeBuild);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(osType);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(productLineId);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(apiType);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(apiVersion);
-});
-
-/* esxVI_AboutInfo_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(AboutInfo,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, name);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, fullName);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, vendor);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, version);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, build);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, localeVersion);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, localeBuild);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, osType);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, productLineId);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, apiType);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, apiVersion);
-});
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: ServiceContent
- */
-
-/* esxVI_ServiceContent_Alloc */
-ESX_VI__TEMPLATE__ALLOC(ServiceContent);
-
-/* esxVI_ServiceContent_Free */
-ESX_VI__TEMPLATE__FREE(ServiceContent,
-{
-    esxVI_ManagedObjectReference_Free(&item->rootFolder);
-    esxVI_ManagedObjectReference_Free(&item->propertyCollector);
-    esxVI_ManagedObjectReference_Free(&item->viewManager);
-    esxVI_AboutInfo_Free(&item->about);
-    esxVI_ManagedObjectReference_Free(&item->setting);
-    esxVI_ManagedObjectReference_Free(&item->userDirectory);
-    esxVI_ManagedObjectReference_Free(&item->sessionManager);
-    esxVI_ManagedObjectReference_Free(&item->authorizationManager);
-    esxVI_ManagedObjectReference_Free(&item->perfManager);
-    esxVI_ManagedObjectReference_Free(&item->scheduledTaskManager);
-    esxVI_ManagedObjectReference_Free(&item->alarmManager);
-    esxVI_ManagedObjectReference_Free(&item->eventManager);
-    esxVI_ManagedObjectReference_Free(&item->taskManager);
-    esxVI_ManagedObjectReference_Free(&item->extensionManager);
-    esxVI_ManagedObjectReference_Free(&item->customizationSpecManager);
-    esxVI_ManagedObjectReference_Free(&item->customFieldsManager);
-    esxVI_ManagedObjectReference_Free(&item->accountManager);
-    esxVI_ManagedObjectReference_Free(&item->diagnosticManager);
-    esxVI_ManagedObjectReference_Free(&item->licenseManager);
-    esxVI_ManagedObjectReference_Free(&item->searchIndex);
-    esxVI_ManagedObjectReference_Free(&item->fileManager);
-    esxVI_ManagedObjectReference_Free(&item->virtualDiskManager);
-    esxVI_ManagedObjectReference_Free(&item->virtualizationManager);
-});
-
-/* esxVI_ServiceContent_Validate */
-ESX_VI__TEMPLATE__VALIDATE(ServiceContent,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(rootFolder);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(propertyCollector);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(about);
-});
-
-/* esxVI_ServiceContent_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(ServiceContent,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "Folder", rootFolder);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                    "PropertyCollector",
-                                                     propertyCollector);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "ViewManager",
-                                                     viewManager);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(AboutInfo, about);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "OptionManager", setting);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "UserDirectory",
-                                                     userDirectory);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "SessionManager",
-                                                     sessionManager);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "AuthorizationManager",
-                                                     authorizationManager);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "PerformanceManager",
-                                                     perfManager);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "ScheduledTaskManager",
-                                                     scheduledTaskManager);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "AlarmManager",
-                                                     alarmManager);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "EventManager",
-                                                     eventManager);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "TaskManager",
-                                                     taskManager);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "ExtensionManager",
-                                                     extensionManager);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "CustomizationSpecManager",
-                                                     customizationSpecManager);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "CustomFieldsManager",
-                                                     customFieldsManager);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "HostLocalAccountManager",
-                                                     accountManager);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "DiagnosticManager",
-                                                     diagnosticManager);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "LicenseManager",
-                                                     licenseManager);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "SearchIndex",
-                                                     searchIndex);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "FileManager",
-                                                     fileManager);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "VirtualDiskManager",
-                                                     virtualDiskManager);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "VirtualizationManager",
-                                                     virtualizationManager);
-});
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: UpdateSet
- */
-
-/* esxVI_UpdateSet_Alloc */
-ESX_VI__TEMPLATE__ALLOC(UpdateSet);
-
-/* esxVI_UpdateSet_Free */
-ESX_VI__TEMPLATE__FREE(UpdateSet,
-{
-    VIR_FREE(item->version);
-    esxVI_PropertyFilterUpdate_Free(&item->filterSet);
-});
-
-/* esxVI_UpdateSet_Validate */
-ESX_VI__TEMPLATE__VALIDATE(UpdateSet,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(version);
-});
-
-/* esxVI_UpdateSet_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(UpdateSet,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, version);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_LIST(PropertyFilterUpdate,
-                                                 filterSet);
-});
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: SharesInfo
- */
-
-/* esxVI_SharesInfo_Alloc */
-ESX_VI__TEMPLATE__ALLOC(SharesInfo);
-
-/* esxVI_SharesInfo_Free */
-ESX_VI__TEMPLATE__FREE(SharesInfo,
-{
-    esxVI_Int_Free(&item->shares);
-});
-
-/* esxVI_SharesInfo_Validate */
-ESX_VI__TEMPLATE__VALIDATE(SharesInfo,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(shares);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(level);
-});
-
-/* esxVI_SharesInfo_CastFromAnyType */
-ESX_VI__TEMPLATE__CAST_FROM_ANY_TYPE(SharesInfo);
-
-/* esxVI_SharesInfo_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(SharesInfo,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Int, shares);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(SharesLevel, level);
-});
-
-/* esxVI_SharesInfo_Serialize */
-ESX_VI__TEMPLATE__SERIALIZE(SharesInfo,
-{
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(Int, shares);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(SharesLevel, level);
-});
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: ResourceAllocationInfo
- */
-
-/* esxVI_ResourceAllocationInfo_Alloc */
-ESX_VI__TEMPLATE__ALLOC(ResourceAllocationInfo);
-
-/* esxVI_ResourceAllocationInfo_Free */
-ESX_VI__TEMPLATE__FREE(ResourceAllocationInfo,
-{
-    esxVI_Long_Free(&item->reservation);
-    esxVI_Long_Free(&item->limit);
-    esxVI_SharesInfo_Free(&item->shares);
-    esxVI_Long_Free(&item->overheadLimit);
-});
-
-/* esxVI_ResourceAllocationInfo_Validate */
-ESX_VI__TEMPLATE__VALIDATE_NOOP(ResourceAllocationInfo);
-
-/* esxVI_ResourceAllocationInfo_Serialize */
-ESX_VI__TEMPLATE__SERIALIZE(ResourceAllocationInfo,
-{
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(Long, reservation);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(Boolean, expandableReservation);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(Long, limit);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(SharesInfo, shares);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(Long, overheadLimit);
-});
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: ResourcePoolResourceUsage
- */
-
-/* esxVI_ResourcePoolResourceUsage_Alloc */
-ESX_VI__TEMPLATE__ALLOC(ResourcePoolResourceUsage);
-
-/* esxVI_ResourcePoolResourceUsage_Free */
-ESX_VI__TEMPLATE__FREE(ResourcePoolResourceUsage,
-{
-    esxVI_Long_Free(&item->reservationUsed);
-    esxVI_Long_Free(&item->reservationUsedForVm);
-    esxVI_Long_Free(&item->unreservedForPool);
-    esxVI_Long_Free(&item->unreservedForVm);
-    esxVI_Long_Free(&item->overallUsage);
-    esxVI_Long_Free(&item->maxUsage);
-});
-
-/* esxVI_ResourcePoolResourceUsage_Validate */
-ESX_VI__TEMPLATE__VALIDATE(ResourcePoolResourceUsage,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(reservationUsed);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(reservationUsedForVm);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(unreservedForPool);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(unreservedForVm);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(overallUsage);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(maxUsage);
-});
-
-/* esxVI_ResourcePoolResourceUsage_CastFromAnyType */
-ESX_VI__TEMPLATE__CAST_FROM_ANY_TYPE(ResourcePoolResourceUsage);
-
-/* esxVI_ResourcePoolResourceUsage_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(ResourcePoolResourceUsage,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Long, reservationUsed);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Long, reservationUsedForVm);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Long, unreservedForPool);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Long, unreservedForVm);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Long, overallUsage);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Long, maxUsage);
-});
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: VirtualMachineConfigSpec
- */
-
-/* esxVI_VirtualMachineConfigSpec_Alloc */
-ESX_VI__TEMPLATE__ALLOC(VirtualMachineConfigSpec);
-
-/* esxVI_VirtualMachineConfigSpec_Free */
-ESX_VI__TEMPLATE__FREE(VirtualMachineConfigSpec,
-{
-    VIR_FREE(item->changeVersion);
-    VIR_FREE(item->name);
-    VIR_FREE(item->version);
-    VIR_FREE(item->uuid);
-    esxVI_Long_Free(&item->npivNodeWorldWideName);
-    esxVI_Long_Free(&item->npivPortWorldWideName);
-    VIR_FREE(item->npivWorldWideNameType);
-    VIR_FREE(item->npivWorldWideNameOp);
-    VIR_FREE(item->locationId);
-    VIR_FREE(item->guestId);
-    VIR_FREE(item->alternateGuestName);
-    VIR_FREE(item->annotation);
-    /* FIXME: implement missing */
-    esxVI_Int_Free(&item->numCPUs);
-    esxVI_Long_Free(&item->memoryMB);
-    /* FIXME: implement missing */
-    esxVI_ResourceAllocationInfo_Free(&item->cpuAllocation);
-    esxVI_ResourceAllocationInfo_Free(&item->memoryAllocation);
-    /* FIXME: implement missing */
-    VIR_FREE(item->swapPlacement);
-    /* FIXME: implement missing */
-});
-
-/* esxVI_VirtualMachineConfigSpec_Validate */
-ESX_VI__TEMPLATE__VALIDATE_NOOP(VirtualMachineConfigSpec);
-
-/* esxVI_VirtualMachineConfigSpec_Serialize */
-ESX_VI__TEMPLATE__SERIALIZE(VirtualMachineConfigSpec,
-{
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, changeVersion);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, name);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, version);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, uuid);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_LIST(Long, npivNodeWorldWideName);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_LIST(Long, npivPortWorldWideName);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, npivWorldWideNameType);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, npivWorldWideNameOp);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, locationId);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, guestId);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, alternateGuestName);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, annotation);
-    /* FIXME: implement missing */
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(Int, numCPUs);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(Long, memoryMB);
-    /* FIXME: implement missing */
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(ResourceAllocationInfo,
-                                          cpuAllocation);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(ResourceAllocationInfo,
-                                          memoryAllocation);
-    /* FIXME: implement missing */
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, swapPlacement);
-    /* FIXME: implement missing */
-});
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: Event
- */
-
-/* esxVI_Event_Alloc */
-ESX_VI__TEMPLATE__ALLOC(Event);
-
-/* esxVI_Event_Free */
-ESX_VI__TEMPLATE__FREE(Event,
-{
-    esxVI_Event_Free(&item->_next);
-
-    /* FIXME: implement the rest */
-    esxVI_Int_Free(&item->key);
-    esxVI_Int_Free(&item->chainId);
-    esxVI_DateTime_Free(&item->createdTime);
-    VIR_FREE(item->userName);
-    VIR_FREE(item->fullFormattedMessage);
-});
-
-/* esxVI_Event_Validate */
-ESX_VI__TEMPLATE__VALIDATE(Event,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(key);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(chainId);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(createdTime);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(userName);
-});
-
-/* esxVI_Event_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(Event,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Int, key);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Int, chainId);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(DateTime, createdTime);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, userName);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_NOOP(datacenter); /* FIXME */
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_NOOP(computeResource); /* FIXME */
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_NOOP(host); /* FIXME */
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_NOOP(vm); /* FIXME */
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, fullFormattedMessage);
-});
-
-/* esxVI_Event_DeserializeList */
-ESX_VI__TEMPLATE__LIST__DESERIALIZE(Event);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: UserSession
- */
-
-/* esxVI_UserSession_Alloc */
-ESX_VI__TEMPLATE__ALLOC(UserSession);
-
-/* esxVI_UserSession_Free */
-ESX_VI__TEMPLATE__FREE(UserSession,
-{
-    VIR_FREE(item->key);
-    VIR_FREE(item->userName);
-    VIR_FREE(item->fullName);
-    esxVI_DateTime_Free(&item->loginTime);
-    esxVI_DateTime_Free(&item->lastActiveTime);
-    VIR_FREE(item->locale);
-    VIR_FREE(item->messageLocale);
-});
-
-/* esxVI_UserSession_Validate */
-ESX_VI__TEMPLATE__VALIDATE(UserSession,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(key);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(userName);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(fullName);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(loginTime);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(lastActiveTime);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(locale);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(messageLocale);
-});
-
-/* esxVI_UserSession_CastFromAnyType */
-ESX_VI__TEMPLATE__CAST_FROM_ANY_TYPE(UserSession);
-
-/* esxVI_UserSession_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(UserSession,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, key);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, userName);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, fullName);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(DateTime, loginTime);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(DateTime, lastActiveTime);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, locale);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, messageLocale);
-});
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: VirtualMachineQuestionInfo
- */
-
-/* esxVI_VirtualMachineQuestionInfo_Alloc */
-ESX_VI__TEMPLATE__ALLOC(VirtualMachineQuestionInfo);
-
-/* esxVI_VirtualMachineQuestionInfo_Free */
-ESX_VI__TEMPLATE__FREE(VirtualMachineQuestionInfo,
-{
-    VIR_FREE(item->id);
-    VIR_FREE(item->text);
-    esxVI_ChoiceOption_Free(&item->choice);
-    /*esxVI_VirtualMachineMessage_Free(&item->message);*//* FIXME */
-});
-
-/* esxVI_VirtualMachineQuestionInfo_Validate */
-ESX_VI__TEMPLATE__VALIDATE(VirtualMachineQuestionInfo,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(id);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(text);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(choice);
-});
-
-/* esxVI_VirtualMachineQuestionInfo_CastFromAnyType */
-ESX_VI__TEMPLATE__CAST_FROM_ANY_TYPE(VirtualMachineQuestionInfo);
-
-/* esxVI_VirtualMachineQuestionInfo_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(VirtualMachineQuestionInfo,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, id);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, text);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(ChoiceOption, choice);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_NOOP(message); /* FIXME */
-});
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: ElementDescription extends Description
- *
- *          In contrast to SelectionSpec and TraversalSpec just merge
- *          Description into ElementDescription for simplicity, because
- *          only ElementDescription is used.
- */
-
-/* esxVI_ElementDescription_Alloc */
-ESX_VI__TEMPLATE__ALLOC(ElementDescription);
-
-/* esxVI_ElementDescription_Free */
-ESX_VI__TEMPLATE__FREE(ElementDescription,
-{
-    esxVI_ElementDescription_Free(&item->_next);
-
-    VIR_FREE(item->label);
-    VIR_FREE(item->summary);
-    VIR_FREE(item->key);
-});
-
-/* esxVI_ElementDescription_Validate */
-ESX_VI__TEMPLATE__VALIDATE(ElementDescription,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(label);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(summary);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(key);
-});
-
-/* esxVI_ElementDescription_AppendToList */
-ESX_VI__TEMPLATE__LIST__APPEND(ElementDescription);
-
-/* esxVI_ElementDescription_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(ElementDescription,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, label);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, summary);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, key);
-});
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: ChoiceOption extends OptionType
- *
- *          In contrast to SelectionSpec and TraversalSpec just merge
- *          OptionType into ChoiceOption for simplicity, because
- *          only ChoiceOption is used.
- */
-
-/* esxVI_ChoiceOption_Alloc */
-ESX_VI__TEMPLATE__ALLOC(ChoiceOption);
-
-/* esxVI_ChoiceOption_Free */
-ESX_VI__TEMPLATE__FREE(ChoiceOption,
-{
-    esxVI_ElementDescription_Free(&item->choiceInfo);
-    esxVI_Int_Free(&item->defaultIndex);
-});
-
-/* esxVI_ChoiceOption_Validate */
-ESX_VI__TEMPLATE__VALIDATE(ChoiceOption,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(choiceInfo);
-});
-
-/* esxVI_ChoiceOption_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(ChoiceOption,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Boolean, valueIsReadonly);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_LIST(ElementDescription, choiceInfo);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Int, defaultIndex);
-});
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PerfMetricId
- */
-
-/* esxVI_PerfMetricId_Alloc */
-ESX_VI__TEMPLATE__ALLOC(PerfMetricId);
-
-/* esxVI_PerfMetricId_Free */
-ESX_VI__TEMPLATE__FREE(PerfMetricId,
-{
-    esxVI_PerfMetricId_Free(&item->_next);
-
-    esxVI_Int_Free(&item->counterId);
-    VIR_FREE(item->instance);
-});
-
-/* esxVI_PerfMetricId_Validate */
-ESX_VI__TEMPLATE__VALIDATE(PerfMetricId,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(counterId);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(instance);
-});
-
-/* esxVI_PerfMetricId_Serialize */
-ESX_VI__TEMPLATE__SERIALIZE(PerfMetricId,
-{
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(Int, counterId);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, instance);
-});
-
-/* esxVI_PerfMetricId_SerializeList */
-ESX_VI__TEMPLATE__LIST__SERIALIZE(PerfMetricId);
-
-/* esxVI_PerfMetricId_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(PerfMetricId,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Int, counterId);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, instance);
-});
-
-/* esxVI_PerfMetricId_DeserializeList */
-ESX_VI__TEMPLATE__LIST__DESERIALIZE(PerfMetricId);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PerfCounterInfo
- */
-
-/* esxVI_PerfCounterInfo_Alloc */
-ESX_VI__TEMPLATE__ALLOC(PerfCounterInfo);
-
-/* esxVI_PerfCounterInfo_Free */
-ESX_VI__TEMPLATE__FREE(PerfCounterInfo,
-{
-    esxVI_PerfCounterInfo_Free(&item->_next);
-
-    esxVI_Int_Free(&item->key);
-    esxVI_ElementDescription_Free(&item->nameInfo);
-    esxVI_ElementDescription_Free(&item->groupInfo);
-    esxVI_ElementDescription_Free(&item->unitInfo);
-    esxVI_Int_Free(&item->level);
-    esxVI_Int_Free(&item->associatedCounterId);
-});
-
-/* esxVI_PerfCounterInfo_Validate */
-ESX_VI__TEMPLATE__VALIDATE(PerfCounterInfo,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(key);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(nameInfo);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(groupInfo);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(unitInfo);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(rollupType);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(statsType);
-});
-
-/* esxVI_PerfCounterInfo_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(PerfCounterInfo,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Int, key);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(ElementDescription, nameInfo);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(ElementDescription, groupInfo);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(ElementDescription, unitInfo);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(PerfSummaryType, rollupType);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(PerfStatsType, statsType);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Int, level);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_LIST(Int, associatedCounterId);
-});
-
-/* esxVI_PerfCounterInfo_DeserializeList */
-ESX_VI__TEMPLATE__LIST__DESERIALIZE(PerfCounterInfo);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PerfQuerySpec
- */
-
-/* esxVI_PerfQuerySpec_Alloc */
-ESX_VI__TEMPLATE__ALLOC(PerfQuerySpec);
-
-/* esxVI_PerfQuerySpec_Free */
-ESX_VI__TEMPLATE__FREE(PerfQuerySpec,
-{
-    esxVI_PerfQuerySpec_Free(&item->_next);
-
-    esxVI_ManagedObjectReference_Free(&item->entity);
-    esxVI_DateTime_Free(&item->startTime);
-    esxVI_DateTime_Free(&item->endTime);
-    esxVI_Int_Free(&item->maxSample);
-    esxVI_PerfMetricId_Free(&item->metricId);
-    esxVI_Int_Free(&item->intervalId);
-    VIR_FREE(item->format);
-});
-
-/* esxVI_PerfQuerySpec_Validate */
-ESX_VI__TEMPLATE__VALIDATE(PerfQuerySpec,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(entity);
-});
-
-/* esxVI_PerfQuerySpec_Serialize */
-ESX_VI__TEMPLATE__SERIALIZE(PerfQuerySpec,
-{
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(ManagedObjectReference, entity);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(DateTime, startTime);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(DateTime, endTime);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(Int, maxSample);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_LIST(PerfMetricId, metricId);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(Int, intervalId);
-    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, format);
-});
-
-/* esxVI_PerfQuerySpec_SerializeList */
-ESX_VI__TEMPLATE__LIST__SERIALIZE(PerfQuerySpec);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PerfSampleInfo
- */
-
-/* esxVI_PerfSampleInfo_Alloc */
-ESX_VI__TEMPLATE__ALLOC(PerfSampleInfo);
-
-/* esxVI_PerfSampleInfo_Free */
-ESX_VI__TEMPLATE__FREE(PerfSampleInfo,
-{
-    esxVI_PerfSampleInfo_Free(&item->_next);
-
-    esxVI_DateTime_Free(&item->timestamp);
-    esxVI_Int_Free(&item->interval);
-});
-
-/* esxVI_PerfSampleInfo_Validate */
-ESX_VI__TEMPLATE__VALIDATE(PerfSampleInfo,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(timestamp);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(interval);
-});
-
-/* esxVI_PerfSampleInfo_AppendToList */
-ESX_VI__TEMPLATE__LIST__APPEND(PerfSampleInfo);
-
-/* esxVI_PerfSampleInfo_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(PerfSampleInfo,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(DateTime, timestamp);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Int, interval);
-});
-
-/* esxVI_PerfSampleInfo_DeserializeList */
-ESX_VI__TEMPLATE__LIST__DESERIALIZE(PerfSampleInfo);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PerfMetricIntSeries extends PerfMetricSeries
- *
- *          In contrast to SelectionSpec and TraversalSpec just merge
- *          PerfMetricSeries into PerfMetricIntSeries for simplicity, because
- *          only PerfMetricIntSeries is used and the other type inheriting
- *          PerfMetricSeries (PerfMetricSeriesCSV) is not used.
- */
-
-/* esxVI_PerfMetricIntSeries_Alloc */
-ESX_VI__TEMPLATE__ALLOC(PerfMetricIntSeries);
-
-/* esxVI_PerfMetricIntSeries_Free */
-ESX_VI__TEMPLATE__FREE(PerfMetricIntSeries,
-{
-    esxVI_PerfMetricIntSeries_Free(&item->_next);
-
-    esxVI_PerfMetricId_Free(&item->id);
-    esxVI_Long_Free(&item->value);
-});
-
-/* esxVI_PerfMetricIntSeries_Validate */
-ESX_VI__TEMPLATE__VALIDATE(PerfMetricIntSeries,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(id);
-});
-
-/* esxVI_PerfMetricIntSeries_AppendToList */
-ESX_VI__TEMPLATE__LIST__APPEND(PerfMetricIntSeries);
-
-/* esxVI_PerfMetricIntSeries_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(PerfMetricIntSeries,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(PerfMetricId, id);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_LIST(Long, value);
-});
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PerfEntityMetric extends PerfEntityMetricBase
- *
- *          In contrast to SelectionSpec and TraversalSpec just merge
- *          PerfEntityMetricBase into PerfEntityMetric for simplicity, because
- *          only PerfEntityMetric is used and the other type inheriting
- *          PerfEntityMetric (PerfEntityMetricCSV) is not used.
- *
- *          Also use PerfMetricIntSeries instead of the correct base type
- *          PerfMetricSeries for the value property, because only
- *          PerfMetricIntSeries is used.
- */
-
-/* esxVI_PerfEntityMetric_Alloc */
-ESX_VI__TEMPLATE__ALLOC(PerfEntityMetric);
-
-/* esxVI_PerfEntityMetric_Free */
-ESX_VI__TEMPLATE__FREE(PerfEntityMetric,
-{
-    esxVI_PerfEntityMetric_Free(&item->_next);
-
-    esxVI_ManagedObjectReference_Free(&item->entity);
-    esxVI_PerfSampleInfo_Free(&item->sampleInfo);
-    esxVI_PerfMetricIntSeries_Free(&item->value);
-});
-
-/* esxVI_PerfEntityMetric_Validate */
-ESX_VI__TEMPLATE__VALIDATE(PerfEntityMetric,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(entity);
-});
-
-/* esxVI_PerfEntityMetric_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(PerfEntityMetric,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     NULL, entity);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_LIST(PerfSampleInfo, sampleInfo);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_LIST(PerfMetricIntSeries, value);
-});
-
-/* esxVI_PerfEntityMetric_DeserializeList */
-ESX_VI__TEMPLATE__LIST__DESERIALIZE(PerfEntityMetric);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: TaskInfo
- */
-
-/* esxVI_TaskInfo_Alloc */
-ESX_VI__TEMPLATE__ALLOC(TaskInfo);
-
-/* esxVI_TaskInfo_Free */
-ESX_VI__TEMPLATE__FREE(TaskInfo,
-{
-    esxVI_TaskInfo_Free(&item->_next);
-
-    VIR_FREE(item->key);
-    esxVI_ManagedObjectReference_Free(&item->task);
-    VIR_FREE(item->name);
-    VIR_FREE(item->descriptionId);
-    esxVI_ManagedObjectReference_Free(&item->entity);
-    VIR_FREE(item->entityName);
-    /*esxVI_ManagedObjectReference_Free(&item->locked);*//* FIXME */
-    /*esxVI_MethodFault_Free(&item->error);*//* FIXME */
-    esxVI_AnyType_Free(&item->result);
-    esxVI_Int_Free(&item->progress);
-    /*esxVI_TaskReason_Free(&item->reason);*//* FIXME */
-    esxVI_DateTime_Free(&item->queueTime);
-    esxVI_DateTime_Free(&item->startTime);
-    esxVI_DateTime_Free(&item->completeTime);
-    esxVI_Int_Free(&item->eventChainId);
-});
-
-/* esxVI_TaskInfo_Validate */
-ESX_VI__TEMPLATE__VALIDATE(TaskInfo,
-{
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(key);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(task);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(descriptionId);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(state);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(cancelled);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(cancelable);
-    /*ESX_VI__TEMPLATE__PROPERTY__REQUIRE(reason);*//* FIXME */
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(queueTime);
-    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(eventChainId);
-});
-
-/* esxVI_TaskInfo_CastFromAnyType */
-ESX_VI__TEMPLATE__CAST_FROM_ANY_TYPE(TaskInfo);
-
-/* esxVI_TaskInfo_AppendToList */
-ESX_VI__TEMPLATE__LIST__APPEND(TaskInfo);
-
-/* esxVI_TaskInfo_Deserialize */
-ESX_VI__TEMPLATE__DESERIALIZE(TaskInfo,
-{
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, key);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     "Task", task);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, name);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, descriptionId);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_EXPECTED(ManagedObjectReference,
-                                                     NULL, entity);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, entityName);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_NOOP(locked); /* FIXME */
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(TaskInfoState, state);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Boolean, cancelled);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Boolean, cancelable);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_NOOP(error); /* FIXME */
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(AnyType, result);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Int, progress);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_NOOP(reason); /* FIXME */
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(DateTime, queueTime);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(DateTime, startTime);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(DateTime, completeTime);
-    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(Int, eventChainId);
-});
+#include "esx_vi_types.generated.c"
diff --git a/src/esx/esx_vi_types.h b/src/esx/esx_vi_types.h
index e5451e9..a61cdc1 100644
--- a/src/esx/esx_vi_types.h
+++ b/src/esx/esx_vi_types.h
@@ -25,13 +25,8 @@
 
 # include "buf.h"
 
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * XSI
- */
-
 typedef enum _esxVI_Type esxVI_Type;
+typedef struct _esxVI_Object esxVI_Object;
 
 
 
@@ -49,75 +44,50 @@ typedef struct _esxVI_DateTime esxVI_DateTime;
 
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enums
- */
-
-typedef enum _esxVI_ManagedEntityStatus esxVI_ManagedEntityStatus;
-typedef enum _esxVI_ObjectUpdateKind esxVI_ObjectUpdateKind;
-typedef enum _esxVI_PerfSummaryType esxVI_PerfSummaryType;
-typedef enum _esxVI_PerfStatsType esxVI_PerfStatsType;
-typedef enum _esxVI_PropertyChangeOp esxVI_PropertyChangeOp;
-typedef enum _esxVI_SharesLevel esxVI_SharesLevel;
-typedef enum _esxVI_TaskInfoState esxVI_TaskInfoState;
-typedef enum _esxVI_VirtualMachineMovePriority esxVI_VirtualMachineMovePriority;
-typedef enum _esxVI_VirtualMachinePowerState esxVI_VirtualMachinePowerState;
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  * VI Types
  */
 
 typedef struct _esxVI_Fault esxVI_Fault;
 typedef struct _esxVI_ManagedObjectReference esxVI_ManagedObjectReference;
-typedef struct _esxVI_DynamicProperty esxVI_DynamicProperty;
-typedef struct _esxVI_HostCpuIdInfo esxVI_HostCpuIdInfo;
-typedef struct _esxVI_SelectionSpec esxVI_SelectionSpec;
-typedef struct _esxVI_TraversalSpec esxVI_TraversalSpec;
-typedef struct _esxVI_ObjectSpec esxVI_ObjectSpec;
-typedef struct _esxVI_PropertyChange esxVI_PropertyChange;
-typedef struct _esxVI_PropertySpec esxVI_PropertySpec;
-typedef struct _esxVI_PropertyFilterSpec esxVI_PropertyFilterSpec;
-typedef struct _esxVI_ObjectContent esxVI_ObjectContent;
-typedef struct _esxVI_ObjectUpdate esxVI_ObjectUpdate;
-typedef struct _esxVI_PropertyFilterUpdate esxVI_PropertyFilterUpdate;
-typedef struct _esxVI_AboutInfo esxVI_AboutInfo;
-typedef struct _esxVI_ServiceContent esxVI_ServiceContent;
-typedef struct _esxVI_UpdateSet esxVI_UpdateSet;
-typedef struct _esxVI_SharesInfo esxVI_SharesInfo;
-typedef struct _esxVI_ResourceAllocationInfo esxVI_ResourceAllocationInfo;
-typedef struct _esxVI_ResourcePoolResourceUsage esxVI_ResourcePoolResourceUsage;
-typedef struct _esxVI_VirtualMachineConfigSpec esxVI_VirtualMachineConfigSpec;
-typedef struct _esxVI_Event esxVI_Event;
-typedef struct _esxVI_UserSession esxVI_UserSession;
-typedef struct _esxVI_VirtualMachineQuestionInfo esxVI_VirtualMachineQuestionInfo;
-typedef struct _esxVI_ElementDescription esxVI_ElementDescription;
-typedef struct _esxVI_ChoiceOption esxVI_ChoiceOption;
-typedef struct _esxVI_PerfMetricId esxVI_PerfMetricId;
-typedef struct _esxVI_PerfCounterInfo esxVI_PerfCounterInfo;
-typedef struct _esxVI_PerfQuerySpec esxVI_PerfQuerySpec;
-typedef struct _esxVI_PerfSampleInfo esxVI_PerfSampleInfo;
-typedef struct _esxVI_PerfMetricIntSeries esxVI_PerfMetricIntSeries;
-typedef struct _esxVI_PerfEntityMetric esxVI_PerfEntityMetric;
-typedef struct _esxVI_TaskInfo esxVI_TaskInfo;
+
+#include "esx_vi_types.generated.typedef"
 
 
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * XSI: Type
+ * Type
  */
 
 enum _esxVI_Type {
     esxVI_Type_Undefined = 0,
     esxVI_Type_Boolean,
+    esxVI_Type_AnyType,
     esxVI_Type_String,
     esxVI_Type_Short,
     esxVI_Type_Int,
     esxVI_Type_Long,
+    esxVI_Type_DateTime,
+    esxVI_Type_Fault,
+    esxVI_Type_ManagedObjectReference,
+
+#include "esx_vi_types.generated.typeenum"
+
     esxVI_Type_Other,
 };
 
-const char *esxVI_Type_Name(esxVI_Type type);
+const char *esxVI_Type_ToString(esxVI_Type type);
+esxVI_Type esxVI_Type_FromString(const char *type);
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Object extends List
+ */
+
+struct _esxVI_Object {
+    esxVI_Object *_next;                                   /* optional */
+    esxVI_Type _type;                                      /* required */
+};
 
 
 
@@ -142,8 +112,10 @@ int esxVI_Boolean_Deserialize(xmlNodePtr node, esxVI_Boolean *boolean_);
  */
 
 struct _esxVI_AnyType {
-    xmlNodePtr _node;                                      /* required */
+    esxVI_AnyType *_unused;                                /* optional */
+    esxVI_Type _type; /* = esxVI_Type_AnyType */           /* required */
 
+    xmlNodePtr node;                                       /* required */
     esxVI_Type type;                                       /* required */
     char *other;                                           /* required */
     char *value;                                           /* required */
@@ -170,12 +142,14 @@ int esxVI_AnyType_Deserialize(xmlNodePtr node, esxVI_AnyType **anyType);
 
 struct _esxVI_String {
     esxVI_String *_next;                                   /* optional */
+    esxVI_Type _type;                                      /* required */
 
     char *value;                                           /* required */
 };
 
 int esxVI_String_Alloc(esxVI_String **string);
 void esxVI_String_Free(esxVI_String **stringList);
+int esxVI_String_Validate(esxVI_String *string);
 int esxVI_String_AppendToList(esxVI_String **stringList, esxVI_String *string);
 int esxVI_String_AppendValueToList(esxVI_String **stringList,
                                    const char *value);
@@ -202,6 +176,7 @@ int esxVI_String_DeserializeValue(xmlNodePtr node, char **value);
 
 struct _esxVI_Int {
     esxVI_Int *_next;                                      /* optional */
+    esxVI_Type _type;                                      /* required */
 
     int32_t value;                                         /* required */
 };
@@ -225,6 +200,7 @@ int esxVI_Int_Deserialize(xmlNodePtr node, esxVI_Int **number);
 
 struct _esxVI_Long {
     esxVI_Long *_next;                                     /* optional */
+    esxVI_Type _type;                                      /* required */
 
     int64_t value;                                         /* required */
 };
@@ -246,6 +222,9 @@ int esxVI_Long_Deserialize(xmlNodePtr node, esxVI_Long **number);
  */
 
 struct _esxVI_DateTime {
+    esxVI_DateTime *_unused;                               /* optional */
+    esxVI_Type _type;                                      /* required */
+
     char *value;                                           /* required */
 };
 
@@ -259,170 +238,13 @@ int esxVI_DateTime_Deserialize(xmlNodePtr node, esxVI_DateTime **dateTime);
 
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: ManagedEntityStatus
- */
-
-enum _esxVI_ManagedEntityStatus {
-    esxVI_ManagedEntityStatus_Undefined = 0,
-    esxVI_ManagedEntityStatus_Gray,
-    esxVI_ManagedEntityStatus_Green,
-    esxVI_ManagedEntityStatus_Yellow,
-    esxVI_ManagedEntityStatus_Red,
-};
-
-int esxVI_ManagedEntityStatus_CastFromAnyType
-      (esxVI_AnyType *anyType, esxVI_ManagedEntityStatus *managedEntityStatus);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: ObjectUpdateKind
- */
-
-enum _esxVI_ObjectUpdateKind {
-    esxVI_ObjectUpdateKind_Undefined = 0,
-    esxVI_ObjectUpdateKind_Enter,
-    esxVI_ObjectUpdateKind_Leave,
-    esxVI_ObjectUpdateKind_Modify,
-};
-
-int esxVI_ObjectUpdateKind_Deserialize
-      (xmlNodePtr node, esxVI_ObjectUpdateKind *objectUpdateKind);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: PerfSummaryType
- */
-
-enum _esxVI_PerfSummaryType {
-    esxVI_PerfSummaryType_Undefined = 0,
-    esxVI_PerfSummaryType_Average,
-    esxVI_PerfSummaryType_Latest,
-    esxVI_PerfSummaryType_Maximum,
-    esxVI_PerfSummaryType_Minimum,
-    esxVI_PerfSummaryType_None,
-    esxVI_PerfSummaryType_Summation,
-};
-
-int esxVI_PerfSummaryType_Deserialize(xmlNodePtr node,
-                                      esxVI_PerfSummaryType *perfSummaryType);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: PerfStatsType
- */
-
-enum _esxVI_PerfStatsType {
-    esxVI_PerfStatsType_Undefined = 0,
-    esxVI_PerfStatsType_Absolute,
-    esxVI_PerfStatsType_Delta,
-    esxVI_PerfStatsType_Rate,
-};
-
-int esxVI_PerfStatsType_Deserialize(xmlNodePtr node,
-                                    esxVI_PerfStatsType *perfStatsType);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: PropertyChangeOp
- */
-
-enum _esxVI_PropertyChangeOp {
-    esxVI_PropertyChangeOp_Undefined = 0,
-    esxVI_PropertyChangeOp_Add,
-    esxVI_PropertyChangeOp_Remove,
-    esxVI_PropertyChangeOp_Assign,
-    esxVI_PropertyChangeOp_IndirectRemove,
-};
-
-int esxVI_PropertyChangeOp_Deserialize
-      (xmlNodePtr node, esxVI_PropertyChangeOp *propertyChangeOp);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: SharesLevel
- */
-
-enum _esxVI_SharesLevel {
-    esxVI_SharesLevel_Undefined = 0,
-    esxVI_SharesLevel_Custom,
-    esxVI_SharesLevel_High,
-    esxVI_SharesLevel_Low,
-    esxVI_SharesLevel_Normal,
-};
-
-int esxVI_SharesLevel_Serialize(esxVI_SharesLevel sharesLevel,
-                                const char *element, virBufferPtr output);
-int esxVI_SharesLevel_Deserialize(xmlNodePtr node,
-                                  esxVI_SharesLevel *sharesLevel);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: TaskInfoState
- */
-
-enum _esxVI_TaskInfoState {
-    esxVI_TaskInfoState_Undefined = 0,
-    esxVI_TaskInfoState_Error,
-    esxVI_TaskInfoState_Queued,
-    esxVI_TaskInfoState_Running,
-    esxVI_TaskInfoState_Success,
-};
-
-int esxVI_TaskInfoState_CastFromAnyType(esxVI_AnyType *anyType,
-                                        esxVI_TaskInfoState *taskInfoState);
-int esxVI_TaskInfoState_Deserialize(xmlNodePtr node,
-                                    esxVI_TaskInfoState *taskInfoState);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: VirtualMachineMovePriority
- */
-
-enum _esxVI_VirtualMachineMovePriority {
-    esxVI_VirtualMachineMovePriority_Undefined = 0,
-    esxVI_VirtualMachineMovePriority_LowPriority,
-    esxVI_VirtualMachineMovePriority_HighPriority,
-    esxVI_VirtualMachineMovePriority_DefaultPriority,
-};
-
-int esxVI_VirtualMachineMovePriority_Serialize
-      (esxVI_VirtualMachineMovePriority virtualMachineMovePriority,
-       const char *element, virBufferPtr output);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Enum: VirtualMachinePowerState
- */
-
-enum _esxVI_VirtualMachinePowerState {
-    esxVI_VirtualMachinePowerState_Undefined = 0,
-    esxVI_VirtualMachinePowerState_PoweredOff,
-    esxVI_VirtualMachinePowerState_PoweredOn,
-    esxVI_VirtualMachinePowerState_Suspended,
-};
-
-int esxVI_VirtualMachinePowerState_CastFromAnyType
-      (esxVI_AnyType *anyType,
-       esxVI_VirtualMachinePowerState *virtualMachinePowerState);
-int esxVI_VirtualMachinePowerState_Serialize
-      (esxVI_VirtualMachinePowerState virtualMachinePowerState,
-       const char *element, virBufferPtr output);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  * VI Type: Fault
  */
 
 struct _esxVI_Fault {
+    esxVI_Fault *_unused;                                  /* optional */
+    esxVI_Type _type;                                      /* required */
+
     char *faultcode;                                       /* required */
     char *faultstring;                                     /* required */
 };
@@ -440,6 +262,7 @@ int esxVI_Fault_Deserialize(xmlNodePtr node, esxVI_Fault **fault);
 
 struct _esxVI_ManagedObjectReference {
     esxVI_ManagedObjectReference *_next;                   /* optional */
+    esxVI_Type _type;                                      /* required */
 
     char *type;                                            /* required */
     char *value;                                           /* required */
@@ -454,14 +277,12 @@ int esxVI_ManagedObjectReference_DeepCopy(esxVI_ManagedObjectReference **dest,
 int esxVI_ManagedObjectReference_AppendToList
       (esxVI_ManagedObjectReference **managedObjectReferenceList,
        esxVI_ManagedObjectReference *managedObjectReference);
-int esxVI_ManagedObjectReference_CastFromAnyType(esxVI_AnyType *anyType,
-                                                 esxVI_ManagedObjectReference
-                                                 **managedObjectReference,
-                                                 const char *expectedType);
+int esxVI_ManagedObjectReference_CastFromAnyType
+      (esxVI_AnyType *anyType,
+       esxVI_ManagedObjectReference **managedObjectReference);
 int esxVI_ManagedObjectReference_CastListFromAnyType
       (esxVI_AnyType *anyType,
-       esxVI_ManagedObjectReference **managedObjectReferenceList,
-       const char *expectedType);
+       esxVI_ManagedObjectReference **managedObjectReferenceList);
 int esxVI_ManagedObjectReference_Serialize
       (esxVI_ManagedObjectReference *managedObjectReference,
        const char *element, virBufferPtr output);
@@ -469,833 +290,10 @@ int esxVI_ManagedObjectReference_SerializeList
       (esxVI_ManagedObjectReference *managedObjectReference,
        const char *element, virBufferPtr output);
 int esxVI_ManagedObjectReference_Deserialize
-      (xmlNodePtr node, esxVI_ManagedObjectReference **managedObjectReference,
-       const char *expectedType);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: DynamicProperty
- */
-
-struct _esxVI_DynamicProperty {
-    esxVI_DynamicProperty *_next;                          /* optional */
-
-    char *name;                                            /* required */
-    esxVI_AnyType *val;                                    /* required */
-};
-
-int esxVI_DynamicProperty_Alloc(esxVI_DynamicProperty **dynamicProperty);
-void esxVI_DynamicProperty_Free
-       (esxVI_DynamicProperty **dynamicPropertyList);
-int esxVI_DynamicProperty_Validate(esxVI_DynamicProperty *dynamicProperty);
-int esxVI_DynamicProperty_DeepCopy(esxVI_DynamicProperty **dest,
-                                   esxVI_DynamicProperty *src);
-int esxVI_DynamicProperty_DeepCopyList(esxVI_DynamicProperty **destList,
-                                       esxVI_DynamicProperty *srcList);
-int esxVI_DynamicProperty_AppendToList
-      (esxVI_DynamicProperty **dynamicPropertyList,
-       esxVI_DynamicProperty *dynamicProperty);
-int esxVI_DynamicProperty_Deserialize(xmlNodePtr node,
-                                      esxVI_DynamicProperty **dynamicProperty);
-int esxVI_DynamicProperty_DeserializeList
-      (xmlNodePtr node, esxVI_DynamicProperty **dynamicPropertyList);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: HostCpuIdInfo
- */
-
-struct _esxVI_HostCpuIdInfo {
-    esxVI_HostCpuIdInfo *_next;                            /* optional */
-
-    esxVI_Int *level;                                      /* required */
-    char *vendor;                                          /* optional */
-    char *eax;                                             /* optional */
-    char *ebx;                                             /* optional */
-    char *ecx;                                             /* optional */
-    char *edx;                                             /* optional */
-};
-
-int esxVI_HostCpuIdInfo_Alloc(esxVI_HostCpuIdInfo **hostCpuIdInfo);
-void esxVI_HostCpuIdInfo_Free(esxVI_HostCpuIdInfo **hostCpuIdInfoList);
-int esxVI_HostCpuIdInfo_Validate(esxVI_HostCpuIdInfo *hostCpuIdInfo);
-int esxVI_HostCpuIdInfo_CastFromAnyType(esxVI_AnyType *anyType,
-                                        esxVI_HostCpuIdInfo **hostCpuIdInfo);
-int esxVI_HostCpuIdInfo_CastListFromAnyType
-      (esxVI_AnyType *anyType, esxVI_HostCpuIdInfo **hostCpuIdInfoList);
-int esxVI_HostCpuIdInfo_Deserialize(xmlNodePtr node,
-                                    esxVI_HostCpuIdInfo **hostCpuIdInfo);
-int esxVI_HostCpuIdInfo_DeserializeList
-      (xmlNodePtr node, esxVI_HostCpuIdInfo **hostCpuIdInfoList);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: SelectionSpec
- */
-
-struct _esxVI_SelectionSpec {
-    esxVI_SelectionSpec *_next;                            /* optional */
-    esxVI_TraversalSpec *_super;                           /* optional */
-
-    char *name;                                            /* optional */
-};
-
-int esxVI_SelectionSpec_Alloc(esxVI_SelectionSpec **selectionSpec);
-void esxVI_SelectionSpec_Free(esxVI_SelectionSpec **selectionSpecList);
-int esxVI_SelectionSpec_Validate(esxVI_SelectionSpec *selectionSpec);
-int esxVI_SelectionSpec_AppendToList(esxVI_SelectionSpec **selectionSpecList,
-                                     esxVI_SelectionSpec *selectionSpec);
-int esxVI_SelectionSpec_Serialize(esxVI_SelectionSpec *selectionSpec,
-                                  const char *element, virBufferPtr output);
-int esxVI_SelectionSpec_SerializeList(esxVI_SelectionSpec *selectionSpecList,
-                                      const char *element, virBufferPtr output);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: TraversalSpec extends SelectionSpec
- */
-
-struct _esxVI_TraversalSpec {
-    esxVI_SelectionSpec *_base;                            /* required */
-
-    char *type;                                            /* required */
-    char *path;                                            /* required */
-    esxVI_Boolean skip;                                    /* optional */
-    esxVI_SelectionSpec *selectSet;                        /* optional, list */
-};
-
-int esxVI_TraversalSpec_Alloc(esxVI_TraversalSpec **traversalSpec);
-void esxVI_TraversalSpec_Free(esxVI_TraversalSpec **traversalSpec);
-int esxVI_TraversalSpec_Validate(esxVI_TraversalSpec *traversalSpec);
-int esxVI_TraversalSpec_Serialize(esxVI_TraversalSpec *traversalSpec,
-                                  const char *element, virBufferPtr output);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: ObjectSpec
- */
-
-struct _esxVI_ObjectSpec {
-    esxVI_ObjectSpec *_next;                               /* optional */
-
-    esxVI_ManagedObjectReference *obj;                     /* required */
-    esxVI_Boolean skip;                                    /* optional */
-    esxVI_SelectionSpec *selectSet;                        /* optional, list */
-};
-
-int esxVI_ObjectSpec_Alloc(esxVI_ObjectSpec **objectSpec);
-void esxVI_ObjectSpec_Free(esxVI_ObjectSpec **objectSpecList);
-int esxVI_ObjectSpec_Validate(esxVI_ObjectSpec *objectSpec);
-int esxVI_ObjectSpec_AppendToList(esxVI_ObjectSpec **objectSpecList,
-                                  esxVI_ObjectSpec *objectSpec);
-int esxVI_ObjectSpec_Serialize(esxVI_ObjectSpec *objectSpec,
-                               const char *element, virBufferPtr output);
-int esxVI_ObjectSpec_SerializeList(esxVI_ObjectSpec *objectSpecList,
-                                   const char *element, virBufferPtr output);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PropertyChange
- */
-
-struct _esxVI_PropertyChange {
-    esxVI_PropertyChange *_next;                           /* optional */
-
-    char *name;                                            /* required */
-    esxVI_PropertyChangeOp op;                             /* required */
-    esxVI_AnyType *val;                                    /* optional */
-};
-
-int esxVI_PropertyChange_Alloc(esxVI_PropertyChange **propertyChange);
-void esxVI_PropertyChange_Free(esxVI_PropertyChange **propertyChangeList);
-int esxVI_PropertyChange_Validate(esxVI_PropertyChange *propertyChange);
-int esxVI_PropertyChange_AppendToList
-      (esxVI_PropertyChange **propertyChangeList,
-       esxVI_PropertyChange *propertyChange);
-int esxVI_PropertyChange_Deserialize(xmlNodePtr node,
-                                     esxVI_PropertyChange **propertyChange);
-int esxVI_PropertyChange_DeserializeList
-      (xmlNodePtr node, esxVI_PropertyChange **propertyChangeList);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PropertySpec
- */
-
-struct _esxVI_PropertySpec {
-    esxVI_PropertySpec *_next;                             /* optional */
-
-    char *type;                                            /* required */
-    esxVI_Boolean all;                                     /* optional */
-    esxVI_String *pathSet;                                 /* optional, list */
-};
-
-int esxVI_PropertySpec_Alloc(esxVI_PropertySpec **propertySpec);
-void esxVI_PropertySpec_Free(esxVI_PropertySpec **propertySpecList);
-int esxVI_PropertySpec_Validate(esxVI_PropertySpec *propertySpec);
-int esxVI_PropertySpec_AppendToList(esxVI_PropertySpec **propertySpecList,
-                                    esxVI_PropertySpec *propertySpec);
-int esxVI_PropertySpec_Serialize(esxVI_PropertySpec *propertySpec,
-                                 const char *element, virBufferPtr output);
-int esxVI_PropertySpec_SerializeList(esxVI_PropertySpec *propertySpecList,
-                                     const char *element, virBufferPtr output);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PropertyFilterSpec
- */
-
-struct _esxVI_PropertyFilterSpec {
-    esxVI_PropertyFilterSpec *_next;                       /* optional */
-
-    esxVI_PropertySpec *propSet;                           /* required, list */
-    esxVI_ObjectSpec *objectSet;                           /* required, list */
-};
-
-int esxVI_PropertyFilterSpec_Alloc
-      (esxVI_PropertyFilterSpec **propertyFilterSpec);
-void esxVI_PropertyFilterSpec_Free
-       (esxVI_PropertyFilterSpec **propertyFilterSpecList);
-int esxVI_PropertyFilterSpec_Validate
-      (esxVI_PropertyFilterSpec *propertyFilterSpec);
-int esxVI_PropertyFilterSpec_AppendToList
-      (esxVI_PropertyFilterSpec **propertyFilterSpecList,
-       esxVI_PropertyFilterSpec *propertyFilterSpec);
-int esxVI_PropertyFilterSpec_Serialize
-      (esxVI_PropertyFilterSpec *propertyFilterSpec, const char *element,
-       virBufferPtr output);
-int esxVI_PropertyFilterSpec_SerializeList
-      (esxVI_PropertyFilterSpec *propertyFilterSpecList, const char *element,
-       virBufferPtr output);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: ObjectContent
- */
-
-struct _esxVI_ObjectContent {
-    esxVI_ObjectContent *_next;                            /* optional */
-
-    esxVI_ManagedObjectReference *obj;                     /* required */
-    esxVI_DynamicProperty *propSet;                        /* optional, list */
-    /*esxVI_MissingProperty *missingSet; *//* optional, list *//* FIXME */
-};
-
-int esxVI_ObjectContent_Alloc(esxVI_ObjectContent **objectContent);
-void esxVI_ObjectContent_Free(esxVI_ObjectContent **objectContentList);
-int esxVI_ObjectContent_Validate(esxVI_ObjectContent *objectContent);
-int esxVI_ObjectContent_AppendToList(esxVI_ObjectContent **objectContentList,
-                                     esxVI_ObjectContent *objectContent);
-int esxVI_ObjectContent_DeepCopy(esxVI_ObjectContent **dest,
-                                 esxVI_ObjectContent *src);
-int esxVI_ObjectContent_Deserialize(xmlNodePtr node,
-                                    esxVI_ObjectContent **objectContent);
-int esxVI_ObjectContent_DeserializeList
-      (xmlNodePtr node, esxVI_ObjectContent **objectContentList);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: ObjectUpdate
- */
-
-struct _esxVI_ObjectUpdate {
-    esxVI_ObjectUpdate *_next;                             /* optional */
-
-    esxVI_ObjectUpdateKind kind;                           /* required */
-    esxVI_ManagedObjectReference *obj;                     /* required */
-    esxVI_PropertyChange *changeSet;                       /* optional, list */
-    /*esxVI_MissingProperty *missingSet; *//* optional, list *//* FIXME */
-};
-
-int esxVI_ObjectUpdate_Alloc(esxVI_ObjectUpdate **objectUpdate);
-void esxVI_ObjectUpdate_Free(esxVI_ObjectUpdate **objectUpdateList);
-int esxVI_ObjectUpdate_Validate(esxVI_ObjectUpdate *objectUpdate);
-int esxVI_ObjectUpdate_AppendToList(esxVI_ObjectUpdate **objectUpdateList,
-                                    esxVI_ObjectUpdate *objectUpdate);
-int esxVI_ObjectUpdate_Deserialize(xmlNodePtr node,
-                                   esxVI_ObjectUpdate **objectUpdate);
-int esxVI_ObjectUpdate_DeserializeList(xmlNodePtr node,
-                                       esxVI_ObjectUpdate **objectUpdateList);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PropertyFilterUpdate
- */
-
-struct _esxVI_PropertyFilterUpdate {
-    esxVI_PropertyFilterUpdate *_next;                     /* optional */
-
-    esxVI_ManagedObjectReference *filter;                  /* required */
-    esxVI_ObjectUpdate *objectSet;                         /* optional, list */
-    /*esxVI_MissingProperty *missingSet; *//* optional, list *//* FIXME */
-};
-
-int esxVI_PropertyFilterUpdate_Alloc
-      (esxVI_PropertyFilterUpdate **propertyFilterUpdate);
-void esxVI_PropertyFilterUpdate_Free
-       (esxVI_PropertyFilterUpdate **propertyFilterUpdateList);
-int esxVI_PropertyFilterUpdate_Validate
-      (esxVI_PropertyFilterUpdate *propertyFilterUpdate);
-int esxVI_PropertyFilterUpdate_AppendToList
-      (esxVI_PropertyFilterUpdate **propertyFilterUpdateList,
-       esxVI_PropertyFilterUpdate *propertyFilterUpdate);
-int esxVI_PropertyFilterUpdate_Deserialize
-      (xmlNodePtr node, esxVI_PropertyFilterUpdate **propertyFilterUpdate);
-int esxVI_PropertyFilterUpdate_DeserializeList
-      (xmlNodePtr node, esxVI_PropertyFilterUpdate **propertyFilterUpdateList);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: AboutInfo
- */
-
-struct _esxVI_AboutInfo {
-    char *name;                                            /* required */
-    char *fullName;                                        /* required */
-    char *vendor;                                          /* required */
-    char *version;                                         /* required */
-    char *build;                                           /* required */
-    char *localeVersion;                                   /* optional */
-    char *localeBuild;                                     /* optional */
-    char *osType;                                          /* required */
-    char *productLineId;                                   /* required */
-    char *apiType;                                         /* required */
-    char *apiVersion;                                      /* required */
-};
-
-int esxVI_AboutInfo_Alloc(esxVI_AboutInfo **aboutInfo);
-void esxVI_AboutInfo_Free(esxVI_AboutInfo **aboutInfo);
-int esxVI_AboutInfo_Validate(esxVI_AboutInfo *aboutInfo);
-int esxVI_AboutInfo_Deserialize(xmlNodePtr node, esxVI_AboutInfo **aboutInfo);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: ServiceContent
- */
-
-struct _esxVI_ServiceContent {
-    esxVI_ManagedObjectReference *rootFolder;              /* required */
-    esxVI_ManagedObjectReference *propertyCollector;       /* required */
-    esxVI_ManagedObjectReference *viewManager;             /* optional */
-    esxVI_AboutInfo *about;                                /* required */
-    esxVI_ManagedObjectReference *setting;                 /* optional */
-    esxVI_ManagedObjectReference *userDirectory;           /* optional */
-    esxVI_ManagedObjectReference *sessionManager;          /* optional */
-    esxVI_ManagedObjectReference *authorizationManager;    /* optional */
-    esxVI_ManagedObjectReference *perfManager;             /* optional */
-    esxVI_ManagedObjectReference *scheduledTaskManager;    /* optional */
-    esxVI_ManagedObjectReference *alarmManager;            /* optional */
-    esxVI_ManagedObjectReference *eventManager;            /* optional */
-    esxVI_ManagedObjectReference *taskManager;             /* optional */
-    esxVI_ManagedObjectReference *extensionManager;        /* optional */
-    esxVI_ManagedObjectReference *customizationSpecManager; /* optional */
-    esxVI_ManagedObjectReference *customFieldsManager;     /* optional */
-    esxVI_ManagedObjectReference *accountManager;          /* optional */
-    esxVI_ManagedObjectReference *diagnosticManager;       /* optional */
-    esxVI_ManagedObjectReference *licenseManager;          /* optional */
-    esxVI_ManagedObjectReference *searchIndex;             /* optional */
-    esxVI_ManagedObjectReference *fileManager;             /* optional */
-    esxVI_ManagedObjectReference *virtualDiskManager;      /* optional */
-    esxVI_ManagedObjectReference *virtualizationManager;   /* optional */
-};
-
-int esxVI_ServiceContent_Alloc(esxVI_ServiceContent **serviceContent);
-void esxVI_ServiceContent_Free(esxVI_ServiceContent **serviceContent);
-int esxVI_ServiceContent_Validate(esxVI_ServiceContent *serviceContent);
-int esxVI_ServiceContent_Deserialize(xmlNodePtr node,
-                                     esxVI_ServiceContent **serviceContent);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: UpdateSet
- */
-
-struct _esxVI_UpdateSet {
-    char *version;                                         /* required */
-    esxVI_PropertyFilterUpdate *filterSet;                 /* optional, list */
-};
-
-int esxVI_UpdateSet_Alloc(esxVI_UpdateSet **updateSet);
-void esxVI_UpdateSet_Free(esxVI_UpdateSet **updateSet);
-int esxVI_UpdateSet_Validate(esxVI_UpdateSet *updateSet);
-int esxVI_UpdateSet_Deserialize(xmlNodePtr node, esxVI_UpdateSet **updateSet);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: SharesInfo
- */
-
-struct _esxVI_SharesInfo {
-    esxVI_Int *shares;                                     /* required */
-    esxVI_SharesLevel level;                               /* required */
-};
-
-int esxVI_SharesInfo_Alloc(esxVI_SharesInfo **sharesInfo);
-void esxVI_SharesInfo_Free(esxVI_SharesInfo **sharesInfo);
-int esxVI_SharesInfo_Validate(esxVI_SharesInfo *sharesInfo);
-int esxVI_SharesInfo_CastFromAnyType(esxVI_AnyType *anyType,
-                                     esxVI_SharesInfo **sharesInfo);
-int esxVI_SharesInfo_Deserialize(xmlNodePtr node,
-                                 esxVI_SharesInfo **sharesInfo);
-int esxVI_SharesInfo_Serialize(esxVI_SharesInfo *sharesInfo,
-                               const char *element, virBufferPtr output);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: ResourceAllocationInfo
- */
-
-struct _esxVI_ResourceAllocationInfo {
-    esxVI_Long *reservation;                               /* optional */
-    esxVI_Boolean expandableReservation;                   /* optional */
-    esxVI_Long *limit;                                     /* optional */
-    esxVI_SharesInfo *shares;                              /* optional */
-    esxVI_Long *overheadLimit;                             /* optional */
-};
-
-int esxVI_ResourceAllocationInfo_Alloc
-      (esxVI_ResourceAllocationInfo **resourceAllocationInfo);
-void esxVI_ResourceAllocationInfo_Free
-       (esxVI_ResourceAllocationInfo **resourceAllocationInfo);
-int esxVI_ResourceAllocationInfo_Validate
-      (esxVI_ResourceAllocationInfo *resourceAllocationInfo);
-int esxVI_ResourceAllocationInfo_Serialize
-      (esxVI_ResourceAllocationInfo *resourceAllocationInfo,
-       const char *element, virBufferPtr output);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: ResourcePoolResourceUsage
- */
-
-struct _esxVI_ResourcePoolResourceUsage {
-    esxVI_Long *reservationUsed;                           /* required */
-    esxVI_Long *reservationUsedForVm;                      /* required */
-    esxVI_Long *unreservedForPool;                         /* required */
-    esxVI_Long *unreservedForVm;                           /* required */
-    esxVI_Long *overallUsage;                              /* required */
-    esxVI_Long *maxUsage;                                  /* required */
-};
-
-int esxVI_ResourcePoolResourceUsage_Alloc
-      (esxVI_ResourcePoolResourceUsage **resourcePoolResourceUsage);
-void esxVI_ResourcePoolResourceUsage_Free
-       (esxVI_ResourcePoolResourceUsage **resourcePoolResourceUsage);
-int esxVI_ResourcePoolResourceUsage_Validate
-      (esxVI_ResourcePoolResourceUsage *resourcePoolResourceUsage);
-int esxVI_ResourcePoolResourceUsage_CastFromAnyType
-      (esxVI_AnyType *anyType,
-       esxVI_ResourcePoolResourceUsage **resourcePoolResourceUsage);
-int esxVI_ResourcePoolResourceUsage_Deserialize
-      (xmlNodePtr node,
-       esxVI_ResourcePoolResourceUsage **resourcePoolResourceUsage);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: VirtualMachineConfigSpec
- */
-
-/* FIXME: implement the rest */
-struct _esxVI_VirtualMachineConfigSpec {
-    char *changeVersion;                                   /* optional */
-    char *name;                                            /* optional */
-    char *version;                                         /* optional */
-    char *uuid;                                            /* optional */
-    esxVI_Long *npivNodeWorldWideName;                     /* optional, list */
-    esxVI_Long *npivPortWorldWideName;                     /* optional, list */
-    char *npivWorldWideNameType;                           /* optional */
-    char *npivWorldWideNameOp;                             /* optional */
-    char *locationId;                                      /* optional */
-    char *guestId;                                         /* optional */
-    char *alternateGuestName;                              /* optional */
-    char *annotation;                                      /* optional */
-    //esxVI_VirtualMachineFileInfo *files; /* optional */
-    //esxVI_ToolsConfigInfo *tools; /* optional */
-    //esxVI_VirtualMachineFlagInfo *flags; /* optional */
-    //esxVI_VirtualMachineConsolePreferences *consolePreferences; /* optional */
-    //esxVI_VirtualMachineDefaultPowerOpInfo *powerOpInfo; /* optional */
-    esxVI_Int *numCPUs;                                    /* optional */
-    esxVI_Long *memoryMB;                                  /* optional */
-    //esxVI_VirtualDeviceConfigSpec *deviceChange; /* optional, list */
-    esxVI_ResourceAllocationInfo *cpuAllocation;           /* optional */
-    esxVI_ResourceAllocationInfo *memoryAllocation;        /* optional */
-    //esxVI_VirtualMachineAffinityInfo *cpuAffinity; /* optional */
-    //esxVI_VirtualMachineAffinityInfo *memoryAffinity; /* optional */
-    //esxVI_VirtualMachineNetworkShaperInfo *networkShaper; /* optional */
-    //esxVI_VirtualMachineCpuIdInfoSpec *cpuFeatureMask; /* optional, list */
-    //esxVI_OptionValue *extraConfig; /* optional, list */
-    char *swapPlacement;                                   /* optional */
-    //esxVI_VirtualMachineBootOptions *bootOptions; /* optional */
-};
-
-int esxVI_VirtualMachineConfigSpec_Alloc
-      (esxVI_VirtualMachineConfigSpec **virtualMachineConfigSpec);
-void esxVI_VirtualMachineConfigSpec_Free
-       (esxVI_VirtualMachineConfigSpec **virtualMachineConfigSpec);
-int esxVI_VirtualMachineConfigSpec_Validate
-      (esxVI_VirtualMachineConfigSpec *virtualMachineConfigSpec);
-int esxVI_VirtualMachineConfigSpec_Serialize
-      (esxVI_VirtualMachineConfigSpec *virtualMachineConfigSpec,
-       const char *element, virBufferPtr output);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: Event
- */
-
-/* FIXME: implement the rest */
-struct _esxVI_Event {
-    esxVI_Event *_next;                                    /* optional */
-
-    esxVI_Int *key;                                        /* required */
-    esxVI_Int *chainId;                                    /* required */
-    esxVI_DateTime *createdTime;                           /* required */
-    char *userName;                                        /* required */
-    //??? datacenter;                                      /* optional */
-    //??? computeResource;                                 /* optional */
-    //??? host;                                            /* optional */
-    //??? vm;                                              /* optional */
-    char *fullFormattedMessage;                            /* optional */
-};
-
-int esxVI_Event_Alloc(esxVI_Event **event);
-void esxVI_Event_Free(esxVI_Event **eventList);
-int esxVI_Event_Validate(esxVI_Event *event);
-int esxVI_Event_Deserialize(xmlNodePtr node, esxVI_Event **event);
-int esxVI_Event_DeserializeList(xmlNodePtr node, esxVI_Event **eventList);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: UserSession
- */
-
-struct _esxVI_UserSession {
-    char *key;                                             /* required */
-    char *userName;                                        /* required */
-    char *fullName;                                        /* required */
-    esxVI_DateTime *loginTime;                             /* required */
-    esxVI_DateTime *lastActiveTime;                        /* required */
-    char *locale;                                          /* required */
-    char *messageLocale;                                   /* required */
-};
-
-int esxVI_UserSession_Alloc(esxVI_UserSession **userSession);
-void esxVI_UserSession_Free(esxVI_UserSession **userSession);
-int esxVI_UserSession_Validate(esxVI_UserSession *userSession);
-int esxVI_UserSession_CastFromAnyType(esxVI_AnyType *anyType,
-                                      esxVI_UserSession **userSession);
-int esxVI_UserSession_Deserialize(xmlNodePtr node,
-                                  esxVI_UserSession **userSession);
-
+      (xmlNodePtr node, esxVI_ManagedObjectReference **managedObjectReference);
 
 
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: VirtualMachineQuestionInfo
- */
-
-/* FIXME: implement the rest */
-struct _esxVI_VirtualMachineQuestionInfo {
-    char *id;                                              /* required */
-    char *text;                                            /* required */
-    esxVI_ChoiceOption *choice;                            /* required */
-    /*esxVI_VirtualMachineMessage *message;*/              /* optional, list */
-};
-
-int esxVI_VirtualMachineQuestionInfo_Alloc
-      (esxVI_VirtualMachineQuestionInfo **virtualMachineQuestionInfo);
-void esxVI_VirtualMachineQuestionInfo_Free
-       (esxVI_VirtualMachineQuestionInfo **virtualMachineQuestionInfo);
-int esxVI_VirtualMachineQuestionInfo_Validate
-      (esxVI_VirtualMachineQuestionInfo *virtualMachineQuestionInfo);
-int esxVI_VirtualMachineQuestionInfo_CastFromAnyType
-      (esxVI_AnyType *anyType,
-       esxVI_VirtualMachineQuestionInfo **virtualMachineQuestionInfo);
-int esxVI_VirtualMachineQuestionInfo_Deserialize
-      (xmlNodePtr node,
-       esxVI_VirtualMachineQuestionInfo **virtualMachineQuestionInfo);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: ElementDescription extends Description
- *
- *          In contrast to SelectionSpec and TraversalSpec just merge
- *          Description into ElementDescription for simplicity, because
- *          only ElementDescription is used.
- */
-
-struct _esxVI_ElementDescription {
-    esxVI_ElementDescription *_next;                       /* optional */
-
-    /* Description */
-    char *label;                                           /* required */
-    char *summary;                                         /* required */
-
-    /* ElementDescription */
-    char *key;                                             /* required */
-};
-
-int esxVI_ElementDescription_Alloc
-      (esxVI_ElementDescription **elementDescription);
-void esxVI_ElementDescription_Free
-       (esxVI_ElementDescription **elementDescription);
-int esxVI_ElementDescription_Validate
-      (esxVI_ElementDescription *elementDescription);
-int esxVI_ElementDescription_AppendToList
-      (esxVI_ElementDescription **elementDescriptionList,
-       esxVI_ElementDescription *elementDescription);
-int esxVI_ElementDescription_Deserialize
-      (xmlNodePtr node, esxVI_ElementDescription **elementDescription);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: ChoiceOption extends OptionType
- *
- *          In contrast to SelectionSpec and TraversalSpec just merge
- *          OptionType into ChoiceOption for simplicity, because
- *          only ChoiceOption is used.
- */
-
-struct _esxVI_ChoiceOption {
-    /* OptionType */
-    esxVI_Boolean valueIsReadonly;                         /* optional */
-
-    /* ChoiceOption */
-    esxVI_ElementDescription *choiceInfo;                  /* required, list */
-    esxVI_Int *defaultIndex;                               /* optional */
-};
-
-int esxVI_ChoiceOption_Alloc(esxVI_ChoiceOption **choiceOption);
-void esxVI_ChoiceOption_Free(esxVI_ChoiceOption **choiceOption);
-int esxVI_ChoiceOption_Validate(esxVI_ChoiceOption *choiceOption);
-int esxVI_ChoiceOption_Deserialize(xmlNodePtr node,
-                                   esxVI_ChoiceOption **choiceOption);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PerfMetricId
- */
-
-struct _esxVI_PerfMetricId {
-    esxVI_PerfMetricId *_next;                             /* optional */
-
-    esxVI_Int *counterId;                                  /* required */
-    char *instance;                                        /* required */
-};
-
-int esxVI_PerfMetricId_Alloc(esxVI_PerfMetricId **perfMetricId);
-void esxVI_PerfMetricId_Free(esxVI_PerfMetricId **perfMetricId);
-int esxVI_PerfMetricId_Validate(esxVI_PerfMetricId *perfMetricId);
-int esxVI_PerfMetricId_Serialize(esxVI_PerfMetricId *perfMetricId,
-                                 const char *element, virBufferPtr output);
-int esxVI_PerfMetricId_SerializeList(esxVI_PerfMetricId *perfMetricIdList,
-                                     const char *element, virBufferPtr output);
-int esxVI_PerfMetricId_Deserialize(xmlNodePtr node,
-                                   esxVI_PerfMetricId **perfMetricId);
-int esxVI_PerfMetricId_DeserializeList(xmlNodePtr node,
-                                       esxVI_PerfMetricId **perfMetricIdList);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PerfCounterInfo
- */
-
-struct _esxVI_PerfCounterInfo {
-    esxVI_PerfCounterInfo *_next;                          /* optional */
-
-    esxVI_Int *key;                                        /* required */
-    esxVI_ElementDescription *nameInfo;                    /* required */
-    esxVI_ElementDescription *groupInfo;                   /* required */
-    esxVI_ElementDescription *unitInfo;                    /* required */
-    esxVI_PerfSummaryType rollupType;                      /* required */
-    esxVI_PerfStatsType statsType;                         /* required */
-    esxVI_Int *level;                                      /* optional */
-    esxVI_Int *associatedCounterId;                        /* optional, list */
-};
-
-int esxVI_PerfCounterInfo_Alloc(esxVI_PerfCounterInfo **perfCounterInfo);
-void esxVI_PerfCounterInfo_Free(esxVI_PerfCounterInfo **perfCounterInfo);
-int esxVI_PerfCounterInfo_Validate(esxVI_PerfCounterInfo *perfCounterInfo);
-int esxVI_PerfCounterInfo_Deserialize(xmlNodePtr node,
-                                      esxVI_PerfCounterInfo **perfCounterInfo);
-int esxVI_PerfCounterInfo_DeserializeList
-      (xmlNodePtr node, esxVI_PerfCounterInfo **perfCounterInfoList);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PerfQuerySpec
- */
-
-struct _esxVI_PerfQuerySpec {
-    esxVI_PerfQuerySpec *_next;                            /* optional */
-
-    esxVI_ManagedObjectReference *entity;                  /* required */
-    esxVI_DateTime *startTime;                             /* optional */
-    esxVI_DateTime *endTime;                               /* optional */
-    esxVI_Int *maxSample;                                  /* optional */
-    esxVI_PerfMetricId *metricId;                          /* optional, list */
-    esxVI_Int *intervalId;                                 /* optional */
-    char *format;                                          /* optional */ // FIXME: see PerfFormat
-};
-
-int esxVI_PerfQuerySpec_Alloc(esxVI_PerfQuerySpec **perfQuerySpec);
-void esxVI_PerfQuerySpec_Free(esxVI_PerfQuerySpec **perfQuerySpec);
-int esxVI_PerfQuerySpec_Validate(esxVI_PerfQuerySpec *perfQuerySpec);
-int esxVI_PerfQuerySpec_Serialize(esxVI_PerfQuerySpec *perfQuerySpec,
-                                  const char *element, virBufferPtr output);
-int esxVI_PerfQuerySpec_SerializeList(esxVI_PerfQuerySpec *perfQuerySpecList,
-                                      const char *element, virBufferPtr output);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PerfSampleInfo
- */
-
-struct _esxVI_PerfSampleInfo {
-    esxVI_PerfSampleInfo *_next;                           /* optional */
-
-    esxVI_DateTime *timestamp;                             /* required */
-    esxVI_Int *interval;                                   /* required */
-};
-
-int esxVI_PerfSampleInfo_Alloc(esxVI_PerfSampleInfo **perfSampleInfo);
-void esxVI_PerfSampleInfo_Free(esxVI_PerfSampleInfo **perfSampleInfo);
-int esxVI_PerfSampleInfo_Validate(esxVI_PerfSampleInfo *perfSampleInfo);
-int esxVI_PerfSampleInfo_AppendToList(esxVI_PerfSampleInfo **perfSampleInfoList,
-                                      esxVI_PerfSampleInfo *perfSampleInfo);
-int esxVI_PerfSampleInfo_Deserialize(xmlNodePtr node,
-                                     esxVI_PerfSampleInfo **perfSampleInfo);
-int esxVI_PerfSampleInfo_DeserializeList
-      (xmlNodePtr node, esxVI_PerfSampleInfo **perfSampleInfoList);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PerfMetricIntSeries extends PerfMetricSeries
- *
- *          In contrast to SelectionSpec and TraversalSpec just merge
- *          PerfMetricSeries into PerfMetricIntSeries for simplicity, because
- *          only PerfMetricIntSeries is used and the other type inheriting
- *          PerfMetricSeries (PerfMetricSeriesCSV) is not used.
- */
-
-struct _esxVI_PerfMetricIntSeries {
-    esxVI_PerfMetricIntSeries *_next;                      /* optional */
-
-    /* PerfMetricSeries */
-    esxVI_PerfMetricId *id;                                /* required */
-
-    /* PerfMetricIntSeries */
-    esxVI_Long *value;                                     /* optional, list */
-};
-
-int esxVI_PerfMetricIntSeries_Alloc
-      (esxVI_PerfMetricIntSeries **perfMetricIntSeries);
-void esxVI_PerfMetricIntSeries_Free
-       (esxVI_PerfMetricIntSeries **perfMetricIntSeries);
-int esxVI_PerfMetricIntSeries_Validate
-      (esxVI_PerfMetricIntSeries *perfMetricIntSeries);
-int esxVI_PerfMetricIntSeries_AppendToList
-      (esxVI_PerfMetricIntSeries **perfMetricIntSeriesList,
-       esxVI_PerfMetricIntSeries *perfMetricIntSeries);
-int esxVI_PerfMetricIntSeries_Deserialize
-      (xmlNodePtr node, esxVI_PerfMetricIntSeries **perfMetricIntSeries);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: PerfEntityMetric extends PerfEntityMetricBase
- *
- *          In contrast to SelectionSpec and TraversalSpec just merge
- *          PerfEntityMetricBase into PerfEntityMetric for simplicity, because
- *          only PerfEntityMetric is used and the other type inheriting
- *          PerfEntityMetric (PerfEntityMetricCSV) is not used.
- *
- *          Also use PerfMetricIntSeries instead of the correct base type
- *          PerfMetricSeries for the value property, because only
- *          PerfMetricIntSeries is used.
- */
-
-struct _esxVI_PerfEntityMetric {
-    esxVI_PerfEntityMetric *_next;                         /* optional */
-
-    /* PerfEntityMetricBase */
-    esxVI_ManagedObjectReference *entity;                  /* required */
-
-    /* PerfEntityMetric */
-    esxVI_PerfSampleInfo *sampleInfo;                      /* optional, list */
-    esxVI_PerfMetricIntSeries *value;                      /* optional, list */
-};
-
-int esxVI_PerfEntityMetric_Alloc(esxVI_PerfEntityMetric **perfEntityMetric);
-void esxVI_PerfEntityMetric_Free(esxVI_PerfEntityMetric **perfEntityMetric);
-int esxVI_PerfEntityMetric_Validate(esxVI_PerfEntityMetric *perfEntityMetric);
-int esxVI_PerfEntityMetric_Deserialize
-      (xmlNodePtr node, esxVI_PerfEntityMetric **perfEntityMetric);
-int esxVI_PerfEntityMetric_DeserializeList
-      (xmlNodePtr node, esxVI_PerfEntityMetric **perfEntityMetricList);
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * VI Type: TaskInfo
- */
-
-struct _esxVI_TaskInfo {
-    esxVI_TaskInfo *_next;                                 /* optional */
-
-    char *key;                                             /* required */
-    esxVI_ManagedObjectReference *task;                    /* required */
-    char *name;                                            /* optional */
-    char *descriptionId;                                   /* required */
-    esxVI_ManagedObjectReference *entity;                  /* optional */
-    char *entityName;                                      /* optional */
-    /*esxVI_ManagedObjectReference *locked;*/                  /* optional, list *//* FIXME */
-    esxVI_TaskInfoState state;                             /* required */
-    esxVI_Boolean cancelled;                               /* required */
-    esxVI_Boolean cancelable;                              /* required */
-    /*esxVI_MethodFault *error;*/                              /* optional *//* FIXME */
-    esxVI_AnyType *result;                                 /* optional */
-    esxVI_Int *progress;                                   /* optional */
-    /*esxVI_TaskReason *reason;*/                              /* required *//* FIXME */
-    esxVI_DateTime *queueTime;                             /* required */
-    esxVI_DateTime *startTime;                             /* optional */
-    esxVI_DateTime *completeTime;                          /* optional */
-    esxVI_Int *eventChainId;                               /* required */
-};
 
-int esxVI_TaskInfo_Alloc(esxVI_TaskInfo **taskInfo);
-void esxVI_TaskInfo_Free(esxVI_TaskInfo **taskInfoList);
-int esxVI_TaskInfo_Validate(esxVI_TaskInfo *taskInfo);
-int esxVI_TaskInfo_CastFromAnyType(esxVI_AnyType *anyType,
-                                   esxVI_TaskInfo **taskInfo);
-int esxVI_TaskInfo_AppendToList(esxVI_TaskInfo **taskInfoList,
-                                esxVI_TaskInfo *taskInfo);
-int esxVI_TaskInfo_Deserialize(xmlNodePtr node, esxVI_TaskInfo **taskInfo);
+#include "esx_vi_types.generated.h"
 
 #endif /* __ESX_VI_TYPES_H__ */
-- 
1.6.3.3
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            2
                            
                          
                          
                            
    
                          
                        
                     
                        
                    31 Mar '10
                    
                        2010/3/31 Daniel Veillard <veillard(a)redhat.com>:
> On Wed, Mar 31, 2010 at 01:38:48PM +0200, Matthias Bolte wrote:
>> ---
>>  src/.gitignore   |    1 +
>>  tests/.gitignore |    1 +
>>  2 files changed, 2 insertions(+), 0 deletions(-)
>>
>> diff --git a/src/.gitignore b/src/.gitignore
>> index 26b8689..e407dcb 100644
>> --- a/src/.gitignore
>> +++ b/src/.gitignore
>> @@ -15,3 +15,4 @@ libvirt_lxc
>>  libvirt.syms
>>  *.i
>>  *.s
>> +virt-aa-helper
>> diff --git a/tests/.gitignore b/tests/.gitignore
>> index 399baee..387a924 100644
>> --- a/tests/.gitignore
>> +++ b/tests/.gitignore
>> @@ -33,3 +33,4 @@ object-locking-files.txt
>>  esxutilstest
>>  vmx2xmltest
>>  xml2vmxtest
>> +secaatest
>
>  ACK,
>
> Daniel
>
Thanks, pushed.
Matthias
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    