Handle multiple connections properly.

This commit is contained in:
Florian Bruhin 2014-10-13 21:12:15 +02:00
parent 9e2e684124
commit c42fc53980

View File

@ -52,7 +52,7 @@ class IPCServer(QObject):
raise IPCError("Error while listening to IPC server: {} " raise IPCError("Error while listening to IPC server: {} "
"(error {})".format(self._server.errorString(), "(error {})".format(self._server.errorString(),
self._server.serverError())) self._server.serverError()))
self._server.newConnection.connect(self.on_connection) self._server.newConnection.connect(self.handle_connection)
self._socket = None self._socket = None
def _remove_server(self): def _remove_server(self):
@ -69,14 +69,16 @@ class IPCServer(QObject):
_socket_error("handling IPC connection", self._socket) _socket_error("handling IPC connection", self._socket)
@pyqtSlot() @pyqtSlot()
def on_connection(self): def handle_connection(self):
"""Slot for a new connection for the local socket.""" """Handle a new connection to the server."""
socket = self._server.nextPendingConnection()
if self._socket is not None: if self._socket is not None:
# We already have a connection running, so we refuse this one. # We already have a connection running, so we don't handle this one
socket.close() # yet.
socket.deleteLater() return
else: socket = self._server.nextPendingConnection()
if socket is None:
# No new pending connections.
return
socket.readyRead.connect(self.on_ready_read) socket.readyRead.connect(self.on_ready_read)
socket.disconnected.connect(self.on_disconnected) socket.disconnected.connect(self.on_disconnected)
socket.error.connect(self.on_error) socket.error.connect(self.on_error)
@ -87,6 +89,8 @@ class IPCServer(QObject):
"""Clean up socket when the client disconnected.""" """Clean up socket when the client disconnected."""
self._socket.deleteLater() self._socket.deleteLater()
self._socket = None self._socket = None
# Maybe another connection is waiting.
self.handle_connection()
@pyqtSlot() @pyqtSlot()
def on_ready_read(self): def on_ready_read(self):