aboutsummaryrefslogtreecommitdiffstats
path: root/java/com/tigervnc/rfb/CMsgReader.java
diff options
context:
space:
mode:
authorBrian P. Hinz <bphinz@users.sf.net>2016-12-10 19:14:55 -0500
committerBrian P. Hinz <bphinz@users.sf.net>2016-12-10 19:14:55 -0500
commitbcaadbe7ae3dcb18375bcb878a7794058b96aeee (patch)
treec1f91b2ce3cd4ca34440bb681cfd10184df58471 /java/com/tigervnc/rfb/CMsgReader.java
parent7ea19d8f89633cc940227e94238df0e357ebe054 (diff)
downloadtigervnc-bcaadbe7ae3dcb18375bcb878a7794058b96aeee.tar.gz
tigervnc-bcaadbe7ae3dcb18375bcb878a7794058b96aeee.zip
Method cleanup.
Sync various methods and filenames with C++ versions
Diffstat (limited to 'java/com/tigervnc/rfb/CMsgReader.java')
-rw-r--r--java/com/tigervnc/rfb/CMsgReader.java194
1 files changed, 155 insertions, 39 deletions
diff --git a/java/com/tigervnc/rfb/CMsgReader.java b/java/com/tigervnc/rfb/CMsgReader.java
index a93324ca..e7b4deb8 100644
--- a/java/com/tigervnc/rfb/CMsgReader.java
+++ b/java/com/tigervnc/rfb/CMsgReader.java
@@ -28,7 +28,7 @@ import java.nio.CharBuffer;
import java.nio.charset.Charset;
import com.tigervnc.rdr.*;
-abstract public class CMsgReader {
+public class CMsgReader {
protected CMsgReader(CMsgHandler handler_, InStream is_)
{
@@ -37,7 +37,82 @@ abstract public class CMsgReader {
is = is_;
imageBuf = null;
imageBufSize = 0;
- decoders = new Decoder[Encodings.encodingMax+1];
+ nUpdateRectsLeft = 0;
+ }
+
+ public void readServerInit()
+ {
+ int width = is.readU16();
+ int height = is.readU16();
+ handler.setDesktopSize(width, height);
+ PixelFormat pf = new PixelFormat();
+ pf.read(is);
+ handler.setPixelFormat(pf);
+ String name = is.readString();
+ handler.setName(name);
+ handler.serverInit();
+ }
+
+ public void readMsg()
+ {
+ if (nUpdateRectsLeft == 0) {
+ int type = is.readU8();
+
+ switch (type) {
+ case MsgTypes.msgTypeSetColourMapEntries:
+ readSetColourMapEntries();
+ break;
+ case MsgTypes.msgTypeBell:
+ readBell();
+ break;
+ case MsgTypes.msgTypeServerCutText:
+ readServerCutText();
+ break;
+ case MsgTypes.msgTypeFramebufferUpdate:
+ readFramebufferUpdate();
+ break;
+ case MsgTypes.msgTypeServerFence:
+ readFence();
+ break;
+ case MsgTypes.msgTypeEndOfContinuousUpdates:
+ readEndOfContinuousUpdates();
+ break;
+ default:
+ //fprintf(stderr, "unknown message type %d\n", type);
+ throw new Exception("unknown message type");
+ }
+ } else {
+ int x = is.readU16();
+ int y = is.readU16();
+ int w = is.readU16();
+ int h = is.readU16();
+ int encoding = is.readS32();
+
+ switch (encoding) {
+ case Encodings.pseudoEncodingLastRect:
+ nUpdateRectsLeft = 1; // this rectangle is the last one
+ break;
+ case Encodings.pseudoEncodingCursor:
+ readSetCursor(w, h, new Point(x,y));
+ break;
+ case Encodings.pseudoEncodingDesktopName:
+ readSetDesktopName(x, y, w, h);
+ break;
+ case Encodings.pseudoEncodingDesktopSize:
+ handler.setDesktopSize(w, h);
+ break;
+ case Encodings.pseudoEncodingExtendedDesktopSize:
+ readExtendedDesktopSize(x, y, w, h);
+ break;
+ default:
+ readRect(new Rect(x, y, x+w, y+h), encoding);
+ break;
+ };
+
+ nUpdateRectsLeft--;
+ if (nUpdateRectsLeft == 0)
+ handler.framebufferUpdateEnd();
+ }
}
protected void readSetColourMapEntries()
@@ -72,6 +147,43 @@ abstract public class CMsgReader {
handler.serverCutText(chars.toString(), len);
}
+ protected void readFence()
+ {
+ int flags;
+ int len;
+ byte[] data = new byte[64];
+
+ is.skip(3);
+
+ flags = is.readU32();
+
+ len = is.readU8();
+ if (len > data.length) {
+ System.out.println("Ignoring fence with too large payload\n");
+ is.skip(len);
+ return;
+ }
+
+ is.readBytes(data, 0, len);
+
+ handler.fence(flags, len, data);
+ }
+
+ protected void readEndOfContinuousUpdates()
+ {
+ handler.endOfContinuousUpdates();
+ }
+
+ protected void readFramebufferUpdate()
+ {
+ is.skip(1);
+ nUpdateRectsLeft = is.readU16();
+ handler.framebufferUpdateStart();
+ }
+
+
+
+ /*
protected void readFramebufferUpdateStart()
{
handler.framebufferUpdateStart();
@@ -81,6 +193,7 @@ abstract public class CMsgReader {
{
handler.framebufferUpdateEnd();
}
+ */
protected void readRect(Rect r, int encoding)
{
@@ -94,43 +207,56 @@ abstract public class CMsgReader {
if (r.is_empty())
vlog.error("Ignoring zero size rect");
- handler.beginRect(r, encoding);
+ handler.dataRect(r, encoding);
+ }
- if (encoding == Encodings.encodingCopyRect) {
- readCopyRect(r);
- } else {
+ protected void readSetCursor(int width, int height, Point hotspot)
+ {
+ int data_len = width * height * (handler.cp.pf().bpp/8);
+ int mask_len = ((width+7)/8) * height;
+ byte[] data = new byte[data_len];
+ byte[] mask = new byte[mask_len];
- if (decoders[encoding] == null) {
- decoders[encoding] = Decoder.createDecoder(encoding, this);
- if (decoders[encoding] == null) {
- vlog.error("Unknown rect encoding "+encoding);
- throw new Exception("Unknown rect encoding");
- }
- }
- decoders[encoding].readRect(r, handler);
- }
+ is.readBytes(data, 0, data_len);
+ is.readBytes(mask, 0, mask_len);
- handler.endRect(r, encoding);
+ handler.setCursor(width, height, hotspot, data, mask);
}
- protected void readCopyRect(Rect r)
+ protected void readSetDesktopName(int x, int y, int w, int h)
{
- int srcX = is.readU16();
- int srcY = is.readU16();
- handler.copyRect(r, srcX, srcY);
+ String name = is.readString();
+
+ if (x != 0 || y != 0 || w != 0 || h != 0) {
+ vlog.error("Ignoring DesktopName rect with non-zero position/size");
+ } else {
+ handler.setName(name);
+ }
+
}
- protected void readSetCursor(int width, int height, Point hotspot)
+ protected void readExtendedDesktopSize(int x, int y, int w, int h)
{
- int data_len = width * height;
- int mask_len = ((width+7)/8) * height;
- int[] data = new int[data_len];
- byte[] mask = new byte[mask_len];
+ int screens, i;
+ int id, flags;
+ int sx, sy, sw, sh;
+ ScreenSet layout = new ScreenSet();
- is.readPixels(data, data_len, (handler.cp.pf().bpp/8), handler.cp.pf().bigEndian);
- is.readBytes(mask, 0, mask_len);
+ screens = is.readU8();
+ is.skip(3);
- handler.setCursor(width, height, hotspot, data, mask);
+ for (i = 0;i < screens;i++) {
+ id = is.readU32();
+ sx = is.readU16();
+ sy = is.readU16();
+ sw = is.readU16();
+ sh = is.readU16();
+ flags = is.readU32();
+
+ layout.add_screen(new Screen(id, sx, sy, sw, sh, flags));
+ }
+
+ handler.setExtendedDesktopSize(x, y, w, h, layout);
}
public int[] getImageBuf(int required) { return getImageBuf(required, 0, 0); }
@@ -154,23 +280,13 @@ abstract public class CMsgReader {
return imageBuf;
}
- public final int bpp()
- {
- return handler.cp.pf().bpp;
- }
-
- abstract public void readServerInit();
-
- // readMsg() reads a message, calling the handler as appropriate.
- abstract public void readMsg();
-
public InStream getInStream() { return is; }
public int imageBufIdealSize;
protected CMsgHandler handler;
protected InStream is;
- protected Decoder[] decoders;
+ protected int nUpdateRectsLeft;
protected int[] imageBuf;
protected int imageBufSize;