From cd2200b4affebecee8b0292a8e5856ad1d1fe755 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 17 Feb 2014 17:39:13 +0100 Subject: [PATCH] Add ol.binary --- src/ol/binary.js | 174 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 src/ol/binary.js diff --git a/src/ol/binary.js b/src/ol/binary.js new file mode 100644 index 0000000000..96f27492ee --- /dev/null +++ b/src/ol/binary.js @@ -0,0 +1,174 @@ +// FIXME Test on Internet Explorer with VBArray + +goog.provide('ol.binary.Buffer'); +goog.provide('ol.binary.IReader'); + +goog.require('goog.asserts'); +goog.require('goog.userAgent'); +goog.require('ol.BrowserFeature'); + + + +/** + * @constructor + * @param {ArrayBuffer|string} data Data. + */ +ol.binary.Buffer = function(data) { + + /** + * @private + * @type {ArrayBuffer|string} + */ + this.data_ = data; + +}; + + +/** + * @return {ol.binary.IReader} Reader. + */ +ol.binary.Buffer.prototype.getReader = function() { + var data = this.data_; + if (ol.BrowserFeature.HAS_ARRAY_BUFFER) { + var arrayBuffer; + if (data instanceof ArrayBuffer) { + arrayBuffer = data; + } else if (goog.isString(data)) { + // FIXME check what happens with Unicode + arrayBuffer = new ArrayBuffer(data.length); + var uint8View = new Uint8Array(arrayBuffer); + var i, ii; + for (i = 0, ii = data.length; i < ii; ++i) { + uint8View[i] = data.charCodeAt(i); + } + } else { + goog.asserts.fail(); + return null; + } + return new ol.binary.ArrayBufferReader(arrayBuffer); + } else { + goog.asserts.assert(goog.isString(data)); + goog.asserts.assert( + goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('10.0')); + return new ol.binary.ArrayReader(new VBArray(data).toArray()); + } +}; + + + +/** + * @interface + */ +ol.binary.IReader = function() {}; + + +/** + * @return {boolean} At EOF. + */ +ol.binary.IReader.prototype.atEOF = function() {}; + + +/** + * @return {number} Byte. + */ +ol.binary.IReader.prototype.readByte = function() {}; + + + +/** + * @constructor + * @param {ArrayBuffer} arrayBuffer Array buffer. + * @implements {ol.binary.IReader} + */ +ol.binary.ArrayBufferReader = function(arrayBuffer) { + + /** + * @private + * @type {Uint8Array} + */ + this.uint8View_ = new Uint8Array(arrayBuffer); + + /** + * @private + * @type {number} + */ + this.length_ = this.uint8View_.length; + + /** + * @private + * @type {number} + */ + this.offset_ = 0; + +}; + + +/** + * @inheritDoc + */ +ol.binary.ArrayBufferReader.prototype.atEOF = function() { + return this.offset_ == this.length_; +}; + + +/** + * @inheritDoc + */ +ol.binary.ArrayBufferReader.prototype.readByte = function() { + if (this.offset_ < this.length_) { + return this.uint8View_[this.offset_++]; + } else { + goog.asserts.fail(); + return 0; + } +}; + + + +/** + * @constructor + * @implements {ol.binary.IReader} + * @param {Array.} array Array. + */ +ol.binary.ArrayReader = function(array) { + + /** + * @private + * @type {Array.} + */ + this.array_ = array; + + /** + * @private + * @type {number} + */ + this.length_ = array.length; + + /** + * @private + * @type {number} + */ + this.offset_ = 0; + +}; + + +/** + * @inheritDoc + */ +ol.binary.ArrayReader.prototype.atEOF = function() { + return this.offset_ == this.length_; +}; + + +/** + * @inheritDoc + */ +ol.binary.ArrayReader.prototype.readByte = function() { + if (this.offset_ < this.length_) { + return this.array_[this.offset_++]; + } else { + goog.asserts.fail(); + return 0; + } +};