view src/main/java/com/glavsoft/rfb/protocol/TreeTask.java @ 24:1fe39e8ba3e9

remove RICH_CURSOR and CURSOR_POS
author one
date Thu, 30 Aug 2012 15:13:34 +0900
parents 6a4312344a5a
children 73b13bc335c2
line wrap: on
line source

package com.glavsoft.rfb.protocol;

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 {
	final static String versionMsg_3_855 = "RFB 003.855\n";
	private MyRfbProtoProxy rfb;

	public TreeTask(Reader reader, IRepaintController repaintController,
			ClipboardController clipboardController,
			DecodersContainer decoders, ProtocolContext context, MyRfbProtoProxy _rfb) {
		super(reader, repaintController, clipboardController, decoders,
				context, true);
		rfb = _rfb;
	}

	/*
	 *  (non-Javadoc)
	 *  proxy
	 *  	no Repaint
	 *  	decoder!=0 ZRLE -> ZRLEE
	 *  	readSendData();
	 *  client 
	 *  	Repaint
	 *  	no context.send();
	 *  	if necessary ZRLEE -> ZRLE
	 *  	readSendData();    
	 */
	@Override
	public void framebufferUpdateMessage() throws CommonException {
		reader.readByte(); // padding
		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) {
				int zrleLength = getZrleLength(rect);
				reader.reset();
				rfb.readSendData(zrleLength, reader);
			} else if (rect.getEncodingType() == EncodingType.RICH_CURSOR) {
			} else if (rect.getEncodingType() == EncodingType.CURSOR_POS) {
			} else if (rect.getEncodingType() == EncodingType.DESKTOP_SIZE) {
				fullscreenFbUpdateIncrementalRequest =
					new FramebufferUpdateRequestMessage(0, 0, rect.width, rect.height, true);
				context.sendMessage(new FramebufferUpdateRequestMessage(0, 0, rect.width, rect.height, false));
			} else
				throw new CommonException("Unprocessed encoding: " + rect.toString());
		}
		synchronized (this) {
			if (needSendPixelFormat) {
				needSendPixelFormat = false;
				context.setPixelFormat(pixelFormat);
				context.sendMessage(new SetPixelFormatMessage(pixelFormat));
				logger.fine("sent: "+pixelFormat);
				context.sendRefreshMessage();
				logger.fine("sent: nonincremental fb update");
			} else {
				context.sendMessage(fullscreenFbUpdateIncrementalRequest);
			}
		}
	}

	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;
	}

}