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