Example #1
0
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
Example #2
0
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)