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 var i = 0; | |
299 for (; i < numberOfElements; ++i) { | |
300 if (i > 0 && i % 8 === 0) { | |
Matt Perry
2014/08/11 21:24:32
alternative: move this if to the end of the for st
hansmuller
2014/08/11 21:43:48
Excellent suggestion, that's much simpler.
| |
301 Uint8.encode(this, byte); | |
302 byte = 0; | |
303 } | |
304 if (val[i]) | |
305 byte |= (1 << i % 8); | |
306 } | |
307 if (i > 0 && (i - 1) % 8 != 0) | |
308 Uint8.encode(this, byte); | |
309 } else { | |
310 for (var i = 0; i < numberOfElements; ++i) | |
311 cls.encode(this, val[i]); | |
307 } | 312 } |
308 }; | 313 }; |
309 | 314 |
310 Encoder.prototype.encodeStruct = function(cls, val) { | 315 Encoder.prototype.encodeStruct = function(cls, val) { |
311 return cls.encode(this, val); | 316 return cls.encode(this, val); |
312 }; | 317 }; |
313 | 318 |
314 Encoder.prototype.encodeStructPointer = function(cls, val) { | 319 Encoder.prototype.encodeStructPointer = function(cls, val) { |
315 if (!val) { | 320 if (!val) { |
316 this.encodePointer(val); | 321 this.encodePointer(val); |
317 return; | 322 return; |
318 } | 323 } |
319 var encoder = this.createAndEncodeEncoder(cls.encodedSize); | 324 var encoder = this.createAndEncodeEncoder(cls.encodedSize); |
320 cls.encode(encoder, val); | 325 cls.encode(encoder, val); |
321 }; | 326 }; |
322 | 327 |
323 Encoder.prototype.encodeArrayPointer = function(cls, val) { | 328 Encoder.prototype.encodeArrayPointer = function(cls, val) { |
324 if (!val) { | 329 if (!val) { |
325 this.encodePointer(val); | 330 this.encodePointer(val); |
326 return; | 331 return; |
327 } | 332 } |
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; | 333 var numberOfElements = val.length; |
339 var encodedSize = kArrayHeaderSize + Math.ceil(numberOfElements / 8); | 334 var encodedSize = kArrayHeaderSize + ((cls.cls === PackedBool) ? |
335 Math.ceil(numberOfElements / 8) : cls.encodedSize * numberOfElements); | |
340 var encoder = this.createAndEncodeEncoder(encodedSize); | 336 var encoder = this.createAndEncodeEncoder(encodedSize); |
341 | 337 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 }; | 338 }; |
349 | 339 |
350 Encoder.prototype.encodeStringPointer = function(val) { | 340 Encoder.prototype.encodeStringPointer = function(val) { |
351 if (!val) { | 341 if (!val) { |
352 this.encodePointer(val); | 342 this.encodePointer(val); |
353 return; | 343 return; |
354 } | 344 } |
355 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); | 345 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); |
356 var encoder = this.createAndEncodeEncoder(encodedSize); | 346 var encoder = this.createAndEncodeEncoder(encodedSize); |
357 encoder.encodeString(val); | 347 encoder.encodeString(val); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
468 this.requestID = this.decoder.readUint64(); | 458 this.requestID = this.decoder.readUint64(); |
469 this.decoder.skip(messageHeaderSize - this.decoder.next); | 459 this.decoder.skip(messageHeaderSize - this.decoder.next); |
470 } | 460 } |
471 | 461 |
472 MessageReader.prototype.decodeStruct = function(cls) { | 462 MessageReader.prototype.decodeStruct = function(cls) { |
473 return cls.decode(this.decoder); | 463 return cls.decode(this.decoder); |
474 }; | 464 }; |
475 | 465 |
476 // Built-in types ----------------------------------------------------------- | 466 // Built-in types ----------------------------------------------------------- |
477 | 467 |
468 // This type is only used with ArrayOf(PackedBool). | |
469 function PackedBool() { | |
470 } | |
471 | |
478 function Int8() { | 472 function Int8() { |
479 } | 473 } |
480 | 474 |
481 Int8.encodedSize = 1; | 475 Int8.encodedSize = 1; |
482 | 476 |
483 Int8.decode = function(decoder) { | 477 Int8.decode = function(decoder) { |
484 return decoder.readInt8(); | 478 return decoder.readInt8(); |
485 }; | 479 }; |
486 | 480 |
487 Int8.encode = function(encoder, val) { | 481 Int8.encode = function(encoder, val) { |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
653 ArrayOf.prototype.encodedSize = 8; | 647 ArrayOf.prototype.encodedSize = 8; |
654 | 648 |
655 ArrayOf.prototype.decode = function(decoder) { | 649 ArrayOf.prototype.decode = function(decoder) { |
656 return decoder.decodeArrayPointer(this.cls); | 650 return decoder.decodeArrayPointer(this.cls); |
657 }; | 651 }; |
658 | 652 |
659 ArrayOf.prototype.encode = function(encoder, val) { | 653 ArrayOf.prototype.encode = function(encoder, val) { |
660 encoder.encodeArrayPointer(this.cls, val); | 654 encoder.encodeArrayPointer(this.cls, val); |
661 }; | 655 }; |
662 | 656 |
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() { | 657 function Handle() { |
677 } | 658 } |
678 | 659 |
679 Handle.encodedSize = 4; | 660 Handle.encodedSize = 4; |
680 | 661 |
681 Handle.decode = function(decoder) { | 662 Handle.decode = function(decoder) { |
682 return decoder.decodeHandle(); | 663 return decoder.decodeHandle(); |
683 }; | 664 }; |
684 | 665 |
685 Handle.encode = function(encoder, val) { | 666 Handle.encode = function(encoder, val) { |
(...skipping 19 matching lines...) Expand all Loading... | |
705 exports.Uint16 = Uint16; | 686 exports.Uint16 = Uint16; |
706 exports.Int32 = Int32; | 687 exports.Int32 = Int32; |
707 exports.Uint32 = Uint32; | 688 exports.Uint32 = Uint32; |
708 exports.Int64 = Int64; | 689 exports.Int64 = Int64; |
709 exports.Uint64 = Uint64; | 690 exports.Uint64 = Uint64; |
710 exports.Float = Float; | 691 exports.Float = Float; |
711 exports.Double = Double; | 692 exports.Double = Double; |
712 exports.String = String; | 693 exports.String = String; |
713 exports.PointerTo = PointerTo; | 694 exports.PointerTo = PointerTo; |
714 exports.ArrayOf = ArrayOf; | 695 exports.ArrayOf = ArrayOf; |
715 exports.ArrayOfBoolArrayPointers = ArrayOfBoolArrayPointers; | 696 exports.PackedBool = PackedBool; |
716 exports.Handle = Handle; | 697 exports.Handle = Handle; |
717 return exports; | 698 return exports; |
718 }); | 699 }); |
OLD | NEW |