Perliminar Support for iPad

This commit is contained in:
Artur Ventura 2011-08-10 11:34:08 +01:00
parent 7201165125
commit 960d3ef10d
2 changed files with 332 additions and 0 deletions

322
webserver/dataview.js Normal file
View File

@ -0,0 +1,322 @@
//
// jDataView by Vjeux - Jan 2010
//
// A unique way to read a binary file in the browser
// http://github.com/vjeux/jsDataView
// http://blog.vjeux.com/ <vjeuxx@gmail.com>
//
(function () {
var compatibility = {
ArrayBuffer: typeof ArrayBuffer !== 'undefined',
DataView: typeof DataView !== 'undefined' && 'getFloat64' in DataView.prototype
}
var jDataView = function (buffer, byteOffset, byteLength, littleEndian) {
this._buffer = buffer;
// Handle Type Errors
if (!(compatibility.ArrayBuffer && buffer instanceof ArrayBuffer) &&
!(typeof buffer === 'string')) {
throw new TypeError("Type error");
}
// Check parameters and existing functionnalities
this._isArrayBuffer = compatibility.ArrayBuffer && buffer instanceof ArrayBuffer;
this._isDataView = compatibility.DataView && this._isArrayBuffer;
// Default Values
this._littleEndian = littleEndian === undefined ? false : littleEndian;
var bufferLength = this._isArrayBuffer ? buffer.byteLength : buffer.length;
if (byteOffset == undefined) {
byteOffset = 0;
}
if (byteLength == undefined) {
byteLength = bufferLength - byteOffset;
}
if (!this._isDataView) {
// Do additional checks to simulate DataView
if (typeof byteOffset !== 'number') {
throw new TypeError("Type error");
}
if (typeof byteLength !== 'number') {
throw new TypeError("Type error");
}
if (typeof byteOffset < 0) {
throw new Error("INDEX_SIZE_ERR: DOM Exception 1");
}
if (typeof byteLength < 0) {
throw new Error("INDEX_SIZE_ERR: DOM Exception 1");
}
}
// Instanciate
if (this._isDataView) {
this._view = new DataView(buffer, byteOffset, byteLength);
this._start = 0;
}
this._start = byteOffset;
if (this._end >= bufferLength) {
throw new Error("INDEX_SIZE_ERR: DOM Exception 1");
}
this._offset = 0;
this.length = byteLength;
};
jDataView.createBuffer = function () {
if (typeof ArrayBuffer !== 'undefined') {
var buffer = new ArrayBuffer(arguments.length);
var view = new Int8Array(buffer);
for (var i = 0; i < arguments.length; ++i) {
view[i] = arguments[i];
}
return buffer;
}
return String.fromCharCode.apply(null, arguments);
};
jDataView.prototype = {
// Helpers
getString: function (length, byteOffset) {
var value;
// Handle the lack of byteOffset
if (byteOffset === undefined) {
var byteOffset = this._offset;
}
// Error Checking
if (typeof byteOffset !== 'number') {
throw new TypeError("Type error");
}
if (length < 0 || byteOffset + length > this.length) {
throw new Error("INDEX_SIZE_ERR: DOM Exception 1");
}
if (this._isArrayBuffer) {
// Use Int8Array and String.fromCharCode to extract a string
var int8array = new Int8Array(this._buffer, this._start + byteOffset, length);
var stringarray = [];
for (var i = 0; i < length; ++i) {
stringarray[i] = int8array[i];
}
value = String.fromCharCode.apply(null, stringarray);
} else {
value = this._buffer.substr(this._start + byteOffset, length);
}
this._offset = byteOffset + length;
return value;
},
getChar: function (byteOffset) {
var value, size = 1;
// Handle the lack of byteOffset
if (byteOffset === undefined) {
var byteOffset = this._offset;
}
if (this._isArrayBuffer) {
// Use Int8Array and String.fromCharCode to extract a string
value = String.fromCharCode(this.getUint8(byteOffset));
} else {
// Error Checking
if (typeof byteOffset !== 'number') {
throw new TypeError("Type error");
}
if (length < 0 || byteOffset + size > this.length) {
throw new Error("INDEX_SIZE_ERR: DOM Exception 1");
}
value = this._buffer.charAt(this._start + byteOffset);
this._offset = byteOffset + size;
}
return value;
},
tell: function () {
return this._offset;
},
seek: function (byteOffset) {
if (typeof byteOffset !== 'number') {
throw new TypeError("Type error");
}
if (byteOffset < 0 || byteOffset > this.length) {
throw new Error("INDEX_SIZE_ERR: DOM Exception 1");
}
this._offset = byteOffset;
},
// Compatibility functions on a String Buffer
_endianness: function (offset, pos, max, littleEndian) {
return offset + (littleEndian ? max - pos - 1 : pos);
},
_getFloat64: function (offset, littleEndian) {
var b0 = this._getUint8(this._endianness(offset, 0, 8, littleEndian)),
b1 = this._getUint8(this._endianness(offset, 1, 8, littleEndian)),
b2 = this._getUint8(this._endianness(offset, 2, 8, littleEndian)),
b3 = this._getUint8(this._endianness(offset, 3, 8, littleEndian)),
b4 = this._getUint8(this._endianness(offset, 4, 8, littleEndian)),
b5 = this._getUint8(this._endianness(offset, 5, 8, littleEndian)),
b6 = this._getUint8(this._endianness(offset, 6, 8, littleEndian)),
b7 = this._getUint8(this._endianness(offset, 7, 8, littleEndian)),
sign = 1 - (2 * (b0 >> 7)),
exponent = ((((b0 << 1) & 0xff) << 3) | (b1 >> 4)) - (Math.pow(2, 10) - 1),
// Binary operators such as | and << operate on 32 bit values, using + and Math.pow(2) instead
mantissa = ((b1 & 0x0f) * Math.pow(2, 48)) + (b2 * Math.pow(2, 40)) + (b3 * Math.pow(2, 32))
+ (b4 * Math.pow(2, 24)) + (b5 * Math.pow(2, 16)) + (b6 * Math.pow(2, 8)) + b7;
if (mantissa == 0 && exponent == -(Math.pow(2, 10) - 1)) {
return 0.0;
}
if (exponent == -1023) { // Denormalized
return sign * mantissa * Math.pow(2, -1022 - 52);
}
return sign * (1 + mantissa * Math.pow(2, -52)) * Math.pow(2, exponent);
},
_getFloat32: function (offset, littleEndian) {
var b0 = this._getUint8(this._endianness(offset, 0, 4, littleEndian)),
b1 = this._getUint8(this._endianness(offset, 1, 4, littleEndian)),
b2 = this._getUint8(this._endianness(offset, 2, 4, littleEndian)),
b3 = this._getUint8(this._endianness(offset, 3, 4, littleEndian)),
sign = 1 - (2 * (b0 >> 7)),
exponent = (((b0 << 1) & 0xff) | (b1 >> 7)) - 127,
mantissa = ((b1 & 0x7f) << 16) | (b2 << 8) | b3;
if (mantissa == 0 && exponent == -127) {
return 0.0;
}
if (exponent == -127) { // Denormalized
return sign * mantissa * Math.pow(2, -126 - 23);
}
return sign * (1 + mantissa * Math.pow(2, -23)) * Math.pow(2, exponent);
},
_getInt32: function (offset, littleEndian) {
var b = this._getUint32(offset, littleEndian);
return b > Math.pow(2, 31) - 1 ? b - Math.pow(2, 32) : b;
},
_getUint32: function (offset, littleEndian) {
var b3 = this._getUint8(this._endianness(offset, 0, 4, littleEndian)),
b2 = this._getUint8(this._endianness(offset, 1, 4, littleEndian)),
b1 = this._getUint8(this._endianness(offset, 2, 4, littleEndian)),
b0 = this._getUint8(this._endianness(offset, 3, 4, littleEndian));
return (b3 * Math.pow(2, 24)) + (b2 << 16) + (b1 << 8) + b0;
},
_getInt16: function (offset) {
var b = this._getUint16(offset);
return b > Math.pow(2, 15) - 1 ? b - Math.pow(2, 16) : b;
},
_getUint16: function (offset, littleEndian) {
var b1 = this._getUint8(this._endianness(offset, 0, 2, littleEndian)),
b0 = this._getUint8(this._endianness(offset, 1, 2, littleEndian));
return (b1 << 8) + b0;
},
_getInt8: function (offset) {
var b = this._getUint8(offset);
return b > Math.pow(2, 7) - 1 ? b - Math.pow(2, 8) : b;
},
_getUint8: function (offset) {
if (this._isArrayBuffer) {
return new Uint8Array(this._buffer, this._start + offset, 1)[0];
} else {
return this._buffer.charCodeAt(this._start + offset) & 0xff;
}
}
};
// Create wrappers
var dataTypes = {
'Int8': 1,
'Int16': 2,
'Int32': 4,
'Uint8': 1,
'Uint16': 2,
'Uint32': 4,
'Float32': 4,
'Float64': 8
};
for (var type in dataTypes) {
// Bind the variable type
(function (type) {
var size = dataTypes[type];
// Create the function
jDataView.prototype['get' + type] =
function (byteOffset, littleEndian) {
var value;
// Handle the lack of endianness
if (littleEndian == undefined) {
littleEndian = this._littleEndian;
}
// Handle the lack of byteOffset
if (byteOffset === undefined) {
byteOffset = this._offset;
}
// Dispatch on the good method
if (this._isDataView) {
// DataView: we use the direct method
value = this._view['get' + type](byteOffset, littleEndian);
}
// ArrayBuffer: we use a typed array of size 1 if the alignment is good
// ArrayBuffer does not support endianess flag (for size > 1)
else if (this._isArrayBuffer && byteOffset % size == 0 && (size == 1 || littleEndian)) {
value = new window[type + 'Array'](this._buffer, byteOffset, 1)[0];
}
else {
// Error Checking
if (typeof byteOffset !== 'number') {
throw new TypeError("Type error");
}
if (byteOffset + size > this.length) {
throw new Error("INDEX_SIZE_ERR: DOM Exception 1");
}
value = this['_get' + type](this._start + byteOffset, littleEndian);
}
// Move the internal offset forward
this._offset = byteOffset + size;
return value;
};
})(type);
}
window.jDataView = jDataView;
window.DataView = jDataView;
})();

View File

@ -31,6 +31,16 @@
l.innerHTML = l.innerHTML + spac + msg + "\n"; l.innerHTML = l.innerHTML + spac + msg + "\n";
} }
function include(filename)
{
document.write('<script type="text/javascript" src="' + filename +
'"><' + '/script>');
}
if(!window.DataView){
include("dataview.js");
}
</script> </script>
<script src="jvm.js" type="text/javascript"></script> <script src="jvm.js" type="text/javascript"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8">