Index: mojo/public/python/mojo/bindings/descriptor.py |
diff --git a/mojo/public/python/mojo/bindings/descriptor.py b/mojo/public/python/mojo/bindings/descriptor.py |
index 44c0f395432f273298aebc50c8740be6fb8880a6..f566d4757dafd0acc6ada7d606003b026eee3644 100644 |
--- a/mojo/public/python/mojo/bindings/descriptor.py |
+++ b/mojo/public/python/mojo/bindings/descriptor.py |
@@ -210,36 +210,104 @@ class StringType(PointerType): |
return unicode(string_array.tostring(), 'utf8') |
-class HandleType(SerializableType): |
+class BaseHandleType(SerializableType): |
"""Type object for handles.""" |
def __init__(self, nullable=False): |
SerializableType.__init__(self, 'i') |
self.nullable = nullable |
- def Convert(self, value): |
- if value is None: |
- return mojo.system.Handle() |
- if not isinstance(value, mojo.system.Handle): |
- raise TypeError('%r is not a handle' % value) |
- return value |
- |
def Serialize(self, value, data_offset, data, handle_offset): |
- if not value.IsValid() and not self.nullable: |
+ handle = self.ToHandle(value) |
+ if not handle.IsValid() and not self.nullable: |
raise serialization.SerializationException( |
'Trying to serialize null for non nullable type.') |
- if not value.IsValid(): |
+ if not handle.IsValid(): |
return (-1, []) |
- return (handle_offset, [value]) |
+ return (handle_offset, [handle]) |
def Deserialize(self, value, data, handles): |
if value == -1: |
if not self.nullable: |
raise serialization.DeserializationException( |
'Trying to deserialize null for non nullable type.') |
- return mojo.system.Handle() |
+ return self.FromHandle(mojo.system.Handle()) |
# TODO(qsr) validate handle order |
- return handles[value] |
+ return self.FromHandle(handles[value]) |
+ |
+ def FromHandle(self, handle): |
+ raise NotImplementedError() |
+ |
+ def ToHandle(self, value): |
+ raise NotImplementedError() |
+ |
+ |
+class HandleType(BaseHandleType): |
+ """Type object for handles.""" |
+ |
+ def Convert(self, value): |
+ if value is None: |
+ return mojo.system.Handle() |
+ if not isinstance(value, mojo.system.Handle): |
+ raise TypeError('%r is not a handle' % value) |
+ return value |
+ |
+ def FromHandle(self, handle): |
+ return handle |
+ |
+ def ToHandle(self, value): |
+ return value |
+ |
+ |
+class InterfaceRequestType(BaseHandleType): |
+ """Type object for interface requests.""" |
+ |
+ def Convert(self, value): |
+ if value is None: |
+ return reflection.InterfaceRequest(mojo.system.Handle()) |
+ if not isinstance(value, reflection.InterfaceRequest): |
+ raise TypeError('%r is not an interface request' % value) |
+ return value |
+ |
+ def FromHandle(self, handle): |
+ return reflection.InterfaceRequest(handle) |
+ |
+ def ToHandle(self, value): |
+ return value.PassMessagePipe() |
+ |
+ |
+class InterfaceType(BaseHandleType): |
+ """Type object for interfaces.""" |
+ |
+ def __init__(self, interface_getter, nullable=False): |
+ BaseHandleType.__init__(self, nullable) |
+ self._interface_getter = interface_getter |
+ self._interface = None |
+ |
+ def Convert(self, value): |
+ if value is None or isinstance(value, self.interface): |
+ return value |
+ raise TypeError('%r is not an instance of ' % self.interface) |
+ |
+ @property |
+ def interface(self): |
+ if not self._interface: |
+ self._interface = self._interface_getter() |
+ return self._interface |
+ |
+ def FromHandle(self, handle): |
+ if handle.IsValid(): |
+ return self.interface.manager.Proxy(handle) |
+ return None |
+ |
+ def ToHandle(self, value): |
+ if not value: |
+ return mojo.system.Handle() |
+ if isinstance(value, reflection.InterfaceProxy): |
+ return value.manager.PassMessagePipe() |
+ pipe = mojo.system.MessagePipe() |
+ self.interface.manager.Bind(value, pipe.handle0) |
+ return pipe.handle1 |
class BaseArrayType(PointerType): |
@@ -460,24 +528,6 @@ class MapType(SerializableType): |
return GenericArrayType(t) |
-class NoneType(SerializableType): |
- """Placeholder type, used temporarily until all mojo types are handled.""" |
- |
- def __init__(self): |
- SerializableType.__init__(self, 'B') |
- |
- def Convert(self, value): |
- return None |
- |
- def Serialize(self, value, data_offset, data, handle_offset): |
- return (0, []) |
- |
- def Deserialize(self, value, data, handles): |
- return None |
- |
- |
-TYPE_NONE = NoneType() |
- |
TYPE_BOOL = BooleanType() |
TYPE_INT8 = IntegerType('b') |
@@ -499,6 +549,9 @@ TYPE_NULLABLE_STRING = StringType(True) |
TYPE_HANDLE = HandleType() |
TYPE_NULLABLE_HANDLE = HandleType(True) |
+TYPE_INTERFACE_REQUEST = InterfaceRequestType() |
+TYPE_NULLABLE_INTERFACE_REQUEST = InterfaceRequestType(True) |
+ |
class FieldDescriptor(object): |
"""Describes a field in a generated struct.""" |