99 lines
3.1 KiB
JavaScript
99 lines
3.1 KiB
JavaScript
/*jslint browser: true, devel: true, bitwise: false, debug: true, eqeq: false, es5: true, evil: false, forin: false, newcap: false, nomen: true, plusplus: true, regexp: false, unparam: false, sloppy: true, stupid: false, sub: false, todo: true, vars: true, white: true */
|
|
|
|
function DOMBufferStream(arrayBuffer, offset, length, bigEndian, global, parentOffset) {
|
|
this.global = global;
|
|
offset = offset || 0;
|
|
length = length || (arrayBuffer.byteLength - offset);
|
|
this.arrayBuffer = arrayBuffer.slice(offset, offset + length);
|
|
this.view = new global.DataView(this.arrayBuffer, 0, this.arrayBuffer.byteLength);
|
|
this.setBigEndian(bigEndian);
|
|
this.offset = 0;
|
|
this.parentOffset = (parentOffset || 0) + offset;
|
|
}
|
|
|
|
DOMBufferStream.prototype = {
|
|
setBigEndian: function(bigEndian) {
|
|
this.littleEndian = !bigEndian;
|
|
},
|
|
nextUInt8: function() {
|
|
var value = this.view.getUint8(this.offset);
|
|
this.offset += 1;
|
|
return value;
|
|
},
|
|
nextInt8: function() {
|
|
var value = this.view.getInt8(this.offset);
|
|
this.offset += 1;
|
|
return value;
|
|
},
|
|
nextUInt16: function() {
|
|
var value = this.view.getUint16(this.offset, this.littleEndian);
|
|
this.offset += 2;
|
|
return value;
|
|
},
|
|
nextUInt32: function() {
|
|
var value = this.view.getUint32(this.offset, this.littleEndian);
|
|
this.offset += 4;
|
|
return value;
|
|
},
|
|
nextInt16: function() {
|
|
var value = this.view.getInt16(this.offset, this.littleEndian);
|
|
this.offset += 2;
|
|
return value;
|
|
},
|
|
nextInt32: function() {
|
|
var value = this.view.getInt32(this.offset, this.littleEndian);
|
|
this.offset += 4;
|
|
return value;
|
|
},
|
|
nextFloat: function() {
|
|
var value = this.view.getFloat32(this.offset, this.littleEndian);
|
|
this.offset += 4;
|
|
return value;
|
|
},
|
|
nextDouble: function() {
|
|
var value = this.view.getFloat64(this.offset, this.littleEndian);
|
|
this.offset += 8;
|
|
return value;
|
|
},
|
|
nextBuffer: function(length) {
|
|
//this won't work in IE10
|
|
var value = this.arrayBuffer.slice(this.offset, this.offset + length);
|
|
this.offset += length;
|
|
return value;
|
|
},
|
|
remainingLength: function() {
|
|
return this.arrayBuffer.byteLength - this.offset;
|
|
},
|
|
nextString: function(length) {
|
|
var value = this.arrayBuffer.slice(this.offset, this.offset + length);
|
|
value = String.fromCharCode.apply(null, new this.global.Uint8Array(value));
|
|
this.offset += length;
|
|
return value;
|
|
},
|
|
mark: function() {
|
|
var self = this;
|
|
return {
|
|
openWithOffset: function(offset) {
|
|
offset = (offset || 0) + this.offset;
|
|
return new DOMBufferStream(self.arrayBuffer, offset, self.arrayBuffer.byteLength - offset, !self.littleEndian, self.global, self.parentOffset);
|
|
},
|
|
offset: this.offset,
|
|
getParentOffset: function() {
|
|
return self.parentOffset;
|
|
}
|
|
};
|
|
},
|
|
offsetFrom: function(marker) {
|
|
return this.parentOffset + this.offset - (marker.offset + marker.getParentOffset());
|
|
},
|
|
skip: function(amount) {
|
|
this.offset += amount;
|
|
},
|
|
branch: function(offset, length) {
|
|
length = typeof length === 'number' ? length : this.arrayBuffer.byteLength - (this.offset + offset);
|
|
return new DOMBufferStream(this.arrayBuffer, this.offset + offset, length, !this.littleEndian, this.global, this.parentOffset);
|
|
}
|
|
};
|
|
|
|
module.exports = DOMBufferStream;
|