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 //
20 // VNCServer - abstract interface implemented by the RFB library.  The back-end
21 // code calls the relevant methods as appropriate.
22 
23 #ifndef __RFB_VNCSERVER_H__
24 #define __RFB_VNCSERVER_H__
25 
26 #include <network/Socket.h>
27 
28 #include <rfb/UpdateTracker.h>
29 #include <rfb/SSecurity.h>
30 #include <rfb/ScreenSet.h>
31 
32 namespace rfb {
33 
34   class VNCServer : public UpdateTracker,
35                     public network::SocketServer {
36   public:
37     // blockUpdates()/unblockUpdates() tells the server that the pixel buffer
38     // is currently in flux and may not be accessed. The attributes of the
39     // pixel buffer may still be accessed, but not the frame buffer itself.
40     // Note that access must be unblocked the exact same number of times it
41     // was blocked.
42     virtual void blockUpdates() = 0;
43     virtual void unblockUpdates() = 0;
44 
45     // setPixelBuffer() tells the server to use the given pixel buffer (and
46     // optionally a modified screen layout).  If this differs in size from
47     // the previous pixel buffer, this may result in protocol messages being
48     // sent, or clients being disconnected.
49     virtual void setPixelBuffer(PixelBuffer* pb, const ScreenSet& layout) = 0;
50     virtual void setPixelBuffer(PixelBuffer* pb) = 0;
51 
52     // setScreenLayout() modifies the current screen layout without changing
53     // the pixelbuffer. Clients will be notified of the new layout.
54     virtual void setScreenLayout(const ScreenSet& layout) = 0;
55 
56     // getPixelBuffer() returns a pointer to the PixelBuffer object.
57     virtual const PixelBuffer* getPixelBuffer() const = 0;
58 
59     // requestClipboard() will result in a request to a client to
60     // transfer its clipboard data. A call to
61     // SDesktop::handleClipboardData() will be made once the data is
62     // available.
63     virtual void requestClipboard() = 0;
64 
65     // announceClipboard() informs all clients of changes to the
66     // clipboard on the server. A client may later request the
67     // clipboard data via SDesktop::handleClipboardRequest().
68     virtual void announceClipboard(bool available) = 0;
69 
70     // sendClipboardData() transfers the clipboard data to a client
71     // and should be called whenever a client has requested the
72     // clipboard via SDesktop::handleClipboardRequest().
73     virtual void sendClipboardData(const char* data) = 0;
74 
75     // bell() tells the server that it should make all clients make a bell sound.
76     virtual void bell() = 0;
77 
78     // approveConnection() is called some time after
79     // SDesktop::queryConnection() has been called, to accept or reject
80     // the connection.  The accept argument should be true for
81     // acceptance, or false for rejection, in which case a string
82     // reason may also be given.
83     virtual void approveConnection(network::Socket* sock, bool accept,
84                                    const char* reason = NULL) = 0;
85 
86     // - Close all currently-connected clients, by calling
87     //   their close() method with the supplied reason.
88     virtual void closeClients(const char* reason) = 0;
89 
90     // getConnection() gets the SConnection for a particular Socket.  If
91     // the Socket is not recognised then null is returned.
92     virtual SConnection* getConnection(network::Socket* sock) = 0;
93 
94     // setCursor() tells the server that the cursor has changed.  The
95     // cursorData argument contains width*height rgba quadruplets with
96     // non-premultiplied alpha.
97     virtual void setCursor(int width, int height, const Point& hotspot,
98                            const rdr::U8* cursorData) = 0;
99 
100     // setCursorPos() tells the server the current position of the cursor, and
101     // whether the server initiated that change (e.g. through another X11
102     // client calling XWarpPointer()).
103     virtual void setCursorPos(const Point& p, bool warped) = 0;
104 
105     // setName() tells the server what desktop title to supply to clients
106     virtual void setName(const char* name) = 0;
107 
108     // setLEDState() tells the server what the current lock keys LED
109     // state is
110     virtual void setLEDState(unsigned int state) = 0;
111   };
112 }
113 #endif
114