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 ], function(unicode) { | 7 ], function(unicode) { |
8 | 8 |
9 var kErrorUnsigned = "Passing negative value to unsigned"; | 9 var kErrorUnsigned = "Passing negative value to unsigned"; |
10 | 10 |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
195 Decoder.prototype.decodePointer = function() { | 195 Decoder.prototype.decodePointer = function() { |
196 // TODO(abarth): To correctly decode a pointer, we need to know the real | 196 // TODO(abarth): To correctly decode a pointer, we need to know the real |
197 // base address of the array buffer. | 197 // base address of the array buffer. |
198 var offsetPointer = this.next; | 198 var offsetPointer = this.next; |
199 var offset = this.readUint64(); | 199 var offset = this.readUint64(); |
200 if (!offset) | 200 if (!offset) |
201 return 0; | 201 return 0; |
202 return offsetPointer + offset; | 202 return offsetPointer + offset; |
203 }; | 203 }; |
204 | 204 |
205 Decoder.prototype.decodeAndCreateDecoder = function() { | 205 Decoder.prototype.decodeAndCreateDecoder = function(pointer) { |
206 return new Decoder(this.buffer, this.handles, this.decodePointer()); | 206 return new Decoder(this.buffer, this.handles, pointer); |
207 }; | 207 }; |
208 | 208 |
209 Decoder.prototype.decodeHandle = function() { | 209 Decoder.prototype.decodeHandle = function() { |
210 return this.handles[this.readUint32()]; | 210 return this.handles[this.readUint32()]; |
211 }; | 211 }; |
212 | 212 |
213 Decoder.prototype.decodeString = function() { | 213 Decoder.prototype.decodeString = function() { |
214 var numberOfBytes = this.readUint32(); | 214 var numberOfBytes = this.readUint32(); |
215 var numberOfElements = this.readUint32(); | 215 var numberOfElements = this.readUint32(); |
216 var base = this.next; | 216 var base = this.next; |
(...skipping 10 matching lines...) Expand all Loading... | |
227 val[i] = cls.decode(this); | 227 val[i] = cls.decode(this); |
228 } | 228 } |
229 return val; | 229 return val; |
230 }; | 230 }; |
231 | 231 |
232 Decoder.prototype.decodeStruct = function(cls) { | 232 Decoder.prototype.decodeStruct = function(cls) { |
233 return cls.decode(this); | 233 return cls.decode(this); |
234 }; | 234 }; |
235 | 235 |
236 Decoder.prototype.decodeStructPointer = function(cls) { | 236 Decoder.prototype.decodeStructPointer = function(cls) { |
237 return cls.decode(this.decodeAndCreateDecoder()); | 237 var pointer = this.decodePointer(); |
238 if (!pointer) { | |
239 return null; | |
240 } | |
Matt Perry
2014/05/16 18:39:04
I assume this mimics how its done on the C++ side?
Tom Sepez
2014/05/16 18:56:17
It's not exactly analogous, because JS has to deco
| |
241 return cls.decode(this.decodeAndCreateDecoder(pointer)); | |
238 }; | 242 }; |
239 | 243 |
240 Decoder.prototype.decodeArrayPointer = function(cls) { | 244 Decoder.prototype.decodeArrayPointer = function(cls) { |
241 return this.decodeAndCreateDecoder().decodeArray(cls); | 245 var pointer = this.decodePointer(); |
246 if (!pointer) { | |
247 return null; | |
248 } | |
249 return this.decodeAndCreateDecoder(pointer).decodeArray(cls); | |
242 }; | 250 }; |
243 | 251 |
244 Decoder.prototype.decodeStringPointer = function() { | 252 Decoder.prototype.decodeStringPointer = function() { |
245 return this.decodeAndCreateDecoder().decodeString(); | 253 var pointer = this.decodePointer(); |
254 if (!pointer) { | |
255 return null; | |
256 } | |
257 return this.decodeAndCreateDecoder(pointer).decodeString(); | |
246 }; | 258 }; |
247 | 259 |
248 // Encoder ------------------------------------------------------------------ | 260 // Encoder ------------------------------------------------------------------ |
249 | 261 |
250 function Encoder(buffer, handles, base) { | 262 function Encoder(buffer, handles, base) { |
251 this.buffer = buffer; | 263 this.buffer = buffer; |
252 this.handles = handles; | 264 this.handles = handles; |
253 this.base = base; | 265 this.base = base; |
254 this.next = base; | 266 this.next = base; |
255 } | 267 } |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
360 for (var i = 0; i < numberOfElements; ++i) { | 372 for (var i = 0; i < numberOfElements; ++i) { |
361 cls.encode(this, val[i]); | 373 cls.encode(this, val[i]); |
362 } | 374 } |
363 }; | 375 }; |
364 | 376 |
365 Encoder.prototype.encodeStruct = function(cls, val) { | 377 Encoder.prototype.encodeStruct = function(cls, val) { |
366 return cls.encode(this, val); | 378 return cls.encode(this, val); |
367 }; | 379 }; |
368 | 380 |
369 Encoder.prototype.encodeStructPointer = function(cls, val) { | 381 Encoder.prototype.encodeStructPointer = function(cls, val) { |
382 if (!val) { | |
383 this.encodePointer(val); | |
384 return; | |
385 } | |
370 var encoder = this.createAndEncodeEncoder(cls.encodedSize); | 386 var encoder = this.createAndEncodeEncoder(cls.encodedSize); |
371 cls.encode(encoder, val); | 387 cls.encode(encoder, val); |
372 }; | 388 }; |
373 | 389 |
374 Encoder.prototype.encodeArrayPointer = function(cls, val) { | 390 Encoder.prototype.encodeArrayPointer = function(cls, val) { |
391 if (!val) { | |
392 this.encodePointer(val); | |
393 return; | |
394 } | |
375 var encodedSize = kArrayHeaderSize + cls.encodedSize * val.length; | 395 var encodedSize = kArrayHeaderSize + cls.encodedSize * val.length; |
376 var encoder = this.createAndEncodeEncoder(encodedSize); | 396 var encoder = this.createAndEncodeEncoder(encodedSize); |
377 encoder.encodeArray(cls, val); | 397 encoder.encodeArray(cls, val); |
378 }; | 398 }; |
379 | 399 |
380 Encoder.prototype.encodeStringPointer = function(val) { | 400 Encoder.prototype.encodeStringPointer = function(val) { |
401 if (!val) { | |
402 this.encodePointer(val); | |
403 return; | |
404 } | |
381 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); | 405 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); |
382 var encoder = this.createAndEncodeEncoder(encodedSize); | 406 var encoder = this.createAndEncodeEncoder(encodedSize); |
383 encoder.encodeString(val); | 407 encoder.encodeString(val); |
384 }; | 408 }; |
385 | 409 |
386 // Message ------------------------------------------------------------------ | 410 // Message ------------------------------------------------------------------ |
387 | 411 |
388 var kMessageExpectsResponse = 1 << 0; | 412 var kMessageExpectsResponse = 1 << 0; |
389 var kMessageIsResponse = 1 << 1; | 413 var kMessageIsResponse = 1 << 1; |
390 | 414 |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
635 encoder.writeDouble(val); | 659 encoder.writeDouble(val); |
636 }; | 660 }; |
637 | 661 |
638 function PointerTo(cls) { | 662 function PointerTo(cls) { |
639 this.cls = cls; | 663 this.cls = cls; |
640 } | 664 } |
641 | 665 |
642 PointerTo.prototype.encodedSize = 8; | 666 PointerTo.prototype.encodedSize = 8; |
643 | 667 |
644 PointerTo.prototype.decode = function(decoder) { | 668 PointerTo.prototype.decode = function(decoder) { |
645 return this.cls.decode(decoder.decodeAndCreateDecoder()); | 669 var pointer = decoder.decodePointer(); |
670 if (!pointer) { | |
671 return null; | |
672 } | |
673 return this.cls.decode(decoder.decodeAndCreateDecoder(pointer)); | |
646 }; | 674 }; |
647 | 675 |
648 PointerTo.prototype.encode = function(encoder, val) { | 676 PointerTo.prototype.encode = function(encoder, val) { |
677 if (!val) { | |
678 encoder.encodePointer(val); | |
679 return; | |
680 } | |
649 var objectEncoder = encoder.createAndEncodeEncoder(this.cls.encodedSize); | 681 var objectEncoder = encoder.createAndEncodeEncoder(this.cls.encodedSize); |
650 this.cls.encode(objectEncoder, val); | 682 this.cls.encode(objectEncoder, val); |
651 }; | 683 }; |
652 | 684 |
653 function ArrayOf(cls) { | 685 function ArrayOf(cls) { |
654 this.cls = cls; | 686 this.cls = cls; |
655 } | 687 } |
656 | 688 |
657 ArrayOf.prototype.encodedSize = 8; | 689 ArrayOf.prototype.encodedSize = 8; |
658 | 690 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
698 exports.Int64 = Int64; | 730 exports.Int64 = Int64; |
699 exports.Uint64 = Uint64; | 731 exports.Uint64 = Uint64; |
700 exports.Float = Float; | 732 exports.Float = Float; |
701 exports.Double = Double; | 733 exports.Double = Double; |
702 exports.String = String; | 734 exports.String = String; |
703 exports.PointerTo = PointerTo; | 735 exports.PointerTo = PointerTo; |
704 exports.ArrayOf = ArrayOf; | 736 exports.ArrayOf = ArrayOf; |
705 exports.Handle = Handle; | 737 exports.Handle = Handle; |
706 return exports; | 738 return exports; |
707 }); | 739 }); |
OLD | NEW |