OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 part of bindings; | 5 part of bindings; |
6 | 6 |
7 int align(int size) => size + (kAlignment - (size % kAlignment)) % kAlignment; | 7 int align(int size) => size + (kAlignment - (size % kAlignment)) % kAlignment; |
8 | 8 |
9 const int kAlignment = 8; | 9 const int kAlignment = 8; |
10 const int kSerializedHandleSize = 4; | 10 const int kSerializedHandleSize = 4; |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 | 131 |
132 void encodeHandle(core.MojoHandle value, int offset, bool nullable) { | 132 void encodeHandle(core.MojoHandle value, int offset, bool nullable) { |
133 if ((value == null) || !value.isValid) { | 133 if ((value == null) || !value.isValid) { |
134 encodeInvalideHandle(offset, nullable); | 134 encodeInvalideHandle(offset, nullable); |
135 } else { | 135 } else { |
136 encodeUint32(_buffer.handles.length, offset); | 136 encodeUint32(_buffer.handles.length, offset); |
137 _buffer.handles.add(value); | 137 _buffer.handles.add(value); |
138 } | 138 } |
139 } | 139 } |
140 | 140 |
| 141 void encodeMessagePipeHandle( |
| 142 core.MojoMessagePipeEndpoint value, int offset, bool nullable) => |
| 143 encodeHandle(value != null ? value.handle : null, offset, nullable); |
| 144 |
| 145 void encodeConsumerHandle( |
| 146 core.MojoDataPipeConsumer value, int offset, bool nullable) => |
| 147 encodeHandle(value != null ? value.handle : null, offset, nullable); |
| 148 |
| 149 void encodeProducerHandle( |
| 150 core.MojoDataPipeProducer value, int offset, bool nullable) => |
| 151 encodeHandle(value != null ? value.handle : null, offset, nullable); |
| 152 |
| 153 void encodeSharedBufferHandle( |
| 154 core.MojoSharedBuffer value, int offset, bool nullable) => |
| 155 encodeHandle(value != null ? value.handle : null, offset, nullable); |
| 156 |
| 157 void encodeInterface(Interface interface, int offset, bool nullable) { |
| 158 if (interface == null) { |
| 159 encodeInvalideHandle(offset, nullable); |
| 160 return; |
| 161 } |
| 162 var pipe = new core.MojoMessagePipe(); |
| 163 interface.bind(pipe.endpoints[0]); |
| 164 encodeMessagePipeHandle(pipe.endpoints[1], offset, nullable); |
| 165 } |
| 166 |
| 167 void encodeInterfaceRequest(Client client, int offset, bool nullable) { |
| 168 if (client == null) { |
| 169 encodeInvalideHandle(offset, nullable); |
| 170 return; |
| 171 } |
| 172 var pipe = new core.MojoMessagePipe(); |
| 173 client.bind(pipe.endpoints[0]); |
| 174 encodeMessagePipeHandle(pipe.endpoints[1], offset, nullable); |
| 175 } |
| 176 |
141 void encodeNullPointer(int offset, bool nullable) { | 177 void encodeNullPointer(int offset, bool nullable) { |
142 if (!nullable) { | 178 if (!nullable) { |
143 throw 'Trying to encode a null pointer for a non-nullable type'; | 179 throw 'Trying to encode a null pointer for a non-nullable type'; |
144 } | 180 } |
145 _buffer.buffer.setUint64(_base + offset, 0, Endianness.LITTLE_ENDIAN); | 181 _buffer.buffer.setUint64(_base + offset, 0, Endianness.LITTLE_ENDIAN); |
146 } | 182 } |
147 | 183 |
148 void encodeInvalideHandle(int offset, bool nullable) { | 184 void encodeInvalideHandle(int offset, bool nullable) { |
149 if (!nullable) { | 185 if (!nullable) { |
150 throw 'Trying to encode a null pointer for a non-nullable type'; | 186 throw 'Trying to encode a null pointer for a non-nullable type'; |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 void encodeFloatArray( | 300 void encodeFloatArray( |
265 List<int> value, int offset, int nullability, int expectedLength) => | 301 List<int> value, int offset, int nullability, int expectedLength) => |
266 encodeArray((e, v) => e.appendFloatArray(v), | 302 encodeArray((e, v) => e.appendFloatArray(v), |
267 4, value, offset, nullability, expectedLength); | 303 4, value, offset, nullability, expectedLength); |
268 | 304 |
269 void encodeDoubleArray( | 305 void encodeDoubleArray( |
270 List<int> value, int offset, int nullability, int expectedLength) => | 306 List<int> value, int offset, int nullability, int expectedLength) => |
271 encodeArray((e, v) => e.appendDoubleArray(v), | 307 encodeArray((e, v) => e.appendDoubleArray(v), |
272 8, value, offset, nullability, expectedLength); | 308 8, value, offset, nullability, expectedLength); |
273 | 309 |
274 void encodeHandleArray(List<core.MojoHandle> value, | 310 void _handleArrayEncodeHelper(Function elementEncoder, |
275 int offset, | 311 List value, |
276 int nullability, | 312 int offset, |
277 int expectedLength) { | 313 int nullability, |
| 314 int expectedLength) { |
278 if (value == null) { | 315 if (value == null) { |
279 encodeNullPointer(offset, isArrayNullable(nullability)); | 316 encodeNullPointer(offset, isArrayNullable(nullability)); |
280 return; | 317 return; |
281 } | 318 } |
282 var encoder = encoderForArray( | 319 var encoder = encoderForArray( |
283 kSerializedHandleSize, value.length, offset, expectedLength); | 320 kSerializedHandleSize, value.length, offset, expectedLength); |
284 for (int i = 0; i < value.length; ++i) { | 321 for (int i = 0; i < value.length; ++i) { |
285 int handleOffset = DataHeader.kHeaderSize + kSerializedHandleSize * i; | 322 int handleOffset = DataHeader.kHeaderSize + kSerializedHandleSize * i; |
286 encoder.encodeHandle( | 323 elementEncoder( |
287 value[i], handleOffset, isElementNullable(nullability)); | 324 encoder, value[i], handleOffset, isElementNullable(nullability)); |
288 } | 325 } |
289 } | 326 } |
290 | 327 |
| 328 void encodeHandleArray( |
| 329 List<core.MojoHandle> value, |
| 330 int offset, |
| 331 int nullability, |
| 332 int expectedLength) => |
| 333 _handleArrayEncodeHelper( |
| 334 (e, v, o, n) => e.encodeHandle(v, o, n), |
| 335 value, offset, nullability, expectedLength); |
| 336 |
| 337 void encodeMessagePipeHandleArray( |
| 338 List<core.MojoMessagePipeEndpoint> value, |
| 339 int offset, |
| 340 int nullability, |
| 341 int expectedLength) => |
| 342 _handleArrayEncodeHelper( |
| 343 (e, v, o, n) => e.encodeMessagePipeHandle(v, o, n), |
| 344 value, offset, nullability, expectedLength); |
| 345 |
| 346 void encodeConsumerHandleArray( |
| 347 List<core.MojoDataPipeConsumer> value, |
| 348 int offset, |
| 349 int nullability, |
| 350 int expectedLength) => |
| 351 _handleArrayEncodeHelper( |
| 352 (e, v, o, n) => e.encodeConsumerHandle(v, o, n), |
| 353 value, offset, nullability, expectedLength); |
| 354 |
| 355 void encodeProducerHandleArray( |
| 356 List<core.MojoDataPipeProducer> value, |
| 357 int offset, |
| 358 int nullability, |
| 359 int expectedLength) => |
| 360 _handleArrayEncodeHelper( |
| 361 (e, v, o, n) => e.encodeProducerHandle(v, o, n), |
| 362 value, offset, nullability, expectedLength); |
| 363 |
| 364 void encodeSharedBufferHandleArray( |
| 365 List<core.MojoSharedBuffer> value, |
| 366 int offset, |
| 367 int nullability, |
| 368 int expectedLength) => |
| 369 _handleArrayEncodeHelper( |
| 370 (e, v, o, n) => e.encodeSharedBufferHandle(v, o, n), |
| 371 value, offset, nullability, expectedLength); |
| 372 |
| 373 void encodeInterfaceRequestArray( |
| 374 List<Client> value, |
| 375 int offset, |
| 376 int nullability, |
| 377 int expectedLength) => |
| 378 _handleArrayEncodeHelper( |
| 379 (e, v, o, n) => e.encodeInterfaceRequest(v, o, n), |
| 380 value, offset, nullability, expectedLength); |
| 381 |
| 382 void encodeInterfaceArray( |
| 383 List<Interface> value, |
| 384 int offset, |
| 385 int nullability, |
| 386 int expectedLength) => |
| 387 _handleArrayEncodeHelper( |
| 388 (e, v, o, n) => e.encodeInterface(v, o, n), |
| 389 value, offset, nullability, expectedLength); |
| 390 |
291 static Uint8List _utf8OfString(String s) => | 391 static Uint8List _utf8OfString(String s) => |
292 (new Uint8List.fromList((const Utf8Encoder()).convert(s))); | 392 (new Uint8List.fromList((const Utf8Encoder()).convert(s))); |
293 | 393 |
294 void encodeString(String value, int offset, bool nullable) { | 394 void encodeString(String value, int offset, bool nullable) { |
295 if (value == null) { | 395 if (value == null) { |
296 encodeNullPointer(offset, nullable); | 396 encodeNullPointer(offset, nullable); |
297 return; | 397 return; |
298 } | 398 } |
299 int nullability = nullable ? kArrayNullable : kNothingNullable; | 399 int nullability = nullable ? kArrayNullable : kNothingNullable; |
300 encodeUint8Array(_utf8OfString(value), | 400 encodeUint8Array(_utf8OfString(value), |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 | 439 |
340 void appendDoubleArray(List<int> value) => | 440 void appendDoubleArray(List<int> value) => |
341 appendBytes(new Uint8List.view(new Float64List.fromList(value))); | 441 appendBytes(new Uint8List.view(new Float64List.fromList(value))); |
342 | 442 |
343 Encoder encoderForMap(int offset) { | 443 Encoder encoderForMap(int offset) { |
344 encodePointerToNextUnclaimed(offset); | 444 encodePointerToNextUnclaimed(offset); |
345 return getEncoderAtOffset(kMapStructHeader); | 445 return getEncoderAtOffset(kMapStructHeader); |
346 } | 446 } |
347 } | 447 } |
348 | 448 |
| 449 |
349 class Decoder { | 450 class Decoder { |
350 Message _message; | 451 Message _message; |
351 int _base = 0; | 452 int _base = 0; |
352 | 453 |
353 Decoder(this._message, [this._base = 0]); | 454 Decoder(this._message, [this._base = 0]); |
354 | 455 |
355 Decoder getDecoderAtPosition(int offset) => new Decoder(_message, offset); | 456 Decoder getDecoderAtPosition(int offset) => new Decoder(_message, offset); |
356 | 457 |
357 factory Decoder.atOffset(Decoder d, int offset) => | 458 factory Decoder.atOffset(Decoder d, int offset) => |
358 new Decoder(d._message, offset); | 459 new Decoder(d._message, offset); |
(...skipping 27 matching lines...) Expand all Loading... |
386 int index = decodeInt32(offset); | 487 int index = decodeInt32(offset); |
387 if (index == -1) { | 488 if (index == -1) { |
388 if (!nullable) { | 489 if (!nullable) { |
389 throw 'Trying to decode an invalid handle from a non-nullable type.'; | 490 throw 'Trying to decode an invalid handle from a non-nullable type.'; |
390 } | 491 } |
391 return new core.MojoHandle(core.MojoHandle.INVALID); | 492 return new core.MojoHandle(core.MojoHandle.INVALID); |
392 } | 493 } |
393 return _handles[index]; | 494 return _handles[index]; |
394 } | 495 } |
395 | 496 |
| 497 core.MojoMessagePipeEndpoint decodeMessagePipeHandle( |
| 498 int offset, bool nullable) => |
| 499 new core.MojoMessagePipeEndpoint(decodeHandle(offset, nullable)); |
| 500 |
| 501 core.MojoDataPipeConsumer decodeConsumerHandle(int offset, bool nullable) => |
| 502 new core.MojoDataPipeConsumer(decodeHandle(offset, nullable)); |
| 503 |
| 504 core.MojoDataPipeProducer decodeProducerHandle(int offset, bool nullable) => |
| 505 new core.MojoDataPipeProducer(decodeHandle(offset, nullable)); |
| 506 |
| 507 core.MojoSharedBuffer decodeSharedBufferHandle(int offset, bool nullable) => |
| 508 new core.MojoSharedBuffer(decodeHandle(offset, nullable)); |
| 509 |
| 510 Client decodeServiceInterface( |
| 511 int offset, bool nullable, Function clientFactory) { |
| 512 var endpoint = decodeMessagePipeHandle(offset, nullable); |
| 513 return endpoint.handle.isValid ? clientFactory(endpoint) : null; |
| 514 } |
| 515 |
| 516 Interface decodeInterfaceRequest( |
| 517 int offset, bool nullable, Function interfaceFactory) { |
| 518 var endpoint = decodeMessagePipeHandle(offset, nullable); |
| 519 return endpoint.handle.isValid ? interfaceFactory(endpoint) : null; |
| 520 } |
| 521 |
396 Decoder decodePointer(int offset, bool nullable) { | 522 Decoder decodePointer(int offset, bool nullable) { |
397 int basePosition = _base + offset; | 523 int basePosition = _base + offset; |
398 int pointerOffset = decodeUint64(offset); | 524 int pointerOffset = decodeUint64(offset); |
399 if (pointerOffset == 0) { | 525 if (pointerOffset == 0) { |
400 if (!nullable) { | 526 if (!nullable) { |
401 throw 'Trying to decode a null pointer for a non-nullable type'; | 527 throw 'Trying to decode a null pointer for a non-nullable type'; |
402 } | 528 } |
403 return null; | 529 return null; |
404 } | 530 } |
405 int newPosition = (basePosition + pointerOffset); | 531 int newPosition = (basePosition + pointerOffset); |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 List<double> decodeFloatArray( | 647 List<double> decodeFloatArray( |
522 int offset, int nullability, int expectedLength) => | 648 int offset, int nullability, int expectedLength) => |
523 decodeArray((b, s, l) => new Float32List.view(b, s, l), | 649 decodeArray((b, s, l) => new Float32List.view(b, s, l), |
524 4, offset, nullability, expectedLength); | 650 4, offset, nullability, expectedLength); |
525 | 651 |
526 List<double> decodeDoubleArray( | 652 List<double> decodeDoubleArray( |
527 int offset, int nullability, int expectedLength) => | 653 int offset, int nullability, int expectedLength) => |
528 decodeArray((b, s, l) => new Float64List.view(b, s, l), | 654 decodeArray((b, s, l) => new Float64List.view(b, s, l), |
529 8, offset, nullability, expectedLength); | 655 8, offset, nullability, expectedLength); |
530 | 656 |
531 List<core.MojoHandle> decodeHandleArray( | 657 List _handleArrayDecodeHelper(Function elementDecoder, |
532 int offset, int nullability, int expectedLength) { | 658 int offset, |
| 659 int nullability, |
| 660 int expectedLength) { |
533 Decoder d = decodePointer(offset, isArrayNullable(nullability)); | 661 Decoder d = decodePointer(offset, isArrayNullable(nullability)); |
534 if (d == null) { | 662 if (d == null) { |
535 return null; | 663 return null; |
536 } | 664 } |
537 var header = d.decodeDataHeaderForArray(4, expectedLength); | 665 var header = d.decodeDataHeaderForArray(4, expectedLength); |
538 var result = new core.MojoHandle(header.numFields); | 666 var result = new List(header.numFields); |
539 for (int i = 0; i < result.length; ++i) { | 667 for (int i = 0; i < result.length; ++i) { |
540 result[i] = d.decodeHandle( | 668 result[i] = elementDecoder( |
| 669 d, |
541 DataHeader.kHeaderSize + kSerializedHandleSize * i, | 670 DataHeader.kHeaderSize + kSerializedHandleSize * i, |
542 isElementNullable(nullability)); | 671 isElementNullable(nullability)); |
543 } | 672 } |
544 return result; | 673 return result; |
| 674 |
545 } | 675 } |
546 | 676 |
| 677 List<core.MojoHandle> decodeHandleArray( |
| 678 int offset, int nullability, int expectedLength) => |
| 679 _handleArrayDecodeHelper((d, o, n) => d.decodeHandle(o, n), |
| 680 offset, nullability, expectedLength); |
| 681 |
| 682 List<core.MojoDataPipeConsumer> decodeConsumerHandleArray( |
| 683 int offset, int nullability, int expectedLength) => |
| 684 _handleArrayDecodeHelper((d, o, n) => d.decodeConsumerHandle(o, n), |
| 685 offset, nullability, expectedLength); |
| 686 |
| 687 List<core.MojoDataPipeProducer> decodeProducerHandleArray( |
| 688 int offset, int nullability, int expectedLength) => |
| 689 _handleArrayDecodeHelper((d, o, n) => d.decodeProducerHandle(o, n), |
| 690 offset, nullability, expectedLength); |
| 691 |
| 692 List<core.MojoMessagePipeEndpoint> decodeMessagePipeHandleArray( |
| 693 int offset, int nullability, int expectedLength) => |
| 694 _handleArrayDecodeHelper((d, o, n) => d.decodeMessagePipeHandle(o, n), |
| 695 offset, nullability, expectedLength); |
| 696 |
| 697 List<core.MojoSharedBuffer> decodeSharedBufferHandleArray( |
| 698 int offset, int nullability, int expectedLength) => |
| 699 _handleArrayDecodeHelper((d, o, n) => d.decodeSharedBufferHandle(o, n), |
| 700 offset, nullability, expectedLength); |
| 701 |
| 702 List<Interface> decodeInterfaceRequestArray( |
| 703 int offset, |
| 704 int nullability, |
| 705 int expectedLength, |
| 706 Function interfaceFactory) => |
| 707 _handleArrayDecodeHelper( |
| 708 (d, o, n) => d.decodeInterfaceRequest(o, n, interfaceFactory), |
| 709 offset, nullability, expectedLength); |
| 710 |
| 711 List<Client> decodeServiceInterfaceArray( |
| 712 int offset, |
| 713 int nullability, |
| 714 int expectedLength, |
| 715 Function clientFactory) => |
| 716 _handleArrayDecodeHelper( |
| 717 (d, o, n) => d.decodeServiceInterface(o, n, clientFactory), |
| 718 offset, nullability, expectedLength); |
| 719 |
547 static String _stringOfUtf8(Uint8List bytes) => | 720 static String _stringOfUtf8(Uint8List bytes) => |
548 (const Utf8Decoder()).convert(bytes.toList()); | 721 (const Utf8Decoder()).convert(bytes.toList()); |
549 | 722 |
550 String decodeString(int offset, bool nullable) { | 723 String decodeString(int offset, bool nullable) { |
551 int nullability = nullable ? kArrayNullable : 0; | 724 int nullability = nullable ? kArrayNullable : 0; |
552 var bytes = decodeUint8Array(offset, nullability, kUnspecifiedArrayLength); | 725 var bytes = decodeUint8Array(offset, nullability, kUnspecifiedArrayLength); |
553 if (bytes == null) { | 726 if (bytes == null) { |
554 return null; | 727 return null; |
555 } | 728 } |
556 return _stringOfUtf8(bytes); | 729 return _stringOfUtf8(bytes); |
557 } | 730 } |
558 } | 731 } |
OLD | NEW |