diff options
author | Oswald Buddenhagen <oswald.buddenhagen@nokia.com> | 2009-04-24 08:07:00 (GMT) |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@nokia.com> | 2009-05-06 11:43:21 (GMT) |
commit | 3e89f8d598a677f004cb273dd2c3cc03d68f32eb (patch) | |
tree | aee61f15e06d12a40a1f7e27c11c89efa28d6f5a /src/network/socket/qlocalserver_p.h | |
parent | a2a8773f8c226f79727b39d42c7796fc91c4d60e (diff) | |
download | Qt-3e89f8d598a677f004cb273dd2c3cc03d68f32eb.zip Qt-3e89f8d598a677f004cb273dd2c3cc03d68f32eb.tar.gz Qt-3e89f8d598a677f004cb273dd2c3cc03d68f32eb.tar.bz2 |
rewrite QLocalServer native Windows implementation.
this makes it much less arcane and buggy, specifically it resolves the
internal thread-unsafety.
Reviewed-by: thiago
Diffstat (limited to 'src/network/socket/qlocalserver_p.h')
-rw-r--r-- | src/network/socket/qlocalserver_p.h | 59 |
1 files changed, 13 insertions, 46 deletions
diff --git a/src/network/socket/qlocalserver_p.h b/src/network/socket/qlocalserver_p.h index 8e96401..9af4a20 100644 --- a/src/network/socket/qlocalserver_p.h +++ b/src/network/socket/qlocalserver_p.h @@ -63,7 +63,7 @@ # include <qtcpserver.h> #elif defined(Q_OS_WIN) # include <qt_windows.h> -# include <qthread.h> +# include <private/qwineventnotifier_p.h> #else # include <private/qnativesocketengine_p.h> # include <qsocketnotifier.h> @@ -71,52 +71,13 @@ QT_BEGIN_NAMESPACE -#if defined(Q_OS_WIN) && !defined(QT_LOCALSOCKET_TCP) - -/*! - \internal - QLocalServerThread exists because Windows does not have a - way to provide notifications when there is a new connections to - the server. - */ -class QLocalServerThread : public QThread -{ - Q_OBJECT - -Q_SIGNALS: - void connected(HANDLE newSocket); - void error(QAbstractSocket::SocketError error, const QString &errorString); - -public: - QLocalServerThread(QObject *parent = 0); - ~QLocalServerThread(); - void closeServer(); - -public: - QString setName(const QString &name); - void run(); - void stop(); - bool makeHandle(); - - HANDLE gotConnectionEvent; - QQueue<HANDLE> pendingHandles; - int maxPendingConnections; -private: - HANDLE stopEvent; - QString fullServerName; -}; - -#endif - class QLocalServerPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QLocalServer) public: QLocalServerPrivate() : -#if defined(Q_OS_WIN) && !defined(QT_LOCALSOCKET_TCP) - inWaitingFunction(false), -#elif !defined(QT_LOCALSOCKET_TCP) +#if !defined(QT_LOCALSOCKET_TCP) && !defined(Q_OS_WIN) listenSocket(-1), socketNotifier(0), #endif maxPendingConnections(30), error(QAbstractSocket::UnknownSocketError) @@ -135,12 +96,18 @@ public: QTcpServer tcpServer; QMap<quintptr, QTcpSocket*> socketMap; #elif defined(Q_OS_WIN) - void _q_openSocket(HANDLE socket); - void _q_stoppedListening(); - void _q_setError(QAbstractSocket::SocketError error, const QString &errorString); + struct Listener { + HANDLE handle; + OVERLAPPED overlapped; + }; + + void setError(const QString &function); + bool addListener(); + void _q_onNewConnection(); - QLocalServerThread waitForConnection; - bool inWaitingFunction; + QList<Listener> listeners; + HANDLE eventHandle; + QWinEventNotifier *connectionEventNotifier; #else void setError(const QString &function); void _q_socketActivated(); |