add 'listen for incoming connections' option to host list
authorChristian Pulvermacher <christian@hazel.(none)>
Mon, 11 Oct 2010 16:53:24 +0000 (18:53 +0200)
committerChristian Pulvermacher <christian@hazel.(none)>
Mon, 11 Oct 2010 16:53:24 +0000 (18:53 +0200)
src/connectdialog.cpp
src/connectdialog.h
src/mainwindow.cpp
src/mainwindow.h
src/vncclientthread.cpp
src/vncclientthread.h
src/vncview.cpp
src/vncview.h

index cdb064f..9d21ad6 100644 (file)
@@ -25,8 +25,6 @@
 
 #include "connectdialog.h"
 
-#include <iostream>
-
 
 ConnectDialog::ConnectDialog(QWidget *parent):
        QDialog(parent)
@@ -51,12 +49,16 @@ ConnectDialog::ConnectDialog(QWidget *parent):
 
        //set up combobox
        hosts.addItems(hostnames_sorted);
+       hosts.insertSeparator(hosts.count());
+       hosts.addItem(QIcon("/usr/share/icons/hicolor/48x48/hildon/general_received.png"), tr("Listen for Incoming Connections"));
        hosts.setEditable(true);
 #ifdef Q_WS_MAEMO_5
        hosts.lineEdit()->setInputMethodHints(Qt::ImhNoAutoUppercase); //somehow this doesn't work that well here
 #endif
        connect(&hosts, SIGNAL(editTextChanged(QString)),
                this, SLOT(hostnameUpdated(QString)));
+       connect(&hosts, SIGNAL(currentIndexChanged(int)),
+               this, SLOT(indexChanged(int)));
        layout.addWidget(&hosts);
 
 #ifdef Q_WS_MAEMO_5
@@ -84,6 +86,15 @@ ConnectDialog::ConnectDialog(QWidget *parent):
        setLayout(&layout);
 }
 
+void ConnectDialog::indexChanged(int index) {
+       if(index == -1)
+               return;
+
+       //disallow editing for special entries (icon set)
+       hosts.setEditable(hosts.itemIcon(index).isNull());
+}
+
+
 void ConnectDialog::hostnameUpdated(QString newtext)
 {
        //clean up hostname
@@ -112,6 +123,11 @@ void ConnectDialog::accept()
                deleteLater();
                return;
        }
+       if(!hosts.itemIcon(hosts.currentIndex()).isNull()) {
+               emit connectToHost("", 2, 5900); //TODO: quality and port from user input
+               deleteLater();
+               return;
+       }
 
        QSettings settings;
        settings.beginGroup("hosts");
@@ -142,6 +158,6 @@ void ConnectDialog::accept()
        settings.endGroup();
        settings.sync();
 
-       emit connectToHost(QString("vnc://%1").arg(selected_host), quality);
+       emit connectToHost(QString("vnc://%1").arg(selected_host), quality, 0);
        deleteLater();
 }
index 414b468..8593a8d 100644 (file)
@@ -31,8 +31,9 @@ public:
 public slots:
        virtual void accept();
 signals:
-       void connectToHost(QString url, int quality);
+       void connectToHost(QString url, int quality, int listen_port);
 private slots:
+       void indexChanged(int index);
        void hostnameUpdated(QString newtext);
 private:
        QHBoxLayout layout;
index 0a46c65..4044387 100644 (file)
@@ -183,16 +183,16 @@ and LibVNCServer, &copy; 2001-2003 Johannes E. Schindelin</p>\
 void MainWindow::showConnectDialog()
 {
        ConnectDialog *connect_dialog = new ConnectDialog(this);
-       connect(connect_dialog, SIGNAL(connectToHost(QString, int)),
-               this, SLOT(connectToHost(QString, int)));
+       connect(connect_dialog, SIGNAL(connectToHost(QString, int, int)),
+               this, SLOT(connectToHost(QString, int, int)));
        connect_dialog->exec();
 }
 
-void MainWindow::connectToHost(QString url, int quality)
+void MainWindow::connectToHost(QString url, int quality, int listen_port)
 {
        disconnectFromHost();
 
-       vnc_view = new VncView(this, url, RemoteView::Quality(quality));
+       vnc_view = new VncView(this, url, RemoteView::Quality(quality), listen_port);
 
        connect(vnc_view, SIGNAL(statusChanged(RemoteView::RemoteStatus)),
                this, SLOT(statusChanged(RemoteView::RemoteStatus)));
index 91248e0..24a508f 100644 (file)
@@ -47,7 +47,7 @@ public:
 public slots:
        void about();
        void showConnectDialog();
-       void connectToHost(QString url, int quality);
+       void connectToHost(QString url, int quality, int listen_port);
        void disconnectFromHost();
        void forceResize();
        void forceResizeDelayed();
index 95b418a..e215b3d 100644 (file)
@@ -278,8 +278,16 @@ void VncClientThread::run()
 
         kDebug(5011) << "--------------------- trying init ---------------------";
 
-        if (rfbInitClient(cl, 0, 0))
-            break;
+               if(listen_port) { //listen for incoming connections
+                       int argc = 2;
+                       char* argv[2] = { "x", "-listen" }; //this isn't exactly elegant..
+                       cl->listenPort = listen_port;
+                       if (rfbInitClient(cl, &argc, argv))
+                               break;
+               } else { //connect to host
+                       if (rfbInitClient(cl, 0, 0))
+                               break;
+               }
 
         if (m_passwordError) {
                        passwd_failures++;
index 6940cad..20a11e6 100644 (file)
@@ -106,13 +106,10 @@ public:
     void stop();
     void setHost(const QString &host);
     void setPort(int port);
+       void setListenPort(int port) { listen_port = port; }
     void setQuality(RemoteView::Quality quality);
-    void setPassword(const QString &password) {
-        m_password = password;
-    }
-    const QString password() const {
-        return m_password;
-    }
+    void setPassword(const QString &password) { m_password = password; }
+    const QString password() const { return m_password; }
 
     RemoteView::Quality quality() const;
     uint8_t *frameBuffer;
@@ -142,7 +139,7 @@ private:
     rfbClient *cl;
     QString m_host;
     QString m_password;
-    int m_port;
+    int m_port, listen_port;
     QMutex mutex;
     RemoteView::Quality m_quality;
     QQueue<ClientEvent* > m_eventQueue;
index fd157c8..b31aeae 100644 (file)
@@ -55,7 +55,7 @@ critical(parent, caption, message)
 //local cursor width/height in px, should be an odd number
 const int cursor_size = 7;
 
-VncView::VncView(QWidget *parent, const KUrl &url, RemoteView::Quality quality)
+VncView::VncView(QWidget *parent, const KUrl &url, RemoteView::Quality quality, int listen_port)
         : RemoteView(parent),
         m_initDone(false),
         m_buttonMask(0),
@@ -69,7 +69,8 @@ VncView::VncView(QWidget *parent, const KUrl &url, RemoteView::Quality quality)
         m_verticalFactor(1.0),
         m_forceLocalCursor(false),
        force_full_repaint(false),
-       quality(quality)
+       quality(quality),
+       listen_port(listen_port)
 {
     m_url = url;
     m_host = url.host();
@@ -168,7 +169,7 @@ bool VncView::start()
 {
     vncThread.setHost(m_host);
     vncThread.setPort(m_port);
-
+       vncThread.setListenPort(listen_port); //if port is != 0, thread will listen for connections
     vncThread.setQuality(quality);
 
     // set local cursor on by default because low quality mostly means slow internet connection
index 6bcc2ff..2b7dde3 100644 (file)
@@ -41,7 +41,7 @@ class VncView: public RemoteView
     Q_OBJECT
 
 public:
-    explicit VncView(QWidget *parent = 0, const KUrl &url = KUrl(), RemoteView::Quality quality = RemoteView::Medium);
+    explicit VncView(QWidget *parent = 0, const KUrl &url = KUrl(), RemoteView::Quality quality = RemoteView::Medium, int listen_port = 0);
     ~VncView();
 
     QSize framebufferSize();
@@ -80,6 +80,7 @@ private:
     QMap<unsigned int, bool> m_mods;
     int m_x, m_y, m_w, m_h;
     int cursor_x, cursor_y;
+       int listen_port;
     bool m_repaint;
     bool m_quitFlag;
     bool m_firstPasswordTry;