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/bindings/js/codec", function() { | 5 define("mojo/public/bindings/js/codec", function() { |
6 | 6 |
7 // Memory ------------------------------------------------------------------- | 7 // Memory ------------------------------------------------------------------- |
8 | 8 |
9 function store8(memory, pointer, val) { | 9 function store8(memory, pointer, val) { |
10 memory[pointer] = val; | 10 memory[pointer] = val; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 | 77 |
78 Buffer.prototype.createViewOfAllocatedMemory = function() { | 78 Buffer.prototype.createViewOfAllocatedMemory = function() { |
79 return new Uint8Array(this.memory.buffer, 0, this.next); | 79 return new Uint8Array(this.memory.buffer, 0, this.next); |
80 }; | 80 }; |
81 | 81 |
82 // Constants ---------------------------------------------------------------- | 82 // Constants ---------------------------------------------------------------- |
83 | 83 |
84 var kArrayHeaderSize = 8; | 84 var kArrayHeaderSize = 8; |
85 var kStructHeaderSize = 8; | 85 var kStructHeaderSize = 8; |
86 var kMessageHeaderSize = 16; | 86 var kMessageHeaderSize = 16; |
87 var kMessageWithRequestIDHeaderSize = 24; | |
88 | 87 |
89 // Decoder ------------------------------------------------------------------ | 88 // Decoder ------------------------------------------------------------------ |
90 | 89 |
91 function Decoder(memory, handles, base) { | 90 function Decoder(memory, handles, base) { |
92 this.memory = memory; | 91 this.memory = memory; |
93 this.handles = handles; | 92 this.handles = handles; |
94 this.base = base; | 93 this.base = base; |
95 this.next = base; | 94 this.next = base; |
96 this.viewU32 = new Uint32Array( | 95 this.viewU32 = new Uint32Array( |
97 this.memory.buffer, 0, | 96 this.memory.buffer, 0, |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 | 280 |
282 Encoder.prototype.encodeStringPointer = function(val) { | 281 Encoder.prototype.encodeStringPointer = function(val) { |
283 // TODO(abarth): This won't be right once we support UTF-8. | 282 // TODO(abarth): This won't be right once we support UTF-8. |
284 var encodedSize = kArrayHeaderSize + val.length; | 283 var encodedSize = kArrayHeaderSize + val.length; |
285 var encoder = this.createAndEncodeEncoder(encodedSize); | 284 var encoder = this.createAndEncodeEncoder(encodedSize); |
286 encoder.encodeString(val); | 285 encoder.encodeString(val); |
287 }; | 286 }; |
288 | 287 |
289 // Message ------------------------------------------------------------------ | 288 // Message ------------------------------------------------------------------ |
290 | 289 |
291 var kMessageExpectsResponse = 1 << 0; | |
292 var kMessageIsResponse = 1 << 1; | |
293 | |
294 function Message(memory, handles) { | 290 function Message(memory, handles) { |
295 this.memory = memory; | 291 this.memory = memory; |
296 this.handles = handles; | 292 this.handles = handles; |
297 } | 293 } |
298 | 294 |
299 Message.prototype.setRequestID = function(requestID) { | |
300 // TODO(darin): Verify that space was reserved for this field! | |
301 store64(this.memory, 4 + 4 + 4 + 4, requestID); | |
302 }; | |
303 | |
304 Message.prototype.getFlags = function() { | |
305 // Skip over num_bytes, num_fields, and message_name. | |
306 return load32(this.memory, 4 + 4 + 4); | |
307 }; | |
308 | |
309 // MessageBuilder ----------------------------------------------------------- | 295 // MessageBuilder ----------------------------------------------------------- |
310 | 296 |
311 function MessageBuilder(messageName, payloadSize) { | 297 function MessageBuilder(messageName, payloadSize) { |
312 // Currently, we don't compute the payload size correctly ahead of time. | 298 // Currently, we don't compute the payload size correctly ahead of time. |
313 // Instead, we resize the buffer at the end. | 299 // Instead, we resize the buffer at the end. |
314 var numberOfBytes = kMessageHeaderSize + payloadSize; | 300 var numberOfBytes = kMessageHeaderSize + payloadSize; |
315 this.buffer = new Buffer(numberOfBytes); | 301 this.buffer = new Buffer(numberOfBytes); |
316 this.handles = []; | 302 this.handles = []; |
317 var encoder = this.createEncoder(kMessageHeaderSize); | 303 var encoder = this.createEncoder(kMessageHeaderSize); |
318 encoder.write32(kMessageHeaderSize); | 304 encoder.write32(kMessageHeaderSize); |
319 encoder.write32(2); // num_fields. | 305 encoder.write32(2); // num_fields. |
320 encoder.write32(messageName); | 306 encoder.write32(messageName); |
321 encoder.write32(0); // flags. | 307 encoder.write32(0); // flags. |
322 } | 308 } |
323 | 309 |
324 MessageBuilder.prototype.createEncoder = function(size) { | 310 MessageBuilder.prototype.createEncoder = function(size) { |
325 var pointer = this.buffer.alloc(size); | 311 var pointer = this.buffer.alloc(size); |
326 return new Encoder(this.buffer, this.handles, pointer); | 312 return new Encoder(this.buffer, this.handles, pointer); |
327 }; | 313 } |
328 | 314 |
329 MessageBuilder.prototype.encodeStruct = function(cls, val) { | 315 MessageBuilder.prototype.encodeStruct = function(cls, val) { |
330 cls.encode(this.createEncoder(cls.encodedSize), val); | 316 cls.encode(this.createEncoder(cls.encodedSize), val); |
331 }; | 317 }; |
332 | 318 |
333 MessageBuilder.prototype.finish = function() { | 319 MessageBuilder.prototype.finish = function() { |
334 // TODO(abarth): Rather than resizing the buffer at the end, we could | 320 // TODO(abarth): Rather than resizing the buffer at the end, we could |
335 // compute the size we need ahead of time, like we do in C++. | 321 // compute the size we need ahead of time, like we do in C++. |
336 var memory = this.buffer.createViewOfAllocatedMemory(); | 322 var memory = this.buffer.createViewOfAllocatedMemory(); |
337 var message = new Message(memory, this.handles); | 323 var message = new Message(memory, this.handles); |
338 this.buffer = null; | 324 this.buffer = null; |
339 this.handles = null; | 325 this.handles = null; |
340 this.encoder = null; | 326 this.encoder = null; |
341 return message; | 327 return message; |
342 }; | 328 }; |
343 | 329 |
344 // MessageWithRequestIDBuilder ----------------------------------------------- | |
345 | |
346 function MessageWithRequestIDBuilder(messageName, payloadSize, flags, | |
347 requestID) { | |
348 // Currently, we don't compute the payload size correctly ahead of time. | |
349 // Instead, we resize the buffer at the end. | |
350 var numberOfBytes = kMessageWithRequestIDHeaderSize + payloadSize; | |
351 this.buffer = new Buffer(numberOfBytes); | |
352 this.handles = []; | |
353 var encoder = this.createEncoder(kMessageWithRequestIDHeaderSize); | |
354 encoder.write32(kMessageWithRequestIDHeaderSize); | |
355 encoder.write32(3); // num_fields. | |
356 encoder.write32(messageName); | |
357 encoder.write32(flags); | |
358 encoder.write64(requestID); | |
359 } | |
360 | |
361 MessageWithRequestIDBuilder.prototype = | |
362 Object.create(MessageBuilder.prototype); | |
363 MessageWithRequestIDBuilder.prototype.constructor = | |
364 MessageWithRequestIDBuilder; | |
365 | |
366 // MessageReader ------------------------------------------------------------ | 330 // MessageReader ------------------------------------------------------------ |
367 | 331 |
368 function MessageReader(message) { | 332 function MessageReader(message) { |
369 this.decoder = new Decoder(message.memory, message.handles, 0); | 333 this.decoder = new Decoder(message.memory, message.handles, 0); |
370 var messageHeaderSize = this.decoder.read32(); | 334 var messageHeaderSize = this.decoder.read32(); |
371 this.payloadSize = message.memory.length - messageHeaderSize; | 335 this.payloadSize = message.memory.length - messageHeaderSize; |
372 var numFields = this.decoder.read32(); | 336 var numberOfFields = this.decoder.read32(); |
| 337 // TODO: better handling of messages of different size. |
373 this.messageName = this.decoder.read32(); | 338 this.messageName = this.decoder.read32(); |
374 this.flags = this.decoder.read32(); | 339 var flags = this.decoder.read32(); |
375 if (numFields >= 3) | |
376 this.requestID = this.decoder.read64(); | |
377 this.decoder.skip(messageHeaderSize - this.decoder.next); | |
378 } | 340 } |
379 | 341 |
380 MessageReader.prototype.decodeStruct = function(cls) { | 342 MessageReader.prototype.decodeStruct = function(cls) { |
381 return cls.decode(this.decoder); | 343 return cls.decode(this.decoder); |
382 }; | 344 }; |
383 | 345 |
384 // Built-in types ----------------------------------------------------------- | 346 // Built-in types ----------------------------------------------------------- |
385 | 347 |
386 function Uint8() { | 348 function Uint8() { |
387 } | 349 } |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
480 }; | 442 }; |
481 | 443 |
482 Handle.encode = function(encoder, val) { | 444 Handle.encode = function(encoder, val) { |
483 encoder.encodeHandle(val); | 445 encoder.encodeHandle(val); |
484 }; | 446 }; |
485 | 447 |
486 var exports = {}; | 448 var exports = {}; |
487 exports.align = align; | 449 exports.align = align; |
488 exports.Message = Message; | 450 exports.Message = Message; |
489 exports.MessageBuilder = MessageBuilder; | 451 exports.MessageBuilder = MessageBuilder; |
490 exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder; | |
491 exports.MessageReader = MessageReader; | 452 exports.MessageReader = MessageReader; |
492 exports.kArrayHeaderSize = kArrayHeaderSize; | 453 exports.kArrayHeaderSize = kArrayHeaderSize; |
493 exports.kStructHeaderSize = kStructHeaderSize; | 454 exports.kStructHeaderSize = kStructHeaderSize; |
494 exports.kMessageHeaderSize = kMessageHeaderSize; | 455 exports.kMessageHeaderSize = kMessageHeaderSize; |
495 exports.kMessageExpectsResponse = kMessageExpectsResponse; | |
496 exports.kMessageIsResponse = kMessageIsResponse; | |
497 exports.Uint8 = Uint8; | 456 exports.Uint8 = Uint8; |
498 exports.Uint16 = Uint16; | 457 exports.Uint16 = Uint16; |
499 exports.Uint32 = Uint32; | 458 exports.Uint32 = Uint32; |
500 exports.Uint64 = Uint64; | 459 exports.Uint64 = Uint64; |
501 exports.PointerTo = PointerTo; | 460 exports.PointerTo = PointerTo; |
502 exports.ArrayOf = ArrayOf; | 461 exports.ArrayOf = ArrayOf; |
503 exports.Handle = Handle; | 462 exports.Handle = Handle; |
504 return exports; | 463 return exports; |
505 }); | 464 }); |
OLD | NEW |