keep zlib history so we can decode as a stream
This commit is contained in:
parent
de84e09854
commit
c577ca2305
|
@ -201,6 +201,7 @@ function TINF() {
|
||||||
|
|
||||||
this.OK = 0;
|
this.OK = 0;
|
||||||
this.DATA_ERROR = (-3);
|
this.DATA_ERROR = (-3);
|
||||||
|
this.WINDOW_SIZE = 32768;
|
||||||
|
|
||||||
/* ------------------------------ *
|
/* ------------------------------ *
|
||||||
* -- internal data structures -- *
|
* -- internal data structures -- *
|
||||||
|
@ -219,6 +220,8 @@ this.DATA = function(that) {
|
||||||
|
|
||||||
this.dest = [];
|
this.dest = [];
|
||||||
|
|
||||||
|
this.history = [];
|
||||||
|
|
||||||
this.ltree = new that.TREE(); /* dynamic length/symbol tree */
|
this.ltree = new that.TREE(); /* dynamic length/symbol tree */
|
||||||
this.dtree = new that.TREE(); /* dynamic distance tree */
|
this.dtree = new that.TREE(); /* dynamic distance tree */
|
||||||
};
|
};
|
||||||
|
@ -482,7 +485,7 @@ this.inflate_block_data = function(d, lt, dt)
|
||||||
|
|
||||||
if (sym < 256)
|
if (sym < 256)
|
||||||
{
|
{
|
||||||
ddest[ddestlength++] = String.fromCharCode(sym);
|
ddest[ddestlength++] = sym; // ? String.fromCharCode(sym);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
var length, dist, offs;
|
var length, dist, offs;
|
||||||
|
@ -500,6 +503,9 @@ this.inflate_block_data = function(d, lt, dt)
|
||||||
|
|
||||||
/* copy match */
|
/* copy match */
|
||||||
for (i = offs; i < offs + length; ++i) {
|
for (i = offs; i < offs + length; ++i) {
|
||||||
|
if (i < 0)
|
||||||
|
ddest[ddestlength++] = d.history[d.history.length + i];
|
||||||
|
else
|
||||||
ddest[ddestlength++] = ddest[i];
|
ddest[ddestlength++] = ddest[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -576,7 +582,7 @@ this.init = function()
|
||||||
this.reset = function()
|
this.reset = function()
|
||||||
{
|
{
|
||||||
this.d = new this.DATA(this);
|
this.d = new this.DATA(this);
|
||||||
this.header = null;
|
delete this.header;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* inflate stream from source to dest */
|
/* inflate stream from source to dest */
|
||||||
|
@ -597,9 +603,9 @@ this.uncompress = function(source, offset)
|
||||||
d.dest = [];
|
d.dest = [];
|
||||||
|
|
||||||
// Skip zlib header at start of stream
|
// Skip zlib header at start of stream
|
||||||
/*if (typeof header == 'undefined') {
|
if (typeof this.header == 'undefined') {
|
||||||
header = this.read_bits(d, 16, 0);
|
this.header = this.read_bits(d, 16, 0);
|
||||||
}*/
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
|
@ -633,11 +639,21 @@ this.uncompress = function(source, offset)
|
||||||
|
|
||||||
if (res != this.OK) return { 'status' : this.DATA_ERROR };
|
if (res != this.OK) return { 'status' : this.DATA_ERROR };
|
||||||
|
|
||||||
} while (!bfinal);
|
} while (!bfinal && d.sourceIndex < d.source.length - 3);
|
||||||
|
|
||||||
if (Object.prototype.toString.call(source) !== '[object Array]') {
|
if (Object.prototype.toString.call(source) !== '[object Array]') {
|
||||||
d.dest = d.dest.join('');
|
d.dest = d.dest.join('');
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
if (d.dest.length >= this.WINDOW_SIZE) {
|
||||||
|
d.history = d.dest.slice(d.dest.length - this.WINDOW_SIZE);
|
||||||
|
} else {
|
||||||
|
var overflow = d.history.length + d.dest.length - this.WINDOW_SIZE;
|
||||||
|
if (overflow > 0)
|
||||||
|
d.history = d.history.slice(overflow);
|
||||||
|
}
|
||||||
|
d.history.push.apply(d.history, d.dest);
|
||||||
|
}
|
||||||
|
|
||||||
return { 'status' : this.OK, 'data' : d.dest };
|
return { 'status' : this.OK, 'data' : d.dest };
|
||||||
}
|
}
|
||||||
|
|
|
@ -1293,8 +1293,8 @@ encHandlers.TIGHT = function display_tight() {
|
||||||
var decompress = function(data) {
|
var decompress = function(data) {
|
||||||
// TODO: process resetStreams here
|
// TODO: process resetStreams here
|
||||||
var uncompressed = FBU.zlibs[streamId].uncompress(data, 0);
|
var uncompressed = FBU.zlibs[streamId].uncompress(data, 0);
|
||||||
/*if (uncompressed.status != 0)
|
if (uncompressed.status != 0)
|
||||||
throw("Invalid data in zlib stream");*/
|
throw("Invalid data in zlib stream");
|
||||||
return uncompressed.data;
|
return uncompressed.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue