| Index: mojo/public/dart/src/codec.dart
|
| diff --git a/mojo/public/dart/src/codec.dart b/mojo/public/dart/src/codec.dart
|
| index 8969ea101081f66281b370892f620a79bd5adf2c..d5f5b90bd83f6f39b18bd7cfd0035c5e0a6855d7 100644
|
| --- a/mojo/public/dart/src/codec.dart
|
| +++ b/mojo/public/dart/src/codec.dart
|
| @@ -138,6 +138,42 @@ class Encoder {
|
| }
|
| }
|
|
|
| + void encodeMessagePipeHandle(
|
| + core.MojoMessagePipeEndpoint value, int offset, bool nullable) =>
|
| + encodeHandle(value != null ? value.handle : null, offset, nullable);
|
| +
|
| + void encodeConsumerHandle(
|
| + core.MojoDataPipeConsumer value, int offset, bool nullable) =>
|
| + encodeHandle(value != null ? value.handle : null, offset, nullable);
|
| +
|
| + void encodeProducerHandle(
|
| + core.MojoDataPipeProducer value, int offset, bool nullable) =>
|
| + encodeHandle(value != null ? value.handle : null, offset, nullable);
|
| +
|
| + void encodeSharedBufferHandle(
|
| + core.MojoSharedBuffer value, int offset, bool nullable) =>
|
| + encodeHandle(value != null ? value.handle : null, offset, nullable);
|
| +
|
| + void encodeInterface(Interface interface, int offset, bool nullable) {
|
| + if (interface == null) {
|
| + encodeInvalideHandle(offset, nullable);
|
| + return;
|
| + }
|
| + var pipe = new core.MojoMessagePipe();
|
| + interface.bind(pipe.endpoints[0]);
|
| + encodeMessagePipeHandle(pipe.endpoints[1], offset, nullable);
|
| + }
|
| +
|
| + void encodeInterfaceRequest(Client client, int offset, bool nullable) {
|
| + if (client == null) {
|
| + encodeInvalideHandle(offset, nullable);
|
| + return;
|
| + }
|
| + var pipe = new core.MojoMessagePipe();
|
| + client.bind(pipe.endpoints[0]);
|
| + encodeMessagePipeHandle(pipe.endpoints[1], offset, nullable);
|
| + }
|
| +
|
| void encodeNullPointer(int offset, bool nullable) {
|
| if (!nullable) {
|
| throw 'Trying to encode a null pointer for a non-nullable type';
|
| @@ -271,10 +307,11 @@ class Encoder {
|
| encodeArray((e, v) => e.appendDoubleArray(v),
|
| 8, value, offset, nullability, expectedLength);
|
|
|
| - void encodeHandleArray(List<core.MojoHandle> value,
|
| - int offset,
|
| - int nullability,
|
| - int expectedLength) {
|
| + void _handleArrayEncodeHelper(Function elementEncoder,
|
| + List value,
|
| + int offset,
|
| + int nullability,
|
| + int expectedLength) {
|
| if (value == null) {
|
| encodeNullPointer(offset, isArrayNullable(nullability));
|
| return;
|
| @@ -283,11 +320,74 @@ class Encoder {
|
| kSerializedHandleSize, value.length, offset, expectedLength);
|
| for (int i = 0; i < value.length; ++i) {
|
| int handleOffset = DataHeader.kHeaderSize + kSerializedHandleSize * i;
|
| - encoder.encodeHandle(
|
| - value[i], handleOffset, isElementNullable(nullability));
|
| + elementEncoder(
|
| + encoder, value[i], handleOffset, isElementNullable(nullability));
|
| }
|
| }
|
|
|
| + void encodeHandleArray(
|
| + List<core.MojoHandle> value,
|
| + int offset,
|
| + int nullability,
|
| + int expectedLength) =>
|
| + _handleArrayEncodeHelper(
|
| + (e, v, o, n) => e.encodeHandle(v, o, n),
|
| + value, offset, nullability, expectedLength);
|
| +
|
| + void encodeMessagePipeHandleArray(
|
| + List<core.MojoMessagePipeEndpoint> value,
|
| + int offset,
|
| + int nullability,
|
| + int expectedLength) =>
|
| + _handleArrayEncodeHelper(
|
| + (e, v, o, n) => e.encodeMessagePipeHandle(v, o, n),
|
| + value, offset, nullability, expectedLength);
|
| +
|
| + void encodeConsumerHandleArray(
|
| + List<core.MojoDataPipeConsumer> value,
|
| + int offset,
|
| + int nullability,
|
| + int expectedLength) =>
|
| + _handleArrayEncodeHelper(
|
| + (e, v, o, n) => e.encodeConsumerHandle(v, o, n),
|
| + value, offset, nullability, expectedLength);
|
| +
|
| + void encodeProducerHandleArray(
|
| + List<core.MojoDataPipeProducer> value,
|
| + int offset,
|
| + int nullability,
|
| + int expectedLength) =>
|
| + _handleArrayEncodeHelper(
|
| + (e, v, o, n) => e.encodeProducerHandle(v, o, n),
|
| + value, offset, nullability, expectedLength);
|
| +
|
| + void encodeSharedBufferHandleArray(
|
| + List<core.MojoSharedBuffer> value,
|
| + int offset,
|
| + int nullability,
|
| + int expectedLength) =>
|
| + _handleArrayEncodeHelper(
|
| + (e, v, o, n) => e.encodeSharedBufferHandle(v, o, n),
|
| + value, offset, nullability, expectedLength);
|
| +
|
| + void encodeInterfaceRequestArray(
|
| + List<Client> value,
|
| + int offset,
|
| + int nullability,
|
| + int expectedLength) =>
|
| + _handleArrayEncodeHelper(
|
| + (e, v, o, n) => e.encodeInterfaceRequest(v, o, n),
|
| + value, offset, nullability, expectedLength);
|
| +
|
| + void encodeInterfaceArray(
|
| + List<Interface> value,
|
| + int offset,
|
| + int nullability,
|
| + int expectedLength) =>
|
| + _handleArrayEncodeHelper(
|
| + (e, v, o, n) => e.encodeInterface(v, o, n),
|
| + value, offset, nullability, expectedLength);
|
| +
|
| static Uint8List _utf8OfString(String s) =>
|
| (new Uint8List.fromList((const Utf8Encoder()).convert(s)));
|
|
|
| @@ -346,6 +446,7 @@ class Encoder {
|
| }
|
| }
|
|
|
| +
|
| class Decoder {
|
| Message _message;
|
| int _base = 0;
|
| @@ -393,6 +494,31 @@ class Decoder {
|
| return _handles[index];
|
| }
|
|
|
| + core.MojoMessagePipeEndpoint decodeMessagePipeHandle(
|
| + int offset, bool nullable) =>
|
| + new core.MojoMessagePipeEndpoint(decodeHandle(offset, nullable));
|
| +
|
| + core.MojoDataPipeConsumer decodeConsumerHandle(int offset, bool nullable) =>
|
| + new core.MojoDataPipeConsumer(decodeHandle(offset, nullable));
|
| +
|
| + core.MojoDataPipeProducer decodeProducerHandle(int offset, bool nullable) =>
|
| + new core.MojoDataPipeProducer(decodeHandle(offset, nullable));
|
| +
|
| + core.MojoSharedBuffer decodeSharedBufferHandle(int offset, bool nullable) =>
|
| + new core.MojoSharedBuffer(decodeHandle(offset, nullable));
|
| +
|
| + Client decodeServiceInterface(
|
| + int offset, bool nullable, Function clientFactory) {
|
| + var endpoint = decodeMessagePipeHandle(offset, nullable);
|
| + return endpoint.handle.isValid ? clientFactory(endpoint) : null;
|
| + }
|
| +
|
| + Interface decodeInterfaceRequest(
|
| + int offset, bool nullable, Function interfaceFactory) {
|
| + var endpoint = decodeMessagePipeHandle(offset, nullable);
|
| + return endpoint.handle.isValid ? interfaceFactory(endpoint) : null;
|
| + }
|
| +
|
| Decoder decodePointer(int offset, bool nullable) {
|
| int basePosition = _base + offset;
|
| int pointerOffset = decodeUint64(offset);
|
| @@ -528,22 +654,69 @@ class Decoder {
|
| decodeArray((b, s, l) => new Float64List.view(b, s, l),
|
| 8, offset, nullability, expectedLength);
|
|
|
| - List<core.MojoHandle> decodeHandleArray(
|
| - int offset, int nullability, int expectedLength) {
|
| + List _handleArrayDecodeHelper(Function elementDecoder,
|
| + int offset,
|
| + int nullability,
|
| + int expectedLength) {
|
| Decoder d = decodePointer(offset, isArrayNullable(nullability));
|
| if (d == null) {
|
| return null;
|
| }
|
| var header = d.decodeDataHeaderForArray(4, expectedLength);
|
| - var result = new core.MojoHandle(header.numFields);
|
| + var result = new List(header.numFields);
|
| for (int i = 0; i < result.length; ++i) {
|
| - result[i] = d.decodeHandle(
|
| + result[i] = elementDecoder(
|
| + d,
|
| DataHeader.kHeaderSize + kSerializedHandleSize * i,
|
| isElementNullable(nullability));
|
| }
|
| return result;
|
| +
|
| }
|
|
|
| + List<core.MojoHandle> decodeHandleArray(
|
| + int offset, int nullability, int expectedLength) =>
|
| + _handleArrayDecodeHelper((d, o, n) => d.decodeHandle(o, n),
|
| + offset, nullability, expectedLength);
|
| +
|
| + List<core.MojoDataPipeConsumer> decodeConsumerHandleArray(
|
| + int offset, int nullability, int expectedLength) =>
|
| + _handleArrayDecodeHelper((d, o, n) => d.decodeConsumerHandle(o, n),
|
| + offset, nullability, expectedLength);
|
| +
|
| + List<core.MojoDataPipeProducer> decodeProducerHandleArray(
|
| + int offset, int nullability, int expectedLength) =>
|
| + _handleArrayDecodeHelper((d, o, n) => d.decodeProducerHandle(o, n),
|
| + offset, nullability, expectedLength);
|
| +
|
| + List<core.MojoMessagePipeEndpoint> decodeMessagePipeHandleArray(
|
| + int offset, int nullability, int expectedLength) =>
|
| + _handleArrayDecodeHelper((d, o, n) => d.decodeMessagePipeHandle(o, n),
|
| + offset, nullability, expectedLength);
|
| +
|
| + List<core.MojoSharedBuffer> decodeSharedBufferHandleArray(
|
| + int offset, int nullability, int expectedLength) =>
|
| + _handleArrayDecodeHelper((d, o, n) => d.decodeSharedBufferHandle(o, n),
|
| + offset, nullability, expectedLength);
|
| +
|
| + List<Interface> decodeInterfaceRequestArray(
|
| + int offset,
|
| + int nullability,
|
| + int expectedLength,
|
| + Function interfaceFactory) =>
|
| + _handleArrayDecodeHelper(
|
| + (d, o, n) => d.decodeInterfaceRequest(o, n, interfaceFactory),
|
| + offset, nullability, expectedLength);
|
| +
|
| + List<Client> decodeServiceInterfaceArray(
|
| + int offset,
|
| + int nullability,
|
| + int expectedLength,
|
| + Function clientFactory) =>
|
| + _handleArrayDecodeHelper(
|
| + (d, o, n) => d.decodeServiceInterface(o, n, clientFactory),
|
| + offset, nullability, expectedLength);
|
| +
|
| static String _stringOfUtf8(Uint8List bytes) =>
|
| (const Utf8Decoder()).convert(bytes.toList());
|
|
|
|
|