]> source.dussan.org Git - tigervnc.git/commitdiff
Merged the x0vncserver directory with VNC 4.1.1.
authorConstantin Kaplinsky <const@tightvnc.com>
Mon, 17 Apr 2006 08:46:22 +0000 (08:46 +0000)
committerConstantin Kaplinsky <const@tightvnc.com>
Mon, 17 Apr 2006 08:46:22 +0000 (08:46 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/branches/merge-with-vnc-4.1.1@529 3789f03b-4d11-0410-bbf8-ca57d06f2519

x0vncserver/Image.cxx
x0vncserver/Makefile.in
x0vncserver/x0vncserver.cxx
x0vncserver/x0vncserver.man

index ef7237895af3d7572fa4226d86b3cf86e8fb6f5f..d78a98e1e99edfc06467dbb796aa52ff0259e03b 100644 (file)
@@ -92,6 +92,8 @@ Image::~Image()
   // fprintf(stderr, "~Image() called\n");
 
   imageCleanup.images.remove(this);
+
+  // XDestroyImage will free xim->data if necessary
   if (xim != NULL)
     XDestroyImage(xim);
 }
index b6bd0babe43043f2e28ea24455c40fa13077d0b1..3657eeae6d29f9476f7ded112aea6ee64285430e 100644 (file)
@@ -1,18 +1,21 @@
 
 SRCS = Image.cxx TimeMillis.cxx PollingScheduler.cxx PollingManager.cxx \
-       x0vncserver.cxx
+       x0vncserver.cxx ../vncconfig/QueryConnectDialog.cxx
 
 OBJS = $(SRCS:.cxx=.o)
 
 program = x0vncserver
 
-DEP_LIBS = ../rfb/librfb.a ../network/libnetwork.a ../rdr/librdr.a
+DEP_LIBS = ../rfb/librfb.a \
+           ../network/libnetwork.a \
+           ../rdr/librdr.a \
+          ../tx/libtx.a
 
 EXTRA_LIBS = @ZLIB_LIB@ @JPEG_LIB@ @INET_LIB@ @X_PRE_LIBS@ @X_LIBS@ \
              @XTEST_LIB@ -lXext -lX11 @X_EXTRA_LIBS@
 
 # X_CFLAGS are really CPPFLAGS
-DIR_CPPFLAGS = -I$(top_srcdir) \
+DIR_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/tx -I$(top_srcdir)/vncconfig \
   @XTEST_DEFINE@ @READDISPLAY_DEFINE@ @MITSHM_DEFINE@ @X_CFLAGS@
 
 all:: $(program)
index ac65c0bef5a9ad3f542b9ce610640111d8a59a97..f46a0c92e43273a60a975ea67641b6706c1ae402 100644 (file)
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2004 RealVNC Ltd.  All Rights Reserved.
- * Copyright (C) 2004-2005 Constantin Kaplinsky.  All Rights Reserved.
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright (C) 2004-2006 Constantin Kaplinsky.  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
@@ -32,6 +32,9 @@
 #include <rfb/SSecurityFactoryStandard.h>
 
 #include <network/TcpSocket.h>
+#include <tx/TXWindow.h>
+
+#include <vncconfig_unix/QueryConnectDialog.h">
 
 #include <signal.h>
 #include <X11/X.h>
@@ -65,8 +68,11 @@ BoolParameter useOverlay("OverlayMode", "Use overlay mode under "
                          "IRIX or Solaris", true);
 StringParameter displayname("display", "The X display", "");
 IntParameter rfbport("rfbport", "TCP port to listen for RFB protocol",5900);
+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", "");
-VncAuthPasswdFileParameter vncAuthPasswdFile;
 
 static void CleanupSignalHandler(int sig)
 {
@@ -77,12 +83,56 @@ static void CleanupSignalHandler(int sig)
 }
 
 
-class XDesktop : public SDesktop, public rfb::ColourMap
+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 VNCServerST::queryResult queryConnection(network::Socket* sock,
+                                                   const char* userName,
+                                                   char** reason) {
+    if (queryConnectSock) {
+      *reason = strDup("Another connection is currently being queried.");
+      return VNCServerST::REJECT;
+    }
+    if (!userName) userName = "(anonymous)";
+    queryConnectSock = sock;
+    CharArray address(sock->getPeerAddress());
+    delete queryConnectDialog;
+    queryConnectDialog = new QueryConnectDialog(display, address.buf,
+                                                userName, queryConnectTimeout,
+                                                this);
+    queryConnectDialog->map();
+    return VNCServerST::PENDING;
+  }
+
+  // -=- 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 XDesktop : public SDesktop, public ColourMap
 {
 public:
   XDesktop(Display* dpy_)
-    : dpy(dpy_), pb(0), server(0), oldButtonMask(0), haveXtest(false),
-      maxButtons(0)
+        : dpy(dpy_), pb(0), server(0), image(0), pollmgr(0),
+      oldButtonMask(0), haveXtest(false), maxButtons(0)
   {
 #ifdef HAVE_XTEST
     int xtestEventBase;
@@ -102,6 +152,15 @@ public:
     }
 #endif
 
+  }
+  virtual ~XDesktop() {
+    stop();
+  }
+
+  // -=- SDesktop interface
+
+  virtual void start(VNCServer* vs) {
+
     // Determine actual number of buttons of the X pointer device.
     unsigned char btnMap[8];
     int numButtons = XGetPointerMapping(dpy, btnMap, 8);
@@ -117,6 +176,7 @@ public:
     image->get(DefaultRootWindow(dpy));
 
     pollmgr = new PollingManager(dpy, image, &factory);
+    pollmgr->setVNCServer(vs);
 
     pf.bpp = image->xim->bits_per_pixel;
     pf.depth = image->xim->depth;
@@ -131,25 +191,21 @@ public:
 
     pb = new FullFramePixelBuffer(pf, dpyWidth, dpyHeight,
                                   (rdr::U8*)image->xim->data, this);
+    server = vs;
+    server->setPixelBuffer(pb);
   }
-  virtual ~XDesktop() {
+
+  virtual void stop() {
     delete pb;
     delete pollmgr;
-  }
-
-  void setVNCServer(VNCServer* s) {
-    server = s;
-    pollmgr->setVNCServer(s);
-    server->setPixelBuffer(pb);
+    // FIXME: Delete images as well?!
   }
 
   inline void poll() {
     pollmgr->poll();
   }
 
-  // -=- SDesktop interface
-
-  virtual void pointerEvent(const Point& pos, rdr::U8 buttonMask) {
+  virtual void pointerEvent(const Point& pos, int buttonMask) {
     pollmgr->setPointerPos(pos);
 #ifdef HAVE_XTEST
     if (!haveXtest) return;
@@ -185,7 +241,7 @@ public:
     return Point(pb->width(), pb->height());
   }
 
-  // rfb::ColourMap callbacks
+  // -=- ColourMap callbacks
   virtual void lookup(int index, int* r, int* g, int* b) {
     XColor xc;
     xc.pixel = index;
@@ -311,7 +367,6 @@ private:
 
 };
 
-
 char* programName;
 
 static void usage()
@@ -365,11 +420,12 @@ int main(int argc, char** argv)
   signal(SIGTERM, CleanupSignalHandler);
 
   try {
+    TXWindow::init(dpy,"x0vncserver");
     XDesktop desktop(dpy);
     VNCServerST server("x0vncserver", &desktop);
-    desktop.setVNCServer(&server);
+    QueryConnHandler qcHandler(dpy, &server);
+    server.setQueryConnectionHandler(&qcHandler);
 
-    TcpSocket::initTcpSockets();
     TcpListener listener((int)rfbport);
     vlog.info("Listening on port %d", (int)rfbport);
 
@@ -379,21 +435,27 @@ int main(int argc, char** argv)
 
     PollingScheduler sched((int)pollingCycle, (int)maxProcessorUsage);
 
-    fd_set rfds;
-    struct timeval tv;
-
     while (true) {
+      struct timeval tv;
+      fd_set rfds;
+      std::list<Socket*> sockets;
+      std::list<Socket*>::iterator i;
+
+      // Process any incoming X events
+      TXWindow::handleXEvents(dpy);
 
       FD_ZERO(&rfds);
       FD_SET(listener.getFd(), &rfds);
-
-      std::list<Socket*> sockets;
       server.getSockets(&sockets);
-      std::list<Socket*>::iterator i;
       int clients_connected = 0;
       for (i = sockets.begin(); i != sockets.end(); i++) {
-        FD_SET((*i)->getFd(), &rfds);
-        clients_connected++;
+        if ((*i)->isShutdown()) {
+          server.removeSocket(*i);
+          delete (*i);
+        } else {
+          FD_SET((*i)->getFd(), &rfds);
+          clients_connected++;
+        }
       }
 
       if (clients_connected) {
@@ -411,6 +473,7 @@ int main(int argc, char** argv)
       }
       tv.tv_sec = 0;
 
+      // Do the wait...
       sched.sleepStarted();
       int n = select(FD_SETSIZE, &rfds, 0, 0, &tv);
       sched.sleepFinished();
@@ -424,10 +487,11 @@ int main(int argc, char** argv)
         }
       }
 
+      // Accept new VNC connections
       if (FD_ISSET(listener.getFd(), &rfds)) {
         Socket* sock = listener.accept();
         if (sock) {
-          server.addClient(sock);
+          server.addSocket(sock);
         } else {
           vlog.status("Client connection rejected");
         }
@@ -439,10 +503,10 @@ int main(int argc, char** argv)
       if (sockets.empty())
         continue;
 
+      // Process events on existing VNC connections
       for (i = sockets.begin(); i != sockets.end(); i++) {
-        if (FD_ISSET((*i)->getFd(), &rfds)) {
+        if (FD_ISSET((*i)->getFd(), &rfds))
           server.processSocketEvent(*i);
-        }
       }
 
       server.checkTimeouts();
index d9f43b5473198c4472478a2c8ce3382f109b028b..da9ba9442bdee00c1e5c3bf5bb9b750365ab051c 100644 (file)
@@ -1,4 +1,4 @@
-.TH x0vncserver 1 "30 December 2004" "TightVNC" "Virtual Network Computing"
+.TH x0vncserver 1 "17 Apr 2006" "TightVNC" "Virtual Network Computing"
 .SH NAME
 x0vncserver \- VNC server which continuously polls an X display
 .SH SYNOPSIS