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