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