Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(334)

Unified Diff: mojo/public/dart/src/codec.dart

Issue 1132063007: Rationalize Dart mojo and sky package structure (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/public/dart/src/buffer.dart ('k') | mojo/public/dart/src/control_message.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/public/dart/src/codec.dart
diff --git a/mojo/public/dart/src/codec.dart b/mojo/public/dart/src/codec.dart
deleted file mode 100644
index 07bad358bbff0ad229c4f4a464f3b970cbd5dafd..0000000000000000000000000000000000000000
--- a/mojo/public/dart/src/codec.dart
+++ /dev/null
@@ -1,850 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-part of bindings;
-
-int align(int size) => size + (kAlignment - (size % kAlignment)) % kAlignment;
-
-const int kAlignment = 8;
-const int kSerializedHandleSize = 4;
-const int kSerializedInterfaceSize = 8; // 4-byte handle + 4-byte version
-const int kPointerSize = 8;
-const StructDataHeader kMapStructHeader = const StructDataHeader(24, 0);
-const int kUnspecifiedArrayLength = -1;
-const int kNothingNullable = 0;
-const int kArrayNullable = (1 << 0);
-const int kElementNullable = (1 << 1);
-
-bool isArrayNullable(int nullability) => (nullability & kArrayNullable) > 0;
-bool isElementNullable(int nullability) => (nullability & kElementNullable) > 0;
-
-class StructDataHeader {
- static const int kHeaderSize = 8;
- static const int kSizeOffset = 0;
- static const int kVersionOffset = 4;
- final int size;
- final int version;
-
- const StructDataHeader(this.size, this.version);
-
- String toString() => "StructDataHeader($size, $version)";
-}
-
-class ArrayDataHeader {
- static const int kHeaderSize = 8;
- static const int kSizeOffset = 0;
- static const int kNumElementsOffset = 4;
- final int size;
- final int numElements;
-
- const ArrayDataHeader(this.size, this.numElements);
-
- String toString() => "ArrayDataHeader($size, $numElements)";
-}
-
-class MojoCodecError {
- final String message;
- MojoCodecError(this.message);
- String toString() => message;
-}
-
-class _EncoderBuffer {
- ByteData buffer;
- List<core.MojoHandle> handles;
- int extent;
-
- static const int kInitialBufferSize = 1024;
-
- _EncoderBuffer([int size = -1])
- : buffer = new ByteData(size > 0 ? size : kInitialBufferSize),
- handles = [],
- extent = 0;
-
- void _grow(int newSize) {
- Uint8List newBuffer = new Uint8List(newSize);
- newBuffer.setRange(0, buffer.lengthInBytes, buffer.buffer.asUint8List());
- buffer = newBuffer.buffer.asByteData();
- }
-
- void claimMemory(int claimSize) {
- extent += claimSize;
- if (extent > buffer.lengthInBytes) {
- int newSize = buffer.lengthInBytes + claimSize;
- newSize += newSize ~/ 2;
- _grow(newSize);
- }
- }
-
- ByteData get trimmed => new ByteData.view(buffer.buffer, 0, extent);
-}
-
-class Encoder {
- _EncoderBuffer _buffer;
- int _base;
-
- Encoder([int size = -1])
- : _buffer = new _EncoderBuffer(size),
- _base = 0;
-
- Encoder._fromBuffer(_EncoderBuffer buffer)
- : _buffer = buffer,
- _base = buffer.extent;
-
- Encoder getStructEncoderAtOffset(StructDataHeader dataHeader) {
- var result = new Encoder._fromBuffer(_buffer);
- result.encodeStructDataHeader(dataHeader);
- return result;
- }
-
- Encoder getArrayEncoderAtOffset(ArrayDataHeader dataHeader) {
- var result = new Encoder._fromBuffer(_buffer);
- result.encodeArrayDataHeader(dataHeader);
- return result;
- }
-
- Message get message => new Message(_buffer.trimmed, _buffer.handles);
-
- void encodeStructDataHeader(StructDataHeader dataHeader) {
- _buffer.claimMemory(align(dataHeader.size));
- encodeUint32(dataHeader.size, StructDataHeader.kSizeOffset);
- encodeUint32(dataHeader.version, StructDataHeader.kVersionOffset);
- }
-
- void encodeArrayDataHeader(ArrayDataHeader dataHeader) {
- _buffer.claimMemory(align(dataHeader.size));
- encodeUint32(dataHeader.size, ArrayDataHeader.kSizeOffset);
- encodeUint32(dataHeader.numElements, ArrayDataHeader.kNumElementsOffset);
- }
-
- static const String kErrorUnsigned =
- 'Passing negative value to unsigned encoder';
-
- void encodeBool(bool value, int offset, int bit) {
- if (value) {
- int encodedValue = _buffer.buffer.getUint8(_base + offset);
- encodedValue |= (1 << bit);
- _buffer.buffer.setUint8(_base + offset, encodedValue);
- }
- }
-
- void encodeInt8(int value, int offset) =>
- _buffer.buffer.setInt8(_base + offset, value);
-
- void encodeUint8(int value, int offset) {
- if (value < 0) {
- throw new MojoCodecError('$kErrorUnsigned: $value');
- }
- _buffer.buffer.setUint8(_base + offset, value);
- }
-
- void encodeInt16(int value, int offset) =>
- _buffer.buffer.setInt16(_base + offset, value, Endianness.LITTLE_ENDIAN);
-
- void encodeUint16(int value, int offset) {
- if (value < 0) {
- throw new MojoCodecError('$kErrorUnsigned: $value');
- }
- _buffer.buffer.setUint16(_base + offset, value, Endianness.LITTLE_ENDIAN);
- }
-
- void encodeInt32(int value, int offset) =>
- _buffer.buffer.setInt32(_base + offset, value, Endianness.LITTLE_ENDIAN);
-
- void encodeUint32(int value, int offset) {
- if (value < 0) {
- throw new MojoCodecError('$kErrorUnsigned: $value');
- }
- _buffer.buffer.setUint32(_base + offset, value, Endianness.LITTLE_ENDIAN);
- }
-
- void encodeInt64(int value, int offset) =>
- _buffer.buffer.setInt64(_base + offset, value, Endianness.LITTLE_ENDIAN);
-
- void encodeUint64(int value, int offset) {
- if (value < 0) {
- throw new MojoCodecError('$kErrorUnsigned: $value');
- }
- _buffer.buffer.setUint64(_base + offset, value, Endianness.LITTLE_ENDIAN);
- }
-
- void encodeFloat(double value, int offset) => _buffer.buffer.setFloat32(
- _base + offset, value, Endianness.LITTLE_ENDIAN);
-
- void encodeDouble(double value, int offset) => _buffer.buffer.setFloat64(
- _base + offset, value, Endianness.LITTLE_ENDIAN);
-
- void encodeHandle(core.MojoHandle value, int offset, bool nullable) {
- if ((value == null) || !value.isValid) {
- encodeInvalideHandle(offset, nullable);
- } else {
- encodeUint32(_buffer.handles.length, offset);
- _buffer.handles.add(value.pass());
- }
- }
-
- 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(
- core.MojoEventStreamListener interface, int offset, bool nullable) {
- if (interface == null) {
- encodeInvalideHandle(offset, nullable);
- // Set the version field to 0.
- encodeUint32(0, offset + kSerializedHandleSize);
- return;
- }
- if (interface is Stub) {
- assert(!interface.isBound);
- var pipe = new core.MojoMessagePipe();
- interface.bind(pipe.endpoints[0]);
- interface.listen();
- encodeMessagePipeHandle(pipe.endpoints[1], offset, nullable);
- // Set the version to the version in the stub.
- encodeUint32(interface.version, offset + kSerializedHandleSize);
- } else if (interface is Proxy) {
- assert(interface.isBound);
- if (!interface.isOpen) {
- // Make sure that we are listening so that state for the proxy is
- // cleaned up when the message is sent and the handle is closed.
- interface.listen();
- }
- encodeMessagePipeHandle(interface.endpoint, offset, nullable);
- // Set the version to the current version of the proxy.
- encodeUint32(interface.version, offset + kSerializedHandleSize);
- } else {
- throw new MojoCodecError(
- 'Trying to encode an unknown MojoEventStreamListener');
- }
- }
-
- void encodeInterfaceRequest(ProxyBase client, int offset, bool nullable) {
- if (client == null) {
- encodeInvalideHandle(offset, nullable);
- return;
- }
- var pipe = new core.MojoMessagePipe();
- client.impl.bind(pipe.endpoints[0]);
- client.impl.listen();
- encodeMessagePipeHandle(pipe.endpoints[1], offset, nullable);
- }
-
- void encodeNullPointer(int offset, bool nullable) {
- if (!nullable) {
- throw new MojoCodecError(
- 'Trying to encode a null pointer for a non-nullable type');
- }
- _buffer.buffer.setUint64(_base + offset, 0, Endianness.LITTLE_ENDIAN);
- }
-
- void encodeInvalideHandle(int offset, bool nullable) {
- if (!nullable) {
- throw new MojoCodecError(
- 'Trying to encode a null pointer for a non-nullable type');
- }
- _buffer.buffer.setInt32(_base + offset, -1, Endianness.LITTLE_ENDIAN);
- }
-
- void encodePointerToNextUnclaimed(int offset) =>
- encodeUint64(_buffer.extent - (_base + offset), offset);
-
- void encodeStruct(Struct value, int offset, bool nullable) {
- if (value == null) {
- encodeNullPointer(offset, nullable);
- return;
- }
- encodePointerToNextUnclaimed(offset);
- value.encode(this);
- }
-
- Encoder encodePointerArray(int length, int offset, int expectedLength) =>
- encoderForArray(kPointerSize, length, offset, expectedLength);
-
- Encoder encoderForArray(
- int elementSize, int length, int offset, int expectedLength) {
- if ((expectedLength != kUnspecifiedArrayLength) &&
- (expectedLength != length)) {
- throw new MojoCodecError(
- 'Trying to encode a fixed array of incorrect length');
- }
- return encoderForArrayByTotalSize(length * elementSize, length, offset);
- }
-
- Encoder encoderForArrayByTotalSize(int size, int length, int offset) {
- encodePointerToNextUnclaimed(offset);
- return getArrayEncoderAtOffset(
- new ArrayDataHeader(ArrayDataHeader.kHeaderSize + size, length));
- }
-
- void encodeBoolArray(
- List<bool> value, int offset, int nullability, int expectedLength) {
- if (value == null) {
- encodeNullPointer(offset, isArrayNullable(nullability));
- return;
- }
- if ((expectedLength != kUnspecifiedArrayLength) &&
- (expectedLength != value.length)) {
- throw new MojoCodecError(
- 'Trying to encode a fixed array of incorrect size.');
- }
- var bytes = new Uint8List((value.length + 7) ~/ kAlignment);
- for (int i = 0; i < bytes.length; ++i) {
- for (int j = 0; j < kAlignment; ++j) {
- int boolIndex = kAlignment * i + j;
- if ((boolIndex < value.length) && value[boolIndex]) {
- bytes[i] |= (1 << j);
- }
- }
- }
- var encoder =
- encoderForArrayByTotalSize(bytes.length, value.length, offset);
- encoder.appendUint8Array(bytes);
- }
-
- void encodeArray(Function arrayAppend, int elementBytes, List<int> value,
- int offset, int nullability, int expectedLength) {
- if (value == null) {
- encodeNullPointer(offset, isArrayNullable(nullability));
- return;
- }
- var encoder =
- encoderForArray(elementBytes, value.length, offset, expectedLength);
- arrayAppend(encoder, value);
- }
-
- void encodeInt8Array(
- List<int> value, int offset, int nullability, int expectedLength) =>
- encodeArray((e, v) => e.appendInt8Array(v), 1, value, offset, nullability,
- expectedLength);
-
- void encodeUint8Array(
- List<int> value, int offset, int nullability, int expectedLength) =>
- encodeArray((e, v) => e.appendUint8Array(v), 1, value, offset,
- nullability, expectedLength);
-
- void encodeInt16Array(
- List<int> value, int offset, int nullability, int expectedLength) =>
- encodeArray((e, v) => e.appendInt16Array(v), 2, value, offset,
- nullability, expectedLength);
-
- void encodeUint16Array(
- List<int> value, int offset, int nullability, int expectedLength) =>
- encodeArray((e, v) => e.appendUint16Array(v), 2, value, offset,
- nullability, expectedLength);
-
- void encodeInt32Array(
- List<int> value, int offset, int nullability, int expectedLength) =>
- encodeArray((e, v) => e.appendInt32Array(v), 4, value, offset,
- nullability, expectedLength);
-
- void encodeUint32Array(
- List<int> value, int offset, int nullability, int expectedLength) =>
- encodeArray((e, v) => e.appendUint32Array(v), 4, value, offset,
- nullability, expectedLength);
-
- void encodeInt64Array(
- List<int> value, int offset, int nullability, int expectedLength) =>
- encodeArray((e, v) => e.appendInt64Array(v), 8, value, offset,
- nullability, expectedLength);
-
- void encodeUint64Array(
- List<int> value, int offset, int nullability, int expectedLength) =>
- encodeArray((e, v) => e.appendUint64Array(v), 8, value, offset,
- nullability, expectedLength);
-
- void encodeFloatArray(
- List<int> value, int offset, int nullability, int expectedLength) =>
- encodeArray((e, v) => e.appendFloatArray(v), 4, value, offset,
- nullability, expectedLength);
-
- void encodeDoubleArray(
- List<int> value, int offset, int nullability, int expectedLength) =>
- encodeArray((e, v) => e.appendDoubleArray(v), 8, value, offset,
- nullability, expectedLength);
-
- void _handleArrayEncodeHelper(Function elementEncoder, List value, int offset,
- int elementSize, int nullability, int expectedLength) {
- if (value == null) {
- encodeNullPointer(offset, isArrayNullable(nullability));
- return;
- }
- var encoder =
- encoderForArray(elementSize, value.length, offset, expectedLength);
- for (int i = 0; i < value.length; ++i) {
- int elementOffset = ArrayDataHeader.kHeaderSize + elementSize * i;
- elementEncoder(
- encoder, value[i], elementOffset, 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,
- kSerializedHandleSize, 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,
- kSerializedHandleSize, 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, kSerializedHandleSize, 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, kSerializedHandleSize, 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,
- kSerializedHandleSize, nullability, expectedLength);
-
- void encodeInterfaceRequestArray(
- List<Proxy> value, int offset, int nullability, int expectedLength) =>
- _handleArrayEncodeHelper(
- (e, v, o, n) => e.encodeInterfaceRequest(v, o, n), value, offset,
- kSerializedHandleSize, nullability, expectedLength);
-
- void encodeInterfaceArray(
- List<Stub> value, int offset, int nullability, int expectedLength) =>
- _handleArrayEncodeHelper((e, v, o, n) => e.encodeInterface(v, o, n),
- value, offset, kSerializedInterfaceSize, nullability, expectedLength);
-
- static Uint8List _utf8OfString(String s) =>
- (new Uint8List.fromList((const Utf8Encoder()).convert(s)));
-
- void encodeString(String value, int offset, bool nullable) {
- if (value == null) {
- encodeNullPointer(offset, nullable);
- return;
- }
- int nullability = nullable ? kArrayNullable : kNothingNullable;
- encodeUint8Array(
- _utf8OfString(value), offset, nullability, kUnspecifiedArrayLength);
- }
-
- void appendBytes(Uint8List value) {
- _buffer.buffer.buffer
- .asUint8List()
- .setRange(_base + ArrayDataHeader.kHeaderSize,
- _base + ArrayDataHeader.kHeaderSize + value.lengthInBytes, value);
- }
-
- void appendInt8Array(List<int> value) =>
- appendBytes(new Uint8List.view(new Int8List.fromList(value).buffer));
-
- void appendUint8Array(List<int> value) =>
- appendBytes(new Uint8List.fromList(value));
-
- void appendInt16Array(List<int> value) =>
- appendBytes(new Uint8List.view(new Int16List.fromList(value).buffer));
-
- void appendUint16Array(List<int> value) =>
- appendBytes(new Uint8List.view(new Uint16List.fromList(value).buffer));
-
- void appendInt32Array(List<int> value) =>
- appendBytes(new Uint8List.view(new Int32List.fromList(value).buffer));
-
- void appendUint32Array(List<int> value) =>
- appendBytes(new Uint8List.view(new Uint32List.fromList(value).buffer));
-
- void appendInt64Array(List<int> value) =>
- appendBytes(new Uint8List.view(new Int64List.fromList(value).buffer));
-
- void appendUint64Array(List<int> value) =>
- appendBytes(new Uint8List.view(new Uint64List.fromList(value).buffer));
-
- void appendFloatArray(List<double> value) =>
- appendBytes(new Uint8List.view(new Float32List.fromList(value).buffer));
-
- void appendDoubleArray(List<double> value) =>
- appendBytes(new Uint8List.view(new Float64List.fromList(value).buffer));
-
- Encoder encoderForMap(int offset) {
- encodePointerToNextUnclaimed(offset);
- return getStructEncoderAtOffset(kMapStructHeader);
- }
-}
-
-class _Validator {
- final int _maxMemory;
- final int _numberOfHandles;
- int _minNextClaimedHandle = 0;
- int _minNextMemory = 0;
- List<int> _skippedIndices = [];
-
- _Validator(this._maxMemory, this._numberOfHandles);
-
- void claimHandle(int handle) {
- if (handle < _minNextClaimedHandle) {
- throw new MojoCodecError('Trying to access handle out of order.');
- }
- if (handle >= _numberOfHandles) {
- throw new MojoCodecError('Trying to access non present handle.');
- }
- for (int i = _minNextClaimedHandle; i < handle; i++) {
- _skippedIndices.add(i);
- }
- _minNextClaimedHandle = handle + 1;
- }
-
- void claimMemory(int start, int end) {
- if ((start % kAlignment) != 0) {
- throw new MojoCodecError('Incorrect starting alignment: $start.');
- }
- if (start < _minNextMemory) {
- throw new MojoCodecError('Trying to access memory out of order.');
- }
- if (end < start) {
- throw new MojoCodecError('Incorrect memory range.');
- }
- if (end > _maxMemory) {
- throw new MojoCodecError('Trying to access out of range memory.');
- }
- _minNextMemory = align(end);
- }
-}
-
-class Decoder {
- _Validator _validator;
- Message _message;
- int _base = 0;
-
- Decoder(this._message, [this._base = 0, this._validator = null]) {
- if (_validator == null) {
- _validator = new _Validator(
- _message.buffer.lengthInBytes, _message.handles.length);
- }
- }
-
- Decoder getDecoderAtPosition(int offset) =>
- new Decoder(_message, offset, _validator);
-
- factory Decoder.atOffset(Decoder d, int offset, _Validator validator) =>
- new Decoder(d._message, offset, validator);
-
- ByteData get _buffer => _message.buffer;
- List<core.MojoHandle> get _handles => _message.handles;
- List<core.MojoHandle> get excessHandles => new List.from(_message.handles
- .getRange(_validator._minNextClaimedHandle, _message.handles.length))
- ..addAll(_validator._skippedIndices.map((i) => _message.handles[i]));
-
- int decodeInt8(int offset) => _buffer.getInt8(_base + offset);
- int decodeUint8(int offset) => _buffer.getUint8(_base + offset);
- int decodeInt16(int offset) =>
- _buffer.getInt16(_base + offset, Endianness.LITTLE_ENDIAN);
- int decodeUint16(int offset) =>
- _buffer.getUint16(_base + offset, Endianness.LITTLE_ENDIAN);
- int decodeInt32(int offset) =>
- _buffer.getInt32(_base + offset, Endianness.LITTLE_ENDIAN);
- int decodeUint32(int offset) =>
- _buffer.getUint32(_base + offset, Endianness.LITTLE_ENDIAN);
- int decodeInt64(int offset) =>
- _buffer.getInt64(_base + offset, Endianness.LITTLE_ENDIAN);
- int decodeUint64(int offset) =>
- _buffer.getUint64(_base + offset, Endianness.LITTLE_ENDIAN);
- double decodeFloat(int offset) =>
- _buffer.getFloat32(_base + offset, Endianness.LITTLE_ENDIAN);
- double decodeDouble(int offset) =>
- _buffer.getFloat64(_base + offset, Endianness.LITTLE_ENDIAN);
-
- bool decodeBool(int offset, int bit) =>
- (decodeUint8(offset) & (1 << bit)) != 0;
-
- core.MojoHandle decodeHandle(int offset, bool nullable) {
- int index = decodeInt32(offset);
- if (index == -1) {
- if (!nullable) {
- throw new MojoCodecError(
- 'Trying to decode an invalid handle from a non-nullable type.');
- }
- return new core.MojoHandle.invalid();
- }
- _validator.claimHandle(index);
- 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));
-
- ProxyBase decodeServiceInterface(
- int offset, bool nullable, Function clientFactory) {
- var endpoint = decodeMessagePipeHandle(offset, nullable);
- var version = decodeUint32(offset + kSerializedHandleSize);
- if (!endpoint.handle.isValid) {
- return null;
- }
- ProxyBase client = clientFactory(endpoint);
- client.impl._version = version;
- return client;
- }
-
- Stub 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);
- if (pointerOffset == 0) {
- if (!nullable) {
- throw new MojoCodecError(
- 'Trying to decode a null pointer for a non-nullable type');
- }
- return null;
- }
- int newPosition = (basePosition + pointerOffset);
- return new Decoder.atOffset(this, newPosition, _validator);
- }
-
- StructDataHeader decodeStructDataHeader() {
- _validator.claimMemory(_base, _base + StructDataHeader.kHeaderSize);
- int size = decodeUint32(StructDataHeader.kSizeOffset);
- int version = decodeUint32(StructDataHeader.kVersionOffset);
- if (size < 0) {
- throw new MojoCodecError('Negative size.');
- }
- if (version < 0) {
- throw new MojoCodecError('Negative version number.');
- }
- _validator.claimMemory(_base + StructDataHeader.kHeaderSize, _base + size);
- return new StructDataHeader(size, version);
- }
-
- ArrayDataHeader decodeArrayDataHeader() {
- _validator.claimMemory(_base, _base + ArrayDataHeader.kHeaderSize);
- int size = decodeUint32(ArrayDataHeader.kSizeOffset);
- int numElements = decodeUint32(ArrayDataHeader.kNumElementsOffset);
- if (size < 0) {
- throw new MojoCodecError('Negative size.');
- }
- if (numElements < 0) {
- throw new MojoCodecError('Negative number of elements.');
- }
- _validator.claimMemory(_base + ArrayDataHeader.kHeaderSize, _base + size);
- return new ArrayDataHeader(size, numElements);
- }
-
- // Decode arrays.
- ArrayDataHeader decodeDataHeaderForBoolArray(int expectedLength) {
- var header = decodeArrayDataHeader();
- var arrayByteCount =
- ArrayDataHeader.kHeaderSize + (header.numElements + 7) ~/ 8;
- if (header.size < arrayByteCount) {
- throw new MojoCodecError('Array header is incorrect');
- }
- if ((expectedLength != kUnspecifiedArrayLength) &&
- (header.numElements != expectedLength)) {
- throw new MojoCodecError(
- 'Incorrect array length. Expected $expectedLength, but got '
- '${header.numElements}.');
- }
- return header;
- }
-
- List<bool> decodeBoolArray(int offset, int nullability, int expectedLength) {
- Decoder d = decodePointer(offset, isArrayNullable(nullability));
- if (d == null) {
- return null;
- }
- var header = d.decodeDataHeaderForBoolArray(expectedLength);
- var bytes = new Uint8List.view(d._buffer.buffer,
- d._buffer.offsetInBytes + d._base + ArrayDataHeader.kHeaderSize,
- (header.numElements + 7) ~/ kAlignment);
- var result = new List<bool>(header.numElements);
- for (int i = 0; i < bytes.lengthInBytes; ++i) {
- for (int j = 0; j < kAlignment; ++j) {
- int boolIndex = i * kAlignment + j;
- if (boolIndex < result.length) {
- result[boolIndex] = (bytes[i] & (1 << j)) != 0;
- }
- }
- }
- return result;
- }
-
- ArrayDataHeader decodeDataHeaderForArray(
- int elementSize, int expectedLength) {
- var header = decodeArrayDataHeader();
- var arrayByteCount =
- ArrayDataHeader.kHeaderSize + header.numElements * elementSize;
- if (header.size < arrayByteCount) {
- throw new MojoCodecError(
- 'Array header is incorrect: $header, elementSize = $elementSize');
- }
- if ((expectedLength != kUnspecifiedArrayLength) &&
- (header.numElements != expectedLength)) {
- throw new MojoCodecError(
- 'Incorrect array length. Expected $expectedLength, but got '
- '${header.numElements}');
- }
- return header;
- }
-
- ArrayDataHeader decodeDataHeaderForPointerArray(int expectedLength) =>
- decodeDataHeaderForArray(kPointerSize, expectedLength);
-
- List decodeArray(Function arrayViewer, int elementSize, int offset,
- int nullability, int expectedLength) {
- Decoder d = decodePointer(offset, isArrayNullable(nullability));
- if (d == null) {
- return null;
- }
- var header = d.decodeDataHeaderForArray(elementSize, expectedLength);
- return arrayViewer(d._buffer.buffer,
- d._buffer.offsetInBytes + d._base + ArrayDataHeader.kHeaderSize,
- header.numElements);
- }
-
- List<int> decodeInt8Array(int offset, int nullability, int expectedLength) =>
- decodeArray((b, s, l) => new Int8List.view(b, s, l), 1, offset,
- nullability, expectedLength);
-
- List<int> decodeUint8Array(int offset, int nullability, int expectedLength) =>
- decodeArray((b, s, l) => new Uint8List.view(b, s, l), 1, offset,
- nullability, expectedLength);
-
- List<int> decodeInt16Array(int offset, int nullability, int expectedLength) =>
- decodeArray((b, s, l) => new Int16List.view(b, s, l), 2, offset,
- nullability, expectedLength);
-
- List<int> decodeUint16Array(
- int offset, int nullability, int expectedLength) => decodeArray(
- (b, s, l) => new Uint16List.view(b, s, l), 2, offset, nullability,
- expectedLength);
-
- List<int> decodeInt32Array(int offset, int nullability, int expectedLength) =>
- decodeArray((b, s, l) => new Int32List.view(b, s, l), 4, offset,
- nullability, expectedLength);
-
- List<int> decodeUint32Array(
- int offset, int nullability, int expectedLength) => decodeArray(
- (b, s, l) => new Uint32List.view(b, s, l), 4, offset, nullability,
- expectedLength);
-
- List<int> decodeInt64Array(int offset, int nullability, int expectedLength) =>
- decodeArray((b, s, l) => new Int64List.view(b, s, l), 8, offset,
- nullability, expectedLength);
-
- List<int> decodeUint64Array(
- int offset, int nullability, int expectedLength) => decodeArray(
- (b, s, l) => new Uint64List.view(b, s, l), 8, offset, nullability,
- expectedLength);
-
- List<double> decodeFloatArray(
- int offset, int nullability, int expectedLength) => decodeArray(
- (b, s, l) => new Float32List.view(b, s, l), 4, offset, nullability,
- expectedLength);
-
- List<double> decodeDoubleArray(
- int offset, int nullability, int expectedLength) => decodeArray(
- (b, s, l) => new Float64List.view(b, s, l), 8, offset, nullability,
- expectedLength);
-
- List _handleArrayDecodeHelper(Function elementDecoder, int offset,
- int elementSize, int nullability, int expectedLength) {
- Decoder d = decodePointer(offset, isArrayNullable(nullability));
- if (d == null) {
- return null;
- }
- var header = d.decodeDataHeaderForArray(elementSize, expectedLength);
- var result = new List(header.numElements);
- for (int i = 0; i < result.length; ++i) {
- result[i] = elementDecoder(d,
- ArrayDataHeader.kHeaderSize + elementSize * i,
- isElementNullable(nullability));
- }
- return result;
- }
-
- List<core.MojoHandle> decodeHandleArray(
- int offset, int nullability, int expectedLength) =>
- _handleArrayDecodeHelper((d, o, n) => d.decodeHandle(o, n), offset,
- kSerializedHandleSize, nullability, expectedLength);
-
- List<core.MojoDataPipeConsumer> decodeConsumerHandleArray(
- int offset, int nullability, int expectedLength) =>
- _handleArrayDecodeHelper((d, o, n) => d.decodeConsumerHandle(o, n),
- offset, kSerializedHandleSize, nullability, expectedLength);
-
- List<core.MojoDataPipeProducer> decodeProducerHandleArray(
- int offset, int nullability, int expectedLength) =>
- _handleArrayDecodeHelper((d, o, n) => d.decodeProducerHandle(o, n),
- offset, kSerializedHandleSize, nullability, expectedLength);
-
- List<core.MojoMessagePipeEndpoint> decodeMessagePipeHandleArray(
- int offset, int nullability, int expectedLength) =>
- _handleArrayDecodeHelper((d, o, n) => d.decodeMessagePipeHandle(o, n),
- offset, kSerializedHandleSize, nullability, expectedLength);
-
- List<core.MojoSharedBuffer> decodeSharedBufferHandleArray(
- int offset, int nullability, int expectedLength) =>
- _handleArrayDecodeHelper((d, o, n) => d.decodeSharedBufferHandle(o, n),
- offset, kSerializedHandleSize, nullability, expectedLength);
-
- List<Stub> decodeInterfaceRequestArray(int offset, int nullability,
- int expectedLength, Function interfaceFactory) =>
- _handleArrayDecodeHelper(
- (d, o, n) => d.decodeInterfaceRequest(o, n, interfaceFactory), offset,
- kSerializedHandleSize, nullability, expectedLength);
-
- List<Proxy> decodeServiceInterfaceArray(int offset, int nullability,
- int expectedLength, Function clientFactory) => _handleArrayDecodeHelper(
- (d, o, n) => d.decodeServiceInterface(o, n, clientFactory), offset,
- kSerializedInterfaceSize, nullability, expectedLength);
-
- static String _stringOfUtf8(Uint8List bytes) =>
- (const Utf8Decoder()).convert(bytes.toList());
-
- String decodeString(int offset, bool nullable) {
- int nullability = nullable ? kArrayNullable : 0;
- var bytes = decodeUint8Array(offset, nullability, kUnspecifiedArrayLength);
- if (bytes == null) {
- return null;
- }
- return _stringOfUtf8(bytes);
- }
-
- StructDataHeader decodeDataHeaderForMap() {
- var header = decodeStructDataHeader();
- if (header.size != kMapStructHeader.size) {
- throw new MojoCodecError(
- 'Incorrect header for map. The size is incorrect.');
- }
- if (header.version != kMapStructHeader.version) {
- throw new MojoCodecError(
- 'Incorrect header for map. The version is incorrect.');
- }
- return header;
- }
-}
« no previous file with comments | « mojo/public/dart/src/buffer.dart ('k') | mojo/public/dart/src/control_message.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698