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) { |
| 21 return offset >= 0 && (offset % kAlignment) === 0; |
| 22 } |
| 23 |
20 // Constants ---------------------------------------------------------------- | 24 // Constants ---------------------------------------------------------------- |
21 | 25 |
22 var kArrayHeaderSize = 8; | 26 var kArrayHeaderSize = 8; |
23 var kStructHeaderSize = 8; | 27 var kStructHeaderSize = 8; |
24 var kMessageHeaderSize = 16; | 28 var kMessageHeaderSize = 16; |
25 var kMessageWithRequestIDHeaderSize = 24; | 29 var kMessageWithRequestIDHeaderSize = 24; |
26 | 30 |
| 31 var kStructHeaderNumBytesOffset = 0; |
| 32 var kStructHeaderNumFieldsOffset = 4; |
| 33 |
27 // Decoder ------------------------------------------------------------------ | 34 // Decoder ------------------------------------------------------------------ |
28 | 35 |
29 function Decoder(buffer, handles, base) { | 36 function Decoder(buffer, handles, base) { |
30 this.buffer = buffer; | 37 this.buffer = buffer; |
31 this.handles = handles; | 38 this.handles = handles; |
32 this.base = base; | 39 this.base = base; |
33 this.next = base; | 40 this.next = base; |
34 } | 41 } |
35 | 42 |
36 Decoder.prototype.skip = function(offset) { | 43 Decoder.prototype.skip = function(offset) { |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 return val; | 141 return val; |
135 }; | 142 }; |
136 | 143 |
137 Decoder.prototype.decodeBoolArray = function() { | 144 Decoder.prototype.decodeBoolArray = function() { |
138 var numberOfBytes = this.readUint32(); | 145 var numberOfBytes = this.readUint32(); |
139 var numberOfElements = this.readUint32(); | 146 var numberOfElements = this.readUint32(); |
140 | 147 |
141 var val = new Array(numberOfElements); | 148 var val = new Array(numberOfElements); |
142 var byte; | 149 var byte; |
143 for (var i = 0; i < numberOfElements; ++i) { | 150 for (var i = 0; i < numberOfElements; ++i) { |
144 if (i % 8 == 0) | 151 if (i % 8 === 0) |
145 byte = this.readUint8(); | 152 byte = this.readUint8(); |
146 val[i] = (byte & (1 << i % 8)) ? true : false; | 153 val[i] = (byte & (1 << i % 8)) ? true : false; |
147 } | 154 } |
148 return val; | 155 return val; |
149 }; | 156 }; |
150 | 157 |
151 Decoder.prototype.decodeStruct = function(cls) { | 158 Decoder.prototype.decodeStruct = function(cls) { |
152 return cls.decode(this); | 159 return cls.decode(this); |
153 }; | 160 }; |
154 | 161 |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 this.encodePointer(val); | 352 this.encodePointer(val); |
346 return; | 353 return; |
347 } | 354 } |
348 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); | 355 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); |
349 var encoder = this.createAndEncodeEncoder(encodedSize); | 356 var encoder = this.createAndEncodeEncoder(encodedSize); |
350 encoder.encodeString(val); | 357 encoder.encodeString(val); |
351 }; | 358 }; |
352 | 359 |
353 // Message ------------------------------------------------------------------ | 360 // Message ------------------------------------------------------------------ |
354 | 361 |
| 362 var kMessageNameOffset = kStructHeaderSize; |
| 363 var kMessageFlagsOffset = kMessageNameOffset + 4; |
| 364 var kMessageRequestIDOffset = kMessageFlagsOffset + 4; |
| 365 |
355 var kMessageExpectsResponse = 1 << 0; | 366 var kMessageExpectsResponse = 1 << 0; |
356 var kMessageIsResponse = 1 << 1; | 367 var kMessageIsResponse = 1 << 1; |
357 | 368 |
358 // Skip over num_bytes, num_fields, and message_name. | |
359 var kFlagsOffset = 4 + 4 + 4; | |
360 | |
361 // Skip over num_bytes, num_fields, message_name, and flags. | |
362 var kRequestIDOffset = 4 + 4 + 4 + 4; | |
363 | |
364 function Message(buffer, handles) { | 369 function Message(buffer, handles) { |
365 this.buffer = buffer; | 370 this.buffer = buffer; |
366 this.handles = handles; | 371 this.handles = handles; |
367 } | 372 } |
368 | 373 |
369 Message.prototype.setRequestID = function(requestID) { | 374 Message.prototype.getHeaderNumBytes = function() { |
370 // TODO(darin): Verify that space was reserved for this field! | 375 return this.buffer.getUint32(kStructHeaderNumBytesOffset); |
371 this.buffer.setUint64(kRequestIDOffset, requestID); | 376 }; |
| 377 |
| 378 Message.prototype.getHeaderNumFields = function() { |
| 379 return this.buffer.getUint32(kStructHeaderNumFieldsOffset); |
372 }; | 380 }; |
373 | 381 |
374 Message.prototype.getFlags = function() { | 382 Message.prototype.getFlags = function() { |
375 return this.buffer.getUint32(kFlagsOffset); | 383 return this.buffer.getUint32(kMessageFlagsOffset); |
376 }; | 384 }; |
377 | 385 |
| 386 Message.prototype.isResponse = function() { |
| 387 return (this.getFlags() & kMessageIsResponse) != 0; |
| 388 }; |
| 389 |
| 390 Message.prototype.expectsResponse = function() { |
| 391 return (this.getFlags() & kMessageExpectsResponse) != 0; |
| 392 }; |
| 393 |
| 394 Message.prototype.setRequestID = function(requestID) { |
| 395 // TODO(darin): Verify that space was reserved for this field! |
| 396 this.buffer.setUint64(kMessageRequestIDOffset, requestID); |
| 397 }; |
| 398 |
| 399 |
378 // MessageBuilder ----------------------------------------------------------- | 400 // MessageBuilder ----------------------------------------------------------- |
379 | 401 |
380 function MessageBuilder(messageName, payloadSize) { | 402 function MessageBuilder(messageName, payloadSize) { |
381 // Currently, we don't compute the payload size correctly ahead of time. | 403 // Currently, we don't compute the payload size correctly ahead of time. |
382 // Instead, we resize the buffer at the end. | 404 // Instead, we resize the buffer at the end. |
383 var numberOfBytes = kMessageHeaderSize + payloadSize; | 405 var numberOfBytes = kMessageHeaderSize + payloadSize; |
384 this.buffer = new buffer.Buffer(numberOfBytes); | 406 this.buffer = new buffer.Buffer(numberOfBytes); |
385 this.handles = []; | 407 this.handles = []; |
386 var encoder = this.createEncoder(kMessageHeaderSize); | 408 var encoder = this.createEncoder(kMessageHeaderSize); |
387 encoder.writeUint32(kMessageHeaderSize); | 409 encoder.writeUint32(kMessageHeaderSize); |
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
659 Handle.decode = function(decoder) { | 681 Handle.decode = function(decoder) { |
660 return decoder.decodeHandle(); | 682 return decoder.decodeHandle(); |
661 }; | 683 }; |
662 | 684 |
663 Handle.encode = function(encoder, val) { | 685 Handle.encode = function(encoder, val) { |
664 encoder.encodeHandle(val); | 686 encoder.encodeHandle(val); |
665 }; | 687 }; |
666 | 688 |
667 var exports = {}; | 689 var exports = {}; |
668 exports.align = align; | 690 exports.align = align; |
| 691 exports.isAligned = isAligned; |
669 exports.Message = Message; | 692 exports.Message = Message; |
670 exports.MessageBuilder = MessageBuilder; | 693 exports.MessageBuilder = MessageBuilder; |
671 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; | 694 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; |
672 exports.MessageReader = MessageReader; | 695 exports.MessageReader = MessageReader; |
673 exports.kArrayHeaderSize = kArrayHeaderSize; | 696 exports.kArrayHeaderSize = kArrayHeaderSize; |
674 exports.kStructHeaderSize = kStructHeaderSize; | 697 exports.kStructHeaderSize = kStructHeaderSize; |
675 exports.kMessageHeaderSize = kMessageHeaderSize; | 698 exports.kMessageHeaderSize = kMessageHeaderSize; |
| 699 exports.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize; |
676 exports.kMessageExpectsResponse = kMessageExpectsResponse; | 700 exports.kMessageExpectsResponse = kMessageExpectsResponse; |
677 exports.kMessageIsResponse = kMessageIsResponse; | 701 exports.kMessageIsResponse = kMessageIsResponse; |
678 exports.Int8 = Int8; | 702 exports.Int8 = Int8; |
679 exports.Uint8 = Uint8; | 703 exports.Uint8 = Uint8; |
680 exports.Int16 = Int16; | 704 exports.Int16 = Int16; |
681 exports.Uint16 = Uint16; | 705 exports.Uint16 = Uint16; |
682 exports.Int32 = Int32; | 706 exports.Int32 = Int32; |
683 exports.Uint32 = Uint32; | 707 exports.Uint32 = Uint32; |
684 exports.Int64 = Int64; | 708 exports.Int64 = Int64; |
685 exports.Uint64 = Uint64; | 709 exports.Uint64 = Uint64; |
686 exports.Float = Float; | 710 exports.Float = Float; |
687 exports.Double = Double; | 711 exports.Double = Double; |
688 exports.String = String; | 712 exports.String = String; |
689 exports.PointerTo = PointerTo; | 713 exports.PointerTo = PointerTo; |
690 exports.ArrayOf = ArrayOf; | 714 exports.ArrayOf = ArrayOf; |
691 exports.ArrayOfBoolArrayPointers = ArrayOfBoolArrayPointers; | 715 exports.ArrayOfBoolArrayPointers = ArrayOfBoolArrayPointers; |
692 exports.Handle = Handle; | 716 exports.Handle = Handle; |
693 return exports; | 717 return exports; |
694 }); | 718 }); |
OLD | NEW |