| 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 |