diff options
Diffstat (limited to '')
-rw-r--r-- | js/binaryXHR.js | 521 |
1 files changed, 264 insertions, 257 deletions
diff --git a/js/binaryXHR.js b/js/binaryXHR.js index d82c808..63186b3 100644 --- a/js/binaryXHR.js +++ b/js/binaryXHR.js | |||
@@ -1,257 +1,264 @@ | |||
1 | 1 | // jshint browser:true | |
2 | /* | 2 | /* |
3 | * BinaryFile over XMLHttpRequest | 3 | * BinaryFile over XMLHttpRequest |
4 | * Part of the javascriptRRD package | 4 | * Part of the javascriptRRD package |
5 | * Copyright (c) 2009 Frank Wuerthwein, fkw@ucsd.edu | 5 | * Copyright (c) 2009 Frank Wuerthwein, fkw@ucsd.edu |
6 | * MIT License [http://www.opensource.org/licenses/mit-license.php] | 6 | * MIT License [http://www.opensource.org/licenses/mit-license.php] |
7 | * | 7 | * |
8 | * Original repository: http://javascriptrrd.sourceforge.net/ | 8 | * Original repository: http://javascriptrrd.sourceforge.net/ |
9 | * | 9 | * |
10 | * Based on: | 10 | * Based on: |
11 | * Binary Ajax 0.1.5 | 11 | * Binary Ajax 0.1.5 |
12 | * Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com, http://blog.nihilogic.dk/ | 12 | * Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com, http://blog.nihilogic.dk/ |
13 | * MIT License [http://www.opensource.org/licenses/mit-license.php] | 13 | * MIT License [http://www.opensource.org/licenses/mit-license.php] |
14 | */ | 14 | */ |
15 | 15 | ||
16 | // ============================================================ | 16 | // ============================================================ |
17 | // Exception class | 17 | // Exception class |
18 | function InvalidBinaryFile(msg) { | 18 | function InvalidBinaryFile(msg) { |
19 | this.message=msg; | 19 | "use strict"; |
20 | this.name="Invalid BinaryFile"; | 20 | this.message = msg; |
21 | } | 21 | this.name = "Invalid BinaryFile"; |
22 | 22 | } | |
23 | // pretty print | 23 | |
24 | InvalidBinaryFile.prototype.toString = function() { | 24 | // pretty print |
25 | return this.name + ': "' + this.message + '"'; | 25 | InvalidBinaryFile.prototype.toString = function() { |
26 | } | 26 | "use strict"; |
27 | 27 | return this.name + ': "' + this.message + '"'; | |
28 | // ===================================================================== | 28 | }; |
29 | // BinaryFile class | 29 | |
30 | // Allows access to element inside a binary stream | 30 | // ===================================================================== |
31 | function BinaryFile(strData, iDataOffset, iDataLength) { | 31 | // BinaryFile class |
32 | var data = strData; | 32 | // Allows access to element inside a binary stream |
33 | var dataOffset = iDataOffset || 0; | 33 | function BinaryFile(strData, iDataOffset, iDataLength) { |
34 | var dataLength = 0; | 34 | "use strict"; |
35 | // added | 35 | var data = strData; |
36 | var doubleMantExpHi=Math.pow(2,-28); | 36 | var dataOffset = iDataOffset || 0; |
37 | var doubleMantExpLo=Math.pow(2,-52); | 37 | var dataLength = 0; |
38 | var doubleMantExpFast=Math.pow(2,-20); | 38 | // added |
39 | 39 | var doubleMantExpHi=Math.pow(2,-28); | |
40 | var switch_endian = false; | 40 | var doubleMantExpLo=Math.pow(2,-52); |
41 | 41 | var doubleMantExpFast=Math.pow(2,-20); | |
42 | this.getRawData = function() { | 42 | |
43 | return data; | 43 | var switch_endian = false; |
44 | } | 44 | |
45 | 45 | this.getRawData = function() { | |
46 | if (typeof strData == "string") { | 46 | return data; |
47 | dataLength = iDataLength || data.length; | 47 | }; |
48 | 48 | ||
49 | this.getByteAt = function(iOffset) { | 49 | if (typeof strData === "string") { |
50 | return data.charCodeAt(iOffset + dataOffset) & 0xFF; | 50 | dataLength = iDataLength || data.length; |
51 | } | 51 | |
52 | } else if (typeof strData == "unknown") { | 52 | this.getByteAt = function(iOffset) { |
53 | dataLength = iDataLength || IEBinary_getLength(data); | 53 | return data.charCodeAt(iOffset + dataOffset) & 0xFF; |
54 | 54 | }; | |
55 | this.getByteAt = function(iOffset) { | 55 | } else if (typeof strData === "unknown") { |
56 | return IEBinary_getByteAt(data, iOffset + dataOffset); | 56 | // Correct. "unknown" as type. MS JScript 8 added this. |
57 | } | 57 | dataLength = iDataLength || IEBinary_getLength(data); |
58 | } else { | 58 | |
59 | throw new InvalidBinaryFile("Unsupported type " + (typeof strData)); | 59 | this.getByteAt = function(iOffset) { |
60 | } | 60 | return IEBinary_getByteAt(data, iOffset + dataOffset); |
61 | 61 | }; | |
62 | this.getEndianByteAt = function(iOffset,width,delta) { | 62 | } else { |
63 | if (this.switch_endian) | 63 | throw new InvalidBinaryFile("Unsupported type " + (typeof strData)); |
64 | return this.getByteAt(iOffset+width-delta-1); | 64 | } |
65 | else | 65 | |
66 | return this.getByteAt(iOffset+delta); | 66 | this.getEndianByteAt = function(iOffset,width,delta) { |
67 | } | 67 | if (this.switch_endian) |
68 | 68 | return this.getByteAt(iOffset+width-delta-1); | |
69 | this.getLength = function() { | 69 | else |
70 | return dataLength; | 70 | return this.getByteAt(iOffset+delta); |
71 | } | 71 | }; |
72 | 72 | ||
73 | this.getSByteAt = function(iOffset) { | 73 | this.getLength = function() { |
74 | var iByte = this.getByteAt(iOffset); | 74 | return dataLength; |
75 | if (iByte > 127) | 75 | }; |
76 | return iByte - 256; | 76 | |
77 | else | 77 | this.getSByteAt = function(iOffset) { |
78 | return iByte; | 78 | var iByte = this.getByteAt(iOffset); |
79 | } | 79 | if (iByte > 127) |
80 | 80 | return iByte - 256; | |
81 | this.getShortAt = function(iOffset) { | 81 | else |
82 | var iShort = (this.getEndianByteAt(iOffset,2,1) << 8) + this.getEndianByteAt(iOffset,2,0) | 82 | return iByte; |
83 | if (iShort < 0) iShort += 65536; | 83 | }; |
84 | return iShort; | 84 | |
85 | } | 85 | this.getShortAt = function(iOffset) { |
86 | this.getSShortAt = function(iOffset) { | 86 | var iShort = (this.getEndianByteAt(iOffset,2,1) << 8) + this.getEndianByteAt(iOffset,2,0); |
87 | var iUShort = this.getShortAt(iOffset); | 87 | if (iShort < 0) iShort += 65536; |
88 | if (iUShort > 32767) | 88 | return iShort; |
89 | return iUShort - 65536; | 89 | }; |
90 | else | 90 | this.getSShortAt = function(iOffset) { |
91 | return iUShort; | 91 | var iUShort = this.getShortAt(iOffset); |
92 | } | 92 | if (iUShort > 32767) |
93 | this.getLongAt = function(iOffset) { | 93 | return iUShort - 65536; |
94 | var iByte1 = this.getEndianByteAt(iOffset,4,0), | 94 | else |
95 | iByte2 = this.getEndianByteAt(iOffset,4,1), | 95 | return iUShort; |
96 | iByte3 = this.getEndianByteAt(iOffset,4,2), | 96 | }; |
97 | iByte4 = this.getEndianByteAt(iOffset,4,3); | 97 | this.getLongAt = function(iOffset) { |
98 | 98 | var iByte1 = this.getEndianByteAt(iOffset,4,0), | |
99 | var iLong = (((((iByte4 << 8) + iByte3) << 8) + iByte2) << 8) + iByte1; | 99 | iByte2 = this.getEndianByteAt(iOffset,4,1), |
100 | if (iLong < 0) iLong += 4294967296; | 100 | iByte3 = this.getEndianByteAt(iOffset,4,2), |
101 | return iLong; | 101 | iByte4 = this.getEndianByteAt(iOffset,4,3); |
102 | } | 102 | |
103 | this.getSLongAt = function(iOffset) { | 103 | var iLong = (((((iByte4 << 8) + iByte3) << 8) + iByte2) << 8) + iByte1; |
104 | var iULong = this.getLongAt(iOffset); | 104 | if (iLong < 0) iLong += 4294967296; |
105 | if (iULong > 2147483647) | 105 | return iLong; |
106 | return iULong - 4294967296; | 106 | }; |
107 | else | 107 | this.getSLongAt = function(iOffset) { |
108 | return iULong; | 108 | var iULong = this.getLongAt(iOffset); |
109 | } | 109 | if (iULong > 2147483647) |
110 | this.getStringAt = function(iOffset, iLength) { | 110 | return iULong - 4294967296; |
111 | var aStr = []; | 111 | else |
112 | for (var i=iOffset,j=0;i<iOffset+iLength;i++,j++) { | 112 | return iULong; |
113 | aStr[j] = String.fromCharCode(this.getByteAt(i)); | 113 | }; |
114 | } | 114 | this.getStringAt = function(iOffset, iLength) { |
115 | return aStr.join(""); | 115 | var aStr = []; |
116 | } | 116 | for (var i=iOffset,j=0;i<iOffset+iLength;i++,j++) { |
117 | 117 | aStr[j] = String.fromCharCode(this.getByteAt(i)); | |
118 | // Added | 118 | } |
119 | this.getCStringAt = function(iOffset, iMaxLength) { | 119 | return aStr.join(""); |
120 | var aStr = []; | 120 | }; |
121 | for (var i=iOffset,j=0;(i<iOffset+iMaxLength) && (this.getByteAt(i)>0);i++,j++) { | 121 | |
122 | aStr[j] = String.fromCharCode(this.getByteAt(i)); | 122 | // Added |
123 | } | 123 | this.getCStringAt = function(iOffset, iMaxLength) { |
124 | return aStr.join(""); | 124 | var aStr = []; |
125 | } | 125 | for (var i=iOffset,j=0;(i<iOffset+iMaxLength) && (this.getByteAt(i)>0);i++,j++) { |
126 | 126 | aStr[j] = String.fromCharCode(this.getByteAt(i)); | |
127 | // Added | 127 | } |
128 | this.getDoubleAt = function(iOffset) { | 128 | return aStr.join(""); |
129 | var iByte1 = this.getEndianByteAt(iOffset,8,0), | 129 | }; |
130 | iByte2 = this.getEndianByteAt(iOffset,8,1), | 130 | |
131 | iByte3 = this.getEndianByteAt(iOffset,8,2), | 131 | // Added |
132 | iByte4 = this.getEndianByteAt(iOffset,8,3), | 132 | this.getDoubleAt = function(iOffset) { |
133 | iByte5 = this.getEndianByteAt(iOffset,8,4), | 133 | var iByte1 = this.getEndianByteAt(iOffset,8,0), |
134 | iByte6 = this.getEndianByteAt(iOffset,8,5), | 134 | iByte2 = this.getEndianByteAt(iOffset,8,1), |
135 | iByte7 = this.getEndianByteAt(iOffset,8,6), | 135 | iByte3 = this.getEndianByteAt(iOffset,8,2), |
136 | iByte8 = this.getEndianByteAt(iOffset,8,7); | 136 | iByte4 = this.getEndianByteAt(iOffset,8,3), |
137 | var iSign=iByte8 >> 7; | 137 | iByte5 = this.getEndianByteAt(iOffset,8,4), |
138 | var iExpRaw=((iByte8 & 0x7F)<< 4) + (iByte7 >> 4); | 138 | iByte6 = this.getEndianByteAt(iOffset,8,5), |
139 | var iMantHi=((((((iByte7 & 0x0F) << 8) + iByte6) << 8) + iByte5) << 8) + iByte4; | 139 | iByte7 = this.getEndianByteAt(iOffset,8,6), |
140 | var iMantLo=((((iByte3) << 8) + iByte2) << 8) + iByte1; | 140 | iByte8 = this.getEndianByteAt(iOffset,8,7); |
141 | 141 | var iSign=iByte8 >> 7; | |
142 | if (iExpRaw==0) return 0.0; | 142 | var iExpRaw=((iByte8 & 0x7F)<< 4) + (iByte7 >> 4); |
143 | if (iExpRaw==0x7ff) return undefined; | 143 | var iMantHi=((((((iByte7 & 0x0F) << 8) + iByte6) << 8) + iByte5) << 8) + iByte4; |
144 | 144 | var iMantLo=((((iByte3) << 8) + iByte2) << 8) + iByte1; | |
145 | var iExp=(iExpRaw & 0x7FF)-1023; | 145 | |
146 | 146 | if (iExpRaw === 0) return 0.0; | |
147 | var dDouble = ((iSign==1)?-1:1)*Math.pow(2,iExp)*(1.0 + iMantLo*doubleMantExpLo + iMantHi*doubleMantExpHi); | 147 | if (iExpRaw === 0x7ff) return undefined; |
148 | return dDouble; | 148 | |
149 | } | 149 | var iExp=(iExpRaw & 0x7FF)-1023; |
150 | // added | 150 | |
151 | // Extracts only 4 bytes out of 8, loosing in precision (20 bit mantissa) | 151 | var dDouble = ((iSign==1)?-1:1)*Math.pow(2,iExp)*(1.0 + iMantLo*doubleMantExpLo + iMantHi*doubleMantExpHi); |
152 | this.getFastDoubleAt = function(iOffset) { | 152 | return dDouble; |
153 | var iByte5 = this.getEndianByteAt(iOffset,8,4), | 153 | }; |
154 | iByte6 = this.getEndianByteAt(iOffset,8,5), | 154 | // added |
155 | iByte7 = this.getEndianByteAt(iOffset,8,6), | 155 | // Extracts only 4 bytes out of 8, loosing in precision (20 bit mantissa) |
156 | iByte8 = this.getEndianByteAt(iOffset,8,7); | 156 | this.getFastDoubleAt = function(iOffset) { |
157 | var iSign=iByte8 >> 7; | 157 | var iByte5 = this.getEndianByteAt(iOffset,8,4), |
158 | var iExpRaw=((iByte8 & 0x7F)<< 4) + (iByte7 >> 4); | 158 | iByte6 = this.getEndianByteAt(iOffset,8,5), |
159 | var iMant=((((iByte7 & 0x0F) << 8) + iByte6) << 8) + iByte5; | 159 | iByte7 = this.getEndianByteAt(iOffset,8,6), |
160 | 160 | iByte8 = this.getEndianByteAt(iOffset,8,7); | |
161 | if (iExpRaw==0) return 0.0; | 161 | var iSign=iByte8 >> 7; |
162 | if (iExpRaw==0x7ff) return undefined; | 162 | var iExpRaw=((iByte8 & 0x7F)<< 4) + (iByte7 >> 4); |
163 | 163 | var iMant=((((iByte7 & 0x0F) << 8) + iByte6) << 8) + iByte5; | |
164 | var iExp=(iExpRaw & 0x7FF)-1023; | 164 | |
165 | 165 | if (iExpRaw === 0) return 0.0; | |
166 | var dDouble = ((iSign==1)?-1:1)*Math.pow(2,iExp)*(1.0 + iMant*doubleMantExpFast); | 166 | if (iExpRaw === 0x7ff) return undefined; |
167 | return dDouble; | 167 | |
168 | } | 168 | var iExp=(iExpRaw & 0x7FF)-1023; |
169 | 169 | ||
170 | this.getCharAt = function(iOffset) { | 170 | var dDouble = ((iSign === 1) ? -1 : 1); |
171 | return String.fromCharCode(this.getByteAt(iOffset)); | 171 | dDouble *= Math.pow(2,iExp) * (1.0 + iMant*doubleMantExpFast); |
172 | } | 172 | return dDouble; |
173 | } | 173 | }; |
174 | 174 | ||
175 | 175 | this.getCharAt = function(iOffset) { | |
176 | document.write( | 176 | return String.fromCharCode(this.getByteAt(iOffset)); |
177 | "<script type='text/vbscript'>\r\n" | 177 | }; |
178 | + "Function IEBinary_getByteAt(strBinary, iOffset)\r\n" | 178 | } |
179 | + " IEBinary_getByteAt = AscB(MidB(strBinary,iOffset+1,1))\r\n" | 179 | |
180 | + "End Function\r\n" | 180 | |
181 | + "Function IEBinary_getLength(strBinary)\r\n" | 181 | document.write( |
182 | + " IEBinary_getLength = LenB(strBinary)\r\n" | 182 | "<script type='text/vbscript'>\r\n" |
183 | + "End Function\r\n" | 183 | + "Function IEBinary_getByteAt(strBinary, iOffset)\r\n" |
184 | + "</script>\r\n" | 184 | + " IEBinary_getByteAt = AscB(MidB(strBinary,iOffset+1,1))\r\n" |
185 | ); | 185 | + "End Function\r\n" |
186 | 186 | + "Function IEBinary_getLength(strBinary)\r\n" | |
187 | 187 | + " IEBinary_getLength = LenB(strBinary)\r\n" | |
188 | 188 | + "End Function\r\n" | |
189 | // =============================================================== | 189 | + "</script>\r\n" |
190 | // Load a binary file from the specified URL | 190 | ); |
191 | // Will return an object of type BinaryFile | 191 | |
192 | function FetchBinaryURL(url) { | 192 | |
193 | var request = new XMLHttpRequest(); | 193 | |
194 | request.open("GET", url,false); | 194 | // =============================================================== |
195 | try { | 195 | // Load a binary file from the specified URL |
196 | request.overrideMimeType('text/plain; charset=x-user-defined'); | 196 | // Will return an object of type BinaryFile |
197 | } catch (err) { | 197 | function FetchBinaryURL(url) { |
198 | // ignore any error, just to make both FF and IE work | 198 | "use strict"; |
199 | } | 199 | var request = new XMLHttpRequest(); |
200 | request.send(null); | 200 | request.open("GET", url,false); |
201 | 201 | try { | |
202 | var response=request.responseText; | 202 | request.overrideMimeType('text/plain; charset=x-user-defined'); |
203 | try { | 203 | } catch (err) { |
204 | // for older IE versions, the value in responseText is not usable | 204 | // ignore any error, just to make both FF and IE work |
205 | if (IEBinary_getLength(this.responseBody)>0) { | 205 | } |
206 | // will get here only for older verson of IE | 206 | request.send(null); |
207 | response=this.responseBody; | 207 | |
208 | } | 208 | var response=request.responseText; |
209 | } catch (err) { | 209 | try { |
210 | // not IE, do nothing | 210 | // for older IE versions, the value in responseText is not usable |
211 | } | 211 | if (IEBinary_getLength(this.responseBody)>0) { |
212 | 212 | // will get here only for older verson of IE | |
213 | var bf=new BinaryFile(response); | 213 | response=this.responseBody; |
214 | return bf; | 214 | } |
215 | } | 215 | } catch (err) { |
216 | 216 | // not IE, do nothing | |
217 | 217 | } | |
218 | // =============================================================== | 218 | |
219 | // Asyncronously load a binary file from the specified URL | 219 | var bf=new BinaryFile(response); |
220 | // | 220 | return bf; |
221 | // callback must be a function with one or two arguments: | 221 | } |
222 | // - bf = an object of type BinaryFile | 222 | |
223 | // - optional argument object (used only if callback_arg not undefined) | 223 | |
224 | function FetchBinaryURLAsync(url, callback, callback_arg) { | 224 | // =============================================================== |
225 | var callback_wrapper = function() { | 225 | // Asyncronously load a binary file from the specified URL |
226 | if(this.readyState == 4) { | 226 | // |
227 | var response=this.responseText; | 227 | // callback must be a function with one or two arguments: |
228 | try { | 228 | // - bf = an object of type BinaryFile |
229 | // for older IE versions, the value in responseText is not usable | 229 | // - optional argument object (used only if callback_arg not undefined) |
230 | if (IEBinary_getLength(this.responseBody)>0) { | 230 | function FetchBinaryURLAsync(url, callback, callback_arg) { |
231 | // will get here only for older verson of IE | 231 | "use strict"; |
232 | response=this.responseBody; | 232 | var callback_wrapper = function() { |
233 | } | 233 | if(this.readyState === 4) { |
234 | } catch (err) { | 234 | var response=this.responseText; |
235 | // not IE, do nothing | 235 | try { |
236 | } | 236 | // for older IE versions, the value in responseText is not usable |
237 | 237 | if (IEBinary_getLength(this.responseBody)>0) { | |
238 | var bf=new BinaryFile(response); | 238 | // will get here only for older verson of IE |
239 | if (callback_arg!=null) { | 239 | response=this.responseBody; |
240 | callback(bf,callback_arg); | 240 | } |
241 | } else { | 241 | } catch (err) { |
242 | callback(bf); | 242 | // not IE, do nothing |
243 | } | 243 | } |
244 | } | 244 | |
245 | } | 245 | var bf=new BinaryFile(response); |
246 | 246 | if (callback_arg) { | |
247 | var request = new XMLHttpRequest(); | 247 | callback(bf, callback_arg); |
248 | request.onreadystatechange = callback_wrapper; | 248 | } else { |
249 | request.open("GET", url,true); | 249 | callback(bf); |
250 | try { | 250 | } |
251 | request.overrideMimeType('text/plain; charset=x-user-defined'); | 251 | } |
252 | } catch (err) { | 252 | }; |
253 | // ignore any error, just to make both FF and IE work | 253 | |
254 | } | 254 | var request = new XMLHttpRequest(); |
255 | request.send(null); | 255 | request.onreadystatechange = callback_wrapper; |
256 | return request | 256 | request.open("GET", url,true); |
257 | } | 257 | try { |
258 | request.overrideMimeType('text/plain; charset=x-user-defined'); | ||
259 | } catch (err) { | ||
260 | // ignore any error, just to make both FF and IE work | ||
261 | } | ||
262 | request.send(null); | ||
263 | return request; | ||
264 | } | ||