# HG changeset patch # User one # Date 1346016674 -32400 # Node ID e654b2e4de64addf38c3ffc95b4741e12e28c8a1 # Parent 5d43194fdc51bb47923ce983c6ab54522d948a7f add TreeTask.java diff -r 5d43194fdc51 -r e654b2e4de64 src/main/java/com/glavsoft/rfb/protocol/Protocol.java --- a/src/main/java/com/glavsoft/rfb/protocol/Protocol.java Sun Aug 26 12:51:54 2012 +0900 +++ b/src/main/java/com/glavsoft/rfb/protocol/Protocol.java Mon Aug 27 06:31:14 2012 +0900 @@ -37,9 +37,14 @@ import com.glavsoft.rfb.protocol.state.ProtocolState; import com.glavsoft.transport.Reader; import com.glavsoft.transport.Writer; +import com.glavsoft.viewer.swing.ClipboardControllerImpl; +import com.glavsoft.viewer.swing.Surface; import java.util.logging.Logger; +import jp.ac.u_ryukyu.treevnc.server.MyRfbProtoProxy; +import jp.ac.u_ryukyu.treevnc.server.VncProxyService; + public class Protocol implements ProtocolContext, IChangeSettingsListener { private ProtocolState state; private final Logger logger = Logger.getLogger("com.glavsoft.rfb.protocol"); @@ -275,4 +280,19 @@ } } + public void startNormalHandling(VncProxyService vncProxyService, + Surface surface, ClipboardControllerImpl clipboardController, + MyRfbProtoProxy rfb) + { + this.rfbSessionListener = vncProxyService; + this.repaintController = surface; + decoders.resetDecoders(); + receiverTask = new TreeTask( + reader, repaintController, + clipboardController, + decoders, this,true); + receiverThread = new Thread(receiverTask); + receiverThread.start(); + } + } diff -r 5d43194fdc51 -r e654b2e4de64 src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java --- a/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java Sun Aug 26 12:51:54 2012 +0900 +++ b/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java Mon Aug 27 06:31:14 2012 +0900 @@ -51,17 +51,29 @@ private static final byte SERVER_CUT_TEXT = 3; - private static Logger logger = Logger.getLogger("com.glavsoft.rfb.protocol.ReceiverTask"); - private final Reader reader; + protected static Logger logger = Logger.getLogger("com.glavsoft.rfb.protocol.ReceiverTask"); + protected final Reader reader; private volatile boolean isRunning = false; - private Renderer renderer; - private final IRepaintController repaintController; + protected Renderer renderer; + protected final IRepaintController repaintController; private final ClipboardController clipboardController; - private final DecodersContainer decoders; - private FramebufferUpdateRequestMessage fullscreenFbUpdateIncrementalRequest; - private final ProtocolContext context; + protected final DecodersContainer decoders; + protected FramebufferUpdateRequestMessage fullscreenFbUpdateIncrementalRequest; + protected final ProtocolContext context; private PixelFormat pixelFormat; private boolean needSendPixelFormat; + + public ReceiverTask(Reader reader, + IRepaintController repaintController, ClipboardController clipboardController, + DecodersContainer decoders, ProtocolContext context,boolean flag) { + this.reader = reader; + this.repaintController = repaintController; + this.clipboardController = clipboardController; + this.context = context; + this.decoders = decoders; + fullscreenFbUpdateIncrementalRequest = + new FramebufferUpdateRequestMessage(0, 0, context.getFbWidth(), context.getFbHeight(), true); + } public ReceiverTask(Reader reader, IRepaintController repaintController, ClipboardController clipboardController, @@ -76,7 +88,7 @@ fullscreenFbUpdateIncrementalRequest = new FramebufferUpdateRequestMessage(0, 0, context.getFbWidth(), context.getFbHeight(), true); } - + @Override public void run() { isRunning = true; diff -r 5d43194fdc51 -r e654b2e4de64 src/main/java/com/glavsoft/rfb/protocol/TreeTask.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/com/glavsoft/rfb/protocol/TreeTask.java Mon Aug 27 06:31:14 2012 +0900 @@ -0,0 +1,74 @@ +package com.glavsoft.rfb.protocol; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +import java.nio.ByteBuffer; +import java.util.LinkedList; +import java.util.concurrent.atomic.AtomicInteger; + + +import jp.ac.u_ryukyu.treevnc.MulticastQueue; +import jp.ac.u_ryukyu.treevnc.server.*; + +import com.glavsoft.exceptions.CommonException; +import com.glavsoft.exceptions.TransportException; +import com.glavsoft.rfb.ClipboardController; +import com.glavsoft.rfb.IRepaintController; +import com.glavsoft.rfb.client.FramebufferUpdateRequestMessage; +import com.glavsoft.rfb.client.SetPixelFormatMessage; +import com.glavsoft.rfb.encoding.EncodingType; +import com.glavsoft.rfb.encoding.decoder.Decoder; +import com.glavsoft.rfb.encoding.decoder.DecodersContainer; +import com.glavsoft.rfb.encoding.decoder.FramebufferUpdateRectangle; +import com.glavsoft.rfb.encoding.decoder.RichCursorDecoder; +import com.glavsoft.transport.Reader; + +public class TreeTask extends ReceiverTask { + private MulticastQueue> multicastqueue = new MulticastQueue>(); + private int clients = 0; + private RequestScreenThread rThread; + final static String versionMsg_3_855 = "RFB 003.855\n"; + private Reader reader; + + public TreeTask(Reader reader, IRepaintController repaintController, + ClipboardController clipboardController, + DecodersContainer decoders, ProtocolContext context,boolean flag) { + super(reader, repaintController, clipboardController, decoders, context,true); + } + + @Override + public void framebufferUpdateMessage() throws CommonException{ + reader.readByte(); // padding + int numberOfRectangles = reader.readUInt16(); + while (numberOfRectangles-- > 0) { + FramebufferUpdateRectangle rect = new FramebufferUpdateRectangle(); + rect.fill(reader); + + Decoder decoder = decoders.getDecoderByType(rect.getEncodingType()); + logger.finest(rect.toString() + (0 == numberOfRectangles ? "\n---" : "")); + if (decoder != null) { + decoder.decode(reader, renderer, rect); + repaintController.repaintBitmap(rect); + } else if (rect.getEncodingType() == EncodingType.RICH_CURSOR) { + RichCursorDecoder.getInstance().decode(reader, renderer, rect); + repaintController.repaintCursor(); + } else if (rect.getEncodingType() == EncodingType.CURSOR_POS) { + renderer.decodeCursorPosition(rect); + repaintController.repaintCursor(); + } else if (rect.getEncodingType() == EncodingType.DESKTOP_SIZE) { + fullscreenFbUpdateIncrementalRequest = + new FramebufferUpdateRequestMessage(0, 0, rect.width, rect.height, true); + synchronized (renderer) { + renderer = repaintController.createRenderer(reader, rect.width, rect.height, + context.getPixelFormat()); + } + // repaintController.repaintCursor(); + } else + throw new CommonException("Unprocessed encoding: " + rect.toString()); + } + } + + +} diff -r 5d43194fdc51 -r e654b2e4de64 src/main/java/jp/ac/u_ryukyu/treevnc/server/MyRfbProtoProxy.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/MyRfbProtoProxy.java Sun Aug 26 12:51:54 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/MyRfbProtoProxy.java Mon Aug 27 06:31:14 2012 +0900 @@ -26,7 +26,7 @@ import com.glavsoft.exceptions.TransportException; import com.glavsoft.rfb.encoding.EncodingType; import com.glavsoft.transport.Reader; - +import com.glavsoft.transport.Writer; //import myVncProxy.MulticastQueue.Client; @@ -47,6 +47,7 @@ final static byte SpeedCheckMillis = 4; final static int FramebufferUpdate = 0; final static int CheckDelay = 11; + final static int FramebufferUpdateRequest = 3; // Secyrity type of OS X final static int SecTypeReqAccess = 32; @@ -66,7 +67,6 @@ private int encoding; private int zLen; private boolean clicomp = false; - private ServerSocket servSock; protected int acceptPort; @@ -77,6 +77,7 @@ boolean createBimgFlag; boolean proxyFlag = true; private Reader reader; + private Writer writer; ExecutorService executor; byte[] pngBytes; @@ -93,10 +94,13 @@ private Thread requestThread; public MyRfbProtoProxy() { + rThread = new RequestScreenThread(this); + requestThread = new Thread(rThread); } - public void setReader(Reader _reader) { + public void setStream(Reader _reader, Writer _writer) { reader = _reader; + writer = _writer; } void initServSock(int port) throws IOException { @@ -159,7 +163,6 @@ } } - void requestThreadStart() { requestThread.start(); } @@ -283,33 +286,36 @@ * for each packet. ZRLEE can be invisible from user, but it * have to be implemented in the clients. ZRLEE compression is * not context dependent, so no recompression is necessary. - * @throws TransportException + * @throws TransportException */ - void readSendData(int dataLen) throws IOException, DataFormatException, TransportException { + void readSendData(int dataLen) throws IOException, DataFormatException, + TransportException { LinkedList bufs = new LinkedList(); ByteBuffer header = ByteBuffer.allocate(16); reader.readBytes(header.array(), 0, 16); header.limit(16); - if (header.get(0) == FramebufferUpdate) { + if (header.get(0) == FramebufferUpdate) { int encoding = header.getInt(12); if (encoding == EncodingType.ZRLE.getId() - || encoding == EncodingType.ZLIB.getId()) { // ZRLEE is already - // recompressed + || encoding == EncodingType.ZLIB.getId()) { // ZRLEE is + // already + // recompressed ByteBuffer len = ByteBuffer.allocate(4); reader.readBytes(len.array(), 0, 4); len.limit(4); ByteBuffer inputData = ByteBuffer.allocate(dataLen - 20); reader.readBytes(inputData.array(), 0, inputData.capacity()); -// System.out.println(dataLen); + // System.out.println(dataLen); inputData.limit(dataLen - 20); LinkedList inputs = new LinkedList(); inputs.add(inputData); - header.putInt(12, EncodingType.ZRLEE.getId()); // means recompress - // every time + header.putInt(12, EncodingType.ZRLEE.getId()); // means + // recompress + // every time // using new Deflecter every time is incompatible with the // protocol, clients have to be modified. Deflater nDeflater = deflater; // new Deflater(); @@ -323,8 +329,8 @@ bufs.addFirst(blen); bufs.addFirst(header); - // if(dataLen<=64000) - multicastqueue.put(bufs); + // if(dataLen<=64000) + multicastqueue.put(bufs); // is.reset(); /* @@ -458,7 +464,7 @@ // after. // writeFramebufferUpdateRequest(0,0, framebufferWidth, // framebufferHeight, false ); - int i = 0; + int i = 0; for (;;) { LinkedList bufs = c.poll(); int inputIndex = 0; @@ -472,11 +478,8 @@ // System.out.println("client "+ myId); } /* - if(i%20==0){ - sendDataCheckDelay(); - } - i++; - */ + * if(i%20==0){ sendDataCheckDelay(); } i++; + */ writeToClient(os, bufs, inputIndex); writerRunning.set(1); // yes my client is awaking. } @@ -636,12 +639,12 @@ } }; } - + void sendRfbVersion(OutputStream os) throws IOException { // os.write(versionMsg_3_8.getBytes()); os.write(versionMsg_3_855.getBytes()); } - + int readVersionMsg(InputStream is, OutputStream os) throws IOException { byte[] b = new byte[12]; @@ -671,14 +674,14 @@ } return rfbMinor; } - + void sendProxyFlag(OutputStream os) throws IOException { if (proxyFlag) os.write(1); else os.write(0); } - + void sendPortNumber(OutputStream os) throws IOException { byte[] b = new byte[4]; b = castIntByte(geth.port); @@ -692,8 +695,8 @@ else return false; } - - void sendSecurityType(OutputStream os) throws IOException { + + void sendSecurityType(OutputStream os) throws IOException { // number-of-security-types os.write(1); // security-types @@ -752,7 +755,7 @@ byte[] b = castIntByte(0); os.write(b); } - + byte[] castIntByte(int len) { byte[] b = new byte[4]; b[0] = (byte) ((len >>> 24) & 0xFF); @@ -770,5 +773,23 @@ void sendInitData(OutputStream os) throws IOException { os.write(initData); } - + + void writeFramebufferUpdateRequest(int x, int y, int w, int h, + boolean incremental) throws IOException, TransportException { + byte[] b = new byte[10]; + + b[0] = (byte) FramebufferUpdateRequest; + b[1] = (byte) (incremental ? 1 : 0); + b[2] = (byte) ((x >> 8) & 0xff); + b[3] = (byte) (x & 0xff); + b[4] = (byte) ((y >> 8) & 0xff); + b[5] = (byte) (y & 0xff); + b[6] = (byte) ((w >> 8) & 0xff); + b[7] = (byte) (w & 0xff); + b[8] = (byte) ((h >> 8) & 0xff); + b[9] = (byte) (h & 0xff); + + writer.write(b); + } + } diff -r 5d43194fdc51 -r e654b2e4de64 src/main/java/jp/ac/u_ryukyu/treevnc/server/RequestScreenThread.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/RequestScreenThread.java Sun Aug 26 12:51:54 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/RequestScreenThread.java Mon Aug 27 06:31:14 2012 +0900 @@ -2,8 +2,11 @@ import java.io.IOException; +import com.glavsoft.rfb.protocol.Protocol; + public class RequestScreenThread implements Runnable { MyRfbProtoProxy rfb; + Protocol protocol; RequestScreenThread(MyRfbProtoProxy _rfb) { rfb = _rfb; @@ -14,8 +17,8 @@ try { waitThread(); Thread.sleep(3000); - rfb.writeFramebufferUpdateRequest(0, 0, rfb.framebufferWidth, - rfb.framebufferHeight, false); + rfb.writeFramebufferUpdateRequest(0, 0, protocol.getFbWidth(), + protocol.getFbHeight(), false); } catch (Exception e) { e.printStackTrace(); @@ -36,5 +39,4 @@ notify(); } - } diff -r 5d43194fdc51 -r e654b2e4de64 src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java Sun Aug 26 12:51:54 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java Mon Aug 27 06:31:14 2012 +0900 @@ -22,6 +22,7 @@ import com.glavsoft.viewer.cli.Parser; import com.glavsoft.viewer.swing.ClipboardControllerImpl; import com.glavsoft.viewer.swing.ParametersHandler; +import com.glavsoft.viewer.swing.Surface; import com.glavsoft.viewer.swing.UiSettings; import com.glavsoft.viewer.swing.ParametersHandler.ConnectionParams; @@ -128,7 +129,7 @@ workingSocket.setTcpNoDelay(true); // disable Nagle algorithm Reader reader = new Reader(workingSocket.getInputStream()); Writer writer = new Writer(workingSocket.getOutputStream()); - rfb.setReader(reader); + rfb.setStream(reader,writer); workingProtocol = new Protocol(reader, writer, new PasswordChooser(passwordFromParams, connectionParams, containerFrame, this), settings); @@ -143,7 +144,10 @@ clipboardController.setEnabled(settings.isAllowClipboardTransfer()); settings.addListener(clipboardController); - + surface = new Surface(workingProtocol, this, uiSettings.getScaleFactor()); + + workingProtocol.startNormalHandling(this, surface, clipboardController,rfb); + // workingProtocol.startNormalHandling(this, surface, clipboardController); tryAgain = false; } catch (UnsupportedProtocolVersionException e) { connectionManager.showReconnectDialog("Unsupported Protocol Version", e.getMessage());