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

Side by Side Diff: mojo/public/dart/src/codec.dart

Issue 851173002: Dart: Encode/Decode handle and interface types. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Fix Interface encode parameters Created 5 years, 11 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 unified diff | Download patch
« no previous file with comments | « mojo/public/dart/src/client.dart ('k') | mojo/public/dart/src/data_pipe.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « mojo/public/dart/src/client.dart ('k') | mojo/public/dart/src/data_pipe.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698