diff options
-rw-r--r-- | binaryajax.js | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/binaryajax.js b/binaryajax.js new file mode 100644 index 0000000..f674d9c --- /dev/null +++ b/binaryajax.js @@ -0,0 +1,235 @@ + +/* + * 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] + */ + + +var BinaryFile = function(strData, iDataOffset, iDataLength) { + var data = strData; + var dataOffset = iDataOffset || 0; + var dataLength = 0; + + 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); + } + } + + 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;i<iOffset+iLength;i++,j++) { + aStr[j] = String.fromCharCode(this.getByteAt(i)); + } + return aStr.join(""); + } + + this.getCharAt = function(iOffset) { + return String.fromCharCode(this.getByteAt(iOffset)); + } + this.toBase64 = function() { + return window.btoa(data); + } + this.fromBase64 = function(strBase64) { + data = window.atob(strBase64); + } +} + + +var BinaryAjax = (function() { + + function createRequest() { + var oHTTP = null; + if (window.XMLHttpRequest) { + oHTTP = new XMLHttpRequest(); + } else if (window.ActiveXObject) { + oHTTP = new ActiveXObject("Microsoft.XMLHTTP"); + } + return oHTTP; + } + + function getHead(strURL, fncCallback, fncError) { + var oHTTP = createRequest(); + if (oHTTP) { + if (fncCallback) { + if (typeof(oHTTP.onload) != "undefined") { + oHTTP.onload = function() { + if (oHTTP.status == "200") { + fncCallback(this); + } else { + if (fncError) fncError(); + } + oHTTP = null; + }; + } else { + oHTTP.onreadystatechange = function() { + if (oHTTP.readyState == 4) { + if (oHTTP.status == "200") { + fncCallback(this); + } else { + if (fncError) fncError(); + } + oHTTP = null; + } + }; + } + } + oHTTP.open("HEAD", strURL, true); + oHTTP.send(null); + } else { + if (fncError) fncError(); + } + } + + function sendRequest(strURL, fncCallback, fncError, aRange, bAcceptRanges, iFileSize) { + var oHTTP = createRequest(); + if (oHTTP) { + + var iDataOffset = 0; + if (aRange && !bAcceptRanges) { + iDataOffset = aRange[0]; + } + var iDataLen = 0; + if (aRange) { + iDataLen = aRange[1]-aRange[0]+1; + } + + if (fncCallback) { + if (typeof(oHTTP.onload) != "undefined") { + oHTTP.onload = function() { + + if (oHTTP.status == "200" || oHTTP.status == "206") { + this.binaryResponse = new BinaryFile(this.responseText, iDataOffset, iDataLen); + this.fileSize = iFileSize || this.getResponseHeader("Content-Length"); + fncCallback(this); + } else { + if (fncError) fncError(); + } + oHTTP = null; + }; + } else { + oHTTP.onreadystatechange = function() { + if (oHTTP.readyState == 4) { + if (oHTTP.status == "200" || oHTTP.status == "206") { + this.binaryResponse = new BinaryFile(oHTTP.responseBody, iDataOffset, iDataLen); + this.fileSize = iFileSize || this.getResponseHeader("Content-Length"); + fncCallback(this); + } else { + if (fncError) fncError(); + } + oHTTP = null; + } + }; + } + } + oHTTP.open("GET", strURL, true); + + if (oHTTP.overrideMimeType) oHTTP.overrideMimeType('text/plain; charset=x-user-defined'); + + if (aRange && bAcceptRanges) { + oHTTP.setRequestHeader("Range", "bytes=" + aRange[0] + "-" + aRange[1]); + } + + oHTTP.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 1970 00:00:00 GMT"); + + oHTTP.send(null); + } else { + if (fncError) fncError(); + } + } + + return function(strURL, fncCallback, fncError, aRange) { + + if (aRange) { + getHead( + strURL, + function(oHTTP) { + var iLength = parseInt(oHTTP.getResponseHeader("Content-Length"),10); + var strAcceptRanges = oHTTP.getResponseHeader("Accept-Ranges"); + + var iStart, iEnd; + iStart = aRange[0]; + if (aRange[0] < 0) + iStart += iLength; + iEnd = iStart + aRange[1] - 1; + + sendRequest(strURL, fncCallback, fncError, [iStart, iEnd], (strAcceptRanges == "bytes"), iLength); + } + ); + + } else { + sendRequest(strURL, fncCallback, fncError); + } + } + +}()); + + +document.write( + "<script type='text/vbscript'>\r\n" + + "Function IEBinary_getByteAt(strBinary, iOffset)\r\n" + + " IEBinary_getByteAt = AscB(MidB(strBinary,iOffset+1,1))\r\n" + + "End Function\r\n" + + "Function IEBinary_getLength(strBinary)\r\n" + + " IEBinary_getLength = LenB(strBinary)\r\n" + + "End Function\r\n" + + "</script>\r\n" +); |