comparison src/main/java/com/glavsoft/rfb/protocol/Protocol.java @ 52:472a9bcacb21 draft default tip

TightVNC 2.7.1.0
author you@cr.ie.u-ryukyu.ac.jp
date Wed, 07 Aug 2013 19:01:17 +0900
parents 4689cc86d6cb
children
comparison
equal deleted inserted replaced
0:4689cc86d6cb 52:472a9bcacb21
1 // Copyright (C) 2010, 2011 GlavSoft LLC. 1 // Copyright (C) 2010, 2011, 2012, 2013 GlavSoft LLC.
2 // All rights reserved. 2 // All rights reserved.
3 // 3 //
4 //------------------------------------------------------------------------- 4 //-------------------------------------------------------------------------
5 // This file is part of the TightVNC software. Please visit our Web site: 5 // This file is part of the TightVNC software. Please visit our Web site:
6 // 6 //
40 40
41 import java.util.logging.Logger; 41 import java.util.logging.Logger;
42 42
43 public class Protocol implements ProtocolContext, IChangeSettingsListener { 43 public class Protocol implements ProtocolContext, IChangeSettingsListener {
44 private ProtocolState state; 44 private ProtocolState state;
45 private final Logger logger = Logger.getLogger("com.glavsoft.rfb.protocol"); 45 private final Logger logger;
46 private final IPasswordRetriever passwordRetriever; 46 private final IPasswordRetriever passwordRetriever;
47 private final ProtocolSettings settings; 47 private final ProtocolSettings settings;
48 private int fbWidth; 48 private int fbWidth;
49 private int fbHeight; 49 private int fbHeight;
50 private PixelFormat pixelFormat; 50 private PixelFormat pixelFormat;
51 private final Reader reader; 51 private final Reader reader;
52 private final Writer writer; 52 private final Writer writer;
53 private String remoteDesctopName; 53 private String remoteDesktopName;
54 private MessageQueue messageQueue; 54 private MessageQueue messageQueue;
55 private final DecodersContainer decoders; 55 private final DecodersContainer decoders;
56 private SenderTask senderTask; 56 private SenderTask senderTask;
57 private ReceiverTask receiverTask; 57 private ReceiverTask receiverTask;
58 private IRfbSessionListener rfbSessionListener; 58 private IRfbSessionListener rfbSessionListener;
59 private IRepaintController repaintController; 59 private IRepaintController repaintController;
60 private PixelFormat serverPixelFormat; 60 private PixelFormat serverPixelFormat;
61 private Thread senderThread; 61 private Thread senderThread;
62 private Thread receiverThread; 62 private Thread receiverThread;
63 63 private boolean isTight;
64 public Protocol(Reader reader, Writer writer, 64 private String protocolVersion;
65
66 public Protocol(Reader reader, Writer writer,
65 IPasswordRetriever passwordRetriever, ProtocolSettings settings) { 67 IPasswordRetriever passwordRetriever, ProtocolSettings settings) {
66 this.reader = reader; 68 this.reader = reader;
67 this.writer = writer; 69 this.writer = writer;
68 this.passwordRetriever = passwordRetriever; 70 this.passwordRetriever = passwordRetriever;
69 this.settings = settings; 71 this.settings = settings;
70 decoders = new DecodersContainer(); 72 decoders = new DecodersContainer();
71 decoders.instantiateDecodersWhenNeeded(settings.encodings); 73 decoders.instantiateDecodersWhenNeeded(settings.encodings);
72 state = new HandshakeState(this); 74 state = new HandshakeState(this);
73 } 75 logger = Logger.getLogger(getClass().getName());
76 }
74 77
75 @Override 78 @Override
76 public void changeStateTo(ProtocolState state) { 79 public void changeStateTo(ProtocolState state) {
77 this.state = state; 80 this.state = state;
78 } 81 }
79 82
80 public void handshake() throws UnsupportedProtocolVersionException, UnsupportedSecurityTypeException, 83 public void handshake() throws UnsupportedProtocolVersionException, UnsupportedSecurityTypeException,
81 AuthenticationFailedException, TransportException, FatalException { 84 AuthenticationFailedException, TransportException, FatalException {
82 while (state.next()) { 85 while (state.next()) {
83 continue; 86 // continue;
84 } 87 }
85 this.messageQueue = new MessageQueue(); 88 this.messageQueue = new MessageQueue();
86 } 89 }
87 90
88 @Override 91 @Override
98 } 101 }
99 } 102 }
100 103
101 @Override 104 @Override
102 public String getRemoteDesktopName() { 105 public String getRemoteDesktopName() {
103 return remoteDesctopName; 106 return remoteDesktopName;
104 } 107 }
105 108
106 @Override 109 @Override
107 public void setRemoteDesktopName(String name) { 110 public void setRemoteDesktopName(String name) {
108 remoteDesctopName = name; 111 remoteDesktopName = name;
109 } 112 }
110 113
111 @Override 114 @Override
112 public int getFbWidth() { 115 public int getFbWidth() {
113 return fbWidth; 116 return fbWidth;
136 @Override 139 @Override
137 public ProtocolSettings getSettings() { 140 public ProtocolSettings getSettings() {
138 return settings; 141 return settings;
139 } 142 }
140 143
141 @Override 144 @Override
142 public Logger getLogger() {
143 return logger;
144 }
145
146 @Override
147 public Writer getWriter() { 145 public Writer getWriter() {
148 return writer; 146 return writer;
149 } 147 }
150 148
151 @Override 149 @Override
167 */ 165 */
168 public void startNormalHandling(IRfbSessionListener rfbSessionListener, 166 public void startNormalHandling(IRfbSessionListener rfbSessionListener,
169 IRepaintController repaintController, ClipboardController clipboardController) { 167 IRepaintController repaintController, ClipboardController clipboardController) {
170 this.rfbSessionListener = rfbSessionListener; 168 this.rfbSessionListener = rfbSessionListener;
171 this.repaintController = repaintController; 169 this.repaintController = repaintController;
172 // if (settings.getBitsPerPixel() == 0) { 170 // if (settings.getColorDepth() == 0) {
173 // settings.setBitsPerPixel(pixelFormat.bitsPerPixel); // the same the server sent when not initialized yet 171 // settings.setColorDepth(pixelFormat.depth); // the same the server sent when not initialized yet
174 // } 172 // }
175 serverPixelFormat = pixelFormat; 173 serverPixelFormat = pixelFormat;
176 serverPixelFormat.trueColourFlag = 1; // correct flag - we don't support color maps 174 correctServerPixelFormat();
177 setPixelFormat(createPixelFormat(settings)); 175 setPixelFormat(createPixelFormat(settings));
178 sendMessage(new SetPixelFormatMessage(pixelFormat)); 176 sendMessage(new SetPixelFormatMessage(pixelFormat));
179 logger.fine("sent: "+pixelFormat); 177 logger.fine("sent: " + pixelFormat);
180 178
181 sendSupportedEncodingsMessage(settings); 179 sendSupportedEncodingsMessage(settings);
182 settings.addListener(this); // to support pixel format (color depth), and encodings changes 180 settings.addListener(this); // to support pixel format (color depth), and encodings changes
183 settings.addListener(repaintController); 181 settings.addListener(repaintController);
184 182
185 sendRefreshMessage(); 183 sendRefreshMessage();
186 senderTask = new SenderTask(messageQueue, writer, this); 184 senderTask = new SenderTask(messageQueue, writer, this);
187 senderThread = new Thread(senderTask); 185 senderThread = new Thread(senderTask, "RfbSenderTask");
188 senderThread.start(); 186 senderThread.start();
189 decoders.resetDecoders(); 187 decoders.resetDecoders();
190 receiverTask = new ReceiverTask( 188 receiverTask = new ReceiverTask(
191 reader, repaintController, 189 reader, repaintController,
192 clipboardController, 190 clipboardController,
193 decoders, this); 191 decoders, this);
194 receiverThread = new Thread(receiverTask); 192 receiverThread = new Thread(receiverTask, "RfbReceiverTask");
195 receiverThread.start(); 193 receiverThread.start();
196 } 194 }
197 195
198 @Override 196 private void correctServerPixelFormat() {
197 // correct true color flag - we don't support color maps, so always set it up
198 serverPixelFormat.trueColourFlag = 1;
199 // correct .depth to use actual depth 24 instead of incorrect 32, used by ex. UltraVNC server, that cause
200 // protocol incompatibility in ZRLE encoding
201 final long significant = serverPixelFormat.redMax << serverPixelFormat.redShift |
202 serverPixelFormat.greenMax << serverPixelFormat.greenShift |
203 serverPixelFormat.blueMax << serverPixelFormat.blueShift;
204 if (32 == serverPixelFormat.bitsPerPixel &&
205 ((significant & 0x00ff000000L) == 0 || (significant & 0x000000ffL) == 0) &&
206 32 == serverPixelFormat.depth) {
207 serverPixelFormat.depth = 24;
208 }
209 }
210
211 @Override
199 public void sendMessage(ClientToServerMessage message) { 212 public void sendMessage(ClientToServerMessage message) {
200 messageQueue.put(message); 213 messageQueue.put(message);
201 } 214 }
202 215
203 private void sendSupportedEncodingsMessage(ProtocolSettings settings) { 216 private void sendSupportedEncodingsMessage(ProtocolSettings settings) {
210 /** 223 /**
211 * create pixel format by bpp 224 * create pixel format by bpp
212 */ 225 */
213 private PixelFormat createPixelFormat(ProtocolSettings settings) { 226 private PixelFormat createPixelFormat(ProtocolSettings settings) {
214 int serverBigEndianFlag = serverPixelFormat.bigEndianFlag; 227 int serverBigEndianFlag = serverPixelFormat.bigEndianFlag;
215 switch (settings.getBitsPerPixel()) { 228 switch (settings.getColorDepth()) {
216 case ProtocolSettings.BPP_32: 229 case ProtocolSettings.COLOR_DEPTH_24:
217 return PixelFormat.create32bppPixelFormat(serverBigEndianFlag); 230 return PixelFormat.create24bitColorDepthPixelFormat(serverBigEndianFlag);
218 case ProtocolSettings.BPP_16: 231 case ProtocolSettings.COLOR_DEPTH_16:
219 return PixelFormat.create16bppPixelFormat(serverBigEndianFlag); 232 return PixelFormat.create16bitColorDepthPixelFormat(serverBigEndianFlag);
220 case ProtocolSettings.BPP_8: 233 case ProtocolSettings.COLOR_DEPTH_8:
221 return PixelFormat.create8bppBGRPixelFormat(serverBigEndianFlag); 234 return PixelFormat.create8bitColorDepthBGRPixelFormat(serverBigEndianFlag);
222 case ProtocolSettings.BPP_6: 235 case ProtocolSettings.COLOR_DEPTH_6:
223 return PixelFormat.create6bppPixelFormat(serverBigEndianFlag); 236 return PixelFormat.create6bitColorDepthPixelFormat(serverBigEndianFlag);
224 case ProtocolSettings.BPP_3: 237 case ProtocolSettings.COLOR_DEPTH_3:
225 return PixelFormat.create3bppPixelFormat(serverBigEndianFlag); 238 return PixelFormat.create3bppPixelFormat(serverBigEndianFlag);
226 case ProtocolSettings.BPP_SERVER_SETTINGS: 239 case ProtocolSettings.COLOR_DEPTH_SERVER_SETTINGS:
227 return serverPixelFormat; 240 return serverPixelFormat;
228 default: 241 default:
229 // unsupported bpp, use default 242 // unsupported bpp, use default
230 return PixelFormat.create32bppPixelFormat(serverBigEndianFlag); 243 return PixelFormat.create24bitColorDepthPixelFormat(serverBigEndianFlag);
231 } 244 }
232 } 245 }
233 246
234 @Override 247 @Override
235 public void settingsChanged(SettingsChangedEvent e) { 248 public void settingsChanged(SettingsChangedEvent e) {
236 ProtocolSettings settings = (ProtocolSettings) e.getSource(); 249 ProtocolSettings settings = (ProtocolSettings) e.getSource();
237 if (settings.isChangedEncodings()) { 250 if (settings.isChangedEncodings()) {
238 sendSupportedEncodingsMessage(settings); 251 sendSupportedEncodingsMessage(settings);
239 } 252 }
240 if (settings.changedBitsPerPixel() && receiverTask != null) { 253 if (settings.isChangedColorDepth() && receiverTask != null) {
241 receiverTask.queueUpdatePixelFormat(createPixelFormat(settings)); 254 receiverTask.queueUpdatePixelFormat(createPixelFormat(settings));
242 } 255 }
243 } 256 }
244 257
245 @Override 258 @Override
273 } 286 }
274 receiverTask = null; 287 receiverTask = null;
275 } 288 }
276 } 289 }
277 290
291 @Override
292 public void setTight(boolean isTight) {
293 this.isTight = isTight;
294 }
295
296 @Override
297 public boolean isTight() {
298 return isTight;
299 }
300
301 @Override
302 public void setProtocolVersion(String protocolVersion) {
303 this.protocolVersion = protocolVersion;
304 }
305
306 @Override
307 public String getProtocolVersion() {
308 return protocolVersion;
309 }
310
278 } 311 }