| 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"; |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 var base = this.next; | 128 var base = this.next; |
| 129 this.next += numberOfElements; | 129 this.next += numberOfElements; |
| 130 return unicode.decodeUtf8String( | 130 return unicode.decodeUtf8String( |
| 131 new Uint8Array(this.buffer.arrayBuffer, base, numberOfElements)); | 131 new Uint8Array(this.buffer.arrayBuffer, base, numberOfElements)); |
| 132 }; | 132 }; |
| 133 | 133 |
| 134 Decoder.prototype.decodeArray = function(cls) { | 134 Decoder.prototype.decodeArray = function(cls) { |
| 135 var numberOfBytes = this.readUint32(); | 135 var numberOfBytes = this.readUint32(); |
| 136 var numberOfElements = this.readUint32(); | 136 var numberOfElements = this.readUint32(); |
| 137 var val = new Array(numberOfElements); | 137 var val = new Array(numberOfElements); |
| 138 for (var i = 0; i < numberOfElements; ++i) { | 138 if (cls.cls === PackedBool) { |
| 139 val[i] = cls.decode(this); | 139 var byte; |
| 140 for (var i = 0; i < numberOfElements; ++i) { |
| 141 if (i % 8 === 0) |
| 142 byte = this.readUint8(); |
| 143 val[i] = (byte & (1 << i % 8)) ? true : false; |
| 144 } |
| 145 } else { |
| 146 for (var i = 0; i < numberOfElements; ++i) { |
| 147 val[i] = cls.decode(this); |
| 148 } |
| 140 } | 149 } |
| 141 return val; | 150 return val; |
| 142 }; | 151 }; |
| 143 | |
| 144 Decoder.prototype.decodeBoolArray = function() { | |
| 145 var numberOfBytes = this.readUint32(); | |
| 146 var numberOfElements = this.readUint32(); | |
| 147 | |
| 148 var val = new Array(numberOfElements); | |
| 149 var byte; | |
| 150 for (var i = 0; i < numberOfElements; ++i) { | |
| 151 if (i % 8 === 0) | |
| 152 byte = this.readUint8(); | |
| 153 val[i] = (byte & (1 << i % 8)) ? true : false; | |
| 154 } | |
| 155 return val; | |
| 156 }; | |
| 157 | 152 |
| 158 Decoder.prototype.decodeStruct = function(cls) { | 153 Decoder.prototype.decodeStruct = function(cls) { |
| 159 return cls.decode(this); | 154 return cls.decode(this); |
| 160 }; | 155 }; |
| 161 | 156 |
| 162 Decoder.prototype.decodeStructPointer = function(cls) { | 157 Decoder.prototype.decodeStructPointer = function(cls) { |
| 163 var pointer = this.decodePointer(); | 158 var pointer = this.decodePointer(); |
| 164 if (!pointer) { | 159 if (!pointer) { |
| 165 return null; | 160 return null; |
| 166 } | 161 } |
| 167 return cls.decode(this.decodeAndCreateDecoder(pointer)); | 162 return cls.decode(this.decodeAndCreateDecoder(pointer)); |
| 168 }; | 163 }; |
| 169 | 164 |
| 170 Decoder.prototype.decodeArrayPointer = function(cls) { | 165 Decoder.prototype.decodeArrayPointer = function(cls) { |
| 171 var pointer = this.decodePointer(); | 166 var pointer = this.decodePointer(); |
| 172 if (!pointer) { | 167 if (!pointer) { |
| 173 return null; | 168 return null; |
| 174 } | 169 } |
| 175 return this.decodeAndCreateDecoder(pointer).decodeArray(cls); | 170 return this.decodeAndCreateDecoder(pointer).decodeArray(cls); |
| 176 }; | 171 }; |
| 177 | 172 |
| 178 Decoder.prototype.decodeBoolArrayPointer = function() { | |
| 179 var pointer = this.decodePointer(); | |
| 180 if (!pointer) { | |
| 181 return null; | |
| 182 } | |
| 183 return this.decodeAndCreateDecoder(pointer).decodeBoolArray(); | |
| 184 }; | |
| 185 | |
| 186 Decoder.prototype.decodeStringPointer = function() { | 173 Decoder.prototype.decodeStringPointer = function() { |
| 187 var pointer = this.decodePointer(); | 174 var pointer = this.decodePointer(); |
| 188 if (!pointer) { | 175 if (!pointer) { |
| 189 return null; | 176 return null; |
| 190 } | 177 } |
| 191 return this.decodeAndCreateDecoder(pointer).decodeString(); | 178 return this.decodeAndCreateDecoder(pointer).decodeString(); |
| 192 }; | 179 }; |
| 193 | 180 |
| 194 // Encoder ------------------------------------------------------------------ | 181 // Encoder ------------------------------------------------------------------ |
| 195 | 182 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 Encoder.prototype.encodeString = function(val) { | 276 Encoder.prototype.encodeString = function(val) { |
| 290 var base = this.next + kArrayHeaderSize; | 277 var base = this.next + kArrayHeaderSize; |
| 291 var numberOfElements = unicode.encodeUtf8String( | 278 var numberOfElements = unicode.encodeUtf8String( |
| 292 val, new Uint8Array(this.buffer.arrayBuffer, base)); | 279 val, new Uint8Array(this.buffer.arrayBuffer, base)); |
| 293 var numberOfBytes = kArrayHeaderSize + numberOfElements; | 280 var numberOfBytes = kArrayHeaderSize + numberOfElements; |
| 294 this.writeUint32(numberOfBytes); | 281 this.writeUint32(numberOfBytes); |
| 295 this.writeUint32(numberOfElements); | 282 this.writeUint32(numberOfElements); |
| 296 this.next += numberOfElements; | 283 this.next += numberOfElements; |
| 297 }; | 284 }; |
| 298 | 285 |
| 299 Encoder.prototype.encodeArray = function(cls, val, numberOfElements) { | 286 Encoder.prototype.encodeArray = |
| 287 function(cls, val, numberOfElements, encodedSize) { |
| 300 if (numberOfElements === undefined) | 288 if (numberOfElements === undefined) |
| 301 numberOfElements = val.length; | 289 numberOfElements = val.length; |
| 302 var numberOfBytes = kArrayHeaderSize + cls.encodedSize * val.length; | 290 if (encodedSize === undefined) |
| 303 this.writeUint32(numberOfBytes); | 291 encodedSize = kArrayHeaderSize + cls.encodedSize * numberOfElements; |
| 292 |
| 293 this.writeUint32(encodedSize); |
| 304 this.writeUint32(numberOfElements); | 294 this.writeUint32(numberOfElements); |
| 305 for (var i = 0; i < val.length; ++i) { | 295 |
| 306 cls.encode(this, val[i]); | 296 if (cls.cls === PackedBool) { |
| 297 var byte = 0; |
| 298 for (i = 0; i < numberOfElements; ++i) { |
| 299 if (val[i]) |
| 300 byte |= (1 << i % 8); |
| 301 if (i % 8 === 7 || i == numberOfElements - 1) { |
| 302 Uint8.encode(this, byte); |
| 303 byte = 0; |
| 304 } |
| 305 } |
| 306 } else { |
| 307 for (var i = 0; i < numberOfElements; ++i) |
| 308 cls.encode(this, val[i]); |
| 307 } | 309 } |
| 308 }; | 310 }; |
| 309 | 311 |
| 310 Encoder.prototype.encodeStruct = function(cls, val) { | 312 Encoder.prototype.encodeStruct = function(cls, val) { |
| 311 return cls.encode(this, val); | 313 return cls.encode(this, val); |
| 312 }; | 314 }; |
| 313 | 315 |
| 314 Encoder.prototype.encodeStructPointer = function(cls, val) { | 316 Encoder.prototype.encodeStructPointer = function(cls, val) { |
| 315 if (!val) { | 317 if (!val) { |
| 316 this.encodePointer(val); | 318 this.encodePointer(val); |
| 317 return; | 319 return; |
| 318 } | 320 } |
| 319 var encoder = this.createAndEncodeEncoder(cls.encodedSize); | 321 var encoder = this.createAndEncodeEncoder(cls.encodedSize); |
| 320 cls.encode(encoder, val); | 322 cls.encode(encoder, val); |
| 321 }; | 323 }; |
| 322 | 324 |
| 323 Encoder.prototype.encodeArrayPointer = function(cls, val) { | 325 Encoder.prototype.encodeArrayPointer = function(cls, val) { |
| 324 if (!val) { | 326 if (!val) { |
| 325 this.encodePointer(val); | 327 this.encodePointer(val); |
| 326 return; | 328 return; |
| 327 } | 329 } |
| 328 var encodedSize = kArrayHeaderSize + cls.encodedSize * val.length; | |
| 329 var encoder = this.createAndEncodeEncoder(encodedSize); | |
| 330 encoder.encodeArray(cls, val); | |
| 331 }; | |
| 332 | |
| 333 Encoder.prototype.encodeBoolArrayPointer = function(val) { | |
| 334 if (!val) { | |
| 335 this.encodePointer(val); | |
| 336 return; | |
| 337 } | |
| 338 var numberOfElements = val.length; | 330 var numberOfElements = val.length; |
| 339 var encodedSize = kArrayHeaderSize + Math.ceil(numberOfElements / 8); | 331 var encodedSize = kArrayHeaderSize + ((cls.cls === PackedBool) ? |
| 332 Math.ceil(numberOfElements / 8) : cls.encodedSize * numberOfElements); |
| 340 var encoder = this.createAndEncodeEncoder(encodedSize); | 333 var encoder = this.createAndEncodeEncoder(encodedSize); |
| 341 | 334 encoder.encodeArray(cls, val, numberOfElements, encodedSize); |
| 342 var bits = new Uint8Array(Math.ceil(numberOfElements / 8)); | |
| 343 for (var i = 0; i < numberOfElements; i++) { | |
| 344 if (val[i]) | |
| 345 bits[Math.floor(i / 8)] |= (1 << i % 8); | |
| 346 } | |
| 347 encoder.encodeArray(Uint8, bits, numberOfElements); | |
| 348 }; | 335 }; |
| 349 | 336 |
| 350 Encoder.prototype.encodeStringPointer = function(val) { | 337 Encoder.prototype.encodeStringPointer = function(val) { |
| 351 if (!val) { | 338 if (!val) { |
| 352 this.encodePointer(val); | 339 this.encodePointer(val); |
| 353 return; | 340 return; |
| 354 } | 341 } |
| 355 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); | 342 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); |
| 356 var encoder = this.createAndEncodeEncoder(encodedSize); | 343 var encoder = this.createAndEncodeEncoder(encodedSize); |
| 357 encoder.encodeString(val); | 344 encoder.encodeString(val); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 this.requestID = this.decoder.readUint64(); | 455 this.requestID = this.decoder.readUint64(); |
| 469 this.decoder.skip(messageHeaderSize - this.decoder.next); | 456 this.decoder.skip(messageHeaderSize - this.decoder.next); |
| 470 } | 457 } |
| 471 | 458 |
| 472 MessageReader.prototype.decodeStruct = function(cls) { | 459 MessageReader.prototype.decodeStruct = function(cls) { |
| 473 return cls.decode(this.decoder); | 460 return cls.decode(this.decoder); |
| 474 }; | 461 }; |
| 475 | 462 |
| 476 // Built-in types ----------------------------------------------------------- | 463 // Built-in types ----------------------------------------------------------- |
| 477 | 464 |
| 465 // This type is only used with ArrayOf(PackedBool). |
| 466 function PackedBool() { |
| 467 } |
| 468 |
| 478 function Int8() { | 469 function Int8() { |
| 479 } | 470 } |
| 480 | 471 |
| 481 Int8.encodedSize = 1; | 472 Int8.encodedSize = 1; |
| 482 | 473 |
| 483 Int8.decode = function(decoder) { | 474 Int8.decode = function(decoder) { |
| 484 return decoder.readInt8(); | 475 return decoder.readInt8(); |
| 485 }; | 476 }; |
| 486 | 477 |
| 487 Int8.encode = function(encoder, val) { | 478 Int8.encode = function(encoder, val) { |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 653 ArrayOf.prototype.encodedSize = 8; | 644 ArrayOf.prototype.encodedSize = 8; |
| 654 | 645 |
| 655 ArrayOf.prototype.decode = function(decoder) { | 646 ArrayOf.prototype.decode = function(decoder) { |
| 656 return decoder.decodeArrayPointer(this.cls); | 647 return decoder.decodeArrayPointer(this.cls); |
| 657 }; | 648 }; |
| 658 | 649 |
| 659 ArrayOf.prototype.encode = function(encoder, val) { | 650 ArrayOf.prototype.encode = function(encoder, val) { |
| 660 encoder.encodeArrayPointer(this.cls, val); | 651 encoder.encodeArrayPointer(this.cls, val); |
| 661 }; | 652 }; |
| 662 | 653 |
| 663 function ArrayOfBoolArrayPointers() { | |
| 664 } | |
| 665 | |
| 666 ArrayOfBoolArrayPointers.prototype.encodedSize = 8; | |
| 667 | |
| 668 ArrayOfBoolArrayPointers.prototype.decode = function(decoder) { | |
| 669 return decoder.decodeBoolArrayPointer(); | |
| 670 }; | |
| 671 | |
| 672 ArrayOfBoolArrayPointers.prototype.encode = function(encoder, val) { | |
| 673 encoder.encodeBoolArrayPointer(val); | |
| 674 }; | |
| 675 | |
| 676 function Handle() { | 654 function Handle() { |
| 677 } | 655 } |
| 678 | 656 |
| 679 Handle.encodedSize = 4; | 657 Handle.encodedSize = 4; |
| 680 | 658 |
| 681 Handle.decode = function(decoder) { | 659 Handle.decode = function(decoder) { |
| 682 return decoder.decodeHandle(); | 660 return decoder.decodeHandle(); |
| 683 }; | 661 }; |
| 684 | 662 |
| 685 Handle.encode = function(encoder, val) { | 663 Handle.encode = function(encoder, val) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 705 exports.Uint16 = Uint16; | 683 exports.Uint16 = Uint16; |
| 706 exports.Int32 = Int32; | 684 exports.Int32 = Int32; |
| 707 exports.Uint32 = Uint32; | 685 exports.Uint32 = Uint32; |
| 708 exports.Int64 = Int64; | 686 exports.Int64 = Int64; |
| 709 exports.Uint64 = Uint64; | 687 exports.Uint64 = Uint64; |
| 710 exports.Float = Float; | 688 exports.Float = Float; |
| 711 exports.Double = Double; | 689 exports.Double = Double; |
| 712 exports.String = String; | 690 exports.String = String; |
| 713 exports.PointerTo = PointerTo; | 691 exports.PointerTo = PointerTo; |
| 714 exports.ArrayOf = ArrayOf; | 692 exports.ArrayOf = ArrayOf; |
| 715 exports.ArrayOfBoolArrayPointers = ArrayOfBoolArrayPointers; | 693 exports.PackedBool = PackedBool; |
| 716 exports.Handle = Handle; | 694 exports.Handle = Handle; |
| 717 return exports; | 695 return exports; |
| 718 }); | 696 }); |
| OLD | NEW |