Mercurial > hg > Applications > tvnjviewer
annotate src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java @ 31:59cdd271f79c
change compressed DSM only pixel data
author | Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 16 Nov 2015 23:02:29 +0900 |
parents | f1dc728ffe87 |
children |
rev | line source |
---|---|
0 | 1 // Copyright (C) 2010, 2011, 2012, 2013 GlavSoft LLC. |
2 // All rights reserved. | |
3 // | |
4 //------------------------------------------------------------------------- | |
5 // This file is part of the TightVNC software. Please visit our Web site: | |
6 // | |
7 // http://www.tightvnc.com/ | |
8 // | |
9 // This program is free software; you can redistribute it and/or modify | |
10 // it under the terms of the GNU General Public License as published by | |
11 // the Free Software Foundation; either version 2 of the License, or | |
12 // (at your option) any later version. | |
13 // | |
14 // This program is distributed in the hope that it will be useful, | |
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 // GNU General Public License for more details. | |
18 // | |
19 // You should have received a copy of the GNU General Public License along | |
20 // with this program; if not, write to the Free Software Foundation, Inc., | |
21 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
22 //------------------------------------------------------------------------- | |
23 // | |
24 | |
25 package com.glavsoft.rfb.protocol; | |
26 | |
9 | 27 import alice.datasegment.DataSegment; |
18 | 28 import alice.datasegment.ReceiveData; |
9 | 29 |
0 | 30 import com.glavsoft.drawing.Renderer; |
31 import com.glavsoft.exceptions.CommonException; | |
32 import com.glavsoft.exceptions.ProtocolException; | |
33 import com.glavsoft.exceptions.TransportException; | |
34 import com.glavsoft.rfb.ClipboardController; | |
35 import com.glavsoft.rfb.IRepaintController; | |
36 import com.glavsoft.rfb.client.FramebufferUpdateRequestMessage; | |
37 import com.glavsoft.rfb.client.SetPixelFormatMessage; | |
38 import com.glavsoft.rfb.encoding.EncodingType; | |
39 import com.glavsoft.rfb.encoding.PixelFormat; | |
40 import com.glavsoft.rfb.encoding.decoder.Decoder; | |
41 import com.glavsoft.rfb.encoding.decoder.DecodersContainer; | |
42 import com.glavsoft.rfb.encoding.decoder.FramebufferUpdateRectangle; | |
43 import com.glavsoft.rfb.encoding.decoder.RichCursorDecoder; | |
44 import com.glavsoft.transport.Reader; | |
45 | |
46 import java.io.PrintWriter; | |
47 import java.io.StringWriter; | |
48 import java.util.logging.Logger; | |
49 | |
26 | 50 import jp.ac.u_ryukyu.ie.cr.DecodeInfomation; |
51 | |
0 | 52 public class ReceiverTask implements Runnable { |
53 private static final byte FRAMEBUFFER_UPDATE = 0; | |
54 private static final byte SET_COLOR_MAP_ENTRIES = 1; | |
55 private static final byte BELL = 2; | |
56 private static final byte SERVER_CUT_TEXT = 3; | |
57 | |
58 | |
59 private static Logger logger = Logger.getLogger("com.glavsoft.rfb.protocol.ReceiverTask"); | |
60 private final Reader reader; | |
61 private volatile boolean isRunning = false; | |
62 private Renderer renderer; | |
63 private final IRepaintController repaintController; | |
64 private final ClipboardController clipboardController; | |
65 private final DecodersContainer decoders; | |
66 private FramebufferUpdateRequestMessage fullscreenFbUpdateIncrementalRequest; | |
67 private final ProtocolContext context; | |
68 private PixelFormat pixelFormat; | |
69 private boolean needSendPixelFormat; | |
70 | |
71 public ReceiverTask(Reader reader, | |
72 IRepaintController repaintController, ClipboardController clipboardController, | |
73 DecodersContainer decoders, ProtocolContext context) { | |
74 this.reader = reader; | |
75 this.repaintController = repaintController; | |
76 this.clipboardController = clipboardController; | |
77 this.context = context; | |
78 this.decoders = decoders; | |
79 renderer = repaintController.createRenderer(reader, context.getFbWidth(), context.getFbHeight(), | |
80 context.getPixelFormat()); | |
81 fullscreenFbUpdateIncrementalRequest = | |
82 new FramebufferUpdateRequestMessage(0, 0, context.getFbWidth(), context.getFbHeight(), true); | |
83 } | |
84 | |
85 @Override | |
86 public void run() { | |
87 isRunning = true; | |
88 while (isRunning) { | |
89 try { | |
90 byte messageId = reader.readByte(); | |
91 switch (messageId) { | |
92 case FRAMEBUFFER_UPDATE: | |
93 // logger.fine("Server message: FramebufferUpdate (0)"); | |
94 framebufferUpdateMessage(); | |
95 break; | |
96 case SET_COLOR_MAP_ENTRIES: | |
97 logger.severe("Server message SetColorMapEntries is not implemented. Skip."); | |
98 setColorMapEntries(); | |
99 break; | |
100 case BELL: | |
101 logger.fine("Server message: Bell"); | |
102 System.out.print("\0007"); | |
103 System.out.flush(); | |
104 break; | |
105 case SERVER_CUT_TEXT: | |
106 logger.fine("Server message: CutText (3)"); | |
107 serverCutText(); | |
108 break; | |
109 default: | |
110 logger.severe("Unsupported server message. Id = " + messageId); | |
111 } | |
112 } catch (TransportException e) { | |
113 if (isRunning) { | |
114 logger.severe("Close session: " + e.getMessage()); | |
115 context.cleanUpSession("Connection closed."); | |
116 } | |
117 stopTask(); | |
118 } catch (ProtocolException e) { | |
119 logger.severe(e.getMessage()); | |
120 if (isRunning) { | |
121 context.cleanUpSession(e.getMessage() + "\nConnection closed."); | |
122 } | |
123 stopTask(); | |
124 } catch (CommonException e) { | |
125 logger.severe(e.getMessage()); | |
126 if (isRunning) { | |
127 context.cleanUpSession("Connection closed.."); | |
128 } | |
129 stopTask(); | |
130 } catch (Throwable te) { | |
131 StringWriter sw = new StringWriter(); | |
132 PrintWriter pw = new PrintWriter(sw); | |
133 te.printStackTrace(pw); | |
134 if (isRunning) { | |
135 context.cleanUpSession(te.getMessage() + "\n" + sw.toString()); | |
136 } | |
137 stopTask(); | |
138 } | |
139 } | |
140 } | |
141 | |
142 private void setColorMapEntries() throws TransportException { | |
143 reader.readByte(); // padding | |
144 reader.readUInt16(); // first color index | |
145 int length = reader.readUInt16(); | |
146 while (length-- > 0) { | |
147 reader.readUInt16(); // R | |
148 reader.readUInt16(); // G | |
149 reader.readUInt16(); // B | |
150 } | |
151 } | |
152 | |
153 private void serverCutText() throws TransportException { | |
154 reader.readByte(); // padding | |
155 reader.readInt16(); // padding | |
156 int length = reader.readInt32() & Integer.MAX_VALUE; | |
157 clipboardController.updateSystemClipboard(reader.readBytes(length)); | |
158 } | |
159 | |
160 public void framebufferUpdateMessage() throws CommonException { | |
161 reader.readByte(); // padding | |
162 int numberOfRectangles = reader.readUInt16(); | |
163 while (numberOfRectangles-- > 0) { | |
164 FramebufferUpdateRectangle rect = new FramebufferUpdateRectangle(); | |
165 rect.fill(reader); | |
166 | |
167 Decoder decoder = decoders.getDecoderByType(rect.getEncodingType()); | |
168 logger.finest(rect.toString() + (0 == numberOfRectangles ? "\n---" : "")); | |
169 if (decoder != null) { | |
170 decoder.decode(reader, renderer, rect); | |
171 repaintController.repaintBitmap(rect); | |
172 } else if (rect.getEncodingType() == EncodingType.RICH_CURSOR) { | |
173 RichCursorDecoder.getInstance().decode(reader, renderer, rect); | |
174 repaintController.repaintCursor(); | |
175 } else if (rect.getEncodingType() == EncodingType.CURSOR_POS) { | |
176 renderer.decodeCursorPosition(rect); | |
177 repaintController.repaintCursor(); | |
178 } else if (rect.getEncodingType() == EncodingType.DESKTOP_SIZE) { | |
179 fullscreenFbUpdateIncrementalRequest = | |
180 new FramebufferUpdateRequestMessage(0, 0, rect.width, rect.height, true); | |
181 synchronized (renderer.getLock()) { | |
182 renderer = repaintController.createRenderer(reader, rect.width, rect.height, | |
183 context.getPixelFormat()); | |
184 } | |
26 | 185 DecodeInfomation message = new DecodeInfomation(); |
9 | 186 message.setRectangle(rect); |
187 message.setPixelFormat(context.getPixelFormat()); | |
26 | 188 |
31
59cdd271f79c
change compressed DSM only pixel data
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
26
diff
changeset
|
189 ReceiveData rData = new ReceiveData("dummy"); |
59cdd271f79c
change compressed DSM only pixel data
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
26
diff
changeset
|
190 DataSegment.getCompressedLocal().put("pixelData", rData, false); |
59cdd271f79c
change compressed DSM only pixel data
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
26
diff
changeset
|
191 rData = new ReceiveData(message); |
59cdd271f79c
change compressed DSM only pixel data
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
26
diff
changeset
|
192 DataSegment.getLocal().put("updateRectangle", rData, false); |
26 | 193 |
0 | 194 context.sendMessage(new FramebufferUpdateRequestMessage(0, 0, rect.width, rect.height, false)); |
195 // repaintController.repaintCursor(); | |
196 } else | |
197 throw new CommonException("Unprocessed encoding: " + rect.toString()); | |
198 } | |
199 synchronized (this) { | |
200 if (needSendPixelFormat) { | |
201 needSendPixelFormat = false; | |
202 context.setPixelFormat(pixelFormat); | |
203 context.sendMessage(new SetPixelFormatMessage(pixelFormat)); | |
204 logger.fine("sent: "+pixelFormat); | |
205 context.sendRefreshMessage(); | |
206 logger.fine("sent: nonincremental fb update"); | |
207 } else { | |
208 context.sendMessage(fullscreenFbUpdateIncrementalRequest); | |
209 } | |
210 } | |
211 } | |
212 | |
213 public synchronized void queueUpdatePixelFormat(PixelFormat pf) { | |
214 pixelFormat = pf; | |
215 needSendPixelFormat = true; | |
216 // context.sendMessage(new FramebufferUpdateRequestMessage(0, 0, 1, 1, false)); | |
217 } | |
218 | |
219 public void stopTask() { | |
220 isRunning = false; | |
221 } | |
222 | |
223 } |