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 define("mojo/public/js/codec", [ | 5 define("mojo/public/js/codec", [ |
6 "mojo/public/js/buffer", | 6 "mojo/public/js/buffer", |
7 "mojo/public/js/interface_types", | 7 "mojo/public/js/interface_types", |
| 8 "mojo/public/js/lib/interface_endpoint_handle", |
8 "mojo/public/js/unicode", | 9 "mojo/public/js/unicode", |
9 ], function(buffer, types, unicode) { | 10 ], function(buffer, types, interfaceEndpointHandle, unicode) { |
10 | 11 |
11 var kErrorUnsigned = "Passing negative value to unsigned"; | 12 var kErrorUnsigned = "Passing negative value to unsigned"; |
12 var kErrorArray = "Passing non Array for array type"; | 13 var kErrorArray = "Passing non Array for array type"; |
13 var kErrorString = "Passing non String for string type"; | 14 var kErrorString = "Passing non String for string type"; |
14 var kErrorMap = "Passing non Map for map type"; | 15 var kErrorMap = "Passing non Map for map type"; |
| 16 var InterfaceEndpointHandle = interfaceEndpointHandle.InterfaceEndpointHandle; |
15 | 17 |
16 // Memory ------------------------------------------------------------------- | 18 // Memory ------------------------------------------------------------------- |
17 | 19 |
18 var kAlignment = 8; | 20 var kAlignment = 8; |
19 | 21 |
20 function align(size) { | 22 function align(size) { |
21 return size + (kAlignment - (size % kAlignment)) % kAlignment; | 23 return size + (kAlignment - (size % kAlignment)) % kAlignment; |
22 } | 24 } |
23 | 25 |
24 function isAligned(offset) { | 26 function isAligned(offset) { |
25 return offset >= 0 && (offset % kAlignment) === 0; | 27 return offset >= 0 && (offset % kAlignment) === 0; |
26 } | 28 } |
27 | 29 |
28 // Constants ---------------------------------------------------------------- | 30 // Constants ---------------------------------------------------------------- |
29 | 31 |
30 var kArrayHeaderSize = 8; | 32 var kArrayHeaderSize = 8; |
31 var kStructHeaderSize = 8; | 33 var kStructHeaderSize = 8; |
32 var kMessageHeaderSize = 24; | 34 var kMessageV0HeaderSize = 24; |
33 var kMessageWithRequestIDHeaderSize = 32; | 35 var kMessageV1HeaderSize = 32; |
| 36 var kMessageV2HeaderSize = 48; |
34 var kMapStructPayloadSize = 16; | 37 var kMapStructPayloadSize = 16; |
35 | 38 |
36 var kStructHeaderNumBytesOffset = 0; | 39 var kStructHeaderNumBytesOffset = 0; |
37 var kStructHeaderVersionOffset = 4; | 40 var kStructHeaderVersionOffset = 4; |
38 | 41 |
39 var kEncodedInvalidHandleValue = 0xFFFFFFFF; | 42 var kEncodedInvalidHandleValue = 0xFFFFFFFF; |
40 | 43 |
41 // Decoder ------------------------------------------------------------------ | 44 // Decoder ------------------------------------------------------------------ |
42 | 45 |
43 function Decoder(buffer, handles, base) { | 46 function Decoder(buffer, handles, base) { |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 var encoder = this.createAndEncodeEncoder(encodedSize); | 424 var encoder = this.createAndEncodeEncoder(encodedSize); |
422 encoder.encodeMap(keyClass, valueClass, val); | 425 encoder.encodeMap(keyClass, valueClass, val); |
423 }; | 426 }; |
424 | 427 |
425 // Message ------------------------------------------------------------------ | 428 // Message ------------------------------------------------------------------ |
426 | 429 |
427 var kMessageInterfaceIdOffset = kStructHeaderSize; | 430 var kMessageInterfaceIdOffset = kStructHeaderSize; |
428 var kMessageNameOffset = kMessageInterfaceIdOffset + 4; | 431 var kMessageNameOffset = kMessageInterfaceIdOffset + 4; |
429 var kMessageFlagsOffset = kMessageNameOffset + 4; | 432 var kMessageFlagsOffset = kMessageNameOffset + 4; |
430 var kMessageRequestIDOffset = kMessageFlagsOffset + 8; | 433 var kMessageRequestIDOffset = kMessageFlagsOffset + 8; |
| 434 var kMessagePayloadInterfaceIdsPointerOffset = kMessageV2HeaderSize - 8; |
431 | 435 |
432 var kMessageExpectsResponse = 1 << 0; | 436 var kMessageExpectsResponse = 1 << 0; |
433 var kMessageIsResponse = 1 << 1; | 437 var kMessageIsResponse = 1 << 1; |
434 | 438 |
435 function Message(buffer, handles) { | 439 function Message(buffer, handles) { |
436 this.buffer = buffer; | 440 this.buffer = buffer; |
437 this.handles = handles; | 441 this.handles = handles; |
438 } | 442 } |
439 | 443 |
440 Message.prototype.getHeaderNumBytes = function() { | 444 Message.prototype.getHeaderNumBytes = function() { |
441 return this.buffer.getUint32(kStructHeaderNumBytesOffset); | 445 return this.buffer.getUint32(kStructHeaderNumBytesOffset); |
442 }; | 446 }; |
443 | 447 |
444 Message.prototype.getHeaderVersion = function() { | 448 Message.prototype.getHeaderVersion = function() { |
445 return this.buffer.getUint32(kStructHeaderVersionOffset); | 449 return this.buffer.getUint32(kStructHeaderVersionOffset); |
446 }; | 450 }; |
447 | 451 |
448 Message.prototype.getName = function() { | 452 Message.prototype.getName = function() { |
449 return this.buffer.getUint32(kMessageNameOffset); | 453 return this.buffer.getUint32(kMessageNameOffset); |
450 }; | 454 }; |
451 | 455 |
452 Message.prototype.getFlags = function() { | 456 Message.prototype.getFlags = function() { |
453 return this.buffer.getUint32(kMessageFlagsOffset); | 457 return this.buffer.getUint32(kMessageFlagsOffset); |
454 }; | 458 }; |
455 | 459 |
456 Message.prototype.getInterfaceId = function() { | 460 Message.prototype.getInterfaceId = function() { |
457 return this.buffer.getUint32(kMessageInterfaceIdOffset); | 461 return this.buffer.getUint32(kMessageInterfaceIdOffset); |
458 }; | 462 }; |
459 | 463 |
| 464 Message.prototype.getPayloadInterfaceIds = function() { |
| 465 if (this.getHeaderVersion() < 2) { |
| 466 return null; |
| 467 } |
| 468 |
| 469 var decoder = new Decoder(this.buffer, this.handles, |
| 470 kMessagePayloadInterfaceIdsPointerOffset); |
| 471 var payloadInterfaceIds = decoder.decodeArrayPointer(Uint32); |
| 472 return payloadInterfaceIds; |
| 473 }; |
| 474 |
460 Message.prototype.isResponse = function() { | 475 Message.prototype.isResponse = function() { |
461 return (this.getFlags() & kMessageIsResponse) != 0; | 476 return (this.getFlags() & kMessageIsResponse) != 0; |
462 }; | 477 }; |
463 | 478 |
464 Message.prototype.expectsResponse = function() { | 479 Message.prototype.expectsResponse = function() { |
465 return (this.getFlags() & kMessageExpectsResponse) != 0; | 480 return (this.getFlags() & kMessageExpectsResponse) != 0; |
466 }; | 481 }; |
467 | 482 |
468 Message.prototype.setRequestID = function(requestID) { | 483 Message.prototype.setRequestID = function(requestID) { |
469 // TODO(darin): Verify that space was reserved for this field! | 484 // TODO(darin): Verify that space was reserved for this field! |
470 this.buffer.setUint64(kMessageRequestIDOffset, requestID); | 485 this.buffer.setUint64(kMessageRequestIDOffset, requestID); |
471 }; | 486 }; |
472 | 487 |
473 Message.prototype.setInterfaceId = function(interfaceId) { | 488 Message.prototype.setInterfaceId = function(interfaceId) { |
474 this.buffer.setUint32(kMessageInterfaceIdOffset, interfaceId); | 489 this.buffer.setUint32(kMessageInterfaceIdOffset, interfaceId); |
475 }; | 490 }; |
476 | 491 |
477 | 492 |
478 // MessageBuilder ----------------------------------------------------------- | 493 // MessageBuilder ----------------------------------------------------------- |
479 | 494 |
480 function MessageBuilder(messageName, payloadSize) { | 495 function MessageBuilder(messageName, payloadSize) { |
481 // Currently, we don't compute the payload size correctly ahead of time. | 496 // Currently, we don't compute the payload size correctly ahead of time. |
482 // Instead, we resize the buffer at the end. | 497 // Instead, we resize the buffer at the end. |
483 var numberOfBytes = kMessageHeaderSize + payloadSize; | 498 var numberOfBytes = kMessageV0HeaderSize + payloadSize; |
484 this.buffer = new buffer.Buffer(numberOfBytes); | 499 this.buffer = new buffer.Buffer(numberOfBytes); |
485 this.handles = []; | 500 this.handles = []; |
486 var encoder = this.createEncoder(kMessageHeaderSize); | 501 var encoder = this.createEncoder(kMessageV0HeaderSize); |
487 encoder.writeUint32(kMessageHeaderSize); | 502 encoder.writeUint32(kMessageV0HeaderSize); |
488 encoder.writeUint32(0); // version. | 503 encoder.writeUint32(0); // version. |
489 encoder.writeUint32(0); // interface ID. | 504 encoder.writeUint32(0); // interface ID. |
490 encoder.writeUint32(messageName); | 505 encoder.writeUint32(messageName); |
491 encoder.writeUint32(0); // flags. | 506 encoder.writeUint32(0); // flags. |
492 encoder.writeUint32(0); // padding. | 507 encoder.writeUint32(0); // padding. |
493 } | 508 } |
494 | 509 |
495 MessageBuilder.prototype.createEncoder = function(size) { | 510 MessageBuilder.prototype.createEncoder = function(size) { |
496 var pointer = this.buffer.alloc(size); | 511 var pointer = this.buffer.alloc(size); |
497 return new Encoder(this.buffer, this.handles, pointer); | 512 return new Encoder(this.buffer, this.handles, pointer); |
(...skipping 13 matching lines...) Expand all Loading... |
511 this.encoder = null; | 526 this.encoder = null; |
512 return message; | 527 return message; |
513 }; | 528 }; |
514 | 529 |
515 // MessageWithRequestIDBuilder ----------------------------------------------- | 530 // MessageWithRequestIDBuilder ----------------------------------------------- |
516 | 531 |
517 function MessageWithRequestIDBuilder(messageName, payloadSize, flags, | 532 function MessageWithRequestIDBuilder(messageName, payloadSize, flags, |
518 requestID) { | 533 requestID) { |
519 // Currently, we don't compute the payload size correctly ahead of time. | 534 // Currently, we don't compute the payload size correctly ahead of time. |
520 // Instead, we resize the buffer at the end. | 535 // Instead, we resize the buffer at the end. |
521 var numberOfBytes = kMessageWithRequestIDHeaderSize + payloadSize; | 536 var numberOfBytes = kMessageV1HeaderSize + payloadSize; |
522 this.buffer = new buffer.Buffer(numberOfBytes); | 537 this.buffer = new buffer.Buffer(numberOfBytes); |
523 this.handles = []; | 538 this.handles = []; |
524 var encoder = this.createEncoder(kMessageWithRequestIDHeaderSize); | 539 var encoder = this.createEncoder(kMessageV1HeaderSize); |
525 encoder.writeUint32(kMessageWithRequestIDHeaderSize); | 540 encoder.writeUint32(kMessageV1HeaderSize); |
526 encoder.writeUint32(1); // version. | 541 encoder.writeUint32(1); // version. |
527 encoder.writeUint32(0); // interface ID. | 542 encoder.writeUint32(0); // interface ID. |
528 encoder.writeUint32(messageName); | 543 encoder.writeUint32(messageName); |
529 encoder.writeUint32(flags); | 544 encoder.writeUint32(flags); |
530 encoder.writeUint32(0); // padding. | 545 encoder.writeUint32(0); // padding. |
531 encoder.writeUint64(requestID); | 546 encoder.writeUint64(requestID); |
532 } | 547 } |
533 | 548 |
534 MessageWithRequestIDBuilder.prototype = | 549 MessageWithRequestIDBuilder.prototype = |
535 Object.create(MessageBuilder.prototype); | 550 Object.create(MessageBuilder.prototype); |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
831 encoder.encodeHandle(interfacePtrInfo.handle); | 846 encoder.encodeHandle(interfacePtrInfo.handle); |
832 encoder.writeUint32(interfacePtrInfo.version); | 847 encoder.writeUint32(interfacePtrInfo.version); |
833 }; | 848 }; |
834 | 849 |
835 function NullableInterface(cls) { | 850 function NullableInterface(cls) { |
836 Interface.call(this, cls); | 851 Interface.call(this, cls); |
837 } | 852 } |
838 | 853 |
839 NullableInterface.prototype = Object.create(Interface.prototype); | 854 NullableInterface.prototype = Object.create(Interface.prototype); |
840 | 855 |
| 856 function AssociatedInterfacePtrInfo() { |
| 857 } |
| 858 |
| 859 AssociatedInterfacePtrInfo.prototype.encodedSize = 8; |
| 860 |
| 861 function NullableAssociatedInterfacePtrInfo() { |
| 862 } |
| 863 |
| 864 NullableAssociatedInterfacePtrInfo.encodedSize = |
| 865 AssociatedInterfacePtrInfo.encodedSize; |
| 866 |
841 function InterfaceRequest() { | 867 function InterfaceRequest() { |
842 } | 868 } |
843 | 869 |
844 InterfaceRequest.encodedSize = 4; | 870 InterfaceRequest.encodedSize = 4; |
845 | 871 |
846 InterfaceRequest.decode = function(decoder) { | 872 InterfaceRequest.decode = function(decoder) { |
847 return new types.InterfaceRequest(decoder.decodeHandle()); | 873 return new types.InterfaceRequest(decoder.decodeHandle()); |
848 }; | 874 }; |
849 | 875 |
850 InterfaceRequest.encode = function(encoder, val) { | 876 InterfaceRequest.encode = function(encoder, val) { |
851 encoder.encodeHandle(val ? val.handle : null); | 877 encoder.encodeHandle(val ? val.handle : null); |
852 }; | 878 }; |
853 | 879 |
854 function NullableInterfaceRequest() { | 880 function NullableInterfaceRequest() { |
855 } | 881 } |
856 | 882 |
857 NullableInterfaceRequest.encodedSize = InterfaceRequest.encodedSize; | 883 NullableInterfaceRequest.encodedSize = InterfaceRequest.encodedSize; |
858 | 884 |
859 NullableInterfaceRequest.decode = InterfaceRequest.decode; | 885 NullableInterfaceRequest.decode = InterfaceRequest.decode; |
860 | 886 |
861 NullableInterfaceRequest.encode = InterfaceRequest.encode; | 887 NullableInterfaceRequest.encode = InterfaceRequest.encode; |
862 | 888 |
| 889 function AssociatedInterfaceRequest() { |
| 890 } |
| 891 |
| 892 AssociatedInterfaceRequest.encodedSize = 4; |
| 893 |
| 894 function NullableAssociatedInterfaceRequest() { |
| 895 } |
| 896 |
| 897 NullableAssociatedInterfaceRequest.encodedSize = |
| 898 AssociatedInterfaceRequest.encodedSize; |
| 899 |
863 function MapOf(keyClass, valueClass) { | 900 function MapOf(keyClass, valueClass) { |
864 this.keyClass = keyClass; | 901 this.keyClass = keyClass; |
865 this.valueClass = valueClass; | 902 this.valueClass = valueClass; |
866 } | 903 } |
867 | 904 |
868 MapOf.prototype.encodedSize = 8; | 905 MapOf.prototype.encodedSize = 8; |
869 | 906 |
870 MapOf.prototype.decode = function(decoder) { | 907 MapOf.prototype.decode = function(decoder) { |
871 return decoder.decodeMapPointer(this.keyClass, this.valueClass); | 908 return decoder.decodeMapPointer(this.keyClass, this.valueClass); |
872 }; | 909 }; |
(...skipping 12 matching lines...) Expand all Loading... |
885 exports.align = align; | 922 exports.align = align; |
886 exports.isAligned = isAligned; | 923 exports.isAligned = isAligned; |
887 exports.Message = Message; | 924 exports.Message = Message; |
888 exports.MessageBuilder = MessageBuilder; | 925 exports.MessageBuilder = MessageBuilder; |
889 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; | 926 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; |
890 exports.MessageReader = MessageReader; | 927 exports.MessageReader = MessageReader; |
891 exports.kArrayHeaderSize = kArrayHeaderSize; | 928 exports.kArrayHeaderSize = kArrayHeaderSize; |
892 exports.kMapStructPayloadSize = kMapStructPayloadSize; | 929 exports.kMapStructPayloadSize = kMapStructPayloadSize; |
893 exports.kStructHeaderSize = kStructHeaderSize; | 930 exports.kStructHeaderSize = kStructHeaderSize; |
894 exports.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue; | 931 exports.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue; |
895 exports.kMessageHeaderSize = kMessageHeaderSize; | 932 exports.kMessageV0HeaderSize = kMessageV0HeaderSize; |
896 exports.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize; | 933 exports.kMessageV1HeaderSize = kMessageV1HeaderSize; |
| 934 exports.kMessageV2HeaderSize = kMessageV2HeaderSize; |
| 935 exports.kMessagePayloadInterfaceIdsPointerOffset = |
| 936 kMessagePayloadInterfaceIdsPointerOffset; |
897 exports.kMessageExpectsResponse = kMessageExpectsResponse; | 937 exports.kMessageExpectsResponse = kMessageExpectsResponse; |
898 exports.kMessageIsResponse = kMessageIsResponse; | 938 exports.kMessageIsResponse = kMessageIsResponse; |
899 exports.Int8 = Int8; | 939 exports.Int8 = Int8; |
900 exports.Uint8 = Uint8; | 940 exports.Uint8 = Uint8; |
901 exports.Int16 = Int16; | 941 exports.Int16 = Int16; |
902 exports.Uint16 = Uint16; | 942 exports.Uint16 = Uint16; |
903 exports.Int32 = Int32; | 943 exports.Int32 = Int32; |
904 exports.Uint32 = Uint32; | 944 exports.Uint32 = Uint32; |
905 exports.Int64 = Int64; | 945 exports.Int64 = Int64; |
906 exports.Uint64 = Uint64; | 946 exports.Uint64 = Uint64; |
907 exports.Float = Float; | 947 exports.Float = Float; |
908 exports.Double = Double; | 948 exports.Double = Double; |
909 exports.String = String; | 949 exports.String = String; |
910 exports.Enum = Enum; | 950 exports.Enum = Enum; |
911 exports.NullableString = NullableString; | 951 exports.NullableString = NullableString; |
912 exports.PointerTo = PointerTo; | 952 exports.PointerTo = PointerTo; |
913 exports.NullablePointerTo = NullablePointerTo; | 953 exports.NullablePointerTo = NullablePointerTo; |
914 exports.ArrayOf = ArrayOf; | 954 exports.ArrayOf = ArrayOf; |
915 exports.NullableArrayOf = NullableArrayOf; | 955 exports.NullableArrayOf = NullableArrayOf; |
916 exports.PackedBool = PackedBool; | 956 exports.PackedBool = PackedBool; |
917 exports.Handle = Handle; | 957 exports.Handle = Handle; |
918 exports.NullableHandle = NullableHandle; | 958 exports.NullableHandle = NullableHandle; |
919 exports.Interface = Interface; | 959 exports.Interface = Interface; |
920 exports.NullableInterface = NullableInterface; | 960 exports.NullableInterface = NullableInterface; |
921 exports.InterfaceRequest = InterfaceRequest; | 961 exports.InterfaceRequest = InterfaceRequest; |
922 exports.NullableInterfaceRequest = NullableInterfaceRequest; | 962 exports.NullableInterfaceRequest = NullableInterfaceRequest; |
| 963 exports.AssociatedInterfacePtrInfo = AssociatedInterfacePtrInfo; |
| 964 exports.NullableAssociatedInterfacePtrInfo = |
| 965 NullableAssociatedInterfacePtrInfo; |
| 966 exports.AssociatedInterfaceRequest = AssociatedInterfaceRequest; |
| 967 exports.NullableAssociatedInterfaceRequest = |
| 968 NullableAssociatedInterfaceRequest; |
923 exports.MapOf = MapOf; | 969 exports.MapOf = MapOf; |
924 exports.NullableMapOf = NullableMapOf; | 970 exports.NullableMapOf = NullableMapOf; |
925 return exports; | 971 return exports; |
926 }); | 972 }); |
OLD | NEW |