[X2go-Commits] x2godesktopsharing.git - master (branch) updated: 3.0.1.2-15-gcf35615

X2go dev team git-admin at x2go.org
Wed Sep 28 14:24:15 CEST 2011


The branch, master has been updated
       via  cf356157e83da59220ab7af3c8bb71f722b3e754 (commit)
       via  619fa9d40858791b1bf98754ed110c606c634005 (commit)
       via  a17eb04222eac5aee009924f004df2ad6342eb34 (commit)
      from  37b57f64cab0f715aae80056a5c0053eafb3390d (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit cf356157e83da59220ab7af3c8bb71f722b3e754
Author: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
Date:   Wed Sep 28 14:21:46 2011 +0200

    Add signal handler so that unix signals can be handled within Qt.

commit 619fa9d40858791b1bf98754ed110c606c634005
Author: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
Date:   Wed Sep 28 13:11:00 2011 +0200

    add debug code

commit a17eb04222eac5aee009924f004df2ad6342eb34
Author: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
Date:   Wed Sep 28 12:44:08 2011 +0200

    tab'ified main.cpp

-----------------------------------------------------------------------

Summary of changes:
 debian/changelog |    1 +
 main.cpp         |  197 ++++++++++++++++++++++++++++++------------------------
 sharetray.cpp    |   63 ++++++++++++++++-
 sharetray.h      |   25 ++++++--
 4 files changed, 190 insertions(+), 96 deletions(-)

The diff of changes is:
diff --git a/debian/changelog b/debian/changelog
index 5967ad9..906ed53 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -8,6 +8,7 @@ x2godesktopsharing (3.0.1.3-0~x2go1) UNRELEASED; urgency=low
       of group x2godesktopsharing.
     - Differentiate between local and remote user, fixes display of wrong
       user name for remote user.
+    - Add signal handler so that unix signals can be handled within Qt.
   Depend on x2goserver (>=3.0.99.6).
 
  -- Mike Gabriel <mike.gabriel at das-netzwerkteam.de>  Mon, 13 Jun 2011 20:39:33 +0200
diff --git a/main.cpp b/main.cpp
index 7917c66..fa54d3d 100644
--- a/main.cpp
+++ b/main.cpp
@@ -26,102 +26,123 @@
 #include <QLocalSocket>
 #include <iostream>
 #include <QDir>
-
+#include <csignal>
 
 using namespace std;
 
 void  client ( const QStringList & cmd )
 {
 
-    if ( cmd.size() !=11 )
-    {
-        cerr<<"wrong parameters"<<endl;
-        cout<<"DENY";
-	return;
-    }
-    QStringList params=cmd[9].split ( "XSHAD" );
-    if ( params.size() !=3 )
-    {
-        cerr<<"wrong parameters"<<endl;
-        cout<<"DENY";
-	return;
-    }
-
-    cerr<<"starting x2godesktopsharing in client mode, cmd: "<<
-        cmd.join(" ").toAscii().data() <<std::endl;
-
-    QString dispname=params[2];
-    QString socketName=QDir::tempPath() +"/x2godesktopsharing_@"+
-                       params[1]+"@"+dispname;
-    QLocalSocket sock;
-    sock.connectToServer ( socketName );
-    if ( !sock.waitForConnected ( 3000 ) )
-    {
-        QString message="Unable to connect: " +socketName;
-        cout<<"DENY";
-        cerr<<message.toAscii().data() <<endl;
-	return;
-    }
-    sock.write ( cmd.join(" ").toAscii().data(),cmd.join(" ").toAscii().length() );
-    if ( !sock.waitForReadyRead() )
-    {
-        cout<<"DENY";
-        cerr<<"Cannot write to socket: "<<socketName.toAscii().data() <<endl;
-        return;;
-    }
-    char buffer[256];
-    int read=sock.read ( buffer,255 );
-    if ( read<=0 )
-    {
-        cout<<"DENY";
-        cerr<<"Cannot read from socket: " <<socketName.toAscii().data() <<endl;
-        return;    
-    }
-    buffer[read]=0;
-    cout<<buffer<<endl;
+	if ( cmd.size() !=11 )
+	{
+		cerr<<"wrong parameters"<<endl;
+		cout<<"DENY";
+		return;
+	}
+	QStringList params=cmd[9].split ( "XSHAD" );
+	if ( params.size() !=3 )
+	{
+		cerr<<"wrong parameters"<<endl;
+		cout<<"DENY";
+		return;
+	}
+
+	cerr<<"starting x2godesktopsharing in client mode, cmd: "<<
+	cmd.join(" ").toAscii().data() <<std::endl;
+
+	QString dispname=params[2];
+	QString socketName=QDir::tempPath() +"/x2godesktopsharing_@"+
+	                   params[1]+"@"+dispname;
+	QLocalSocket sock;
+	sock.connectToServer ( socketName );
+	if ( !sock.waitForConnected ( 3000 ) )
+	{
+		QString message="Unable to connect: " +socketName;
+		cout<<"DENY";
+		cerr<<message.toAscii().data() <<endl;
+		return;
+	}
+	sock.write ( cmd.join(" ").toAscii().data(),cmd.join(" ").toAscii().length() );
+	if ( !sock.waitForReadyRead() )
+	{
+		cout<<"DENY";
+		cerr<<"Cannot write to socket: "<<socketName.toAscii().data() <<endl;
+		return;;
+	}
+	char buffer[256];
+	int read=sock.read ( buffer,255 );
+	if ( read<=0 )
+	{
+		cout<<"DENY";
+		cerr<<"Cannot read from socket: " <<socketName.toAscii().data() <<endl;
+		return;
+	}
+	buffer[read]=0;
+	cout<<buffer<<endl;
+}
+
+static int setup_unix_signal_handlers()
+{
+	struct sigaction keybint, term;
+
+	keybint.sa_handler = ShareTray::keybintSignalHandler;
+	sigemptyset(&keybint.sa_mask);
+	keybint.sa_flags = 0;
+	keybint.sa_flags |= SA_RESTART;
+
+	if (sigaction(SIGINT, &keybint, 0) > 0)
+		return 1;
+
+	term.sa_handler = ShareTray::termSignalHandler;
+	sigemptyset(&term.sa_mask);
+	term.sa_flags |= SA_RESTART;
+
+	if (sigaction(SIGTERM, &term, 0) > 0)
+	return 2;
+
+	return 0;
 }
 
 int main ( int argc, char *argv[] )
 {
-    if ( argc>2 )
-    {
-        QString par=argv[1];
-        if ( par == "client" )
-        {
-            QStringList cmdl;
-            for ( int i=2; i<argc;++i )
-                cmdl<<argv[i];
-            client ( cmdl );
-            return 0;
-        }
-    }
-
-    QApplication app ( argc,argv );
-    QTranslator translator;
-    QString filename=QString ( ":/x2godesktopsharing_%1" ).arg (
-                         QLocale::system().name() );
-    filename=filename.toLower();
-    if ( !translator.load ( filename ) )
-    {
-        qDebug ( "Can't load translator (%s) !\n",
-                 filename.toLocal8Bit().data() );
-    }
-    else
-        app.installTranslator ( &translator );
-
-
-    QTranslator qtTranslator;
-    filename=QString ( ":/qt_%1" ).arg ( QLocale::system().name() );
-    if ( !qtTranslator.load ( filename ) )
-    {
-        qDebug ( "Can't load translator (%s) !\n",
-                 filename.toLocal8Bit().data() );
-    }
-    else
-        app.installTranslator ( &qtTranslator );
-    ShareTray* tray=new ShareTray;
-    tray->hide();
-
-
-    return app.exec();
+	if ( argc>2 )
+	{
+		QString par=argv[1];
+		if ( par == "client" )
+		{
+			QStringList cmdl;
+			for ( int i=2; i<argc;++i )
+			cmdl<<argv[i];
+			client ( cmdl );
+			return 0;
+		}
+	}
+
+	QApplication app ( argc,argv );
+	QTranslator translator;
+	QString filename=QString ( ":/x2godesktopsharing_%1" ).arg (
+	                 QLocale::system().name() );
+	filename=filename.toLower();
+	if ( !translator.load ( filename ) )
+	{
+		qDebug ( "Can't load translator (%s) !\n",
+		         filename.toLocal8Bit().data() );
+	}
+	else
+		app.installTranslator ( &translator );
+
+	QTranslator qtTranslator;
+	filename=QString ( ":/qt_%1" ).arg ( QLocale::system().name() );
+	if ( !qtTranslator.load ( filename ) )
+	{
+		qDebug ( "Can't load translator (%s) !\n",
+		         filename.toLocal8Bit().data() );
+	}
+	else
+		app.installTranslator ( &qtTranslator );
+
+	ShareTray* tray=new ShareTray;
+	tray->hide();
+	setup_unix_signal_handlers();
+	return app.exec();
 }
diff --git a/sharetray.cpp b/sharetray.cpp
index df08bf5..56a785c 100644
--- a/sharetray.cpp
+++ b/sharetray.cpp
@@ -17,10 +17,12 @@
 #include <QDir>
 #include <QtDebug>
 #include <QMessageBox>
+#include <QSocketNotifier>
+#include <sys/socket.h>
 #include "simplelocalsocket.h"
 #include "accessaction.h"
 #include <sys/types.h>
-#include <signal.h>
+#include <csignal>
 #include <errno.h>
 #include <QToolTip>
 #include <QTimer>
@@ -35,6 +37,10 @@
 
 #define VERSION "3.0.1.3"
 
+//needed to not get an undefined reference to static members
+int ShareTray::sigkeybintFd[2];
+int ShareTray::sigtermFd[2];
+
 ShareTray::ShareTray()
         : QMainWindow()
 {
@@ -165,6 +171,18 @@ ShareTray::ShareTray()
 
     actStop->setEnabled ( false );
 
+	// unix signals (TERM, INT) are piped into a unix socket and will raise Qt events
+	if (::socketpair(AF_UNIX, SOCK_STREAM, 0, sigkeybintFd))
+		qFatal("Couldn't create keyboard INT socketpair");
+
+	if (::socketpair(AF_UNIX, SOCK_STREAM, 0, sigtermFd))
+		qFatal("Couldn't create TERM socketpair");
+
+	snKeybInt = new QSocketNotifier(sigkeybintFd[1], QSocketNotifier::Read, this);
+	connect(snKeybInt, SIGNAL(activated(int)), this, SLOT(handleSigKeybInt()));
+	snTerm = new QSocketNotifier(sigtermFd[1], QSocketNotifier::Read, this);
+	connect(snTerm, SIGNAL(activated(int)), this, SLOT(handleSigTerm()));
+
     QTimer *timer = new QTimer ( this );
     connect ( timer, SIGNAL ( timeout() ), this, SLOT ( slotTimer() ) );
     timer->start ( 5000 );
@@ -176,12 +194,50 @@ ShareTray::ShareTray()
 
 ShareTray::~ShareTray()
 {
+    qDebug() <<"stopping desktop sharing";
     slotStopSharing();
     if ( QFile::exists ( lockFname ) )
         QFile::remove ( lockFname );
+        qDebug() <<"lock file removed";
     saveSettings();
+    qDebug() <<"settings saved";
 }
 
+void ShareTray::handleSigKeybInt()
+{
+	snKeybInt->setEnabled(false);
+	char tmp;
+	::read(sigkeybintFd[1], &tmp, sizeof(tmp));
+
+	// do Qt stuff here
+	slotMenuClose();
+
+	snKeybInt->setEnabled(true);
+}
+
+void ShareTray::handleSigTerm()
+{
+	snTerm->setEnabled(false);
+	char tmp;
+	::read(sigtermFd[1], &tmp, sizeof(tmp));
+
+	// do Qt stuff here
+	slotMenuClose();
+
+	snTerm->setEnabled(true);
+}
+
+void ShareTray::keybintSignalHandler(int)
+{
+	char a = 1;
+	::write(sigkeybintFd[0], &a, sizeof(a));
+}
+
+void ShareTray::termSignalHandler(int)
+{
+	char a = 1;
+	::write(sigtermFd[0], &a, sizeof(a));
+}
 
 void ShareTray::slotStopSharing()
 {
@@ -351,10 +407,13 @@ void ShareTray::closeEvent ( QCloseEvent*  ev )
         hide();
         return;
     }
+    qDebug() <<"stopping desktop sharing";
     slotStopSharing();
     if ( QFile::exists ( lockFname ) )
         QFile::remove ( lockFname );
+        qDebug() <<"lock file removed";
     saveSettings();
+    qDebug() <<"settings saved";
 }
 
 void ShareTray::slotTimer()
@@ -538,8 +597,6 @@ void ShareTray::slotMenuClose()
     close();
 }
 
-
-
 void ShareTray::slotUpdateLockFile()
 {
     QFile file ( lockFname );
diff --git a/sharetray.h b/sharetray.h
index 137ba61..d2c2531 100644
--- a/sharetray.h
+++ b/sharetray.h
@@ -22,6 +22,7 @@ class AccessAction;
 class QSystemTrayIcon;
 class MessageBox;
 class QAction;
+class QSocketNotifier;
 
 /**
 	@author Oleksandr Shneyder <oleksandr.shneyder at obviously-nice.de>
@@ -30,11 +31,16 @@ class ShareTray : public QMainWindow
 {
     Q_OBJECT
 public:
-    ShareTray();
-    ~ShareTray();
-    QString getSocketAnswer(QString message);
-    void closeSocket(SimpleLocalSocket* sock);
-    bool acceptConnections();
+	ShareTray();
+	~ShareTray();
+	// Unix signal handlers.
+	static void keybintSignalHandler(int unused);
+	static void termSignalHandler(int unused);
+	// desktop sharing socket
+	QString getSocketAnswer(QString message);
+	void closeSocket(SimpleLocalSocket* sock);
+	// entry point for incoming connections
+	bool acceptConnections();
 private:
     enum {BLACK,WHITE} current_list;
     QMenu* menu;
@@ -55,6 +61,10 @@ private:
 protected:
     void closeEvent ( QCloseEvent* event );
 
+public slots:
+	// Qt signal handlers.
+	void handleSigKeybInt();
+	void handleSigTerm();
 private slots:
     void slotStopSharing();
     void slotStartSharing();
@@ -78,6 +88,11 @@ private:
     void saveSettings();
     void setTrayIcon();
     void showList();
+	// unix file sockets for signal handler communication (unix <-> Qt)
+	static int sigkeybintFd[2];
+	static int sigtermFd[2];
+	QSocketNotifier *snKeybInt;
+	QSocketNotifier *snTerm;
 };
 
 #endif


hooks/post-receive
-- 
x2godesktopsharing.git (Desktop Sharing for X2go)

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "x2godesktopsharing.git" (Desktop Sharing for X2go).




More information about the x2go-commits mailing list