diff src/main/java/com/glavsoft/rfb/encoding/decoder/ZlibDecoder.java @ 0:4689cc86d6cb

create TreeViewer2 Repository
author Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
date Tue, 03 Jul 2012 13:20:49 +0900 (2012-07-03)
parents
children e7ce2b2ffed8 17b702648079
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/com/glavsoft/rfb/encoding/decoder/ZlibDecoder.java	Tue Jul 03 13:20:49 2012 +0900
@@ -0,0 +1,72 @@
+// Copyright (C) 2010, 2011 GlavSoft LLC.
+// All rights reserved.
+//
+//-------------------------------------------------------------------------
+// This file is part of the TightVNC software.  Please visit our Web site:
+//
+//                       http://www.tightvnc.com/
+//
+// This program 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 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, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+//-------------------------------------------------------------------------
+//
+
+package com.glavsoft.rfb.encoding.decoder;
+
+import com.glavsoft.drawing.Renderer;
+import com.glavsoft.exceptions.TransportException;
+import com.glavsoft.transport.Reader;
+
+import java.io.ByteArrayInputStream;
+import java.util.zip.DataFormatException;
+import java.util.zip.Inflater;
+
+public class ZlibDecoder extends Decoder {
+	private Inflater decoder;
+
+	@Override
+	public void decode(Reader reader, Renderer renderer,
+			FramebufferUpdateRectangle rect) throws TransportException {
+		int zippedLength = (int) reader.readUInt32();
+		if (0 == zippedLength) return;
+		int length = rect.width * rect.height * renderer.getBytesPerPixel();
+		byte[] bytes = unzip(reader, zippedLength, length);
+		Reader unzippedReader =
+			new Reader(
+					new ByteArrayInputStream(bytes, zippedLength, length));
+		RawDecoder.getInstance().decode(unzippedReader, renderer, rect);
+	}
+
+	protected byte[] unzip(Reader reader, int zippedLength, int length)
+			throws TransportException {
+		byte [] bytes = ByteBuffer.getInstance().getBuffer(zippedLength + length);
+		reader.readBytes(bytes, 0, zippedLength);
+		if (null == decoder) {
+			decoder = new Inflater();
+		}
+		decoder.setInput(bytes, 0, zippedLength);
+		try {
+			decoder.inflate(bytes, zippedLength, length);
+		} catch (DataFormatException e) {
+			throw new TransportException("cannot inflate Zlib data", e);
+		}
+		return bytes;
+	}
+
+	@Override
+	public void reset() {
+		decoder = null;
+	}
+
+}