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 kMapStructSize = 16; | |
yzshen1
2014/10/15 05:58:02
It doesn't include the struct header itself, right
hansmuller
2014/10/15 21:45:46
Done.
| |
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 | |
qsr
2014/10/15 13:03:40
Don't you want to check that the header is the one
hansmuller
2014/10/15 21:45:46
Yes. That will happen when the incoming message is
| |
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 }); | |
abarth-chromium
2014/10/15 04:53:26
for (var [key, value] of val) {
...
}
https://d
hansmuller
2014/10/15 21:45:46
That would be nicer. I gave it a try; it doesn't a
| |
381 this.writeUint32(kMapStructSize); | |
yzshen1
2014/10/15 05:58:02
num_bytes should also include the header size.
hansmuller
2014/10/15 21:45:46
Yes it should! Sorry about that.
| |
382 this.writeUint32(2); | |
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 + kMapStructSize; | |
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 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
730 exports.NullableString = NullableString; | 776 exports.NullableString = NullableString; |
731 exports.PointerTo = PointerTo; | 777 exports.PointerTo = PointerTo; |
732 exports.NullablePointerTo = NullablePointerTo; | 778 exports.NullablePointerTo = NullablePointerTo; |
733 exports.ArrayOf = ArrayOf; | 779 exports.ArrayOf = ArrayOf; |
734 exports.NullableArrayOf = NullableArrayOf; | 780 exports.NullableArrayOf = NullableArrayOf; |
735 exports.PackedBool = PackedBool; | 781 exports.PackedBool = PackedBool; |
736 exports.Handle = Handle; | 782 exports.Handle = Handle; |
737 exports.NullableHandle = NullableHandle; | 783 exports.NullableHandle = NullableHandle; |
738 return exports; | 784 return exports; |
739 }); | 785 }); |
OLD | NEW |