Field = function(type, value) { this.type = type; this.value = value; }; Field.prototype.length = function() { return calcLength(this.type, this.value); }; Field.prototype.write = function(stream) { stream.write(this.type, this.value); }; Field.prototype.isNumeric = function() { return false; }; BufferField = function(buffer, start, length) { Field.call(this, C.TYPE_BUFFER, buffer); this.bufferLength = length; this.bufferStart = start; }; util.inherits(BufferField, Field); BufferField.prototype.length = function() { return this.bufferLength; }; BufferField.prototype.write = function(stream) { stream.writeRawBuffer(this.value, this.bufferStart, this.bufferLength); }; StringField = function(str) { Field.call(this, C.TYPE_ASCII, typeof str == 'string' ? str : ''); }; util.inherits(StringField, Field); FilledField = function(value, length) { Field.call(this, C.TYPE_COMPOSITE, value); this.fillLength = length; }; util.inherits(FilledField, Field); FilledField.prototype.length = function() { return this.fillLength; }; FilledField.prototype.write = function(stream) { var len = this.value.length; if (len < this.fillLength && len >= 0) { if (len > 0) stream.write(C.TYPE_ASCII, this.value); var zeroLength = this.fillLength - len; stream.write(C.TYPE_HEX, '20'.repeat(zeroLength)); } else if (len == this.fillLength) { stream.write(C.TYPE_ASCII, this.value); } else { throw 'Length mismatch'; } }; HexField = function(hex) { Field.call(this, C.TYPE_HEX, hex); }; util.inherits(HexField, Field); ReservedField = function(length) { length = length || 1; Field.call(this, C.TYPE_HEX, '00'.repeat(length)); }; util.inherits(ReservedField, Field); UInt8Field = function(value) { Field.call(this, C.TYPE_UINT8, value); }; util.inherits(UInt8Field, Field); UInt8Field.prototype.isNumeric = function() { return true; }; UInt16Field = function(value) { Field.call(this, C.TYPE_UINT16, value); }; util.inherits(UInt16Field, Field); UInt16Field.prototype.isNumeric = function() { return true; }; UInt32Field = function(value) { Field.call(this, C.TYPE_UINT32, value); }; util.inherits(UInt32Field, Field); UInt32Field.prototype.isNumeric = function() { return true; }; Int8Field = function(value) { Field.call(this, C.TYPE_INT8, value); }; util.inherits(Int8Field, Field); Int8Field.prototype.isNumeric = function() { return true; }; Int16Field = function(value) { Field.call(this, C.TYPE_INT16, value); }; util.inherits(Int16Field, Field); Int16Field.prototype.isNumeric = function() { return true; }; Int32Field = function(value) { Field.call(this, C.TYPE_INT32, value); }; util.inherits(Int32Field, Field); Int32Field.prototype.isNumeric = function() { return true; }; FloatField = function(value) { Field.call(this, C.TYPE_FLOAT, value); }; util.inherits(FloatField, Field); FloatField.prototype.isNumeric = function() { return true; }; DoubleField = function(value) { Field.call(this, C.TYPE_DOUBLE, value); }; util.inherits(DoubleField, Field); DoubleField.prototype.isNumeric = function() { return true; };