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 (function() { |
6 "mojo/public/js/buffer", | 6 var internal = mojoBindings.internal; |
7 "mojo/public/js/interface_types", | |
8 "mojo/public/js/unicode", | |
9 ], function(buffer, types, unicode) { | |
10 | 7 |
11 var kErrorUnsigned = "Passing negative value to unsigned"; | 8 var kErrorUnsigned = "Passing negative value to unsigned"; |
12 var kErrorArray = "Passing non Array for array type"; | 9 var kErrorArray = "Passing non Array for array type"; |
13 var kErrorString = "Passing non String for string type"; | 10 var kErrorString = "Passing non String for string type"; |
14 var kErrorMap = "Passing non Map for map type"; | 11 var kErrorMap = "Passing non Map for map type"; |
15 | 12 |
16 // Memory ------------------------------------------------------------------- | 13 // Memory ------------------------------------------------------------------- |
17 | 14 |
18 var kAlignment = 8; | 15 var kAlignment = 8; |
19 | 16 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 | 128 |
132 Decoder.prototype.decodeHandle = function() { | 129 Decoder.prototype.decodeHandle = function() { |
133 return this.handles[this.readUint32()] || null; | 130 return this.handles[this.readUint32()] || null; |
134 }; | 131 }; |
135 | 132 |
136 Decoder.prototype.decodeString = function() { | 133 Decoder.prototype.decodeString = function() { |
137 var numberOfBytes = this.readUint32(); | 134 var numberOfBytes = this.readUint32(); |
138 var numberOfElements = this.readUint32(); | 135 var numberOfElements = this.readUint32(); |
139 var base = this.next; | 136 var base = this.next; |
140 this.next += numberOfElements; | 137 this.next += numberOfElements; |
141 return unicode.decodeUtf8String( | 138 return internal.decodeUtf8String( |
142 new Uint8Array(this.buffer.arrayBuffer, base, numberOfElements)); | 139 new Uint8Array(this.buffer.arrayBuffer, base, numberOfElements)); |
143 }; | 140 }; |
144 | 141 |
145 Decoder.prototype.decodeArray = function(cls) { | 142 Decoder.prototype.decodeArray = function(cls) { |
146 var numberOfBytes = this.readUint32(); | 143 var numberOfBytes = this.readUint32(); |
147 var numberOfElements = this.readUint32(); | 144 var numberOfElements = this.readUint32(); |
148 var val = new Array(numberOfElements); | 145 var val = new Array(numberOfElements); |
149 if (cls === PackedBool) { | 146 if (cls === PackedBool) { |
150 var byte; | 147 var byte; |
151 for (var i = 0; i < numberOfElements; ++i) { | 148 for (var i = 0; i < numberOfElements; ++i) { |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
307 if (handle) { | 304 if (handle) { |
308 this.handles.push(handle); | 305 this.handles.push(handle); |
309 this.writeUint32(this.handles.length - 1); | 306 this.writeUint32(this.handles.length - 1); |
310 } else { | 307 } else { |
311 this.writeUint32(kEncodedInvalidHandleValue); | 308 this.writeUint32(kEncodedInvalidHandleValue); |
312 } | 309 } |
313 }; | 310 }; |
314 | 311 |
315 Encoder.prototype.encodeString = function(val) { | 312 Encoder.prototype.encodeString = function(val) { |
316 var base = this.next + kArrayHeaderSize; | 313 var base = this.next + kArrayHeaderSize; |
317 var numberOfElements = unicode.encodeUtf8String( | 314 var numberOfElements = internal.encodeUtf8String( |
318 val, new Uint8Array(this.buffer.arrayBuffer, base)); | 315 val, new Uint8Array(this.buffer.arrayBuffer, base)); |
319 var numberOfBytes = kArrayHeaderSize + numberOfElements; | 316 var numberOfBytes = kArrayHeaderSize + numberOfElements; |
320 this.writeUint32(numberOfBytes); | 317 this.writeUint32(numberOfBytes); |
321 this.writeUint32(numberOfElements); | 318 this.writeUint32(numberOfElements); |
322 this.next += numberOfElements; | 319 this.next += numberOfElements; |
323 }; | 320 }; |
324 | 321 |
325 Encoder.prototype.encodeArray = | 322 Encoder.prototype.encodeArray = |
326 function(cls, val, numberOfElements, encodedSize) { | 323 function(cls, val, numberOfElements, encodedSize) { |
327 if (numberOfElements === undefined) | 324 if (numberOfElements === undefined) |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
382 Encoder.prototype.encodeStringPointer = function(val) { | 379 Encoder.prototype.encodeStringPointer = function(val) { |
383 if (val == null) { | 380 if (val == null) { |
384 // Also handles undefined, since undefined == null. | 381 // Also handles undefined, since undefined == null. |
385 this.encodePointer(val); | 382 this.encodePointer(val); |
386 return; | 383 return; |
387 } | 384 } |
388 // Only accepts string primivites, not String Objects like new String("foo") | 385 // Only accepts string primivites, not String Objects like new String("foo") |
389 if (typeof(val) !== "string") { | 386 if (typeof(val) !== "string") { |
390 throw new Error(kErrorString); | 387 throw new Error(kErrorString); |
391 } | 388 } |
392 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); | 389 var encodedSize = kArrayHeaderSize + internal.utf8Length(val); |
393 var encoder = this.createAndEncodeEncoder(encodedSize); | 390 var encoder = this.createAndEncodeEncoder(encodedSize); |
394 encoder.encodeString(val); | 391 encoder.encodeString(val); |
395 }; | 392 }; |
396 | 393 |
397 Encoder.prototype.encodeMap = function(keyClass, valueClass, val) { | 394 Encoder.prototype.encodeMap = function(keyClass, valueClass, val) { |
398 var keys = new Array(val.size); | 395 var keys = new Array(val.size); |
399 var values = new Array(val.size); | 396 var values = new Array(val.size); |
400 var i = 0; | 397 var i = 0; |
401 val.forEach(function(value, key) { | 398 val.forEach(function(value, key) { |
402 values[i] = value; | 399 values[i] = value; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
466 this.buffer.setUint64(kMessageRequestIDOffset, requestID); | 463 this.buffer.setUint64(kMessageRequestIDOffset, requestID); |
467 }; | 464 }; |
468 | 465 |
469 | 466 |
470 // MessageBuilder ----------------------------------------------------------- | 467 // MessageBuilder ----------------------------------------------------------- |
471 | 468 |
472 function MessageBuilder(messageName, payloadSize) { | 469 function MessageBuilder(messageName, payloadSize) { |
473 // Currently, we don't compute the payload size correctly ahead of time. | 470 // Currently, we don't compute the payload size correctly ahead of time. |
474 // Instead, we resize the buffer at the end. | 471 // Instead, we resize the buffer at the end. |
475 var numberOfBytes = kMessageHeaderSize + payloadSize; | 472 var numberOfBytes = kMessageHeaderSize + payloadSize; |
476 this.buffer = new buffer.Buffer(numberOfBytes); | 473 this.buffer = new internal.Buffer(numberOfBytes); |
477 this.handles = []; | 474 this.handles = []; |
478 var encoder = this.createEncoder(kMessageHeaderSize); | 475 var encoder = this.createEncoder(kMessageHeaderSize); |
479 encoder.writeUint32(kMessageHeaderSize); | 476 encoder.writeUint32(kMessageHeaderSize); |
480 encoder.writeUint32(0); // version. | 477 encoder.writeUint32(0); // version. |
481 encoder.writeUint32(0); // interface ID. | 478 encoder.writeUint32(0); // interface ID. |
482 encoder.writeUint32(messageName); | 479 encoder.writeUint32(messageName); |
483 encoder.writeUint32(0); // flags. | 480 encoder.writeUint32(0); // flags. |
484 encoder.writeUint32(0); // padding. | 481 encoder.writeUint32(0); // padding. |
485 } | 482 } |
486 | 483 |
(...skipping 17 matching lines...) Expand all Loading... |
504 return message; | 501 return message; |
505 }; | 502 }; |
506 | 503 |
507 // MessageWithRequestIDBuilder ----------------------------------------------- | 504 // MessageWithRequestIDBuilder ----------------------------------------------- |
508 | 505 |
509 function MessageWithRequestIDBuilder(messageName, payloadSize, flags, | 506 function MessageWithRequestIDBuilder(messageName, payloadSize, flags, |
510 requestID) { | 507 requestID) { |
511 // Currently, we don't compute the payload size correctly ahead of time. | 508 // Currently, we don't compute the payload size correctly ahead of time. |
512 // Instead, we resize the buffer at the end. | 509 // Instead, we resize the buffer at the end. |
513 var numberOfBytes = kMessageWithRequestIDHeaderSize + payloadSize; | 510 var numberOfBytes = kMessageWithRequestIDHeaderSize + payloadSize; |
514 this.buffer = new buffer.Buffer(numberOfBytes); | 511 this.buffer = new internal.Buffer(numberOfBytes); |
515 this.handles = []; | 512 this.handles = []; |
516 var encoder = this.createEncoder(kMessageWithRequestIDHeaderSize); | 513 var encoder = this.createEncoder(kMessageWithRequestIDHeaderSize); |
517 encoder.writeUint32(kMessageWithRequestIDHeaderSize); | 514 encoder.writeUint32(kMessageWithRequestIDHeaderSize); |
518 encoder.writeUint32(1); // version. | 515 encoder.writeUint32(1); // version. |
519 encoder.writeUint32(0); // interface ID. | 516 encoder.writeUint32(0); // interface ID. |
520 encoder.writeUint32(messageName); | 517 encoder.writeUint32(messageName); |
521 encoder.writeUint32(flags); | 518 encoder.writeUint32(flags); |
522 encoder.writeUint32(0); // padding. | 519 encoder.writeUint32(0); // padding. |
523 encoder.writeUint64(requestID); | 520 encoder.writeUint64(requestID); |
524 } | 521 } |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
807 | 804 |
808 NullableHandle.encode = Handle.encode; | 805 NullableHandle.encode = Handle.encode; |
809 | 806 |
810 function Interface(cls) { | 807 function Interface(cls) { |
811 this.cls = cls; | 808 this.cls = cls; |
812 } | 809 } |
813 | 810 |
814 Interface.prototype.encodedSize = 8; | 811 Interface.prototype.encodedSize = 8; |
815 | 812 |
816 Interface.prototype.decode = function(decoder) { | 813 Interface.prototype.decode = function(decoder) { |
817 var interfacePtrInfo = new types.InterfacePtrInfo( | 814 var interfacePtrInfo = new mojoBindings.InterfacePtrInfo( |
818 decoder.decodeHandle(), decoder.readUint32()); | 815 decoder.decodeHandle(), decoder.readUint32()); |
819 var interfacePtr = new this.cls(); | 816 var interfacePtr = new this.cls(); |
820 interfacePtr.ptr.bind(interfacePtrInfo); | 817 interfacePtr.ptr.bind(interfacePtrInfo); |
821 return interfacePtr; | 818 return interfacePtr; |
822 }; | 819 }; |
823 | 820 |
824 Interface.prototype.encode = function(encoder, val) { | 821 Interface.prototype.encode = function(encoder, val) { |
825 var interfacePtrInfo = | 822 var interfacePtrInfo = |
826 val ? val.ptr.passInterface() : new types.InterfacePtrInfo(null, 0); | 823 val ? val.ptr.passInterface() : |
| 824 new mojoBindings.InterfacePtrInfo(null, 0); |
827 encoder.encodeHandle(interfacePtrInfo.handle); | 825 encoder.encodeHandle(interfacePtrInfo.handle); |
828 encoder.writeUint32(interfacePtrInfo.version); | 826 encoder.writeUint32(interfacePtrInfo.version); |
829 }; | 827 }; |
830 | 828 |
831 function NullableInterface(cls) { | 829 function NullableInterface(cls) { |
832 Interface.call(this, cls); | 830 Interface.call(this, cls); |
833 } | 831 } |
834 | 832 |
835 NullableInterface.prototype = Object.create(Interface.prototype); | 833 NullableInterface.prototype = Object.create(Interface.prototype); |
836 | 834 |
837 function InterfaceRequest() { | 835 function InterfaceRequest() { |
838 } | 836 } |
839 | 837 |
840 InterfaceRequest.encodedSize = 4; | 838 InterfaceRequest.encodedSize = 4; |
841 | 839 |
842 InterfaceRequest.decode = function(decoder) { | 840 InterfaceRequest.decode = function(decoder) { |
843 return new types.InterfaceRequest(decoder.decodeHandle()); | 841 return new mojoBindings.InterfaceRequest(decoder.decodeHandle()); |
844 }; | 842 }; |
845 | 843 |
846 InterfaceRequest.encode = function(encoder, val) { | 844 InterfaceRequest.encode = function(encoder, val) { |
847 encoder.encodeHandle(val ? val.handle : null); | 845 encoder.encodeHandle(val ? val.handle : null); |
848 }; | 846 }; |
849 | 847 |
850 function NullableInterfaceRequest() { | 848 function NullableInterfaceRequest() { |
851 } | 849 } |
852 | 850 |
853 NullableInterfaceRequest.encodedSize = InterfaceRequest.encodedSize; | 851 NullableInterfaceRequest.encodedSize = InterfaceRequest.encodedSize; |
(...skipping 16 matching lines...) Expand all Loading... |
870 MapOf.prototype.encode = function(encoder, val) { | 868 MapOf.prototype.encode = function(encoder, val) { |
871 encoder.encodeMapPointer(this.keyClass, this.valueClass, val); | 869 encoder.encodeMapPointer(this.keyClass, this.valueClass, val); |
872 }; | 870 }; |
873 | 871 |
874 function NullableMapOf(keyClass, valueClass) { | 872 function NullableMapOf(keyClass, valueClass) { |
875 MapOf.call(this, keyClass, valueClass); | 873 MapOf.call(this, keyClass, valueClass); |
876 } | 874 } |
877 | 875 |
878 NullableMapOf.prototype = Object.create(MapOf.prototype); | 876 NullableMapOf.prototype = Object.create(MapOf.prototype); |
879 | 877 |
880 var exports = {}; | 878 internal.align = align; |
881 exports.align = align; | 879 internal.isAligned = isAligned; |
882 exports.isAligned = isAligned; | 880 internal.Message = Message; |
883 exports.Message = Message; | 881 internal.MessageBuilder = MessageBuilder; |
884 exports.MessageBuilder = MessageBuilder; | 882 internal.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; |
885 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; | 883 internal.MessageReader = MessageReader; |
886 exports.MessageReader = MessageReader; | 884 internal.kArrayHeaderSize = kArrayHeaderSize; |
887 exports.kArrayHeaderSize = kArrayHeaderSize; | 885 internal.kMapStructPayloadSize = kMapStructPayloadSize; |
888 exports.kMapStructPayloadSize = kMapStructPayloadSize; | 886 internal.kStructHeaderSize = kStructHeaderSize; |
889 exports.kStructHeaderSize = kStructHeaderSize; | 887 internal.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue; |
890 exports.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue; | 888 internal.kMessageHeaderSize = kMessageHeaderSize; |
891 exports.kMessageHeaderSize = kMessageHeaderSize; | 889 internal.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize; |
892 exports.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize; | 890 internal.kMessageExpectsResponse = kMessageExpectsResponse; |
893 exports.kMessageExpectsResponse = kMessageExpectsResponse; | 891 internal.kMessageIsResponse = kMessageIsResponse; |
894 exports.kMessageIsResponse = kMessageIsResponse; | 892 internal.Int8 = Int8; |
895 exports.Int8 = Int8; | 893 internal.Uint8 = Uint8; |
896 exports.Uint8 = Uint8; | 894 internal.Int16 = Int16; |
897 exports.Int16 = Int16; | 895 internal.Uint16 = Uint16; |
898 exports.Uint16 = Uint16; | 896 internal.Int32 = Int32; |
899 exports.Int32 = Int32; | 897 internal.Uint32 = Uint32; |
900 exports.Uint32 = Uint32; | 898 internal.Int64 = Int64; |
901 exports.Int64 = Int64; | 899 internal.Uint64 = Uint64; |
902 exports.Uint64 = Uint64; | 900 internal.Float = Float; |
903 exports.Float = Float; | 901 internal.Double = Double; |
904 exports.Double = Double; | 902 internal.String = String; |
905 exports.String = String; | 903 internal.Enum = Enum; |
906 exports.Enum = Enum; | 904 internal.NullableString = NullableString; |
907 exports.NullableString = NullableString; | 905 internal.PointerTo = PointerTo; |
908 exports.PointerTo = PointerTo; | 906 internal.NullablePointerTo = NullablePointerTo; |
909 exports.NullablePointerTo = NullablePointerTo; | 907 internal.ArrayOf = ArrayOf; |
910 exports.ArrayOf = ArrayOf; | 908 internal.NullableArrayOf = NullableArrayOf; |
911 exports.NullableArrayOf = NullableArrayOf; | 909 internal.PackedBool = PackedBool; |
912 exports.PackedBool = PackedBool; | 910 internal.Handle = Handle; |
913 exports.Handle = Handle; | 911 internal.NullableHandle = NullableHandle; |
914 exports.NullableHandle = NullableHandle; | 912 internal.Interface = Interface; |
915 exports.Interface = Interface; | 913 internal.NullableInterface = NullableInterface; |
916 exports.NullableInterface = NullableInterface; | 914 internal.InterfaceRequest = InterfaceRequest; |
917 exports.InterfaceRequest = InterfaceRequest; | 915 internal.NullableInterfaceRequest = NullableInterfaceRequest; |
918 exports.NullableInterfaceRequest = NullableInterfaceRequest; | 916 internal.MapOf = MapOf; |
919 exports.MapOf = MapOf; | 917 internal.NullableMapOf = NullableMapOf; |
920 exports.NullableMapOf = NullableMapOf; | 918 })(); |
921 return exports; | |
922 }); | |
OLD | NEW |