mirror of
				https://github.com/gyurix1968/guacamole-client.git
				synced 2025-10-31 17:13:21 +00:00 
			
		
		
		
	Migrate to cleaner InputStream and OutputStream with Reader wrappers.
This commit is contained in:
		
							
								
								
									
										128
									
								
								guacamole-common-js/src/main/webapp/modules/BlobReader.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								guacamole-common-js/src/main/webapp/modules/BlobReader.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,128 @@ | ||||
| /* | ||||
|  * Copyright (C) 2013 Glyptodon LLC | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
| var Guacamole = Guacamole || {}; | ||||
|  | ||||
| /** | ||||
|  * A reader which automatically handles the given input stream, assembling all | ||||
|  * received blobs into a single blob by appending them to each other in order. | ||||
|  * Note that this object will overwrite any installed event handlers on the | ||||
|  * given Guacamole.InputStream. | ||||
|  *  | ||||
|  * @constructor | ||||
|  * @param {Guacamole.InputStream} stream The stream that data will be read | ||||
|  *                                       from. | ||||
|  * @param {String} mimetype The mimetype of the blob being built. | ||||
|  */ | ||||
| Guacamole.BlobReader = function(stream, mimetype) { | ||||
|  | ||||
|     /** | ||||
|      * Reference to this Guacamole.InputStream. | ||||
|      * @private | ||||
|      */ | ||||
|     var guac_reader = this; | ||||
|  | ||||
|     /** | ||||
|      * The length of this Guacamole.InputStream in bytes. | ||||
|      * @private | ||||
|      */ | ||||
|     var length = 0; | ||||
|  | ||||
|     // Get blob builder | ||||
|     var blob_builder; | ||||
|     if      (window.BlobBuilder)       blob_builder = new BlobBuilder(); | ||||
|     else if (window.WebKitBlobBuilder) blob_builder = new WebKitBlobBuilder(); | ||||
|     else if (window.MozBlobBuilder)    blob_builder = new MozBlobBuilder(); | ||||
|     else | ||||
|         blob_builder = new (function() { | ||||
|  | ||||
|             var blobs = []; | ||||
|  | ||||
|             /** @ignore */ | ||||
|             this.append = function(data) { | ||||
|                 blobs.push(new Blob([data], {"type": mimetype})); | ||||
|             }; | ||||
|  | ||||
|             /** @ignore */ | ||||
|             this.getBlob = function() { | ||||
|                 return new Blob(blobs, {"type": mimetype}); | ||||
|             }; | ||||
|  | ||||
|         })(); | ||||
|  | ||||
|     // Append received blobs | ||||
|     stream.onblob = function(data) { | ||||
|  | ||||
|         // Convert to ArrayBuffer | ||||
|         var binary = window.atob(data); | ||||
|         var arrayBuffer = new ArrayBuffer(binary.length); | ||||
|         var bufferView = new Uint8Array(arrayBuffer); | ||||
|  | ||||
|         for (var i=0; i<binary.length; i++) | ||||
|             bufferView[i] = binary.charCodeAt(i); | ||||
|  | ||||
|         blob_builder.append(arrayBuffer); | ||||
|         length += arrayBuffer.byteLength; | ||||
|  | ||||
|         // Call handler, if present | ||||
|         if (guac_reader.onprogress) | ||||
|             guac_reader.onprogress(arrayBuffer.byteLength); | ||||
|  | ||||
|     }; | ||||
|  | ||||
|     // Simply call onend when end received | ||||
|     stream.onend = function() { | ||||
|         if (guac_reader.onend) | ||||
|             guac_reader.onend(); | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * Returns the current length of this Guacamole.InputStream, in bytes. | ||||
|      * @return {Number} The current length of this Guacamole.InputStream. | ||||
|      */ | ||||
|     this.getLength = function() { | ||||
|         return length; | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * Returns the contents of this Guacamole.BlobReader as a Blob. | ||||
|      * @return {Blob} The contents of this Guacamole.BlobReader. | ||||
|      */ | ||||
|     this.getBlob = function() { | ||||
|         return blob_builder.getBlob(); | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * Fired once for every blob of data received. | ||||
|      *  | ||||
|      * @event | ||||
|      * @param {Number} length The number of bytes received. | ||||
|      */ | ||||
|     this.onprogress = null; | ||||
|  | ||||
|     /** | ||||
|      * Fired once this stream is finished and no further data will be written. | ||||
|      * @event | ||||
|      */ | ||||
|     this.onend = null; | ||||
|  | ||||
| }; | ||||
		Reference in New Issue
	
	Block a user