summaryrefslogtreecommitdiffstats
path: root/rfb/VNCSConnectionST.h
diff options
context:
space:
mode:
Diffstat (limited to 'rfb/VNCSConnectionST.h')
-rw-r--r--rfb/VNCSConnectionST.h168
1 files changed, 168 insertions, 0 deletions
diff --git a/rfb/VNCSConnectionST.h b/rfb/VNCSConnectionST.h
new file mode 100644
index 00000000..ba480e59
--- /dev/null
+++ b/rfb/VNCSConnectionST.h
@@ -0,0 +1,168 @@
+/* Copyright (C) 2002-2004 RealVNC Ltd. All Rights Reserved.
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+//
+// VNCSConnectionST is our derived class of SConnection for VNCServerST - there
+// is one for each connected client. We think of VNCSConnectionST as part of
+// the VNCServerST implementation, so its methods are allowed full access to
+// members of VNCServerST.
+//
+
+#ifndef __RFB_VNCSCONNECTIONST_H__
+#define __RFB_VNCSCONNECTIONST_H__
+
+#include <set>
+#include <rfb/SConnection.h>
+#include <rfb/SMsgWriter.h>
+#include <rfb/TransImageGetter.h>
+#include <rfb/VNCServerST.h>
+
+namespace rfb {
+ class VNCSConnectionST : public SConnection,
+ public WriteSetCursorCallback {
+ public:
+ VNCSConnectionST(VNCServerST* server_, network::Socket* s, bool reverse);
+ virtual ~VNCSConnectionST();
+
+ // Methods called from VNCServerST. None of these methods ever knowingly
+ // throw an exception.
+
+ // Unless otherwise stated, the SConnectionST may not be valid after any of
+ // these methods are called, since they catch exceptions and may have
+ // called close() which deletes the object.
+
+ // init() must be called to initialise the protocol. If it fails it
+ // returns false, and close() will have been called.
+ bool init();
+
+ // close() shuts down the socket to the client and deletes the
+ // SConnectionST object.
+ void close(const char* reason);
+
+ // processMessages() processes incoming messages from the client, invoking
+ // various callbacks as a result. It continues to process messages until
+ // reading might block. Returns true if the client is still valid &
+ // active, or false if it has disconnected or an error has occurred.
+ bool processMessages();
+
+ void writeFramebufferUpdateOrClose();
+ void pixelBufferChange();
+ void setColourMapEntriesOrClose(int firstColour, int nColours);
+ void bell();
+ void serverCutText(const char *str, int len);
+ void setCursorOrClose();
+
+ // checkIdleTimeout() returns the number of milliseconds left until the
+ // idle timeout expires. If it has expired, the connection is closed and
+ // zero is returned. Zero is also returned if there is no idle timeout.
+ int checkIdleTimeout();
+
+ // The following methods never throw exceptions nor do they ever delete the
+ // SConnectionST object.
+
+ // renderedCursorChange() is called whenever the server-side rendered
+ // cursor changes shape or position. It ensures that the next update will
+ // clean up the old rendered cursor and if necessary draw the new rendered
+ // cursor.
+ void renderedCursorChange();
+
+ // needRenderedCursor() returns true if this client needs the server-side
+ // rendered cursor. This may be because it does not support local cursor
+ // or because the current cursor position has not been set by this client.
+ bool needRenderedCursor();
+
+ network::Socket* getSock() { return sock; }
+ bool readyForUpdate() { return !requested.is_empty(); }
+ void add_changed(const Region& region) { updates.add_changed(region); }
+ void add_copied(const Region& dest, const Point& delta) {
+ updates.add_copied(dest, delta);
+ }
+
+ const char* getPeerEndpoint() const {return peerEndpoint.buf;}
+
+ // approveConnectionOrClose() is called some time after
+ // VNCServerST::queryConnection() has returned with PENDING to accept or
+ // reject the connection. The accept argument should be true for
+ // acceptance, or false for rejection, in which case a string reason may
+ // also be given.
+
+ void approveConnectionOrClose(bool accept, const char* reason);
+
+ private:
+ // SConnection callbacks
+
+ // These methods are invoked as callbacks from processMsg(). Note that
+ // none of these methods should call any of the above methods which may
+ // delete the SConnectionST object.
+
+ virtual void versionReceived();
+ virtual SSecurity* getSSecurity(int secType);
+ virtual void authSuccess();
+ virtual void queryConnection(const char* userName);
+ virtual void clientInit(bool shared);
+ virtual void setPixelFormat(const PixelFormat& pf);
+ virtual void pointerEvent(int x, int y, int buttonMask);
+ virtual void keyEvent(rdr::U32 key, bool down);
+ virtual void framebufferUpdateRequest(const Rect& r, bool incremental);
+ virtual void clientCutText(const char* str, int len);
+ virtual void setInitialColourMap();
+ virtual void supportsLocalCursor();
+
+ // setAccessRights() allows a security package to limit the access rights
+ // of a VNCSConnectioST to the server. These access rights are applied
+ // such that the actual rights granted are the minimum of the server's
+ // default access settings and the connection's access settings.
+ virtual void setAccessRights(AccessRights ar) {accessRights=ar;}
+
+ // WriteSetCursorCallback
+ virtual void writeSetCursorCallback();
+
+ // Internal methods
+
+ // writeFramebufferUpdate() attempts to write a framebuffer update to the
+ // client.
+
+ void writeFramebufferUpdate();
+
+ void writeRenderedCursorRect();
+ void setColourMapEntries(int firstColour, int nColours);
+ void setCursor();
+ void setSocketTimeouts();
+
+ network::Socket* sock;
+ CharArray peerEndpoint;
+ bool reverseConnection;
+ VNCServerST* server;
+ SimpleUpdateTracker updates;
+ TransImageGetter image_getter;
+ Region requested;
+ bool drawRenderedCursor, removeRenderedCursor;
+ Rect renderedCursorRect;
+
+ std::set<rdr::U32> pressedKeys;
+
+ time_t lastEventTime;
+ time_t pointerEventTime;
+ Point pointerEventPos;
+
+ AccessRights accessRights;
+
+ CharArray closeReason;
+ };
+}
+#endif