Accumulate streamed PDF data into array of buffers.
This commit is contained in:
		
							parent
							
								
									012d075604
								
							
						
					
					
						commit
						61dd7d1c3a
					
				| @ -154,7 +154,7 @@ function getLocalizedString(strings, id, property) { | |||||||
| // PDF data storage
 | // PDF data storage
 | ||||||
| function PdfDataListener(length) { | function PdfDataListener(length) { | ||||||
|   this.length = length; // less than 0, if length is unknown
 |   this.length = length; // less than 0, if length is unknown
 | ||||||
|   this.buffer = null; |   this.buffers = []; | ||||||
|   this.loaded = 0; |   this.loaded = 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -162,15 +162,7 @@ PdfDataListener.prototype = { | |||||||
|   append: function PdfDataListener_append(chunk) { |   append: function PdfDataListener_append(chunk) { | ||||||
|     // In most of the cases we will pass data as we receive it, but at the
 |     // In most of the cases we will pass data as we receive it, but at the
 | ||||||
|     // beginning of the loading we may accumulate some data.
 |     // beginning of the loading we may accumulate some data.
 | ||||||
|     if (!this.buffer) { |     this.buffers.push(chunk); | ||||||
|       this.buffer = new Uint8Array(chunk); |  | ||||||
|     } else { |  | ||||||
|       var buffer = this.buffer; |  | ||||||
|       var newBuffer = new Uint8Array(buffer.length + chunk.length); |  | ||||||
|       newBuffer.set(buffer); |  | ||||||
|       newBuffer.set(chunk, buffer.length); |  | ||||||
|       this.buffer = newBuffer; |  | ||||||
|     } |  | ||||||
|     this.loaded += chunk.length; |     this.loaded += chunk.length; | ||||||
|     if (this.length >= 0 && this.length < this.loaded) { |     if (this.length >= 0 && this.length < this.loaded) { | ||||||
|       this.length = -1; // reset the length, server is giving incorrect one
 |       this.length = -1; // reset the length, server is giving incorrect one
 | ||||||
| @ -178,9 +170,26 @@ PdfDataListener.prototype = { | |||||||
|     this.onprogress(this.loaded, this.length >= 0 ? this.length : void 0); |     this.onprogress(this.loaded, this.length >= 0 ? this.length : void 0); | ||||||
|   }, |   }, | ||||||
|   readData: function PdfDataListener_readData() { |   readData: function PdfDataListener_readData() { | ||||||
|     var result = this.buffer; |     if (this.buffers.length === 0) { | ||||||
|     this.buffer = null; |       return null; | ||||||
|     return result; |     } | ||||||
|  |     if (this.buffers.length === 1) { | ||||||
|  |       return this.buffers.pop(); | ||||||
|  |     } | ||||||
|  |     // There are multiple buffers that need to be combined into a single
 | ||||||
|  |     // buffer.
 | ||||||
|  |     let combinedLength = 0; | ||||||
|  |     for (let buffer of this.buffers) { | ||||||
|  |       combinedLength += buffer.length; | ||||||
|  |     } | ||||||
|  |     let combinedArray = new Uint8Array(combinedLength); | ||||||
|  |     let writeOffset = 0; | ||||||
|  |     while (this.buffers.length) { | ||||||
|  |       let buffer = this.buffers.shift(); | ||||||
|  |       combinedArray.set(buffer, writeOffset); | ||||||
|  |       writeOffset += buffer.length; | ||||||
|  |     } | ||||||
|  |     return combinedArray; | ||||||
|   }, |   }, | ||||||
|   finish: function PdfDataListener_finish() { |   finish: function PdfDataListener_finish() { | ||||||
|     this.isDataReady = true; |     this.isDataReady = true; | ||||||
| @ -888,8 +897,9 @@ PdfStreamConverter.prototype = { | |||||||
| 
 | 
 | ||||||
|     var binaryStream = this.binaryStream; |     var binaryStream = this.binaryStream; | ||||||
|     binaryStream.setInputStream(aInputStream); |     binaryStream.setInputStream(aInputStream); | ||||||
|     var chunk = binaryStream.readByteArray(aCount); |     let chunk = new ArrayBuffer(aCount); | ||||||
|     this.dataListener.append(chunk); |     binaryStream.readArrayBuffer(aCount, chunk); | ||||||
|  |     this.dataListener.append(new Uint8Array(chunk)); | ||||||
|   }, |   }, | ||||||
| 
 | 
 | ||||||
|   // nsIRequestObserver::onStartRequest
 |   // nsIRequestObserver::onStartRequest
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user