view src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEESender.java @ 186:f76ee760c2d2

dead lock on command line root
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 24 Jun 2014 00:48:26 +0900
parents feefc1e58153
children f381159e38f3
line wrap: on
line source

package com.glavsoft.rfb.encoding.decoder;

import jp.ac.u_ryukyu.treevnc.MyRfbProto;

import com.glavsoft.drawing.Renderer;
import com.glavsoft.exceptions.TransportException;
import com.glavsoft.rfb.encoding.EncodingType;
import com.glavsoft.transport.Reader;

public class ZRLEESender extends Decoder {

	private MyRfbProto rfb;

	public ZRLEESender(MyRfbProto rfb) {
		this.rfb = rfb;
	}

	public ZRLEESender() {
	}

	@Override
	public void decode(Reader reader, Renderer renderer,
			FramebufferUpdateRectangle rect) throws TransportException {
		// TreeVNC handling
        int dataLen = getZrleLength(rect, reader);
		if (rfb.hasViewer()) {
	        reader.reset();
			ZRLEDecoder decoder = new ZRLEDecoder();
			if (rfb.isRoot()) {
		        byte[] bytes = new byte[rect.width * rect.height * renderer.getBytesPerPixel()];
                rfb.readSendData(dataLen, reader, bytes);
				decoder.decode1(renderer, rect, bytes, 0);
				return;
			} else if (!rfb.getCuiVersion()) {
                rfb.readSendData(dataLen, reader, null);
                reader.reset();
                reader.skip(16);
				decoder.decode(reader, renderer, rect);
				return;
			}
		}
		reader.skip(dataLen);
	}

	private int getZrleLength(FramebufferUpdateRectangle rect, Reader reader)
			throws TransportException {
		int zrleLength = 0;
		if (rect.getEncodingType() == EncodingType.ZRLE
				|| rect.getEncodingType() == EncodingType.ZRLEE
				|| rect.getEncodingType() == EncodingType.ZLIB) {
			zrleLength = reader.readInt32();
		}
		return zrleLength + 20;
	}

	public void readCheckDelay(Reader reader) {
		try {
			reader.reset();
			rfb.readCheckDelay(reader);
		} catch (TransportException e) {
			e.printStackTrace();
		}
	}
}