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 |