From fe950868c38ffe08f6b04ae575c5985bcd98ad86 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Tue, 27 Mar 2012 14:56:10 -0700 Subject: [PATCH] Make the final switch on console proxy refactoring work. new VNC engine will be in use after this commit Reviewed-By: Kelven --- build/build-cloud.xml | 57 +- build/package.xml | 2 +- console-proxy/.classpath | 1 - .../consoleproxy/AjaxFIFOImageCache.java | 4 +- .../AuthenticationException.java | 2 +- .../com/cloud/consoleproxy/ConsoleProxy.java | 3 +- .../consoleproxy/ConsoleProxyAjaxHandler.java | 2 +- .../ConsoleProxyAjaxImageHandler.java | 2 +- .../ConsoleProxyBaseServerFactoryImpl.java | 2 +- .../consoleproxy/ConsoleProxyClientBase.java | 4 +- .../ConsoleProxyClientHandler.java | 280 --- .../consoleproxy/ConsoleProxyCmdHandler.java | 2 +- .../ConsoleProxyLoggerFactory.java | 9 +- .../consoleproxy/ConsoleProxyMonitor.java | 3 +- .../ConsoleProxyResourceHandler.java | 2 +- .../consoleproxy/ConsoleProxyStatus.java | 63 - .../ConsoleProxyThumbnailHandler.java | 2 +- .../consoleproxy/ConsoleProxyViewer.java | 1225 ---------- .../consoleproxy/ConsoleProxy_obsolete.java | 680 ------ .../com/cloud/consoleproxy/ViewerOptions.java | 38 - .../consoleproxy/vnc/BufferedImageCanvas.java | 2 +- .../consoleproxy/vnc/FrameBufferCanvas.java | 2 +- .../com/cloud/consoleproxy/vnc/VncClient.java | 2 +- .../vnc/VncServerPacketReceiver.java | 2 +- .../vnc/packet/server/ServerCutText.java | 2 +- console-viewer/.classpath | 7 - console-viewer/.project | 17 - console-viewer/scripts/run-viewer.bat | 5 - .../com/cloud/consoleviewer/AuthPanel.java | 118 - .../com/cloud/consoleviewer/ButtonPanel.java | 164 -- .../cloud/consoleviewer/ClipboardFrame.java | 135 -- .../cloud/consoleviewer/ConsoleApplet.java | 167 -- .../cloud/consoleviewer/ConsoleViewer.java | 1247 ---------- .../com/cloud/consoleviewer/OptionsFrame.java | 418 ---- .../cloud/consoleviewer/RecordingFrame.java | 314 --- .../com/cloud/consoleviewer/ReloginPanel.java | 66 - console-viewer/test/test-applet.html | 48 - console/.classpath | 6 - console/.project | 17 - .../src/com/cloud/console/CapabilityInfo.java | 90 - .../src/com/cloud/console/CapsContainer.java | 109 - .../src/com/cloud/console/ConsoleCanvas.java | 2071 ----------------- .../src/com/cloud/console/ConsoleCanvas2.java | 63 - console/src/com/cloud/console/DesCipher.java | 496 ---- .../com/cloud/console/ITileScanListener.java | 27 - console/src/com/cloud/console/InStream.java | 180 -- console/src/com/cloud/console/Logger.java | 225 -- .../src/com/cloud/console/LoggerFactory.java | 23 - .../src/com/cloud/console/MemInStream.java | 35 - console/src/com/cloud/console/Region.java | 92 - .../com/cloud/console/RegionClassifier.java | 61 - console/src/com/cloud/console/RfbProto.java | 1479 ------------ .../com/cloud/console/RfbProtoAdapter.java | 29 - console/src/com/cloud/console/RfbViewer.java | 57 - .../com/cloud/console/SessionRecorder.java | 196 -- .../com/cloud/console/SplitInputStream.java | 86 - console/src/com/cloud/console/TileInfo.java | 57 - .../src/com/cloud/console/TileTracker.java | 271 --- .../src/com/cloud/console/ZlibInStream.java | 114 - 59 files changed, 29 insertions(+), 10854 deletions(-) rename {console/src/com/cloud/console => console-proxy/src/com/cloud/consoleproxy}/AuthenticationException.java (96%) delete mode 100644 console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientHandler.java delete mode 100644 console-proxy/src/com/cloud/consoleproxy/ConsoleProxyStatus.java delete mode 100644 console-proxy/src/com/cloud/consoleproxy/ConsoleProxyViewer.java delete mode 100644 console-proxy/src/com/cloud/consoleproxy/ConsoleProxy_obsolete.java delete mode 100644 console-proxy/src/com/cloud/consoleproxy/ViewerOptions.java delete mode 100644 console-viewer/.classpath delete mode 100644 console-viewer/.project delete mode 100644 console-viewer/scripts/run-viewer.bat delete mode 100644 console-viewer/src/com/cloud/consoleviewer/AuthPanel.java delete mode 100644 console-viewer/src/com/cloud/consoleviewer/ButtonPanel.java delete mode 100644 console-viewer/src/com/cloud/consoleviewer/ClipboardFrame.java delete mode 100644 console-viewer/src/com/cloud/consoleviewer/ConsoleApplet.java delete mode 100644 console-viewer/src/com/cloud/consoleviewer/ConsoleViewer.java delete mode 100644 console-viewer/src/com/cloud/consoleviewer/OptionsFrame.java delete mode 100644 console-viewer/src/com/cloud/consoleviewer/RecordingFrame.java delete mode 100644 console-viewer/src/com/cloud/consoleviewer/ReloginPanel.java delete mode 100644 console-viewer/test/test-applet.html delete mode 100644 console/.classpath delete mode 100644 console/.project delete mode 100644 console/src/com/cloud/console/CapabilityInfo.java delete mode 100644 console/src/com/cloud/console/CapsContainer.java delete mode 100644 console/src/com/cloud/console/ConsoleCanvas.java delete mode 100644 console/src/com/cloud/console/ConsoleCanvas2.java delete mode 100644 console/src/com/cloud/console/DesCipher.java delete mode 100644 console/src/com/cloud/console/ITileScanListener.java delete mode 100644 console/src/com/cloud/console/InStream.java delete mode 100644 console/src/com/cloud/console/Logger.java delete mode 100644 console/src/com/cloud/console/LoggerFactory.java delete mode 100644 console/src/com/cloud/console/MemInStream.java delete mode 100644 console/src/com/cloud/console/Region.java delete mode 100644 console/src/com/cloud/console/RegionClassifier.java delete mode 100644 console/src/com/cloud/console/RfbProto.java delete mode 100644 console/src/com/cloud/console/RfbProtoAdapter.java delete mode 100644 console/src/com/cloud/console/RfbViewer.java delete mode 100644 console/src/com/cloud/console/SessionRecorder.java delete mode 100644 console/src/com/cloud/console/SplitInputStream.java delete mode 100644 console/src/com/cloud/console/TileInfo.java delete mode 100644 console/src/com/cloud/console/TileTracker.java delete mode 100644 console/src/com/cloud/console/ZlibInStream.java diff --git a/build/build-cloud.xml b/build/build-cloud.xml index 728f5a42fe0..40e4111fd71 100755 --- a/build/build-cloud.xml +++ b/build/build-cloud.xml @@ -91,16 +91,10 @@ - - - - + - - - @@ -118,7 +112,6 @@ - @@ -317,19 +310,11 @@ - - - - - - - - - + @@ -364,7 +349,6 @@ - @@ -381,11 +365,6 @@ - - - - - @@ -410,7 +389,7 @@ - + @@ -421,36 +400,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/package.xml b/build/package.xml index a819fb488eb..da9e73cca02 100755 --- a/build/package.xml +++ b/build/package.xml @@ -283,7 +283,7 @@ - + diff --git a/console-proxy/.classpath b/console-proxy/.classpath index 6dd6176144b..c87c7cd3995 100644 --- a/console-proxy/.classpath +++ b/console-proxy/.classpath @@ -3,6 +3,5 @@ - diff --git a/console-proxy/src/com/cloud/consoleproxy/AjaxFIFOImageCache.java b/console-proxy/src/com/cloud/consoleproxy/AjaxFIFOImageCache.java index 0e8fcacce34..92e7827f3ec 100644 --- a/console-proxy/src/com/cloud/consoleproxy/AjaxFIFOImageCache.java +++ b/console-proxy/src/com/cloud/consoleproxy/AjaxFIFOImageCache.java @@ -22,8 +22,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; - -import com.cloud.console.Logger; + +import com.cloud.consoleproxy.util.Logger; public class AjaxFIFOImageCache { private static final Logger s_logger = Logger.getLogger(AjaxFIFOImageCache.class); diff --git a/console/src/com/cloud/console/AuthenticationException.java b/console-proxy/src/com/cloud/consoleproxy/AuthenticationException.java similarity index 96% rename from console/src/com/cloud/console/AuthenticationException.java rename to console-proxy/src/com/cloud/consoleproxy/AuthenticationException.java index d1f3bb2e74c..f77e75d8f1c 100644 --- a/console/src/com/cloud/console/AuthenticationException.java +++ b/console-proxy/src/com/cloud/consoleproxy/AuthenticationException.java @@ -17,7 +17,7 @@ */ // repackage it to VMOps common packaging structure -package com.cloud.console; +package com.cloud.consoleproxy; public class AuthenticationException extends Exception { private static final long serialVersionUID = -393139302884898842L; diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxy.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxy.java index 658cfe17d2a..f44b775bbaa 100644 --- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxy.java +++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxy.java @@ -14,8 +14,7 @@ import java.util.concurrent.Executor; import org.apache.log4j.xml.DOMConfigurator; -import com.cloud.console.AuthenticationException; -import com.cloud.console.Logger; +import com.cloud.consoleproxy.util.Logger; import com.sun.net.httpserver.HttpServer; /** diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java index 3c9e18c0985..f51a0b9f7ab 100644 --- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java +++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxHandler.java @@ -28,7 +28,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import com.cloud.console.Logger; +import com.cloud.consoleproxy.util.Logger; import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java index f151b6e4470..daf6060d7bd 100644 --- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java +++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java @@ -23,7 +23,7 @@ import java.io.OutputStream; import java.util.HashMap; import java.util.Map; -import com.cloud.console.Logger; +import com.cloud.consoleproxy.util.Logger; import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyBaseServerFactoryImpl.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyBaseServerFactoryImpl.java index abfa896c39d..18dbe51b63a 100644 --- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyBaseServerFactoryImpl.java +++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyBaseServerFactoryImpl.java @@ -23,7 +23,7 @@ import java.net.InetSocketAddress; import javax.net.ssl.SSLServerSocket; -import com.cloud.console.Logger; +import com.cloud.consoleproxy.util.Logger; import com.sun.net.httpserver.HttpServer; public class ConsoleProxyBaseServerFactoryImpl implements ConsoleProxyServerFactory { diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientBase.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientBase.java index b66213e68eb..b53b779b7b8 100644 --- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientBase.java +++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientBase.java @@ -6,8 +6,8 @@ import java.util.List; import org.apache.log4j.Logger; -import com.cloud.console.TileInfo; -import com.cloud.console.TileTracker; +import com.cloud.consoleproxy.util.TileInfo; +import com.cloud.consoleproxy.util.TileTracker; import com.cloud.consoleproxy.vnc.FrameBufferCanvas; /** diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientHandler.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientHandler.java deleted file mode 100644 index fee5fe4c360..00000000000 --- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyClientHandler.java +++ /dev/null @@ -1,280 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.consoleproxy; - -import java.io.BufferedInputStream; -import java.io.DataInputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.net.Socket; -import java.util.StringTokenizer; - -import com.cloud.console.Logger; -import com.cloud.console.RfbProto; - -public class ConsoleProxyClientHandler extends Thread { -/* - private static final Logger s_logger = Logger.getLogger(ConsoleProxyClientHandler.class); - - Socket clientSocket = null; - DataInputStream clientIns = null; - OutputStream clientOuts = null; - - public ConsoleProxyClientHandler(Socket client) { - clientSocket = client; - } - - synchronized void cleanup() { - try { - if (clientSocket != null) { - s_logger.info("Closing connection to " - + clientSocket.getInetAddress()); - - clientSocket.close(); - clientSocket = null; - } - } catch (IOException ioe) { - } - try { - if (clientIns != null) { - clientIns.close(); - clientIns = null; - } - } catch (IOException ioe) { - } - try { - if (clientOuts != null) { - clientOuts.close(); - clientOuts = null; - } - } catch (IOException ioe) { - } - } - - public void run() { - try { - String srcinfo = clientSocket.getInetAddress().getHostAddress() + - ":" + clientSocket.getPort(); - clientIns = new DataInputStream(new BufferedInputStream( - clientSocket.getInputStream())); -// clientOuts = new GZIPOutputStream(clientSocket.getOutputStream(), 65536); - clientOuts = clientSocket.getOutputStream(); - clientOuts.write("RFB 000.000\000".getBytes("US-ASCII")); - clientOuts.flush(); - int b1 = clientIns.read(); - int b2 = clientIns.read(); - if (b1 != 'V' || b2 != 'M') { - throw new Exception ("Bad header"); - } - byte[] proxyInfo = new byte[clientIns.read()]; - clientIns.readFully(proxyInfo); - String proxyString = new String(proxyInfo, "US-ASCII"); - StringTokenizer stk = new StringTokenizer(proxyString, ":\n"); - String host = stk.nextToken(); - int port = Integer.parseInt(stk.nextToken()); - String sid = stk.nextToken(); - ConsoleProxyViewer viewer = ConsoleProxy.getVncViewer(host, port, sid, "", ""); - - ConsoleProxy.waitForViewerToStart(viewer); - - handleClientSession(viewer, srcinfo); - } catch (Exception ioe) { - if(s_logger.isDebugEnabled()) - s_logger.debug(ioe.toString()); - } finally { - cleanup(); - } - } - - void writeServer (ConsoleProxyViewer viewer, byte[] b, int off, int len) { - viewer.writeServer(b, off, len); - } - - void writeClientU16 (int n) throws IOException { - byte[] b = new byte[2]; - b[0] = (byte) ((n >> 8) & 0xff); - b[1] = (byte) (n & 0xff); - clientOuts.write(b); - } - - void writeClientU32 (int n) throws IOException { - byte[] b = new byte[4]; - b[0] = (byte) ((n >> 24) & 0xff); - b[1] = (byte) ((n >> 16) & 0xff); - b[2] = (byte) ((n >> 8) & 0xff); - b[3] = (byte) (n & 0xff); - clientOuts.write(b); - } - - String RFB_VERSION_STRING = "RFB 003.008\n"; - - void handleClientSession(ConsoleProxyViewer viewer, String srcinfo) throws Exception { - s_logger.info("Start to handle client session"); - - viewer.setAjaxViewer(false); - - // Exchange version with client - clientOuts.write(RFB_VERSION_STRING.getBytes("US-ASCII")); - clientOuts.flush(); - byte[] clientVersion = new byte[12]; - clientIns.readFully(clientVersion); - if (!RFB_VERSION_STRING.equals(new String(clientVersion, "US-ASCII"))) { - throw new Exception("Bad client version"); - } - // Send security type -- no authentication needed - byte[] serverSecurity = new byte[2]; - serverSecurity[0] = 1; - serverSecurity[1] = 1; - clientOuts.write(serverSecurity); - clientOuts.flush(); - int clientSecurity = clientIns.read(); - if (clientSecurity != 1) { - throw new Exception("Unsupported client security type " + clientSecurity); - } - byte[] serverSecResp = new byte[4]; - serverSecResp[0] = serverSecResp[1] = serverSecResp[2] = serverSecResp[3] = 0; - clientOuts.write(serverSecResp); - clientOuts.flush(); - - // Receive and ignore client init - clientIns.read(); - - s_logger.info("Sending ServerInit w=" + viewer.rfb.framebufferWidth + - " h=" + viewer.rfb.framebufferHeight + - " bits=" + viewer.rfb.bitsPerPixel + - " depth=" + viewer.rfb.depth + - " name=" + viewer.rfb.desktopName); - // Send serverInit - writeClientU16(viewer.rfb.framebufferWidth); - writeClientU16(viewer.rfb.framebufferHeight); - clientOuts.write(viewer.rfb.bitsPerPixel); - clientOuts.write(viewer.rfb.depth); - clientOuts.write(viewer.rfb.bigEndian ? 1 : 0); - clientOuts.write(viewer.rfb.trueColour ? 1 : 0); - writeClientU16(viewer.rfb.redMax); - writeClientU16(viewer.rfb.greenMax); - writeClientU16(viewer.rfb.blueMax); - clientOuts.write(viewer.rfb.redShift); - clientOuts.write(viewer.rfb.greenShift); - clientOuts.write(viewer.rfb.blueShift); - byte[] pad = new byte[3]; - clientOuts.write(pad); - writeClientU32(viewer.rfb.desktopName.length()); - clientOuts.write(viewer.rfb.desktopName.getBytes("US-ASCII")); - clientOuts.flush(); - - // Lock the viewer to avoid race condition - synchronized (viewer) { - if (viewer.clientStream != null) { - s_logger.info("Disconnecting client link stream " + - viewer.clientStream.hashCode() + " from " + - viewer.clientStreamInfo); - viewer.clientStream.close(); - } - viewer.clientStream = clientOuts; - viewer.clientStreamInfo = srcinfo; - viewer.lastUsedTime = System.currentTimeMillis(); - - s_logger.info("Setting client link stream " + - viewer.clientStream.hashCode() + " from " + srcinfo); - } - - try { - while (!viewer.isDropped()) { - byte[] b = new byte[512]; - int nbytes = 0; - int msgType = clientIns.read(); - b[0] = (byte)msgType; - switch (msgType) { - case RfbProto.SetPixelFormat: - clientIns.readFully(b, 1, 19); - nbytes = 20; - - if(s_logger.isDebugEnabled()) - s_logger.debug("C->S RFB message SetPixelFormat, size=" + nbytes); - break; - - case RfbProto.SetEncodings: - - clientIns.read(); // padding - b[1] = 0; - int n = clientIns.readUnsignedShort(); - if (n > (512 - 4)/4) { - throw new Exception ("Too many client encodings"); - } - b[2] = (byte) ((n >> 8) & 0xff); - b[3] = (byte) (n & 0xff); - clientIns.readFully(b, 4, n * 4); - nbytes = n * 4 + 4; - - if(s_logger.isDebugEnabled()) - s_logger.debug("C->S RFB message SetEncodings, size=" + nbytes); - break; - - case RfbProto.FramebufferUpdateRequest: - clientIns.readFully(b, 1, 9); - nbytes = 10; - - if(s_logger.isDebugEnabled()) { - int i = b[1]; - int x = ((0xff & b[2]) << 8) + b[3]; - int y = ((0xff & b[4]) << 8) + b[5]; - int w = ((0xff & b[6]) << 8) + b[7]; - int h = ((0xff & b[8]) << 8) + b[9]; - - s_logger.debug("C->S RFB message FramebufferUpdateRequest, size=" + nbytes + " x=" + x - +" y=" + y + " w=" + w + " h=" + h); - } - break; - - case RfbProto.KeyboardEvent: - clientIns.readFully(b, 1, 7); - nbytes = 8; - - if(s_logger.isDebugEnabled()) - s_logger.debug("C->S RFB message KeyboardEvent, size=" + nbytes); - break; - case RfbProto.PointerEvent: - clientIns.readFully(b, 1, 5); - nbytes = 6; - - if(s_logger.isDebugEnabled()) - s_logger.debug("C->S RFB message PointerEvent, size=" + nbytes); - break; - - case RfbProto.VMOpsClientCustom: - clientIns.read(); // read and ignore, used to track liveliness - // of the client - if(s_logger.isDebugEnabled()) - s_logger.debug("C->S RFB message VMOpsClientCustom"); - break; - - default: - if(s_logger.isDebugEnabled()) - s_logger.debug("C->S unknown message type: " + msgType + ", size=" + nbytes); - throw new Exception("Bad client event type: " + msgType); - } - writeServer(viewer, b, 0, nbytes); - } - } finally { - viewer.lastUsedTime = System.currentTimeMillis(); - } - } -*/ -} diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyCmdHandler.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyCmdHandler.java index 38ef1dbda9a..839c778b2af 100644 --- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyCmdHandler.java +++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyCmdHandler.java @@ -22,7 +22,7 @@ import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; -import com.cloud.console.Logger; +import com.cloud.consoleproxy.util.Logger; import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyLoggerFactory.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyLoggerFactory.java index 42796ca7496..cc33d495ec6 100644 --- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyLoggerFactory.java +++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyLoggerFactory.java @@ -17,16 +17,19 @@ */ package com.cloud.consoleproxy; + +import com.cloud.consoleproxy.util.Logger; +import com.cloud.consoleproxy.util.LoggerFactory; -public class ConsoleProxyLoggerFactory implements com.cloud.console.LoggerFactory { +public class ConsoleProxyLoggerFactory implements LoggerFactory { public ConsoleProxyLoggerFactory() { } - public com.cloud.console.Logger getLogger(Class clazz) { + public Logger getLogger(Class clazz) { return new Log4jLogger(org.apache.log4j.Logger.getLogger(clazz)); } - public static class Log4jLogger extends com.cloud.console.Logger { + public static class Log4jLogger extends Logger { private org.apache.log4j.Logger logger; public Log4jLogger(org.apache.log4j.Logger logger) { diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyMonitor.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyMonitor.java index 7d8f624e961..d3fbb5f86f3 100644 --- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyMonitor.java +++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyMonitor.java @@ -26,7 +26,8 @@ import java.util.Map; import org.apache.log4j.xml.DOMConfigurator; -import com.cloud.console.Logger; +import com.cloud.consoleproxy.util.Logger; + // // This class is not currently in use, was planning to add a simulated embedded VNC server and monitor console proxy health by diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java index 2e6f18db258..cd5122dba77 100644 --- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java +++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java @@ -26,7 +26,7 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; -import com.cloud.console.Logger; +import com.cloud.consoleproxy.util.Logger; import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyStatus.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyStatus.java deleted file mode 100644 index 6a6e56d6353..00000000000 --- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyStatus.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.consoleproxy; - -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.Hashtable; - -/* -public class ConsoleProxyStatus { - ArrayList connections; - public ConsoleProxyStatus() { - } - public void setConnections(Hashtable connMap) { - ArrayList conns = new ArrayList(); - Enumeration e = connMap.keys(); - while (e.hasMoreElements()) { - synchronized (connMap) { - String key = e.nextElement(); - ConsoleProxyViewer viewer = connMap.get(key); - ConsoleProxyConnection conn = new ConsoleProxyConnection(); - conn.id = viewer.id; - conn.clientInfo = viewer.clientStreamInfo; - conn.host = viewer.host; - conn.port = viewer.port; - conn.tag = viewer.getTag(); - conn.createTime = viewer.createTime; - conn.lastUsedTime = viewer.lastUsedTime; - conns.add(conn); - } - } - connections = conns; - } - public static class ConsoleProxyConnection { - public int id; - public String clientInfo; - public String host; - public int port; - public String tag; - public long createTime; - public long lastUsedTime; - - public ConsoleProxyConnection() { - } - } -} -*/ \ No newline at end of file diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyThumbnailHandler.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyThumbnailHandler.java index 393fe0facc8..99ee14ed574 100644 --- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyThumbnailHandler.java +++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyThumbnailHandler.java @@ -30,7 +30,7 @@ import java.io.OutputStream; import java.util.HashMap; import java.util.Map; -import com.cloud.console.Logger; +import com.cloud.consoleproxy.util.Logger; import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyViewer.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyViewer.java deleted file mode 100644 index ed6174110c4..00000000000 --- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyViewer.java +++ /dev/null @@ -1,1225 +0,0 @@ -/** - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.consoleproxy; - - -import java.awt.Container; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.Graphics2D; -import java.awt.Rectangle; -import java.awt.Toolkit; -import java.awt.event.InputEvent; -import java.awt.event.KeyEvent; -import java.awt.event.MouseEvent; -import java.awt.image.BufferedImage; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.util.List; -import java.util.zip.GZIPOutputStream; - -import org.apache.log4j.Logger; - -import com.cloud.console.AuthenticationException; -import com.cloud.console.ConsoleCanvas; -import com.cloud.console.ConsoleCanvas2; -import com.cloud.console.ITileScanListener; -import com.cloud.console.Region; -import com.cloud.console.RfbProto; -import com.cloud.console.RfbProtoAdapter; -import com.cloud.console.RfbViewer; -import com.cloud.console.TileInfo; -import com.cloud.console.TileTracker; - -/* -public class ConsoleProxyViewer implements java.lang.Runnable, RfbViewer, RfbProtoAdapter, ITileScanListener { - private static final Logger s_logger = Logger.getLogger(ConsoleProxyViewer.class); - - public final static int STATUS_ERROR = -1; - public final static int STATUS_UNINITIALIZED = 0; - public final static int STATUS_CONNECTING = 1; - public final static int STATUS_INITIALIZING = 2; - public final static int STATUS_NORMAL_OPERATION = 3; - public final static int STATUS_AUTHENTICATION_FAILURE = 100; - - public final static int SHIFT_KEY_MASK = 64; - public final static int CTRL_KEY_MASK = 128; - public final static int META_KEY_MASK = 256; - public final static int ALT_KEY_MASK = 512; - - int id = getNextId(); - boolean compressServerMessage = false; - long createTime = System.currentTimeMillis(); - long lastUsedTime = System.currentTimeMillis(); - int status; - boolean dropMe = false; - boolean viewerInReuse = false; - - String host; - int port; - String tag = ""; - - RfbProto rfb; - Thread rfbThread; - OutputStream clientStream; - String clientStreamInfo; - String passwordParam; - - ViewerOptions options; - Frame vncFrame; - ConsoleCanvas vc; - Container vncContainer; - - boolean ajaxViewer = false; - long ajaxSessionId = 0; - TileTracker tracker; - Object tileDirtyEvent; - boolean dirtyFlag = false; - boolean justCreated = true; - AjaxFIFOImageCache ajaxImageCache = new AjaxFIFOImageCache(2); - - String cursorUpdatesDef; - String eightBitColorsDef; - - int deferScreenUpdates; - int deferCursorUpdates; - int deferUpdateRequests; - - int[] encodingsSaved; - int nEncodingsSaved; - - boolean framebufferResized = false; - int resizedFramebufferWidth; - int resizedFramebufferHeight; - - boolean cursorMoved = false; - int lastCursorPosX; - int lastCursorPosY; - - boolean cursorShapeChanged = false; - int lastCursorShapeEncodingType; - int lastCursorShapeHotX; - int lastCursorShapeHotY; - int lastCursorShapeWidth; - int lastCursorShapeHeight; - byte[] lastCursorShapeData; - - static int id_count = 1; - synchronized static int getNextId() { - return id_count++; - } - - public void init() { - initProxy(); - } - - private void initProxy() { - options = new ViewerOptions(); - options.viewOnly = true; - - cursorUpdatesDef = null; - eightBitColorsDef = null; - - tracker = new TileTracker(); - tracker.initTracking(64, 64, 800, 600); - - if(rfbThread != null) { - if(rfbThread.isAlive()) { - dropMe = true; - viewerInReuse = true; - if(rfb != null) - rfb.close(); - - try { - rfbThread.join(); - } catch (InterruptedException e) { - s_logger.warn("InterruptedException while waiting for RFB thread to exit"); - } - viewerInReuse = false; - } - } - - dropMe = false; - rfbThread = new Thread(this); - rfbThread.setName("RFB Thread " + rfbThread.getId() + " >" + host + ":" + port); - rfbThread.start(); - - tileDirtyEvent = new Object(); - } - - public synchronized boolean justCreated() { - if(justCreated) { - justCreated = false; - return true; - } - return false; - } - - public boolean isDropped() { - return dropMe; - } - - public void run() { - createCanvas(0, 0); - - int retries = 0; - while (!dropMe) { - try { - s_logger.info("Connecting to VNC server"); - status = STATUS_CONNECTING; - connectAndAuthenticate(); - retries = 0; // reset the retry count - status = STATUS_INITIALIZING; - doProtocolInitialisation(); - vc.rfb = rfb; - vc.setPixelFormat(); - - // if we have a client current connected, when we have reconnected to the server and - // received a new ServerInit info (in doProtocolInitialisation()), we will - // convert it into frame buffer size change to make sure following on updates - // don't fall out of range - // - if(clientStream != null) { - // 128 bytes will be enough for this single PDU - s_logger.info("Send init framebuffer size (" + rfb.framebufferWidth + ", " + rfb.framebufferHeight + ")"); - - ByteArrayOutputStream bos = new ByteArrayOutputStream(128); - try { - vc.encodeFramebufferResize(rfb.framebufferWidth, rfb.framebufferHeight, bos); - } catch(IOException e) { - } - writeToClientStream(bos.toByteArray()); - } - - vc.rfb.writeFramebufferUpdateRequest(0, 0, - vc.rfb.framebufferWidth, vc.rfb.framebufferHeight, - true); - status = STATUS_NORMAL_OPERATION; - vc.processNormalProtocol(); - } catch (AuthenticationException e) { - status = STATUS_AUTHENTICATION_FAILURE; - String msg = e.getMessage(); - s_logger.warn("Authentication exception, msg: " + msg + "sid: " + this.passwordParam); - } catch(OutOfMemoryError e) { - s_logger.error("Unrecoverable OutOfMemory Error, exit and let it be re-launched"); - System.exit(1); - } catch (Exception e) { - status = STATUS_ERROR; - s_logger.error("Unexpected exception ", e); - } finally { - // String oldName = Thread.currentThread().getName(); - encodingsSaved = null; - nEncodingsSaved = 0; - - s_logger.info("Close current RFB"); - synchronized (this) { - if (rfb != null) { - rfb.close(); - } - } - } - if (dropMe) { - break; - } - if (status == STATUS_AUTHENTICATION_FAILURE) { - break; - } else { - retries++; - if(retries > ConsoleProxy.reconnectMaxRetry) { - s_logger.info("Exception caught, retry has reached to maximum : " + retries + ", will give up and disconnect client"); - break; - } - - s_logger.info("Exception caught, retrying in 1 second, current retry:" + retries); - - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // ignored - } - } - } - - // make sure we remove it from the management map upon main thread termination - dropMe = true; - - // if we are reusing the viewer object, we shouldn't remove it from the map - // this can also prevent deadlock in initProxy() while initProxy tries to join - // the thread, as initProxy() is called with ConsoleProxy.connectionMap being locked - // while CoonsoleProxy.removeViewer() here will attempt to lock it from another thread - if(!viewerInReuse) - ConsoleProxy.removeViewer(this); - s_logger.info("RFB thread terminating"); - } - - void connectAndAuthenticate() throws Exception { - s_logger.info("Initializing..."); - - s_logger.info("Ensure ip route towards host " + host); - ConsoleProxy.ensureRoute(host); - - s_logger.info("Connecting to " + host + ", port " + port + "..."); - rfb = new RfbProto(host, port, this); - s_logger.info("Connected to server"); - - rfb.readVersionMsg(); - s_logger.info("RFB server supports protocol version " - + rfb.serverMajor + "." + rfb.serverMinor); - - rfb.writeVersionMsg(); - s_logger.info("Using RFB protocol version " + rfb.clientMajor - + "." + rfb.clientMinor); - - int secType = rfb.negotiateSecurity(); - int authType; - if (secType == RfbProto.SecTypeTight) { - s_logger.info("Enabling TightVNC protocol extensions"); - rfb.initCapabilities(); - rfb.setupTunneling(); - authType = rfb.negotiateAuthenticationTight(); - } else { - authType = secType; - } - - switch (authType) { - case RfbProto.AuthNone: - s_logger.info("No authentication needed"); - rfb.authenticateNone(); - break; - case RfbProto.AuthVNC: - s_logger.info("Performing standard VNC authentication"); - if (passwordParam != null) { - rfb.authenticateVNC(passwordParam); - } else { - throw new AuthenticationException("Bad password"); - } - break; - default: - throw new Exception("Unknown authentication scheme " + authType); - } - } - - static void authenticationExternally(String host, String port, String tag, String sid, String ticket) throws AuthenticationException { - if(!ConsoleProxy.authenticateConsoleAccess(host, port, tag, sid, ticket)) { - s_logger.warn("External authenticator failed authencation request for vm " + tag + " with sid " + sid); - - throw new AuthenticationException("External authenticator failed request for vm " + tag + " with sid " + sid); - } - } - - void doProtocolInitialisation() throws IOException { - rfb.writeClientInit(); - rfb.readServerInit(); - setEncodings(); - } - - void setEncodings() { - setEncodings(false); - } - - void setEncodings(boolean autoSelectOnly) { - if (options == null || rfb == null || !rfb.inNormalProtocol) - return; - - options.preferredEncoding = RfbProto.EncodingHextile; - - int preferredEncoding = options.preferredEncoding; - if (preferredEncoding == -1) { - long kbitsPerSecond = rfb.kbitsPerSecond(); - if (nEncodingsSaved < 1) { - // Choose Tight or ZRLE encoding for the very first update. - // Logger.log(Logger.INFO, "Using Tight/ZRLE encodings"); - preferredEncoding = RfbProto.EncodingTight; - } else if (kbitsPerSecond > 2000 - && encodingsSaved[0] != RfbProto.EncodingHextile) { - // Switch to Hextile if the connection speed is above 2Mbps. - s_logger.info("Throughput " + kbitsPerSecond - + " kbit/s - changing to Hextile encoding"); - preferredEncoding = RfbProto.EncodingHextile; - } else if (kbitsPerSecond < 1000 - && encodingsSaved[0] != RfbProto.EncodingTight) { - // Switch to Tight/ZRLE if the connection speed is below 1Mbps. - s_logger.info("Throughput " + kbitsPerSecond - + " kbit/s - changing to Tight/ZRLE encodings"); - preferredEncoding = RfbProto.EncodingTight; - } else { - // Don't change the encoder. - if (autoSelectOnly) - return; - preferredEncoding = encodingsSaved[0]; - } - } else { - // Auto encoder selection is not enabled. - if (autoSelectOnly) - return; - } - - int[] encodings = new int[20]; - int nEncodings = 0; - - encodings[nEncodings++] = preferredEncoding; - if (options.useCopyRect) { - encodings[nEncodings++] = RfbProto.EncodingCopyRect; - } - - if (preferredEncoding != RfbProto.EncodingTight) { - encodings[nEncodings++] = RfbProto.EncodingTight; - } - if (preferredEncoding != RfbProto.EncodingZRLE) { - encodings[nEncodings++] = RfbProto.EncodingZRLE; - } - if (preferredEncoding != RfbProto.EncodingHextile) { - encodings[nEncodings++] = RfbProto.EncodingHextile; - } - if (preferredEncoding != RfbProto.EncodingZlib) { - encodings[nEncodings++] = RfbProto.EncodingZlib; - } - if (preferredEncoding != RfbProto.EncodingCoRRE) { - encodings[nEncodings++] = RfbProto.EncodingCoRRE; - } - if (preferredEncoding != RfbProto.EncodingRRE) { - encodings[nEncodings++] = RfbProto.EncodingRRE; - } - - if (options.compressLevel >= 0 && options.compressLevel <= 9) { - encodings[nEncodings++] = RfbProto.EncodingCompressLevel0 - + options.compressLevel; - } - if (options.jpegQuality >= 0 && options.jpegQuality <= 9) { - encodings[nEncodings++] = RfbProto.EncodingQualityLevel0 - + options.jpegQuality; - } - - if (options.requestCursorUpdates) { - encodings[nEncodings++] = RfbProto.EncodingXCursor; - encodings[nEncodings++] = RfbProto.EncodingRichCursor; - if (!options.ignoreCursorUpdates) - encodings[nEncodings++] = RfbProto.EncodingPointerPos; - } - - encodings[nEncodings++] = RfbProto.EncodingLastRect; - encodings[nEncodings++] = RfbProto.EncodingNewFBSize; - - boolean encodingsWereChanged = false; - if (nEncodings != nEncodingsSaved) { - encodingsWereChanged = true; - } else { - for (int i = 0; i < nEncodings; i++) { - if (encodings[i] != encodingsSaved[i]) { - encodingsWereChanged = true; - break; - } - } - } - - if (encodingsWereChanged) { - try { - rfb.writeSetEncodings(encodings, nEncodings); - if (vc != null) { - vc.softCursorFree(); - } - } catch (Exception e) { - s_logger.error(e.toString(), e); - } - encodingsSaved = encodings; - nEncodingsSaved = nEncodings; - } - } - - protected void startRecording() throws IOException { - } - - protected void stopRecording() throws IOException { - } - - void createCanvas(int maxWidth, int maxHeight) { - vc = new ConsoleCanvas2(this, maxWidth, maxHeight); - - if (!options.viewOnly) - vc.enableInput(true); - } - - synchronized void writeToClientStream(byte[] bs) { - // writeToClientStream swallows exceptions to make sure problems writing - // to client stream do not impact the main loop - if (clientStream != null) { - try { - lastUsedTime = System.currentTimeMillis(); - synchronized (clientStream) { - clientStream.write(bs); - clientStream.flush(); - } - } catch (IOException e) { - if(s_logger.isDebugEnabled()) { - s_logger.debug("Writing to client stream failed, reason: " + e.getMessage()); - } - try { - clientStream.close(); - } catch (IOException ioe){ - // ignore - } - clientStream = null; - clientStreamInfo = null; - } - } - } - - // - // Implement RfbViewer interface - // - public boolean isProxy() { - return true; - } - - public boolean hasClientConnection() { - // always return false if the viewer is AJAX viewer - if(ajaxViewer) - return false; - - return clientStream != null; - } - - public RfbProto getRfb() { - return rfb; - } - - public Dimension getScreenSize() { - return (new Frame()).getToolkit().getScreenSize(); - // return vncFrame.getToolkit().getScreenSize(); - } - - public Dimension getFrameSize() { - // return vncFrame.getSize(); - return getScreenSize(); - } - - public int getScalingFactor() { - return options.scalingFactor; - } - - public int getCursorScaleFactor() { - return options.scaleCursor; - } - - public boolean ignoreCursorUpdate() { - return options.ignoreCursorUpdates; - } - - public int getDeferCursorUpdateTimeout() { - return 0; - // return deferCursorUpdates; - } - - public int getDeferScreenUpdateTimeout() { - return 0; - // return deferScreenUpdates; - } - - public int getDeferUpdateRequestTimeout() { - return 0; - //return deferUpdateRequests; - } - - public int setPixelFormat(RfbProto rfb) throws IOException { - if (options.eightBitColors) { - rfb.writeSetPixelFormat(8, 8, false, true, 7, 7, 3, 0, 3, 6); - return 1; - } else { - rfb.writeSetPixelFormat(32, 24, false, true, 255, 255, 255, 16, 8, 0); - return 4; - } - } - - public void onInputEnabled(boolean enable) { - // do nothing in proxy viewer - } - - public void onFramebufferSizeChange(int w, int h) { - tracker.resize(vc.scaledWidth, vc.scaledHeight); - - synchronized(this) { - framebufferResized = true; - resizedFramebufferWidth = w; - resizedFramebufferHeight = h; - } - - signalTileDirtyEvent(); - } - - public void onFramebufferUpdate(int x, int y, int w, int h) { - if(s_logger.isTraceEnabled()) - s_logger.trace("Frame buffer update {" + x + "," + y + "," + w + "," + h + "}"); - tracker.invalidate(new Rectangle(x, y, w, h)); - - signalTileDirtyEvent(); - } - - public void onFramebufferCursorMove(int x, int y) { - synchronized(this) { - cursorMoved = true; - lastCursorPosX = x; - lastCursorPosY = y; - } - - signalTileDirtyEvent(); - } - - public void onFramebufferCursorShapeChange(int encodingType, - int xhot, int yhot, int width, int height, byte[] cursorData) { - - synchronized(this) { - cursorShapeChanged = true; - - lastCursorShapeEncodingType = encodingType; - lastCursorShapeHotX = xhot; - lastCursorShapeHotY = yhot; - lastCursorShapeWidth = width; - lastCursorShapeHeight = height; - lastCursorShapeData = cursorData; - } - - signalTileDirtyEvent(); - } - - public void onDesktopResize() { - if(vncFrame != null) - vncFrame.pack(); - } - - public void onFrameResize(Dimension newSize) { - if(vncFrame != null) - vncFrame.setSize(newSize); - } - - public void onDisconnectMessage() { - // do nothing in viewer mode - } - - public void onBellMessage() { - Toolkit.getDefaultToolkit().beep(); - } - - public void onPreProtocolProcess(byte[] bs) throws IOException { - - if(s_logger.isTraceEnabled()) - s_logger.trace("Send " + (bs != null ? bs.length : 0) + " bytes (original) to client"); - - if (!ajaxViewer && bs != null && clientStream != null) { - if(s_logger.isInfoEnabled()) - s_logger.info("getSplit got " + bs.length + " bytes"); - if (compressServerMessage && bs.length > 10000) { - ByteArrayOutputStream bos = new ByteArrayOutputStream(256000); - GZIPOutputStream gos = new GZIPOutputStream(bos, 65536); - gos.write(bs); - gos.finish(); - byte[] nbs = bos.toByteArray(); - gos.close(); - int n = nbs.length; - - if(s_logger.isInfoEnabled()) - s_logger.info("Compressed " + bs.length + "=>" + n); - - byte[] b = new byte[6]; - b[0] = (byte) 250; - b[1] = 2; - b[2] = (byte) ((n >> 24) & 0xff); - b[3] = (byte) ((n >> 16) & 0xff); - b[4] = (byte) ((n >> 8) & 0xff); - b[5] = (byte) (n & 0xff); - - // make sure two seperated writes completed atomically - synchronized(clientStream) { - writeToClientStream(b); - writeToClientStream(nbs); - } - } else { - if(s_logger.isInfoEnabled()) - s_logger.info("Send uncompressed " + bs.length + " bytes to client"); - - writeToClientStream(bs); - } - } else { - if(s_logger.isTraceEnabled()) - s_logger.trace("Client is not connected, ignore forwarding " + (bs != null ? bs.length : 0) + " bytes to client"); - } - - rfb.sis.setSplit(); - } - - public boolean onPostFrameBufferUpdateProcess(boolean cursorPosReceived) throws IOException { - boolean fullUpdateNeeded = false; - - // Defer framebuffer update request if necessary. But wake up - // immediately on keyboard or mouse event. Also, don't sleep - // if there is some data to receive, or if the last update - // included a PointerPos message. - if (deferUpdateRequests > 0 && rfb.is.available() == 0 && !cursorPosReceived) { - synchronized(vc.rfb) { - try { - vc.rfb.wait(deferUpdateRequests); - } catch (InterruptedException e) { - } - } - } - - // Before requesting framebuffer update, check if the pixel - // format should be changed. If it should, request full update - // instead of an incremental one. - if (options.eightBitColors != (vc.bytesPixel == 1)) { - vc.setPixelFormat(); - fullUpdateNeeded = true; - } - - return fullUpdateNeeded; - } - - public void onProtocolProcessException(IOException e) { - byte[] bs = new byte[2]; - bs[0] = (byte)250; - bs[1] = 1; - writeToClientStream(bs); - } - - public Socket createConnection(String host, int port) throws IOException { - Socket sock = new Socket(); - sock.setSoTimeout(ConsoleProxy.readTimeoutSeconds*1000); - sock.setKeepAlive(true); - sock.connect(new InetSocketAddress(host, port), 30000); - return sock; - } - - public void writeInit(OutputStream os) throws IOException { - if (options.shareDesktop) { - os.write(1); - } else { - os.write(0); - } - } - - public void swapMouseButton(Integer[] masks) { - if (options.reverseMouseButtons2And3) { - Integer temp = masks[1]; - masks[1] = masks[0]; - masks[0] = temp; - } - } - - public boolean onTileChange(Rectangle rowMergedRect, int row, int col) { - // currently we don't do scan-based client update - return true; - } - - public void onRegionChange(List regionList) { - // obsolute - } - - private void signalTileDirtyEvent() { - synchronized(tileDirtyEvent) { - dirtyFlag = true; - tileDirtyEvent.notifyAll(); - } - } - - public String getTag() { - return tag; - } - - public void setTag(String tag) { - this.tag = tag; - } - - // - // AJAX Image manipulation - // - public void copyTile(Graphics2D g, int x, int y, Rectangle rc) { - if(vc != null && vc.memImage != null) { - synchronized(vc.memImage) { - g.drawImage(vc.memImage, x, y, x + rc.width, y + rc.height, - rc.x, rc.y, rc.x + rc.width, rc.y + rc.height, null); - } - } - } - - public byte[] getFrameBufferJpeg() { - int width = 800; - int height = 600; - if(vc != null) { - width = vc.scaledWidth; - height = vc.scaledHeight; - } - - if(s_logger.isTraceEnabled()) - s_logger.trace("getFrameBufferJpeg, w: " + width + ", h: " + height); - - BufferedImage bufferedImage = new BufferedImage(width, height, - BufferedImage.TYPE_3BYTE_BGR); - if(vc != null && vc.memImage != null) { - synchronized(vc.memImage) { - Graphics2D g = bufferedImage.createGraphics(); - g.drawImage(vc.memImage, 0, 0, width, height, 0, 0, width, height, null); - } - } - - byte[] imgBits = null; - try { - imgBits = jpegFromImage(bufferedImage); - } catch (IOException e) { - } - return imgBits; - } - - public byte[] getTilesMergedJpeg(List tileList, int tileWidth, int tileHeight) { - - int width = Math.max(tileWidth, tileWidth*tileList.size()); - BufferedImage bufferedImage = new BufferedImage(width, tileHeight, - BufferedImage.TYPE_3BYTE_BGR); - - if(s_logger.isTraceEnabled()) - s_logger.trace("Create merged image, w: " + width + ", h: " + tileHeight); - - if(vc != null && vc.memImage != null) { - synchronized(vc.memImage) { - Graphics2D g = bufferedImage.createGraphics(); - int i = 0; - for(TileInfo tile : tileList) { - Rectangle rc = tile.getTileRect(); - - if(s_logger.isTraceEnabled()) - s_logger.trace("Merge tile into jpeg from (" + rc.x + "," + rc.y + "," + (rc.x + rc.width) + "," + (rc.y + rc.height) + ") to (" + i*tileWidth + ",0)" ); - - g.drawImage(vc.memImage, i*tileWidth, 0, i*tileWidth + rc.width, rc.height, - rc.x, rc.y, rc.x + rc.width, rc.y + rc.height, null); - - i++; - } - } - } - - byte[] imgBits = null; - try { - imgBits = jpegFromImage(bufferedImage); - - if(s_logger.isTraceEnabled()) - s_logger.trace("Merge jpeg image size: " + imgBits.length + ", tiles: " + tileList.size()); - } catch (IOException e) { - } - return imgBits; - } - - public byte[] jpegFromImage(BufferedImage image) throws IOException { - ByteArrayOutputStream bos = new ByteArrayOutputStream(128000); - javax.imageio.ImageIO.write(image, "jpg", bos); - - byte[] jpegBits = bos.toByteArray(); - bos.close(); - return jpegBits; - } - - private String prepareAjaxImage(List tiles, boolean init) { - byte[] imgBits; - if(init) - imgBits = getFrameBufferJpeg(); - else - imgBits = getTilesMergedJpeg(tiles, tracker.getTileWidth(), tracker.getTileHeight()); - - if(imgBits == null) { - s_logger.warn("Unable to generate jpeg image"); - } else { - if(s_logger.isTraceEnabled()) - s_logger.trace("Generated jpeg image size: " + imgBits.length); - } - - int key = ajaxImageCache.putImage(imgBits); - StringBuffer sb = new StringBuffer("/ajaximg?host="); - sb.append(host).append("&port=").append(port).append("&sid=").append(passwordParam); - sb.append("&key=").append(key).append("&ts=").append(System.currentTimeMillis()); - return sb.toString(); - } - - private String prepareAjaxSession(boolean init) { - StringBuffer sb = new StringBuffer(); - - if(init) - ajaxSessionId++; - - sb.append("/ajax?host=").append(host).append("&port=").append(port); - sb.append("&sid=").append(passwordParam).append("&sess=").append(ajaxSessionId); - return sb.toString(); - } - - public String onAjaxClientKickoff() { - return "onKickoff();"; - } - - private boolean waitForViewerReady() { - long startTick = System.currentTimeMillis(); - while(System.currentTimeMillis() - startTick < 5000) { - if(this.status == ConsoleProxyViewer.STATUS_NORMAL_OPERATION) - return true; - - try { - Thread.sleep(100); - } catch (InterruptedException e) { - } - } - return false; - } - - private String onAjaxClientConnectFailed() { - return "

" + - "Unable to start console session as connection is refused by the machine you are accessing" + - "

"; - } - - public String onAjaxClientStart(String title, List languages, String guest) { - if(!waitForViewerReady()) - return onAjaxClientConnectFailed(); - - // make sure we switch to AJAX view on start - setAjaxViewer(true); - - int tileWidth = tracker.getTileWidth(); - int tileHeight = tracker.getTileHeight(); - int width = tracker.getTrackWidth(); - int height = tracker.getTrackHeight(); - - if(s_logger.isTraceEnabled()) - s_logger.trace("Ajax client start, frame buffer w: " + width + ", " + height); - - synchronized(this) { - if(framebufferResized) { - framebufferResized = false; - } - } - - int retry = 0; - if(justCreated()) { - tracker.initCoverageTest(); - - try { - rfb.writeFramebufferUpdateRequest(0, 0, tracker.getTrackWidth(), tracker.getTrackHeight(), false); - - while(!tracker.hasFullCoverage() && retry < 10) { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - } - retry++; - } - } catch (IOException e1) { - s_logger.warn("Connection was broken "); - } - } - - List tiles = tracker.scan(true); - String imgUrl = prepareAjaxImage(tiles, true); - String updateUrl = prepareAjaxSession(true); - - StringBuffer sbTileSequence = new StringBuffer(); - int i = 0; - for(TileInfo tile : tiles) { - sbTileSequence.append("[").append(tile.getRow()).append(",").append(tile.getCol()).append("]"); - if(i < tiles.size() - 1) - sbTileSequence.append(","); - - i++; - } - - return getAjaxViewerPageContent(sbTileSequence.toString(), imgUrl, - updateUrl, width, height, tileWidth, tileHeight, title, - ConsoleProxy.keyboardType == ConsoleProxy.KEYBOARD_RAW, languages, guest); - } - - private String getAjaxViewerPageContent(String tileSequence, String imgUrl, String updateUrl, int width, - int height, int tileWidth, int tileHeight, String title, boolean rawKeyboard, List languages, String guest) { - - StringBuffer sbLanguages = new StringBuffer(""); - if(languages != null) { - for(String lang : languages) { - if(sbLanguages.length() > 0) { - sbLanguages.append(","); - } - sbLanguages.append(lang); - } - } - - boolean linuxGuest = true; - if(guest != null && guest.equalsIgnoreCase("windows")) - linuxGuest = false; - - String[] content = new String[] { - "", - "", - "", - "", - "", - "", - "", - "", - "" + title + "", - "", - "", - "
", - "", - "", - "
", - "
", - "", - "", - "" - }; - - StringBuffer sb = new StringBuffer(); - for(int i = 0; i < content.length; i++) - sb.append(content[i]); - - return sb.toString(); - } - - public String onAjaxClientDisconnected() { - return "onDisconnect();"; - } - - public String onAjaxClientUpdate() { - if(!waitForViewerReady()) - return onAjaxClientDisconnected(); - - synchronized(tileDirtyEvent) { - if(!dirtyFlag) { - try { - tileDirtyEvent.wait(3000); - } catch(InterruptedException e) { - } - } - } - - boolean doResize = false; - synchronized(this) { - if(framebufferResized) { - framebufferResized = false; - doResize = true; - } - } - - List tiles; - - if(doResize) - tiles = tracker.scan(true); - else - tiles = tracker.scan(false); - dirtyFlag = false; - - String imgUrl = prepareAjaxImage(tiles, false); - StringBuffer sbTileSequence = new StringBuffer(); - int i = 0; - for(TileInfo tile : tiles) { - sbTileSequence.append("[").append(tile.getRow()).append(",").append(tile.getCol()).append("]"); - if(i < tiles.size() - 1) - sbTileSequence.append(","); - - i++; - } - - return getAjaxViewerUpdatePageContent(sbTileSequence.toString(), imgUrl, doResize, resizedFramebufferWidth, - resizedFramebufferHeight, tracker.getTileWidth(), tracker.getTileHeight()); - } - - private String getAjaxViewerUpdatePageContent(String tileSequence, String imgUrl, boolean resized, int width, - int height, int tileWidth, int tileHeight) { - - String[] content = new String[] { - "tileMap = [ " + tileSequence + " ];", - resized ? "ajaxViewer.resize('main_panel', " + width + ", " + height + " , " + tileWidth + ", " + tileHeight + ");" : "", - "ajaxViewer.refresh('" + imgUrl + "', tileMap, false);" - }; - - StringBuffer sb = new StringBuffer(); - for(int i = 0; i < content.length; i++) - sb.append(content[i]); - - return sb.toString(); - } - - - public long getAjaxSessionId() { - return this.ajaxSessionId; - } - - public AjaxFIFOImageCache getAjaxImageCache() { - return ajaxImageCache; - } - - public boolean isAjaxViewer() { - return ajaxViewer; - } - - public synchronized void setAjaxViewer(boolean ajaxViewer) { - if(this.ajaxViewer != ajaxViewer) { - if(this.ajaxViewer) { - // previous session was AJAX session - this.ajaxSessionId++; // increase the session id so that it will disconnect existing AJAX viewer - } else { - // close java client session - if(clientStream != null) { - byte[] bs = new byte[2]; - bs[0] = (byte)250; - bs[1] = 1; - writeToClientStream(bs); - - try { - clientStream.close(); - } catch (IOException e) { - } - clientStream = null; - } - } - this.ajaxViewer = ajaxViewer; - } - } - - public void writeServer(byte[] b, int off, int len) { - synchronized (this) { - if (!rfb.closed()) { - try { - // We lock the viewer to avoid race condition when connecting one - // client forces the current client to disconnect. - rfb.os.write(b, off, len); - rfb.os.flush(); - } catch (IOException e) { - // Swallow the exception because we want the client connection to sustain - // even when server connection is severed and reestablished. - s_logger.info("Ignore exception when writing to server: " + e); - rfb.close(); - } - } else { - s_logger.info("Dropping client event because server connection is closed "); - } - } - } - - public void sendClientMouseEvent(int event, int x, int y, int code, int modifiers) { - if(code == 2) - modifiers |= MouseEvent.BUTTON3_MASK; - else - modifiers |= MouseEvent.BUTTON1_MASK; - - int id = 0; - if(event == 1) - id = MouseEvent.MOUSE_MOVED; - else if(event == 2) - id = MouseEvent.MOUSE_PRESSED; - else if(event == 3) - id = MouseEvent.MOUSE_RELEASED; - else if(event == 8) - id = MouseEvent.MOUSE_PRESSED; - - long curTicks = System.currentTimeMillis(); - MouseEvent mouseEvent = new MouseEvent(vc, id, - curTicks, modifiers, x, y, 1, false); - - synchronized (this) { - if (rfb != null && !rfb.closed()) { - try { - rfb.writePointerEvent(mouseEvent); - if(event == 8) { - if(s_logger.isTraceEnabled()) - s_logger.trace("Replay mouse double click event at " + x + "," + y); - - mouseEvent = new MouseEvent(vc, MouseEvent.MOUSE_RELEASED, - curTicks, modifiers, x, y, 1, false); - rfb.writePointerEvent(mouseEvent); - - mouseEvent = new MouseEvent(vc, MouseEvent.MOUSE_PRESSED, - curTicks, modifiers, x, y, 1, false); - rfb.writePointerEvent(mouseEvent); - - mouseEvent = new MouseEvent(vc, MouseEvent.MOUSE_RELEASED, - curTicks, modifiers, x, y, 1, false); - rfb.writePointerEvent(mouseEvent); - } - } catch (IOException e) { - s_logger.warn("Exception while sending mouse event. ", e); - } - } - } - } - - public void sendClientRawKeyboardEvent(int event, int code, int modifiers) { - switch(event) { - case 4 : // Key press - break; - - case 5 : // Key down - writeRawKeyboardEvent(code, true); - break; - - case 6 : // Key Up - writeRawKeyboardEvent(code, false); - break; - } - } - - private void writeRawKeyboardEvent(int keysym, boolean down) { - synchronized (this) { - if (rfb != null && !rfb.closed()) { - try { - rfb.writeKeyEvent(keysym, down); - rfb.flushEventBuffer(); - } catch (IOException e) { - s_logger.warn("Exception while sending keyboard event. ", e); - } - } - } - } -} - -*/ diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxy_obsolete.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxy_obsolete.java deleted file mode 100644 index 1168e64186b..00000000000 --- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxy_obsolete.java +++ /dev/null @@ -1,680 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -package com.cloud.consoleproxy; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.Executor; - -import javax.net.ssl.SSLServerSocket; - -import org.apache.log4j.xml.DOMConfigurator; - -import com.cloud.console.AuthenticationException; -import com.cloud.console.Logger; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.sun.net.httpserver.HttpServer; - -/* -public class ConsoleProxy_obsolete { - private static final Logger s_logger = Logger.getLogger(ConsoleProxy_obsolete.class); - - public static final int KEYBOARD_RAW = 0; - public static final int KEYBOARD_COOKED = 1; - - public static Object context; - - // this has become more ugly, to store keystore info passed from management server (we now use management server managed keystore to support - // dynamically changing to customer supplied certificate) - public static byte[] ksBits; - public static String ksPassword; - - public static Method authMethod; - public static Method reportMethod; - public static Method ensureRouteMethod; - - static Hashtable connectionMap = new Hashtable(); - static int tcpListenPort = 5999; - static int httpListenPort = 80; - static int httpCmdListenPort = 8001; - static String jarDir = "./applet/"; - static boolean compressServerMessage = true; - static int viewerLinger = 180; - static int reconnectMaxRetry = 5; - static int readTimeoutSeconds = 90; - static int keyboardType = KEYBOARD_RAW; - static String factoryClzName; - static boolean standaloneStart = false; - - private static void configLog4j() { - URL configUrl = System.class.getResource("/conf/log4j-cloud.xml"); - if(configUrl == null) - configUrl = System.class.getClassLoader().getSystemResource("log4j-cloud.xml"); - - if(configUrl == null) - configUrl = System.class.getClassLoader().getSystemResource("conf/log4j-cloud.xml"); - - if(configUrl != null) { - try { - System.out.println("Configure log4j using " + configUrl.toURI().toString()); - } catch (URISyntaxException e1) { - e1.printStackTrace(); - } - - try { - File file = new File(configUrl.toURI()); - - System.out.println("Log4j configuration from : " + file.getAbsolutePath()); - DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000); - } catch (URISyntaxException e) { - System.out.println("Unable to convert log4j configuration Url to URI"); - } - // DOMConfigurator.configure(configUrl); - } else { - System.out.println("Configure log4j with default properties"); - } - } - - private static void configProxy(Properties conf) { - s_logger.info("Configure console proxy..."); - for(Object key : conf.keySet()) { - s_logger.info("Property " + (String)key + ": " + conf.getProperty((String)key)); - } - - String s = conf.getProperty("consoleproxy.tcpListenPort"); - if (s!=null) { - tcpListenPort = Integer.parseInt(s); - s_logger.info("Setting tcpListenPort=" + s); - } - - s = conf.getProperty("consoleproxy.httpListenPort"); - if (s!=null) { - httpListenPort = Integer.parseInt(s); - s_logger.info("Setting httpListenPort=" + s); - } - - s = conf.getProperty("premium"); - if(s != null && s.equalsIgnoreCase("true")) { - s_logger.info("Premium setting will override settings from consoleproxy.properties, listen at port 443"); - httpListenPort = 443; - factoryClzName = "com.cloud.consoleproxy.ConsoleProxySecureServerFactoryImpl"; - } else { - factoryClzName = ConsoleProxyBaseServerFactoryImpl.class.getName(); - } - - s = conf.getProperty("consoleproxy.httpCmdListenPort"); - if (s!=null) { - httpCmdListenPort = Integer.parseInt(s); - s_logger.info("Setting httpCmdListenPort=" + s); - } - s = conf.getProperty("consoleproxy.jarDir"); - if (s!=null) { - jarDir = s; - s_logger.info("Setting jarDir=" + s); - } - s = conf.getProperty("consoleproxy.viewerLinger"); - if (s!=null) { - viewerLinger = Integer.parseInt(s); - s_logger.info("Setting viewerLinger=" + s); - } - s = conf.getProperty("consoleproxy.compressServerMessage"); - if (s!=null) { - compressServerMessage = Boolean.parseBoolean(s); - s_logger.info("Setting compressServerMessage=" + s); - } - - s = conf.getProperty("consoleproxy.reconnectMaxRetry"); - if (s!=null) { - reconnectMaxRetry = Integer.parseInt(s); - s_logger.info("Setting reconnectMaxRetry=" + reconnectMaxRetry); - } - - s = conf.getProperty("consoleproxy.readTimeoutSeconds"); - if (s!=null) { - readTimeoutSeconds = Integer.parseInt(s); - s_logger.info("Setting readTimeoutSeconds=" + readTimeoutSeconds); - } - } - - public static ConsoleProxyServerFactory getHttpServerFactory() { - try { - Class clz = Class.forName(factoryClzName); - try { - ConsoleProxyServerFactory factory = (ConsoleProxyServerFactory)clz.newInstance(); - factory.init(ConsoleProxy_obsolete.ksBits, ConsoleProxy_obsolete.ksPassword); - return factory; - } catch (InstantiationException e) { - s_logger.error(e.getMessage(), e); - return null; - } catch (IllegalAccessException e) { - s_logger.error(e.getMessage(), e); - return null; - } - } catch (ClassNotFoundException e) { - s_logger.warn("Unable to find http server factory class: " + factoryClzName); - return new ConsoleProxyBaseServerFactoryImpl(); - } - } - - public static boolean authenticateConsoleAccess(String host, String port, String vmId, String sid, String ticket) { - if(standaloneStart) - return true; - - if(authMethod != null) { - Object result; - try { - result = authMethod.invoke(ConsoleProxy_obsolete.context, host, port, vmId, sid, ticket); - } catch (IllegalAccessException e) { - s_logger.error("Unable to invoke authenticateConsoleAccess due to IllegalAccessException" + " for vm: " + vmId, e); - return false; - } catch (InvocationTargetException e) { - s_logger.error("Unable to invoke authenticateConsoleAccess due to InvocationTargetException " + " for vm: " + vmId, e); - return false; - } - - if(result != null && result instanceof Boolean) { - return ((Boolean)result).booleanValue(); - } else { - s_logger.error("Invalid authentication return object " + result + " for vm: " + vmId + ", decline the access"); - return false; - } - - } else { - s_logger.warn("Private channel towards management server is not setup. Switch to offline mode and allow access to vm: " + vmId); - return true; - } - } - - public static void reportLoadInfo(String gsonLoadInfo) { - if(reportMethod != null) { - try { - reportMethod.invoke(ConsoleProxy_obsolete.context, gsonLoadInfo); - } catch (IllegalAccessException e) { - s_logger.error("Unable to invoke reportLoadInfo due to " + e.getMessage()); - } catch (InvocationTargetException e) { - s_logger.error("Unable to invoke reportLoadInfo due to " + e.getMessage()); - } - } else { - s_logger.warn("Private channel towards management server is not setup. Switch to offline mode and ignore load report"); - } - } - - public static void ensureRoute(String address) { - if(ensureRouteMethod != null) { - try { - ensureRouteMethod.invoke(ConsoleProxy_obsolete.context, address); - } catch (IllegalAccessException e) { - s_logger.error("Unable to invoke ensureRoute due to " + e.getMessage()); - } catch (InvocationTargetException e) { - s_logger.error("Unable to invoke ensureRoute due to " + e.getMessage()); - } - } else { - s_logger.warn("Unable to find ensureRoute method, console proxy agent is not up to date"); - } - } - - public static void startWithContext(Properties conf, Object context, byte[] ksBits, String ksPassword) { - s_logger.info("Start console proxy with context"); - if(conf != null) { - for(Object key : conf.keySet()) { - s_logger.info("Context property " + (String)key + ": " + conf.getProperty((String)key)); - } - } - - configLog4j(); - Logger.setFactory(new ConsoleProxyLoggerFactory()); - - // Using reflection to setup private/secure communication channel towards management server - ConsoleProxy_obsolete.context = context; - ConsoleProxy_obsolete.ksBits = ksBits; - ConsoleProxy_obsolete.ksPassword = ksPassword; - try { - Class contextClazz = Class.forName("com.cloud.agent.resource.consoleproxy.ConsoleProxyResource"); - authMethod = contextClazz.getDeclaredMethod("authenticateConsoleAccess", String.class, String.class, String.class, String.class, String.class); - reportMethod = contextClazz.getDeclaredMethod("reportLoadInfo", String.class); - ensureRouteMethod = contextClazz.getDeclaredMethod("ensureRoute", String.class); - } catch (SecurityException e) { - s_logger.error("Unable to setup private channel due to SecurityException", e); - } catch (NoSuchMethodException e) { - s_logger.error("Unable to setup private channel due to NoSuchMethodException", e); - } catch (IllegalArgumentException e) { - s_logger.error("Unable to setup private channel due to IllegalArgumentException", e); - } catch(ClassNotFoundException e) { - s_logger.error("Unable to setup private channel due to ClassNotFoundException", e); - } - - // merge properties from conf file - InputStream confs = ConsoleProxy_obsolete.class.getResourceAsStream("/conf/consoleproxy.properties"); - Properties props = new Properties(); - if (confs == null) { - s_logger.info("Can't load consoleproxy.properties from classpath, will use default configuration"); - } else { - try { - props.load(confs); - - for(Object key : props.keySet()) { - // give properties passed via context high priority, treat properties from consoleproxy.properties - // as default values - if(conf.get(key) == null) - conf.put(key, props.get(key)); - } - } catch (Exception e) { - s_logger.error(e.toString(), e); - } - } - - start(conf); - } - - public static void start(Properties conf) { - System.setProperty("java.awt.headless", "true"); - - configProxy(conf); - - ConsoleProxyServerFactory factory = getHttpServerFactory(); - if(factory == null) { - s_logger.error("Unable to load console proxy server factory"); - System.exit(1); - } - - if(httpListenPort != 0) { - startupHttpMain(); - } else { - s_logger.error("A valid HTTP server port is required to be specified, please check your consoleproxy.httpListenPort settings"); - System.exit(1); - } - - if(httpCmdListenPort > 0) { - startupHttpCmdPort(); - } else { - s_logger.info("HTTP command port is disabled"); - } - - ViewerGCThread cthread = new ViewerGCThread(connectionMap); - cthread.setName("Viewer GC Thread"); - cthread.start(); - - if(tcpListenPort > 0) { - SSLServerSocket srvSock = null; - try { - srvSock = factory.createSSLServerSocket(tcpListenPort); - s_logger.info("Listening for TCP on port " + tcpListenPort); - } catch (IOException ioe) { - s_logger.error(ioe.toString(), ioe); - System.exit(1); - } - - if(srvSock != null) { - while (true) { - Socket conn = null; - try { - conn = srvSock.accept(); - String srcinfo = conn.getInetAddress().getHostAddress() + ":" + conn.getPort(); - s_logger.info("Accepted connection from " + srcinfo); - conn.setSoLinger(false,0); - ConsoleProxyClientHandler worker = new ConsoleProxyClientHandler(conn); - worker.setName("Proxy Thread " + worker.getId() + " <" + srcinfo); - worker.start(); - } catch (IOException ioe2) { - s_logger.error(ioe2.toString(), ioe2); - try { - if (conn != null) { - conn.close(); - } - } catch (IOException ioe) {} - } catch (Throwable e) { - // Something really bad happened - // Terminate the program - s_logger.error(e.toString(), e); - System.exit(1); - } - } - } else { - s_logger.warn("TCP port is enabled in configuration but we are not able to instantiate server socket."); - } - } else { - s_logger.info("TCP port is disabled for applet viewers"); - } - } - - private static void startupHttpMain() { - try { - ConsoleProxyServerFactory factory = getHttpServerFactory(); - if(factory == null) { - s_logger.error("Unable to load HTTP server factory"); - System.exit(1); - } - - HttpServer server = factory.createHttpServerInstance(httpListenPort); - server.createContext("/getscreen", new ConsoleProxyThumbnailHandler()); - server.createContext("/resource/", new ConsoleProxyResourceHandler()); - server.createContext("/ajax", new ConsoleProxyAjaxHandler()); - server.createContext("/ajaximg", new ConsoleProxyAjaxImageHandler()); - server.setExecutor(new ThreadExecutor()); // creates a default executor - server.start(); - } catch(Exception e) { - s_logger.error(e.getMessage(), e); - System.exit(1); - } - } - - private static void startupHttpCmdPort() { - try { - s_logger.info("Listening for HTTP CMDs on port " + httpCmdListenPort); - HttpServer cmdServer = HttpServer.create(new InetSocketAddress(httpCmdListenPort), 2); - cmdServer.createContext("/cmd", new ConsoleProxyCmdHandler()); - cmdServer.setExecutor(new ThreadExecutor()); // creates a default executor - cmdServer.start(); - } catch(Exception e) { - s_logger.error(e.getMessage(), e); - System.exit(1); - } - } - - public static void main(String[] argv) { - standaloneStart = true; - configLog4j(); - Logger.setFactory(new ConsoleProxyLoggerFactory()); - - InputStream confs = ConsoleProxy_obsolete.class.getResourceAsStream("/conf/consoleproxy.properties"); - Properties conf = new Properties(); - if (confs == null) { - s_logger.info("Can't load consoleproxy.properties from classpath, will use default configuration"); - } else { - try { - conf.load(confs); - } catch (Exception e) { - s_logger.error(e.toString(), e); - } - } - start(conf); - } - - static ConsoleProxyViewer createViewer() { - ConsoleProxyViewer viewer = new ConsoleProxyViewer(); - viewer.compressServerMessage = compressServerMessage; - return viewer; - } - - static void initViewer(ConsoleProxyViewer viewer, String host, int port, String tag, String sid, String ticket) throws AuthenticationException { - ConsoleProxyViewer.authenticationExternally(host, String.valueOf(port), tag, sid, ticket); - - viewer.host = host; - viewer.port = port; - viewer.tag = tag; - viewer.passwordParam = sid; - - viewer.init(); - } - - static ConsoleProxyViewer getVncViewer(String host, int port, String sid, String tag, String ticket) throws Exception { - ConsoleProxyViewer viewer = null; - - boolean reportLoadChange = false; - synchronized (connectionMap) { - viewer = connectionMap.get(host + ":" + port); - if (viewer == null) { - viewer = createViewer(); - initViewer(viewer, host, port, tag, sid, ticket); - connectionMap.put(host + ":" + port, viewer); - s_logger.info("Added viewer object " + viewer); - - reportLoadChange = true; - } else if (!viewer.rfbThread.isAlive()) { - s_logger.info("The rfb thread died, reinitializing the viewer " + - viewer); - initViewer(viewer, host, port, tag, sid, ticket); - - reportLoadChange = true; - } else if (!sid.equals(viewer.passwordParam)) { - s_logger.warn("Bad sid detected(VNC port may be reused). sid in session: " + viewer.passwordParam + ", sid in request: " + sid); - initViewer(viewer, host, port, tag, sid, ticket); - - reportLoadChange = true; - } - } - - if(viewer != null) { - if (viewer.status == ConsoleProxyViewer.STATUS_NORMAL_OPERATION) { - // Do not update lastUsedTime if the viewer is in the process of starting up - // or if it failed to authenticate. - viewer.lastUsedTime = System.currentTimeMillis(); - } - } - - if(reportLoadChange) { - ConsoleProxyStatus status = new ConsoleProxyStatus(); - status.setConnections(ConsoleProxy_obsolete.connectionMap); - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - String loadInfo = gson.toJson(status); - - ConsoleProxy_obsolete.reportLoadInfo(loadInfo); - if(s_logger.isDebugEnabled()) - s_logger.debug("Report load change : " + loadInfo); - } - - return viewer; - } - - static ConsoleProxyViewer getAjaxVncViewer(String host, int port, String sid, String tag, String ticket, String ajaxSession) throws Exception { - boolean reportLoadChange = false; - synchronized (connectionMap) { - ConsoleProxyViewer viewer = connectionMap.get(host + ":" + port); -// s_logger.info("view lookup " + host + ":" + port + " = " + viewer); - - if (viewer == null) { - viewer = createViewer(); - viewer.ajaxViewer = true; - - initViewer(viewer, host, port, tag, sid, ticket); - connectionMap.put(host + ":" + port, viewer); - s_logger.info("Added viewer object " + viewer); - reportLoadChange = true; - } else if (!viewer.rfbThread.isAlive()) { - s_logger.info("The rfb thread died, reinitializing the viewer " + - viewer); - initViewer(viewer, host, port, tag, sid, ticket); - reportLoadChange = true; - } else if (!sid.equals(viewer.passwordParam)) { - s_logger.warn("Bad sid detected(VNC port may be reused). sid in session: " + viewer.passwordParam + ", sid in request: " + sid); - initViewer(viewer, host, port, tag, sid, ticket); - reportLoadChange = true; - } else { - if(ajaxSession == null || ajaxSession.isEmpty()) - ConsoleProxyViewer.authenticationExternally(host, String.valueOf(port), tag, sid, ticket); - } - - if (viewer.status == ConsoleProxyViewer.STATUS_NORMAL_OPERATION) { - // Do not update lastUsedTime if the viewer is in the process of starting up - // or if it failed to authenticate. - viewer.lastUsedTime = System.currentTimeMillis(); - } - - if(reportLoadChange) { - ConsoleProxyStatus status = new ConsoleProxyStatus(); - status.setConnections(ConsoleProxy_obsolete.connectionMap); - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - String loadInfo = gson.toJson(status); - - ConsoleProxy_obsolete.reportLoadInfo(loadInfo); - if(s_logger.isDebugEnabled()) - s_logger.debug("Report load change : " + loadInfo); - } - return viewer; - } - } - - public static void removeViewer(ConsoleProxyViewer viewer) { - synchronized (connectionMap) { - for(Map.Entry entry : connectionMap.entrySet()) { - if(entry.getValue() == viewer) { - connectionMap.remove(entry.getKey()); - return; - } - } - } - } - - static void waitForViewerToStart(ConsoleProxyViewer viewer) throws Exception { - if (viewer.status == ConsoleProxyViewer.STATUS_NORMAL_OPERATION) { - return; - } - - Long startTime = System.currentTimeMillis(); - int delay = 500; - - while (System.currentTimeMillis() < startTime + 30000 && - viewer.status != ConsoleProxyViewer.STATUS_NORMAL_OPERATION) { - if (viewer.status == ConsoleProxyViewer.STATUS_AUTHENTICATION_FAILURE) { - throw new Exception ("Authentication failure"); - } - try { - Thread.sleep(delay); - } catch (InterruptedException e) { - // ignore - } - delay = (int)(delay * 1.5); - } - - if (viewer.status != ConsoleProxyViewer.STATUS_NORMAL_OPERATION) { - throw new Exception ("Cannot start VncViewer"); - } - - s_logger.info("Waited " + - (System.currentTimeMillis() - startTime) + "ms for VncViewer to start"); - } - - static class ThreadExecutor implements Executor { - public void execute(Runnable r) { - new Thread(r).start(); - } - } - - static class ViewerGCThread extends Thread { - Hashtable connMap; - long lastLogScan = 0L; - - public ViewerGCThread(Hashtable connMap) { - this.connMap = connMap; - } - - private void cleanupLogging() { - if(lastLogScan != 0 && System.currentTimeMillis() - lastLogScan < 3600000) - return; - lastLogScan = System.currentTimeMillis(); - - File logDir = new File("./logs"); - File files[] = logDir.listFiles(); - if(files != null) { - for(File file : files) { - if(System.currentTimeMillis() - file.lastModified() >= 86400000L) { - try { - file.delete(); - } catch(Throwable e) { - } - } - } - } - } - - @Override - public void run() { - while (true) { - cleanupLogging(); - - s_logger.info("connMap=" + connMap); - Enumeration e = connMap.keys(); - while (e.hasMoreElements()) { - String key; - ConsoleProxyViewer viewer; - - synchronized (connMap) { - key = e.nextElement(); - viewer = connMap.get(key); - } - - long seconds_unused = (System.currentTimeMillis() - viewer.lastUsedTime) / 1000; - - if (seconds_unused > viewerLinger / 2 && viewer.clientStream != null) { - s_logger.info("Pinging client for " + viewer + - " which has not been used for " + seconds_unused + "sec"); - byte[] bs = new byte[2]; - bs[0] = (byte)250; - bs[1] = 3; - viewer.writeToClientStream(bs); - } - - if (seconds_unused < viewerLinger) { - continue; - } - - synchronized (connMap) { - connMap.remove(key); - } - // close the server connection - s_logger.info("Dropping " + viewer + - " which has not been used for " + - seconds_unused + " seconds"); - viewer.dropMe = true; - synchronized (viewer) { - if (viewer.clientStream != null) { - try { - viewer.clientStream.close(); - } catch (IOException ioe) { - // ignored - } - viewer.clientStream = null; - viewer.clientStreamInfo = null; - } - if (viewer.rfb != null) { - viewer.rfb.close(); - } - } - - // report load change for removal of the viewer - ConsoleProxyStatus status = new ConsoleProxyStatus(); - status.setConnections(ConsoleProxy_obsolete.connectionMap); - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - String loadInfo = gson.toJson(status); - - ConsoleProxy_obsolete.reportLoadInfo(loadInfo); - if(s_logger.isDebugEnabled()) - s_logger.debug("Report load change : " + loadInfo); - } - try { - Thread.sleep(30000); - } catch (InterruptedException exp) { - // Ignore - } - } - } - } -} -*/ diff --git a/console-proxy/src/com/cloud/consoleproxy/ViewerOptions.java b/console-proxy/src/com/cloud/consoleproxy/ViewerOptions.java deleted file mode 100644 index 4ad8930e6f3..00000000000 --- a/console-proxy/src/com/cloud/consoleproxy/ViewerOptions.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.consoleproxy; - -public class ViewerOptions { - public int preferredEncoding = -1; - public int compressLevel = 5; - public int jpegQuality = 5; - public boolean useCopyRect = false; - public boolean requestCursorUpdates = true; - public boolean ignoreCursorUpdates = false; - - public boolean eightBitColors = false; - - public boolean reverseMouseButtons2And3 = false; - public boolean shareDesktop = true; - public boolean viewOnly = false; - public int scaleCursor = 0; - - public boolean autoScale = false; - public int scalingFactor = 100; -} diff --git a/console-proxy/src/com/cloud/consoleproxy/vnc/BufferedImageCanvas.java b/console-proxy/src/com/cloud/consoleproxy/vnc/BufferedImageCanvas.java index 3633eb1a1d8..9eb18320dda 100644 --- a/console-proxy/src/com/cloud/consoleproxy/vnc/BufferedImageCanvas.java +++ b/console-proxy/src/com/cloud/consoleproxy/vnc/BufferedImageCanvas.java @@ -10,8 +10,8 @@ import java.awt.image.BufferedImage; import java.io.IOException; import java.util.List; -import com.cloud.console.TileInfo; import com.cloud.consoleproxy.util.ImageHelper; +import com.cloud.consoleproxy.util.TileInfo; /** * A BuffereImageCanvas component represents frame buffer image on the diff --git a/console-proxy/src/com/cloud/consoleproxy/vnc/FrameBufferCanvas.java b/console-proxy/src/com/cloud/consoleproxy/vnc/FrameBufferCanvas.java index 66b463cd09d..0c5e50941ca 100644 --- a/console-proxy/src/com/cloud/consoleproxy/vnc/FrameBufferCanvas.java +++ b/console-proxy/src/com/cloud/consoleproxy/vnc/FrameBufferCanvas.java @@ -3,7 +3,7 @@ package com.cloud.consoleproxy.vnc; import java.awt.Image; import java.util.List; -import com.cloud.console.TileInfo; +import com.cloud.consoleproxy.util.TileInfo; public interface FrameBufferCanvas { Image getFrameBufferScaledImage(int width, int height); diff --git a/console-proxy/src/com/cloud/consoleproxy/vnc/VncClient.java b/console-proxy/src/com/cloud/consoleproxy/vnc/VncClient.java index 236703fa5b2..8dab1037e4a 100644 --- a/console-proxy/src/com/cloud/consoleproxy/vnc/VncClient.java +++ b/console-proxy/src/com/cloud/consoleproxy/vnc/VncClient.java @@ -16,8 +16,8 @@ import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; -import com.cloud.console.Logger; import com.cloud.consoleproxy.ConsoleProxyClientListener; +import com.cloud.consoleproxy.util.Logger; import com.cloud.consoleproxy.vnc.packet.client.KeyboardEventPacket; import com.cloud.consoleproxy.vnc.packet.client.MouseEventPacket; diff --git a/console-proxy/src/com/cloud/consoleproxy/vnc/VncServerPacketReceiver.java b/console-proxy/src/com/cloud/consoleproxy/vnc/VncServerPacketReceiver.java index 64adc96f4ad..0a5a2f172f8 100644 --- a/console-proxy/src/com/cloud/consoleproxy/vnc/VncServerPacketReceiver.java +++ b/console-proxy/src/com/cloud/consoleproxy/vnc/VncServerPacketReceiver.java @@ -5,8 +5,8 @@ import java.awt.datatransfer.StringSelection; import java.io.DataInputStream; import java.io.IOException; -import com.cloud.console.Logger; import com.cloud.consoleproxy.ConsoleProxyClientListener; +import com.cloud.consoleproxy.util.Logger; import com.cloud.consoleproxy.vnc.packet.server.FramebufferUpdatePacket; import com.cloud.consoleproxy.vnc.packet.server.ServerCutText; diff --git a/console-proxy/src/com/cloud/consoleproxy/vnc/packet/server/ServerCutText.java b/console-proxy/src/com/cloud/consoleproxy/vnc/packet/server/ServerCutText.java index 6eed8ba1a0b..1d93f336578 100644 --- a/console-proxy/src/com/cloud/consoleproxy/vnc/packet/server/ServerCutText.java +++ b/console-proxy/src/com/cloud/consoleproxy/vnc/packet/server/ServerCutText.java @@ -3,7 +3,7 @@ package com.cloud.consoleproxy.vnc.packet.server; import java.io.DataInputStream; import java.io.IOException; -import com.cloud.console.Logger; +import com.cloud.consoleproxy.util.Logger; import com.cloud.consoleproxy.vnc.RfbConstants; public class ServerCutText { diff --git a/console-viewer/.classpath b/console-viewer/.classpath deleted file mode 100644 index e8a8d8c0a84..00000000000 --- a/console-viewer/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/console-viewer/.project b/console-viewer/.project deleted file mode 100644 index 1b47b7baad3..00000000000 --- a/console-viewer/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - console-viewer - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/console-viewer/scripts/run-viewer.bat b/console-viewer/scripts/run-viewer.bat deleted file mode 100644 index f35990a19c3..00000000000 --- a/console-viewer/scripts/run-viewer.bat +++ /dev/null @@ -1,5 +0,0 @@ -REM Example Usage -REM run-viewer HOST 192.168.1.220 PORT 5917 PROXYHOST 127-0-0-1.realhostip.com PROXYPORT 5999 SID pass -REM - -java -cp applet\VMOpsConsoleApplet.jar com.vmops.consoleviewer.ConsoleApplet %* diff --git a/console-viewer/src/com/cloud/consoleviewer/AuthPanel.java b/console-viewer/src/com/cloud/consoleviewer/AuthPanel.java deleted file mode 100644 index 416d8b5065f..00000000000 --- a/console-viewer/src/com/cloud/consoleviewer/AuthPanel.java +++ /dev/null @@ -1,118 +0,0 @@ -// -// Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. -// Copyright (C) 2002-2006 Constantin Kaplinsky. All Rights Reserved. -// -// This is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this software; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. -// - -package com.cloud.consoleviewer; - -import java.awt.*; -import java.awt.event.*; - -// -// The panel which implements the user authentication scheme -// -@SuppressWarnings("serial") -class AuthPanel extends Panel implements ActionListener { - - TextField passwordField; - Button okButton; - - // - // Constructor. - // - - public AuthPanel(ConsoleViewer viewer) - { - Label titleLabel = new Label("VNC Authentication", Label.CENTER); - titleLabel.setFont(new Font("Helvetica", Font.BOLD, 18)); - - Label promptLabel = new Label("Password:", Label.CENTER); - - passwordField = new TextField(10); - passwordField.setForeground(Color.black); - passwordField.setBackground(Color.white); - passwordField.setEchoChar('*'); - - okButton = new Button("OK"); - - GridBagLayout gridbag = new GridBagLayout(); - GridBagConstraints gbc = new GridBagConstraints(); - - setLayout(gridbag); - - gbc.gridwidth = GridBagConstraints.REMAINDER; - gbc.insets = new Insets(0,0,20,0); - gridbag.setConstraints(titleLabel,gbc); - add(titleLabel); - - gbc.fill = GridBagConstraints.NONE; - gbc.gridwidth = 1; - gbc.insets = new Insets(0,0,0,0); - gridbag.setConstraints(promptLabel,gbc); - add(promptLabel); - - gridbag.setConstraints(passwordField,gbc); - add(passwordField); - passwordField.addActionListener(this); - - // gbc.ipady = 10; - gbc.gridwidth = GridBagConstraints.REMAINDER; - gbc.fill = GridBagConstraints.BOTH; - gbc.insets = new Insets(0,20,0,0); - gbc.ipadx = 30; - gridbag.setConstraints(okButton,gbc); - add(okButton); - okButton.addActionListener(this); - } - - // - // Move keyboard focus to the default object, that is, the password - // text field. - // - - public void moveFocusToDefaultField() - { - passwordField.requestFocus(); - } - - // - // This method is called when a button is pressed or return is - // pressed in the password text field. - // - - public synchronized void actionPerformed(ActionEvent evt) - { - if (evt.getSource() == passwordField || evt.getSource() == okButton) { - passwordField.setEnabled(false); - notify(); - } - } - - // - // Wait for user entering a password, and return it as String. - // - - public synchronized String getPassword() throws Exception - { - try { - wait(); - } catch (InterruptedException e) { } - return passwordField.getText(); - } - -} diff --git a/console-viewer/src/com/cloud/consoleviewer/ButtonPanel.java b/console-viewer/src/com/cloud/consoleviewer/ButtonPanel.java deleted file mode 100644 index d5cf61efa55..00000000000 --- a/console-viewer/src/com/cloud/consoleviewer/ButtonPanel.java +++ /dev/null @@ -1,164 +0,0 @@ -// -// Copyright (C) 2001,2002 HorizonLive.com, Inc. All Rights Reserved. -// Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. -// -// This is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this software; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. -// - -// -// ButtonPanel class implements panel with four buttons in the -// VNCViewer desktop window. -// - -package com.cloud.consoleviewer; - -import java.awt.*; -import java.awt.event.*; -import java.io.*; - -import com.cloud.console.RfbProto; -@SuppressWarnings("serial") -class ButtonPanel extends Panel implements ActionListener { - - ConsoleViewer viewer; - Button disconnectButton; - Button optionsButton; - Button recordButton; - Button clipboardButton; - Button ctrlAltDelButton; - Button refreshButton; - - ButtonPanel(ConsoleViewer v) { - viewer = v; - - setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); -/* - disconnectButton = new Button("Disconnect"); - disconnectButton.setEnabled(false); - add(disconnectButton); - disconnectButton.addActionListener(this); - optionsButton = new Button("Options"); - add(optionsButton); - optionsButton.addActionListener(this); - clipboardButton = new Button("Clipboard"); - clipboardButton.setEnabled(false); - add(clipboardButton); - clipboardButton.addActionListener(this); - if (viewer.rec != null) { - recordButton = new Button("Record"); - add(recordButton); - recordButton.addActionListener(this); - } -*/ - ctrlAltDelButton = new Button("Send Ctrl-Alt-Del"); - ctrlAltDelButton.setEnabled(false); - add(ctrlAltDelButton); - ctrlAltDelButton.addActionListener(this); - refreshButton = new Button("Refresh"); - refreshButton.setEnabled(false); - add(refreshButton); - refreshButton.addActionListener(this); - } - - // - // Enable buttons on successful connection. - // - - public void enableButtons() { - /* - disconnectButton.setEnabled(true); - clipboardButton.setEnabled(true); - */ - refreshButton.setEnabled(true); - } - - // - // Disable all buttons on disconnect. - // - - public void disableButtonsOnDisconnect() { -/* - remove(disconnectButton); - disconnectButton = new Button("Hide desktop"); - disconnectButton.setEnabled(true); - add(disconnectButton, 0); - disconnectButton.addActionListener(this); - - optionsButton.setEnabled(false); - clipboardButton.setEnabled(false); - */ - ctrlAltDelButton.setEnabled(false); - refreshButton.setEnabled(false); - - validate(); - } - - // - // Enable/disable controls that should not be available in view-only - // mode. - // - - public void enableRemoteAccessControls(boolean enable) { - ctrlAltDelButton.setEnabled(enable); - } - - // - // Event processing. - // - @SuppressWarnings("deprecation") - public void actionPerformed(ActionEvent evt) { - - viewer.moveFocusToDesktop(); - - if (evt.getSource() == disconnectButton) { - viewer.disconnect(); - - } else if (evt.getSource() == optionsButton) { -// viewer.options.setVisible(!viewer.options.isVisible()); - - } else if (evt.getSource() == recordButton) { -// viewer.rec.setVisible(!viewer.rec.isVisible()); - - } else if (evt.getSource() == clipboardButton) { -// viewer.clipboard.setVisible(!viewer.clipboard.isVisible()); - - } else if (evt.getSource() == ctrlAltDelButton) { - try { - final int modifiers = InputEvent.CTRL_MASK | InputEvent.ALT_MASK; - - KeyEvent ctrlAltDelEvent = - new KeyEvent(this, KeyEvent.KEY_PRESSED, 0, modifiers, 127); - viewer.rfb.writeKeyEvent(ctrlAltDelEvent); - - ctrlAltDelEvent = - new KeyEvent(this, KeyEvent.KEY_RELEASED, 0, modifiers, 127); - viewer.rfb.writeKeyEvent(ctrlAltDelEvent); - - } catch (IOException e) { - e.printStackTrace(); - } - } else if (evt.getSource() == refreshButton) { - try { - RfbProto rfb = viewer.rfb; - rfb.writeFramebufferUpdateRequest(0, 0, rfb.framebufferWidth, - rfb.framebufferHeight, false); - } catch (IOException e) { - e.printStackTrace(); - } - } - } -} - diff --git a/console-viewer/src/com/cloud/consoleviewer/ClipboardFrame.java b/console-viewer/src/com/cloud/consoleviewer/ClipboardFrame.java deleted file mode 100644 index 0f40da569bd..00000000000 --- a/console-viewer/src/com/cloud/consoleviewer/ClipboardFrame.java +++ /dev/null @@ -1,135 +0,0 @@ -// -// Copyright (C) 2001 HorizonLive.com, Inc. All Rights Reserved. -// Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. -// -// This is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this software; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. -// - -package com.cloud.consoleviewer; - -// -// Clipboard frame. -// - -import java.awt.*; -import java.awt.event.*; -@SuppressWarnings("serial") -class ClipboardFrame extends Frame - implements WindowListener, ActionListener { - - TextArea textArea; - Button clearButton, closeButton; - String selection; - ConsoleViewer viewer; - - // - // Constructor. - // - - ClipboardFrame(ConsoleViewer v) { - super("TightVNC Clipboard"); - - viewer = v; - - GridBagLayout gridbag = new GridBagLayout(); - setLayout(gridbag); - - GridBagConstraints gbc = new GridBagConstraints(); - gbc.gridwidth = GridBagConstraints.REMAINDER; - gbc.fill = GridBagConstraints.BOTH; - gbc.weighty = 1.0; - - textArea = new TextArea(5, 40); - gridbag.setConstraints(textArea, gbc); - add(textArea); - - gbc.fill = GridBagConstraints.HORIZONTAL; - gbc.weightx = 1.0; - gbc.weighty = 0.0; - gbc.gridwidth = 1; - - clearButton = new Button("Clear"); - gridbag.setConstraints(clearButton, gbc); - add(clearButton); - clearButton.addActionListener(this); - - closeButton = new Button("Close"); - gridbag.setConstraints(closeButton, gbc); - add(closeButton); - closeButton.addActionListener(this); - - pack(); - - addWindowListener(this); - } - - - // - // Set the cut text from the RFB server. - // - - void setCutText(String text) { - selection = text; - textArea.setText(text); - if (isVisible()) { - textArea.selectAll(); - } - } - - - // - // When the focus leaves the window, see if we have new cut text and - // if so send it to the RFB server. - // - - public void windowDeactivated (WindowEvent evt) { - if (selection != null && !selection.equals(textArea.getText())) { - selection = textArea.getText(); - viewer.setCutText(selection); - } - } - - // - // Close our window properly. - // - - public void windowClosing(WindowEvent evt) { - setVisible(false); - } - - // - // Ignore window events we're not interested in. - // - - public void windowActivated(WindowEvent evt) {} - public void windowOpened(WindowEvent evt) {} - public void windowClosed(WindowEvent evt) {} - public void windowIconified(WindowEvent evt) {} - public void windowDeiconified(WindowEvent evt) {} - - - // - // Respond to button presses - // - - public void actionPerformed(ActionEvent evt) { - if (evt.getSource() == clearButton) { - textArea.setText(""); - } else if (evt.getSource() == closeButton) { - setVisible(false); - } - } -} diff --git a/console-viewer/src/com/cloud/consoleviewer/ConsoleApplet.java b/console-viewer/src/com/cloud/consoleviewer/ConsoleApplet.java deleted file mode 100644 index f7024512ce1..00000000000 --- a/console-viewer/src/com/cloud/consoleviewer/ConsoleApplet.java +++ /dev/null @@ -1,167 +0,0 @@ - -// -// Copyright (C) 2001-2004 HorizonLive.com, Inc. All Rights Reserved. -// Copyright (C) 2002 Constantin Kaplinsky. All Rights Reserved. -// Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. -// -// This is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this software; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. -// - -// -// VncViewer.java - the VNC viewer applet. This class mainly just sets up the -// user interface, leaving it to the VncCanvas to do the actual rendering of -// a VNC desktop. -// - -package com.cloud.consoleviewer; - -import java.awt.*; -import java.awt.event.*; - -import com.cloud.console.Logger; - -public class ConsoleApplet extends java.applet.Applet implements WindowListener { - private static final Logger s_logger = Logger.getLogger(ConsoleApplet.class); - - private static final long serialVersionUID = -8463170916581351766L; - - ConsoleViewer viewer; - String errorMsg; - - public ConsoleApplet() { - viewer = new ConsoleViewer(); - } - - public static void main(String[] argv) { - ConsoleApplet applet = new ConsoleApplet(); - applet.viewer.mainArgs = argv; - applet.viewer.inAnApplet = false; - applet.viewer.inSeparateFrame = true; - applet.viewer.inProxyMode = false; - applet.init(); - applet.start(); - } - - // Reference to this applet for inter-applet communication. - public static java.applet.Applet refApplet; - - // - // init() - // - - public void init() { - s_logger.info("Initializing applet"); - refApplet = this; - viewer.applet = this; - viewer.init(); - disableFocusTraversal(this); - errorMsg = "Connecting..."; - invalidate(); - } - - public void paint(Graphics g) { - if(viewer != null && viewer.vc != null && viewer.vc.memGraphics != null) - g.setColor(Color.WHITE); - else - g.setColor(Color.BLACK); - g.fillRect(0, 0, 800, 600); - - if(errorMsg != null && errorMsg.length() > 0) { - g.setFont(new Font(null, Font.PLAIN, 20)); - g.setColor(Color.WHITE); - FontMetrics fm = g.getFontMetrics(); - int width = fm.stringWidth(errorMsg); - int startx = (800 - width) / 2; - if (startx < 0) startx = 0; - g.drawString(errorMsg, startx, 600 / 2); - } - } - - public void paintErrorString(String msg) { - s_logger.info("paintErrorString"); - - errorMsg = msg; - invalidate(); - repaint(); - } - - public void stop() { - s_logger.info("Stopping applet"); - viewer.stop(); - } - - // - // This method is called before the applet is destroyed. - // - public void destroy() { - s_logger.info("Destroying applet"); - viewer.destroy(); - viewer = null; - } - - public void sendCtrlAltDel() { - if(viewer != null && viewer.vc != null) - viewer.vc.sendCtrlAltDel(); - } - - public int getFrameBufferWidth() { - if(viewer != null && viewer.vc != null) - return viewer.vc.getWidth(); - - return 800; - } - - public int getFrameBufferHeight() { - if(viewer != null && viewer.vc != null) - return viewer.vc.getHeight(); - return 600; - } - - // - // Close application properly on window close event. - // - - public void windowClosing(WindowEvent evt) { - s_logger.info("Closing window"); - viewer.windowClosing(evt); - } - - // - // Ignore window events we're not interested in. - // - public void windowActivated(WindowEvent evt) { - } - - public void windowDeactivated(WindowEvent evt) { - } - - public void windowOpened(WindowEvent evt) { - } - - public void windowClosed(WindowEvent evt) { - } - - public void windowIconified(WindowEvent evt) { - } - - public void windowDeiconified(WindowEvent evt) { - } - - static public void disableFocusTraversal(Container con) { - con.setFocusTraversalKeysEnabled(false); - con.setFocusCycleRoot(true); - } -} diff --git a/console-viewer/src/com/cloud/consoleviewer/ConsoleViewer.java b/console-viewer/src/com/cloud/consoleviewer/ConsoleViewer.java deleted file mode 100644 index 488778de179..00000000000 --- a/console-viewer/src/com/cloud/consoleviewer/ConsoleViewer.java +++ /dev/null @@ -1,1247 +0,0 @@ -// -// Copyright (C) 2001-2004 HorizonLive.com, Inc. All Rights Reserved. -// Copyright (C) 2002 Constantin Kaplinsky. All Rights Reserved. -// Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. -// -// This is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this software; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. -// - -// -// VncViewer.java - the VNC viewer applet. This class mainly just sets up the -// user interface, leaving it to the VncCanvas to do the actual rendering of -// a VNC desktop. -// - -package com.cloud.consoleviewer; - -import java.applet.Applet; -import java.awt.*; -import java.awt.event.*; -import java.awt.image.BufferedImage; -import java.awt.image.MemoryImageSource; -import java.io.*; -import java.net.*; -import java.util.Date; - -import javax.net.SocketFactory; -import javax.net.ssl.SSLSocketFactory; - -import com.cloud.console.AuthenticationException; -import com.cloud.console.ConsoleCanvas; -import com.cloud.console.ConsoleCanvas2; -import com.cloud.console.Logger; -import com.cloud.console.RfbProto; -import com.cloud.console.RfbProtoAdapter; -import com.cloud.console.RfbViewer; - -@SuppressWarnings("deprecation") -public class ConsoleViewer implements java.lang.Runnable, RfbViewer, RfbProtoAdapter { - private static final Logger s_logger = Logger.getLogger(ConsoleViewer.class); - - int id = getNextId(); - boolean compressServerMessage = false; - long createTime = System.currentTimeMillis(); - long lastUsedTime = System.currentTimeMillis(); - - boolean dropMe = false; - - OutputStream clientStream; - String clientStreamInfo; - - int status; - public final static int STATUS_ERROR = -1; - public final static int STATUS_UNINITIALIZED = 0; - public final static int STATUS_CONNECTING = 1; - public final static int STATUS_INITIALIZING = 2; - public final static int STATUS_NORMAL_OPERATION = 3; - public final static int STATUS_AUTHENTICATION_FAILURE = 100; - - public final static int DEFAULT_READ_TIMEOUT_SECONDS = 45; - - boolean inAnApplet = true; - boolean inSeparateFrame = false; - boolean inProxyMode = false; - - String[] mainArgs; - - RfbProto rfb; - Thread rfbThread; - - ConsoleApplet applet; - Frame vncFrame; - Container vncContainer; - ScrollPane desktopScrollPane; - GridBagLayout gridbag; - ButtonPanel buttonPanel; - Label connStatusLabel; - ConsoleCanvas vc; - OptionsFrame options; - ClipboardFrame clipboard; - private RecordingFrame rec; - - // Control session recording. - Object recordingSync; - String sessionFileName; - boolean recordingActive; - boolean recordingStatusChanged; - String cursorUpdatesDef; - String eightBitColorsDef; - - // Variables read from parameter values. - String socketFactory; - String host; - int port; - String proxyHost; - int proxyPort; - String passwordParam; - boolean showControls; - boolean offerRelogin; - boolean showOfflineDesktop; - int deferScreenUpdates; - int deferCursorUpdates; - int deferUpdateRequests; - - static int id_count = 1; - synchronized static int getNextId() { - return id_count++; - } - - // - // init() - // - - public void init() { - /* - if (inProxyMode) { - initProxy(); - return; - } - */ - readParameters(); - - if (inSeparateFrame) { - vncFrame = new Frame("VMOps ConsoleViewer"); - if (!inAnApplet) { - // vncFrame.add("Center", this); - } - vncContainer = vncFrame; - } else { - vncContainer = applet; - } - - recordingSync = new Object(); - - options = new OptionsFrame(this); - // clipboard = new ClipboardFrame(this); - // if (RecordingFrame.checkSecurity()) - // rec = new RecordingFrame(this); - - sessionFileName = null; - recordingActive = false; - recordingStatusChanged = false; - cursorUpdatesDef = null; - eightBitColorsDef = null; - - if (inSeparateFrame) - vncFrame.addWindowListener(applet); - rfbThread = new Thread(this); - rfbThread.start(); - } - - /* - private void initProxy() { - recordingSync = new Object(); - - options = new OptionsFrame(this); - options.viewOnly = true; - - sessionFileName = null; - recordingActive = false; - recordingStatusChanged = false; - cursorUpdatesDef = null; - eightBitColorsDef = null; - - rfbThread = new Thread(this); - rfbThread.setName("RFB Thread " + rfbThread.getId() + " >" + host + ":" - + port); - - rfbThread.start(); - } - */ - - public void update(Graphics g) { - } - - // - // run() - executed by the rfbThread to deal with the RFB socket. - // - - public void run() { - /* - if (inProxyMode) { - runProxy(); - return; - } - */ - - int[] pixels = new int[16 * 16]; - Image image = Toolkit.getDefaultToolkit().createImage( - new MemoryImageSource(16, 16, pixels, 0, 16)); - Cursor transparentCursor = - Toolkit.getDefaultToolkit().createCustomCursor - (image, new Point(0, 0), "invisibleCursor"); - vncContainer.setCursor(transparentCursor); - - - gridbag = new GridBagLayout(); - vncContainer.setLayout(gridbag); - GridBagConstraints gbc = new GridBagConstraints(); - gbc.gridwidth = GridBagConstraints.REMAINDER; - gbc.anchor = GridBagConstraints.NORTHWEST; - //gbc.anchor = GridBagConstraints.CENTER; - - if (showControls) { - buttonPanel = new ButtonPanel(this); - gridbag.setConstraints(buttonPanel, gbc); - vncContainer.add(buttonPanel); - } - - // FIXME: Use auto-scaling not only in a separate frame. - if (options.autoScale && inSeparateFrame) { - Dimension screenSize; - try { - screenSize = vncContainer.getToolkit().getScreenSize(); - } catch (Exception e) { - screenSize = new Dimension(0, 0); - } - createCanvas(screenSize.width - 32, screenSize.height - 32); - } else { - createCanvas(0, 0); - } - - if (!options.viewOnly) - vc.enableInput(true); - - gbc.weightx = 1.0; - gbc.weighty = 1.0; - - if (inSeparateFrame) { - - // Create a panel which itself is resizeable and can hold - // non-resizeable VncCanvas component at the top left corner. - Panel canvasPanel = new Panel(); - canvasPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); - canvasPanel.add(vc); - - // Create a ScrollPane which will hold a panel with VncCanvas - // inside. - desktopScrollPane = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED); - gbc.fill = GridBagConstraints.BOTH; - gridbag.setConstraints(desktopScrollPane, gbc); - desktopScrollPane.add(canvasPanel); - // Finally, add our ScrollPane to the Frame window. - vncFrame.add(desktopScrollPane); - // vncFrame.setTitle(rfb.desktopName); - vncFrame.pack(); - vc.resizeDesktopFrame(); - } else { - gridbag.setConstraints(vc, gbc); - applet.add(vc); - applet.validate(); - } - - if (showControls) - buttonPanel.enableButtons(); - moveFocusToDesktop(); - - try { - connectAndAuthenticate(); - doProtocolInitialisation(); - vc.rfb = rfb; - vc.setPixelFormat(); - vc.rfb.writeFramebufferUpdateRequest(0, 0, vc.rfb.framebufferWidth, - vc.rfb.framebufferHeight, false); - vc.processNormalProtocol(); - // We should never get here, but just in case - showMessage("Disconnected from server"); - } catch (NoRouteToHostException e) { - fatalError("Network error: no route to server: " + host, e); - } catch (UnknownHostException e) { - fatalError("Network error: server name unknown: " + host, e); - } catch (ConnectException e) { - fatalError("Network error: could not connect to server: " + host - + ":" + port, e); - } catch (EOFException e) { - fatalError("Network error: remote side closed connection", e); - } catch (IOException e) { - fatalError(e.getMessage(), e); - } catch (Exception e) { - fatalError(e.getMessage(), e); - } finally { - encodingsSaved = null; - nEncodingsSaved = 0; - synchronized (this) { - if (rfb != null) { - rfb.close(); - } - } - } - - s_logger.info("Client RFB thread terminated"); - } - - /* - public void runProxy() { - createCanvas(0, 0); - - int delay = 0; - while (!dropMe) { - try { - status = STATUS_CONNECTING; - connectAndAuthenticate(); - delay = 0; // reset the delay interval - status = STATUS_INITIALIZING; - doProtocolInitialisation(); - vc.rfb = rfb; - vc.setPixelFormat(); - vc.rfb.writeFramebufferUpdateRequest(0, 0, - vc.rfb.framebufferWidth, vc.rfb.framebufferHeight, - false); - status = STATUS_NORMAL_OPERATION; - vc.processNormalProtocol(); - } catch (AuthenticationException e) { - status = STATUS_AUTHENTICATION_FAILURE; - String msg = e.getMessage(); - s_logger.info(msg); - } catch (Exception e) { - status = STATUS_ERROR; - s_logger.info(e.toString()); - } finally { - String oldName = Thread.currentThread().getName(); - encodingsSaved = null; - nEncodingsSaved = 0; - synchronized (this) { - if (rfb != null) { - rfb.close(); - } - } - } - if (dropMe) { - break; - } - if (status == STATUS_AUTHENTICATION_FAILURE) { - break; - } else { - s_logger.info("Exception caught, retrying in " - + delay + "ms"); - try { - Thread.sleep(delay); - } catch (InterruptedException e) { - // ignored - } - delay = (int) ((float) (delay + 700) * 1.5); - if (delay > 3000) { - break; - } - } - } - s_logger.info("RFB thread terminating"); - } - */ - - // - // Create a VncCanvas instance. - // - - void createCanvas(int maxWidth, int maxHeight) { - /* - * // Determine if Java 2D API is available and use a special // version - * of VncCanvas if it is present. vc = null; try { // This throws - * ClassNotFoundException if there is no Java 2D API. Class cl = - * Class.forName("java.awt.Graphics2D"); // If we could load Graphics2D - * class, then we can use VncCanvas2D. cl = Class.forName("VncCanvas2"); - * Class[] argClasses = { this.getClass(), Integer.TYPE, Integer.TYPE }; - * java.lang.reflect.Constructor cstr = cl.getConstructor(argClasses); - * Object[] argObjects = { this, new Integer(maxWidth), new - * Integer(maxHeight) }; vc = (VncCanvas)cstr.newInstance(argObjects); } - * catch (Exception e) { Logger.log(Logger.INFO, - * "Warning: Java 2D API is not available"); } - * - * // If we failed to create VncCanvas2D, use old VncCanvas. if (vc == - * null) - */ - vc = new ConsoleCanvas2(this, maxWidth, maxHeight); - } - - /* - * // // Process RFB socket messages. // If the rfbThread is being stopped, - * ignore any exceptions, // otherwise rethrow the exception so it can be - * handled. // - * - * void processNormalProtocol() throws Exception { try { - * vc.processNormalProtocol(); } catch (Exception e) { if (rfbThread == - * null) { Logger.log(Logger.INFO, "Ignoring RFB socket exceptions" + - * " because applet is stopping"); } else { throw e; } } } - */ - // - // Connect to the RFB server and authenticate the user. - // - void connectAndAuthenticate() throws Exception { - showConnectionStatus("Initializing..."); - if (!inProxyMode) { - if (inSeparateFrame) { - vncFrame.pack(); - vncFrame.show(); - } else { - applet.validate(); - } - } - - if (proxyHost != null) { - showConnectionStatus("Connecting to " + proxyHost + ", port " - + proxyPort + "..."); - rfb = new RfbProto(proxyHost, proxyPort, this); - rfb.readProxyVersion(); - rfb.writeProxyString(host, port, - (passwordParam != null) ? passwordParam : ""); - } else { - showConnectionStatus("Connecting to " + host + ", port " + port - + "..."); - rfb = new RfbProto(host, port, this); - } - showConnectionStatus("Connected to server"); - - rfb.readVersionMsg(); - showConnectionStatus("RFB server supports protocol version " - + rfb.serverMajor + "." + rfb.serverMinor); - - rfb.writeVersionMsg(); - showConnectionStatus("Using RFB protocol version " + rfb.clientMajor - + "." + rfb.clientMinor); - - int secType = rfb.negotiateSecurity(); - int authType; - if (secType == RfbProto.SecTypeTight) { - showConnectionStatus("Enabling TightVNC protocol extensions"); - rfb.initCapabilities(); - rfb.setupTunneling(); - authType = rfb.negotiateAuthenticationTight(); - } else { - authType = secType; - } - - switch (authType) { - case RfbProto.AuthNone: - showConnectionStatus("No authentication needed"); - rfb.authenticateNone(); - break; - case RfbProto.AuthVNC: - showConnectionStatus("Performing standard VNC authentication"); - if (passwordParam != null) { - rfb.authenticateVNC(passwordParam); - } else { - throw new AuthenticationException("Bad password"); - /* - * String pw = askPassword(); rfb.authenticateVNC(pw); - */ - } - break; - default: - throw new Exception("Unknown authentication scheme " + authType); - } - } - - // - // Show a message describing the connection status. - // To hide the connection status label, use (msg == null). - // - - void showConnectionStatus(String msg) { - /* - if (inProxyMode) { - if (msg != null) { - s_logger.info(msg); - } - return; - } - */ - - /* - * if (msg == null) { if (vncContainer.isAncestorOf(connStatusLabel)) { - * vncContainer.remove(connStatusLabel); } return; } - * - * Logger.log(Logger.INFO, msg); - * - * if (connStatusLabel == null) { connStatusLabel = new Label("Status: " - * + msg); connStatusLabel.setFont(new Font("Helvetica", Font.PLAIN, - * 12)); } else { connStatusLabel.setText("Status: " + msg); } - * - * if (!vncContainer.isAncestorOf(connStatusLabel)) { GridBagConstraints - * gbc = new GridBagConstraints(); gbc.gridwidth = - * GridBagConstraints.REMAINDER; gbc.fill = - * GridBagConstraints.HORIZONTAL; gbc.anchor = - * GridBagConstraints.NORTHWEST; gbc.weightx = 1.0; gbc.weighty = 1.0; - * gbc.insets = new Insets(20, 30, 20, 30); - * gridbag.setConstraints(connStatusLabel, gbc); - * vncContainer.add(connStatusLabel); } - * - * if (inSeparateFrame) { vncFrame.pack(); } else { validate(); } - */ - } - - // - // Show an authentication panel. - // -/* - String askPassword() throws Exception { - showConnectionStatus(null); - - AuthPanel authPanel = new AuthPanel(this); - - GridBagConstraints gbc = new GridBagConstraints(); - gbc.gridwidth = GridBagConstraints.REMAINDER; - gbc.anchor = GridBagConstraints.NORTHWEST; - gbc.weightx = 1.0; - gbc.weighty = 1.0; - gbc.ipadx = 100; - gbc.ipady = 50; - gridbag.setConstraints(authPanel, gbc); - vncContainer.add(authPanel); - - if (inSeparateFrame) { - vncFrame.pack(); - } else { - applet.validate(); - } - - authPanel.moveFocusToDefaultField(); - String pw = authPanel.getPassword(); - vncContainer.remove(authPanel); - - return pw; - } -*/ - // - // Do the rest of the protocol initialisation. - // - - void doProtocolInitialisation() throws IOException { - rfb.writeClientInit(); - rfb.readServerInit(); - /* - * Logger.log(Logger.INFO, "Desktop name is " + rfb.desktopName); - * Logger.log(Logger.INFO, "Desktop size is " + rfb.framebufferWidth + - * " x " + rfb.framebufferHeight); - */ - setEncodings(); - - showConnectionStatus(null); - } - - // - // Send current encoding list to the RFB server. - // - - int[] encodingsSaved; - int nEncodingsSaved; - - void setEncodings() { - setEncodings(false); - } - - void autoSelectEncodings() { - setEncodings(true); - } - - void setEncodings(boolean autoSelectOnly) { - if (options == null || rfb == null || !rfb.inNormalProtocol) - return; - - int preferredEncoding = options.preferredEncoding; - if (preferredEncoding == -1) { - long kbitsPerSecond = rfb.kbitsPerSecond(); - if (nEncodingsSaved < 1) { - // Choose Tight or ZRLE encoding for the very first update. - // Logger.log(Logger.INFO, "Using Tight/ZRLE encodings"); - preferredEncoding = RfbProto.EncodingTight; - } else if (kbitsPerSecond > 2000 - && encodingsSaved[0] != RfbProto.EncodingHextile) { - // Switch to Hextile if the connection speed is above 2Mbps. - s_logger.info("Throughput " + kbitsPerSecond - + " kbit/s - changing to Hextile encoding"); - preferredEncoding = RfbProto.EncodingHextile; - } else if (kbitsPerSecond < 1000 - && encodingsSaved[0] != RfbProto.EncodingTight) { - // Switch to Tight/ZRLE if the connection speed is below 1Mbps. - s_logger.info("Throughput " + kbitsPerSecond - + " kbit/s - changing to Tight/ZRLE encodings"); - preferredEncoding = RfbProto.EncodingTight; - } else { - // Don't change the encoder. - if (autoSelectOnly) - return; - preferredEncoding = encodingsSaved[0]; - } - } else { - // Auto encoder selection is not enabled. - if (autoSelectOnly) - return; - } - - int[] encodings = new int[20]; - int nEncodings = 0; - - encodings[nEncodings++] = preferredEncoding; - if (options.useCopyRect) { - encodings[nEncodings++] = RfbProto.EncodingCopyRect; - } - - if (preferredEncoding != RfbProto.EncodingTight) { - encodings[nEncodings++] = RfbProto.EncodingTight; - } - if (preferredEncoding != RfbProto.EncodingZRLE) { - encodings[nEncodings++] = RfbProto.EncodingZRLE; - } - if (preferredEncoding != RfbProto.EncodingHextile) { - encodings[nEncodings++] = RfbProto.EncodingHextile; - } - if (preferredEncoding != RfbProto.EncodingZlib) { - encodings[nEncodings++] = RfbProto.EncodingZlib; - } - if (preferredEncoding != RfbProto.EncodingCoRRE) { - encodings[nEncodings++] = RfbProto.EncodingCoRRE; - } - if (preferredEncoding != RfbProto.EncodingRRE) { - encodings[nEncodings++] = RfbProto.EncodingRRE; - } - - if (options.compressLevel >= 0 && options.compressLevel <= 9) { - encodings[nEncodings++] = RfbProto.EncodingCompressLevel0 - + options.compressLevel; - } - if (options.jpegQuality >= 0 && options.jpegQuality <= 9) { - encodings[nEncodings++] = RfbProto.EncodingQualityLevel0 - + options.jpegQuality; - } - - if (options.requestCursorUpdates) { - encodings[nEncodings++] = RfbProto.EncodingXCursor; - encodings[nEncodings++] = RfbProto.EncodingRichCursor; - if (!options.ignoreCursorUpdates) - encodings[nEncodings++] = RfbProto.EncodingPointerPos; - } - - encodings[nEncodings++] = RfbProto.EncodingLastRect; - encodings[nEncodings++] = RfbProto.EncodingNewFBSize; - - boolean encodingsWereChanged = false; - if (nEncodings != nEncodingsSaved) { - encodingsWereChanged = true; - } else { - for (int i = 0; i < nEncodings; i++) { - if (encodings[i] != encodingsSaved[i]) { - encodingsWereChanged = true; - break; - } - } - } - - if (encodingsWereChanged) { - try { - rfb.writeSetEncodings(encodings, nEncodings); - if (vc != null) { - vc.softCursorFree(); - } - } catch (Exception e) { - s_logger.error(e.toString(), e); - } - encodingsSaved = encodings; - nEncodingsSaved = nEncodings; - } - } - - // - // setCutText() - send the given cut text to the RFB server. - // - - void setCutText(String text) { - try { - if (rfb != null && rfb.inNormalProtocol) { - rfb.writeClientCutText(text); - } - } catch (Exception e) { - s_logger.error(e.toString(), e); - } - } - - // - // Order change in session recording status. To stop recording, pass - // null in place of the fname argument. - // - - void setRecordingStatus(String fname) { - synchronized (recordingSync) { - sessionFileName = fname; - recordingStatusChanged = true; - } - } - - // - // Start or stop session recording. Returns true if this method call - // causes recording of a new session. - // - - boolean checkRecordingStatus() throws IOException { - synchronized (recordingSync) { - if (recordingStatusChanged) { - recordingStatusChanged = false; - if (sessionFileName != null) { - startRecording(); - return true; - } else { - stopRecording(); - } - } - } - return false; - } - - // - // Start session recording. - // - - protected void startRecording() throws IOException { - /* - * synchronized(recordingSync) { - * - * if (!recordingActive) { // Save settings to restore them after - * recording the session. cursorUpdatesDef = - * options.choices[options.cursorUpdatesIndex].getSelectedItem(); - * eightBitColorsDef = - * options.choices[options.eightBitColorsIndex].getSelectedItem(); // - * Set options to values suitable for recording. - * options.choices[options.cursorUpdatesIndex].select("Disable"); - * options.choices[options.cursorUpdatesIndex].setEnabled(false); - * options.setEncodings(); - * options.choices[options.eightBitColorsIndex].select("No"); - * options.choices[options.eightBitColorsIndex].setEnabled(false); - * options.setColorFormat(); } else { rfb.closeSession(); } - * - * Logger.log(Logger.INFO, "Recording the session in " + - * sessionFileName); rfb.startSession(sessionFileName); recordingActive - * = true; } - */ - } - - // - // Stop session recording. - // - - protected void stopRecording() throws IOException { - /* - * synchronized(recordingSync) { if (recordingActive) { // Restore - * options. - * options.choices[options.cursorUpdatesIndex].select(cursorUpdatesDef); - * options.choices[options.cursorUpdatesIndex].setEnabled(true); - * options.setEncodings(); - * options.choices[options.eightBitColorsIndex].select - * (eightBitColorsDef); - * options.choices[options.eightBitColorsIndex].setEnabled(true); - * options.setColorFormat(); - * - * rfb.closeSession(); Logger.log(Logger.INFO, - * "Session recording stopped."); } sessionFileName = null; - * recordingActive = false; } - */ - } - - // - // readParameters() - read parameters from the html source or from the - // command line. On the command line, the arguments are just a sequence of - // param_name/param_value pairs where the names and values correspond to - // those expected in the html applet tag source. - // - - void readParameters() { - String str; - host = readParameter("HOST", true); - - str = readParameter("PORT", true); - port = Integer.parseInt(str); - - proxyHost = readParameter("PROXYHOST", false); - if (proxyHost != null) { - str = readParameter("PROXYPORT", true); - proxyPort = Integer.parseInt(str); - } - - // Read "ENCPASSWORD" or "PASSWORD" parameter if specified. - readPasswordParameters(); - - if (inAnApplet) { - str = readParameter("Open New Window", false); - if (str != null && str.equalsIgnoreCase("Yes")) - inSeparateFrame = true; - } - - // "Show Controls" set to "No" disables button panel. - showControls = false; - str = readParameter("Show Controls", false); - if (str != null && str.equalsIgnoreCase("No")) - showControls = false; - - // "Offer Relogin" set to "No" disables "Login again" and "Close - // window" buttons under error messages in applet mode. - offerRelogin = false; - str = readParameter("Offer Relogin", false); - if (str != null && str.equalsIgnoreCase("No")) - offerRelogin = false; - - // Do we continue showing desktop on remote disconnect? - showOfflineDesktop = false; - str = readParameter("Show Offline Desktop", false); - if (str != null && str.equalsIgnoreCase("Yes")) - showOfflineDesktop = true; - - // Fine tuning options. - deferScreenUpdates = readIntParameter("Defer screen updates", 20); - deferCursorUpdates = readIntParameter("Defer cursor updates", 10); - deferUpdateRequests = readIntParameter("Defer update requests", 50); - - // SocketFactory. - socketFactory = readParameter("SocketFactory", false); - } - - // - // Read password parameters. - // - - private void readPasswordParameters() { - String str = readParameter("SID", false); - if (str != null) - passwordParam = str; - } - - public String readParameter(String name, boolean required) { - if (inAnApplet) { - String s = applet.getParameter(name); - // s_logger.info("getParameter " + name + " = " + s); - if ((s == null) && required) { - fatalError(name + " parameter not specified"); - } - return s; - } - - for (int i = 0; i < mainArgs.length; i += 2) { - if (mainArgs[i].equalsIgnoreCase(name)) { - try { - return mainArgs[i + 1]; - } catch (Exception e) { - if (required) { - fatalError(name + " parameter not specified"); - } - return null; - } - } - } - if (required) { - fatalError(name + " parameter not specified"); - } - return null; - } - - int readIntParameter(String name, int defaultValue) { - String str = readParameter(name, false); - int result = defaultValue; - if (str != null) { - try { - result = Integer.parseInt(str); - } catch (NumberFormatException e) { - } - } - return result; - } - - // - // moveFocusToDesktop() - move keyboard focus either to VncCanvas. - // - - void moveFocusToDesktop() { - if (vncContainer != null) { - if (vc != null && vncContainer.isAncestorOf(vc)) - vc.requestFocus(); - } - } - - // - // disconnect() - close connection to server. - // - - synchronized public void disconnect() { - s_logger.info("Disconnect"); - - if (rfb != null) - rfb.close(); - - // options.dispose(); - // clipboard.dispose(); - if (rec != null) - rec.dispose(); - - if (inAnApplet) { - showMessage("Disconnected"); - } else { - System.exit(0); - } - } - - // - // fatalError() - print out a fatal error message. - // FIXME: Do we really need two versions of the fatalError() method? - // - - synchronized public void fatalError(String str) { - s_logger.info(str); - - if (inAnApplet) { - // vncContainer null, applet not inited, - // can not present the error to the user. - Thread.currentThread().stop(); - } else { - System.exit(1); - } - } - - synchronized public void fatalError(String str, Exception e) { - /* - * if (rfb != null && rfb.closed()) { // Not necessary to show error - * message if the error was caused // by I/O problems after the - * rfb.close() method call. Logger.log(Logger.INFO, - * "RFB thread finished"); return; } - */ - if (str == null) { - str = ""; - } - s_logger.info(str, e); - showMessage(str); - } - - // - // Show message text and optionally "Relogin" and "Close" buttons. - // - - void showMessage(String msg) { - if (vc != null && vc.memGraphics != null) { - vc.paintErrorString(msg); - return; - } else { - if(applet != null) - applet.paintErrorString(msg); - } - - s_logger.info(msg); - - /* - * vncContainer.removeAll(); - * - * Logger.log(Logger.INFO, "showMessage " + msg); - * - * Label errLabel = new Label(msg, Label.CENTER); errLabel.setFont(new - * Font("Helvetica", Font.PLAIN, 12)); - * - * if (offerRelogin) { - * - * Panel gridPanel = new Panel(new GridLayout(0, 1)); Panel outerPanel = - * new Panel(new FlowLayout(FlowLayout.LEFT)); - * outerPanel.add(gridPanel); vncContainer.setLayout(new - * FlowLayout(FlowLayout.LEFT, 30, 16)); vncContainer.add(outerPanel); - * Panel textPanel = new Panel(new FlowLayout(FlowLayout.CENTER)); - * textPanel.add(errLabel); gridPanel.add(textPanel); gridPanel.add(new - * ReloginPanel(this)); - * - * } else { - * - * vncContainer.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 30)); - * vncContainer.add(errLabel); - * - * } - * - * if (inSeparateFrame) { vncFrame.pack(); } else { validate(); } - */ - } - - // - // Stop the applet. - // Main applet thread will terminate on first exception - // after seeing that rfb has been closed. - // - - public void stop() { - s_logger.info("Stopping applet"); - synchronized (this) { - if (rfb != null) { - rfb.close(); - } - } - - s_logger.info("Join RFB thread"); - try { - rfbThread.join(1000); - } catch (InterruptedException e) { - } - s_logger.info("Applet stopped"); - } - - // - // This method is called before the applet is destroyed. - // - - public void destroy() { - s_logger.info("Destroying applet"); - - vncContainer.removeAll(); - // options.dispose(); - // clipboard.dispose(); - if (rec != null) - rec.dispose(); - synchronized (this) { - if (rfb != null) - rfb.close(); - } - if (inSeparateFrame) - vncFrame.dispose(); - } - - // - // Start/stop receiving mouse events. - // - - public void enableInput(boolean enable) { - vc.enableInput(enable); - } - - // - // Close application properly on window close event. - // - - public void windowClosing(WindowEvent evt) { - s_logger.info("Closing window"); - if (rfb != null) - disconnect(); - - vncContainer.hide(); - - if (!inAnApplet) { - System.exit(0); - } - } - - public String toString() { - return ("{ConsoleViewer-" - + host - + ":" - + port - + (" created=\"" + new Date(createTime)) + "\"" - + (" lastused=\"" + new Date(lastUsedTime)) + "\"" - + (clientStream != null ? (" client=" + clientStreamInfo) : "") + "}"); - } - - // - // Implement RfbViewer interface - // - public boolean isProxy() { - return false; - } - - public boolean hasClientConnection() { - return false; - } - - public RfbProto getRfb() { - return rfb; - } - - public Dimension getScreenSize() { - return vncFrame.getToolkit().getScreenSize(); - } - - public Dimension getFrameSize() { - return vncFrame.getSize(); - } - - public int getScalingFactor() { - return options.scalingFactor; - } - - public int getCursorScaleFactor() { - return options.scaleCursor; - } - - public boolean ignoreCursorUpdate() { - return options.ignoreCursorUpdates; - } - - public int getDeferCursorUpdateTimeout() { - return deferCursorUpdates; - } - - public int getDeferScreenUpdateTimeout() { - return deferScreenUpdates; - } - - public int getDeferUpdateRequestTimeout() { - return deferUpdateRequests; - } - - public int setPixelFormat(RfbProto rfb) throws IOException { - if (options.eightBitColors) { - rfb.writeSetPixelFormat(8, 8, false, true, 7, 7, 3, 0, 3, 6); - return 1; - } else { - rfb.writeSetPixelFormat(32, 24, false, true, 255, 255, 255, 16, 8, 0); - return 4; - } - } - - public void onCanvasInit() { - if (!options.viewOnly) - vc.enableInput(true); - } - - public void onInputEnabled(boolean enable) { - if(enable) { - if (showControls) { - buttonPanel.enableRemoteAccessControls(true); - } - } else { - if (showControls) { - buttonPanel.enableRemoteAccessControls(false); - } - } - } - - public void onFramebufferSizeChange(int w, int h) { - // Update the size of desktop containers. - if (inSeparateFrame) { - if (desktopScrollPane != null) - vc.resizeDesktopFrame(); - } else { - vc.setSize(vc.scaledWidth, vc.scaledHeight); - } - moveFocusToDesktop(); - - try { - rfb.writeFramebufferUpdateRequest(0, 0, rfb.framebufferWidth, - rfb.framebufferHeight, true); - } catch (IOException e) { - s_logger.warn("Exception when sending frame buffer update request", e); - } - } - - public void onFramebufferUpdate(int x, int y, int w, int h) { - } - - public void onFramebufferCursorMove(int x, int y) { - } - - public void onFramebufferCursorShapeChange(int encodingType, - int xhot, int yhot, int width, int height, byte[] cursorData) { - } - - public void onDesktopResize() { - Insets insets = desktopScrollPane.getInsets(); - desktopScrollPane.setSize(vc.scaledWidth + - 2 * Math.min(insets.left, insets.right), - vc.scaledHeight + - 2 * Math.min(insets.top, insets.bottom)); - - vncFrame.pack(); - } - - public void onFrameResize(Dimension newSize) { - vncFrame.setSize(newSize); - desktopScrollPane.doLayout(); - } - - public void onDisconnectMessage() { - // do nothing in viewer mode - } - - public void onBellMessage() { - Toolkit.getDefaultToolkit().beep(); - } - - public void onPreProtocolProcess(byte[] bs) throws IOException { - // do nothing in viwer mode - } - - public boolean onPostFrameBufferUpdateProcess(boolean cursorPosReceived) throws IOException { - boolean fullUpdateNeeded = false; - if (checkRecordingStatus()) - fullUpdateNeeded = true; - - // Defer framebuffer update request if necessary. But wake up - // immediately on keyboard or mouse event. Also, don't sleep - // if there is some data to receive, or if the last update - // included a PointerPos message. - if (deferUpdateRequests > 0 && rfb.is.available() == 0 && !cursorPosReceived) { - synchronized(vc.rfb) { - try { - vc.rfb.wait(deferUpdateRequests); - } catch (InterruptedException e) { - } - } - } - - // Before requesting framebuffer update, check if the pixel - // format should be changed. If it should, request full update - // instead of an incremental one. - if (options.eightBitColors != (vc.bytesPixel == 1)) { - vc.setPixelFormat(); - fullUpdateNeeded = true; - } - - return fullUpdateNeeded; - } - - public void onProtocolProcessException(IOException e) { - // do nothing in viewer mode - } - - public Socket createConnection(String host, int port) throws IOException { - - SocketFactory socketFactory = SSLSocketFactory.getDefault(); - Socket sock = socketFactory.createSocket(host, port); - sock.setSoTimeout(DEFAULT_READ_TIMEOUT_SECONDS*1000); - return sock; - } - - public void writeInit(OutputStream os) throws IOException { - if (options.shareDesktop) { - os.write(1); - } else { - os.write(0); - } - } - - public void swapMouseButton(Integer[] masks) { - if (options.reverseMouseButtons2And3) { - Integer temp = masks[1]; - masks[1] = masks[0]; - masks[0] = temp; - } - } -} diff --git a/console-viewer/src/com/cloud/consoleviewer/OptionsFrame.java b/console-viewer/src/com/cloud/consoleviewer/OptionsFrame.java deleted file mode 100644 index 89d0590aa19..00000000000 --- a/console-viewer/src/com/cloud/consoleviewer/OptionsFrame.java +++ /dev/null @@ -1,418 +0,0 @@ -// -// Copyright (C) 2001 HorizonLive.com, Inc. All Rights Reserved. -// Copyright (C) 2001 Constantin Kaplinsky. All Rights Reserved. -// Copyright (C) 2000 Tridia Corporation. All Rights Reserved. -// Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. -// -// This is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this software; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. -// - -// -// Options frame. -// -// This deals with all the options the user can play with. -// It sets the encodings array and some booleans. -// - -package com.cloud.consoleviewer; - -import java.awt.*; -import java.awt.event.*; - -class OptionsFrame { -/* extends Frame -} - implements WindowListener, ActionListener, ItemListener { - - static String[] names = { - "Encoding", - "Compression level", - "JPEG image quality", - "Cursor shape updates", - "Use CopyRect", - "Restricted colors", - "Mouse buttons 2 and 3", - "View only", - "Scale remote cursor", - "Share desktop", - }; - - static String[][] values = { - { "Auto", "Raw", "RRE", "CoRRE", "Hextile", "Zlib", "Tight", "ZRLE" }, - { "Default", "1", "2", "3", "4", "5", "6", "7", "8", "9" }, - { "JPEG off", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }, - { "Enable", "Ignore", "Disable" }, - { "Yes", "No" }, - { "Yes", "No" }, - { "Normal", "Reversed" }, - { "Yes", "No" }, - { "No", "50%", "75%", "125%", "150%" }, - { "Yes", "No" }, - }; - - final int - encodingIndex = 0, - compressLevelIndex = 1, - jpegQualityIndex = 2, - cursorUpdatesIndex = 3, - useCopyRectIndex = 4, - eightBitColorsIndex = 5, - mouseButtonIndex = 6, - viewOnlyIndex = 7, - scaleCursorIndex = 8, - shareDesktopIndex = 9; - - Label[] labels = new Label[names.length]; - Choice[] choices = new Choice[names.length]; - Button closeButton; - VncViewer viewer; - -*/ - // - // The actual data which other classes look at: - // - - int preferredEncoding = -1; - int compressLevel = 5; - int jpegQuality = 5; - boolean useCopyRect = false; - boolean requestCursorUpdates = true; - boolean ignoreCursorUpdates = false; - - boolean eightBitColors = false; - - boolean reverseMouseButtons2And3 = false; - boolean shareDesktop = true; - boolean viewOnly = false; - int scaleCursor = 0; - - boolean autoScale = false; - int scalingFactor = 100; - - // - // Constructor. Set up the labels and choices from the names and values - // arrays. - // - - OptionsFrame(ConsoleViewer v) { - } - /* - super("TightVNC Options"); - - viewer = v; - - GridBagLayout gridbag = new GridBagLayout(); - setLayout(gridbag); - - GridBagConstraints gbc = new GridBagConstraints(); - gbc.fill = GridBagConstraints.BOTH; - - for (int i = 0; i < names.length; i++) { - labels[i] = new Label(names[i]); - gbc.gridwidth = 1; - gridbag.setConstraints(labels[i],gbc); - add(labels[i]); - - choices[i] = new Choice(); - gbc.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints(choices[i],gbc); - add(choices[i]); - choices[i].addItemListener(this); - - for (int j = 0; j < values[i].length; j++) { - choices[i].addItem(values[i][j]); - } - } - - closeButton = new Button("Close"); - gbc.gridwidth = GridBagConstraints.REMAINDER; - gridbag.setConstraints(closeButton, gbc); - add(closeButton); - closeButton.addActionListener(this); - - pack(); - - addWindowListener(this); - - // Set up defaults - - choices[encodingIndex].select("Auto"); - choices[compressLevelIndex].select("Default"); - choices[jpegQualityIndex].select("6"); - choices[cursorUpdatesIndex].select("Enable"); - choices[useCopyRectIndex].select("Yes"); - choices[eightBitColorsIndex].select("No"); - choices[mouseButtonIndex].select("Normal"); - choices[viewOnlyIndex].select("No"); - choices[scaleCursorIndex].select("No"); - choices[shareDesktopIndex].select("Yes"); - - // But let them be overridden by parameters - - for (int i = 0; i < names.length; i++) { - String s = viewer.readParameter(names[i], false); - if (s != null) { - for (int j = 0; j < values[i].length; j++) { - if (s.equalsIgnoreCase(values[i][j])) { - choices[i].select(j); - } - } - } - } - - // FIXME: Provide some sort of GUI for "Scaling Factor". - - autoScale = false; - scalingFactor = 100; - String s = viewer.readParameter("Scaling Factor", false); - if (s != null) { - if (s.equalsIgnoreCase("Auto")) { - autoScale = true; - } else { - // Remove the '%' char at the end of string if present. - if (s.charAt(s.length() - 1) == '%') { - s = s.substring(0, s.length() - 1); - } - // Convert to an integer. - try { - scalingFactor = Integer.parseInt(s); - } - catch (NumberFormatException e) { - scalingFactor = 100; - } - // Make sure scalingFactor is in the range of [1..1000]. - if (scalingFactor < 1) { - scalingFactor = 1; - } else if (scalingFactor > 1000) { - scalingFactor = 1000; - } - } - } - - // Make the booleans and encodings array correspond to the state of the GUI - - setEncodings(); - setColorFormat(); - setOtherOptions(); - } - - - // - // Disable the shareDesktop option - // - - void disableShareDesktop() { - labels[shareDesktopIndex].setEnabled(false); - choices[shareDesktopIndex].setEnabled(false); - } - - - // - // setEncodings looks at the encoding, compression level, JPEG - // quality level, cursor shape updates and copyRect choices and sets - // corresponding variables properly. Then it calls the VncViewer's - // setEncodings method to send a SetEncodings message to the RFB - // server. - // - - void setEncodings() { - useCopyRect = choices[useCopyRectIndex].getSelectedItem().equals("Yes"); - - preferredEncoding = RfbProto.EncodingRaw; - boolean enableCompressLevel = false; - boolean enableQualityLevel = false; - - if (choices[encodingIndex].getSelectedItem().equals("RRE")) { - preferredEncoding = RfbProto.EncodingRRE; - } else if (choices[encodingIndex].getSelectedItem().equals("CoRRE")) { - preferredEncoding = RfbProto.EncodingCoRRE; - } else if (choices[encodingIndex].getSelectedItem().equals("Hextile")) { - preferredEncoding = RfbProto.EncodingHextile; - } else if (choices[encodingIndex].getSelectedItem().equals("ZRLE")) { - preferredEncoding = RfbProto.EncodingZRLE; - } else if (choices[encodingIndex].getSelectedItem().equals("Zlib")) { - preferredEncoding = RfbProto.EncodingZlib; - enableCompressLevel = true; - } else if (choices[encodingIndex].getSelectedItem().equals("Tight")) { - preferredEncoding = RfbProto.EncodingTight; - enableCompressLevel = true; - enableQualityLevel = !eightBitColors; - } else if (choices[encodingIndex].getSelectedItem().equals("Auto")) { - preferredEncoding = -1; - enableQualityLevel = !eightBitColors; - } - - // Handle compression level setting. - - try { - compressLevel = - Integer.parseInt(choices[compressLevelIndex].getSelectedItem()); - } - catch (NumberFormatException e) { - compressLevel = -1; - } - if (compressLevel < 1 || compressLevel > 9) { - compressLevel = -1; - } - labels[compressLevelIndex].setEnabled(enableCompressLevel); - choices[compressLevelIndex].setEnabled(enableCompressLevel); - - // Handle JPEG quality setting. - - try { - jpegQuality = - Integer.parseInt(choices[jpegQualityIndex].getSelectedItem()); - } - catch (NumberFormatException e) { - jpegQuality = -1; - } - if (jpegQuality < 0 || jpegQuality > 9) { - jpegQuality = -1; - } - labels[jpegQualityIndex].setEnabled(enableQualityLevel); - choices[jpegQualityIndex].setEnabled(enableQualityLevel); - - // Request cursor shape updates if necessary. - - requestCursorUpdates = - !choices[cursorUpdatesIndex].getSelectedItem().equals("Disable"); - - if (requestCursorUpdates) { - ignoreCursorUpdates = - choices[cursorUpdatesIndex].getSelectedItem().equals("Ignore"); - } - - viewer.setEncodings(); - } - - // - // setColorFormat sets eightBitColors variable depending on the GUI - // setting, causing switches between 8-bit and 24-bit colors mode if - // necessary. - // - - void setColorFormat() { - - eightBitColors = - choices[eightBitColorsIndex].getSelectedItem().equals("Yes"); - - boolean enableJPEG = !eightBitColors && - (choices[encodingIndex].getSelectedItem().equals("Tight") || - choices[encodingIndex].getSelectedItem().equals("Auto")); - - labels[jpegQualityIndex].setEnabled(enableJPEG); - choices[jpegQualityIndex].setEnabled(enableJPEG); - } - - // - // setOtherOptions looks at the "other" choices (ones which don't set the - // encoding or the color format) and sets the boolean flags appropriately. - // - - void setOtherOptions() { - - reverseMouseButtons2And3 - = choices[mouseButtonIndex].getSelectedItem().equals("Reversed"); - - viewOnly - = choices[viewOnlyIndex].getSelectedItem().equals("Yes"); - if (viewer.vc != null) - viewer.vc.enableInput(!viewOnly); - - shareDesktop - = choices[shareDesktopIndex].getSelectedItem().equals("Yes"); - - String scaleString = choices[scaleCursorIndex].getSelectedItem(); - if (scaleString.endsWith("%")) - scaleString = scaleString.substring(0, scaleString.length() - 1); - try { - scaleCursor = Integer.parseInt(scaleString); - } - catch (NumberFormatException e) { - scaleCursor = 0; - } - if (scaleCursor < 10 || scaleCursor > 500) { - scaleCursor = 0; - } - if (requestCursorUpdates && !ignoreCursorUpdates && !viewOnly) { - labels[scaleCursorIndex].setEnabled(true); - choices[scaleCursorIndex].setEnabled(true); - } else { - labels[scaleCursorIndex].setEnabled(false); - choices[scaleCursorIndex].setEnabled(false); - } - if (viewer.vc != null) - viewer.vc.createSoftCursor(); // update cursor scaling - } - - - // - // Respond to actions on Choice controls - // - - public void itemStateChanged(ItemEvent evt) { - Object source = evt.getSource(); - - if (source == choices[encodingIndex] || - source == choices[compressLevelIndex] || - source == choices[jpegQualityIndex] || - source == choices[cursorUpdatesIndex] || - source == choices[useCopyRectIndex]) { - - setEncodings(); - - if (source == choices[cursorUpdatesIndex]) { - setOtherOptions(); // update scaleCursor state - } - - } else if (source == choices[eightBitColorsIndex]) { - - setColorFormat(); - - } else if (source == choices[mouseButtonIndex] || - source == choices[shareDesktopIndex] || - source == choices[viewOnlyIndex] || - source == choices[scaleCursorIndex]) { - - setOtherOptions(); - } - } - - // - // Respond to button press - // - - public void actionPerformed(ActionEvent evt) { - if (evt.getSource() == closeButton) - setVisible(false); - } - - // - // Respond to window events - // - - public void windowClosing(WindowEvent evt) { - setVisible(false); - } - - public void windowActivated(WindowEvent evt) {} - public void windowDeactivated(WindowEvent evt) {} - public void windowOpened(WindowEvent evt) {} - public void windowClosed(WindowEvent evt) {} - public void windowIconified(WindowEvent evt) {} - public void windowDeiconified(WindowEvent evt) {} -*/ - } diff --git a/console-viewer/src/com/cloud/consoleviewer/RecordingFrame.java b/console-viewer/src/com/cloud/consoleviewer/RecordingFrame.java deleted file mode 100644 index 4b5effb63ae..00000000000 --- a/console-viewer/src/com/cloud/consoleviewer/RecordingFrame.java +++ /dev/null @@ -1,314 +0,0 @@ -// -// Copyright (C) 2002 Constantin Kaplinsky. All Rights Reserved. -// -// This is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this software; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. -// - -// -// Recording frame. It allows to control recording RFB sessions into -// FBS (FrameBuffer Stream) files. -// - -package com.cloud.consoleviewer; - -import java.io.*; -import java.awt.*; -import java.awt.event.*; - -@SuppressWarnings("serial") -class RecordingFrame extends Frame - implements WindowListener, ActionListener { - - boolean recording; - - TextField fnameField; - Button browseButton; - - Label statusLabel; - - Button recordButton, nextButton, closeButton; - ConsoleViewer viewer; - - // - // Check if current security manager allows to create a - // RecordingFrame object. - // - - public static boolean checkSecurity() { - SecurityManager security = System.getSecurityManager(); - if (security != null) { - try { - security.checkPropertyAccess("user.dir"); - security.checkPropertyAccess("file.separator"); - // Work around (rare) checkPropertyAccess bug - System.getProperty("user.dir"); - } catch (SecurityException e) { - System.out.println("SecurityManager restricts session recording."); - return false; - } - } - return true; - } - - // - // Constructor. - // - - RecordingFrame(ConsoleViewer v) { - super("TightVNC Session Recording"); - - viewer = v; - - // Determine initial filename for next saved session. - // FIXME: Check SecurityManager. - - String fname = nextNewFilename(System.getProperty("user.dir") + - System.getProperty("file.separator") + - "vncsession.fbs"); - - // Construct new panel with file name field and "Browse" button. - - Panel fnamePanel = new Panel(); - GridBagLayout fnameGridbag = new GridBagLayout(); - fnamePanel.setLayout(fnameGridbag); - - GridBagConstraints fnameConstraints = new GridBagConstraints(); - fnameConstraints.gridwidth = GridBagConstraints.RELATIVE; - fnameConstraints.fill = GridBagConstraints.BOTH; - fnameConstraints.weightx = 4.0; - - fnameField = new TextField(fname, 64); - fnameGridbag.setConstraints(fnameField, fnameConstraints); - fnamePanel.add(fnameField); - fnameField.addActionListener(this); - - fnameConstraints.gridwidth = GridBagConstraints.REMAINDER; - fnameConstraints.weightx = 1.0; - - browseButton = new Button("Browse"); - fnameGridbag.setConstraints(browseButton, fnameConstraints); - fnamePanel.add(browseButton); - browseButton.addActionListener(this); - - // Construct the frame. - - GridBagLayout gridbag = new GridBagLayout(); - setLayout(gridbag); - - GridBagConstraints gbc = new GridBagConstraints(); - gbc.gridwidth = GridBagConstraints.REMAINDER; - gbc.fill = GridBagConstraints.BOTH; - gbc.weighty = 1.0; - gbc.insets = new Insets(10, 0, 0, 0); - - Label helpLabel = - new Label("File name to save next recorded session in:", Label.CENTER); - gridbag.setConstraints(helpLabel, gbc); - add(helpLabel); - - gbc.fill = GridBagConstraints.HORIZONTAL; - gbc.weighty = 0.0; - gbc.insets = new Insets(0, 0, 0, 0); - - gridbag.setConstraints(fnamePanel, gbc); - add(fnamePanel); - - gbc.fill = GridBagConstraints.BOTH; - gbc.weighty = 1.0; - gbc.insets = new Insets(10, 0, 10, 0); - - statusLabel = new Label("", Label.CENTER); - gridbag.setConstraints(statusLabel, gbc); - add(statusLabel); - - gbc.fill = GridBagConstraints.HORIZONTAL; - gbc.weightx = 1.0; - gbc.weighty = 0.0; - gbc.gridwidth = 1; - gbc.insets = new Insets(0, 0, 0, 0); - - recordButton = new Button("Record"); - gridbag.setConstraints(recordButton, gbc); - add(recordButton); - recordButton.addActionListener(this); - - nextButton = new Button("Next file"); - gridbag.setConstraints(nextButton, gbc); - add(nextButton); - nextButton.addActionListener(this); - - closeButton = new Button("Close"); - gridbag.setConstraints(closeButton, gbc); - add(closeButton); - closeButton.addActionListener(this); - - // Set correct text, font and color for the statusLabel. - stopRecording(); - - pack(); - - addWindowListener(this); - } - - // - // If the given string ends with ".NNN" where NNN is a decimal - // number, increase this number by one. Otherwise, append ".001" - // to the given string. - // - - protected String nextFilename(String fname) { - int len = fname.length(); - int suffixPos = len; - int suffixNum = 1; - - if (len > 4 && fname.charAt(len - 4) == '.') { - try { - suffixNum = Integer.parseInt(fname.substring(len - 3, len)) + 1; - suffixPos = len - 4; - } catch (NumberFormatException e) { } - } - - char[] zeroes = {'0', '0', '0'}; - String suffix = String.valueOf(suffixNum); - if (suffix.length() < 3) { - suffix = new String(zeroes, 0, 3 - suffix.length()) + suffix; - } - - return fname.substring(0, suffixPos) + '.' + suffix; - } - - // - // Find next name of a file which does not exist yet. - // - - protected String nextNewFilename(String fname) { - String newName = fname; - File f; - try { - do { - newName = nextFilename(newName); - f = new File(newName); - } while (f.exists()); - } catch (SecurityException e) { } - - return newName; - } - - // - // Let the user choose a file name showing a FileDialog. - // - - protected boolean browseFile() { - File currentFile = new File(fnameField.getText()); - - FileDialog fd = - new FileDialog(this, "Save next session as...", FileDialog.SAVE); - fd.setDirectory(currentFile.getParent()); - fd.setVisible(true); - if (fd.getFile() != null) { - String newDir = fd.getDirectory(); - String sep = System.getProperty("file.separator"); - if (newDir.length() > 0) { - if (!sep.equals(newDir.substring(newDir.length() - sep.length()))) - newDir += sep; - } - String newFname = newDir + fd.getFile(); - if (newFname.equals(fnameField.getText())) { - fnameField.setText(newFname); - return true; - } - } - return false; - } - - // - // Start recording. - // - - public void startRecording() { - statusLabel.setText("Status: Recording..."); - statusLabel.setFont(new Font("Helvetica", Font.BOLD, 12)); - statusLabel.setForeground(Color.red); - recordButton.setLabel("Stop recording"); - - recording = true; - - viewer.setRecordingStatus(fnameField.getText()); - } - - // - // Stop recording. - // - - public void stopRecording() { - statusLabel.setText("Status: Not recording."); - statusLabel.setFont(new Font("Helvetica", Font.PLAIN, 12)); - statusLabel.setForeground(Color.black); - recordButton.setLabel("Record"); - - recording = false; - - viewer.setRecordingStatus(null); - } - - // - // Close our window properly. - // - - public void windowClosing(WindowEvent evt) { - setVisible(false); - } - - // - // Ignore window events we're not interested in. - // - - public void windowActivated(WindowEvent evt) {} - public void windowDeactivated (WindowEvent evt) {} - public void windowOpened(WindowEvent evt) {} - public void windowClosed(WindowEvent evt) {} - public void windowIconified(WindowEvent evt) {} - public void windowDeiconified(WindowEvent evt) {} - - - // - // Respond to button presses - // - - public void actionPerformed(ActionEvent evt) { - if (evt.getSource() == browseButton) { - if (browseFile() && recording) - startRecording(); - - } else if (evt.getSource() == recordButton) { - if (!recording) { - startRecording(); - } else { - stopRecording(); - fnameField.setText(nextNewFilename(fnameField.getText())); - } - - } else if (evt.getSource() == nextButton) { - fnameField.setText(nextNewFilename(fnameField.getText())); - if (recording) - startRecording(); - - } else if (evt.getSource() == closeButton) { - setVisible(false); - - } - } -} diff --git a/console-viewer/src/com/cloud/consoleviewer/ReloginPanel.java b/console-viewer/src/com/cloud/consoleviewer/ReloginPanel.java deleted file mode 100644 index 7c1ba17b56f..00000000000 --- a/console-viewer/src/com/cloud/consoleviewer/ReloginPanel.java +++ /dev/null @@ -1,66 +0,0 @@ -// -// Copyright (C) 2002 Cendio Systems. All Rights Reserved. -// Copyright (C) 2002 Constantin Kaplinsky. All Rights Reserved. -// -// This is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this software; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. -// - -// -// ReloginPanel class implements panel with a button for logging in again, -// after fatal errors or disconnect -// - -package com.cloud.consoleviewer; - -import java.awt.*; -import java.awt.event.*; -import java.applet.*; - -// -// The panel which implements the Relogin button -// -@SuppressWarnings("serial") -class ReloginPanel extends Panel implements ActionListener { - Button reloginButton; - Button closeButton; - ConsoleViewer viewer; - - // - // Constructor. - // - public ReloginPanel(ConsoleViewer v) { - viewer = v; - setLayout(new FlowLayout(FlowLayout.CENTER)); - reloginButton = new Button("Login again"); - add(reloginButton); - reloginButton.addActionListener(this); - if (viewer.inSeparateFrame) { - closeButton = new Button("Close window"); - add(closeButton); - closeButton.addActionListener(this); - } - } - - // - // This method is called when a button is pressed. - // - public synchronized void actionPerformed(ActionEvent evt) { - if (viewer.inSeparateFrame) - viewer.vncFrame.dispose(); - if (evt.getSource() == reloginButton) - viewer.applet.getAppletContext().showDocument(viewer.applet.getDocumentBase()); - } -} diff --git a/console-viewer/test/test-applet.html b/console-viewer/test/test-applet.html deleted file mode 100644 index b68cd7c94c5..00000000000 --- a/console-viewer/test/test-applet.html +++ /dev/null @@ -1,48 +0,0 @@ - -Console Viewer Applet - - - -
- -
- - - - - - - - - - - - - - - diff --git a/console/.classpath b/console/.classpath deleted file mode 100644 index d171cd4c123..00000000000 --- a/console/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/console/.project b/console/.project deleted file mode 100644 index c359a0eb4d2..00000000000 --- a/console/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - console - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/console/src/com/cloud/console/CapabilityInfo.java b/console/src/com/cloud/console/CapabilityInfo.java deleted file mode 100644 index 3c8b8d505fb..00000000000 --- a/console/src/com/cloud/console/CapabilityInfo.java +++ /dev/null @@ -1,90 +0,0 @@ -// -// Copyright (C) 2003 Constantin Kaplinsky. All Rights Reserved. -// -// This is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this software; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. -// - -// -// CapabilityInfo.java - A class to hold information about a -// particular capability as used in the RFB protocol 3.130. -// - -// repackage it to VMOps common packaging structure -package com.cloud.console; - -public class CapabilityInfo { - - // Public methods - - public CapabilityInfo(int code, - String vendorSignature, - String nameSignature, - String description) { - this.code = code; - this.vendorSignature = vendorSignature; - this.nameSignature = nameSignature; - this.description = description; - enabled = false; - } - - public CapabilityInfo(int code, - byte[] vendorSignature, - byte[] nameSignature) { - this.code = code; - this.vendorSignature = new String(vendorSignature); - this.nameSignature = new String(nameSignature); - this.description = null; - enabled = false; - } - - public int getCode() { - return code; - } - - public String getDescription() { - return description; - } - - public boolean isEnabled() { - return enabled; - } - - public void enable() { - enabled = true; - } - - public boolean equals(CapabilityInfo other) { - return (other != null && this.code == other.code && - this.vendorSignature.equals(other.vendorSignature) && - this.nameSignature.equals(other.nameSignature)); - } - - public boolean enableIfEquals(CapabilityInfo other) { - if (this.equals(other)) - enable(); - - return isEnabled(); - } - - // Protected data - - protected int code; - protected String vendorSignature; - protected String nameSignature; - - protected String description; - protected boolean enabled; -} diff --git a/console/src/com/cloud/console/CapsContainer.java b/console/src/com/cloud/console/CapsContainer.java deleted file mode 100644 index 82a85dedee1..00000000000 --- a/console/src/com/cloud/console/CapsContainer.java +++ /dev/null @@ -1,109 +0,0 @@ -// -// Copyright (C) 2003 Constantin Kaplinsky. All Rights Reserved. -// -// This is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this software; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. -// - -// -// CapsContainer.java - A container of capabilities as used in the RFB -// protocol 3.130 -// - -// repackage it to VMOps common packaging structure -package com.cloud.console; - -import java.util.Vector; -import java.util.Hashtable; - -public class CapsContainer { - - // Public methods - - public CapsContainer() { - infoMap = new Hashtable(64, (float)0.25); - orderedList = new Vector(32, 8); - } - - @SuppressWarnings("unchecked") - public void add(CapabilityInfo capinfo) { - Integer key = new Integer(capinfo.getCode()); - infoMap.put(key, capinfo); - } - - @SuppressWarnings("unchecked") - public void add(int code, String vendor, String name, String desc) { - Integer key = new Integer(code); - infoMap.put(key, new CapabilityInfo(code, vendor, name, desc)); - } - - public boolean isKnown(int code) { - return infoMap.containsKey(new Integer(code)); - } - - public CapabilityInfo getInfo(int code) { - return (CapabilityInfo)infoMap.get(new Integer(code)); - } - - public String getDescription(int code) { - CapabilityInfo capinfo = (CapabilityInfo)infoMap.get(new Integer(code)); - if (capinfo == null) - return null; - - return capinfo.getDescription(); - } - - @SuppressWarnings("unchecked") - public boolean enable(CapabilityInfo other) { - Integer key = new Integer(other.getCode()); - CapabilityInfo capinfo = (CapabilityInfo)infoMap.get(key); - if (capinfo == null) - return false; - - boolean enabled = capinfo.enableIfEquals(other); - if (enabled) - orderedList.addElement(key); - - return enabled; - } - - public boolean isEnabled(int code) { - CapabilityInfo capinfo = (CapabilityInfo)infoMap.get(new Integer(code)); - if (capinfo == null) - return false; - - return capinfo.isEnabled(); - } - - public int numEnabled() { - return orderedList.size(); - } - - public int getByOrder(int idx) { - int code; - try { - code = ((Integer)orderedList.elementAt(idx)).intValue(); - } catch (ArrayIndexOutOfBoundsException e) { - code = 0; - } - return code; - } - - // Protected data - - protected Hashtable infoMap; - protected Vector orderedList; -} - diff --git a/console/src/com/cloud/console/ConsoleCanvas.java b/console/src/com/cloud/console/ConsoleCanvas.java deleted file mode 100644 index f2d5e7e3078..00000000000 --- a/console/src/com/cloud/console/ConsoleCanvas.java +++ /dev/null @@ -1,2071 +0,0 @@ -// -// Copyright (C) 2004 Horizon Wimba. All Rights Reserved. -// Copyright (C) 2001-2003 HorizonLive.com, Inc. All Rights Reserved. -// Copyright (C) 2001,2002 Constantin Kaplinsky. All Rights Reserved. -// Copyright (C) 2000 Tridia Corporation. All Rights Reserved. -// Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. -// -// This is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this software; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. -// - -// repackage it to VMOps common packaging structure -package com.cloud.console; - -import java.awt.*; -import java.awt.event.*; -import java.awt.image.*; -import java.io.*; -import java.util.zip.*; - -// -// VncCanvas is a subclass of Canvas which draws a VNC desktop on it. -// -@SuppressWarnings("serial") -public class ConsoleCanvas extends Canvas - implements KeyListener, MouseListener, MouseMotionListener { - - private static final Logger s_logger = Logger.getLogger(ConsoleCanvas.class); - - // ConsoleViewer viewer; - RfbViewer viewer; - public RfbProto rfb; - ColorModel cm8, cm24; - Color[] colors; - public int bytesPixel; - - int maxWidth = 0, maxHeight = 0; - int scalingFactor; - public int scaledWidth, scaledHeight; - - public Image memImage; - public Graphics memGraphics; - - Image rawPixelsImage; - MemoryImageSource pixelsSource; - byte[] pixels8; - int[] pixels24; - - // ZRLE encoder's data. - byte[] zrleBuf; - int zrleBufLen = 0; - byte[] zrleTilePixels8; - int[] zrleTilePixels24; - ZlibInStream zrleInStream; - boolean zrleRecWarningShown = false; - - // Zlib encoder's data. - byte[] zlibBuf; - int zlibBufLen = 0; - Inflater zlibInflater; - - // Tight encoder's data. - final static int tightZlibBufferSize = 512; - Inflater[] tightInflaters; - - // Since JPEG images are loaded asynchronously, we have to remember - // their position in the framebuffer. Also, this jpegRect object is - // used for synchronization between the rfbThread and a JVM's thread - // which decodes and loads JPEG images. - Rectangle jpegRect; - - // True if we process keyboard and mouse events. - boolean inputEnabled; - - // - // The constructors. - // - - // public ConsoleCanvas(ConsoleViewer v, int maxWidth_, int maxHeight_) { - public ConsoleCanvas(RfbViewer v, int maxWidth_, int maxHeight_) { - - viewer = v; - maxWidth = maxWidth_; - maxHeight = maxHeight_; - - rfb = viewer.getRfb(); - scalingFactor = viewer.getScalingFactor(); - - tightInflaters = new Inflater[4]; - - cm8 = new DirectColorModel(8, 7, (7 << 3), (3 << 6)); - cm24 = new DirectColorModel(24, 0xFF0000, 0x00FF00, 0x0000FF); - - colors = new Color[256]; - for (int i = 0; i < 256; i++) - colors[i] = new Color(cm8.getRGB(i)); - - inputEnabled = false; - - // Keyboard listener is enabled even in view-only mode, to catch - // 'r' or 'R' key presses used to request screen update. - addKeyListener(this); - } - - // public ConsoleCanvas(ConsoleViewer v) throws IOException { - public ConsoleCanvas(RfbViewer v) throws IOException { - this(v, 0, 0); - } - - // - // Callback methods to determine geometry of our Component. - // - - public Dimension getPreferredSize() { - return new Dimension(scaledWidth, scaledHeight); - } - - public Dimension getMinimumSize() { - return new Dimension(scaledWidth, scaledHeight); - } - - public Dimension getMaximumSize() { - return new Dimension(scaledWidth, scaledHeight); - } - - // - // All painting is performed here. - // - - public void update(Graphics g) { - paint(g); - } - - public void paint(Graphics g) { - // if(s_logger.isInfoEnabled()) - // s_logger.info("VncCanvas.paint called g=" + g.hashCode() + g + - // " memImage=" + memImage); - if (rfb == null) { - return; - } - - synchronized (memImage) { - if (rfb.framebufferWidth == scaledWidth) { - g.drawImage(memImage, 0, 0, null); - } else { - paintScaledFrameBuffer(g); - } - } - if (showSoftCursor) { - int x0 = cursorX - hotX, y0 = cursorY - hotY; - Rectangle r = new Rectangle(x0, y0, cursorWidth, cursorHeight); - if (r.intersects(g.getClipBounds())) { - g.drawImage(softCursor, x0, y0, null); - } - } - } - - public void paintScaledFrameBuffer(Graphics g) { - g.drawImage(memImage, 0, 0, scaledWidth, scaledHeight, null); - } - - // - // Override the ImageObserver interface method to handle drawing of - // JPEG-encoded data. - // - - public boolean imageUpdate(Image img, int infoflags, - int x, int y, int width, int height) { - if ((infoflags & (ALLBITS | ABORT)) == 0) { - return true; // We need more image data. - } else { - // If the whole image is available, draw it now. - if ((infoflags & ALLBITS) != 0) { - if (jpegRect != null) { - synchronized(jpegRect) { - memGraphics.drawImage(img, jpegRect.x, jpegRect.y, null); - scheduleRepaint(jpegRect.x, jpegRect.y, - jpegRect.width, jpegRect.height); - jpegRect.notify(); - } - } - } - return false; // All image data was processed. - } - } - - // - // Start/stop receiving mouse events. Keyboard events are received - // even in view-only mode, because we want to map the 'r' key to the - // screen refreshing function. - // - - public synchronized void enableInput(boolean enable) { - if (enable && !inputEnabled) { - inputEnabled = true; - addMouseListener(this); - addMouseMotionListener(this); - - viewer.onInputEnabled(true); - - createSoftCursor(); // scaled cursor - } else if (!enable && inputEnabled) { - inputEnabled = false; - removeMouseListener(this); - removeMouseMotionListener(this); - - viewer.onInputEnabled(false); - createSoftCursor(); // non-scaled cursor - } - } - - public void setPixelFormat() throws IOException { - bytesPixel = viewer.setPixelFormat(rfb); - - updateFramebufferSize(); - } - - public void updateFramebufferSize() { - - if(rfb == null) { - s_logger.warn("updateFrameBufferSize is called but RFB is not ready"); - return; - } - - // Useful shortcuts. - int fbWidth = rfb.framebufferWidth; - int fbHeight = rfb.framebufferHeight; - - // Calculate scaling factor for auto scaling. - if (maxWidth > 0 && maxHeight > 0) { - int f1 = maxWidth * 100 / fbWidth; - int f2 = maxHeight * 100 / fbHeight; - scalingFactor = Math.min(f1, f2); - if (scalingFactor > 100) - scalingFactor = 100; - - if(s_logger.isInfoEnabled()) - s_logger.info("Scaling desktop at " + scalingFactor + "%"); - } - - // Update scaled framebuffer geometry. - scaledWidth = (fbWidth * scalingFactor + 50) / 100; - scaledHeight = (fbHeight * scalingFactor + 50) / 100; - - // Create new off-screen image either if it does not exist, or if - // its geometry should be changed. It's not necessary to replace - // existing image if only pixel format should be changed. - if (memImage == null) { -// memImage = viewer.vncContainer.createImage(fbWidth, fbHeight); - memImage = new BufferedImage(fbWidth, fbHeight, BufferedImage.TYPE_4BYTE_ABGR); - memGraphics = memImage.getGraphics(); - } else if (memImage.getWidth(null) != fbWidth || memImage.getHeight(null) != fbHeight) { - synchronized(memImage) { -// memImage = viewer.vncContainer.createImage(fbWidth, fbHeight); - memImage = new BufferedImage(fbWidth, fbHeight, BufferedImage.TYPE_4BYTE_ABGR); - memGraphics = memImage.getGraphics(); - } - } - - // Images with raw pixels should be re-allocated on every change - // of geometry or pixel format. - if (bytesPixel == 1) { - - pixels24 = null; - pixels8 = new byte[fbWidth * fbHeight]; - - pixelsSource = new MemoryImageSource(fbWidth, fbHeight, cm8, pixels8, 0, fbWidth); - - zrleTilePixels24 = null; - zrleTilePixels8 = new byte[64 * 64]; - - } else { - - pixels8 = null; - pixels24 = new int[fbWidth * fbHeight]; - - pixelsSource = new MemoryImageSource(fbWidth, fbHeight, cm24, pixels24, 0, fbWidth); - - zrleTilePixels8 = null; - zrleTilePixels24 = new int[64 * 64]; - } - pixelsSource.setAnimated(true); - rawPixelsImage = Toolkit.getDefaultToolkit().createImage(pixelsSource); - - viewer.onFramebufferSizeChange(scaledWidth, scaledHeight); - } - - public void resizeDesktopFrame() { - setSize(scaledWidth, scaledHeight); - - // FIXME: Find a better way to determine correct size of a - // ScrollPane. -- const - viewer.onDesktopResize(); - - // Try to limit the frame size to the screen size. - Dimension screenSize = viewer.getScreenSize(); - Dimension frameSize = viewer.getFrameSize(); - Dimension newSize = frameSize; - - // Reduce Screen Size by 30 pixels in each direction; - // This is a (poor) attempt to account for - // 1) Menu bar on Macintosh (should really also account for - // Dock on OSX). Usually 22px on top of screen. - // 2) Taxkbar on Windows (usually about 28 px on bottom) - // 3) Other obstructions. - - screenSize.height -= 30; - screenSize.width -= 30; - - boolean needToResizeFrame = false; - if (frameSize.height > screenSize.height) { - newSize.height = screenSize.height; - needToResizeFrame = true; - } - if (frameSize.width > screenSize.width) { - newSize.width = screenSize.width; - needToResizeFrame = true; - } - - if (needToResizeFrame) - viewer.onFrameResize(newSize); - } - - // - // processNormalProtocol() - executed by the rfbThread to deal with the - // RFB socket. - // - - long timestamp = 0; - long bytes_sent_last = 0; - long rate_limit = 100000; - - public void processNormalProtocol() throws Exception { - try { - timestamp = 0; - // main dispatch loop - while (true) { - processNormalProtocol2(); - } - } catch (IOException e) { - - // Server connection get disrupted. - // Send a special msg to the client stream so that the client can blank out - // the screen. - viewer.onProtocolProcessException(e); - - // rethrow the exception; - throw e; - } catch(OutOfMemoryError e) { - s_logger.error("Unrecoverable OutOfMemory Error, exit and let it be re-launched"); - System.exit(1); - } - } - - private void processNormalProtocol2() throws Exception { - byte[] bs = rfb.sis.getSplit(); -// if (viewer.inProxyMode) { -// s_logger.info("bs != null = " + (bs != null) + " viewer.clientStream = " + viewer.clientStream + " info = " + viewer.clientStreamInfo); -// } - viewer.onPreProtocolProcess(bs); - - // Read message type from the server. - int msgType = rfb.readServerMessageType(); - - // Process the message depending on its type. - switch (msgType) { - case 250: - int b = rfb.is.read(); - if (b == 1) { - if(s_logger.isDebugEnabled()) - s_logger.debug("S->C RFB msg VMOps DISCONNECT"); - - /* - viewer.vc.paintErrorString("Disconnected"); - */ - viewer.onDisconnectMessage(); - break; - } else if (b == 2) { - int n = rfb.is.readInt(); - - if(s_logger.isDebugEnabled()) - s_logger.debug("S->C RFB msg VMOps COMPRESSED"); - - if(s_logger.isInfoEnabled()) - s_logger.info("Reading compressed data size=" + n); - - byte[] buf = new byte[n]; - rfb.is.readFully(buf); - ByteArrayInputStream bis = new ByteArrayInputStream(buf); - DataInputStream oldis = rfb.is; - // swap out the underlying input stream - rfb.is = new DataInputStream(new GZIPInputStream(bis, 65536)); - try { - processNormalProtocol2(); - } finally { - rfb.is = oldis; - } - break; - } else if (b == 3) { - if(s_logger.isDebugEnabled()) - s_logger.debug("S->C RFB msg VMOps KEEP-ALIVE"); - - // Send liveliness message - rfb.writeClientCustomMessage(0); - break; - } - throw new Exception ("Message type 250 comes with bad submessage type: " + b); - - case RfbProto.FramebufferUpdate: - if(s_logger.isDebugEnabled()) - s_logger.debug("S->C RFB FramebufferUpdate"); - - rfb.readFramebufferUpdate(); - boolean cursorPosReceived = false; - boolean fullUpdateNeeded = false; - for (int i = 0; i < rfb.updateNRects; i++) { - rfb.readFramebufferUpdateRectHdr(); - int rx = rfb.updateRectX, ry = rfb.updateRectY; - int rw = rfb.updateRectW, rh = rfb.updateRectH; - - if (rfb.updateRectEncoding == rfb.EncodingLastRect) { - if(s_logger.isInfoEnabled()) - s_logger.info("Received EncodingLastRect packet in iteration " + i + " of " + rfb.updateNRects); - break; - } - - if (rfb.updateRectEncoding == rfb.EncodingNewFBSize) { - rfb.setFramebufferSize(rw, rh); - updateFramebufferSize(); - - if(s_logger.isInfoEnabled()) - s_logger.info("Frame buffer size is changed to (" + rw + ", " + rh + "), packet in iteration " + i + " of " + rfb.updateNRects); - break; - } - - if (rfb.updateRectEncoding == rfb.EncodingXCursor || - rfb.updateRectEncoding == rfb.EncodingRichCursor) { - - byte[] cursorData = new byte[ConsoleCanvas.getCursorDataSize(rfb.updateRectEncoding, - rw, rh)]; - handleCursorShapeUpdate(rfb.updateRectEncoding, rx, ry, rw, rh, cursorData); - viewer.onFramebufferCursorShapeChange(rfb.updateRectEncoding, rx, ry, rw, rh, cursorData); - - if(s_logger.isInfoEnabled()) - s_logger.info("Received CursorShapeUpdate packet in iteration " + i + " of " + rfb.updateNRects); - continue; - } - - if (rfb.updateRectEncoding == rfb.EncodingPointerPos) { - softCursorMove(rx, ry); - cursorPosReceived = true; - viewer.onFramebufferCursorMove(rx, ry); - - if(s_logger.isInfoEnabled()) - s_logger.info("Received PointerPosUpdate packet in iteration " + i + " of " + rfb.updateNRects); - continue; - } - - // synchronize the access to memory pixel images as we have - // separated client update into a sender thread - rfb.startTiming(); - - // if(s_logger.isInfoEnabled()) - // s_logger.info("RFB Update Rect Encoding: " + rfb.updateRectEncoding); - switch (rfb.updateRectEncoding) { - case RfbProto.EncodingRaw: - handleRawRect(rx, ry, rw, rh); - break; - case RfbProto.EncodingCopyRect: - handleCopyRect(rx, ry, rw, rh); - break; - case RfbProto.EncodingRRE: - handleRRERect(rx, ry, rw, rh); - break; - case RfbProto.EncodingCoRRE: - handleCoRRERect(rx, ry, rw, rh); - break; - case RfbProto.EncodingHextile: - handleHextileRect(rx, ry, rw, rh); - break; - case RfbProto.EncodingZRLE: - handleZRLERect(rx, ry, rw, rh); - break; - case RfbProto.EncodingZlib: - handleZlibRect(rx, ry, rw, rh); - break; - case RfbProto.EncodingTight: - handleTightRect(rx, ry, rw, rh); - break; - default: - throw new Exception("Unknown RFB rectangle encoding " + - rfb.updateRectEncoding); - } - - viewer.onFramebufferUpdate(rx, ry, rw, rh); - rfb.stopTiming(); - - fullUpdateNeeded = viewer.onPostFrameBufferUpdateProcess(cursorPosReceived); - // viewer.autoSelectEncodings(); - } - - // send update request outside the for loop! - if(!viewer.isProxy()) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Send FrameBufferUpdateRequest in response of server update return"); - - rfb.writeFramebufferUpdateRequest(0, 0, rfb.framebufferWidth, - rfb.framebufferHeight, !fullUpdateNeeded); - } else { - // if don't have client connected, to drive thumbnail updates, we need to continue - // to keep the request-cycle with server - if(!viewer.hasClientConnection()) { - if(s_logger.isDebugEnabled()) - s_logger.debug("No client is connected, send FrameBufferUpdateRequest from proxy"); - - rfb.writeFramebufferUpdateRequest(0, 0, rfb.framebufferWidth, - rfb.framebufferHeight, - !fullUpdateNeeded); - } else { - if(s_logger.isDebugEnabled()) - s_logger.debug("Client is connected, let client to send FrameBufferUpdateRequest"); - } - } - break; - - case RfbProto.SetColourMapEntries: - if(s_logger.isDebugEnabled()) - s_logger.debug("S->C RFB SetColourMapEntries"); - - throw new Exception("Can't handle SetColourMapEntries message"); - - case RfbProto.Bell: - if(s_logger.isDebugEnabled()) - s_logger.debug("S->C RFB Bell"); - - viewer.onBellMessage(); - break; - - case RfbProto.ServerCutText: - if(s_logger.isDebugEnabled()) - s_logger.debug("S->C RFB ServerCutText"); - - String s = rfb.readServerCutText(); - // viewer.clipboard.setCutText(s); - break; - - default: - if(s_logger.isDebugEnabled()) - s_logger.debug("S->C RFB Unknown message type " + msgType); - throw new Exception("Unknown RFB message type " + msgType); - } - } - - // - // Handle a raw rectangle. The second form with paint==false is used - // by the Hextile decoder for raw-encoded tiles. - // - void handleRawRect(int x, int y, int w, int h) throws IOException { - handleRawRect(x, y, w, h, true); - } - - void handleRawRect(int x, int y, int w, int h, boolean paint) throws IOException { - // s_logger.info("handleRawRect " + " x=" + x + " y=" + y + " w=" + w + " h=" + h + " paint=" + paint); - - if (bytesPixel == 1) { - for (int dy = y; dy < y + h; dy++) { - rfb.readFully(pixels8, dy * rfb.framebufferWidth + x, w); - if (rfb.rec != null) { - rfb.rec.write(pixels8, dy * rfb.framebufferWidth + x, w); - } - } - } else { - byte[] buf = new byte[w * 4]; - int i, offset; - for (int dy = y; dy < y + h; dy++) { - rfb.readFully(buf); - if (rfb.rec != null) { - rfb.rec.write(buf); - } - - offset = dy * rfb.framebufferWidth + x; - for (i = 0; i < w; i++) { - pixels24[offset + i] = - (buf[i * 4 + 2] & 0xFF) << 16 | - (buf[i * 4 + 1] & 0xFF) << 8 | - (buf[i * 4] & 0xFF); - } - } - } - - handleUpdatedPixels(x, y, w, h); - if (paint) - scheduleRepaint(x, y, w, h); - } - - // - // Handle a CopyRect rectangle. - // - void handleCopyRect(int x, int y, int w, int h) throws IOException { - - s_logger.info("handleCopyRect " + " x=" + x + " y=" + y + " w=" + w + " h=" + h); - rfb.readCopyRect(); - memGraphics.copyArea(rfb.copyRectSrcX, rfb.copyRectSrcY, w, h, - x - rfb.copyRectSrcX, y - rfb.copyRectSrcY); - - scheduleRepaint(x, y, w, h); - } - - // - // Handle an RRE-encoded rectangle. - // - void handleRRERect(int x, int y, int w, int h) throws IOException { - //s_logger.info("handleRRERect " + " x=" + x + " y=" + y + " w=" + w + " h=" + h); - - int nSubrects = rfb.is.readInt(); - - byte[] bg_buf = new byte[bytesPixel]; - rfb.readFully(bg_buf); - Color pixel; - if (bytesPixel == 1) { - pixel = colors[bg_buf[0] & 0xFF]; - } else { - pixel = new Color(bg_buf[2] & 0xFF, bg_buf[1] & 0xFF, bg_buf[0] & 0xFF); - } - memGraphics.setColor(pixel); - memGraphics.fillRect(x, y, w, h); - - byte[] buf = new byte[nSubrects * (bytesPixel + 8)]; - rfb.readFully(buf); - DataInputStream ds = new DataInputStream(new ByteArrayInputStream(buf)); - - if (rfb.rec != null) { - rfb.rec.writeIntBE(nSubrects); - rfb.rec.write(bg_buf); - rfb.rec.write(buf); - } - - int sx, sy, sw, sh; - - for (int j = 0; j < nSubrects; j++) { - if (bytesPixel == 1) { - pixel = colors[ds.readUnsignedByte()]; - } else { - ds.skip(4); - pixel = new Color(buf[j*12+2] & 0xFF, - buf[j*12+1] & 0xFF, - buf[j*12] & 0xFF); - } - sx = x + ds.readUnsignedShort(); - sy = y + ds.readUnsignedShort(); - sw = ds.readUnsignedShort(); - sh = ds.readUnsignedShort(); - - memGraphics.setColor(pixel); - memGraphics.fillRect(sx, sy, sw, sh); - } - - scheduleRepaint(x, y, w, h); - } - - // - // Handle a CoRRE-encoded rectangle. - // - - void handleCoRRERect(int x, int y, int w, int h) throws IOException { - //s_logger.info("handleCpRRERect " + " x=" + x + " y=" + y + " w=" + w + " h=" + h); - int nSubrects = rfb.is.readInt(); - - byte[] bg_buf = new byte[bytesPixel]; - rfb.readFully(bg_buf); - Color pixel; - if (bytesPixel == 1) { - pixel = colors[bg_buf[0] & 0xFF]; - } else { - pixel = new Color(bg_buf[2] & 0xFF, bg_buf[1] & 0xFF, bg_buf[0] & 0xFF); - } - memGraphics.setColor(pixel); - memGraphics.fillRect(x, y, w, h); - - byte[] buf = new byte[nSubrects * (bytesPixel + 4)]; - rfb.readFully(buf); - - if (rfb.rec != null) { - rfb.rec.writeIntBE(nSubrects); - rfb.rec.write(bg_buf); - rfb.rec.write(buf); - } - - int sx, sy, sw, sh; - int i = 0; - - for (int j = 0; j < nSubrects; j++) { - if (bytesPixel == 1) { - pixel = colors[buf[i++] & 0xFF]; - } else { - pixel = new Color(buf[i+2] & 0xFF, buf[i+1] & 0xFF, buf[i] & 0xFF); - i += 4; - } - sx = x + (buf[i++] & 0xFF); - sy = y + (buf[i++] & 0xFF); - sw = buf[i++] & 0xFF; - sh = buf[i++] & 0xFF; - - memGraphics.setColor(pixel); - memGraphics.fillRect(sx, sy, sw, sh); - } - - scheduleRepaint(x, y, w, h); - } - - // - // Handle a Hextile-encoded rectangle. - // - - // These colors should be kept between handleHextileSubrect() calls. - private Color hextile_bg, hextile_fg; - - void handleHextileRect(int x, int y, int w, int h) throws IOException { - // s_logger.info("handleHextileRect " + " x=" + x + " y=" + y + " w=" + w + " h=" + h); - hextile_bg = new Color(0); - hextile_fg = new Color(0); - - for (int ty = y; ty < y + h; ty += 16) { - int th = 16; - if (y + h - ty < 16) - th = y + h - ty; - - for (int tx = x; tx < x + w; tx += 16) { - int tw = 16; - if (x + w - tx < 16) - tw = x + w - tx; - - handleHextileSubrect(tx, ty, tw, th); - } - - // Finished with a row of tiles, now let's show it. - - } - scheduleRepaint(x, y, w, h); - } - - // - // Handle one tile in the Hextile-encoded data. - // - void handleHextileSubrect(int tx, int ty, int tw, int th) throws IOException { - - int subencoding = rfb.is.readUnsignedByte(); - if (rfb.rec != null) { - rfb.rec.writeByte(subencoding); - } - - // Is it a raw-encoded sub-rectangle? - if ((subencoding & rfb.HextileRaw) != 0) { - handleRawRect(tx, ty, tw, th, false); - return; - } - - // Read and draw the background if specified. - byte[] cbuf = new byte[bytesPixel]; - if ((subencoding & rfb.HextileBackgroundSpecified) != 0) { - rfb.readFully(cbuf); - if (bytesPixel == 1) { - hextile_bg = colors[cbuf[0] & 0xFF]; - } else { - hextile_bg = new Color(cbuf[2] & 0xFF, cbuf[1] & 0xFF, cbuf[0] & 0xFF); - } - - if (rfb.rec != null) { - rfb.rec.write(cbuf); - } - } - memGraphics.setColor(hextile_bg); - memGraphics.fillRect(tx, ty, tw, th); - - // Read the foreground color if specified. - if ((subencoding & rfb.HextileForegroundSpecified) != 0) { - rfb.readFully(cbuf); - if (bytesPixel == 1) { - hextile_fg = colors[cbuf[0] & 0xFF]; - } else { - hextile_fg = new Color(cbuf[2] & 0xFF, cbuf[1] & 0xFF, cbuf[0] & 0xFF); - } - if (rfb.rec != null) { - rfb.rec.write(cbuf); - } - } - - // Done with this tile if there is no sub-rectangles. - if ((subencoding & rfb.HextileAnySubrects) == 0) - return; - - int nSubrects = rfb.is.readUnsignedByte(); - int bufsize = nSubrects * 2; - if ((subencoding & rfb.HextileSubrectsColoured) != 0) { - bufsize += nSubrects * bytesPixel; - } - byte[] buf = new byte[bufsize]; - rfb.readFully(buf); - if (rfb.rec != null) { - rfb.rec.writeByte(nSubrects); - rfb.rec.write(buf); - } - - int b1, b2, sx, sy, sw, sh; - int i = 0; - if ((subencoding & rfb.HextileSubrectsColoured) == 0) { - // Sub-rectangles are all of the same color. - memGraphics.setColor(hextile_fg); - for (int j = 0; j < nSubrects; j++) { - b1 = buf[i++] & 0xFF; - b2 = buf[i++] & 0xFF; - sx = tx + (b1 >> 4); - sy = ty + (b1 & 0xf); - sw = (b2 >> 4) + 1; - sh = (b2 & 0xf) + 1; - memGraphics.fillRect(sx, sy, sw, sh); - } - } else if (bytesPixel == 1) { - - // BGR233 (8-bit color) version for colored sub-rectangles. - for (int j = 0; j < nSubrects; j++) { - hextile_fg = colors[buf[i++] & 0xFF]; - b1 = buf[i++] & 0xFF; - b2 = buf[i++] & 0xFF; - sx = tx + (b1 >> 4); - sy = ty + (b1 & 0xf); - sw = (b2 >> 4) + 1; - sh = (b2 & 0xf) + 1; - memGraphics.setColor(hextile_fg); - memGraphics.fillRect(sx, sy, sw, sh); - } - - } else { - - // Full-color (24-bit) version for colored sub-rectangles. - for (int j = 0; j < nSubrects; j++) { - hextile_fg = new Color(buf[i+2] & 0xFF, - buf[i+1] & 0xFF, - buf[i] & 0xFF); - i += 4; - b1 = buf[i++] & 0xFF; - b2 = buf[i++] & 0xFF; - sx = tx + (b1 >> 4); - sy = ty + (b1 & 0xf); - sw = (b2 >> 4) + 1; - sh = (b2 & 0xf) + 1; - memGraphics.setColor(hextile_fg); - memGraphics.fillRect(sx, sy, sw, sh); - } - - } - } - - // - // Handle a ZRLE-encoded rectangle. - // - // FIXME: Currently, session recording is not fully supported for ZRLE. - // - - void handleZRLERect(int x, int y, int w, int h) throws Exception { - //s_logger.info("handleZRLERect " + " x=" + x + " y=" + y + " w=" + w + " h=" + h); - if (zrleInStream == null) - zrleInStream = new ZlibInStream(); - - int nBytes = rfb.is.readInt(); - if (nBytes > 64 * 1024 * 1024) - throw new Exception("ZRLE decoder: illegal compressed data size"); - - if (zrleBuf == null || zrleBufLen < nBytes) { - zrleBufLen = nBytes + 4096; - zrleBuf = new byte[zrleBufLen]; - } - - // FIXME: Do not wait for all the data before decompression. - rfb.readFully(zrleBuf, 0, nBytes); - - if (rfb.rec != null) { - if (rfb.recordFromBeginning) { - rfb.rec.writeIntBE(nBytes); - rfb.rec.write(zrleBuf, 0, nBytes); - } else if (!zrleRecWarningShown) { - - if(s_logger.isInfoEnabled()) { - s_logger.info("Warning: ZRLE session can be recorded" + - " only from the beginning"); - s_logger.info("Warning: Recorded file may be corrupted"); - } - zrleRecWarningShown = true; - } - } - - zrleInStream.setUnderlying(new MemInStream(zrleBuf, 0, nBytes), nBytes); - - for (int ty = y; ty < y+h; ty += 64) { - - int th = Math.min(y+h-ty, 64); - - for (int tx = x; tx < x+w; tx += 64) { - - int tw = Math.min(x+w-tx, 64); - - int mode = zrleInStream.readU8(); - boolean rle = (mode & 128) != 0; - int palSize = mode & 127; - int[] palette = new int[128]; - - readZrlePalette(palette, palSize); - - if (palSize == 1) { - int pix = palette[0]; - Color c = (bytesPixel == 1) ? - colors[pix] : new Color(0xFF000000 | pix); - memGraphics.setColor(c); - memGraphics.fillRect(tx, ty, tw, th); - continue; - } - - if (!rle) { - if (palSize == 0) { - readZrleRawPixels(tw, th); - } else { - readZrlePackedPixels(tw, th, palette, palSize); - } - } else { - if (palSize == 0) { - readZrlePlainRLEPixels(tw, th); - } else { - readZrlePackedRLEPixels(tw, th, palette); - } - } - handleUpdatedZrleTile(tx, ty, tw, th); - } - } - - zrleInStream.reset(); - - scheduleRepaint(x, y, w, h); - } - - int readPixel(InStream is) throws Exception { - int pix; - if (bytesPixel == 1) { - pix = is.readU8(); - } else { - int p1 = is.readU8(); - int p2 = is.readU8(); - int p3 = is.readU8(); - pix = (p3 & 0xFF) << 16 | (p2 & 0xFF) << 8 | (p1 & 0xFF); - } - return pix; - } - - void readPixels(InStream is, int[] dst, int count) throws Exception { - int pix; - if (bytesPixel == 1) { - byte[] buf = new byte[count]; - is.readBytes(buf, 0, count); - for (int i = 0; i < count; i++) { - dst[i] = (int)buf[i] & 0xFF; - } - } else { - byte[] buf = new byte[count * 3]; - is.readBytes(buf, 0, count * 3); - for (int i = 0; i < count; i++) { - dst[i] = ((buf[i*3+2] & 0xFF) << 16 | - (buf[i*3+1] & 0xFF) << 8 | - (buf[i*3] & 0xFF)); - } - } - } - - void readZrlePalette(int[] palette, int palSize) throws Exception { - readPixels(zrleInStream, palette, palSize); - } - - void readZrleRawPixels(int tw, int th) throws Exception { - if (bytesPixel == 1) { - zrleInStream.readBytes(zrleTilePixels8, 0, tw * th); - } else { - readPixels(zrleInStream, zrleTilePixels24, tw * th); /// - } - } - - void readZrlePackedPixels(int tw, int th, int[] palette, int palSize) - throws Exception { - - int bppp = ((palSize > 16) ? 8 : - ((palSize > 4) ? 4 : ((palSize > 2) ? 2 : 1))); - int ptr = 0; - - for (int i = 0; i < th; i++) { - int eol = ptr + tw; - int b = 0; - int nbits = 0; - - while (ptr < eol) { - if (nbits == 0) { - b = zrleInStream.readU8(); - nbits = 8; - } - nbits -= bppp; - int index = (b >> nbits) & ((1 << bppp) - 1) & 127; - if (bytesPixel == 1) { - zrleTilePixels8[ptr++] = (byte)palette[index]; - } else { - zrleTilePixels24[ptr++] = palette[index]; - } - } - } - } - - void readZrlePlainRLEPixels(int tw, int th) throws Exception { - int ptr = 0; - int end = ptr + tw * th; - while (ptr < end) { - int pix = readPixel(zrleInStream); - int len = 1; - int b; - do { - b = zrleInStream.readU8(); - len += b; - } while (b == 255); - - if (!(len <= end - ptr)) - throw new Exception("ZRLE decoder: assertion failed" + - " (len <= end-ptr)"); - - if (bytesPixel == 1) { - while (len-- > 0) zrleTilePixels8[ptr++] = (byte)pix; - } else { - while (len-- > 0) zrleTilePixels24[ptr++] = pix; - } - } - } - - void readZrlePackedRLEPixels(int tw, int th, int[] palette) - throws Exception { - - int ptr = 0; - int end = ptr + tw * th; - while (ptr < end) { - int index = zrleInStream.readU8(); - int len = 1; - if ((index & 128) != 0) { - int b; - do { - b = zrleInStream.readU8(); - len += b; - } while (b == 255); - - if (!(len <= end - ptr)) - throw new Exception("ZRLE decoder: assertion failed" + - " (len <= end - ptr)"); - } - - index &= 127; - int pix = palette[index]; - - if (bytesPixel == 1) { - while (len-- > 0) zrleTilePixels8[ptr++] = (byte)pix; - } else { - while (len-- > 0) zrleTilePixels24[ptr++] = pix; - } - } - } - - // - // Copy pixels from zrleTilePixels8 or zrleTilePixels24, then update. - // - - void handleUpdatedZrleTile(int x, int y, int w, int h) { - Object src, dst; - if (bytesPixel == 1) { - src = zrleTilePixels8; dst = pixels8; - } else { - src = zrleTilePixels24; dst = pixels24; - } - int offsetSrc = 0; - int offsetDst = (y * rfb.framebufferWidth + x); - for (int j = 0; j < h; j++) { - System.arraycopy(src, offsetSrc, dst, offsetDst, w); - offsetSrc += w; - offsetDst += rfb.framebufferWidth; - } - handleUpdatedPixels(x, y, w, h); - } - - // - // Handle a Zlib-encoded rectangle. - // - - void handleZlibRect(int x, int y, int w, int h) throws Exception { - // s_logger.info("handleZlibRect " + " x=" + x + " y=" + y + " w=" + w + " h=" + h); - int nBytes = rfb.is.readInt(); - - if (zlibBuf == null || zlibBufLen < nBytes) { - zlibBufLen = nBytes * 2; - zlibBuf = new byte[zlibBufLen]; - } - - rfb.readFully(zlibBuf, 0, nBytes); - - if (rfb.rec != null && rfb.recordFromBeginning) { - rfb.rec.writeIntBE(nBytes); - rfb.rec.write(zlibBuf, 0, nBytes); - } - - if (zlibInflater == null) { - zlibInflater = new Inflater(); - } - zlibInflater.setInput(zlibBuf, 0, nBytes); - - if (bytesPixel == 1) { - for (int dy = y; dy < y + h; dy++) { - zlibInflater.inflate(pixels8, dy * rfb.framebufferWidth + x, w); - if (rfb.rec != null && !rfb.recordFromBeginning) - rfb.rec.write(pixels8, dy * rfb.framebufferWidth + x, w); - } - } else { - byte[] buf = new byte[w * 4]; - int i, offset; - for (int dy = y; dy < y + h; dy++) { - zlibInflater.inflate(buf); - offset = dy * rfb.framebufferWidth + x; - for (i = 0; i < w; i++) { - pixels24[offset + i] = - (buf[i * 4 + 2] & 0xFF) << 16 | - (buf[i * 4 + 1] & 0xFF) << 8 | - (buf[i * 4] & 0xFF); - } - if (rfb.rec != null && !rfb.recordFromBeginning) - rfb.rec.write(buf); - } - } - - handleUpdatedPixels(x, y, w, h); - scheduleRepaint(x, y, w, h); - } - - // - // Handle a Tight-encoded rectangle. - // - - void handleTightRect(int x, int y, int w, int h) throws Exception { - //s_logger.info("handleTightRect " + " x=" + x + " y=" + y + " w=" + w + " h=" + h); - int comp_ctl = rfb.is.readUnsignedByte(); - if (rfb.rec != null) { - if (rfb.recordFromBeginning || - comp_ctl == (rfb.TightFill << 4) || - comp_ctl == (rfb.TightJpeg << 4)) { - // Send data exactly as received. - rfb.rec.writeByte(comp_ctl); - } else { - // Tell the decoder to flush each of the four zlib streams. - rfb.rec.writeByte(comp_ctl | 0x0F); - } - } - - // Flush zlib streams if we are told by the server to do so. - for (int stream_id = 0; stream_id < 4; stream_id++) { - if ((comp_ctl & 1) != 0 && tightInflaters[stream_id] != null) { - tightInflaters[stream_id] = null; - } - comp_ctl >>= 1; - } - - // Check correctness of subencoding value. - if (comp_ctl > rfb.TightMaxSubencoding) { - throw new Exception("Incorrect tight subencoding: " + comp_ctl); - } - - // Handle solid-color rectangles. - if (comp_ctl == rfb.TightFill) { - - if (bytesPixel == 1) { - int idx = rfb.is.readUnsignedByte(); - memGraphics.setColor(colors[idx]); - if (rfb.rec != null) { - rfb.rec.writeByte(idx); - } - } else { - byte[] buf = new byte[3]; - rfb.readFully(buf); - if (rfb.rec != null) { - rfb.rec.write(buf); - } - Color bg = new Color(0xFF000000 | (buf[0] & 0xFF) << 16 | - (buf[1] & 0xFF) << 8 | (buf[2] & 0xFF)); - memGraphics.setColor(bg); - } - memGraphics.fillRect(x, y, w, h); - scheduleRepaint(x, y, w, h); - return; - - } - - if (comp_ctl == rfb.TightJpeg) { - - // Read JPEG data. - byte[] jpegData = new byte[rfb.readCompactLen()]; - rfb.readFully(jpegData); - if (rfb.rec != null) { - if (!rfb.recordFromBeginning) { - rfb.recordCompactLen(jpegData.length); - } - rfb.rec.write(jpegData); - } - - // Create an Image object from the JPEG data. - Image jpegImage = Toolkit.getDefaultToolkit().createImage(jpegData); - - // Remember the rectangle where the image should be drawn. - jpegRect = new Rectangle(x, y, w, h); - - // Let the imageUpdate() method do the actual drawing, here just - // wait until the image is fully loaded and drawn. - synchronized(jpegRect) { - Toolkit.getDefaultToolkit().prepareImage(jpegImage, -1, -1, this); - try { - // Wait no longer than three seconds. - jpegRect.wait(3000); - } catch (InterruptedException e) { - throw new Exception("Interrupted while decoding JPEG image"); - } - } - - // Done, jpegRect is not needed any more. - jpegRect = null; - return; - } - - // Read filter id and parameters. - int numColors = 0, rowSize = w; - byte[] palette8 = new byte[2]; - int[] palette24 = new int[256]; - boolean useGradient = false; - if ((comp_ctl & rfb.TightExplicitFilter) != 0) { - int filter_id = rfb.is.readUnsignedByte(); - if (rfb.rec != null) { - rfb.rec.writeByte(filter_id); - } - if (filter_id == rfb.TightFilterPalette) { - numColors = rfb.is.readUnsignedByte() + 1; - if (rfb.rec != null) { - rfb.rec.writeByte(numColors - 1); - } - if (bytesPixel == 1) { - if (numColors != 2) { - throw new Exception("Incorrect tight palette size: " + numColors); - } - rfb.readFully(palette8); - if (rfb.rec != null) { - rfb.rec.write(palette8); - } - } else { - byte[] buf = new byte[numColors * 3]; - rfb.readFully(buf); - if (rfb.rec != null) { - rfb.rec.write(buf); - } - for (int i = 0; i < numColors; i++) { - palette24[i] = ((buf[i * 3] & 0xFF) << 16 | - (buf[i * 3 + 1] & 0xFF) << 8 | - (buf[i * 3 + 2] & 0xFF)); - } - } - if (numColors == 2) - rowSize = (w + 7) / 8; - } else if (filter_id == rfb.TightFilterGradient) { - useGradient = true; - } else if (filter_id != rfb.TightFilterCopy) { - throw new Exception("Incorrect tight filter id: " + filter_id); - } - } - if (numColors == 0 && bytesPixel == 4) - rowSize *= 3; - - // Read, optionally uncompress and decode data. - int dataSize = h * rowSize; - if (dataSize < rfb.TightMinToCompress) { - // Data size is small - not compressed with zlib. - if (numColors != 0) { - // Indexed colors. - byte[] indexedData = new byte[dataSize]; - rfb.readFully(indexedData); - if (rfb.rec != null) { - rfb.rec.write(indexedData); - } - if (numColors == 2) { - // Two colors. - if (bytesPixel == 1) { - decodeMonoData(x, y, w, h, indexedData, palette8); - } else { - decodeMonoData(x, y, w, h, indexedData, palette24); - } - } else { - // 3..255 colors (assuming bytesPixel == 4). - int i = 0; - for (int dy = y; dy < y + h; dy++) { - for (int dx = x; dx < x + w; dx++) { - pixels24[dy * rfb.framebufferWidth + dx] = - palette24[indexedData[i++] & 0xFF]; - } - } - } - } else if (useGradient) { - // "Gradient"-processed data - byte[] buf = new byte[w * h * 3]; - rfb.readFully(buf); - if (rfb.rec != null) { - rfb.rec.write(buf); - } - decodeGradientData(x, y, w, h, buf); - } else { - // Raw truecolor data. - if (bytesPixel == 1) { - for (int dy = y; dy < y + h; dy++) { - rfb.readFully(pixels8, dy * rfb.framebufferWidth + x, w); - if (rfb.rec != null) { - rfb.rec.write(pixels8, dy * rfb.framebufferWidth + x, w); - } - } - } else { - byte[] buf = new byte[w * 3]; - int i, offset; - for (int dy = y; dy < y + h; dy++) { - rfb.readFully(buf); - if (rfb.rec != null) { - rfb.rec.write(buf); - } - offset = dy * rfb.framebufferWidth + x; - for (i = 0; i < w; i++) { - pixels24[offset + i] = - (buf[i * 3] & 0xFF) << 16 | - (buf[i * 3 + 1] & 0xFF) << 8 | - (buf[i * 3 + 2] & 0xFF); - } - } - } - } - } else { - // Data was compressed with zlib. - int zlibDataLen = rfb.readCompactLen(); - byte[] zlibData = new byte[zlibDataLen]; - rfb.readFully(zlibData); - if (rfb.rec != null && rfb.recordFromBeginning) { - rfb.rec.write(zlibData); - } - int stream_id = comp_ctl & 0x03; - if (tightInflaters[stream_id] == null) { - tightInflaters[stream_id] = new Inflater(); - } - Inflater myInflater = tightInflaters[stream_id]; - myInflater.setInput(zlibData); - byte[] buf = new byte[dataSize]; - myInflater.inflate(buf); - if (rfb.rec != null && !rfb.recordFromBeginning) { - rfb.recordCompressedData(buf); - } - - if (numColors != 0) { - // Indexed colors. - if (numColors == 2) { - // Two colors. - if (bytesPixel == 1) { - decodeMonoData(x, y, w, h, buf, palette8); - } else { - decodeMonoData(x, y, w, h, buf, palette24); - } - } else { - // More than two colors (assuming bytesPixel == 4). - int i = 0; - for (int dy = y; dy < y + h; dy++) { - for (int dx = x; dx < x + w; dx++) { - pixels24[dy * rfb.framebufferWidth + dx] = - palette24[buf[i++] & 0xFF]; - } - } - } - } else if (useGradient) { - // Compressed "Gradient"-filtered data (assuming bytesPixel == 4). - decodeGradientData(x, y, w, h, buf); - } else { - // Compressed truecolor data. - if (bytesPixel == 1) { - int destOffset = y * rfb.framebufferWidth + x; - for (int dy = 0; dy < h; dy++) { - System.arraycopy(buf, dy * w, pixels8, destOffset, w); - destOffset += rfb.framebufferWidth; - } - } else { - int srcOffset = 0; - int destOffset, i; - for (int dy = 0; dy < h; dy++) { - myInflater.inflate(buf); - destOffset = (y + dy) * rfb.framebufferWidth + x; - for (i = 0; i < w; i++) { - pixels24[destOffset + i] = - (buf[srcOffset] & 0xFF) << 16 | - (buf[srcOffset + 1] & 0xFF) << 8 | - (buf[srcOffset + 2] & 0xFF); - srcOffset += 3; - } - } - } - } - } - - handleUpdatedPixels(x, y, w, h); - scheduleRepaint(x, y, w, h); - } - - // - // Decode 1bpp-encoded bi-color rectangle (8-bit and 24-bit versions). - // - - void decodeMonoData(int x, int y, int w, int h, byte[] src, byte[] palette) { - - int dx, dy, n; - int i = y * rfb.framebufferWidth + x; - int rowBytes = (w + 7) / 8; - byte b; - - for (dy = 0; dy < h; dy++) { - for (dx = 0; dx < w / 8; dx++) { - b = src[dy*rowBytes+dx]; - for (n = 7; n >= 0; n--) - pixels8[i++] = palette[b >> n & 1]; - } - for (n = 7; n >= 8 - w % 8; n--) { - pixels8[i++] = palette[src[dy*rowBytes+dx] >> n & 1]; - } - i += (rfb.framebufferWidth - w); - } - } - - void decodeMonoData(int x, int y, int w, int h, byte[] src, int[] palette) { - - int dx, dy, n; - int i = y * rfb.framebufferWidth + x; - int rowBytes = (w + 7) / 8; - byte b; - - for (dy = 0; dy < h; dy++) { - for (dx = 0; dx < w / 8; dx++) { - b = src[dy*rowBytes+dx]; - for (n = 7; n >= 0; n--) - pixels24[i++] = palette[b >> n & 1]; - } - for (n = 7; n >= 8 - w % 8; n--) { - pixels24[i++] = palette[src[dy*rowBytes+dx] >> n & 1]; - } - i += (rfb.framebufferWidth - w); - } - } - - // - // Decode data processed with the "Gradient" filter. - // - - void decodeGradientData (int x, int y, int w, int h, byte[] buf) { - - int dx, dy, c; - byte[] prevRow = new byte[w * 3]; - byte[] thisRow = new byte[w * 3]; - byte[] pix = new byte[3]; - int[] est = new int[3]; - - int offset = y * rfb.framebufferWidth + x; - - for (dy = 0; dy < h; dy++) { - - /* First pixel in a row */ - for (c = 0; c < 3; c++) { - pix[c] = (byte)(prevRow[c] + buf[dy * w * 3 + c]); - thisRow[c] = pix[c]; - } - pixels24[offset++] = - (pix[0] & 0xFF) << 16 | (pix[1] & 0xFF) << 8 | (pix[2] & 0xFF); - - /* Remaining pixels of a row */ - for (dx = 1; dx < w; dx++) { - for (c = 0; c < 3; c++) { - est[c] = ((prevRow[dx * 3 + c] & 0xFF) + (pix[c] & 0xFF) - - (prevRow[(dx-1) * 3 + c] & 0xFF)); - if (est[c] > 0xFF) { - est[c] = 0xFF; - } else if (est[c] < 0x00) { - est[c] = 0x00; - } - pix[c] = (byte)(est[c] + buf[(dy * w + dx) * 3 + c]); - thisRow[dx * 3 + c] = pix[c]; - } - pixels24[offset++] = - (pix[0] & 0xFF) << 16 | (pix[1] & 0xFF) << 8 | (pix[2] & 0xFF); - } - - System.arraycopy(thisRow, 0, prevRow, 0, w * 3); - offset += (rfb.framebufferWidth - w); - } - } - - // - // Display newly updated area of pixels. - // - - void handleUpdatedPixels(int x, int y, int w, int h) { - - pixelsSource.newPixels(x, y, w, h); - memGraphics.setClip(x, y, w, h); - memGraphics.drawImage(rawPixelsImage, 0, 0, null); - memGraphics.setClip(0, 0, rfb.framebufferWidth, rfb.framebufferHeight); - } - - // - // Tell JVM to repaint specified desktop area. - // - - void scheduleRepaint(int x, int y, int w, int h) { - if (rfb.framebufferWidth == scaledWidth) { - repaint(viewer.getDeferScreenUpdateTimeout(), x, y, w, h); - } else { - int sx = x * scalingFactor / 100; - int sy = y * scalingFactor / 100; - int sw = ((x + w) * scalingFactor + 49) / 100 - sx + 1; - int sh = ((y + h) * scalingFactor + 49) / 100 - sy + 1; - repaint(viewer.getDeferScreenUpdateTimeout(), sx, sy, sw, sh); - } - } - - // - // Handle events. - // - - public void keyPressed(KeyEvent evt) { - if (rfb != null) - processLocalKeyEvent(evt); - } - public void keyReleased(KeyEvent evt) { - if (rfb != null) - processLocalKeyEvent(evt); - } - public void keyTyped(KeyEvent evt) { - if (rfb != null) - evt.consume(); - } - - public void mousePressed(MouseEvent evt) { - if (rfb != null) - processLocalMouseEvent(evt, false); - } - public void mouseReleased(MouseEvent evt) { - if (rfb != null) - processLocalMouseEvent(evt, false); - } - public void mouseMoved(MouseEvent evt) { - if (rfb != null) - processLocalMouseEvent(evt, true); - } - public void mouseDragged(MouseEvent evt) { - if (rfb != null) - processLocalMouseEvent(evt, true); - } - - public void sendCtrlAltDel() { - KeyEvent evt = new KeyEvent(this, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), - InputEvent.CTRL_MASK | InputEvent.ALT_MASK, 127); - - boolean bCloseRfb = false; - synchronized (rfb) { - try { - rfb.writeKeyEvent(evt); - } catch (IOException e) { - // Just close the underlying stream so the main loop will error out. - bCloseRfb = true; - } - rfb.notify(); - } - - if(bCloseRfb) { - synchronized (viewer) { - if (rfb != null) - rfb.close(); - } - } - } - - public void processLocalKeyEvent(KeyEvent evt) { - if (/*viewer.rfb != null*/ viewer.getRfb() != null && rfb.inNormalProtocol) { - if (!inputEnabled) { - if ((evt.getKeyChar() == 'r' || evt.getKeyChar() == 'R') - && evt.getID() == KeyEvent.KEY_PRESSED) { - // Request screen update. - try { - rfb.writeFramebufferUpdateRequest(0, 0, - rfb.framebufferWidth, rfb.framebufferHeight, - false); - } catch (IOException e) { - e.printStackTrace(); - } - } - } else { - // Input enabled. - boolean bCloseRfb = false; - synchronized (rfb) { - try { - // Convert Ctrl-Alt-Ins to Ctrl-Alt-Del - if (evt.getKeyCode() == 155 - && evt.getModifiers() == (InputEvent.CTRL_MASK | InputEvent.ALT_MASK)) { - evt.setKeyCode(127); - } - rfb.writeKeyEvent(evt); - } catch (IOException e) { - // Just close the underlying stream so the main loop will error out. - bCloseRfb = true; - } - rfb.notify(); - } - - if(bCloseRfb) { - synchronized (viewer) { - if (rfb != null) - rfb.close(); - } - } - } - } - // Don't ever pass keyboard events to AWT for default processing. - // Otherwise, pressing Tab would switch focus to ButtonPanel etc. - evt.consume(); - } - - public void processLocalMouseEvent(MouseEvent evt, boolean moved) { - if (/*viewer.rfb != null*/ viewer.getRfb() != null && rfb.inNormalProtocol) { - if (moved) { - softCursorMove(evt.getX(), evt.getY()); - } - if (rfb.framebufferWidth != scaledWidth) { - int sx = (evt.getX() * 100 + scalingFactor/2) / scalingFactor; - int sy = (evt.getY() * 100 + scalingFactor/2) / scalingFactor; - evt.translatePoint(sx - evt.getX(), sy - evt.getY()); - } - - boolean bCloseRfb = false; - synchronized(rfb) { - try { - rfb.writePointerEvent(evt); - } catch (Exception e) { - bCloseRfb = true; - } - rfb.notify(); - } - - if(bCloseRfb) { - synchronized (viewer) { - if (rfb != null) - rfb.close(); - } - } - } - } - - // - // Ignored events. - // - - public void mouseClicked(MouseEvent evt) {} - public void mouseEntered(MouseEvent evt) {} - public void mouseExited(MouseEvent evt) {} - - - ////////////////////////////////////////////////////////////////// - // - // Handle cursor shape updates (XCursor and RichCursor encodings). - // - - boolean showSoftCursor = false; - - MemoryImageSource softCursorSource; - Image softCursor; - - int cursorX = 0, cursorY = 0; - int cursorWidth, cursorHeight; - int origCursorWidth, origCursorHeight; - int hotX, hotY; - int origHotX, origHotY; - - // - // Handle cursor shape update (XCursor and RichCursor encodings). - // - - static int getCursorDataSize(int encodingType, int width, int height) - { - if(width * height == 0) - return 0; - - int bytesPerRow = (width + 7) / 8; - int bytesMaskData = bytesPerRow * height; - - if (encodingType == RfbProto.EncodingXCursor) { - return 6 + bytesMaskData * 2; - } else { - return width * height + bytesMaskData; - } - } - - synchronized void handleCursorShapeUpdate(int encodingType, - int xhot, int yhot, int width, int height, byte[] captureBuffer) - throws IOException { - - softCursorFree(); - - if (width * height == 0) - return; - - // Ignore cursor shape data if requested by user. - if (/*viewer.options.ignoreCursorUpdates*/ viewer.ignoreCursorUpdate()) { - int bytesPerRow = (width + 7) / 8; - int bytesMaskData = bytesPerRow * height; - - if (encodingType == rfb.EncodingXCursor) { - // rfb.is.skipBytes(6 + bytesMaskData * 2); - - rfb.is.readFully(captureBuffer); - - } else { - // rfb.EncodingRichCursor - // rfb.is.skipBytes(width * height + bytesMaskData); - - rfb.is.readFully(captureBuffer); - } - return; - } - - // Decode cursor pixel data. - softCursorSource = decodeCursorShape(encodingType, width, height, captureBuffer); - - // Set original (non-scaled) cursor dimensions. - origCursorWidth = width; - origCursorHeight = height; - origHotX = xhot; - origHotY = yhot; - - // Create off-screen cursor image. - createSoftCursor(); - - // Show the cursor. - showSoftCursor = true; - repaint(viewer.getDeferCursorUpdateTimeout(), - cursorX - hotX, cursorY - hotY, cursorWidth, cursorHeight); - } - - // - // decodeCursorShape(). Decode cursor pixel data and return - // corresponding MemoryImageSource instance. - // - - synchronized MemoryImageSource decodeCursorShape(int encodingType, int width, int height, byte[] captureBuffer) - throws IOException { - - ByteArrayOutputStream bos = new ByteArrayOutputStream(captureBuffer.length); - - int bytesPerRow = (width + 7) / 8; - int bytesMaskData = bytesPerRow * height; - - int[] softCursorPixels = new int[width * height]; - - if (encodingType == rfb.EncodingXCursor) { - - // Read foreground and background colors of the cursor. - byte[] rgb = new byte[6]; - rfb.readFully(rgb); - bos.write(rgb); - int[] colors = { (0xFF000000 | (rgb[3] & 0xFF) << 16 | - (rgb[4] & 0xFF) << 8 | (rgb[5] & 0xFF)), - (0xFF000000 | (rgb[0] & 0xFF) << 16 | - (rgb[1] & 0xFF) << 8 | (rgb[2] & 0xFF)) }; - - // Read pixel and mask data. - byte[] pixBuf = new byte[bytesMaskData]; - rfb.readFully(pixBuf); - bos.write(pixBuf); - - byte[] maskBuf = new byte[bytesMaskData]; - rfb.readFully(maskBuf); - bos.write(maskBuf); - - // Decode pixel data into softCursorPixels[]. - byte pixByte, maskByte; - int x, y, n, result; - int i = 0; - for (y = 0; y < height; y++) { - for (x = 0; x < width / 8; x++) { - pixByte = pixBuf[y * bytesPerRow + x]; - maskByte = maskBuf[y * bytesPerRow + x]; - for (n = 7; n >= 0; n--) { - if ((maskByte >> n & 1) != 0) { - result = colors[pixByte >> n & 1]; - } else { - result = 0; // Transparent pixel - } - softCursorPixels[i++] = result; - } - } - for (n = 7; n >= 8 - width % 8; n--) { - if ((maskBuf[y * bytesPerRow + x] >> n & 1) != 0) { - result = colors[pixBuf[y * bytesPerRow + x] >> n & 1]; - } else { - result = 0; // Transparent pixel - } - softCursorPixels[i++] = result; - } - } - } else { - // encodingType == rfb.EncodingRichCursor - - // Read pixel and mask data. - byte[] pixBuf = new byte[width * height * bytesPixel]; - rfb.readFully(pixBuf); - bos.write(pixBuf); - - byte[] maskBuf = new byte[bytesMaskData]; - rfb.readFully(maskBuf); - bos.write(maskBuf); - - // Decode pixel data into softCursorPixels[]. - byte pixByte, maskByte; - int x, y, n, result; - int i = 0; - for (y = 0; y < height; y++) { - for (x = 0; x < width / 8; x++) { - maskByte = maskBuf[y * bytesPerRow + x]; - for (n = 7; n >= 0; n--) { - if ((maskByte >> n & 1) != 0) { - if (bytesPixel == 1) { - result = cm8.getRGB(pixBuf[i]); - } else { - result = 0xFF000000 | - (pixBuf[i * 4 + 2] & 0xFF) << 16 | - (pixBuf[i * 4 + 1] & 0xFF) << 8 | - (pixBuf[i * 4] & 0xFF); - } - } else { - result = 0; // Transparent pixel - } - softCursorPixels[i++] = result; - } - } - for (n = 7; n >= 8 - width % 8; n--) { - if ((maskBuf[y * bytesPerRow + x] >> n & 1) != 0) { - if (bytesPixel == 1) { - result = cm8.getRGB(pixBuf[i]); - } else { - result = 0xFF000000 | - (pixBuf[i * 4 + 2] & 0xFF) << 16 | - (pixBuf[i * 4 + 1] & 0xFF) << 8 | - (pixBuf[i * 4] & 0xFF); - } - } else { - result = 0; // Transparent pixel - } - softCursorPixels[i++] = result; - } - } - } - - System.arraycopy(bos.toByteArray(), 0, captureBuffer, 0, captureBuffer.length); - return new MemoryImageSource(width, height, softCursorPixels, 0, width); - } - - // - // createSoftCursor(). Assign softCursor new Image (scaled if necessary). - // Uses softCursorSource as a source for new cursor image. - // - - synchronized void createSoftCursor() { - - if (softCursorSource == null) - return; - -/* - int scaleCursor = viewer.options.scaleCursor; -*/ - int scaleCursor = viewer.getCursorScaleFactor(); - if (scaleCursor == 0 || !inputEnabled) - scaleCursor = 100; - - // Save original cursor coordinates. - int x = cursorX - hotX; - int y = cursorY - hotY; - int w = cursorWidth; - int h = cursorHeight; - - cursorWidth = (origCursorWidth * scaleCursor + 50) / 100; - cursorHeight = (origCursorHeight * scaleCursor + 50) / 100; - hotX = (origHotX * scaleCursor + 50) / 100; - hotY = (origHotY * scaleCursor + 50) / 100; - softCursor = Toolkit.getDefaultToolkit().createImage(softCursorSource); - - if (scaleCursor != 100) { - softCursor = softCursor.getScaledInstance(cursorWidth, cursorHeight, - Image.SCALE_SMOOTH); - } - - if (showSoftCursor) { - // Compute screen area to update. - x = Math.min(x, cursorX - hotX); - y = Math.min(y, cursorY - hotY); - w = Math.max(w, cursorWidth); - h = Math.max(h, cursorHeight); - - /* - repaint(viewer.deferCursorUpdates, x, y, w, h); - */ - repaint(viewer.getDeferCursorUpdateTimeout(), x, y, w, h); - } - } - - // - // softCursorMove(). Moves soft cursor into a particular location. - // - - synchronized void softCursorMove(int x, int y) { - int oldX = cursorX; - int oldY = cursorY; - cursorX = x; - cursorY = y; - if (showSoftCursor) { - repaint(viewer.getDeferCursorUpdateTimeout(), - oldX - hotX, oldY - hotY, cursorWidth, cursorHeight); - repaint(viewer.getDeferCursorUpdateTimeout(), - cursorX - hotX, cursorY - hotY, cursorWidth, cursorHeight); - - } - } - - // - // softCursorFree(). Remove soft cursor, dispose resources. - // - public synchronized void softCursorFree() { - if (showSoftCursor) { - showSoftCursor = false; - softCursor = null; - softCursorSource = null; - - repaint(viewer.getDeferCursorUpdateTimeout(), - cursorX - hotX, cursorY - hotY, cursorWidth, cursorHeight); - } - } - - public void paintErrorString(String msg) { - if(memGraphics != null) { - memGraphics.setColor(Color.BLACK); - memGraphics.fillRect(0,0,memImage.getWidth(null),memImage.getHeight(null)); - memGraphics.setColor(Color.WHITE); - memGraphics.setFont(new Font(null, Font.PLAIN, 20)); - FontMetrics fm = memGraphics.getFontMetrics(); - int width = fm.stringWidth(msg); - int startx = (memImage.getWidth(null) - width) / 2; - if (startx < 0) startx = 0; - memGraphics.drawString(msg, startx, memImage.getHeight(null) / 2); - scheduleRepaint(0,0,memImage.getWidth(null),memImage.getHeight(null)); - } - } - - public void encodeFramebufferResize(int w, int h, OutputStream os) throws IOException { - DataOutputStream dos; - if(os instanceof DataOutputStream) - dos = (DataOutputStream)os; - else - dos = new DataOutputStream(os); - - dos.writeByte(RfbProto.FramebufferUpdate); - dos.writeByte(0); // padding - dos.writeShort(1); - dos.writeShort(0); - dos.writeShort(0); - dos.writeShort(w); - dos.writeShort(h); - dos.writeInt(RfbProto.EncodingNewFBSize); - } - - public void encodeCursorMove(int x, int y, OutputStream os) throws IOException { - DataOutputStream dos; - if(os instanceof DataOutputStream) - dos = (DataOutputStream)os; - else - dos = new DataOutputStream(os); - - dos.writeShort(x); - dos.writeShort(y); - dos.writeShort(0); - dos.writeShort(0); - dos.writeInt(RfbProto.EncodingPointerPos); - } - - public void encodeCursorShapeUpdate(int encodingType, - int xhot, int yhot, int width, int height, byte[] cursorData, OutputStream os) throws IOException { - - DataOutputStream dos; - if(os instanceof DataOutputStream) - dos = (DataOutputStream)os; - else - dos = new DataOutputStream(os); - - dos.writeShort(xhot); - dos.writeShort(yhot); - dos.writeShort(width); - dos.writeShort(height); - dos.writeInt(encodingType); - os.write(cursorData); - } - - public void encodeRawRectFrameUpdate(int x, int y, int w, int h, OutputStream os) throws IOException { - - DataOutputStream dos; - if(os instanceof DataOutputStream) - dos = (DataOutputStream)os; - else - dos = new DataOutputStream(os); - - PixelGrabber grabber = - new PixelGrabber(memImage, 0, 0, -1, -1, false); - - try { - if(grabber.grabPixels()) { - dos.writeShort(x); - dos.writeShort(y); - dos.writeShort(w); - dos.writeShort(h); - dos.writeInt(RfbProto.EncodingRaw); - - if (bytesPixel == 1) { - byte[] data = (byte[])grabber.getPixels(); - for (int dy = y; dy < y + h; dy++) { - os.write(data, dy * rfb.framebufferWidth + x, w); - } - } else { - int[] data = (int[])grabber.getPixels(); - - int i, offset; - for (int dy = y; dy < y + h; dy++) { - offset = dy * rfb.framebufferWidth + x; - for (i = 0; i < w; i++) { - int pixel = data[offset + i]; - dos.write(pixel & 0xFF); - dos.write((pixel >> 8)& 0xFF); - dos.write((pixel >> 16)& 0xFF); - dos.write((pixel >> 24)& 0xFF); - } - } - } - } - } catch (InterruptedException e) { - s_logger.warn("Exception whiel grabbering pixel data from memImage"); - } - } -} - diff --git a/console/src/com/cloud/console/ConsoleCanvas2.java b/console/src/com/cloud/console/ConsoleCanvas2.java deleted file mode 100644 index 5ed2659636f..00000000000 --- a/console/src/com/cloud/console/ConsoleCanvas2.java +++ /dev/null @@ -1,63 +0,0 @@ -// -// Copyright (C) 2006 Constantin Kaplinsky. All Rights Reserved. -// -// This is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this software; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. -// - -package com.cloud.console; - -import java.awt.*; -import java.io.*; - -// -// VncCanvas2 is a special version of VncCanvas which may use Java 2 API. -// -@SuppressWarnings("serial") -public class ConsoleCanvas2 extends ConsoleCanvas { - - public ConsoleCanvas2(RfbViewer v) throws IOException { - super(v); - disableFocusTraversalKeys(); - } - - public ConsoleCanvas2(RfbViewer v, int maxWidth_, int maxHeight_) - { - super(v, maxWidth_, maxHeight_); - disableFocusTraversalKeys(); - } - - public void paintScaledFrameBuffer(Graphics g) { - Graphics2D g2d = (Graphics2D)g; - g2d.setRenderingHint(RenderingHints.KEY_RENDERING, - RenderingHints.VALUE_RENDER_QUALITY); - g2d.drawImage(memImage, 0, 0, scaledWidth, scaledHeight, null); - } - - // - // Try to disable focus traversal keys (JVMs 1.4 and higher). - // - - private void disableFocusTraversalKeys() { - try { - Class[] argClasses = { Boolean.TYPE }; - java.lang.reflect.Method method = - getClass().getMethod("setFocusTraversalKeysEnabled", argClasses); - Object[] argObjects = { new Boolean(false) }; - method.invoke(this, argObjects); - } catch (Exception e) {} - } -} - diff --git a/console/src/com/cloud/console/DesCipher.java b/console/src/com/cloud/console/DesCipher.java deleted file mode 100644 index 8f7a8c0a7a2..00000000000 --- a/console/src/com/cloud/console/DesCipher.java +++ /dev/null @@ -1,496 +0,0 @@ -// -// This DES class has been extracted from package Acme.Crypto for use in VNC. -// The bytebit[] array has been reversed so that the most significant bit -// in each byte of the key is ignored, not the least significant. Also the -// unnecessary odd parity code has been removed. -// -// These changes are: -// Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -// - -// DesCipher - the DES encryption method -// -// The meat of this code is by Dave Zimmerman , and is: -// -// Copyright (c) 1996 Widget Workshop, Inc. All Rights Reserved. -// -// Permission to use, copy, modify, and distribute this software -// and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and -// without fee is hereby granted, provided that this copyright notice is kept -// intact. -// -// WIDGET WORKSHOP MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY -// OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -// TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -// PARTICULAR PURPOSE, OR NON-INFRINGEMENT. WIDGET WORKSHOP SHALL NOT BE LIABLE -// FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR -// DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. -// -// THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE -// CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE -// PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT -// NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE -// SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE -// SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE -// PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). WIDGET WORKSHOP -// SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR -// HIGH RISK ACTIVITIES. -// -// -// The rest is: -// -// Copyright (C) 1996 by Jef Poskanzer . All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -// SUCH DAMAGE. -// -// Visit the ACME Labs Java page for up-to-date versions of this and other -// fine Java utilities: http://www.acme.com/java/ - -// repackage it to VMOps common packaging structure -package com.cloud.console; - -/// The DES encryption method. -//

-// This is surprisingly fast, for pure Java. On a SPARC 20, wrapped -// in Acme.Crypto.EncryptedOutputStream or Acme.Crypto.EncryptedInputStream, -// it does around 7000 bytes/second. -//

-// Most of this code is by Dave Zimmerman , and is -// Copyright (c) 1996 Widget Workshop, Inc. See the source file for details. -//

-// Fetch the software.
-// Fetch the entire Acme package. -//

-// @see Des3Cipher -// @see EncryptedOutputStream -// @see EncryptedInputStream - -public class DesCipher - { - - // Constructor, byte-array key. - public DesCipher( byte[] key ) - { - setKey( key ); - } - - // Key routines. - - private int[] encryptKeys = new int[32]; - private int[] decryptKeys = new int[32]; - - /// Set the key. - public void setKey( byte[] key ) - { - deskey( key, true, encryptKeys ); - deskey( key, false, decryptKeys ); - } - - // Turn an 8-byte key into internal keys. - private void deskey( byte[] keyBlock, boolean encrypting, int[] KnL ) - { - int i, j, l, m, n; - int[] pc1m = new int[56]; - int[] pcr = new int[56]; - int[] kn = new int[32]; - - for ( j = 0; j < 56; ++j ) - { - l = pc1[j]; - m = l & 07; - pc1m[j] = ( (keyBlock[l >>> 3] & bytebit[m]) != 0 )? 1: 0; - } - - for ( i = 0; i < 16; ++i ) - { - if ( encrypting ) - m = i << 1; - else - m = (15-i) << 1; - n = m+1; - kn[m] = kn[n] = 0; - for ( j = 0; j < 28; ++j ) - { - l = j+totrot[i]; - if ( l < 28 ) - pcr[j] = pc1m[l]; - else - pcr[j] = pc1m[l-28]; - } - for ( j=28; j < 56; ++j ) - { - l = j+totrot[i]; - if ( l < 56 ) - pcr[j] = pc1m[l]; - else - pcr[j] = pc1m[l-28]; - } - for ( j = 0; j < 24; ++j ) - { - if ( pcr[pc2[j]] != 0 ) - kn[m] |= bigbyte[j]; - if ( pcr[pc2[j+24]] != 0 ) - kn[n] |= bigbyte[j]; - } - } - cookey( kn, KnL ); - } - - private void cookey( int[] raw, int KnL[] ) - { - int raw0, raw1; - int rawi, KnLi; - int i; - - for ( i = 0, rawi = 0, KnLi = 0; i < 16; ++i ) - { - raw0 = raw[rawi++]; - raw1 = raw[rawi++]; - KnL[KnLi] = (raw0 & 0x00fc0000) << 6; - KnL[KnLi] |= (raw0 & 0x00000fc0) << 10; - KnL[KnLi] |= (raw1 & 0x00fc0000) >>> 10; - KnL[KnLi] |= (raw1 & 0x00000fc0) >>> 6; - ++KnLi; - KnL[KnLi] = (raw0 & 0x0003f000) << 12; - KnL[KnLi] |= (raw0 & 0x0000003f) << 16; - KnL[KnLi] |= (raw1 & 0x0003f000) >>> 4; - KnL[KnLi] |= (raw1 & 0x0000003f); - ++KnLi; - } - } - - - // Block encryption routines. - - private int[] tempInts = new int[2]; - - /// Encrypt a block of eight bytes. - public void encrypt( byte[] clearText, int clearOff, byte[] cipherText, int cipherOff ) - { - squashBytesToInts( clearText, clearOff, tempInts, 0, 2 ); - des( tempInts, tempInts, encryptKeys ); - spreadIntsToBytes( tempInts, 0, cipherText, cipherOff, 2 ); - } - - /// Decrypt a block of eight bytes. - public void decrypt( byte[] cipherText, int cipherOff, byte[] clearText, int clearOff ) - { - squashBytesToInts( cipherText, cipherOff, tempInts, 0, 2 ); - des( tempInts, tempInts, decryptKeys ); - spreadIntsToBytes( tempInts, 0, clearText, clearOff, 2 ); - } - - // The DES function. - private void des( int[] inInts, int[] outInts, int[] keys ) - { - int fval, work, right, leftt; - int round; - int keysi = 0; - - leftt = inInts[0]; - right = inInts[1]; - - work = ((leftt >>> 4) ^ right) & 0x0f0f0f0f; - right ^= work; - leftt ^= (work << 4); - - work = ((leftt >>> 16) ^ right) & 0x0000ffff; - right ^= work; - leftt ^= (work << 16); - - work = ((right >>> 2) ^ leftt) & 0x33333333; - leftt ^= work; - right ^= (work << 2); - - work = ((right >>> 8) ^ leftt) & 0x00ff00ff; - leftt ^= work; - right ^= (work << 8); - right = (right << 1) | ((right >>> 31) & 1); - - work = (leftt ^ right) & 0xaaaaaaaa; - leftt ^= work; - right ^= work; - leftt = (leftt << 1) | ((leftt >>> 31) & 1); - - for ( round = 0; round < 8; ++round ) - { - work = (right << 28) | (right >>> 4); - work ^= keys[keysi++]; - fval = SP7[ work & 0x0000003f ]; - fval |= SP5[(work >>> 8) & 0x0000003f ]; - fval |= SP3[(work >>> 16) & 0x0000003f ]; - fval |= SP1[(work >>> 24) & 0x0000003f ]; - work = right ^ keys[keysi++]; - fval |= SP8[ work & 0x0000003f ]; - fval |= SP6[(work >>> 8) & 0x0000003f ]; - fval |= SP4[(work >>> 16) & 0x0000003f ]; - fval |= SP2[(work >>> 24) & 0x0000003f ]; - leftt ^= fval; - work = (leftt << 28) | (leftt >>> 4); - work ^= keys[keysi++]; - fval = SP7[ work & 0x0000003f ]; - fval |= SP5[(work >>> 8) & 0x0000003f ]; - fval |= SP3[(work >>> 16) & 0x0000003f ]; - fval |= SP1[(work >>> 24) & 0x0000003f ]; - work = leftt ^ keys[keysi++]; - fval |= SP8[ work & 0x0000003f ]; - fval |= SP6[(work >>> 8) & 0x0000003f ]; - fval |= SP4[(work >>> 16) & 0x0000003f ]; - fval |= SP2[(work >>> 24) & 0x0000003f ]; - right ^= fval; - } - - right = (right << 31) | (right >>> 1); - work = (leftt ^ right) & 0xaaaaaaaa; - leftt ^= work; - right ^= work; - leftt = (leftt << 31) | (leftt >>> 1); - work = ((leftt >>> 8) ^ right) & 0x00ff00ff; - right ^= work; - leftt ^= (work << 8); - work = ((leftt >>> 2) ^ right) & 0x33333333; - right ^= work; - leftt ^= (work << 2); - work = ((right >>> 16) ^ leftt) & 0x0000ffff; - leftt ^= work; - right ^= (work << 16); - work = ((right >>> 4) ^ leftt) & 0x0f0f0f0f; - leftt ^= work; - right ^= (work << 4); - outInts[0] = right; - outInts[1] = leftt; - } - - - // Tables, permutations, S-boxes, etc. - - private static byte[] bytebit = { - (byte)0x01, (byte)0x02, (byte)0x04, (byte)0x08, - (byte)0x10, (byte)0x20, (byte)0x40, (byte)0x80 - }; - private static int[] bigbyte = { - 0x800000, 0x400000, 0x200000, 0x100000, - 0x080000, 0x040000, 0x020000, 0x010000, - 0x008000, 0x004000, 0x002000, 0x001000, - 0x000800, 0x000400, 0x000200, 0x000100, - 0x000080, 0x000040, 0x000020, 0x000010, - 0x000008, 0x000004, 0x000002, 0x000001 - }; - private static byte[] pc1 = { - (byte)56, (byte)48, (byte)40, (byte)32, (byte)24, (byte)16, (byte) 8, - (byte) 0, (byte)57, (byte)49, (byte)41, (byte)33, (byte)25, (byte)17, - (byte) 9, (byte) 1, (byte)58, (byte)50, (byte)42, (byte)34, (byte)26, - (byte)18, (byte)10, (byte) 2, (byte)59, (byte)51, (byte)43, (byte)35, - (byte)62, (byte)54, (byte)46, (byte)38, (byte)30, (byte)22, (byte)14, - (byte) 6, (byte)61, (byte)53, (byte)45, (byte)37, (byte)29, (byte)21, - (byte)13, (byte) 5, (byte)60, (byte)52, (byte)44, (byte)36, (byte)28, - (byte)20, (byte)12, (byte) 4, (byte)27, (byte)19, (byte)11, (byte)3 - }; - private static int[] totrot = { - 1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28 - }; - - private static byte[] pc2 = { - (byte)13, (byte)16, (byte)10, (byte)23, (byte) 0, (byte) 4, - (byte) 2, (byte)27, (byte)14, (byte) 5, (byte)20, (byte) 9, - (byte)22, (byte)18, (byte)11, (byte)3 , (byte)25, (byte) 7, - (byte)15, (byte) 6, (byte)26, (byte)19, (byte)12, (byte) 1, - (byte)40, (byte)51, (byte)30, (byte)36, (byte)46, (byte)54, - (byte)29, (byte)39, (byte)50, (byte)44, (byte)32, (byte)47, - (byte)43, (byte)48, (byte)38, (byte)55, (byte)33, (byte)52, - (byte)45, (byte)41, (byte)49, (byte)35, (byte)28, (byte)31, - }; - - private static int[] SP1 = { - 0x01010400, 0x00000000, 0x00010000, 0x01010404, - 0x01010004, 0x00010404, 0x00000004, 0x00010000, - 0x00000400, 0x01010400, 0x01010404, 0x00000400, - 0x01000404, 0x01010004, 0x01000000, 0x00000004, - 0x00000404, 0x01000400, 0x01000400, 0x00010400, - 0x00010400, 0x01010000, 0x01010000, 0x01000404, - 0x00010004, 0x01000004, 0x01000004, 0x00010004, - 0x00000000, 0x00000404, 0x00010404, 0x01000000, - 0x00010000, 0x01010404, 0x00000004, 0x01010000, - 0x01010400, 0x01000000, 0x01000000, 0x00000400, - 0x01010004, 0x00010000, 0x00010400, 0x01000004, - 0x00000400, 0x00000004, 0x01000404, 0x00010404, - 0x01010404, 0x00010004, 0x01010000, 0x01000404, - 0x01000004, 0x00000404, 0x00010404, 0x01010400, - 0x00000404, 0x01000400, 0x01000400, 0x00000000, - 0x00010004, 0x00010400, 0x00000000, 0x01010004 - }; - private static int[] SP2 = { - 0x80108020, 0x80008000, 0x00008000, 0x00108020, - 0x00100000, 0x00000020, 0x80100020, 0x80008020, - 0x80000020, 0x80108020, 0x80108000, 0x80000000, - 0x80008000, 0x00100000, 0x00000020, 0x80100020, - 0x00108000, 0x00100020, 0x80008020, 0x00000000, - 0x80000000, 0x00008000, 0x00108020, 0x80100000, - 0x00100020, 0x80000020, 0x00000000, 0x00108000, - 0x00008020, 0x80108000, 0x80100000, 0x00008020, - 0x00000000, 0x00108020, 0x80100020, 0x00100000, - 0x80008020, 0x80100000, 0x80108000, 0x00008000, - 0x80100000, 0x80008000, 0x00000020, 0x80108020, - 0x00108020, 0x00000020, 0x00008000, 0x80000000, - 0x00008020, 0x80108000, 0x00100000, 0x80000020, - 0x00100020, 0x80008020, 0x80000020, 0x00100020, - 0x00108000, 0x00000000, 0x80008000, 0x00008020, - 0x80000000, 0x80100020, 0x80108020, 0x00108000 - }; - private static int[] SP3 = { - 0x00000208, 0x08020200, 0x00000000, 0x08020008, - 0x08000200, 0x00000000, 0x00020208, 0x08000200, - 0x00020008, 0x08000008, 0x08000008, 0x00020000, - 0x08020208, 0x00020008, 0x08020000, 0x00000208, - 0x08000000, 0x00000008, 0x08020200, 0x00000200, - 0x00020200, 0x08020000, 0x08020008, 0x00020208, - 0x08000208, 0x00020200, 0x00020000, 0x08000208, - 0x00000008, 0x08020208, 0x00000200, 0x08000000, - 0x08020200, 0x08000000, 0x00020008, 0x00000208, - 0x00020000, 0x08020200, 0x08000200, 0x00000000, - 0x00000200, 0x00020008, 0x08020208, 0x08000200, - 0x08000008, 0x00000200, 0x00000000, 0x08020008, - 0x08000208, 0x00020000, 0x08000000, 0x08020208, - 0x00000008, 0x00020208, 0x00020200, 0x08000008, - 0x08020000, 0x08000208, 0x00000208, 0x08020000, - 0x00020208, 0x00000008, 0x08020008, 0x00020200 - }; - private static int[] SP4 = { - 0x00802001, 0x00002081, 0x00002081, 0x00000080, - 0x00802080, 0x00800081, 0x00800001, 0x00002001, - 0x00000000, 0x00802000, 0x00802000, 0x00802081, - 0x00000081, 0x00000000, 0x00800080, 0x00800001, - 0x00000001, 0x00002000, 0x00800000, 0x00802001, - 0x00000080, 0x00800000, 0x00002001, 0x00002080, - 0x00800081, 0x00000001, 0x00002080, 0x00800080, - 0x00002000, 0x00802080, 0x00802081, 0x00000081, - 0x00800080, 0x00800001, 0x00802000, 0x00802081, - 0x00000081, 0x00000000, 0x00000000, 0x00802000, - 0x00002080, 0x00800080, 0x00800081, 0x00000001, - 0x00802001, 0x00002081, 0x00002081, 0x00000080, - 0x00802081, 0x00000081, 0x00000001, 0x00002000, - 0x00800001, 0x00002001, 0x00802080, 0x00800081, - 0x00002001, 0x00002080, 0x00800000, 0x00802001, - 0x00000080, 0x00800000, 0x00002000, 0x00802080 - }; - private static int[] SP5 = { - 0x00000100, 0x02080100, 0x02080000, 0x42000100, - 0x00080000, 0x00000100, 0x40000000, 0x02080000, - 0x40080100, 0x00080000, 0x02000100, 0x40080100, - 0x42000100, 0x42080000, 0x00080100, 0x40000000, - 0x02000000, 0x40080000, 0x40080000, 0x00000000, - 0x40000100, 0x42080100, 0x42080100, 0x02000100, - 0x42080000, 0x40000100, 0x00000000, 0x42000000, - 0x02080100, 0x02000000, 0x42000000, 0x00080100, - 0x00080000, 0x42000100, 0x00000100, 0x02000000, - 0x40000000, 0x02080000, 0x42000100, 0x40080100, - 0x02000100, 0x40000000, 0x42080000, 0x02080100, - 0x40080100, 0x00000100, 0x02000000, 0x42080000, - 0x42080100, 0x00080100, 0x42000000, 0x42080100, - 0x02080000, 0x00000000, 0x40080000, 0x42000000, - 0x00080100, 0x02000100, 0x40000100, 0x00080000, - 0x00000000, 0x40080000, 0x02080100, 0x40000100 - }; - private static int[] SP6 = { - 0x20000010, 0x20400000, 0x00004000, 0x20404010, - 0x20400000, 0x00000010, 0x20404010, 0x00400000, - 0x20004000, 0x00404010, 0x00400000, 0x20000010, - 0x00400010, 0x20004000, 0x20000000, 0x00004010, - 0x00000000, 0x00400010, 0x20004010, 0x00004000, - 0x00404000, 0x20004010, 0x00000010, 0x20400010, - 0x20400010, 0x00000000, 0x00404010, 0x20404000, - 0x00004010, 0x00404000, 0x20404000, 0x20000000, - 0x20004000, 0x00000010, 0x20400010, 0x00404000, - 0x20404010, 0x00400000, 0x00004010, 0x20000010, - 0x00400000, 0x20004000, 0x20000000, 0x00004010, - 0x20000010, 0x20404010, 0x00404000, 0x20400000, - 0x00404010, 0x20404000, 0x00000000, 0x20400010, - 0x00000010, 0x00004000, 0x20400000, 0x00404010, - 0x00004000, 0x00400010, 0x20004010, 0x00000000, - 0x20404000, 0x20000000, 0x00400010, 0x20004010 - }; - private static int[] SP7 = { - 0x00200000, 0x04200002, 0x04000802, 0x00000000, - 0x00000800, 0x04000802, 0x00200802, 0x04200800, - 0x04200802, 0x00200000, 0x00000000, 0x04000002, - 0x00000002, 0x04000000, 0x04200002, 0x00000802, - 0x04000800, 0x00200802, 0x00200002, 0x04000800, - 0x04000002, 0x04200000, 0x04200800, 0x00200002, - 0x04200000, 0x00000800, 0x00000802, 0x04200802, - 0x00200800, 0x00000002, 0x04000000, 0x00200800, - 0x04000000, 0x00200800, 0x00200000, 0x04000802, - 0x04000802, 0x04200002, 0x04200002, 0x00000002, - 0x00200002, 0x04000000, 0x04000800, 0x00200000, - 0x04200800, 0x00000802, 0x00200802, 0x04200800, - 0x00000802, 0x04000002, 0x04200802, 0x04200000, - 0x00200800, 0x00000000, 0x00000002, 0x04200802, - 0x00000000, 0x00200802, 0x04200000, 0x00000800, - 0x04000002, 0x04000800, 0x00000800, 0x00200002 - }; - private static int[] SP8 = { - 0x10001040, 0x00001000, 0x00040000, 0x10041040, - 0x10000000, 0x10001040, 0x00000040, 0x10000000, - 0x00040040, 0x10040000, 0x10041040, 0x00041000, - 0x10041000, 0x00041040, 0x00001000, 0x00000040, - 0x10040000, 0x10000040, 0x10001000, 0x00001040, - 0x00041000, 0x00040040, 0x10040040, 0x10041000, - 0x00001040, 0x00000000, 0x00000000, 0x10040040, - 0x10000040, 0x10001000, 0x00041040, 0x00040000, - 0x00041040, 0x00040000, 0x10041000, 0x00001000, - 0x00000040, 0x10040040, 0x00001000, 0x00041040, - 0x10001000, 0x00000040, 0x10000040, 0x10040000, - 0x10040040, 0x10000000, 0x00040000, 0x10001040, - 0x00000000, 0x10041040, 0x00040040, 0x10000040, - 0x10040000, 0x10001000, 0x10001040, 0x00000000, - 0x10041040, 0x00041000, 0x00041000, 0x00001040, - 0x00001040, 0x00040040, 0x10000000, 0x10041000 - }; - - // Routines taken from other parts of the Acme utilities. - - /// Squash bytes down to ints. - public static void squashBytesToInts( byte[] inBytes, int inOff, int[] outInts, int outOff, int intLen ) - { - for ( int i = 0; i < intLen; ++i ) - outInts[outOff + i] = - ( ( inBytes[inOff + i * 4 ] & 0xff ) << 24 ) | - ( ( inBytes[inOff + i * 4 + 1] & 0xff ) << 16 ) | - ( ( inBytes[inOff + i * 4 + 2] & 0xff ) << 8 ) | - ( inBytes[inOff + i * 4 + 3] & 0xff ); - } - - /// Spread ints into bytes. - public static void spreadIntsToBytes( int[] inInts, int inOff, byte[] outBytes, int outOff, int intLen ) - { - for ( int i = 0; i < intLen; ++i ) - { - outBytes[outOff + i * 4 ] = (byte) ( inInts[inOff + i] >>> 24 ); - outBytes[outOff + i * 4 + 1] = (byte) ( inInts[inOff + i] >>> 16 ); - outBytes[outOff + i * 4 + 2] = (byte) ( inInts[inOff + i] >>> 8 ); - outBytes[outOff + i * 4 + 3] = (byte) inInts[inOff + i]; - } - } - } diff --git a/console/src/com/cloud/console/ITileScanListener.java b/console/src/com/cloud/console/ITileScanListener.java deleted file mode 100644 index 9d0b5bd2f2c..00000000000 --- a/console/src/com/cloud/console/ITileScanListener.java +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.console; - -import java.awt.Rectangle; -import java.util.List; - -public interface ITileScanListener { - boolean onTileChange(Rectangle rowMergedRect, int row, int col); - void onRegionChange(List regionList); -} diff --git a/console/src/com/cloud/console/InStream.java b/console/src/com/cloud/console/InStream.java deleted file mode 100644 index ba3868f1368..00000000000 --- a/console/src/com/cloud/console/InStream.java +++ /dev/null @@ -1,180 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// repackage it to VMOps common packaging structure -package com.cloud.console; - -// -// rdr::InStream marshalls data from a buffer stored in RDR (RFB Data -// Representation). -// - -abstract public class InStream { - - // check() ensures there is buffer data for at least one item of size - // itemSize bytes. Returns the number of items in the buffer (up to a - // maximum of nItems). - - public final int check(int itemSize, int nItems) throws Exception { - if (ptr + itemSize * nItems > end) { - if (ptr + itemSize > end) - return overrun(itemSize, nItems); - - nItems = (end - ptr) / itemSize; - } - return nItems; - } - - public final void check(int itemSize) throws Exception { - if (ptr + itemSize > end) - overrun(itemSize, 1); - } - - // readU/SN() methods read unsigned and signed N-bit integers. - - public final int readS8() throws Exception { - check(1); return b[ptr++]; - } - - public final int readS16() throws Exception { - check(2); int b0 = b[ptr++]; - int b1 = b[ptr++] & 0xff; return b0 << 8 | b1; - } - - public final int readS32() throws Exception { - check(4); int b0 = b[ptr++]; - int b1 = b[ptr++] & 0xff; - int b2 = b[ptr++] & 0xff; - int b3 = b[ptr++] & 0xff; - return b0 << 24 | b1 << 16 | b2 << 8 | b3; - } - - public final int readU8() throws Exception { - return readS8() & 0xff; - } - - public final int readU16() throws Exception { - return readS16() & 0xffff; - } - - public final int readU32() throws Exception { - return readS32() & 0xffffffff; - } - - // readString() reads a string - a U32 length followed by the data. - - public final String readString() throws Exception { - int len = readU32(); - if (len > maxStringLength) - throw new Exception("InStream max string length exceeded"); - - char[] str = new char[len]; - int i = 0; - while (i < len) { - int j = i + check(1, len - i); - while (i < j) { - str[i++] = (char)b[ptr++]; - } - } - - return new String(str); - } - - // maxStringLength protects against allocating a huge buffer. Set it - // higher if you need longer strings. - - public static int maxStringLength = 65535; - - public final void skip(int bytes) throws Exception { - while (bytes > 0) { - int n = check(1, bytes); - ptr += n; - bytes -= n; - } - } - - // readBytes() reads an exact number of bytes into an array at an offset. - - public void readBytes(byte[] data, int offset, int length) throws Exception { - int offsetEnd = offset + length; - while (offset < offsetEnd) { - int n = check(1, offsetEnd - offset); - System.arraycopy(b, ptr, data, offset, n); - ptr += n; - offset += n; - } - } - - // readOpaqueN() reads a quantity "without byte-swapping". Because java has - // no byte-ordering, we just use big-endian. - - public final int readOpaque8() throws Exception { - return readU8(); - } - - public final int readOpaque16() throws Exception { - return readU16(); - } - - public final int readOpaque32() throws Exception { - return readU32(); - } - - public final int readOpaque24A() throws Exception { - check(3); int b0 = b[ptr++]; - int b1 = b[ptr++]; int b2 = b[ptr++]; - return b0 << 24 | b1 << 16 | b2 << 8; - } - - public final int readOpaque24B() throws Exception { - check(3); int b0 = b[ptr++]; - int b1 = b[ptr++]; int b2 = b[ptr++]; - return b0 << 16 | b1 << 8 | b2; - } - - // pos() returns the position in the stream. - - abstract public int pos(); - - // bytesAvailable() returns true if at least one byte can be read from the - // stream without blocking. i.e. if false is returned then readU8() would - // block. - - public boolean bytesAvailable() { return end != ptr; } - - // getbuf(), getptr(), getend() and setptr() are "dirty" methods which allow - // you to manipulate the buffer directly. This is useful for a stream which - // is a wrapper around an underlying stream. - - public final byte[] getbuf() { return b; } - public final int getptr() { return ptr; } - public final int getend() { return end; } - public final void setptr(int p) { ptr = p; } - - // overrun() is implemented by a derived class to cope with buffer overrun. - // It ensures there are at least itemSize bytes of buffer data. Returns - // the number of items in the buffer (up to a maximum of nItems). itemSize - // is supposed to be "small" (a few bytes). - - abstract protected int overrun(int itemSize, int nItems) throws Exception; - - protected InStream() {} - protected byte[] b; - protected int ptr; - protected int end; -} diff --git a/console/src/com/cloud/console/Logger.java b/console/src/com/cloud/console/Logger.java deleted file mode 100644 index 593e4e5c57b..00000000000 --- a/console/src/com/cloud/console/Logger.java +++ /dev/null @@ -1,225 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.console; - -// logger facility for dynamic switch between console logger used in Applet and log4j based logger -public class Logger { - private static LoggerFactory factory = null; - - public static final int LEVEL_TRACE = 1; - public static final int LEVEL_DEBUG = 2; - public static final int LEVEL_INFO = 3; - public static final int LEVEL_WARN = 4; - public static final int LEVEL_ERROR = 5; - - private Class clazz; - private Logger logger; - - private static int level = LEVEL_INFO; - - public static Logger getLogger(Class clazz) { - return new Logger(clazz); - } - - public static void setFactory(LoggerFactory f) { - factory = f; - } - - public static void setLevel(int l) { - level = l; - } - - public Logger(Class clazz) { - this.clazz = clazz; - } - - protected Logger() { - } - - public boolean isTraceEnabled() { - if(factory != null) { - if(logger == null) - logger = factory.getLogger(clazz); - - return logger.isTraceEnabled(); - } - return level <= LEVEL_TRACE; - } - - public boolean isDebugEnabled() { - if(factory != null) { - if(logger == null) - logger = factory.getLogger(clazz); - - return logger.isDebugEnabled(); - } - return level <= LEVEL_DEBUG; - } - - public boolean isInfoEnabled() { - if(factory != null) { - if(logger == null) - logger = factory.getLogger(clazz); - - return logger.isInfoEnabled(); - } - return level <= LEVEL_INFO; - } - - public void trace(Object message) { - - if(factory != null) { - if(logger == null) - logger = factory.getLogger(clazz); - - logger.trace(message); - } else { - if(level <= LEVEL_TRACE) - System.out.println(message); - } - } - - public void trace(Object message, Throwable exception) { - if(factory != null) { - if(logger == null) - logger = factory.getLogger(clazz); - - logger.trace(message, exception); - } else { - if(level <= LEVEL_TRACE) { - System.out.println(message); - if (exception != null) { - exception.printStackTrace(System.out); - } - } - } - } - - public void info(Object message) { - if(factory != null) { - if(logger == null) - logger = factory.getLogger(clazz); - - logger.info(message); - } else { - if(level <= LEVEL_INFO) - System.out.println(message); - } - } - - public void info(Object message, Throwable exception) { - if(factory != null) { - if(logger == null) - logger = factory.getLogger(clazz); - - logger.info(message, exception); - } else { - if(level <= LEVEL_INFO) { - System.out.println(message); - if (exception != null) { - exception.printStackTrace(System.out); - } - } - } - } - - public void debug(Object message) { - if(factory != null) { - if(logger == null) - logger = factory.getLogger(clazz); - - logger.debug(message); - } else { - if(level <= LEVEL_DEBUG) - System.out.println(message); - } - } - - public void debug(Object message, Throwable exception) { - if(factory != null) { - if(logger == null) - logger = factory.getLogger(clazz); - - logger.debug(message, exception); - } else { - if(level <= LEVEL_DEBUG) { - System.out.println(message); - if (exception != null) { - exception.printStackTrace(System.out); - } - } - } - } - - public void warn(Object message) { - if(factory != null) { - if(logger == null) - logger = factory.getLogger(clazz); - - logger.warn(message); - } else { - if(level <= LEVEL_WARN) - System.out.println(message); - } - } - - public void warn(Object message, Throwable exception) { - if(factory != null) { - if(logger == null) - logger = factory.getLogger(clazz); - - logger.warn(message, exception); - } else { - if(level <= LEVEL_WARN) { - System.out.println(message); - if (exception != null) { - exception.printStackTrace(System.out); - } - } - } - } - - public void error(Object message) { - if(factory != null) { - if(logger == null) - logger = factory.getLogger(clazz); - - logger.error(message); - } else { - if(level <= LEVEL_ERROR) - System.out.println(message); - } - } - - public void error(Object message, Throwable exception) { - if(factory != null) { - if(logger == null) - logger = factory.getLogger(clazz); - - logger.error(message, exception); - } else { - if(level <= LEVEL_ERROR) { - System.out.println(message); - if (exception != null) { - exception.printStackTrace(System.out); - } - } - } - } -} diff --git a/console/src/com/cloud/console/LoggerFactory.java b/console/src/com/cloud/console/LoggerFactory.java deleted file mode 100644 index 0c78dda6382..00000000000 --- a/console/src/com/cloud/console/LoggerFactory.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.console; - -public interface LoggerFactory { - Logger getLogger(Class clazz); -} diff --git a/console/src/com/cloud/console/MemInStream.java b/console/src/com/cloud/console/MemInStream.java deleted file mode 100644 index 130f8d5d8de..00000000000 --- a/console/src/com/cloud/console/MemInStream.java +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// repackage it to VMOps common packaging structure -package com.cloud.console; - -public class MemInStream extends InStream { - - public MemInStream(byte[] data, int offset, int len) { - b = data; - ptr = offset; - end = offset + len; - } - - public int pos() { return ptr; } - - protected int overrun(int itemSize, int nItems) throws Exception { - throw new Exception("MemInStream overrun: end of stream"); - } -} diff --git a/console/src/com/cloud/console/Region.java b/console/src/com/cloud/console/Region.java deleted file mode 100644 index 65e031293b5..00000000000 --- a/console/src/com/cloud/console/Region.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.console; - -import java.awt.Rectangle; -import java.util.ArrayList; -import java.util.List; - -public class Region { - private Rectangle bound; - private List rectList; - - public Region() { - bound = new Rectangle(0, 0, 0, 0); - rectList = new ArrayList(); - } - - public Region(Rectangle rect) { - bound = new Rectangle(rect.x, rect.y, rect.width, rect.height); - rectList = new ArrayList(); - rectList.add(rect); - } - - public Rectangle getBound() { - return bound; - } - - public void clearBound() { - assert(rectList.size() == 0); - bound.x = bound.y = bound.width = bound.height = 0; - } - - public List getRectangles() { - return rectList; - } - - public boolean add(Rectangle rect) { - if(bound.isEmpty()) { - assert(rectList.size() == 0); - bound.x = rect.x; - bound.y = rect.y; - bound.width = rect.width; - bound.height = rect.height; - - rectList.add(rect); - return true; - } - - Rectangle rcInflated = new Rectangle(rect.x - 1, rect.y- 1, rect.width + 2, rect.height + 2); - if(!bound.intersects(rcInflated)) - return false; - - for(Rectangle r : rectList) { - if(r.intersects(rcInflated)) { - if(!r.contains(rect)) { - enlargeBound(rect); - rectList.add(rect); - return true; - } - } - } - return false; - } - - private void enlargeBound(Rectangle rect) { - int boundLeft = Math.min(bound.x, rect.x); - int boundTop = Math.min(bound.y, rect.y); - int boundRight = Math.max(bound.x + bound.width, rect.x + rect.width); - int boundBottom = Math.max(bound.y + bound.height, rect.y + rect.height); - - bound.x = boundLeft; - bound.y = boundTop; - bound.width = boundRight - boundLeft; - bound.height = boundBottom - boundTop; - } -} diff --git a/console/src/com/cloud/console/RegionClassifier.java b/console/src/com/cloud/console/RegionClassifier.java deleted file mode 100644 index b24a22244e8..00000000000 --- a/console/src/com/cloud/console/RegionClassifier.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.console; - -import java.awt.Rectangle; -import java.util.ArrayList; -import java.util.List; - -public class RegionClassifier { - private List regionList; - - public RegionClassifier() { - regionList = new ArrayList(); - } - - public void add(Rectangle rect) { - // quickly identify that if we need a new region - boolean newRegion = true; - Rectangle rcInflated = new Rectangle(rect.x - 1, rect.y - 1, rect.width + 2, rect.height + 2); - for(Region region : regionList) { - if(region.getBound().intersects(rcInflated)) { - newRegion = false; - break; - } - } - - if(newRegion) { - regionList.add(new Region(rect)); - } else { - for(Region region : regionList) { - if(region.add(rect)) - return; - } - regionList.add(new Region(rect)); - } - } - - public List getRegionList() { - return regionList; - } - - public void clear() { - regionList.clear(); - } -} diff --git a/console/src/com/cloud/console/RfbProto.java b/console/src/com/cloud/console/RfbProto.java deleted file mode 100644 index f21a31b5bc4..00000000000 --- a/console/src/com/cloud/console/RfbProto.java +++ /dev/null @@ -1,1479 +0,0 @@ -// -// Copyright (C) 2001-2004 HorizonLive.com, Inc. All Rights Reserved. -// Copyright (C) 2001-2006 Constantin Kaplinsky. All Rights Reserved. -// Copyright (C) 2000 Tridia Corporation. All Rights Reserved. -// Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. -// -// This is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this software; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. -// - -// repackage it to VMOps common packaging structure -package com.cloud.console; - -// -// RfbProto.java -// - -import java.io.*; -import java.awt.event.*; -import java.net.Socket; -import java.util.zip.*; - -public class RfbProto { - - private static final Logger s_logger = Logger.getLogger(RfbProto.class); - - public final static String - versionMsg_3_3 = "RFB 003.003\n", - versionMsg_3_7 = "RFB 003.007\n", - versionMsg_3_8 = "RFB 003.008\n"; - - // Vendor signatures: standard VNC/RealVNC, TridiaVNC, and TightVNC - public final static String - StandardVendor = "STDV", - TridiaVncVendor = "TRDV", - TightVncVendor = "TGHT"; - - // Security types - public final static int - SecTypeInvalid = 0, - SecTypeNone = 1, - SecTypeVncAuth = 2, - SecTypeTight = 16; - - // Supported tunneling types - public final static int - NoTunneling = 0; - public final static String - SigNoTunneling = "NOTUNNEL"; - - // Supported authentication types - public final static int - AuthNone = 1, - AuthVNC = 2, - AuthUnixLogin = 129; - public final static String - SigAuthNone = "NOAUTH__", - SigAuthVNC = "VNCAUTH_", - SigAuthUnixLogin = "ULGNAUTH"; - - // VNC authentication results - public final static int - VncAuthOK = 0, - VncAuthFailed = 1, - VncAuthTooMany = 2; - - // Server-to-client messages - public final static int - FramebufferUpdate = 0, - SetColourMapEntries = 1, - Bell = 2, - ServerCutText = 3; - - // Client-to-server messages - public final static int - SetPixelFormat = 0, - FixColourMapEntries = 1, - SetEncodings = 2, - FramebufferUpdateRequest = 3, - KeyboardEvent = 4, - PointerEvent = 5, - ClientCutText = 6, - VMOpsClientCustom = 250; - - // Supported encodings and pseudo-encodings - public final static int - EncodingRaw = 0, - EncodingCopyRect = 1, - EncodingRRE = 2, - EncodingCoRRE = 4, - EncodingHextile = 5, - EncodingZlib = 6, - EncodingTight = 7, - EncodingZRLE = 16, - EncodingCompressLevel0 = 0xFFFFFF00, - EncodingQualityLevel0 = 0xFFFFFFE0, - EncodingXCursor = 0xFFFFFF10, - EncodingRichCursor = 0xFFFFFF11, - EncodingPointerPos = 0xFFFFFF18, - EncodingLastRect = 0xFFFFFF20, - EncodingNewFBSize = 0xFFFFFF21; - public final static String - SigEncodingRaw = "RAW_____", - SigEncodingCopyRect = "COPYRECT", - SigEncodingRRE = "RRE_____", - SigEncodingCoRRE = "CORRE___", - SigEncodingHextile = "HEXTILE_", - SigEncodingZlib = "ZLIB____", - SigEncodingTight = "TIGHT___", - SigEncodingZRLE = "ZRLE____", - SigEncodingCompressLevel0 = "COMPRLVL", - SigEncodingQualityLevel0 = "JPEGQLVL", - SigEncodingXCursor = "X11CURSR", - SigEncodingRichCursor = "RCHCURSR", - SigEncodingPointerPos = "POINTPOS", - SigEncodingLastRect = "LASTRECT", - SigEncodingNewFBSize = "NEWFBSIZ"; - - public final static int MaxNormalEncoding = 255; - - // Contstants used in the Hextile decoder - public final static int - HextileRaw = 1, - HextileBackgroundSpecified = 2, - HextileForegroundSpecified = 4, - HextileAnySubrects = 8, - HextileSubrectsColoured = 16; - - // Contstants used in the Tight decoder - public final static int TightMinToCompress = 12; - public final static int - TightExplicitFilter = 0x04, - TightFill = 0x08, - TightJpeg = 0x09, - TightMaxSubencoding = 0x09, - TightFilterCopy = 0x00, - TightFilterPalette = 0x01, - TightFilterGradient = 0x02; - - - String host; - int port; - Socket sock; - public SplitInputStream sis; - public DataInputStream is; - public OutputStream os; - - SessionRecorder rec; - public boolean inNormalProtocol = false; - - RfbProtoAdapter adapter; - // ConsoleViewer viewer; - - // Java on UNIX does not call keyPressed() on some keys, for example - // swedish keys To prevent our workaround to produce duplicate - // keypresses on JVMs that actually works, keep track of if - // keyPressed() for a "broken" key was called or not. - boolean brokenKeyPressed = false; - - // This will be set to true on the first framebuffer update - // containing Zlib-, ZRLE- or Tight-encoded data. - boolean wereZlibUpdates = false; - - // This will be set to false if the startSession() was called after - // we have received at least one Zlib-, ZRLE- or Tight-encoded - // framebuffer update. - boolean recordFromBeginning = true; - - // This fields are needed to show warnings about inefficiently saved - // sessions only once per each saved session file. - boolean zlibWarningShown; - boolean tightWarningShown; - - // Before starting to record each saved session, we set this field - // to 0, and increment on each framebuffer update. We don't flush - // the SessionRecorder data into the file before the second update. - // This allows us to write initial framebuffer update with zero - // timestamp, to let the player show initial desktop before - // playback. - int numUpdatesInSession; - - // Measuring network throughput. - boolean timing; - long timeWaitedIn100us; - long timedKbits; - - // Protocol version and TightVNC-specific protocol options. - public int serverMajor, serverMinor; - public int clientMajor, clientMinor; - boolean protocolTightVNC; - CapsContainer tunnelCaps, authCaps; - CapsContainer serverMsgCaps, clientMsgCaps; - CapsContainer encodingCaps; - - // If true, informs that the RFB socket was closed. - private boolean closed; - - // - // Constructor. Make TCP connection to RFB server. - // - - // RfbProto(String h, int p, ConsoleViewer v) throws IOException { - public RfbProto(String h, int p, RfbProtoAdapter adapter) throws IOException { - this.adapter = adapter; - host = h; - port = p; - -/* - if (!viewer.inProxyMode) { -* - // Create a trust manager that does not validate certificate chains like the default TrustManager - TrustManager[] trustAllCerts = new TrustManager[]{ - new X509TrustManager() { - - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - return null; - } - - public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { - //No need to implement. - } - - public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { - //No need to implement. - } - } - }; - - // Let us create the factory where we can set some parameters for the connection - SSLContext sc = null; - - try { - sc = SSLContext.getInstance("SSL"); - sc.init(null, trustAllCerts, new java.security.SecureRandom()); - } catch (Exception e) { - throw new IOException(e); - } - - SSLSocketFactory socketFactory =sc.getSocketFactory(); -* - - SocketFactory socketFactory = SSLSocketFactory.getDefault(); - sock = socketFactory.createSocket(host, port); - } else { - sock = new Socket(); - sock.setSoTimeout(0); // infinite - sock.setKeepAlive(true); - sock.connect(new InetSocketAddress(host, port), 30000); - } -*/ - sock = adapter.createConnection(h, p); - - sis = new SplitInputStream(new BufferedInputStream(sock.getInputStream(), 16384)); - is = new DataInputStream(sis); - os = sock.getOutputStream(); - - timing = false; - timeWaitedIn100us = 5; - timedKbits = 0; - } - - public synchronized void close() { - if (sock != null && !closed) { - try { - if(s_logger.isInfoEnabled()) - s_logger.info("close RFB socket"); - - // set linger to zero and let us quit quickly - sock.setSoLinger(true, 0); - sock.close(); - - sock = null; - closed = true; - if (rec != null) { - rec.close(); - rec = null; - } - } catch (Exception e) { - if(s_logger.isInfoEnabled()) - s_logger.info("Exception in closing RFB socket, " + e.toString()); - - sock = null; - closed = true; - - if (rec != null) { - try { - rec.close(); - } catch (IOException e1) { - } - rec = null; - } - } - - if(s_logger.isInfoEnabled()) - s_logger.info("RFB socket is closed"); - } - } - - public synchronized boolean closed() { - return closed; - } - - // - // Read proxy's protocol version message - // - - public void readProxyVersion() throws Exception { - byte[] version = new byte[12]; - readFully(version); - if (version[0] != 'R' || version[1] != 'F' || version[2] != 'B') { - throw new Exception("Bad version string from proxy"); - } - } - - // - // Write host:port to proxy - // - - public void writeProxyString(String realhost, int realport, String sid) throws IOException { - byte[] bs = (realhost + ":" + realport + ":" + sid + "\n").getBytes("US-ASCII"); -//s_logger.info("writeProxyString " + realhost + ":" + realport ); - os.write('V'); - os.write('M'); - os.write(bs.length); - os.write(bs); - } - - // - // Read server's protocol version message - // - - public void readVersionMsg() throws Exception { - - byte[] b = new byte[12]; - - readFully(b); - - if ((b[0] != 'R') || (b[1] != 'F') || (b[2] != 'B') || (b[3] != ' ') - || (b[4] < '0') || (b[4] > '9') || (b[5] < '0') || (b[5] > '9') - || (b[6] < '0') || (b[6] > '9') || (b[7] != '.') - || (b[8] < '0') || (b[8] > '9') || (b[9] < '0') || (b[9] > '9') - || (b[10] < '0') || (b[10] > '9') || (b[11] != '\n')) - { - throw new Exception("Host " + host + " port " + port + - " is not an RFB server"); - } - - serverMajor = (b[4] - '0') * 100 + (b[5] - '0') * 10 + (b[6] - '0'); - serverMinor = (b[8] - '0') * 100 + (b[9] - '0') * 10 + (b[10] - '0'); - - if (serverMajor < 3) { - throw new Exception("RFB server does not support protocol version 3"); - } - } - - - // - // Write our protocol version message - // - - public void writeVersionMsg() throws IOException { - clientMajor = 3; - if (serverMajor > 3 || serverMinor >= 8) { - clientMinor = 8; - os.write(versionMsg_3_8.getBytes()); - } else if (serverMinor >= 7) { - clientMinor = 7; - os.write(versionMsg_3_7.getBytes()); - } else { - clientMinor = 3; - os.write(versionMsg_3_3.getBytes()); - } - protocolTightVNC = false; - } - - - // - // Negotiate the authentication scheme. - // - - public int negotiateSecurity() throws Exception { - return (clientMinor >= 7) ? - selectSecurityType() : readSecurityType(); - } - - // - // Read security type from the server (protocol version 3.3). - // - - public int readSecurityType() throws Exception { - int secType = is.readInt(); - - switch (secType) { - case SecTypeInvalid: - readConnFailedReason(); - return SecTypeInvalid; // should never be executed - case SecTypeNone: - case SecTypeVncAuth: - return secType; - default: - throw new Exception("Unknown security type from RFB server: " + secType); - } - } - - // - // Select security type from the server's list (protocol versions 3.7/3.8). - // - - public int selectSecurityType() throws Exception { - int secType = SecTypeInvalid; - - // Read the list of secutiry types. - int nSecTypes = is.readUnsignedByte(); - if (nSecTypes == 0) { - readConnFailedReason(); - return SecTypeInvalid; // should never be executed - } - byte[] secTypes = new byte[nSecTypes]; - readFully(secTypes); - - // Find out if the server supports TightVNC protocol extensions - for (int i = 0; i < nSecTypes; i++) { - if (secTypes[i] == SecTypeTight) { - protocolTightVNC = true; - os.write(SecTypeTight); - return SecTypeTight; - } - } - - // Find first supported security type. - for (int i = 0; i < nSecTypes; i++) { - if (secTypes[i] == SecTypeNone || secTypes[i] == SecTypeVncAuth) { - secType = secTypes[i]; - break; - } - } - - if (secType == SecTypeInvalid) { - throw new Exception("Server did not offer supported security type"); - } else { - os.write(secType); - } - - return secType; - } - - // - // Perform "no authentication". - // - - public void authenticateNone() throws Exception { - if (clientMinor >= 8) - readSecurityResult("No authentication"); - } - - // - // Perform standard VNC Authentication. - // - - public void authenticateVNC(String pw) throws Exception { - byte[] challenge = new byte[16]; - readFully(challenge); - - if (pw.length() > 8) - pw = pw.substring(0, 8); // Truncate to 8 chars - - // Truncate password on the first zero byte. - int firstZero = pw.indexOf(0); - if (firstZero != -1) - pw = pw.substring(0, firstZero); - - byte[] key = {0, 0, 0, 0, 0, 0, 0, 0}; - System.arraycopy(pw.getBytes(), 0, key, 0, pw.length()); - - DesCipher des = new DesCipher(key); - - des.encrypt(challenge, 0, challenge, 0); - des.encrypt(challenge, 8, challenge, 8); - - os.write(challenge); - - readSecurityResult("VNC authentication"); - } - - // - // Read security result. - // Throws an exception on authentication failure. - // - - public void readSecurityResult(String authType) throws Exception { - int securityResult = is.readInt(); - - switch (securityResult) { - case VncAuthOK: -// s_logger.info(authType + ": success"); - break; - case VncAuthFailed: - if (clientMinor >= 8) - readConnFailedReason(); - throw new AuthenticationException(authType + ": failed"); - case VncAuthTooMany: - throw new AuthenticationException(authType + ": failed, too many tries"); - default: - throw new AuthenticationException(authType + ": unknown result " + securityResult); - } - } - - // - // Read the string describing the reason for a connection failure, - // and throw an exception. - // - - public void readConnFailedReason() throws Exception { - int reasonLen = is.readInt(); - byte[] reason = new byte[reasonLen]; - readFully(reason); - throw new AuthenticationException(new String(reason)); - } - - // - // Initialize capability lists (TightVNC protocol extensions). - // - - public void initCapabilities() { - tunnelCaps = new CapsContainer(); - authCaps = new CapsContainer(); - serverMsgCaps = new CapsContainer(); - clientMsgCaps = new CapsContainer(); - encodingCaps = new CapsContainer(); - - // Supported authentication methods - authCaps.add(AuthNone, StandardVendor, SigAuthNone, - "No authentication"); - authCaps.add(AuthVNC, StandardVendor, SigAuthVNC, - "Standard VNC password authentication"); - - // Supported encoding types - encodingCaps.add(EncodingCopyRect, StandardVendor, - SigEncodingCopyRect, "Standard CopyRect encoding"); - encodingCaps.add(EncodingRRE, StandardVendor, - SigEncodingRRE, "Standard RRE encoding"); - encodingCaps.add(EncodingCoRRE, StandardVendor, - SigEncodingCoRRE, "Standard CoRRE encoding"); - encodingCaps.add(EncodingHextile, StandardVendor, - SigEncodingHextile, "Standard Hextile encoding"); - encodingCaps.add(EncodingZRLE, StandardVendor, - SigEncodingZRLE, "Standard ZRLE encoding"); - encodingCaps.add(EncodingZlib, TridiaVncVendor, - SigEncodingZlib, "Zlib encoding"); - encodingCaps.add(EncodingTight, TightVncVendor, - SigEncodingTight, "Tight encoding"); - - // Supported pseudo-encoding types - encodingCaps.add(EncodingCompressLevel0, TightVncVendor, - SigEncodingCompressLevel0, "Compression level"); - encodingCaps.add(EncodingQualityLevel0, TightVncVendor, - SigEncodingQualityLevel0, "JPEG quality level"); - encodingCaps.add(EncodingXCursor, TightVncVendor, - SigEncodingXCursor, "X-style cursor shape update"); - encodingCaps.add(EncodingRichCursor, TightVncVendor, - SigEncodingRichCursor, "Rich-color cursor shape update"); - encodingCaps.add(EncodingPointerPos, TightVncVendor, - SigEncodingPointerPos, "Pointer position update"); - encodingCaps.add(EncodingLastRect, TightVncVendor, - SigEncodingLastRect, "LastRect protocol extension"); - encodingCaps.add(EncodingNewFBSize, TightVncVendor, - SigEncodingNewFBSize, "Framebuffer size change"); - } - - // - // Setup tunneling (TightVNC protocol extensions) - // - - public void setupTunneling() throws IOException { - int nTunnelTypes = is.readInt(); - if (nTunnelTypes != 0) { - readCapabilityList(tunnelCaps, nTunnelTypes); - - // We don't support tunneling yet. - writeInt(NoTunneling); - } - } - - // - // Negotiate authentication scheme (TightVNC protocol extensions) - // - - public int negotiateAuthenticationTight() throws Exception { - int nAuthTypes = is.readInt(); - if (nAuthTypes == 0) - return AuthNone; - - readCapabilityList(authCaps, nAuthTypes); - for (int i = 0; i < authCaps.numEnabled(); i++) { - int authType = authCaps.getByOrder(i); - if (authType == AuthNone || authType == AuthVNC) { - writeInt(authType); - return authType; - } - } - throw new Exception("No suitable authentication scheme found"); - } - - // - // Read a capability list (TightVNC protocol extensions) - // - - public void readCapabilityList(CapsContainer caps, int count) throws IOException { - int code; - byte[] vendor = new byte[4]; - byte[] name = new byte[8]; - for (int i = 0; i < count; i++) { - code = is.readInt(); - readFully(vendor); - readFully(name); - caps.enable(new CapabilityInfo(code, vendor, name)); - } - } - - // - // Write a 32-bit integer into the output stream. - // - - public void writeInt(int value) throws IOException { - byte[] b = new byte[4]; - b[0] = (byte) ((value >> 24) & 0xff); - b[1] = (byte) ((value >> 16) & 0xff); - b[2] = (byte) ((value >> 8) & 0xff); - b[3] = (byte) (value & 0xff); - os.write(b); - } - - // - // Write the client initialisation message - // - - public void writeClientInit() throws IOException { -/* - if (viewer.options.shareDesktop) { - os.write(1); - } else { - os.write(0); - } -*/ - adapter.writeInit(os); -// viewer.options.disableShareDesktop(); - } - - - // - // Read the server initialisation message - // - - public String desktopName; - public int framebufferWidth, framebufferHeight; - public int bitsPerPixel, depth; - public boolean bigEndian, trueColour; - public int redMax, greenMax, blueMax, redShift, greenShift, blueShift; - - public void readServerInit() throws IOException { - framebufferWidth = is.readUnsignedShort(); - framebufferHeight = is.readUnsignedShort(); - bitsPerPixel = is.readUnsignedByte(); - depth = is.readUnsignedByte(); - bigEndian = (is.readUnsignedByte() != 0); - trueColour = (is.readUnsignedByte() != 0); - redMax = is.readUnsignedShort(); - greenMax = is.readUnsignedShort(); - blueMax = is.readUnsignedShort(); - redShift = is.readUnsignedByte(); - greenShift = is.readUnsignedByte(); - blueShift = is.readUnsignedByte(); - byte[] pad = new byte[3]; - readFully(pad); - int nameLength = is.readInt(); - byte[] name = new byte[nameLength]; - readFully(name); - desktopName = new String(name); - - // Read interaction capabilities (TightVNC protocol extensions) - if (protocolTightVNC) { - int nServerMessageTypes = is.readUnsignedShort(); - int nClientMessageTypes = is.readUnsignedShort(); - int nEncodingTypes = is.readUnsignedShort(); - is.readUnsignedShort(); - readCapabilityList(serverMsgCaps, nServerMessageTypes); - readCapabilityList(clientMsgCaps, nClientMessageTypes); - readCapabilityList(encodingCaps, nEncodingTypes); - } - - if(s_logger.isInfoEnabled()) - s_logger.info("Recv'd ServerInit w=" + framebufferWidth + - " h=" + framebufferHeight + - " bits=" + bitsPerPixel + - " depth=" + depth + - " name=" + desktopName); - - inNormalProtocol = true; - } - - - // - // Create session file and write initial protocol messages into it. - // - - public void startSession(String fname) throws IOException { - rec = new SessionRecorder(fname); - rec.writeHeader(); - rec.write(versionMsg_3_3.getBytes()); - rec.writeIntBE(SecTypeNone); - rec.writeShortBE(framebufferWidth); - rec.writeShortBE(framebufferHeight); - byte[] fbsServerInitMsg = { - 32, 24, 0, 1, 0, - (byte)0xFF, 0, (byte)0xFF, 0, (byte)0xFF, - 16, 8, 0, 0, 0, 0 - }; - rec.write(fbsServerInitMsg); - rec.writeIntBE(desktopName.length()); - rec.write(desktopName.getBytes()); - numUpdatesInSession = 0; - - // FIXME: If there were e.g. ZRLE updates only, that should not - // affect recording of Zlib and Tight updates. So, actually - // we should maintain separate flags for Zlib, ZRLE and - // Tight, instead of one ``wereZlibUpdates'' variable. - // - if (wereZlibUpdates) - recordFromBeginning = false; - - zlibWarningShown = false; - tightWarningShown = false; - } - - // - // Close session file. - // - - public void closeSession() throws IOException { - if (rec != null) { - rec.close(); - rec = null; - } - } - - - // - // Set new framebuffer size - // - - public void setFramebufferSize(int width, int height) { - framebufferWidth = width; - framebufferHeight = height; - } - - - // - // Read the server message type - // - - public int readServerMessageType() throws IOException { - int msgType = is.readUnsignedByte(); - - // If the session is being recorded: - if (rec != null) { - if (msgType == Bell) { // Save Bell messages in session files. - rec.writeByte(msgType); - if (numUpdatesInSession > 0) - rec.flush(); - } - } - - return msgType; - } - - - // - // Read a FramebufferUpdate message - // - - int updateNRects; - - public void readFramebufferUpdate() throws IOException { - is.readByte(); - updateNRects = is.readUnsignedShort(); - - // If the session is being recorded: - if (rec != null) { - rec.writeByte(FramebufferUpdate); - rec.writeByte(0); - rec.writeShortBE(updateNRects); - } - - numUpdatesInSession++; - } - - // Read a FramebufferUpdate rectangle header - - int updateRectX, updateRectY, updateRectW, updateRectH, updateRectEncoding; - - public void readFramebufferUpdateRectHdr() throws Exception { - updateRectX = is.readUnsignedShort(); - updateRectY = is.readUnsignedShort(); - updateRectW = is.readUnsignedShort(); - updateRectH = is.readUnsignedShort(); - updateRectEncoding = is.readInt(); - - if (updateRectEncoding == EncodingZlib || - updateRectEncoding == EncodingZRLE || - updateRectEncoding == EncodingTight) - wereZlibUpdates = true; - - // If the session is being recorded: - if (rec != null) { - if (numUpdatesInSession > 1) - rec.flush(); // Flush the output on each rectangle. - rec.writeShortBE(updateRectX); - rec.writeShortBE(updateRectY); - rec.writeShortBE(updateRectW); - rec.writeShortBE(updateRectH); - if (updateRectEncoding == EncodingZlib && !recordFromBeginning) { - // Here we cannot write Zlib-encoded rectangles because the - // decoder won't be able to reproduce zlib stream state. - if (!zlibWarningShown) { - if(s_logger.isInfoEnabled()) - s_logger.info("Warning: Raw encoding will be used " + "instead of Zlib in recorded session."); - zlibWarningShown = true; - } - rec.writeIntBE(EncodingRaw); - } else { - rec.writeIntBE(updateRectEncoding); - if (updateRectEncoding == EncodingTight && !recordFromBeginning && - !tightWarningShown) { - if(s_logger.isInfoEnabled()) - s_logger.info("Warning: Re-compressing Tight-encoded " + - "updates for session recording."); - tightWarningShown = true; - } - } - } - - if (updateRectEncoding < 0 || updateRectEncoding > MaxNormalEncoding) - return; - - if (updateRectX + updateRectW > framebufferWidth || - updateRectY + updateRectH > framebufferHeight) { - s_logger.warn("Framebuffer update rectangle too large: " + - updateRectW + "x" + updateRectH + " at (" + - updateRectX + "," + updateRectY + "), current framebuffer size:" + - framebufferWidth + ", " + framebufferHeight); - - throw new Exception("Framebuffer update rectangle too large: " + - updateRectW + "x" + updateRectH + " at (" + - updateRectX + "," + updateRectY + "), current framebuffer size:" + - framebufferWidth + ", " + framebufferHeight); - } - } - - // Read CopyRect source X and Y. - - int copyRectSrcX, copyRectSrcY; - - public void readCopyRect() throws IOException { - copyRectSrcX = is.readUnsignedShort(); - copyRectSrcY = is.readUnsignedShort(); - - // If the session is being recorded: - if (rec != null) { - rec.writeShortBE(copyRectSrcX); - rec.writeShortBE(copyRectSrcY); - } - } - - - // - // Read a ServerCutText message - // - - public String readServerCutText() throws IOException { - byte[] pad = new byte[3]; - readFully(pad); - int len = is.readInt(); - byte[] text = new byte[len]; - readFully(text); - return new String(text); - } - - - // - // Read an integer in compact representation (1..3 bytes). - // Such format is used as a part of the Tight encoding. - // Also, this method records data if session recording is active and - // the viewer's recordFromBeginning variable is set to true. - // - - public int readCompactLen() throws IOException { - int[] portion = new int[3]; - portion[0] = is.readUnsignedByte(); - int byteCount = 1; - int len = portion[0] & 0x7F; - if ((portion[0] & 0x80) != 0) { - portion[1] = is.readUnsignedByte(); - byteCount++; - len |= (portion[1] & 0x7F) << 7; - if ((portion[1] & 0x80) != 0) { - portion[2] = is.readUnsignedByte(); - byteCount++; - len |= (portion[2] & 0xFF) << 14; - } - } - - if (rec != null && recordFromBeginning) - for (int i = 0; i < byteCount; i++) - rec.writeByte(portion[i]); - - return len; - } - - // - // Write a VMOps Client Custom message - // - - public void writeClientCustomMessage(int type) - throws IOException - { - byte[] b = new byte[2]; - - b[0] = (byte) VMOpsClientCustom; - b[1] = (byte) type; - - os.write(b); - } - - // - // Write a FramebufferUpdateRequest message - // - - public void writeFramebufferUpdateRequest(int x, int y, int w, int h, - boolean incremental) - throws IOException - { - byte[] b = new byte[10]; - - b[0] = (byte) FramebufferUpdateRequest; - b[1] = (byte) (incremental ? 1 : 0); - b[2] = (byte) ((x >> 8) & 0xff); - b[3] = (byte) (x & 0xff); - b[4] = (byte) ((y >> 8) & 0xff); - b[5] = (byte) (y & 0xff); - b[6] = (byte) ((w >> 8) & 0xff); - b[7] = (byte) (w & 0xff); - b[8] = (byte) ((h >> 8) & 0xff); - b[9] = (byte) (h & 0xff); - - os.write(b); - } - - - // - // Write a SetPixelFormat message - // - - public void writeSetPixelFormat(int bitsPerPixel, int depth, boolean bigEndian, - boolean trueColour, - int redMax, int greenMax, int blueMax, - int redShift, int greenShift, int blueShift) - throws IOException - { - byte[] b = new byte[20]; - - b[0] = (byte) SetPixelFormat; - b[4] = (byte) bitsPerPixel; - b[5] = (byte) depth; - b[6] = (byte) (bigEndian ? 1 : 0); - b[7] = (byte) (trueColour ? 1 : 0); - b[8] = (byte) ((redMax >> 8) & 0xff); - b[9] = (byte) (redMax & 0xff); - b[10] = (byte) ((greenMax >> 8) & 0xff); - b[11] = (byte) (greenMax & 0xff); - b[12] = (byte) ((blueMax >> 8) & 0xff); - b[13] = (byte) (blueMax & 0xff); - b[14] = (byte) redShift; - b[15] = (byte) greenShift; - b[16] = (byte) blueShift; - - os.write(b); - } - - - // - // Write a FixColourMapEntries message. The values in the red, green and - // blue arrays are from 0 to 65535. - // - - public void writeFixColourMapEntries(int firstColour, int nColours, - int[] red, int[] green, int[] blue) - throws IOException - { - byte[] b = new byte[6 + nColours * 6]; - - b[0] = (byte) FixColourMapEntries; - b[2] = (byte) ((firstColour >> 8) & 0xff); - b[3] = (byte) (firstColour & 0xff); - b[4] = (byte) ((nColours >> 8) & 0xff); - b[5] = (byte) (nColours & 0xff); - - for (int i = 0; i < nColours; i++) { - b[6 + i * 6] = (byte) ((red[i] >> 8) & 0xff); - b[6 + i * 6 + 1] = (byte) (red[i] & 0xff); - b[6 + i * 6 + 2] = (byte) ((green[i] >> 8) & 0xff); - b[6 + i * 6 + 3] = (byte) (green[i] & 0xff); - b[6 + i * 6 + 4] = (byte) ((blue[i] >> 8) & 0xff); - b[6 + i * 6 + 5] = (byte) (blue[i] & 0xff); - } - - os.write(b); - } - - - // - // Write a SetEncodings message - // - - public void writeSetEncodings(int[] encs, int len) throws IOException { - byte[] b = new byte[4 + 4 * len]; - - b[0] = (byte) SetEncodings; - b[2] = (byte) ((len >> 8) & 0xff); - b[3] = (byte) (len & 0xff); - - for (int i = 0; i < len; i++) { - b[4 + 4 * i] = (byte) ((encs[i] >> 24) & 0xff); - b[5 + 4 * i] = (byte) ((encs[i] >> 16) & 0xff); - b[6 + 4 * i] = (byte) ((encs[i] >> 8) & 0xff); - b[7 + 4 * i] = (byte) (encs[i] & 0xff); - } - - os.write(b); - } - - - // - // Write a ClientCutText message - // - - public void writeClientCutText(String text) throws IOException { - byte[] b = new byte[8 + text.length()]; - - b[0] = (byte) ClientCutText; - b[4] = (byte) ((text.length() >> 24) & 0xff); - b[5] = (byte) ((text.length() >> 16) & 0xff); - b[6] = (byte) ((text.length() >> 8) & 0xff); - b[7] = (byte) (text.length() & 0xff); - - System.arraycopy(text.getBytes(), 0, b, 8, text.length()); - - os.write(b); - } - - - // - // A buffer for putting pointer and keyboard events before being sent. This - // is to ensure that multiple RFB events generated from a single Java Event - // will all be sent in a single network packet. The maximum possible - // length is 4 modifier down events, a single key event followed by 4 - // modifier up events i.e. 9 key events or 72 bytes. - // - - byte[] eventBuf = new byte[72]; - int eventBufLen; - - - // Useful shortcuts for modifier masks. - - final static int CTRL_MASK = InputEvent.CTRL_MASK; - final static int SHIFT_MASK = InputEvent.SHIFT_MASK; - final static int META_MASK = InputEvent.META_MASK; - final static int ALT_MASK = InputEvent.ALT_MASK; - - - // - // Write a pointer event message. We may need to send modifier key events - // around it to set the correct modifier state. - // - - int pointerMask = 0; - - public void writePointerEvent(MouseEvent evt) throws IOException { - int modifiers = evt.getModifiers(); - - int mask2 = 2; - int mask3 = 4; - Integer[] masks = new Integer[] { new Integer(mask2), new Integer(mask3) }; - adapter.swapMouseButton(masks); - mask2 = masks[0]; - mask3 = masks[1]; - - /* - if (viewer.options.reverseMouseButtons2And3) { - mask2 = 4; - mask3 = 2; - } - */ - - // Note: For some reason, AWT does not set BUTTON1_MASK on left - // button presses. Here we think that it was the left button if - // modifiers do not include BUTTON2_MASK or BUTTON3_MASK. - - if (evt.getID() == MouseEvent.MOUSE_PRESSED) { - if ((modifiers & InputEvent.BUTTON2_MASK) != 0) { - pointerMask = mask2; - modifiers &= ~ALT_MASK; - } else if ((modifiers & InputEvent.BUTTON3_MASK) != 0) { - pointerMask = mask3; - modifiers &= ~META_MASK; - } else { - pointerMask = 1; - } - } else if (evt.getID() == MouseEvent.MOUSE_RELEASED) { - pointerMask = 0; - if ((modifiers & InputEvent.BUTTON2_MASK) != 0) { - modifiers &= ~ALT_MASK; - } else if ((modifiers & InputEvent.BUTTON3_MASK) != 0) { - modifiers &= ~META_MASK; - } - } - - eventBufLen = 0; - writeModifierKeyEvents(modifiers); - - int x = evt.getX(); - int y = evt.getY(); - - if (x < 0) x = 0; - if (y < 0) y = 0; - - eventBuf[eventBufLen++] = (byte) PointerEvent; - eventBuf[eventBufLen++] = (byte) pointerMask; - eventBuf[eventBufLen++] = (byte) ((x >> 8) & 0xff); - eventBuf[eventBufLen++] = (byte) (x & 0xff); - eventBuf[eventBufLen++] = (byte) ((y >> 8) & 0xff); - eventBuf[eventBufLen++] = (byte) (y & 0xff); - - // - // Always release all modifiers after an "up" event - // - - if (pointerMask == 0) { - writeModifierKeyEvents(0); - } - - os.write(eventBuf, 0, eventBufLen); - } - - - // - // Write a key event message. We may need to send modifier key events - // around it to set the correct modifier state. Also we need to translate - // from the Java key values to the X keysym values used by the RFB protocol. - // - public void writeKeyEvent(KeyEvent evt) throws IOException { - - int keyChar = evt.getKeyChar(); - - // - // Ignore event if only modifiers were pressed. - // - - // Some JVMs return 0 instead of CHAR_UNDEFINED in getKeyChar(). - if (keyChar == 0) - keyChar = KeyEvent.CHAR_UNDEFINED; - - if (keyChar == KeyEvent.CHAR_UNDEFINED) { - int code = evt.getKeyCode(); - if (code == KeyEvent.VK_CONTROL || code == KeyEvent.VK_SHIFT || - code == KeyEvent.VK_META || code == KeyEvent.VK_ALT) - - if(s_logger.isInfoEnabled()) - s_logger.info("Ignore sending of modifier key"); - return; - } - - // - // Key press or key release? - // - - boolean down = (evt.getID() == KeyEvent.KEY_PRESSED); - - int key; - if (evt.isActionKey()) { - - // - // An action key should be one of the following. - // If not then just ignore the event. - // - - switch(evt.getKeyCode()) { - case KeyEvent.VK_HOME: key = 0xff50; break; - case KeyEvent.VK_LEFT: key = 0xff51; break; - case KeyEvent.VK_UP: key = 0xff52; break; - case KeyEvent.VK_RIGHT: key = 0xff53; break; - case KeyEvent.VK_DOWN: key = 0xff54; break; - case KeyEvent.VK_PAGE_UP: key = 0xff55; break; - case KeyEvent.VK_PAGE_DOWN: key = 0xff56; break; - case KeyEvent.VK_END: key = 0xff57; break; - case KeyEvent.VK_INSERT: key = 0xff63; break; - case KeyEvent.VK_F1: key = 0xffbe; break; - case KeyEvent.VK_F2: key = 0xffbf; break; - case KeyEvent.VK_F3: key = 0xffc0; break; - case KeyEvent.VK_F4: key = 0xffc1; break; - case KeyEvent.VK_F5: key = 0xffc2; break; - case KeyEvent.VK_F6: key = 0xffc3; break; - case KeyEvent.VK_F7: key = 0xffc4; break; - case KeyEvent.VK_F8: key = 0xffc5; break; - case KeyEvent.VK_F9: key = 0xffc6; break; - case KeyEvent.VK_F10: key = 0xffc7; break; - case KeyEvent.VK_F11: key = 0xffc8; break; - case KeyEvent.VK_F12: key = 0xffc9; break; - - default: - if(s_logger.isInfoEnabled()) - s_logger.info("Ignore sending of un-supprted action key, key code: " + evt.getKeyCode()); - return; - } - - } else { - - // - // A "normal" key press. Ordinary ASCII characters go straight through. - // For CTRL-, CTRL is sent separately so just send . - // Backspace, tab, return, escape and delete have special keysyms. - // Anything else we ignore. - // - - key = keyChar; - - if (key < 0x20) { - boolean converted = false; - switch(key) { - case KeyEvent.VK_BACK_SPACE: key = 0xff08; converted = true; break; - case KeyEvent.VK_TAB: key = 0xff09; converted = true; break; - case KeyEvent.VK_ENTER: key = 0xff0d; converted = true; break; - case KeyEvent.VK_ESCAPE: key = 0xff1b; converted = true; break; - - // For KVM QEMU - case KeyEvent.VK_SHIFT: key = 0xffe1; converted = true; break; - } - - if(evt.isControlDown() && !converted) { - if(key != KeyEvent.VK_CONTROL) - key += 0x60; - } - - /* - if (evt.isControlDown()) { - if(key != KeyEvent.VK_CONTROL && key != KeyEvent.VK_ESCAPE) - key += 0x60; - else if(key == KeyEvent.VK_ESCAPE) - key = 0xff1b; - } else { - switch(key) { - case KeyEvent.VK_BACK_SPACE: key = 0xff08; break; - case KeyEvent.VK_TAB: key = 0xff09; break; - case KeyEvent.VK_ENTER: key = 0xff0d; break; - case KeyEvent.VK_ESCAPE: key = 0xff1b; break; - } - } - */ - - } else if (key == 0x7f) { - // Delete - key = 0xffff; - } else if (key > 0xff) { - // JDK1.1 on X incorrectly passes some keysyms straight through, - // so we do too. JDK1.1.4 seems to have fixed this. - // The keysyms passed are 0xff00 .. XK_BackSpace .. XK_Delete - // Also, we pass through foreign currency keysyms (0x20a0..0x20af). - if ((key < 0xff00 || key > 0xffff) && - !(key >= 0x20a0 && key <= 0x20af)) { - - if(s_logger.isInfoEnabled()) - s_logger.info("Ignore sending of un-supprted X keys, key : " + key); - return; - } - } - } - - // Fake keyPresses for keys that only generates keyRelease events - if ((key == 0xe5) || (key == 0xc5) || // XK_aring / XK_Aring - (key == 0xe4) || (key == 0xc4) || // XK_adiaeresis / XK_Adiaeresis - (key == 0xf6) || (key == 0xd6) || // XK_odiaeresis / XK_Odiaeresis - (key == 0xa7) || (key == 0xbd) || // XK_section / XK_onehalf - (key == 0xa3)) { // XK_sterling - // Make sure we do not send keypress events twice on platforms - // with correct JVMs (those that actually report KeyPress for all - // keys) - if (down) - brokenKeyPressed = true; - - if (!down && !brokenKeyPressed) { - // We've got a release event for this key, but haven't received - // a press. Fake it. - eventBufLen = 0; - writeModifierKeyEvents(evt.getModifiers()); - writeKeyEvent(key, true); - os.write(eventBuf, 0, eventBufLen); - } - - if (!down) - brokenKeyPressed = false; - } - - // special need for KVM QEMU - if(key == KeyEvent.VK_QUOTE) - key = 0x22; - - if(s_logger.isTraceEnabled()) - s_logger.trace("Write key event, key: " + key + ", down: " + down + ", modifiers: " + evt.getModifiers()); - - eventBufLen = 0; - writeModifierKeyEvents(evt.getModifiers()); - writeKeyEvent(key, down); - - // Always release all modifiers after an "up" event - if (!down) - writeModifierKeyEvents(0); - - os.write(eventBuf, 0, eventBufLen); - } - - - - // - // Add a raw key event with the given X keysym to eventBuf. - // - - public void writeKeyEvent(int keysym, boolean down) { - eventBuf[eventBufLen++] = (byte) KeyboardEvent; - eventBuf[eventBufLen++] = (byte) (down ? 1 : 0); - eventBuf[eventBufLen++] = (byte) 0; - eventBuf[eventBufLen++] = (byte) 0; - eventBuf[eventBufLen++] = (byte) ((keysym >> 24) & 0xff); - eventBuf[eventBufLen++] = (byte) ((keysym >> 16) & 0xff); - eventBuf[eventBufLen++] = (byte) ((keysym >> 8) & 0xff); - eventBuf[eventBufLen++] = (byte) (keysym & 0xff); - - if(s_logger.isTraceEnabled()) - s_logger.trace("Send keyboard event on wire, keysym: 0x" + Integer.toHexString(keysym) + ", down: " + down); - } - - public void flushEventBuffer() throws IOException { - os.write(eventBuf, 0, eventBufLen); - eventBufLen = 0; - } - - // - // Write key events to set the correct modifier state. - // - int oldModifiers = 0; - - void writeModifierKeyEvents(int newModifiers) { - if ((newModifiers & CTRL_MASK) != (oldModifiers & CTRL_MASK)) - writeKeyEvent(0xffe3, (newModifiers & CTRL_MASK) != 0); - - if ((newModifiers & SHIFT_MASK) != (oldModifiers & SHIFT_MASK)) - writeKeyEvent(0xffe1, (newModifiers & SHIFT_MASK) != 0); - - if ((newModifiers & META_MASK) != (oldModifiers & META_MASK)) - writeKeyEvent(0xffe7, (newModifiers & META_MASK) != 0); - - if ((newModifiers & ALT_MASK) != (oldModifiers & ALT_MASK)) - writeKeyEvent(0xffe9, (newModifiers & ALT_MASK) != 0); - - oldModifiers = newModifiers; - } - - // - // Compress and write the data into the recorded session file. This - // method assumes the recording is on (rec != null). - // - public void recordCompressedData(byte[] data, int off, int len) throws IOException { - Deflater deflater = new Deflater(); - deflater.setInput(data, off, len); - int bufSize = len + len / 100 + 12; - byte[] buf = new byte[bufSize]; - deflater.finish(); - int compressedSize = deflater.deflate(buf); - recordCompactLen(compressedSize); - rec.write(buf, 0, compressedSize); - } - - public void recordCompressedData(byte[] data) throws IOException { - recordCompressedData(data, 0, data.length); - } - - // - // Write an integer in compact representation (1..3 bytes) into the - // recorded session file. This method assumes the recording is on - // (rec != null). - // - - public void recordCompactLen(int len) throws IOException { - byte[] buf = new byte[3]; - int bytes = 0; - buf[bytes++] = (byte)(len & 0x7F); - if (len > 0x7F) { - buf[bytes-1] |= 0x80; - buf[bytes++] = (byte)(len >> 7 & 0x7F); - if (len > 0x3FFF) { - buf[bytes-1] |= 0x80; - buf[bytes++] = (byte)(len >> 14 & 0xFF); - } - } - rec.write(buf, 0, bytes); - } - - public void startTiming() { - timing = true; - - // Carry over up to 1s worth of previous rate for smoothing. - - if (timeWaitedIn100us > 10000) { - timedKbits = timedKbits * 10000 / timeWaitedIn100us; - timeWaitedIn100us = 10000; - } - } - - public void stopTiming() { - timing = false; - if (timeWaitedIn100us < timedKbits/2) - timeWaitedIn100us = timedKbits/2; // upper limit 20Mbit/s - } - - public long kbitsPerSecond() { - return timedKbits * 10000 / timeWaitedIn100us; - } - - public long timeWaited() { - return timeWaitedIn100us; - } - - public void readFully(byte b[]) throws IOException { - readFully(b, 0, b.length); - } - - public void readFully(byte b[], int off, int len) throws IOException { - long before = 0; - if (timing) - before = System.currentTimeMillis(); - - is.readFully(b, off, len); - - if (timing) { - long after = System.currentTimeMillis(); - long newTimeWaited = (after - before) * 10; - int newKbits = len * 8 / 1000; - - // limit rate to between 10kbit/s and 40Mbit/s - - if (newTimeWaited > newKbits*1000) newTimeWaited = newKbits*1000; - if (newTimeWaited < newKbits/4) newTimeWaited = newKbits/4; - - timeWaitedIn100us += newTimeWaited; - timedKbits += newKbits; - } - } -} diff --git a/console/src/com/cloud/console/RfbProtoAdapter.java b/console/src/com/cloud/console/RfbProtoAdapter.java deleted file mode 100644 index 06d581e1482..00000000000 --- a/console/src/com/cloud/console/RfbProtoAdapter.java +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.console; - -import java.io.IOException; -import java.io.OutputStream; -import java.net.Socket; - -public interface RfbProtoAdapter { - Socket createConnection(String host, int port) throws IOException; - void writeInit(OutputStream os) throws IOException; - void swapMouseButton(Integer[] masks); -} diff --git a/console/src/com/cloud/console/RfbViewer.java b/console/src/com/cloud/console/RfbViewer.java deleted file mode 100644 index 6f88bf65117..00000000000 --- a/console/src/com/cloud/console/RfbViewer.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.console; - -import java.awt.Dimension; -import java.io.IOException; - -public interface RfbViewer { - boolean isProxy(); - boolean hasClientConnection(); - - RfbProto getRfb(); - Dimension getScreenSize(); - Dimension getFrameSize(); - - int getScalingFactor(); - int getCursorScaleFactor(); - boolean ignoreCursorUpdate(); - int getDeferCursorUpdateTimeout(); - int getDeferScreenUpdateTimeout(); - int getDeferUpdateRequestTimeout(); - - int setPixelFormat(RfbProto rfb) throws IOException; - - void onInputEnabled(boolean enable); - - void onFramebufferSizeChange(int w, int h); - void onFramebufferUpdate(int x, int y, int w, int h); - void onFramebufferCursorMove(int x, int y); - void onFramebufferCursorShapeChange(int encodingType, - int xhot, int yhot, int width, int height, byte[] cursorData); - - void onDesktopResize(); - void onFrameResize(Dimension newSize); - void onDisconnectMessage(); - void onBellMessage(); - - void onPreProtocolProcess(byte[] bs) throws IOException; - boolean onPostFrameBufferUpdateProcess(boolean cursorPosReceived) throws IOException; - void onProtocolProcessException(IOException e); -} diff --git a/console/src/com/cloud/console/SessionRecorder.java b/console/src/com/cloud/console/SessionRecorder.java deleted file mode 100644 index fe49944ea8b..00000000000 --- a/console/src/com/cloud/console/SessionRecorder.java +++ /dev/null @@ -1,196 +0,0 @@ -// -// Copyright (C) 2002 Constantin Kaplinsky. All Rights Reserved. -// -// This is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this software; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. -// - -// -// SessionRecorder is a class to write FBS (FrameBuffer Stream) files. -// FBS files are used to save RFB sessions for later playback. -// - -// repackage it to VMOps common packaging structure -package com.cloud.console; - -import java.io.*; - -public class SessionRecorder { - - protected FileOutputStream f; - protected DataOutputStream df; - protected long startTime, lastTimeOffset; - - protected byte[] buffer; - protected int bufferSize; - protected int bufferBytes; - - public SessionRecorder(String name, int bufsize) throws IOException { - f = new FileOutputStream(name); - df = new DataOutputStream(f); - startTime = System.currentTimeMillis(); - lastTimeOffset = 0; - - bufferSize = bufsize; - bufferBytes = 0; - buffer = new byte[bufferSize]; - } - - public SessionRecorder(String name) throws IOException { - this(name, 65536); - } - - // - // Close the file, free resources. - // - - public void close() throws IOException { - try { - flush(); - } catch (IOException e) { - } - - df = null; - f.close(); - f = null; - buffer = null; - } - - // - // Write the FBS file header as defined in the rfbproxy utility. - // - - public void writeHeader() throws IOException { - df.write("FBS 001.000\n".getBytes()); - } - - // - // Write one byte. - // - - public void writeByte(int b) throws IOException { - prepareWriting(); - buffer[bufferBytes++] = (byte)b; - } - - // - // Write 16-bit value, big-endian. - // - - public void writeShortBE(int v) throws IOException { - prepareWriting(); - buffer[bufferBytes++] = (byte)(v >> 8); - buffer[bufferBytes++] = (byte)v; - } - - // - // Write 32-bit value, big-endian. - // - - public void writeIntBE(int v) throws IOException { - prepareWriting(); - buffer[bufferBytes] = (byte)(v >> 24); - buffer[bufferBytes + 1] = (byte)(v >> 16); - buffer[bufferBytes + 2] = (byte)(v >> 8); - buffer[bufferBytes + 3] = (byte)v; - bufferBytes += 4; - } - - // - // Write 16-bit value, little-endian. - // - - public void writeShortLE(int v) throws IOException { - prepareWriting(); - buffer[bufferBytes++] = (byte)v; - buffer[bufferBytes++] = (byte)(v >> 8); - } - - // - // Write 32-bit value, little-endian. - // - - public void writeIntLE(int v) throws IOException { - prepareWriting(); - buffer[bufferBytes] = (byte)v; - buffer[bufferBytes + 1] = (byte)(v >> 8); - buffer[bufferBytes + 2] = (byte)(v >> 16); - buffer[bufferBytes + 3] = (byte)(v >> 24); - bufferBytes += 4; - } - - // - // Write byte arrays. - // - - public void write(byte b[], int off, int len) throws IOException { - prepareWriting(); - while (len > 0) { - if (bufferBytes > bufferSize - 4) - flush(false); - - int partLen; - if (bufferBytes + len > bufferSize) { - partLen = bufferSize - bufferBytes; - } else { - partLen = len; - } - System.arraycopy(b, off, buffer, bufferBytes, partLen); - bufferBytes += partLen; - off += partLen; - len -= partLen; - } - } - - public void write(byte b[]) throws IOException { - write(b, 0, b.length); - } - - // - // Flush the output. This method saves buffered data in the - // underlying file object adding data sizes and timestamps. If the - // updateTimeOffset is set to false, then the current time offset - // will not be changed for next write operation. - // - - public void flush(boolean updateTimeOffset) throws IOException { - if (bufferBytes > 0) { - df.writeInt(bufferBytes); - df.write(buffer, 0, (bufferBytes + 3) & 0x7FFFFFFC); - df.writeInt((int)lastTimeOffset); - bufferBytes = 0; - if (updateTimeOffset) - lastTimeOffset = -1; - } - } - - public void flush() throws IOException { - flush(true); - } - - // - // Before writing any data, remember time offset and flush the - // buffer before it becomes full. - // - - protected void prepareWriting() throws IOException { - if (lastTimeOffset == -1) - lastTimeOffset = System.currentTimeMillis() - startTime; - if (bufferBytes > bufferSize - 4) - flush(false); - } - -} - diff --git a/console/src/com/cloud/console/SplitInputStream.java b/console/src/com/cloud/console/SplitInputStream.java deleted file mode 100644 index 4bb5bb95bf1..00000000000 --- a/console/src/com/cloud/console/SplitInputStream.java +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// repackage it to VMOps common packaging structure -package com.cloud.console; - -import java.io.*; - -public class SplitInputStream extends FilterInputStream { - ByteArrayOutputStream bo; - public SplitInputStream(InputStream in) { - super(in); - } - public int read() throws IOException { - int b = super.read(); - if (b >= 0 && bo != null) { - bo.write(b); - } - return b; - } - public int read(byte b[]) throws IOException { - return read(b, 0, b.length); - } - public int read(byte b[], int off, int len) throws IOException { - int res = super.read(b, off, len); - if (res > 0 && bo != null) { - bo.write(b, off, res); - } - return res; - } - public long skip(long n) throws IOException { - long res = super.skip(n); - if (res > 0 && bo != null) { - byte[] b = new byte[(int)res]; - bo.write(b, 0, (int)res); - } - return res; - } - public int available() throws IOException { - return super.available(); - } - public void close() throws IOException { - super.close(); - } - public void mark(int readlimit) { - super.mark(readlimit); - } - public void reset() throws IOException { - super.reset(); - } - public boolean markSupported() { - return false; - } - public void setSplit() { - bo = new ByteArrayOutputStream(); - } - public byte[] getSplit() { - if (bo == null) { - return null; - } - byte[] res = bo.toByteArray(); - bo = null; - return res; - } - public byte[] getSplitData() { - if(bo == null) - return null; - - return bo.toByteArray(); - } -} diff --git a/console/src/com/cloud/console/TileInfo.java b/console/src/com/cloud/console/TileInfo.java deleted file mode 100644 index ef917f32086..00000000000 --- a/console/src/com/cloud/console/TileInfo.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.console; - -import java.awt.Rectangle; - -public class TileInfo { - private int row; - private int col; - private Rectangle tileRect; - - public TileInfo(int row, int col, Rectangle tileRect) { - this.row = row; - this.col = col; - this.tileRect = tileRect; - } - - public int getRow() { - return row; - } - - public void setRow(int row) { - this.row = row; - } - - public int getCol() { - return col; - } - - public void setCol(int col) { - this.col = col; - } - - public Rectangle getTileRect() { - return tileRect; - } - - public void setTileRect(Rectangle tileRect) { - this.tileRect = tileRect; - } -} diff --git a/console/src/com/cloud/console/TileTracker.java b/console/src/com/cloud/console/TileTracker.java deleted file mode 100644 index 8cd02794a6c..00000000000 --- a/console/src/com/cloud/console/TileTracker.java +++ /dev/null @@ -1,271 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.console; - -import java.awt.Rectangle; -import java.util.ArrayList; -import java.util.List; - -public class TileTracker { - - // 2 dimension tile status snapshot, a true value means the corresponding tile has been invalidated - private boolean[][] snapshot; - - private int tileWidth = 0; - private int tileHeight = 0; - private int trackWidth = 0; - private int trackHeight = 0; - - public TileTracker() { - } - - public int getTileWidth() { - return tileWidth; - } - - public void setTileWidth(int tileWidth) { - this.tileWidth = tileWidth; - } - - public int getTileHeight() { - return tileHeight; - } - - public void setTileHeight(int tileHeight) { - this.tileHeight = tileHeight; - } - - public int getTrackWidth() { - return trackWidth; - } - - public void setTrackWidth(int trackWidth) { - this.trackWidth = trackWidth; - } - - public int getTrackHeight() { - return trackHeight; - } - - public void setTrackHeight(int trackHeight) { - this.trackHeight = trackHeight; - } - - public void initTracking(int tileWidth, int tileHeight, int trackWidth, int trackHeight) { - assert(tileWidth > 0); - assert(tileHeight > 0); - assert(trackWidth > 0); - assert(trackHeight > 0); - assert(tileWidth <= trackWidth); - assert(tileHeight <= trackHeight); - - this.tileWidth = tileWidth; - this.tileHeight = tileHeight; - this.trackWidth = trackWidth; - this.trackHeight = trackHeight; - - int cols = getTileCols(); - int rows = getTileRows(); - snapshot = new boolean[rows][cols]; - for(int i = 0; i < rows; i++) - for(int j = 0; j < cols; j++) - snapshot[i][j] = false; - } - - public synchronized void resize(int trackWidth, int trackHeight) { - assert(tileWidth > 0); - assert(tileHeight > 0); - assert(trackWidth > 0); - assert(trackHeight > 0); - - this.trackWidth = trackWidth; - this.trackHeight = trackHeight; - - int cols = getTileCols(); - int rows = getTileRows(); - snapshot = new boolean[rows][cols]; - for(int i = 0; i < rows; i++) - for(int j = 0; j < cols; j++) - snapshot[i][j] = true; - } - - public void invalidate(Rectangle rect) { - setTileFlag(rect, true); - } - - public void validate(Rectangle rect) { - setTileFlag(rect, false); - } - - public List scan(boolean init) { - List l = new ArrayList(); - - synchronized(this) { - for(int i = 0; i < getTileRows(); i++) { - for(int j = 0; j < getTileCols(); j++) { - if(init || snapshot[i][j]) { - Rectangle rect = new Rectangle(); - rect.y = i*tileHeight; - rect.x = j*tileWidth; - rect.width = Math.min(trackWidth - rect.x, tileWidth); - rect.height = Math.min(trackHeight - rect.y, tileHeight); - - l.add(new TileInfo(i, j, rect)); - snapshot[i][j] = false; - } - } - } - - return l; - } - } - - public boolean hasFullCoverage() { - synchronized(this) { - for(int i = 0; i < getTileRows(); i++) { - for(int j = 0; j < getTileCols(); j++) { - if(!snapshot[i][j]) - return false; - } - } - } - return true; - } - - - - public void initCoverageTest() { - synchronized(this) { - for(int i = 0; i < getTileRows(); i++) { - for(int j = 0; j < getTileCols(); j++) { - snapshot[i][j] = false; - } - } - } - } - - // listener will be called while holding the object lock, use it - // with care to avoid deadlock condition being formed - public synchronized void scan(int nStartRow, int nStartCol, ITileScanListener listener) { - assert(listener != null); - - int cols = getTileCols(); - int rows = getTileRows(); - - nStartRow = nStartRow % rows; - nStartCol = nStartCol % cols; - - int nPos = nStartRow*cols + nStartCol; - int nUnits = rows*cols; - int nStartPos = nPos; - int nRow; - int nCol; - do { - nRow = nPos / cols; - nCol = nPos % cols; - - if(snapshot[nRow][nCol]) { - int nEndCol = nCol; - for(; nEndCol < cols && snapshot[nRow][nEndCol]; nEndCol++) { - snapshot[nRow][nEndCol] = false; - } - - Rectangle rect = new Rectangle(); - rect.y = nRow*tileHeight; - rect.height = tileHeight; - rect.x = nCol*tileWidth; - rect.width = (nEndCol - nCol)*tileWidth; - - if(!listener.onTileChange(rect, nRow, nEndCol)) - break; - } - - nPos = (nPos + 1) % nUnits; - } while(nPos != nStartPos); - } - - public void capture(ITileScanListener listener) { - assert(listener != null); - - int cols = getTileCols(); - int rows = getTileRows(); - - RegionClassifier classifier = new RegionClassifier(); - int left, top, right, bottom; - - synchronized(this) { - for(int i = 0; i < rows; i++) { - top = i*tileHeight; - bottom = Math.min(top + tileHeight, trackHeight); - for(int j = 0; j < cols; j++) { - left = j*tileWidth; - right = Math.min(left + tileWidth, trackWidth); - - if(snapshot[i][j]) { - snapshot[i][j] = false; - classifier.add(new Rectangle(left, top, right - left, bottom - top)); - } - } - } - } - listener.onRegionChange(classifier.getRegionList()); - } - - private synchronized void setTileFlag(Rectangle rect, boolean flag) { - int nStartTileRow; - int nStartTileCol; - int nEndTileRow; - int nEndTileCol; - - int cols = getTileCols(); - int rows = getTileRows(); - - if(rect != null) { - nStartTileRow = Math.min(getTileYPos(rect.y), rows - 1); - nStartTileCol = Math.min(getTileXPos(rect.x), cols - 1); - nEndTileRow = Math.min(getTileYPos(rect.y + rect.height - 1), rows -1); - nEndTileCol = Math.min(getTileXPos(rect.x + rect.width - 1), cols -1); - } else { - nStartTileRow = 0; - nStartTileCol = 0; - nEndTileRow = rows - 1; - nEndTileCol = cols - 1; - } - - for(int i = nStartTileRow; i <= nEndTileRow; i++) - for(int j = nStartTileCol; j <= nEndTileCol; j++) - snapshot[i][j] = flag; - } - - private int getTileRows() { - return (trackHeight + tileHeight - 1) / tileHeight; - } - - private int getTileCols() { - return (trackWidth + tileWidth - 1) / tileWidth; - } - - private int getTileXPos(int x) { - return x / tileWidth; - } - - public int getTileYPos(int y) { - return y / tileHeight; - } -} diff --git a/console/src/com/cloud/console/ZlibInStream.java b/console/src/com/cloud/console/ZlibInStream.java deleted file mode 100644 index 1ef5ed15763..00000000000 --- a/console/src/com/cloud/console/ZlibInStream.java +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// repackage it to VMOps common packaging structure -package com.cloud.console; - -// -// A ZlibInStream reads from a zlib.io.InputStream -// - -public class ZlibInStream extends InStream { - - static final int defaultBufSize = 16384; - - public ZlibInStream(int bufSize_) { - bufSize = bufSize_; - b = new byte[bufSize]; - ptr = end = ptrOffset = 0; - inflater = new java.util.zip.Inflater(); - } - - public ZlibInStream() { this(defaultBufSize); } - - public void setUnderlying(InStream is, int bytesIn_) { - underlying = is; - bytesIn = bytesIn_; - ptr = end = 0; - } - - public void reset() throws Exception { - ptr = end = 0; - if (underlying == null) return; - - while (bytesIn > 0) { - decompress(); - end = 0; // throw away any data - } - underlying = null; - } - - public int pos() { return ptrOffset + ptr; } - - protected int overrun(int itemSize, int nItems) throws Exception { - if (itemSize > bufSize) - throw new Exception("ZlibInStream overrun: max itemSize exceeded"); - if (underlying == null) - throw new Exception("ZlibInStream overrun: no underlying stream"); - - if (end - ptr != 0) - System.arraycopy(b, ptr, b, 0, end - ptr); - - ptrOffset += ptr; - end -= ptr; - ptr = 0; - - while (end < itemSize) { - decompress(); - } - - if (itemSize * nItems > end) - nItems = end / itemSize; - - return nItems; - } - - // decompress() calls the decompressor once. Note that this won't - // necessarily generate any output data - it may just consume some input - // data. Returns false if wait is false and we would block on the underlying - // stream. - - private void decompress() throws Exception { - try { - underlying.check(1); - int avail_in = underlying.getend() - underlying.getptr(); - if (avail_in > bytesIn) - avail_in = bytesIn; - - if (inflater.needsInput()) { - inflater.setInput(underlying.getbuf(), underlying.getptr(), avail_in); - } - - int n = inflater.inflate(b, end, bufSize - end); - - end += n; - if (inflater.needsInput()) { - bytesIn -= avail_in; - underlying.setptr(underlying.getptr() + avail_in); - } - } catch (java.util.zip.DataFormatException e) { - throw new Exception("ZlibInStream: inflate failed"); - } - } - - private InStream underlying; - private int bufSize; - private int ptrOffset; - private java.util.zip.Inflater inflater; - private int bytesIn; -}