# HG changeset patch # User Taninari YU # Date 1346243298 -32400 # Node ID ea83f4be0cc9bcfcbbbe4bdbb40642f0ab1acbef # Parent 075fb190d5d426faa10bdace0beed890756ed2be remove is and os fix numberOfRectangle fill(). diff -r 075fb190d5d4 -r ea83f4be0cc9 src/main/java/com/glavsoft/rfb/protocol/Protocol.java --- a/src/main/java/com/glavsoft/rfb/protocol/Protocol.java Tue Aug 28 20:03:44 2012 +0900 +++ b/src/main/java/com/glavsoft/rfb/protocol/Protocol.java Wed Aug 29 21:28:18 2012 +0900 @@ -297,11 +297,29 @@ { this.rfbSessionListener = vncProxyService; this.repaintController = surface; +// if (settings.getBitsPerPixel() == 0) { +// settings.setBitsPerPixel(pixelFormat.bitsPerPixel); // the same the server sent when not initialized yet +// } + serverPixelFormat = pixelFormat; + serverPixelFormat.trueColourFlag = 1; // correct flag - we don't support color maps + setPixelFormat(createPixelFormat(settings)); + sendMessage(new SetPixelFormatMessage(pixelFormat)); + logger.fine("sent: "+pixelFormat); + + sendSupportedEncodingsMessage(settings); + settings.addListener(this); // to support pixel format (color depth), and encodings changes + settings.addListener(surface); + + sendRefreshMessage(); + senderTask = new SenderTask(messageQueue, writer, this); + senderThread = new Thread(senderTask); + senderThread.start(); decoders.resetDecoders(); receiverTask = new TreeTask( reader, repaintController, clipboardController, - decoders, this,true); + decoders, this, true); + receiverTask.setRfb(rfb); receiverThread = new Thread(receiverTask); receiverThread.start(); } diff -r 075fb190d5d4 -r ea83f4be0cc9 src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java --- a/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java Tue Aug 28 20:03:44 2012 +0900 +++ b/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java Wed Aug 29 21:28:18 2012 +0900 @@ -44,6 +44,8 @@ import java.io.StringWriter; import java.util.logging.Logger; +import jp.ac.u_ryukyu.treevnc.server.MyRfbProtoProxy; + public class ReceiverTask implements Runnable { private static final byte FRAMEBUFFER_UPDATE = 0; private static final byte SET_COLOR_MAP_ENTRIES = 1; @@ -71,6 +73,8 @@ this.clipboardController = clipboardController; this.context = context; this.decoders = decoders; + //renderer = repaintController.createRenderer(reader, context.getFbWidth(), context.getFbHeight(), + //context.getPixelFormat()); fullscreenFbUpdateIncrementalRequest = new FramebufferUpdateRequestMessage(0, 0, context.getFbWidth(), context.getFbHeight(), true); } @@ -94,6 +98,7 @@ isRunning = true; while (isRunning) { try { + reader.mark(20); byte messageId = reader.readByte(); switch (messageId) { case FRAMEBUFFER_UPDATE: @@ -218,4 +223,8 @@ isRunning = false; } + public void setRfb(MyRfbProtoProxy rfb) { + /*nop*/ + } + } diff -r 075fb190d5d4 -r ea83f4be0cc9 src/main/java/com/glavsoft/rfb/protocol/TreeTask.java --- a/src/main/java/com/glavsoft/rfb/protocol/TreeTask.java Tue Aug 28 20:03:44 2012 +0900 +++ b/src/main/java/com/glavsoft/rfb/protocol/TreeTask.java Wed Aug 29 21:28:18 2012 +0900 @@ -1,74 +1,63 @@ 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; - + private MyRfbProtoProxy rfb; + private ProtocolContext context; + public TreeTask(Reader reader, IRepaintController repaintController, ClipboardController clipboardController, - DecodersContainer decoders, ProtocolContext context,boolean flag) { - super(reader, repaintController, clipboardController, decoders, context,true); + DecodersContainer decoders, ProtocolContext context, boolean flag) { + super(reader, repaintController, clipboardController, decoders, + context, true); + this.context = context; + this.reader = reader; } - + @Override - public void framebufferUpdateMessage() throws CommonException{ + public void framebufferUpdateMessage() throws CommonException { reader.readByte(); // padding - int numberOfRectangles = reader.readUInt16(); + int numberOfRectangles = reader.readUInt16(); // number of rectangles 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()); + int zrleLength = getZrleLength(rect); + reader.reset(); + rfb.readSendData(zrleLength, reader); + boolean fullUpdateNeeded = false; + int w = context.getFbWidth(); + int h = context.getFbHeight(); + rfb.writeFramebufferUpdateRequest(0, 0, w, h, !fullUpdateNeeded); + // rfb.checkDelayData(); } } + private int getZrleLength(FramebufferUpdateRectangle rect) + throws TransportException { + int zrleLength = 0; + if (rect.getEncodingType() == EncodingType.ZRLE + || rect.getEncodingType() == EncodingType.ZRLEE + || rect.getEncodingType() == EncodingType.ZLIB) { + zrleLength = reader.readInt32(); + ; + } + return zrleLength + 20; + } + @Override + public void setRfb(MyRfbProtoProxy _rfb) { + rfb = _rfb; + } } diff -r 075fb190d5d4 -r ea83f4be0cc9 src/main/java/jp/ac/u_ryukyu/treevnc/server/MyRfbProtoProxy.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/MyRfbProtoProxy.java Tue Aug 28 20:03:44 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/MyRfbProtoProxy.java Wed Aug 29 21:28:18 2012 +0900 @@ -2,16 +2,7 @@ import static org.junit.Assert.*; -import java.awt.Graphics; -import java.awt.Image; -import java.awt.image.BufferedImage; -import java.io.BufferedOutputStream; -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.net.BindException; import java.net.ServerSocket; import java.net.Socket; @@ -19,10 +10,10 @@ import java.util.Iterator; import java.util.LinkedList; -import javax.imageio.ImageIO; import org.junit.Test; +import com.glavsoft.exceptions.CommonException; import com.glavsoft.exceptions.TransportException; import com.glavsoft.rfb.encoding.EncodingType; import com.glavsoft.transport.Reader; @@ -35,7 +26,6 @@ import java.util.zip.DataFormatException; import java.util.zip.Deflater; import java.util.zip.Inflater; -import java.io.OutputStream; import jp.ac.u_ryukyu.treevnc.MulticastQueue; @@ -58,15 +48,7 @@ private static final int INFLATE_BUFSIZE = 1024 * 100; boolean printStatusFlag = false; long startCheckTime; - private int messageType; - private int rectangles; - private int rectX; - private int rectY; - private int rectW; - private int rectH; - private int encoding; - private int zLen; - private boolean clicomp = false; + private ServerSocket servSock; protected int acceptPort; @@ -76,7 +58,7 @@ private LinkedList cliList; boolean createBimgFlag; boolean proxyFlag = true; - private Reader is; +// private Reader is; private Writer os; ExecutorService executor; @@ -88,7 +70,6 @@ private int clients = 0; private Inflater inflater = new Inflater(); private Deflater deflater = new Deflater(); - private CreateThread getHost; // private Thread requestThread; private RequestScreenThread rThread; private Thread requestThread; @@ -98,8 +79,7 @@ requestThread = new Thread(rThread); } - public void setStream(Reader _reader, Writer _writer) { - is = _reader; + public void setStream(Writer _writer) { os = _writer; } @@ -271,6 +251,7 @@ * send data to clients * * @param dataLen + * @param is * @throws IOException * @throws DataFormatException * @@ -289,8 +270,7 @@ * @throws TransportException */ - void readSendData(int dataLen) throws IOException, DataFormatException, - TransportException { + public void readSendData(int dataLen, Reader is) throws CommonException { LinkedList bufs = new LinkedList(); ByteBuffer header = ByteBuffer.allocate(16); is.readBytes(header.array(), 0, 16); @@ -320,9 +300,16 @@ // protocol, clients have to be modified. Deflater nDeflater = deflater; // new Deflater(); LinkedList out = new LinkedList(); - unzip(inflater, inputs, 0, out, INFLATE_BUFSIZE); - // dump32(inputs); - int len2 = zip(nDeflater, out, 0, bufs); + int len2 = 0; + try { + unzip(inflater, inputs, 0, out, INFLATE_BUFSIZE); + len2 = zip(nDeflater, out, 0, bufs); + } catch (DataFormatException e) { + throw new CommonException(e); + } catch (IOException e) { + throw new CommonException(e); + } + ByteBuffer blen = ByteBuffer.allocate(4); blen.putInt(len2); blen.flip(); @@ -369,8 +356,7 @@ // rfb.addSockTmp(newCli); // addSock(newCli); final int myId = clients; - final MulticastQueue.Client> c = multicastqueue - .newClient(); + final MulticastQueue.Client> c = multicastqueue.newClient(); final AtomicInteger writerRunning = new AtomicInteger(); writerRunning.set(1); /** @@ -458,7 +444,7 @@ */ sendRfbVersion(os); // readVersionMsg(is); - int rfbMinor = readVersionMsg(is, os); + readVersionMsg(is, os); sendSecurityType(os); readSecType(is); sendSecResult(os); @@ -468,7 +454,6 @@ // after. // writeFramebufferUpdateRequest(0,0, framebufferWidth, // framebufferHeight, false ); - int i = 0; for (;;) { LinkedList bufs = c.poll(); int inputIndex = 0; @@ -695,14 +680,6 @@ writer.write(b); } - boolean readProxyFlag() throws IOException, TransportException { - int flag = is.readUInt8(); - if (flag == 1) - return true; - else - return false; - } - void sendSecurityType(Writer os) throws TransportException { // number-of-security-types os.writeInt(1); @@ -781,7 +758,7 @@ os.write(initData); } - void writeFramebufferUpdateRequest(int x, int y, int w, int h, + public void writeFramebufferUpdateRequest(int x, int y, int w, int h, boolean incremental) throws TransportException { byte[] b = new byte[10]; diff -r 075fb190d5d4 -r ea83f4be0cc9 src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java Tue Aug 28 20:03:44 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java Wed Aug 29 21:28:18 2012 +0900 @@ -129,7 +129,7 @@ workingSocket.setTcpNoDelay(true); // disable Nagle algorithm Reader reader = new Reader(workingSocket.getInputStream()); Writer writer = new Writer(workingSocket.getOutputStream()); - rfb.setStream(reader,writer); + // rfb.setStream(reader,writer); workingProtocol = new Protocol(reader, writer, new PasswordChooser(passwordFromParams, connectionParams, containerFrame, this), settings); @@ -144,7 +144,14 @@ clipboardController.setEnabled(settings.isAllowClipboardTransfer()); settings.addListener(clipboardController); - surface = new Surface(workingProtocol, this, uiSettings.getScaleFactor()); + surface = new Surface(workingProtocol, this, uiSettings.getScaleFactor()); // this method + /* + settings.addListener(this); + uiSettings.addListener(surface); + containerFrame = createContainer(); + connectionManager.setContainerFrame(containerFrame); + updateFrameTitle(); + */ workingProtocol.startNormalHandling(this, surface, clipboardController,rfb); rfb.setInitData(workingProtocol.getInitData());