[libvirt] [PATCH 02/16] hyperv: add cim types support to code generator

Jason Miesionczek jmiesionczek at datto.com
Tue Aug 9 12:39:10 UTC 2016


---
 src/hyperv/hyperv_wmi_generator.py | 57 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 54 insertions(+), 3 deletions(-)

diff --git a/src/hyperv/hyperv_wmi_generator.py b/src/hyperv/hyperv_wmi_generator.py
index f767d54..8384634 100755
--- a/src/hyperv/hyperv_wmi_generator.py
+++ b/src/hyperv/hyperv_wmi_generator.py
@@ -68,7 +68,7 @@ class Class:
         header += "\n"
         header += "#define %s_RESOURCE_URI \\\n" % name_upper
 
-        if self.name.startswith("Win32_"):
+        if self.name.startswith("Win32_") or self.name.startswith("CIM_DataFile"):
             header += "    \"http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/%s\"\n" % self.name
         else:
             header += "    \"http://schemas.microsoft.com/wbem/wsman/1/wmi/root/virtualization/%s\"\n" % self.name
@@ -100,6 +100,25 @@ class Class:
 
         return header
 
+    def generate_cimtypes_header2(self):
+        header = separator
+        header += " * %s\n" % self.name
+        header += " */\n"
+        header += "\n"
+        header += "CimTypes cimTypes_%s[] = {\n" % self.name
+        for property in self.properties:
+            header += property.generate_cimtypes_header2()
+            header += ",\n"
+        header += "\t{ \"\", \"\", 0 },\n};\n\n"
+
+        return header
+
+    def generate_cimtypes_header3(self):
+        header = "	{ \"%s" % self.name
+        header += "\", cimTypes_%s" % self.name
+        header += " },\n"
+
+        return header
 
     def generate_source(self):
         name_upper = self.name.upper()
@@ -113,7 +132,7 @@ class Class:
                   % (self.name.replace("_", ""), self.name)
         source += "{\n"
 
-        if self.name.startswith("Win32_"):
+        if self.name.startswith("Win32_") or self.name.startswith("CIM_DataFile"):
             source += "    return hypervEnumAndPull(priv, query, ROOT_CIMV2,\n"
         else:
             source += "    return hypervEnumAndPull(priv, query, ROOT_VIRTUALIZATION,\n"
@@ -189,6 +208,16 @@ class Property:
             return "    SER_NS_%s(%s_RESOURCE_URI, \"%s\", 1),\n" \
                    % (Property.typemap[self.type], class_name.upper(), self.name)
 
+    def generate_cimtypes_header2(self):
+        header = "	{ \"%s" % self.name
+        header += "\", \"%s\", " % self.type
+        if self.is_array:
+            header += "true"
+        else:
+            header += "false"
+        header += " }"
+        return header
+
 
 
 def open_and_print(filename):
@@ -238,7 +267,20 @@ def parse_class(block):
 
     return Class(name=name, properties=properties)
 
-
+def generate_cimtypes_header1():
+    header = "struct cimTypes{\n"
+    header += "	const char *name;\n"
+    header += "	const char *type;\n"
+    header += "	bool isArray;\n"
+    header += "};\n"
+    header += "typedef struct cimTypes CimTypes;\n\n"
+    header += "struct cimClasses{\n"
+    header += "	const char *name;\n"
+    header += "	CimTypes *cimTypesPtr;\n"
+    header += "};\n"
+    header += "typedef struct cimClasses CimClasses;\n\n"
+
+    return header
 
 def main():
     if "srcdir" in os.environ:
@@ -253,6 +295,7 @@ def main():
     classes_typedef = open_and_print(os.path.join(output_dirname, "hyperv_wmi_classes.generated.typedef"))
     classes_header = open_and_print(os.path.join(output_dirname, "hyperv_wmi_classes.generated.h"))
     classes_source = open_and_print(os.path.join(output_dirname, "hyperv_wmi_classes.generated.c"))
+    cimtypes_header = open_and_print(os.path.join(output_dirname, "hyperv_wmi_cimtypes.generated.h"))
 
     # parse input file
     number = 0
@@ -294,6 +337,8 @@ def main():
     classes_typedef.write(notice)
     classes_header.write(notice)
     classes_source.write(notice)
+    cimtypes_header.write(notice)
+    cimtypes_header.write(generate_cimtypes_header1())
 
     names = classes_by_name.keys()
     names.sort()
@@ -304,6 +349,12 @@ def main():
         classes_typedef.write(classes_by_name[name].generate_classes_typedef())
         classes_header.write(classes_by_name[name].generate_classes_header())
         classes_source.write(classes_by_name[name].generate_classes_source())
+        cimtypes_header.write(classes_by_name[name].generate_cimtypes_header2())
+
+    cimtypes_header.write("CimClasses cimClasses[] = {\n")
+    for name in names:
+        cimtypes_header.write(classes_by_name[name].generate_cimtypes_header3())
+    cimtypes_header.write("\t{ \"\", NULL },\n};\n")
 
 
 
-- 
2.7.4




More information about the libvir-list mailing list