mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Make the final switch on console proxy refactoring work. new VNC engine will be in use after this commit
Reviewed-By: Kelven
This commit is contained in:
parent
27c77133d4
commit
fe950868c3
@ -91,16 +91,10 @@
|
||||
<property name="scripts.dir" location="${base.dir}/scripts" />
|
||||
<property name="scripts.target.dir" location="${target.dir}/scripts"/>
|
||||
|
||||
<!-- directories for console proxy & applet code compilation-->
|
||||
<property name="console-common.dir" location="${base.dir}/console" />
|
||||
<property name="console-common.dist.dir" location="${dist.dir}/console-common" />
|
||||
|
||||
<!-- directories for console proxy compilation-->
|
||||
<property name="console-proxy.dir" location="${base.dir}/console-proxy" />
|
||||
<property name="console-proxy.dist.dir" location="${dist.dir}/console-proxy" />
|
||||
|
||||
<property name="console-viewer.dir" location="${base.dir}/console-viewer" />
|
||||
<property name="console-viewer.dist.dir" location="${dist.dir}/console-viewer" />
|
||||
|
||||
<property name="tools.dir" location="${base.dir}/tools" />
|
||||
<!-- <property name="antcontrib.dir" location="${tools.dir}/tools/ant/apache-ant-1.8.0/lib" />-->
|
||||
<property name="deploy.dir" location="${build.dir}/deploy" />
|
||||
@ -118,7 +112,6 @@
|
||||
<property name="utils.jar" value="cloud-utils.jar" />
|
||||
<property name="server.jar" value="cloud-server.jar" />
|
||||
<property name="agent.jar" value="cloud-agent.jar" />
|
||||
<property name="console-common.jar" value="cloud-console-common.jar" />
|
||||
<property name="console-proxy.jar" value="cloud-console-proxy.jar" />
|
||||
<property name="api.jar" value="cloud-api.jar"/>
|
||||
<property name="vmware-base.jar" value="cloud-vmware-base.jar" />
|
||||
@ -317,19 +310,11 @@
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<path id="console-common.classpath">
|
||||
<path refid="deps.classpath" />
|
||||
<path refid="dist.classpath" />
|
||||
</path>
|
||||
<target name="compile-console-common" depends="-init" description="Compile the console-common jar that is shared.">
|
||||
<compile-java jar.name="${console-common.jar}" top.dir="${console-common.dir}" classpath="console-common.classpath" />
|
||||
</target>
|
||||
|
||||
<path id="console-proxy.classpath">
|
||||
<path refid="deps.classpath" />
|
||||
<path refid="dist.classpath" />
|
||||
</path>
|
||||
<target name="compile-console-proxy" depends="-init, compile-console-common" description="Compile the console proxy.">
|
||||
<target name="compile-console-proxy" depends="-init" description="Compile the console proxy.">
|
||||
<compile-java jar.name="${console-proxy.jar}" top.dir="${console-proxy.dir}" classpath="console-proxy.classpath" >
|
||||
<include-files>
|
||||
<fileset dir="${console-proxy.dir}/certs">
|
||||
@ -364,7 +349,6 @@
|
||||
<copy todir="${copyto.dir}">
|
||||
<fileset dir="${jar.dir}">
|
||||
<include name="cloud-console-proxy.jar" />
|
||||
<include name="cloud-console-common.jar" />
|
||||
</fileset>
|
||||
</copy>
|
||||
<copy todir="${copyto.dir}/conf">
|
||||
@ -381,11 +365,6 @@
|
||||
<include name="*.cur" />
|
||||
</fileset>
|
||||
</copy>
|
||||
<copy todir="${copyto.dir}/applet">
|
||||
<fileset dir="${jar.dir}">
|
||||
<include name="VMOpsConsoleApplet.jar" />
|
||||
</fileset>
|
||||
</copy>
|
||||
<copy todir="${copyto.dir}/js">
|
||||
<fileset dir="${console-proxy.dir}/js">
|
||||
<include name="*.js" />
|
||||
@ -410,7 +389,7 @@
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<target name="build-console-proxy" depends="-init, build-console-viewer, compile-console-proxy, copy-console-proxy">
|
||||
<target name="build-console-proxy" depends="-init, compile-console-proxy, copy-console-proxy">
|
||||
<copy todir="${console-proxy.dist.dir}">
|
||||
<fileset dir="${console-proxy.dir}/scripts">
|
||||
</fileset>
|
||||
@ -421,36 +400,6 @@
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<path id="console-viewer.classpath">
|
||||
<path refid="deps.classpath" />
|
||||
<path refid="dist.classpath" />
|
||||
</path>
|
||||
<target name="build-console-viewer" depends="-init" description="Compile console viewer applet">
|
||||
|
||||
<mkdir dir="${classes.dir}/console-viewer" />
|
||||
<depend srcdir="${console-viewer.dir}/src" destdir="${classes.dir}/console-viewer" cache="${dep.cache.dir}" />
|
||||
|
||||
<javac srcdir="${console-common.dir}/src" debug="${debug}" debuglevel="${debuglevel}" deprecation="${deprecation}" destdir="${classes.dir}/console-viewer" source="${source.compat.version}" target="${target.compat.version}" includeantruntime="false">
|
||||
<classpath refid="console-viewer.classpath" />
|
||||
<exclude name="${compile.java.exclude.files}" />
|
||||
<compilerarg value="-Xlint:all" />
|
||||
</javac>
|
||||
|
||||
<javac srcdir="${console-viewer.dir}/src" debug="${debug}" debuglevel="${debuglevel}" deprecation="${deprecation}" destdir="${classes.dir}/console-viewer" source="${source.compat.version}" target="${target.compat.version}" includeantruntime="false">
|
||||
<classpath refid="console-viewer.classpath" />
|
||||
<exclude name="${compile.java.exclude.files}" />
|
||||
<compilerarg value="-Xlint:all" />
|
||||
</javac>
|
||||
<jar jarfile="${jar.dir}/VMOpsConsoleApplet.jar" basedir="${classes.dir}/console-viewer">
|
||||
<manifest>
|
||||
<attribute name="Class-Path" value="" />
|
||||
<attribute name="Built-By" value="${built.by}" />
|
||||
<attribute name="Manifest-Version" value="1.0" />
|
||||
<attribute name="Main-Class" value="ConsoleViewer" />
|
||||
</manifest>
|
||||
</jar>
|
||||
</target>
|
||||
|
||||
<path id="agent.classpath">
|
||||
<path refid="deps.classpath" />
|
||||
<fileset dir="${target.dir}">
|
||||
|
||||
@ -283,7 +283,7 @@
|
||||
</target>
|
||||
|
||||
<!-- The following target is OBSOLETE. If you need to add a jar file / target, go to the function def runant(target): in wscrpit_build, and list the jar file and the target in the appropriate places -->
|
||||
<target name="sendjarfiles" depends="compile-utils, compile-core, compile-server, compile-agent, compile-console-common, compile-console-proxy, build-console-viewer">
|
||||
<target name="sendjarfiles" depends="compile-utils, compile-core, compile-server, compile-agent, compile-console-proxy">
|
||||
<copy todir="${waf.artifacts}">
|
||||
<fileset dir="${target.dir}/jar"/>
|
||||
</copy>
|
||||
|
||||
@ -3,6 +3,5 @@
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/deps"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/console"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
@ -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;
|
||||
|
||||
/**
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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;
|
||||
|
||||
/**
|
||||
|
||||
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
@ -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;
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
package com.cloud.consoleproxy;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Hashtable;
|
||||
|
||||
/*
|
||||
public class ConsoleProxyStatus {
|
||||
ArrayList<ConsoleProxyConnection> connections;
|
||||
public ConsoleProxyStatus() {
|
||||
}
|
||||
public void setConnections(Hashtable<String, ConsoleProxyViewer> connMap) {
|
||||
ArrayList<ConsoleProxyConnection> conns = new ArrayList<ConsoleProxyConnection>();
|
||||
Enumeration<String> 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() {
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
@ -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;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
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<String, ConsoleProxyViewer> connectionMap = new Hashtable<String, ConsoleProxyViewer>();
|
||||
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<String, ConsoleProxyViewer> 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<String, ConsoleProxyViewer> connMap;
|
||||
long lastLogScan = 0L;
|
||||
|
||||
public ViewerGCThread(Hashtable<String, ConsoleProxyViewer> 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<String> 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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
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;
|
||||
}
|
||||
@ -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 <code>BuffereImageCanvas</code> component represents frame buffer image on the
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/console"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
@ -1,17 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>console-viewer</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@ -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 %*
|
||||
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -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) {}
|
||||
*/
|
||||
}
|
||||
@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
@ -1,48 +0,0 @@
|
||||
<html>
|
||||
<title>Console Viewer Applet</title>
|
||||
<body>
|
||||
|
||||
<script language="javascript">
|
||||
|
||||
function sendCtrlAltDel() {
|
||||
document.TheApplet.sendCtrlAltDel();
|
||||
}
|
||||
|
||||
</script>
|
||||
<div height="40" width="100%">
|
||||
<input type="button" value="Ctrl-Alt-Del" onclick="sendCtrlAltDel();"></input>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
<div>
|
||||
<embed
|
||||
name="TheApplet"
|
||||
code="com.vmops.consoleviewer.ConsoleApplet.class"
|
||||
type="application/x-java-applet"
|
||||
width= "1600" height="1200"
|
||||
archive="https://127-0-0-1.realhostip.com:8000/getjar/VMOpsConsoleApplet.jar"
|
||||
HOST="192.168.1.220"
|
||||
PORT="5919"
|
||||
PROXYHOST="127-0-0-1.realhostip.com"
|
||||
PROXYPORT="5999"
|
||||
SID=" dbbc5ca902413ca2"
|
||||
/>
|
||||
</div>
|
||||
-->
|
||||
|
||||
<object
|
||||
name="TheApplet"
|
||||
classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
|
||||
codebase="http://java.sun.com/update/1.6.0/jinstall-6u10-windows-i586.cab#Version=1,6,0,0"
|
||||
width="1600" height="1200" border=0 hspace=0 vspace=0>
|
||||
<PARAM name="CODE" value="com.vmops.consoleviewer.ConsoleApplet.class">
|
||||
<PARAM name="ARCHIVE" value="https://127-0-0-1.realhostip.com:8000/getjar/VMOpsConsoleApplet.jar">
|
||||
<PARAM name="HOST" value="192.168.1.220">
|
||||
<PARAM name="PORT" value="5919">
|
||||
<PARAM name="PROXYHOST" value="127-0-0-1.realhostip.com">
|
||||
<PARAM name="PROXYPORT" value="5999">
|
||||
<PARAM name="SID" value="dbbc5ca902413ca2">
|
||||
</object>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
@ -1,17 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>console</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -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) {}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 <dzimm@widget.com>, 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 <jef@acme.com>. 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.
|
||||
// <P>
|
||||
// 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.
|
||||
// <P>
|
||||
// Most of this code is by Dave Zimmerman <dzimm@widget.com>, and is
|
||||
// Copyright (c) 1996 Widget Workshop, Inc. See the source file for details.
|
||||
// <P>
|
||||
// <A HREF="/resources/classes/Acme/Crypto/DesCipher.java">Fetch the software.</A><BR>
|
||||
// <A HREF="/resources/classes/Acme.tar.Z">Fetch the entire Acme package.</A>
|
||||
// <P>
|
||||
// @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];
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
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<Region> regionList);
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
package com.cloud.console;
|
||||
|
||||
public interface LoggerFactory {
|
||||
Logger getLogger(Class<?> clazz);
|
||||
}
|
||||
@ -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");
|
||||
}
|
||||
}
|
||||
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
package com.cloud.console;
|
||||
|
||||
import java.awt.Rectangle;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class Region {
|
||||
private Rectangle bound;
|
||||
private List<Rectangle> rectList;
|
||||
|
||||
public Region() {
|
||||
bound = new Rectangle(0, 0, 0, 0);
|
||||
rectList = new ArrayList<Rectangle>();
|
||||
}
|
||||
|
||||
public Region(Rectangle rect) {
|
||||
bound = new Rectangle(rect.x, rect.y, rect.width, rect.height);
|
||||
rectList = new ArrayList<Rectangle>();
|
||||
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<Rectangle> 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;
|
||||
}
|
||||
}
|
||||
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
package com.cloud.console;
|
||||
|
||||
import java.awt.Rectangle;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class RegionClassifier {
|
||||
private List<Region> regionList;
|
||||
|
||||
public RegionClassifier() {
|
||||
regionList = new ArrayList<Region>();
|
||||
}
|
||||
|
||||
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<Region> getRegionList() {
|
||||
return regionList;
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
regionList.clear();
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
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);
|
||||
}
|
||||
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
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);
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
// 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();
|
||||
}
|
||||
}
|
||||
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
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<TileInfo> scan(boolean init) {
|
||||
List<TileInfo> l = new ArrayList<TileInfo>();
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user