mirror of
				https://github.com/gyurix1968/guacamole-client.git
				synced 2025-10-30 08:33:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			128 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
|  * Licensed to the Apache Software Foundation (ASF) under one
 | |
|  * or more contributor license agreements.  See the NOTICE file
 | |
|  * distributed with this work for additional information
 | |
|  * regarding copyright ownership.  The ASF licenses this file
 | |
|  * to you under the Apache License, Version 2.0 (the
 | |
|  * "License"); you may not use this file except in compliance
 | |
|  * with the License.  You may obtain a copy of the License at
 | |
|  *
 | |
|  *   http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing,
 | |
|  * software distributed under the License is distributed on an
 | |
|  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 | |
|  * KIND, either express or implied.  See the License for the
 | |
|  * specific language governing permissions and limitations
 | |
|  * under the License.
 | |
|  */
 | |
| 
 | |
| 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);
 | |
| 
 | |
|         // Send success response
 | |
|         stream.sendAck("OK", 0x0000);
 | |
| 
 | |
|     };
 | |
| 
 | |
|     // 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;
 | |
| 
 | |
| }; |