Add EnumType for generated enum

This commit is contained in:
Clement Rouault
2016-03-25 16:59:40 +01:00
parent 480cbcf1dc
commit ff5ce9ae86
4 changed files with 691 additions and 581 deletions
+28
View File
@@ -231,6 +231,34 @@ from ctypes import *
from ctypes.wintypes import *
from .windef import *
class EnumValue(Flag):
def __new__(cls, enum_name, name, value):
return super(EnumValue, cls).__new__(cls, name, value)
def __init__(self, enum_name, name, value):
self.enum_name = enum_name
self.name = name
def __repr__(self):
return "{0}.{1}({2})".format(self.enum_name, self.name, hex(self))
class EnumType(DWORD):
values = ()
mapper = {}
@property
def value(self):
raw_value = super(EnumType, self).value
return self.mapper.get(raw_value, raw_value)
def __repr__(self):
raw_value = super(EnumType, self).value
if raw_value in self.values:
value = self.value
return "<{0} {1}({2})>".format(type(self).__name__, value.name, hex(raw_value))
return "<{0}({1})>".format(type(self).__name__, hex(self.value))
"""[1:]
def generate_struct_ctypes(structs, enums):
+18 -15
View File
@@ -25,7 +25,7 @@ class Ptr(object):
def __repr__(self):
return "Ptr({0})".format(repr(self.type))
class WinStruct(object):
ctypes_type = "Structure"
@@ -59,9 +59,9 @@ class WinStruct(object):
res += "{0}._fields_ = [\n".format(self.name)
for (ftype, name, nb_rep) in self.fields:
if nb_rep == 1:
if nb_rep == 1:
res+= ' ("{0}", {1}),\n'.format(name, ftype.generate_ctypes())
else:
else:
res+= ' ("{0}", {1} * {2}),\n'.format(name, ftype.generate_ctypes(), nb_rep)
res += "]\n"
return res
@@ -73,9 +73,9 @@ class WinStruct(object):
_fields_ = [\n""".format(self.name, self.ctypes_type)
for (ftype, name, nb_rep) in self.fields:
if nb_rep == 1:
if nb_rep == 1:
res+= ' ("{0}", {1}),\n'.format(name, ftype.generate_ctypes())
else:
else:
res+= ' ("{0}", {1} * {2}),\n'.format(name, ftype.generate_ctypes(), nb_rep)
res += " ]\n"
return res
@@ -88,10 +88,10 @@ class WinStruct(object):
str_value = "POINTER({0})".format(self.name)
ctypes_class += "{0} = {1}\n".format(typedef_name, str_value)
return ctypes_class
class WinUnion(WinStruct):
ctypes_type = "Union"
class WinEnum(object):
def __init__(self, name):
self.name = name
@@ -105,7 +105,7 @@ class WinEnum(object):
if name in self.typedef:
raise ValueError("nop")
self.typedef[name] = self
def add_ptr_typedef(self, name):
if name in self.typedef:
raise ValueError("nop")
@@ -113,7 +113,15 @@ class WinEnum(object):
# Assert that enum are DWORD
def generate_ctypes(self):
lines = ["{0} = DWORD".format(self.name)]
#lines = ["{0} = DWORD".format(self.name)]
lines = []
for i, name in self.fields:
lines.append('{0} = EnumValue("{2}", "{0}", {1})'.format(name, hex(i), self.name))
lines += ["class {0}(EnumType):".format(self.name)]
lines += [" values = [{0}]".format(", ".join([name for i, name in self.fields]))]
lines += [" mapper = {{x:x for x in values}}".format(self.name)]
for typedef_name, value in self.typedef.items():
str_value = self.name
if type(value) == Ptr:
@@ -121,10 +129,5 @@ class WinEnum(object):
lines += ["{0} = {1}".format(typedef_name, str_value)]
#lines += ["{0} = {1}".format(t, self.name) for t in self.typedef]
lines += [""]
for i, name in self.fields:
lines.append("{0} = {1}".format(name, hex(i)))
ctypes_class = "\n".join(lines)
ctypes_class = "\n".join(lines)
return ctypes_class + "\n"
File diff suppressed because one or more lines are too long
+2 -5
View File
@@ -10,11 +10,6 @@ from windows.generated_def.winstructs import *
from windows.generated_def.interfaces import IWbemLocator, IWbemServices, IEnumWbemClassObject, IWbemClassObject
class WmiRequester(object):
"""Perform WMI request: NOT STABLE"""
INSTANCE = None
@@ -47,6 +42,8 @@ class WmiRequester(object):
except WindowsError as e:
if (e.winerror & 0xffffffff) == WBEM_E_INVALID_CLASS:
raise WindowsError(e.winerror, 'WBEM_E_INVALID_CLASS <Invalid WMI class "{0}">'.format(frm))
elif (e.winerror & 0xffffffff) in WBEMSTATUS.values:
raise WindowsError(e.winerror, WBEMSTATUS(e.winerror & 0xffffffff).value)
raise
count = ctypes.c_ulong(0)