41 def _GetCtype(fields):
42 raw_fields = []
43 wrappers = {}
44 for field in fields:
45 (name, type) = field
46 if isinstance(type, Enum):
47 raw_fields.append(('_raw_' + name, type.type))
48 wrappers[name] = type
49 else:
50 raw_fields.append(field)
51
52 class Raw(ctypes.Structure):
53 _fields_ = raw_fields
54 _pack_ = 1
55
56 def __getattribute__(self, name):
57 if name in wrappers:
58 return wrappers[name].from_raw(
59 getattr(self, '_raw_' + name))
60 else:
61 return ctypes.Structure.__getattribute__(self, name)
62
63 def __repr__(self):
64 return '{' + ', '.join(
65 '%s: %s' % (field, self.__getattribute__(field))
66 for field, _ in fields) + '}'
67
68 return Raw
69
70
71
72
73