comparison src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java @ 448:344a35b7c47f

send both frame buffer size and selected screen size in Disktop size change (INIT_DATA)
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 18 Jun 2016 20:09:46 +0900
parents 3996fde6f8ed
children d5bcae14c2cd
comparison
equal deleted inserted replaced
447:3996fde6f8ed 448:344a35b7c47f
44 import java.io.PrintWriter; 44 import java.io.PrintWriter;
45 import java.io.StringWriter; 45 import java.io.StringWriter;
46 import java.io.UnsupportedEncodingException; 46 import java.io.UnsupportedEncodingException;
47 import java.util.LinkedList; 47 import java.util.LinkedList;
48 import java.util.Timer; 48 import java.util.Timer;
49 import java.util.TimerTask;
50 import java.util.logging.Logger; 49 import java.util.logging.Logger;
51 50
52 51
53 public class ReceiverTask implements Runnable { 52 public class ReceiverTask implements Runnable {
54 private static final byte FRAMEBUFFER_UPDATE = 0; 53 private static final byte FRAMEBUFFER_UPDATE = 0;
86 85
87 Decoder decoder = new ZRLEESender(rfb); 86 Decoder decoder = new ZRLEESender(rfb);
88 decoders.setDecoderByType(EncodingType.ZLIB, decoder); 87 decoders.setDecoderByType(EncodingType.ZLIB, decoder);
89 decoders.setDecoderByType(EncodingType.ZRLE, decoder); 88 decoders.setDecoderByType(EncodingType.ZRLE, decoder);
90 decoders.setDecoderByType(EncodingType.ZRLEE, decoder); 89 decoders.setDecoderByType(EncodingType.ZRLEE, decoder);
91 90 if(rfb.fixingSize) {
91 context.setFbWidth(rfb.fixingSizeWidth);
92 context.setFbHeight(rfb.fixingSizeHeight);
93 }
92 if(!rfb.getCuiVersion()) { 94 if(!rfb.getCuiVersion()) {
93 if (rfb.filterSingleDisplay) { 95 renderer = repaintController.createRenderer(reader, context.getFbWidth(), context.getFbHeight(), context.getPixelFormat());
94 renderer = repaintController.createRenderer(reader, context.getFbWidth(), context.getFbHeight(), context.getPixelFormat()); 96 fullscreenFbUpdateIncrementalRequest = new FramebufferUpdateRequestMessage(rfb.getX(), rfb.getY(), rfb.frameSizeWidth, rfb.frameSizeHeight, false);
95 fullscreenFbUpdateIncrementalRequest = new FramebufferUpdateRequestMessage(0, 0, rfb.getSingleWidth(), rfb.getSingleHeight(), false);
96 } else {
97 renderer = repaintController.createRenderer(reader, context.getFbWidth(), context.getFbHeight(), context.getPixelFormat());
98 fullscreenFbUpdateIncrementalRequest = new FramebufferUpdateRequestMessage(rfb.getX(), rfb.getY(), rfb.frameSizeWidth * rfb.getRetinaScale(), rfb.frameSizeHeight * rfb.getRetinaScale(), false);
99 }
100 } 97 }
101 if(rfb.isTreeManager()) { 98 if(rfb.isTreeManager()) {
102 fullscreenFbUpdateIncrementalRequest.sendFullScreenRequest(); 99 fullscreenFbUpdateIncrementalRequest.sendFullScreenRequest();
103 connectionFinished(); 100 connectionFinished();
104 if(rfb.fixingSize) {
105 timer = new Timer("framebufferUpdate-request-timer", true);
106 timer.schedule(new TimerTask() {
107 @Override
108 public void run() {
109 context.setFbWidth(rfb.fixingSizeWidth);
110 context.setFbHeight(rfb.fixingSizeHeight);
111 context.sendMessage(new FramebufferUpdateRequestMessage(rfb.getX(), rfb.getY(), rfb.frameSizeWidth * rfb.getRetinaScale(), rfb.frameSizeHeight * rfb.getRetinaScale(), true));
112 }
113 }, 0, 100);
114 }
115 } 101 }
116 } 102 }
117 103
118 @Override 104 @Override
119 public void run() { 105 public void run() {
287 } else if (rect.getEncodingType() == EncodingType.DESKTOP_SIZE) { 273 } else if (rect.getEncodingType() == EncodingType.DESKTOP_SIZE) {
288 fullscreenFbUpdateIncrementalRequest = new FramebufferUpdateRequestMessage(rect.x, rect.y, rect.width, rect.height, false); 274 fullscreenFbUpdateIncrementalRequest = new FramebufferUpdateRequestMessage(rect.x, rect.y, rect.width, rect.height, false);
289 rfb.setCuiVersion(false); 275 rfb.setCuiVersion(false);
290 renderer = repaintController.createRenderer(reader, rect.width, rect.height, context.getPixelFormat()); 276 renderer = repaintController.createRenderer(reader, rect.width, rect.height, context.getPixelFormat());
291 if (rfb.hasViewer()){ 277 if (rfb.hasViewer()){
292 setScreenParameter(); 278 setScreenParameter(rect,rect.width,rect.height);
293 } 279 }
294 } else if (rect.getEncodingType() == EncodingType.INIT_DATA) { 280 } else if (rect.getEncodingType() == EncodingType.INIT_DATA) {
295 fullscreenFbUpdateIncrementalRequest = new FramebufferUpdateRequestMessage(rect.x, rect.y, rect.width, rect.height, false); 281 fullscreenFbUpdateIncrementalRequest = new FramebufferUpdateRequestMessage(rect.x, rect.y, rect.width, rect.height, false);
296 rfb.setCuiVersion(false); 282 rfb.setCuiVersion(false);
297 // VNCServer is changed, initiarize new screen. 283 // VNCServer is changed, initiarize new screen.
298 int length = reader.readInt32() - 2; 284 int length = reader.readInt32() - 6;
299 short id = reader.readInt16(); 285 short id = reader.readInt16();
286 int singleWidth = reader.readUInt16();
287 int singleHeight = reader.readUInt16();
300 byte[] initData = new byte[length]; 288 byte[] initData = new byte[length];
301 reader.read(initData); 289 reader.read(initData);
302 String name = new String(initData, 24, length - 24, "UTF-8"); 290 String name = new String(initData, 24, length - 24, "UTF-8");
303 context.setRemoteDesktopName(name); 291 context.setRemoteDesktopName(name);
304 context.setInitData(initData); 292 context.setInitData(initData);
308 context.setY(rect.y); 296 context.setY(rect.y);
309 repaintController.updateRemoteDesktopName(context); 297 repaintController.updateRemoteDesktopName(context);
310 reader.reset(); 298 reader.reset();
311 // All children multicastqueue should be discarded here. 299 // All children multicastqueue should be discarded here.
312 // rfb.clearChildrenTransmission(); 300 // rfb.clearChildrenTransmission();
313 rfb.readSendData(length + 20 + 2, reader, null, rect); // size of UpdateRectangleMessage with initData. 301 rfb.readSendData(length + 16 + 10, reader, null, rect); // size of UpdateRectangleMessage with initData.
314 if (!(rfb.getCuiVersion())) { 302 if (!(rfb.getCuiVersion())) {
315 renderer = repaintController.createRenderer(reader, rect.width, rect.height, context.getPixelFormat()); 303 renderer = repaintController.createRenderer(reader, rect.width, rect.height, context.getPixelFormat());
316 } 304 }
317 repaintController.setVisible(id != rfb.getId()); 305 repaintController.setVisible(id != rfb.getId());
318 if (rfb.hasViewer()){ 306 if (rfb.hasViewer()){
319 setScreenParameter(); 307 setScreenParameter(rect,singleWidth,singleHeight);
320 } 308 }
321 } else if (rect.getEncodingType() == EncodingType.CHECK_DELAY) { 309 } else if (rect.getEncodingType() == EncodingType.CHECK_DELAY) {
322 int checkDelaySize = 24; 310 int checkDelaySize = 24;
323 int port = rfb.acceptPort; 311 int port = rfb.acceptPort;
324 String address = rfb.getMyAddress(); 312 String address = rfb.getMyAddress();
356 if (rfb.isTreeManager()) { 344 if (rfb.isTreeManager()) {
357 sendFrameBufferUpdateRequest(); 345 sendFrameBufferUpdateRequest();
358 } 346 }
359 } 347 }
360 348
361 private void setScreenParameter() { 349 private void setScreenParameter(FramebufferUpdateRectangle rect,int singleWidth ,int singleHeight) {
362 ViewerInterface v = rfb.getViewer(); 350 ViewerInterface v = rfb.getViewer();
351 rfb.setSingleDisplaySize(singleWidth,singleHeight);
363 ConnectionPresenter cp = v.getConnectionPresenter(); 352 ConnectionPresenter cp = v.getConnectionPresenter();
364 cp.setX(rfb.getX()); 353 cp.setX(rect.x);
365 cp.setY(rfb.getY()); 354 cp.setY(rect.y);
366 cp.setFrameSizeWidth(rfb.frameSizeWidth); 355 cp.setFrameSizeWidth(rect.width);
367 cp.setFrameSizeHeight(rfb.frameSizeHeight); 356 cp.setFrameSizeHeight(rect.height);
368 v.setFitScreen(); 357 v.setFitScreen();
369 } 358 }
370 359
371 private void sendFrameBufferUpdateRequest() { 360 private void sendFrameBufferUpdateRequest() {
372 if (needSendPixelFormat) { 361 if (needSendPixelFormat) {