From dd018257e73d9e5c57938b1e15c7ccc0f2fff4b8 Mon Sep 17 00:00:00 2001 From: Frank Wuerthwein Date: Fri, 6 Feb 2009 23:05:27 +0000 Subject: BinaryFile over XMLHttpRequest --- src/lib/binaryXHR.js | 232 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 src/lib/binaryXHR.js (limited to 'src/lib/binaryXHR.js') diff --git a/src/lib/binaryXHR.js b/src/lib/binaryXHR.js new file mode 100644 index 0000000..14d06fe --- /dev/null +++ b/src/lib/binaryXHR.js @@ -0,0 +1,232 @@ + +/* + * BinaryFile over XMLHttpRequest + * Part of the javascriptRRD package + * Copyright (c) 2009 Frank Wuerthwein, fkw@ucsd.edu + * MIT License [http://www.opensource.org/licenses/mit-license.php] + * + * Original repository: http://javascriptrrd.sourceforge.net/ + * + * Based on: + * Binary Ajax 0.1.5 + * Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com, http://blog.nihilogic.dk/ + * MIT License [http://www.opensource.org/licenses/mit-license.php] + */ + +// ============================================================ +// Exception class +function InvalidBinaryFile(msg) { + this.message=msg; + this.name="Invalid BinaryFile"; +} + +// pretty print +InvalidBinaryFile.prototype.toString = function() { + return this.name + ': "' + this.message + '"'; +} + +// ===================================================================== +// BinaryFile class +// Allows access to element inside a binary stream +function BinaryFile(strData, iDataOffset, iDataLength) { + var data = strData; + var dataOffset = iDataOffset || 0; + var dataLength = 0; + // added + var doubleMantExpHi=Math.pow(2,-28); + var doubleMantExpLo=Math.pow(2,-52); + var doubleMantExpFast=Math.pow(2,-20); + + this.getRawData = function() { + return data; + } + + if (typeof strData == "string") { + dataLength = iDataLength || data.length; + + this.getByteAt = function(iOffset) { + return data.charCodeAt(iOffset + dataOffset) & 0xFF; + } + } else if (typeof strData == "unknown") { + dataLength = iDataLength || IEBinary_getLength(data); + + this.getByteAt = function(iOffset) { + return IEBinary_getByteAt(data, iOffset + dataOffset); + } + } else { + throw new InvalidBinaryFile("Unsupported type " + (typeof strData)); + } + + this.getLength = function() { + return dataLength; + } + + this.getSByteAt = function(iOffset) { + var iByte = this.getByteAt(iOffset); + if (iByte > 127) + return iByte - 256; + else + return iByte; + } + + this.getShortAt = function(iOffset, bBigEndian) { + var iShort = bBigEndian ? + (this.getByteAt(iOffset) << 8) + this.getByteAt(iOffset + 1) + : (this.getByteAt(iOffset + 1) << 8) + this.getByteAt(iOffset) + if (iShort < 0) iShort += 65536; + return iShort; + } + this.getSShortAt = function(iOffset, bBigEndian) { + var iUShort = this.getShortAt(iOffset, bBigEndian); + if (iUShort > 32767) + return iUShort - 65536; + else + return iUShort; + } + this.getLongAt = function(iOffset, bBigEndian) { + var iByte1 = this.getByteAt(iOffset), + iByte2 = this.getByteAt(iOffset + 1), + iByte3 = this.getByteAt(iOffset + 2), + iByte4 = this.getByteAt(iOffset + 3); + + var iLong = bBigEndian ? + (((((iByte1 << 8) + iByte2) << 8) + iByte3) << 8) + iByte4 + : (((((iByte4 << 8) + iByte3) << 8) + iByte2) << 8) + iByte1; + if (iLong < 0) iLong += 4294967296; + return iLong; + } + this.getSLongAt = function(iOffset, bBigEndian) { + var iULong = this.getLongAt(iOffset, bBigEndian); + if (iULong > 2147483647) + return iULong - 4294967296; + else + return iULong; + } + this.getStringAt = function(iOffset, iLength) { + var aStr = []; + for (var i=iOffset,j=0;i0);i++,j++) { + aStr[j] = String.fromCharCode(this.getByteAt(i)); + } + return aStr.join(""); + } + + // Added + this.getDoubleAt = function(iOffset) { + var iByte1 = this.getByteAt(iOffset), + iByte2 = this.getByteAt(iOffset + 1), + iByte3 = this.getByteAt(iOffset + 2), + iByte4 = this.getByteAt(iOffset + 3), + iByte5 = this.getByteAt(iOffset + 4), + iByte6 = this.getByteAt(iOffset + 5), + iByte7 = this.getByteAt(iOffset + 6), + iByte8 = this.getByteAt(iOffset + 7); + var iSign=iByte8 >> 7; + var iExpRaw=((iByte8 & 0x7F)<< 4) + (iByte7 >> 4); + var iMantHi=((((((iByte7 & 0x0F) << 8) + iByte6) << 8) + iByte5) << 8) + iByte4; + var iMantLo=((((iByte3) << 8) + iByte2) << 8) + iByte1; + + if (iExpRaw==0) return 0.0; + if (iExpRaw==0x7ff) return false; + + var iExp=(iExpRaw & 0x7FF)-1023; + + var dDouble = ((iSign==1)?-1:1)*Math.pow(2,iExp)*(1.0 + iMantLo*doubleMantExpLo + iMantHi*doubleMantExpHi); + return dDouble; + } + // added + // Extracts only 4 bytes out of 8, loosing in precision (20 bit mantissa) + this.getFastDoubleAt = function(iOffset) { + var iByte5 = this.getByteAt(iOffset + 4), + iByte6 = this.getByteAt(iOffset + 5), + iByte7 = this.getByteAt(iOffset + 6), + iByte8 = this.getByteAt(iOffset + 7); + var iSign=iByte8 >> 7; + var iExpRaw=((iByte8 & 0x7F)<< 4) + (iByte7 >> 4); + var iMant=((((iByte7 & 0x0F) << 8) + iByte6) << 8) + iByte5; + + if (iExpRaw==0) return 0.0; + if (iExpRaw==0x7ff) return false; + + var iExp=(iExpRaw & 0x7FF)-1023; + + var dDouble = ((iSign==1)?-1:1)*Math.pow(2,iExp)*(1.0 + iMant*doubleMantExpFast); + return dDouble; + } + + this.getCharAt = function(iOffset) { + return String.fromCharCode(this.getByteAt(iOffset)); + } +} + + +document.write( + "\r\n" +); + + + +// =============================================================== +// Load a binary file from the specified URL +// Will return an object of type BinaryFile +function FetchBinaryURL(url) { + var request = new XMLHttpRequest(); + request.open("GET", url,false); + try { + request.overrideMimeType('text/plain; charset=x-user-defined'); + } catch (err) { + // ignore any error, just to make both FF and IE work + } + request.send(null); + + var response=request.responseBody; + if (response==undefined){ // responseBody is non standard, but the only way to make it work in IE + response=request.responseText; + } + var bf=new BinaryFile(response); + return bf; +} + + +// =============================================================== +// Asyncronously load a binary file from the specified URL +// +// callback must be a function with a single argument: +// bf = an object of type BinaryFile +function FetchBinaryURLAsync(url, callback) { + var callback_wrapper = function() { + if(this.readyState == 4) { + var response=this.responseBody; + if (response==undefined){ // responseBody is non standard, but the only way to make it work in IE + response=this.responseText; + } + var bf=new BinaryFile(response); + callback(bf); + } + } + + var request = new XMLHttpRequest(); + request.onreadystatechange = callback_wrapper; + request.open("GET", url,true); + try { + request.overrideMimeType('text/plain; charset=x-user-defined'); + } catch (err) { + // ignore any error, just to make both FF and IE work + } + request.send(null); +} -- cgit v1.2.3