[PATCH 3/6] Add support for file descriptor request fields
Daniel Martin
consume.noise at gmail.com
Thu Nov 7 09:38:33 PST 2013
On Tue, Nov 05, 2013 at 04:39:03PM -0800, Keith Packard wrote:
> These are present in the API, but not present on the wire.
>
> Signed-off-by: Keith Packard <keithp at keithp.com>
> ---
> xcbgen/expr.py | 3 ++-
> xcbgen/xtypes.py | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
> 2 files changed, 59 insertions(+), 2 deletions(-)
>
> diff --git a/xcbgen/expr.py b/xcbgen/expr.py
> index 4f8af6f..f9d5179 100644
> --- a/xcbgen/expr.py
> +++ b/xcbgen/expr.py
> @@ -13,7 +13,7 @@ class Field(object):
> auto is true iff the field is on the wire but not in the request API (e.g. opcode)
> enum is the enum name this field refers to, if any.
> '''
> - def __init__(self, type, field_type, field_name, visible, wire, auto, enum=None):
> + def __init__(self, type, field_type, field_name, visible, wire, auto, enum=None, isfd=False):
> self.type = type
> self.field_type = field_type
> self.field_name = field_name
> @@ -21,6 +21,7 @@ class Field(object):
> self.visible = visible
> self.wire = wire
> self.auto = auto
> + self.isfd = isfd
>
>
> class Expression(object):
> diff --git a/xcbgen/xtypes.py b/xcbgen/xtypes.py
> index 5012f0b..d007635 100644
> --- a/xcbgen/xtypes.py
> +++ b/xcbgen/xtypes.py
> @@ -75,6 +75,18 @@ class Type(object):
>
> complex_type.fields.append(new_field)
>
> + def make_fd_of(self, module, complex_type, fd_name):
> + '''
Here's a tab, which isn't a problem for python 2.7. But, with 3.3
c_client.py fails with it:
...
TabError: inconsistent use of tabs and spaces in indentation
> + Method for making a fd member of a structure.
> + '''
> + new_fd = Field(self, module.get_type_name('INT32'), fd_name, True, False, False, None, True)
> + # We dump the _placeholder_byte if any fields are added.
> + for (idx, field) in enumerate(complex_type.fields):
> + if field == _placeholder_byte:
> + complex_type.fields[idx] = new_fd
> + return
> +
> + complex_type.fields.append(new_fd)
>
> class SimpleType(Type):
> '''
> @@ -152,6 +164,44 @@ class Enum(SimpleType):
> out = __main__.output['enum']
>
>
> +class FileDescriptor(SimpleType):
> + '''
> + Derived class which represents a file descriptor. Passed via magic kernel stuff
> +
> + Public fields added:
> + values contains a list of (name, value) tuples. value is empty, or a number.
> + bits contains a list of (name, bitnum) tuples. items only appear if specified as a bit. bitnum is a number.
> + '''
> + def __init__(self, name, elt):
> + SimpleType.__init__(self, name, 4)
> + self.values = []
> + self.bits = []
> + self.doc = None
> + for item in list(elt):
> + if item.tag == 'doc':
> + self.doc = Doc(name, item)
> +
> + # First check if we're using a default value
> + if len(list(item)) == 0:
> + self.values.append((item.get('name'), ''))
> + continue
> +
> + # An explicit value or bit was specified.
> + value = list(item)[0]
> + if value.tag == 'value':
> + self.values.append((item.get('name'), value.text))
> + elif value.tag == 'bit':
> + self.values.append((item.get('name'), '%u' % (1 << int(value.text, 0))))
> + self.bits.append((item.get('name'), value.text))
> +
> + def resolve(self, module):
> + self.resolved = True
> +
> + def fixed_size(self):
> + return True
> +
> + out = __main__.output['enum']
> +
> class ListType(Type):
> '''
> Derived class which represents a list of some other datatype. Fixed- or variable-sized.
> @@ -279,6 +329,7 @@ class ComplexType(Type):
> self.nmemb = 1
> self.size = 0
> self.lenfield_parent = [self]
> + self.fds = []
>
> def resolve(self, module):
> if self.resolved:
> @@ -324,9 +375,14 @@ class ComplexType(Type):
> type.make_member_of(module, self, field_type, field_name, visible, True, False)
> type.resolve(module)
> continue
> + elif child.tag == 'fd':
> + fd_name = child.get('name')
> + type = module.get_type('INT32')
> + type.make_fd_of(module, self, fd_name)
> + continue
> else:
> # Hit this on Reply
> - continue
> + continue
>
> # Get the full type name for the field
> field_type = module.get_type_name(fkey)
> --
> 1.8.4.2
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
More information about the xorg-devel
mailing list