]> source.dussan.org Git - tigervnc.git/commitdiff
Reimplement -listen in the new FLTK vncviewer. Work done by
authorPierre Ossman <ossman@cendio.se>
Fri, 15 Feb 2013 08:33:39 +0000 (08:33 +0000)
committerPierre Ossman <ossman@cendio.se>
Fri, 15 Feb 2013 08:33:39 +0000 (08:33 +0000)
Justina Mickonyte for Cendio.

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@5041 3789f03b-4d11-0410-bbf8-ca57d06f2519

vncviewer/CConn.cxx
vncviewer/CConn.h
vncviewer/parameters.cxx
vncviewer/parameters.h
vncviewer/vncviewer.cxx

index 25e17efc203641a72f4dc008b66649c3843e3b99..e4d55aa041b5f2598d34152ca3d6207df587a3bd 100644 (file)
@@ -67,8 +67,8 @@ static const PixelFormat lowColourPF(8, 6, false, true,
 // 256 colours (palette)
 static const PixelFormat mediumColourPF(8, 8, false, false);
 
-CConn::CConn(const char* vncServerName)
-  : serverHost(0), serverPort(0), sock(NULL), desktop(NULL),
+CConn::CConn(const char* vncServerName, network::Socket* socket=NULL)
+  : serverHost(0), serverPort(0), desktop(NULL),
     pendingPFChange(false),
     currentEncoding(encodingTight), lastServerEncoding((unsigned int)-1),
     formatChange(false), encodingChange(false),
@@ -76,6 +76,7 @@ CConn::CConn(const char* vncServerName)
     forceNonincremental(true), supportsSyncFence(false)
 {
   setShared(::shared);
+  sock = socket;
 
   int encNum = encodingNum(preferredEncoding);
   if (encNum != -1)
@@ -93,16 +94,18 @@ CConn::CConn(const char* vncServerName)
   cp.noJpeg = noJpeg;
   cp.qualityLevel = qualityLevel;
 
-  try {
-    getHostAndPort(vncServerName, &serverHost, &serverPort);
-
-    sock = new network::TcpSocket(serverHost, serverPort);
-    vlog.info(_("connected to host %s port %d"), serverHost, serverPort);
-  } catch (rdr::Exception& e) {
-    vlog.error("%s", e.str());
-    fl_alert("%s", e.str());
-    exit_vncviewer();
-    return;
+  if(sock == NULL) {
+    try {
+      getHostAndPort(vncServerName, &serverHost, &serverPort);
+
+      sock = new network::TcpSocket(serverHost, serverPort);
+      vlog.info(_("connected to host %s port %d"), serverHost, serverPort);
+    } catch (rdr::Exception& e) {
+      vlog.error("%s", e.str());
+      fl_alert("%s", e.str());
+      exit_vncviewer();
+      return;
+    }
   }
 
   Fl::add_fd(sock->getFd(), FL_READ | FL_EXCEPT, socketEvent, this);
index ea4edb55c7b539e6768ef0b1c1d001b2ed5449e5..e48b3c71fa1cdb09053ac20fd35e165b0f5ef447 100644 (file)
@@ -29,7 +29,7 @@ class CConn : public rfb::CConnection,
               public rdr::FdInStreamBlockCallback
 {
 public:
-  CConn(const char* vncServerName);
+  CConn(const char* vncServerName, network::Socket* sock);
   ~CConn();
 
   void refreshFramebuffer();
index d386bd45656a82c9d72d36b47705eb9d5e10455f..6c2af38ac0db9e2d0830cda3b8fe04453e79d4a4 100644 (file)
@@ -102,6 +102,9 @@ StringParameter desktopSize("DesktopSize",
                             "connect (if possible)", "");
 StringParameter geometry("geometry",
                         "Specify size and position of viewer window", "");
+
+BoolParameter listenMode("listen", "Listen for connections from VNC servers", false);
+
 BoolParameter remoteResize("RemoteResize",
                            "Dynamically resize the remote desktop size as "
                            "the size of the local client window changes. "
index 2b4c0390a68fa9572c27d0e31d1703acddf7cffe..9827b1414cacef473d6e974e320ea1fc7ff825c2 100644 (file)
@@ -49,6 +49,8 @@ extern rfb::StringParameter desktopSize;
 extern rfb::StringParameter geometry;
 extern rfb::BoolParameter remoteResize;
 
+extern rfb::BoolParameter listenMode;
+
 extern rfb::BoolParameter viewOnly;
 extern rfb::BoolParameter shared;
 
index 569ee4a0f3c4abf65a5e4f7eea2d5d561f975d81..8e9622a52ebe6752896c1ac344a3c4da52d62ca5 100644 (file)
@@ -24,6 +24,7 @@
 
 #include <string.h>
 #include <stdio.h>
+#include <ctype.h>
 #include <stdlib.h>
 #include <errno.h>
 #include <signal.h>
@@ -441,18 +442,39 @@ int main(int argc, char** argv)
   CSecurityTLS::msg = &dlg;
 #endif
 
-  if (vncServerName[0] == '\0') {
-    ServerDialog::run(defaultServerName, vncServerName);
-    if (vncServerName[0] == '\0')
-      return 1;
-  }
+  Socket *sock = NULL;
+
+  if(listenMode) {
+    try {
+      int port = 5500;
+      if (isdigit(vncServerName[0]))
+        port = atoi(vncServerName);
+
+      TcpListener listener(NULL, port);
+
+      vlog.info("Listening on port %d\n", port);
+      sock = listener.accept();   
+    } catch (rdr::Exception& e) {
+      vlog.error("%s", e.str());
+      fl_alert("%s", e.str());
+      exit_vncviewer();
+      return 1; 
+    }
+
+  } else {
+    if (vncServerName[0] == '\0') {
+      ServerDialog::run(defaultServerName, vncServerName);
+      if (vncServerName[0] == '\0')
+        return 1;
+    }
 
 #ifndef WIN32
-  if (strlen (via.getValueStr()) > 0 && mktunnel() != 0)
-    usage(argv[0]);
+    if (strlen (via.getValueStr()) > 0 && mktunnel() != 0)
+      usage(argv[0]);
 #endif
+  }
 
-  CConn *cc = new CConn(vncServerName);
+  CConn *cc = new CConn(vncServerName, sock);
 
   while (!exitMainloop) {
     int next_timer;