ohif-viewer/Packages/dimseservice/server/RWStream.js
2016-02-09 17:49:20 -06:00

229 lines
7.3 KiB
JavaScript
Executable File

var isString = function(type) {
if (type == C.TYPE_ASCII || type == C.TYPE_HEX) {
return true;
} else return false;
};
calcLength = function(type, value) {
var size = NaN;
switch (type) {
case C.TYPE_HEX : size = Buffer.byteLength(value, 'hex'); break;
case C.TYPE_ASCII : size = Buffer.byteLength(value, 'ascii'); break;
case C.TYPE_UINT8 : size = 1; break;
case C.TYPE_UINT16 : size = 2; break;
case C.TYPE_UINT32 : size = 4; break;
case C.TYPE_FLOAT : size = 4; break;
case C.TYPE_DOUBLE : size = 8; break;
case C.TYPE_INT8 : size = 1; break;
case C.TYPE_INT16 : size = 2; break;
case C.TYPE_INT32 : size = 4; break;
default :break;
}
return size;
}
var RWStream = function() {
this.endian = C.BIG_ENDIAN;
};
RWStream.prototype.setEndian = function(endian) {
this.endian = endian;
}
RWStream.prototype.getEncoding = function(type) {
return RWStream.encodings[type];
}
RWStream.prototype.getWriteType = function(type) {
return RWStream.writes[this.endian][type];
}
RWStream.prototype.getReadType = function(type) {
return RWStream.reads[this.endian][type];
}
WriteStream = function() {
RWStream.call(this);
this.defaultBufferSize = 512; //512 bytes
this.rawBuffer = new Buffer(this.defaultBufferSize);
this.offset = 0;
this.contentSize = 0;
}
util.inherits(WriteStream, RWStream);
WriteStream.prototype.increment = function(add) {
this.offset += add;
if (this.offset > this.contentSize) {
this.contentSize = this.offset;
}
}
WriteStream.prototype.size = function() {
return this.contentSize;
}
WriteStream.prototype.skip = function(amount) {
this.increment(amount);
}
WriteStream.prototype.checkSize = function(length) {
if (this.offset + length > this.rawBuffer.length) {
// we need more size, copying old one to new buffer
var oldLength = this.rawBuffer.length,
newBuffer = new Buffer(oldLength + length + (oldLength / 2));
this.rawBuffer.copy(newBuffer, 0, 0, this.contentSize);
this.rawBuffer = newBuffer;
}
}
WriteStream.prototype.writeToBuffer = function(type, value, length) {
if (value === "" || value === null) return;
this.checkSize(length);
this.rawBuffer[this.getWriteType(type)](value, this.offset);
this.increment(length);
}
WriteStream.prototype.write = function(type, value) {
if (isString(type)) {
this.writeString(value, type);
} else {
this.writeToBuffer(type, value, calcLength(type));
}
}
WriteStream.prototype.writeString = function(string, type) {
var encoding = this.getEncoding(type), length = Buffer.byteLength(string, encoding);
this.rawBuffer.write(string, this.offset, length, encoding);
this.increment(length);
}
WriteStream.prototype.buffer = function() {
return this.rawBuffer.slice(0, this.contentSize);
}
WriteStream.prototype.toReadBuffer = function() {
return new ReadStream(this.buffer());
}
WriteStream.prototype.concat = function(newStream) {
var newSize = this.size() + newStream.size();
this.rawBuffer = Buffer.concat([this.buffer(), newStream.buffer()], newSize);
this.contentSize = newSize;
this.offset = newSize;
}
ReadStream = function(buffer) {
RWStream.call(this);
this.rawBuffer = buffer;
this.offset = 0;
};
util.inherits(ReadStream, RWStream);
ReadStream.prototype.size = function() {
return this.rawBuffer.length;
}
ReadStream.prototype.increment = function(add) {
this.offset += add;
}
ReadStream.prototype.more = function(length) {
var newBuf = this.rawBuffer.slice(this.offset, this.offset + length);
this.increment(length);
return new ReadStream(newBuf);
}
ReadStream.prototype.reset = function() {
this.offset = 0;
return this;
}
ReadStream.prototype.end = function() {
return this.offset >= this.size();
}
ReadStream.prototype.readFromBuffer = function(type, length) {
//this.checkSize(length);
//if (this.offset + length > this.rawBuffer.length) throw ("out of bound " + this.offset + "," + length + "," + this.rawBuffer.length);
var value = this.rawBuffer[this.getReadType(type)](this.offset);
this.increment(length);
return value;
}
ReadStream.prototype.read = function(type, length) {
var value = null;
if (isString(type)) {
value = this.readString(length, type);
} else {
value = this.readFromBuffer(type, calcLength(type));
}
return value;
}
ReadStream.prototype.readString = function(length, type) {
var encoding = this.getEncoding(type),
str = this.rawBuffer.toString(encoding, this.offset, this.offset + length);
this.increment(length);
return str;
}
ReadStream.prototype.buffer = function() {
return this.rawBuffer;
}
ReadStream.prototype.concat = function(newStream) {
var newSize = this.size() + newStream.size();
this.rawBuffer = Buffer.concat([this.buffer(), newStream.buffer()], newSize);
this.contentSize = newSize;
this.offset = newSize;
}
RWStream.writes = {};
RWStream.writes[C.BIG_ENDIAN] = {};
RWStream.writes[C.BIG_ENDIAN][C.TYPE_UINT8] = "writeUInt8";
RWStream.writes[C.BIG_ENDIAN][C.TYPE_UINT16] = "writeUInt16BE";
RWStream.writes[C.BIG_ENDIAN][C.TYPE_UINT32] = "writeUInt32BE";
RWStream.writes[C.BIG_ENDIAN][C.TYPE_INT8] = "writeInt8";
RWStream.writes[C.BIG_ENDIAN][C.TYPE_INT16] = "writeInt16BE";
RWStream.writes[C.BIG_ENDIAN][C.TYPE_INT32] = "writeInt32BE";
RWStream.writes[C.BIG_ENDIAN][C.TYPE_FLOAT] = "writeFloatBE";
RWStream.writes[C.BIG_ENDIAN][C.TYPE_DOUBLE] = "writeDoubleBE";
RWStream.writes[C.LITTLE_ENDIAN] = {};
RWStream.writes[C.LITTLE_ENDIAN][C.TYPE_UINT8] = "writeUInt8";
RWStream.writes[C.LITTLE_ENDIAN][C.TYPE_UINT16] = "writeUInt16LE";
RWStream.writes[C.LITTLE_ENDIAN][C.TYPE_UINT32] = "writeUInt32LE";
RWStream.writes[C.LITTLE_ENDIAN][C.TYPE_INT8] = "writeInt8";
RWStream.writes[C.LITTLE_ENDIAN][C.TYPE_INT16] = "writeInt16LE";
RWStream.writes[C.LITTLE_ENDIAN][C.TYPE_INT32] = "writeInt32LE";
RWStream.writes[C.LITTLE_ENDIAN][C.TYPE_FLOAT] = "writeFloatLE";
RWStream.writes[C.LITTLE_ENDIAN][C.TYPE_DOUBLE] = "writeDoubleLE";
RWStream.reads = {};
RWStream.reads[C.BIG_ENDIAN] = {};
RWStream.reads[C.BIG_ENDIAN][C.TYPE_UINT8] = "readUInt8";
RWStream.reads[C.BIG_ENDIAN][C.TYPE_UINT16] = "readUInt16BE";
RWStream.reads[C.BIG_ENDIAN][C.TYPE_UINT32] = "readUInt32BE";
RWStream.reads[C.BIG_ENDIAN][C.TYPE_INT8] = "readInt8";
RWStream.reads[C.BIG_ENDIAN][C.TYPE_INT16] = "readInt16BE";
RWStream.reads[C.BIG_ENDIAN][C.TYPE_INT32] = "readInt32BE";
RWStream.reads[C.BIG_ENDIAN][C.TYPE_FLOAT] = "readFloatBE";
RWStream.reads[C.BIG_ENDIAN][C.TYPE_DOUBLE] = "readDoubleBE";
RWStream.reads[C.LITTLE_ENDIAN] = {};
RWStream.reads[C.LITTLE_ENDIAN][C.TYPE_UINT8] = "readUInt8";
RWStream.reads[C.LITTLE_ENDIAN][C.TYPE_UINT16] = "readUInt16LE";
RWStream.reads[C.LITTLE_ENDIAN][C.TYPE_UINT32] = "readUInt32LE";
RWStream.reads[C.LITTLE_ENDIAN][C.TYPE_INT8] = "readInt8";
RWStream.reads[C.LITTLE_ENDIAN][C.TYPE_INT16] = "readInt16LE";
RWStream.reads[C.LITTLE_ENDIAN][C.TYPE_INT32] = "readInt32LE";
RWStream.reads[C.LITTLE_ENDIAN][C.TYPE_FLOAT] = "readFloatLE";
RWStream.reads[C.LITTLE_ENDIAN][C.TYPE_DOUBLE] = "readDoubleLE";
RWStream.encodings = {};
RWStream.encodings[C.TYPE_HEX] = "hex";
RWStream.encodings[C.TYPE_ASCII] = "ascii";