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.dir" location="${base.dir}/scripts" />
|
||||||
<property name="scripts.target.dir" location="${target.dir}/scripts"/>
|
<property name="scripts.target.dir" location="${target.dir}/scripts"/>
|
||||||
|
|
||||||
<!-- directories for console proxy & applet code compilation-->
|
<!-- directories for console proxy compilation-->
|
||||||
<property name="console-common.dir" location="${base.dir}/console" />
|
|
||||||
<property name="console-common.dist.dir" location="${dist.dir}/console-common" />
|
|
||||||
|
|
||||||
<property name="console-proxy.dir" location="${base.dir}/console-proxy" />
|
<property name="console-proxy.dir" location="${base.dir}/console-proxy" />
|
||||||
<property name="console-proxy.dist.dir" location="${dist.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="tools.dir" location="${base.dir}/tools" />
|
||||||
<!-- <property name="antcontrib.dir" location="${tools.dir}/tools/ant/apache-ant-1.8.0/lib" />-->
|
<!-- <property name="antcontrib.dir" location="${tools.dir}/tools/ant/apache-ant-1.8.0/lib" />-->
|
||||||
<property name="deploy.dir" location="${build.dir}/deploy" />
|
<property name="deploy.dir" location="${build.dir}/deploy" />
|
||||||
@ -118,7 +112,6 @@
|
|||||||
<property name="utils.jar" value="cloud-utils.jar" />
|
<property name="utils.jar" value="cloud-utils.jar" />
|
||||||
<property name="server.jar" value="cloud-server.jar" />
|
<property name="server.jar" value="cloud-server.jar" />
|
||||||
<property name="agent.jar" value="cloud-agent.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="console-proxy.jar" value="cloud-console-proxy.jar" />
|
||||||
<property name="api.jar" value="cloud-api.jar"/>
|
<property name="api.jar" value="cloud-api.jar"/>
|
||||||
<property name="vmware-base.jar" value="cloud-vmware-base.jar" />
|
<property name="vmware-base.jar" value="cloud-vmware-base.jar" />
|
||||||
@ -317,19 +310,11 @@
|
|||||||
</copy>
|
</copy>
|
||||||
</target>
|
</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 id="console-proxy.classpath">
|
||||||
<path refid="deps.classpath" />
|
<path refid="deps.classpath" />
|
||||||
<path refid="dist.classpath" />
|
<path refid="dist.classpath" />
|
||||||
</path>
|
</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" >
|
<compile-java jar.name="${console-proxy.jar}" top.dir="${console-proxy.dir}" classpath="console-proxy.classpath" >
|
||||||
<include-files>
|
<include-files>
|
||||||
<fileset dir="${console-proxy.dir}/certs">
|
<fileset dir="${console-proxy.dir}/certs">
|
||||||
@ -364,7 +349,6 @@
|
|||||||
<copy todir="${copyto.dir}">
|
<copy todir="${copyto.dir}">
|
||||||
<fileset dir="${jar.dir}">
|
<fileset dir="${jar.dir}">
|
||||||
<include name="cloud-console-proxy.jar" />
|
<include name="cloud-console-proxy.jar" />
|
||||||
<include name="cloud-console-common.jar" />
|
|
||||||
</fileset>
|
</fileset>
|
||||||
</copy>
|
</copy>
|
||||||
<copy todir="${copyto.dir}/conf">
|
<copy todir="${copyto.dir}/conf">
|
||||||
@ -381,11 +365,6 @@
|
|||||||
<include name="*.cur" />
|
<include name="*.cur" />
|
||||||
</fileset>
|
</fileset>
|
||||||
</copy>
|
</copy>
|
||||||
<copy todir="${copyto.dir}/applet">
|
|
||||||
<fileset dir="${jar.dir}">
|
|
||||||
<include name="VMOpsConsoleApplet.jar" />
|
|
||||||
</fileset>
|
|
||||||
</copy>
|
|
||||||
<copy todir="${copyto.dir}/js">
|
<copy todir="${copyto.dir}/js">
|
||||||
<fileset dir="${console-proxy.dir}/js">
|
<fileset dir="${console-proxy.dir}/js">
|
||||||
<include name="*.js" />
|
<include name="*.js" />
|
||||||
@ -410,7 +389,7 @@
|
|||||||
</copy>
|
</copy>
|
||||||
</target>
|
</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}">
|
<copy todir="${console-proxy.dist.dir}">
|
||||||
<fileset dir="${console-proxy.dir}/scripts">
|
<fileset dir="${console-proxy.dir}/scripts">
|
||||||
</fileset>
|
</fileset>
|
||||||
@ -421,36 +400,6 @@
|
|||||||
</copy>
|
</copy>
|
||||||
</target>
|
</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 id="agent.classpath">
|
||||||
<path refid="deps.classpath" />
|
<path refid="deps.classpath" />
|
||||||
<fileset dir="${target.dir}">
|
<fileset dir="${target.dir}">
|
||||||
|
|||||||
@ -283,7 +283,7 @@
|
|||||||
</target>
|
</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 -->
|
<!-- 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}">
|
<copy todir="${waf.artifacts}">
|
||||||
<fileset dir="${target.dir}/jar"/>
|
<fileset dir="${target.dir}/jar"/>
|
||||||
</copy>
|
</copy>
|
||||||
|
|||||||
@ -3,6 +3,5 @@
|
|||||||
<classpathentry kind="src" path="src"/>
|
<classpathentry kind="src" path="src"/>
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||||
<classpathentry combineaccessrules="false" kind="src" path="/deps"/>
|
<classpathentry combineaccessrules="false" kind="src" path="/deps"/>
|
||||||
<classpathentry combineaccessrules="false" kind="src" path="/console"/>
|
|
||||||
<classpathentry kind="output" path="bin"/>
|
<classpathentry kind="output" path="bin"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
|||||||
@ -22,8 +22,8 @@ import java.util.ArrayList;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.cloud.console.Logger;
|
import com.cloud.consoleproxy.util.Logger;
|
||||||
|
|
||||||
public class AjaxFIFOImageCache {
|
public class AjaxFIFOImageCache {
|
||||||
private static final Logger s_logger = Logger.getLogger(AjaxFIFOImageCache.class);
|
private static final Logger s_logger = Logger.getLogger(AjaxFIFOImageCache.class);
|
||||||
|
|||||||
@ -17,7 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// repackage it to VMOps common packaging structure
|
// repackage it to VMOps common packaging structure
|
||||||
package com.cloud.console;
|
package com.cloud.consoleproxy;
|
||||||
|
|
||||||
public class AuthenticationException extends Exception {
|
public class AuthenticationException extends Exception {
|
||||||
private static final long serialVersionUID = -393139302884898842L;
|
private static final long serialVersionUID = -393139302884898842L;
|
||||||
@ -14,8 +14,7 @@ import java.util.concurrent.Executor;
|
|||||||
|
|
||||||
import org.apache.log4j.xml.DOMConfigurator;
|
import org.apache.log4j.xml.DOMConfigurator;
|
||||||
|
|
||||||
import com.cloud.console.AuthenticationException;
|
import com.cloud.consoleproxy.util.Logger;
|
||||||
import com.cloud.console.Logger;
|
|
||||||
import com.sun.net.httpserver.HttpServer;
|
import com.sun.net.httpserver.HttpServer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -28,7 +28,7 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
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.Headers;
|
||||||
import com.sun.net.httpserver.HttpExchange;
|
import com.sun.net.httpserver.HttpExchange;
|
||||||
import com.sun.net.httpserver.HttpHandler;
|
import com.sun.net.httpserver.HttpHandler;
|
||||||
|
|||||||
@ -23,7 +23,7 @@ import java.io.OutputStream;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
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.Headers;
|
||||||
import com.sun.net.httpserver.HttpExchange;
|
import com.sun.net.httpserver.HttpExchange;
|
||||||
import com.sun.net.httpserver.HttpHandler;
|
import com.sun.net.httpserver.HttpHandler;
|
||||||
|
|||||||
@ -23,7 +23,7 @@ import java.net.InetSocketAddress;
|
|||||||
|
|
||||||
import javax.net.ssl.SSLServerSocket;
|
import javax.net.ssl.SSLServerSocket;
|
||||||
|
|
||||||
import com.cloud.console.Logger;
|
import com.cloud.consoleproxy.util.Logger;
|
||||||
import com.sun.net.httpserver.HttpServer;
|
import com.sun.net.httpserver.HttpServer;
|
||||||
|
|
||||||
public class ConsoleProxyBaseServerFactoryImpl implements ConsoleProxyServerFactory {
|
public class ConsoleProxyBaseServerFactoryImpl implements ConsoleProxyServerFactory {
|
||||||
|
|||||||
@ -6,8 +6,8 @@ import java.util.List;
|
|||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.console.TileInfo;
|
import com.cloud.consoleproxy.util.TileInfo;
|
||||||
import com.cloud.console.TileTracker;
|
import com.cloud.consoleproxy.util.TileTracker;
|
||||||
import com.cloud.consoleproxy.vnc.FrameBufferCanvas;
|
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.OutputStream;
|
||||||
import java.io.OutputStreamWriter;
|
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.Headers;
|
||||||
import com.sun.net.httpserver.HttpExchange;
|
import com.sun.net.httpserver.HttpExchange;
|
||||||
import com.sun.net.httpserver.HttpHandler;
|
import com.sun.net.httpserver.HttpHandler;
|
||||||
|
|||||||
@ -17,16 +17,19 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
package com.cloud.consoleproxy;
|
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 ConsoleProxyLoggerFactory() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public com.cloud.console.Logger getLogger(Class clazz) {
|
public Logger getLogger(Class<?> clazz) {
|
||||||
return new Log4jLogger(org.apache.log4j.Logger.getLogger(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;
|
private org.apache.log4j.Logger logger;
|
||||||
|
|
||||||
public Log4jLogger(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 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
|
// 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.HashMap;
|
||||||
import java.util.Map;
|
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.Headers;
|
||||||
import com.sun.net.httpserver.HttpExchange;
|
import com.sun.net.httpserver.HttpExchange;
|
||||||
import com.sun.net.httpserver.HttpHandler;
|
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.HashMap;
|
||||||
import java.util.Map;
|
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.Headers;
|
||||||
import com.sun.net.httpserver.HttpExchange;
|
import com.sun.net.httpserver.HttpExchange;
|
||||||
import com.sun.net.httpserver.HttpHandler;
|
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.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.cloud.console.TileInfo;
|
|
||||||
import com.cloud.consoleproxy.util.ImageHelper;
|
import com.cloud.consoleproxy.util.ImageHelper;
|
||||||
|
import com.cloud.consoleproxy.util.TileInfo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A <code>BuffereImageCanvas</code> component represents frame buffer image on the
|
* 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.awt.Image;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.cloud.console.TileInfo;
|
import com.cloud.consoleproxy.util.TileInfo;
|
||||||
|
|
||||||
public interface FrameBufferCanvas {
|
public interface FrameBufferCanvas {
|
||||||
Image getFrameBufferScaledImage(int width, int height);
|
Image getFrameBufferScaledImage(int width, int height);
|
||||||
|
|||||||
@ -16,8 +16,8 @@ import javax.crypto.SecretKey;
|
|||||||
import javax.crypto.SecretKeyFactory;
|
import javax.crypto.SecretKeyFactory;
|
||||||
import javax.crypto.spec.DESKeySpec;
|
import javax.crypto.spec.DESKeySpec;
|
||||||
|
|
||||||
import com.cloud.console.Logger;
|
|
||||||
import com.cloud.consoleproxy.ConsoleProxyClientListener;
|
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.KeyboardEventPacket;
|
||||||
import com.cloud.consoleproxy.vnc.packet.client.MouseEventPacket;
|
import com.cloud.consoleproxy.vnc.packet.client.MouseEventPacket;
|
||||||
|
|
||||||
|
|||||||
@ -5,8 +5,8 @@ import java.awt.datatransfer.StringSelection;
|
|||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import com.cloud.console.Logger;
|
|
||||||
import com.cloud.consoleproxy.ConsoleProxyClientListener;
|
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.FramebufferUpdatePacket;
|
||||||
import com.cloud.consoleproxy.vnc.packet.server.ServerCutText;
|
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.DataInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import com.cloud.console.Logger;
|
import com.cloud.consoleproxy.util.Logger;
|
||||||
import com.cloud.consoleproxy.vnc.RfbConstants;
|
import com.cloud.consoleproxy.vnc.RfbConstants;
|
||||||
|
|
||||||
public class ServerCutText {
|
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