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/bindings/codec", [ | 5 define("mojo/public/js/bindings/codec", [ |
6 "mojo/public/js/bindings/unicode", | 6 "mojo/public/js/bindings/unicode", |
7 "mojo/public/js/bindings/buffer", | 7 "mojo/public/js/bindings/buffer", |
8 ], function(unicode, buffer) { | 8 ], function(unicode, buffer) { |
9 | 9 |
10 var kErrorUnsigned = "Passing negative value to unsigned"; | 10 var kErrorUnsigned = "Passing negative value to unsigned"; |
11 | 11 |
12 // Memory ------------------------------------------------------------------- | 12 // Memory ------------------------------------------------------------------- |
13 | 13 |
14 var kAlignment = 8; | 14 var kAlignment = 8; |
15 | 15 |
16 function align(size) { | 16 function align(size) { |
17 return size + (kAlignment - (size % kAlignment)) % kAlignment; | 17 return size + (kAlignment - (size % kAlignment)) % kAlignment; |
18 } | 18 } |
19 | 19 |
20 function isAligned(offset) { | 20 function isAligned(offset) { |
21 return offset >= 0 && (offset % kAlignment) === 0; | 21 return offset >= 0 && (offset % kAlignment) === 0; |
22 } | 22 } |
23 | 23 |
24 // Constants ---------------------------------------------------------------- | 24 // Constants ---------------------------------------------------------------- |
25 | 25 |
26 var kArrayHeaderSize = 8; | 26 var kArrayHeaderSize = 8; |
27 var kStructHeaderSize = 8; | 27 var kStructHeaderSize = 8; |
28 var kMessageHeaderSize = 16; | 28 var kMessageHeaderSize = 16; |
29 var kMessageWithRequestIDHeaderSize = 24; | 29 var kMessageWithRequestIDHeaderSize = 24; |
| 30 var kMapStructPayloadSize = 16; |
30 | 31 |
31 var kStructHeaderNumBytesOffset = 0; | 32 var kStructHeaderNumBytesOffset = 0; |
32 var kStructHeaderNumFieldsOffset = 4; | 33 var kStructHeaderNumFieldsOffset = 4; |
33 | 34 |
34 var kEncodedInvalidHandleValue = 0xFFFFFFFF; | 35 var kEncodedInvalidHandleValue = 0xFFFFFFFF; |
35 | 36 |
36 // Decoder ------------------------------------------------------------------ | 37 // Decoder ------------------------------------------------------------------ |
37 | 38 |
38 function Decoder(buffer, handles, base) { | 39 function Decoder(buffer, handles, base) { |
39 this.buffer = buffer; | 40 this.buffer = buffer; |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 }; | 174 }; |
174 | 175 |
175 Decoder.prototype.decodeStringPointer = function() { | 176 Decoder.prototype.decodeStringPointer = function() { |
176 var pointer = this.decodePointer(); | 177 var pointer = this.decodePointer(); |
177 if (!pointer) { | 178 if (!pointer) { |
178 return null; | 179 return null; |
179 } | 180 } |
180 return this.decodeAndCreateDecoder(pointer).decodeString(); | 181 return this.decodeAndCreateDecoder(pointer).decodeString(); |
181 }; | 182 }; |
182 | 183 |
| 184 Decoder.prototype.decodeMap = function(keyClass, valueClass) { |
| 185 this.skip(4); // numberOfBytes |
| 186 this.skip(4); // numberOfFields |
| 187 var keys = this.decodeArrayPointer(keyClass); |
| 188 var values = this.decodeArrayPointer(valueClass); |
| 189 var val = new Map(); |
| 190 for (var i = 0; i < keys.length; i++) |
| 191 val.set(keys[i], values[i]); |
| 192 return val; |
| 193 }; |
| 194 |
| 195 Decoder.prototype.decodeMapPointer = function(keyClass, valueClass) { |
| 196 var pointer = this.decodePointer(); |
| 197 if (!pointer) { |
| 198 return null; |
| 199 } |
| 200 var decoder = this.decodeAndCreateDecoder(pointer); |
| 201 return decoder.decodeMap(keyClass, valueClass); |
| 202 }; |
| 203 |
183 // Encoder ------------------------------------------------------------------ | 204 // Encoder ------------------------------------------------------------------ |
184 | 205 |
185 function Encoder(buffer, handles, base) { | 206 function Encoder(buffer, handles, base) { |
186 this.buffer = buffer; | 207 this.buffer = buffer; |
187 this.handles = handles; | 208 this.handles = handles; |
188 this.base = base; | 209 this.base = base; |
189 this.next = base; | 210 this.next = base; |
190 } | 211 } |
191 | 212 |
192 Encoder.prototype.skip = function(offset) { | 213 Encoder.prototype.skip = function(offset) { |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 if (val == null) { | 363 if (val == null) { |
343 // Also handles undefined, since undefined == null. | 364 // Also handles undefined, since undefined == null. |
344 this.encodePointer(val); | 365 this.encodePointer(val); |
345 return; | 366 return; |
346 } | 367 } |
347 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); | 368 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); |
348 var encoder = this.createAndEncodeEncoder(encodedSize); | 369 var encoder = this.createAndEncodeEncoder(encodedSize); |
349 encoder.encodeString(val); | 370 encoder.encodeString(val); |
350 }; | 371 }; |
351 | 372 |
| 373 Encoder.prototype.encodeMap = function(keyClass, valueClass, val) { |
| 374 var keys = new Array(val.size); |
| 375 var values = new Array(val.size); |
| 376 var i = 0; |
| 377 val.forEach(function(value, key) { |
| 378 values[i] = value; |
| 379 keys[i++] = key; |
| 380 }); |
| 381 this.writeUint32(kStructHeaderSize + kMapStructPayloadSize); |
| 382 this.writeUint32(2); // two fields: keys, values |
| 383 this.encodeArrayPointer(keyClass, keys); |
| 384 this.encodeArrayPointer(valueClass, values); |
| 385 } |
| 386 |
| 387 Encoder.prototype.encodeMapPointer = function(keyClass, valueClass, val) { |
| 388 if (val == null) { |
| 389 // Also handles undefined, since undefined == null. |
| 390 this.encodePointer(val); |
| 391 return; |
| 392 } |
| 393 var encodedSize = kStructHeaderSize + kMapStructPayloadSize; |
| 394 var encoder = this.createAndEncodeEncoder(encodedSize); |
| 395 encoder.encodeMap(keyClass, valueClass, val); |
| 396 }; |
| 397 |
352 // Message ------------------------------------------------------------------ | 398 // Message ------------------------------------------------------------------ |
353 | 399 |
354 var kMessageNameOffset = kStructHeaderSize; | 400 var kMessageNameOffset = kStructHeaderSize; |
355 var kMessageFlagsOffset = kMessageNameOffset + 4; | 401 var kMessageFlagsOffset = kMessageNameOffset + 4; |
356 var kMessageRequestIDOffset = kMessageFlagsOffset + 4; | 402 var kMessageRequestIDOffset = kMessageFlagsOffset + 4; |
357 | 403 |
358 var kMessageExpectsResponse = 1 << 0; | 404 var kMessageExpectsResponse = 1 << 0; |
359 var kMessageIsResponse = 1 << 1; | 405 var kMessageIsResponse = 1 << 1; |
360 | 406 |
361 function Message(buffer, handles) { | 407 function Message(buffer, handles) { |
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
703 NullableHandle.encode = Handle.encode; | 749 NullableHandle.encode = Handle.encode; |
704 | 750 |
705 var exports = {}; | 751 var exports = {}; |
706 exports.align = align; | 752 exports.align = align; |
707 exports.isAligned = isAligned; | 753 exports.isAligned = isAligned; |
708 exports.Message = Message; | 754 exports.Message = Message; |
709 exports.MessageBuilder = MessageBuilder; | 755 exports.MessageBuilder = MessageBuilder; |
710 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; | 756 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; |
711 exports.MessageReader = MessageReader; | 757 exports.MessageReader = MessageReader; |
712 exports.kArrayHeaderSize = kArrayHeaderSize; | 758 exports.kArrayHeaderSize = kArrayHeaderSize; |
| 759 exports.kMapStructPayloadSize = kMapStructPayloadSize; |
713 exports.kStructHeaderSize = kStructHeaderSize; | 760 exports.kStructHeaderSize = kStructHeaderSize; |
714 exports.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue; | 761 exports.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue; |
715 exports.kMessageHeaderSize = kMessageHeaderSize; | 762 exports.kMessageHeaderSize = kMessageHeaderSize; |
716 exports.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize; | 763 exports.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize; |
717 exports.kMessageExpectsResponse = kMessageExpectsResponse; | 764 exports.kMessageExpectsResponse = kMessageExpectsResponse; |
718 exports.kMessageIsResponse = kMessageIsResponse; | 765 exports.kMessageIsResponse = kMessageIsResponse; |
719 exports.Int8 = Int8; | 766 exports.Int8 = Int8; |
720 exports.Uint8 = Uint8; | 767 exports.Uint8 = Uint8; |
721 exports.Int16 = Int16; | 768 exports.Int16 = Int16; |
722 exports.Uint16 = Uint16; | 769 exports.Uint16 = Uint16; |
723 exports.Int32 = Int32; | 770 exports.Int32 = Int32; |
724 exports.Uint32 = Uint32; | 771 exports.Uint32 = Uint32; |
725 exports.Int64 = Int64; | 772 exports.Int64 = Int64; |
726 exports.Uint64 = Uint64; | 773 exports.Uint64 = Uint64; |
727 exports.Float = Float; | 774 exports.Float = Float; |
728 exports.Double = Double; | 775 exports.Double = Double; |
729 exports.String = String; | 776 exports.String = String; |
730 exports.NullableString = NullableString; | 777 exports.NullableString = NullableString; |
731 exports.PointerTo = PointerTo; | 778 exports.PointerTo = PointerTo; |
732 exports.NullablePointerTo = NullablePointerTo; | 779 exports.NullablePointerTo = NullablePointerTo; |
733 exports.ArrayOf = ArrayOf; | 780 exports.ArrayOf = ArrayOf; |
734 exports.NullableArrayOf = NullableArrayOf; | 781 exports.NullableArrayOf = NullableArrayOf; |
735 exports.PackedBool = PackedBool; | 782 exports.PackedBool = PackedBool; |
736 exports.Handle = Handle; | 783 exports.Handle = Handle; |
737 exports.NullableHandle = NullableHandle; | 784 exports.NullableHandle = NullableHandle; |
738 return exports; | 785 return exports; |
739 }); | 786 }); |
OLD | NEW |