def py_struct(self, oldname): name = (oldname[-2], pythonize_classname(oldname[-1])) setup_type(self, name) cls = PyClass(self.py_type) cls.base = 'ooxcb.Struct' init = cls.new_method('__init__') if self.fixed_size(): init.arguments += ['conn'] init.code.append('ooxcb.Struct.__init__(self, conn)') else: init.arguments += ['conn'] init.code.append('ooxcb.Struct.__init__(self, conn)') py_complex(self, name, cls) if not self.fixed_size(): cls.get_member_by_name('read').code.append('self.size = stream.tell() - root') ALL[strip_ns(name)] = cls WRAPPERS[strip_ns(oldname)] = cls
def py_event(self, name): setup_type(self, name, 'Event') entry = INTERFACE.get('Events', {}).get(strip_ns(name), {}) clsname = entry.get('classname', self.py_event_name) # Opcode define EVENTS[self.opcodes[name]] = clsname eventname = ('"%s"' % entry.get('eventname', 'on_%s' % pythonize_camelcase_name(strip_ns(name)))) struct = PyClass(clsname) struct.base = 'ooxcb.Event' struct.new_attribute('event_name', eventname) # each event class has an `opcode` attribute struct.new_attribute('opcode', self.opcodes[name]) if not entry: clsname, membername = ('ooxcb.Connection', 'conn') else: membername = entry['member'] # here we want to register the events to the original class. # TODO: The way I am doing that here is dirty. clsname = '"%s"' % entry.get('class', get_wrapped(get_field_by_name(self.fields, membername).py_type).replace('Mixin', '')) # the classnames are resolved later. see generate_all. struct.new_attribute('event_target_class', clsname) init = struct.new_method('__init__') init.arguments.extend(['conn']) init.code.append('ooxcb.Event.__init__(self, conn)') ALL[self.py_event_name] = WRAPPERS[self.py_event_name] = struct py_complex(self, name, struct) struct.get_member_by_name('read').code.append('self.event_target = self.%s' % membername)