14 lines
34 KiB
JavaScript
14 lines
34 KiB
JavaScript
|
/*
|
||
|
* noVNC: HTML5 VNC client
|
||
|
* Copyright (C) 2012 Joel Martin
|
||
|
* Copyright (C) 2013 Samuel Mannehed for Cendio AB
|
||
|
* Licensed under MPL 2.0 (see LICENSE.txt)
|
||
|
*
|
||
|
* See README.md for usage and integration instructions.
|
||
|
*
|
||
|
* TIGHT decoder portion:
|
||
|
* (c) 2012 Michael Tinglof, Joe Balaz, Les Piech (Mercuri.ca)
|
||
|
*/
|
||
|
|
||
|
var RFB;!function(){"use strict";RFB=function(t){t||(t={}),this._rfb_host="",this._rfb_port=5900,this._rfb_password="",this._rfb_path="",this._rfb_state="disconnected",this._rfb_version=0,this._rfb_max_version=3.8,this._rfb_auth_scheme="",this._rfb_tightvnc=!1,this._rfb_xvp_ver=0,this._encodings=[["COPYRECT",1],["TIGHT",7],["TIGHT_PNG",-260],["HEXTILE",5],["RRE",2],["RAW",0],["DesktopSize",-223],["Cursor",-239],["JPEG_quality_med",-26],["compress_hi",-247],["last_rect",-224],["xvp",-309],["ExtendedDesktopSize",-308]],this._encHandlers={},this._encNames={},this._encStats={},this._sock=null,this._display=null,this._keyboard=null,this._mouse=null,this._sendTimer=null,this._disconnTimer=null,this._msgTimer=null,this._FBU={rects:0,subrects:0,lines:0,tiles:0,bytes:0,x:0,y:0,width:0,height:0,encoding:0,subencoding:-1,background:null,zlib:[]},this._fb_Bpp=4,this._fb_depth=3,this._fb_width=0,this._fb_height=0,this._fb_name="",this._destBuff=null,this._paletteBuff=new Uint8Array(1024),this._rre_chunk_sz=100,this._timing={last_fbu:0,fbu_total:0,fbu_total_cnt:0,full_fbu_total:0,full_fbu_cnt:0,fbu_rt_start:0,fbu_rt_total:0,fbu_rt_cnt:0,pixels:0},this._supportsSetDesktopSize=!1,this._screen_id=0,this._screen_flags=0,this._mouse_buttonMask=0,this._mouse_arr=[],this._viewportDragging=!1,this._viewportDragPos={},this._viewportHasMoved=!1,Util.set_defaults(this,t,{target:"null",focusContainer:document,encrypt:!1,true_color:!0,local_cursor:!1,shared:!0,view_only:!1,xvp_password_sep:"@",disconnectTimeout:3,wsProtocols:["binary"],repeaterID:"",viewportDrag:!1,onUpdateState:function(){},onPasswordRequired:function(){},onClipboard:function(){},onBell:function(){},onFBUReceive:function(){},onFBUComplete:function(){},onFBResize:function(){},onDesktopName:function(){},onXvpInit:function(){}}),Util.Debug(">> RFB.constructor"),Object.keys(RFB.encodingHandlers).forEach(function(t){this._encHandlers[t]=RFB.encodingHandlers[t].bind(this)}.bind(this));for(var s=0;s<this._encodings.length;s++)this._encHandlers[this._encodings[s][1]]=this._encHandlers[this._encodings[s][0]],this._encNames[this._encodings[s][1]]=this._encodings[s][0],this._encStats[this._encodings[s][1]]=[0,0];try{this._display=new Display({target:this._target})}catch(t){throw Util.Error("Display exception: "+t),t}this._keyboard=new Keyboard({target:this._focusContainer,onKeyPress:this._handleKeyPress.bind(this)}),this._mouse=new Mouse({target:this._target,onMouseButton:this._handleMouseButton.bind(this),onMouseMove:this._handleMouseMove.bind(this),notify:this._keyboard.sync.bind(this._keyboard)}),this._sock=new Websock,this._sock.on("message",this._handle_message.bind(this)),this._sock.on("open",function(){"connect"===this._rfb_state?this._updateState("ProtocolVersion","Starting VNC handshake"):this._fail("Got unexpected WebSocket connection")}.bind(this)),this._sock.on("close",function(t){Util.Warn("WebSocket on-close event");var s="";t.code&&(s=" (code: "+t.code,t.reason&&(s+=", reason: "+t.reason),s+=")"),"disconnect"===this._rfb_state?this._updateState("disconnected","VNC disconnected"+s):"ProtocolVersion"===this._rfb_state?this._fail("Failed to connect to server"+s):this._rfb_state in{failed:1,disconnected:1}?Util.Error("Received onclose while disconnected"+s):this._fail("Server disconnected"+s),this._sock.off("close")}.bind(this)),this._sock.on("error",function(t){Util.Warn("WebSocket on-error event")}),this._init_vars();var i=this._display.get_render_mode();if(!Websock_native)throw this._cleanupSocket("fatal"),new Error("WebSocket support is required to use noVNC");Util.Info("Using native WebSockets"),this._updateState("loaded","noVNC ready: native WebSockets, "+i),Util.Debug("<< RFB.constructor")},RFB.prototype={connect:function(t,s,i,e){if(this._rfb_host=t,this._rfb_port=s,this._rfb_password=void 0!==i?i:"",this._rfb_path=void 0!==e?e:"",!this._rfb_host||!this._rfb_port)return this._fail("Must set host and port");this._updateState("connect")},disconnect:function(){this._updateState("disconnect","Disconnecting"),this._sock.off("error"),this._sock.off("message"),this._sock.off("o
|
||
|
this._FBU.bytes+=this._fb_depth;break;case"jpeg":case"png":this._FBU.bytes+=3;break;case"filter":this._FBU.bytes+=2}if(this._sock.rQwait("TIGHT "+s,this._FBU.bytes))return!1;switch(s){case"fill":this._display.fillRect(this._FBU.x,this._FBU.y,this._FBU.width,this._FBU.height,[l[c+3],l[c+2],l[c+1]],!1),this._sock.rQskipBytes(4);break;case"png":case"jpeg":var p=c+1;if(e=1,r=0,r+=127&l[p],128&l[p]&&(e++,r+=(127&l[p+1])<<7,128&l[p+1]&&(e++,r+=l[p+2]<<14)),this._FBU.bytes=1+e+r,this._sock.rQwait("TIGHT "+s,this._FBU.bytes))return!1;this._sock.rQskipBytes(1+e);var b=new Image;b.src="data: image/"+s+RFB.extract_data_uri(this._sock.rQshiftBytes(r)),this._display.renderQ_push({type:"img",img:b,x:this._FBU.x,y:this._FBU.y}),b=null;break;case"filter":var g=l[c+1];if(1!==g)throw new Error("Unsupported tight subencoding received, filter: "+g);if(!f())return!1;break;case"copy":if(!u())return!1}return this._FBU.bytes=0,this._FBU.rects--,!0},TIGHT:function(){return this._encHandlers.display_tight(!1)},TIGHT_PNG:function(){return this._encHandlers.display_tight(!0)},last_rect:function(){return this._FBU.rects=0,!0},handle_FB_resize:function(){return this._fb_width=this._FBU.width,this._fb_height=this._FBU.height,this._destBuff=new Uint8Array(this._fb_width*this._fb_height*4),this._display.resize(this._fb_width,this._fb_height),this._onFBResize(this,this._fb_width,this._fb_height),this._timing.fbu_rt_start=(new Date).getTime(),this._FBU.bytes=0,this._FBU.rects-=1,!0},ExtendedDesktopSize:function(){if(this._FBU.bytes=1,this._sock.rQwait("ExtendedDesktopSize",this._FBU.bytes))return!1;this._supportsSetDesktopSize=!0;var t=this._sock.rQpeek8();if(this._FBU.bytes=4+16*t,this._sock.rQwait("ExtendedDesktopSize",this._FBU.bytes))return!1;this._sock.rQskipBytes(1),this._sock.rQskipBytes(3);for(var s=0;s<t;s+=1)0===s?(this._screen_id=this._sock.rQshiftBytes(4),this._sock.rQskipBytes(2),this._sock.rQskipBytes(2),this._sock.rQskipBytes(2),this._sock.rQskipBytes(2),this._screen_flags=this._sock.rQshiftBytes(4)):this._sock.rQskipBytes(16);if(1===this._FBU.x&&0!==this._FBU.y){var i="";switch(this._FBU.y){case 1:i="Resize is administratively prohibited";break;case 2:i="Out of resources";break;case 3:i="Invalid screen layout";break;default:i="Unknown reason"}return Util.Info("Server did not accept the resize request: "+i),!0}return this._encHandlers.handle_FB_resize(),!0},DesktopSize:function(){return this._encHandlers.handle_FB_resize(),!0},Cursor:function(){Util.Debug(">> set_cursor");var t=this._FBU.x,s=this._FBU.y,i=this._FBU.width,e=this._FBU.height,r=i*e*this._fb_Bpp,_=Math.floor((i+7)/8)*e;return this._FBU.bytes=r+_,!this._sock.rQwait("cursor encoding",this._FBU.bytes)&&(this._display.changeCursor(this._sock.rQshiftBytes(r),this._sock.rQshiftBytes(_),t,s,i,e),this._FBU.bytes=0,this._FBU.rects--,Util.Debug("<< set_cursor"),!0)},JPEG_quality_lo:function(){Util.Error("Server sent jpeg_quality pseudo-encoding")},compress_lo:function(){Util.Error("Server sent compress level pseudo-encoding")}}}();
|