Mercurial > hg > Applications > TightVNC_orginal
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 } |