Constantin Kaplinsky | 2844fd5 | 2008-04-14 08:02:25 +0000 | [diff] [blame] | 1 | /* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. |
Brian Hinz | af15db2 | 2012-02-12 20:44:29 +0000 | [diff] [blame] | 2 | * Copyright 2009-2011 Pierre Ossman for Cendio AB |
Brian Hinz | b213da6 | 2012-04-11 22:00:55 +0000 | [diff] [blame] | 3 | * Copyright (C) 2011 Brian P. Hinz |
Brian Hinz | c0a3609 | 2013-05-12 15:46:09 +0000 | [diff] [blame] | 4 | * |
Constantin Kaplinsky | 2844fd5 | 2008-04-14 08:02:25 +0000 | [diff] [blame] | 5 | * This is free software; you can redistribute it and/or modify |
| 6 | * it under the terms of the GNU General Public License as published by |
| 7 | * the Free Software Foundation; either version 2 of the License, or |
| 8 | * (at your option) any later version. |
Brian Hinz | c0a3609 | 2013-05-12 15:46:09 +0000 | [diff] [blame] | 9 | * |
Constantin Kaplinsky | 2844fd5 | 2008-04-14 08:02:25 +0000 | [diff] [blame] | 10 | * This software is distributed in the hope that it will be useful, |
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 13 | * GNU General Public License for more details. |
Brian Hinz | c0a3609 | 2013-05-12 15:46:09 +0000 | [diff] [blame] | 14 | * |
Constantin Kaplinsky | 2844fd5 | 2008-04-14 08:02:25 +0000 | [diff] [blame] | 15 | * You should have received a copy of the GNU General Public License |
| 16 | * along with this software; if not, write to the Free Software |
Brian Hinz | b213da6 | 2012-04-11 22:00:55 +0000 | [diff] [blame] | 17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, |
Constantin Kaplinsky | 2844fd5 | 2008-04-14 08:02:25 +0000 | [diff] [blame] | 18 | * USA. |
| 19 | */ |
| 20 | |
DRC | c5dc038 | 2011-05-13 21:42:14 +0000 | [diff] [blame] | 21 | package com.tigervnc.rfb; |
Constantin Kaplinsky | 90d8a50 | 2008-04-14 09:45:50 +0000 | [diff] [blame] | 22 | |
DRC | c5dc038 | 2011-05-13 21:42:14 +0000 | [diff] [blame] | 23 | import com.tigervnc.rdr.*; |
Brian Hinz | e768141 | 2011-05-17 21:00:34 +0000 | [diff] [blame] | 24 | import java.util.*; |
Constantin Kaplinsky | 2844fd5 | 2008-04-14 08:02:25 +0000 | [diff] [blame] | 25 | |
DRC | c5dc038 | 2011-05-13 21:42:14 +0000 | [diff] [blame] | 26 | public class CMsgWriterV3 extends CMsgWriter { |
| 27 | |
| 28 | public CMsgWriterV3(ConnParams cp_, OutStream os_) { super(cp_, os_); } |
| 29 | |
Brian Hinz | 28aa3a8 | 2012-04-05 02:08:49 +0000 | [diff] [blame] | 30 | synchronized public void writeClientInit(boolean shared) { |
DRC | c5dc038 | 2011-05-13 21:42:14 +0000 | [diff] [blame] | 31 | os.writeU8(shared?1:0); |
| 32 | endMsg(); |
Constantin Kaplinsky | 2844fd5 | 2008-04-14 08:02:25 +0000 | [diff] [blame] | 33 | } |
| 34 | |
Brian Hinz | 28aa3a8 | 2012-04-05 02:08:49 +0000 | [diff] [blame] | 35 | synchronized public void startMsg(int type) { |
DRC | c5dc038 | 2011-05-13 21:42:14 +0000 | [diff] [blame] | 36 | os.writeU8(type); |
| 37 | } |
Constantin Kaplinsky | 2844fd5 | 2008-04-14 08:02:25 +0000 | [diff] [blame] | 38 | |
Brian Hinz | 28aa3a8 | 2012-04-05 02:08:49 +0000 | [diff] [blame] | 39 | synchronized public void endMsg() { |
DRC | c5dc038 | 2011-05-13 21:42:14 +0000 | [diff] [blame] | 40 | os.flush(); |
Constantin Kaplinsky | 2844fd5 | 2008-04-14 08:02:25 +0000 | [diff] [blame] | 41 | } |
Brian Hinz | e768141 | 2011-05-17 21:00:34 +0000 | [diff] [blame] | 42 | |
Brian Hinz | 28aa3a8 | 2012-04-05 02:08:49 +0000 | [diff] [blame] | 43 | synchronized public void writeSetDesktopSize(int width, int height, |
Brian Hinz | e768141 | 2011-05-17 21:00:34 +0000 | [diff] [blame] | 44 | ScreenSet layout) |
| 45 | { |
| 46 | if (!cp.supportsSetDesktopSize) |
| 47 | throw new Exception("Server does not support SetDesktopSize"); |
Brian Hinz | c0a3609 | 2013-05-12 15:46:09 +0000 | [diff] [blame] | 48 | |
Brian Hinz | e768141 | 2011-05-17 21:00:34 +0000 | [diff] [blame] | 49 | startMsg(MsgTypes.msgTypeSetDesktopSize); |
| 50 | os.pad(1); |
Brian Hinz | c0a3609 | 2013-05-12 15:46:09 +0000 | [diff] [blame] | 51 | |
Brian Hinz | e768141 | 2011-05-17 21:00:34 +0000 | [diff] [blame] | 52 | os.writeU16(width); |
| 53 | os.writeU16(height); |
Brian Hinz | c0a3609 | 2013-05-12 15:46:09 +0000 | [diff] [blame] | 54 | |
Brian Hinz | e768141 | 2011-05-17 21:00:34 +0000 | [diff] [blame] | 55 | os.writeU8(layout.num_screens()); |
| 56 | os.pad(1); |
Brian Hinz | c0a3609 | 2013-05-12 15:46:09 +0000 | [diff] [blame] | 57 | |
Brian Hinz | d93a26d | 2012-12-14 22:40:02 +0000 | [diff] [blame] | 58 | for (Iterator<Screen> iter = layout.screens.iterator(); iter.hasNext(); ) { |
Brian Hinz | e768141 | 2011-05-17 21:00:34 +0000 | [diff] [blame] | 59 | Screen refScreen = (Screen)iter.next(); |
| 60 | os.writeU32(refScreen.id); |
| 61 | os.writeU16(refScreen.dimensions.tl.x); |
| 62 | os.writeU16(refScreen.dimensions.tl.y); |
| 63 | os.writeU16(refScreen.dimensions.width()); |
| 64 | os.writeU16(refScreen.dimensions.height()); |
| 65 | os.writeU32(refScreen.flags); |
| 66 | } |
Brian Hinz | c0a3609 | 2013-05-12 15:46:09 +0000 | [diff] [blame] | 67 | |
Brian Hinz | e768141 | 2011-05-17 21:00:34 +0000 | [diff] [blame] | 68 | endMsg(); |
| 69 | } |
Brian Hinz | af15db2 | 2012-02-12 20:44:29 +0000 | [diff] [blame] | 70 | |
Brian Hinz | 28aa3a8 | 2012-04-05 02:08:49 +0000 | [diff] [blame] | 71 | synchronized public void writeFence(int flags, int len, byte[] data) |
Brian Hinz | af15db2 | 2012-02-12 20:44:29 +0000 | [diff] [blame] | 72 | { |
| 73 | if (!cp.supportsFence) |
| 74 | throw new Exception("Server does not support fences"); |
| 75 | if (len > 64) |
| 76 | throw new Exception("Too large fence payload"); |
| 77 | if ((flags & ~fenceTypes.fenceFlagsSupported) != 0) |
| 78 | throw new Exception("Unknown fence flags"); |
Brian Hinz | c0a3609 | 2013-05-12 15:46:09 +0000 | [diff] [blame] | 79 | |
Brian Hinz | af15db2 | 2012-02-12 20:44:29 +0000 | [diff] [blame] | 80 | startMsg(MsgTypes.msgTypeClientFence); |
| 81 | os.pad(3); |
Brian Hinz | c0a3609 | 2013-05-12 15:46:09 +0000 | [diff] [blame] | 82 | |
Brian Hinz | af15db2 | 2012-02-12 20:44:29 +0000 | [diff] [blame] | 83 | os.writeU32(flags); |
Brian Hinz | c0a3609 | 2013-05-12 15:46:09 +0000 | [diff] [blame] | 84 | |
Brian Hinz | af15db2 | 2012-02-12 20:44:29 +0000 | [diff] [blame] | 85 | os.writeU8(len); |
| 86 | os.writeBytes(data, 0, len); |
Brian Hinz | c0a3609 | 2013-05-12 15:46:09 +0000 | [diff] [blame] | 87 | |
Brian Hinz | af15db2 | 2012-02-12 20:44:29 +0000 | [diff] [blame] | 88 | endMsg(); |
| 89 | } |
Brian Hinz | c0a3609 | 2013-05-12 15:46:09 +0000 | [diff] [blame] | 90 | |
Brian Hinz | 28aa3a8 | 2012-04-05 02:08:49 +0000 | [diff] [blame] | 91 | synchronized public void writeEnableContinuousUpdates(boolean enable, |
Brian Hinz | af15db2 | 2012-02-12 20:44:29 +0000 | [diff] [blame] | 92 | int x, int y, int w, int h) |
| 93 | { |
| 94 | if (!cp.supportsContinuousUpdates) |
| 95 | throw new Exception("Server does not support continuous updates"); |
Brian Hinz | c0a3609 | 2013-05-12 15:46:09 +0000 | [diff] [blame] | 96 | |
Brian Hinz | af15db2 | 2012-02-12 20:44:29 +0000 | [diff] [blame] | 97 | startMsg(MsgTypes.msgTypeEnableContinuousUpdates); |
Brian Hinz | c0a3609 | 2013-05-12 15:46:09 +0000 | [diff] [blame] | 98 | |
Brian Hinz | af15db2 | 2012-02-12 20:44:29 +0000 | [diff] [blame] | 99 | os.writeU8((enable?1:0)); |
Brian Hinz | c0a3609 | 2013-05-12 15:46:09 +0000 | [diff] [blame] | 100 | |
Brian Hinz | af15db2 | 2012-02-12 20:44:29 +0000 | [diff] [blame] | 101 | os.writeU16(x); |
| 102 | os.writeU16(y); |
| 103 | os.writeU16(w); |
| 104 | os.writeU16(h); |
Brian Hinz | c0a3609 | 2013-05-12 15:46:09 +0000 | [diff] [blame] | 105 | |
Brian Hinz | af15db2 | 2012-02-12 20:44:29 +0000 | [diff] [blame] | 106 | endMsg(); |
| 107 | } |
Constantin Kaplinsky | 2844fd5 | 2008-04-14 08:02:25 +0000 | [diff] [blame] | 108 | } |