Chromium Code Reviews| Index: mojo/public/bindings/js/codec.js |
| diff --git a/mojo/public/bindings/js/codec.js b/mojo/public/bindings/js/codec.js |
| index 52357f43a70a3da8caaae09a37735bde803fb9d0..9827b36b1822f6f6783a9857b2b5d5fafbc7dbd1 100644 |
| --- a/mojo/public/bindings/js/codec.js |
| +++ b/mojo/public/bindings/js/codec.js |
| @@ -84,6 +84,7 @@ define("mojo/public/bindings/js/codec", function() { |
| var kArrayHeaderSize = 8; |
| var kStructHeaderSize = 8; |
| var kMessageHeaderSize = 16; |
| + var kMessageWithRequestIDHeaderSize = 24; |
| // Decoder ------------------------------------------------------------------ |
| @@ -287,11 +288,24 @@ define("mojo/public/bindings/js/codec", function() { |
| // Message ------------------------------------------------------------------ |
| + var kMessageExpectsResponse = 1 << 0; |
| + var kMessageIsResponse = 1 << 1; |
| + |
| function Message(memory, handles) { |
| this.memory = memory; |
| this.handles = handles; |
| } |
| + Message.prototype.setRequestID = function(requestID) { |
| + // TODO(darin): Verify that space was reserved for this field! |
| + store64(this.memory, 4 + 4 + 4 + 4, requestID); |
| + }; |
| + |
| + Message.prototype.getFlags = function() { |
| + // Skip over num_bytes, num_fields, and message_name. |
| + return load32(this.memory, 4 + 4 + 4); |
| + }; |
| + |
| // MessageBuilder ----------------------------------------------------------- |
| function MessageBuilder(messageName, payloadSize) { |
| @@ -310,7 +324,7 @@ define("mojo/public/bindings/js/codec", function() { |
| MessageBuilder.prototype.createEncoder = function(size) { |
| var pointer = this.buffer.alloc(size); |
| return new Encoder(this.buffer, this.handles, pointer); |
| - } |
| + }; |
| MessageBuilder.prototype.encodeStruct = function(cls, val) { |
| cls.encode(this.createEncoder(cls.encodedSize), val); |
| @@ -327,16 +341,40 @@ define("mojo/public/bindings/js/codec", function() { |
| return message; |
| }; |
| + // MessageWithRequestIDBuilder ----------------------------------------------- |
| + |
| + function MessageWithRequestIDBuilder(messageName, payloadSize, flags, |
| + requestID) { |
| + // Currently, we don't compute the payload size correctly ahead of time. |
| + // Instead, we resize the buffer at the end. |
| + var numberOfBytes = kMessageWithRequestIDHeaderSize + payloadSize; |
| + this.buffer = new Buffer(numberOfBytes); |
| + this.handles = []; |
| + var encoder = this.createEncoder(kMessageWithRequestIDHeaderSize); |
| + encoder.write32(kMessageWithRequestIDHeaderSize); |
| + encoder.write32(3); // num_fields. |
|
abarth-chromium
2014/03/26 18:26:32
Should we make this a named constant?
|
| + encoder.write32(messageName); |
| + encoder.write32(flags); |
| + encoder.write64(requestID); |
| + } |
| + |
| + MessageWithRequestIDBuilder.prototype = |
| + Object.create(MessageBuilder.prototype); |
| + MessageWithRequestIDBuilder.prototype.constructor = |
| + MessageWithRequestIDBuilder; |
| + |
| // MessageReader ------------------------------------------------------------ |
| function MessageReader(message) { |
| this.decoder = new Decoder(message.memory, message.handles, 0); |
| var messageHeaderSize = this.decoder.read32(); |
| this.payloadSize = message.memory.length - messageHeaderSize; |
| - var numberOfFields = this.decoder.read32(); |
| - // TODO: better handling of messages of different size. |
| + var numFields = this.decoder.read32(); |
| this.messageName = this.decoder.read32(); |
| - var flags = this.decoder.read32(); |
| + this.flags = this.decoder.read32(); |
| + if (numFields >= 3) |
| + this.requestID = this.decoder.read64(); |
| + this.decoder.skip(messageHeaderSize - this.decoder.next); |
| } |
| MessageReader.prototype.decodeStruct = function(cls) { |
| @@ -449,10 +487,13 @@ define("mojo/public/bindings/js/codec", function() { |
| exports.align = align; |
| exports.Message = Message; |
| exports.MessageBuilder = MessageBuilder; |
| + exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; |
| exports.MessageReader = MessageReader; |
| exports.kArrayHeaderSize = kArrayHeaderSize; |
| exports.kStructHeaderSize = kStructHeaderSize; |
| exports.kMessageHeaderSize = kMessageHeaderSize; |
| + exports.kMessageExpectsResponse = kMessageExpectsResponse; |
| + exports.kMessageIsResponse = kMessageIsResponse; |
| exports.Uint8 = Uint8; |
| exports.Uint16 = Uint16; |
| exports.Uint32 = Uint32; |