Remove QueryConnectionHandler
Make things simpler by making this a part of the SDesktop interface
that always needs to be implemented.
diff --git a/unix/x0vncserver/XDesktop.cxx b/unix/x0vncserver/XDesktop.cxx
index 5f67f29..c7f8ef8 100644
--- a/unix/x0vncserver/XDesktop.cxx
+++ b/unix/x0vncserver/XDesktop.cxx
@@ -18,6 +18,8 @@
* USA.
*/
+#include <assert.h>
+
#include <x0vncserver/XDesktop.h>
#include <X11/XKBlib.h>
@@ -53,6 +55,10 @@
"Send keyboard events straight through and "
"avoid mapping them to the current keyboard "
"layout", false);
+IntParameter queryConnectTimeout("QueryConnectTimeout",
+ "Number of seconds to show the Accept Connection dialog before "
+ "rejecting the connection",
+ 10);
static rfb::LogWriter vlog("XDesktop");
@@ -63,6 +69,7 @@
XDesktop::XDesktop(Display* dpy_, Geometry *geometry_)
: dpy(dpy_), geometry(geometry_), pb(0), server(0),
+ queryConnectDialog(0), queryConnectSock(0),
oldButtonMask(0), haveXtest(false), haveDamage(false),
maxButtons(0), running(false), ledMasks(), ledState(0),
codeMap(0), codeMapLen(0)
@@ -254,6 +261,9 @@
XDamageDestroy(dpy, damage);
#endif
+ delete queryConnectDialog;
+ queryConnectDialog = 0;
+
server->setPixelBuffer(0);
server = 0;
@@ -265,6 +275,30 @@
return running;
}
+void XDesktop::queryConnection(network::Socket* sock,
+ const char* userName)
+{
+ assert(isRunning());
+
+ if (queryConnectSock) {
+ server->approveConnection(sock, false, "Another connection is currently being queried.");
+ return;
+ }
+
+ if (!userName)
+ userName = "(anonymous)";
+
+ queryConnectSock = sock;
+
+ CharArray address(sock->getPeerAddress());
+ delete queryConnectDialog;
+ queryConnectDialog = new QueryConnectDialog(dpy, address.buf,
+ userName,
+ queryConnectTimeout,
+ this);
+ queryConnectDialog->map();
+}
+
void XDesktop::pointerEvent(const Point& pos, int buttonMask) {
#ifdef HAVE_XTEST
if (!haveXtest) return;
@@ -684,6 +718,21 @@
return false;
}
+void XDesktop::queryApproved()
+{
+ assert(isRunning());
+ server->approveConnection(queryConnectSock, true, 0);
+ queryConnectSock = 0;
+}
+
+void XDesktop::queryRejected()
+{
+ assert(isRunning());
+ server->approveConnection(queryConnectSock, false,
+ "Connection rejected by local user");
+ queryConnectSock = 0;
+}
+
bool XDesktop::setCursor()
{
XFixesCursorImage *cim;
diff --git a/unix/x0vncserver/XDesktop.h b/unix/x0vncserver/XDesktop.h
index ff52c01..dc616e9 100644
--- a/unix/x0vncserver/XDesktop.h
+++ b/unix/x0vncserver/XDesktop.h
@@ -30,13 +30,17 @@
#include <X11/extensions/Xdamage.h>
#endif
+#include <vncconfig/QueryConnectDialog.h>
+
class Geometry;
class XPixelBuffer;
// number of XKb indicator leds to handle
#define XDESKTOP_N_LEDS 3
-class XDesktop : public rfb::SDesktop, public TXGlobalEventHandler
+class XDesktop : public rfb::SDesktop,
+ public TXGlobalEventHandler,
+ public QueryResultCallback
{
public:
XDesktop(Display* dpy_, Geometry *geometry);
@@ -46,6 +50,8 @@
virtual void start(rfb::VNCServer* vs);
virtual void stop();
bool isRunning();
+ virtual void queryConnection(network::Socket* sock,
+ const char* userName);
virtual void pointerEvent(const rfb::Point& pos, int buttonMask);
KeyCode XkbKeysymToKeycode(Display* dpy, KeySym keysym);
virtual void keyEvent(rdr::U32 keysym, rdr::U32 xtcode, bool down);
@@ -56,11 +62,17 @@
// -=- TXGlobalEventHandler interface
virtual bool handleGlobalEvent(XEvent* ev);
+ // -=- QueryResultCallback interface
+ virtual void queryApproved();
+ virtual void queryRejected();
+
protected:
Display* dpy;
Geometry* geometry;
XPixelBuffer* pb;
rfb::VNCServerST* server;
+ QueryConnectDialog* queryConnectDialog;
+ network::Socket* queryConnectSock;
int oldButtonMask;
bool haveXtest;
bool haveDamage;
diff --git a/unix/x0vncserver/x0vncserver.cxx b/unix/x0vncserver/x0vncserver.cxx
index 9b84ca2..4c8f0bf 100644
--- a/unix/x0vncserver/x0vncserver.cxx
+++ b/unix/x0vncserver/x0vncserver.cxx
@@ -33,8 +33,6 @@
#include <network/TcpSocket.h>
#include <network/UnixSocket.h>
-#include <vncconfig/QueryConnectDialog.h>
-
#include <signal.h>
#include <X11/X.h>
#include <X11/Xlib.h>
@@ -61,10 +59,6 @@
IntParameter rfbport("rfbport", "TCP port to listen for RFB protocol",5900);
StringParameter rfbunixpath("rfbunixpath", "Unix socket to listen for RFB protocol", "");
IntParameter rfbunixmode("rfbunixmode", "Unix socket access mode", 0600);
-IntParameter queryConnectTimeout("QueryConnectTimeout",
- "Number of seconds to show the Accept Connection dialog before "
- "rejecting the connection",
- 10);
StringParameter hostsFile("HostsFile", "File with IP access control rules", "");
//
@@ -79,48 +73,6 @@
}
-class QueryConnHandler : public VNCServerST::QueryConnectionHandler,
- public QueryResultCallback {
-public:
- QueryConnHandler(Display* dpy, VNCServerST* vs)
- : display(dpy), server(vs), queryConnectDialog(0), queryConnectSock(0) {}
- ~QueryConnHandler() { delete queryConnectDialog; }
-
- // -=- VNCServerST::QueryConnectionHandler interface
- virtual void queryConnection(network::Socket* sock,
- const char* userName) {
- if (queryConnectSock) {
- server->approveConnection(sock, false, "Another connection is currently being queried.");
- return;
- }
- if (!userName) userName = "(anonymous)";
- queryConnectSock = sock;
- CharArray address(sock->getPeerAddress());
- delete queryConnectDialog;
- queryConnectDialog = new QueryConnectDialog(display, address.buf,
- userName, queryConnectTimeout,
- this);
- queryConnectDialog->map();
- }
-
- // -=- QueryResultCallback interface
- virtual void queryApproved() {
- server->approveConnection(queryConnectSock, true, 0);
- queryConnectSock = 0;
- }
- virtual void queryRejected() {
- server->approveConnection(queryConnectSock, false,
- "Connection rejected by local user");
- queryConnectSock = 0;
- }
-private:
- Display* display;
- VNCServerST* server;
- QueryConnectDialog* queryConnectDialog;
- network::Socket* queryConnectSock;
-};
-
-
class FileTcpFilter : public TcpFilter
{
@@ -305,8 +257,6 @@
XDesktop desktop(dpy, &geo);
VNCServerST server("x0vncserver", &desktop);
- QueryConnHandler qcHandler(dpy, &server);
- server.setQueryConnectionHandler(&qcHandler);
if (rfbunixpath.getValueStr()[0] != '\0') {
listeners.push_back(new network::UnixListener(rfbunixpath, rfbunixmode));
diff --git a/unix/xserver/hw/vnc/XserverDesktop.cc b/unix/xserver/hw/vnc/XserverDesktop.cc
index 89b55e6..e61472b 100644
--- a/unix/xserver/hw/vnc/XserverDesktop.cc
+++ b/unix/xserver/hw/vnc/XserverDesktop.cc
@@ -81,7 +81,6 @@
server = new VNCServerST(name, this);
setFramebuffer(width, height, fbptr, stride);
- server->setQueryConnectionHandler(this);
for (std::list<SocketListener*>::iterator i = listeners.begin();
i != listeners.end();
@@ -145,6 +144,17 @@
server->setScreenLayout(::computeScreenLayout(&outputIdMap));
}
+void XserverDesktop::start(rfb::VNCServer* vs)
+{
+ // We already own the server object, and we always keep it in a
+ // ready state
+ assert(vs == server);
+}
+
+void XserverDesktop::stop()
+{
+}
+
void XserverDesktop::queryConnection(network::Socket* sock,
const char* userName)
{
diff --git a/unix/xserver/hw/vnc/XserverDesktop.h b/unix/xserver/hw/vnc/XserverDesktop.h
index 6ea6104..04666cd 100644
--- a/unix/xserver/hw/vnc/XserverDesktop.h
+++ b/unix/xserver/hw/vnc/XserverDesktop.h
@@ -45,7 +45,6 @@
namespace network { class SocketListener; class Socket; class SocketServer; }
class XserverDesktop : public rfb::SDesktop, public rfb::FullFramePixelBuffer,
- public rfb::VNCServerST::QueryConnectionHandler,
public rfb::Timer::Callback {
public:
@@ -86,6 +85,10 @@
const char* rejectMsg=0);
// rfb::SDesktop callbacks
+ virtual void start(rfb::VNCServer* vs);
+ virtual void stop();
+ virtual void queryConnection(network::Socket* sock,
+ const char* userName);
virtual void pointerEvent(const rfb::Point& pos, int buttonMask);
virtual void keyEvent(rdr::U32 keysym, rdr::U32 keycode, bool down);
virtual void clientCutText(const char* str, int len);
@@ -95,10 +98,6 @@
// rfb::PixelBuffer callbacks
virtual void grabRegion(const rfb::Region& r);
- // rfb::VNCServerST::QueryConnectionHandler callback
- virtual void queryConnection(network::Socket* sock,
- const char* userName);
-
protected:
bool handleListenerEvent(int fd,
std::list<network::SocketListener*>* sockets,