1 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
2  * Copyright 2009-2019 Pierre Ossman for Cendio AB
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 #include <stdio.h>
20 
21 #include <rfb/Exception.h>
22 #include <rfb/LogWriter.h>
23 #include <rfb/CMsgHandler.h>
24 #include <rfb/clipboardTypes.h>
25 #include <rfb/screenTypes.h>
26 
27 static rfb::LogWriter vlog("CMsgHandler");
28 
29 using namespace rfb;
30 
CMsgHandler()31 CMsgHandler::CMsgHandler()
32 {
33 }
34 
~CMsgHandler()35 CMsgHandler::~CMsgHandler()
36 {
37 }
38 
setDesktopSize(int width,int height)39 void CMsgHandler::setDesktopSize(int width, int height)
40 {
41   server.setDimensions(width, height);
42 }
43 
setExtendedDesktopSize(unsigned reason,unsigned result,int width,int height,const ScreenSet & layout)44 void CMsgHandler::setExtendedDesktopSize(unsigned reason, unsigned result,
45                                          int width, int height,
46                                          const ScreenSet& layout)
47 {
48   server.supportsSetDesktopSize = true;
49 
50   if ((reason == reasonClient) && (result != resultSuccess))
51     return;
52 
53   server.setDimensions(width, height, layout);
54 }
55 
setPixelFormat(const PixelFormat & pf)56 void CMsgHandler::setPixelFormat(const PixelFormat& pf)
57 {
58   server.setPF(pf);
59 }
60 
setName(const char * name)61 void CMsgHandler::setName(const char* name)
62 {
63   server.setName(name);
64 }
65 
fence(rdr::U32 flags,unsigned len,const char data[])66 void CMsgHandler::fence(rdr::U32 flags, unsigned len, const char data[])
67 {
68   server.supportsFence = true;
69 }
70 
endOfContinuousUpdates()71 void CMsgHandler::endOfContinuousUpdates()
72 {
73   server.supportsContinuousUpdates = true;
74 }
75 
supportsQEMUKeyEvent()76 void CMsgHandler::supportsQEMUKeyEvent()
77 {
78   server.supportsQEMUKeyEvent = true;
79 }
80 
serverInit(int width,int height,const PixelFormat & pf,const char * name)81 void CMsgHandler::serverInit(int width, int height,
82                              const PixelFormat& pf,
83                              const char* name)
84 {
85   server.setDimensions(width, height);
86   server.setPF(pf);
87   server.setName(name);
88 }
89 
framebufferUpdateStart()90 void CMsgHandler::framebufferUpdateStart()
91 {
92 }
93 
framebufferUpdateEnd()94 void CMsgHandler::framebufferUpdateEnd()
95 {
96 }
97 
setLEDState(unsigned int state)98 void CMsgHandler::setLEDState(unsigned int state)
99 {
100   server.setLEDState(state);
101 }
102 
handleClipboardCaps(rdr::U32 flags,const rdr::U32 * lengths)103 void CMsgHandler::handleClipboardCaps(rdr::U32 flags, const rdr::U32* lengths)
104 {
105   int i;
106 
107   vlog.debug("Got server clipboard capabilities:");
108   for (i = 0;i < 16;i++) {
109     if (flags & (1 << i)) {
110       const char *type;
111 
112       switch (1 << i) {
113         case clipboardUTF8:
114           type = "Plain text";
115           break;
116         case clipboardRTF:
117           type = "Rich text";
118           break;
119         case clipboardHTML:
120           type = "HTML";
121           break;
122         case clipboardDIB:
123           type = "Images";
124           break;
125         case clipboardFiles:
126           type = "Files";
127           break;
128         default:
129           vlog.debug("    Unknown format 0x%x", 1 << i);
130           continue;
131       }
132 
133       if (lengths[i] == 0)
134         vlog.debug("    %s (only notify)", type);
135       else {
136         char bytes[1024];
137 
138         iecPrefix(lengths[i], "B", bytes, sizeof(bytes));
139         vlog.debug("    %s (automatically send up to %s)",
140                    type, bytes);
141       }
142     }
143   }
144 
145   server.setClipboardCaps(flags, lengths);
146 }
147 
handleClipboardRequest(rdr::U32 flags)148 void CMsgHandler::handleClipboardRequest(rdr::U32 flags)
149 {
150 }
151 
handleClipboardPeek(rdr::U32 flags)152 void CMsgHandler::handleClipboardPeek(rdr::U32 flags)
153 {
154 }
155 
handleClipboardNotify(rdr::U32 flags)156 void CMsgHandler::handleClipboardNotify(rdr::U32 flags)
157 {
158 }
159 
handleClipboardProvide(rdr::U32 flags,const size_t * lengths,const rdr::U8 * const * data)160 void CMsgHandler::handleClipboardProvide(rdr::U32 flags,
161                                          const size_t* lengths,
162                                          const rdr::U8* const* data)
163 {
164 }
165