Esempio n. 1
0
class QTcpTransport(Transport):
    '''A Transport connecting to a TCP server.
    
    Connect using .start().
    
    Received data is processed on the Qt mainloop thread.
    '''
    shorthand='qtcp'
    @classmethod
    def fromstring(cls, expression):
        '''qtcp:<host>:<port>'''
        _, host, port = expression.split(':')
        return cls(host=host, port=int(port), sendername=expression)

    def __init__(self, host, port, sendername='qtcp'):
        self.address = (host, port)
        self.sendername = sendername
        self.leftover = b''
        self.socket = QTcpSocket()
        self.socket.readyRead.connect(self.on_ready_read)
        self.socket.error.connect(self.on_error)
        self.socket.connected.connect(self.on_connect)

    def start(self):
        if self.socket.state() != QAbstractSocket.UnconnectedState:
            L().debug('start(): Socket is not in UnconnectedState, doing nothing')
            return
        L().debug('connecting to: %s'%(self.address,))
        self.socket.connectToHost(self.address[0], self.address[1])
        
    def stop(self):
        self.socket.flush()
        self.socket.disconnectFromHost()

    def send(self, data, receivers=None):
        if receivers is not None and self.sendername not in receivers:
            return
        L().debug('message to tcp server: %s'%data)
        self.socket.write(data.decode('utf8'))

    def on_ready_read(self):
        data = self.socket.readAll().data()
        pdata = data
        if len(pdata) > 100:
            pdata = pdata[:100] + b'...'
        #if pdata.startswith('{'):
        L().debug('message from tcp server: %s'%pdata)
        self.leftover = self.received(
            sender=self.sendername,
            data=self.leftover + data
        )
        
    def on_connect(self):
         L().info('QTcpSocket: Established connection to %s'%(self.address,))

    def on_error(self, error):
        L().info('QTcpSocket raised error: %s'%error)
Esempio n. 2
0
class TcpDevice(DataDevice):
    '''
    classdocs
    '''

    def __init__(self, params={}, parent=None):
        '''
        Constructor
        '''
        super(TcpDevice, self).__init__(params, parent)

        self.iodevice = QTcpSocket()
        self.reconnect = int(params.get('Reconnect', 1000))
        self.host = params.get('Host', None)
        self.port = int(params.get('Port', 2000))
        self.gpsdInit = bool(params.get('GpsdInit', False))
        self.iodevice.readyRead.connect(self.readyRead)
        self.iodevice.error.connect(self.socketError)
        self.iodevice.connected.connect(self.socketConnected)
        self.iodevice.disconnected.connect(self.socketDisconnected)

    @pyqtSlot(QAbstractSocket.SocketError)
    def socketError(self, error):
        if self.iodevice.state() != QAbstractSocket.BoundState:
            if self.reconnect > 0:
                QTimer.singleShot(self.reconnect, self.onReconnectTimer)

    def connectDevice(self):
        self.iodevice.connectToHost(self.host, self.port)

    def disconnectDevice(self):
        if self.iodevice.state() is QAbstractSocket.ConnectedState:
            self.iodevice.disconnectFromHost()

    def readData(self):
        size = self.iodevice.bytesAvailable()
        data = self.iodevice.read(size)
        return data

    def readLine(self):
        if self.iodevice.canReadLine():
            return str(self.iodevice.readLine())
        return ''

    @pyqtSlot()
    def socketConnected(self):
        self.deviceConnected.emit(True)
        if self.gpsdInit:
            self.iodevice.writeData('?WATCH={"class":"WATCH","nmea":true}')

    @pyqtSlot()
    def socketDisconnected(self):
        self.deviceDisconnected.emit(True)
Esempio n. 3
0
class TcpClient(QObject):
    packet = pyqtSignal(str)
    connected = pyqtSignal()
    disconnected = pyqtSignal()

    def __init__(self, host):
        super().__init__()
        self._sock = QTcpSocket()
        self._host = host
        self._log = logging.getLogger('tcp')
        self._sock.connected.connect(self.greet)
        self._sock.connected.connect(self.connected.emit)
        self._sock.disconnected.connect(self.disconnected.emit)
        self._sock.readyRead.connect(self.recv)

    def set_host(self, host):
        self._sock.disconnectFromHost()
        self._host = host

    def try_connect(self, port):
        msg = 'connecting to ({}:{})'
        msg = msg.format(self._host.toString(), port)
        self._log.debug(msg)
        self._sock.connectToHost(self._host, port)
        ok = self._sock.waitForConnected()
        if ok:
            self._log.debug('connection successful')
        else:
            self._log.error('failed to connect')

    def greet(self):
        self.send(query_tag('port', 'udp'), '')

    def recv(self):
        while self._sock.canReadLine():
            data = bytes(self._sock.readLine()) # handle QByteArray
            message = data.decode()
            self.packet.emit(message)

    def send(self, tag, payload):
        message = tag + ':' + payload + '\n'
        data = message.encode()
        self._sock.write(data)
Esempio n. 4
0
class SocketTcpClient(AbstractSocket):
    """Socket que envia e recebe dados via TcpSocket"""
    def __init__(self, portaResponder, parent=None):
        super().__init__(None, portaResponder, parent)

        self._socketClient = QTcpSocket(self)

        self._socketClient.readyRead.connect(self._lerDados)

    def _lerDados(self):
        if self._socketClient.bytesAvailable():
            host = self.ipServidor()
            data = self._socketClient.readData()

            self.dadosRecebidos.emit(host, data)
            
    def enviarDados(self, byteArray):
        self._socketClient.write(byteArray)
            
    def setPara(self, para):
        if self.getPara() != para: 
            super().setPara(para)
            self._conectarServidor(para)

    def _conectarServidor(self, ip):
        if self._socketClient.state() in (QAbstractSocket.ConnectedState, QAbstractSocket.ConnectingState):
            self._desconectarServidor()

        self._socketClient.connectToHost(QHostAddress(ip), self.getPortaResponder())

    def _desconectarServidor(self):
        if self._socketClient.state() == QAbstractSocket.UnconnectedState:
            return True
        
        self._socketClient.disconnectFromHost()
        return self._socketClient.waitForConnected(50)

    def ipServidor(self):
        return self._socketClient.peerAddress()

    def meuIP(self):
        return self._socketClient.localAddress()
Esempio n. 5
0
class TCPConnection(Connection):
    def __init__(self):
        Connection.__init__(self)

        # read all data in buffer before exiting self.read_data
        self.break_on_packet_found = False

    def begin(self, instrument):
        self.log = logging.getLogger('GDAIS.' + instrument.short_name +
                                     '.TCPConnection')
        self.instrument = instrument

        self.io_conn = QTcpSocket()
        self.io_conn.connected.connect(self.connected)
        self.io_conn.error.connect(self.connection_error)
        self.io_conn.connectToHost(instrument.connection.tcp_host,
                                   instrument.connection.tcp_port)

    def connected(self):
        self.io_conn.readyRead.connect(self.read_data)
        Connection.begin(self, self.instrument)

    def connection_error(self, socket_error):
        if socket_error == QTcpSocket.RemoteHostClosedError:
            self.log.info(self.io_conn.errorString())
        else:
            self.log.error(self.io_conn.errorString())
            self.error_occurred.emit()

    def quit(self):
        if self.io_conn and self.io_conn.state() == QTcpSocket.ConnectedState:
            loop = QEventLoop()
            self.io_conn.disconnected.connect(loop.quit)
            self.io_conn.disconnectFromHost()
            self.log.debug("Entered disconnect state...")
            if self.io_conn.state() == QTcpSocket.ConnectedState:
                loop.exec_()
            self.log.info("Done")
        Connection.quit(self)
Esempio n. 6
0
File: pod.py Progetto: phch/one-loop
class TcpClient(QObject):
    packet = pyqtSignal(str)
    connected = pyqtSignal()
    disconnected = pyqtSignal()

    def __init__(self, host):
        super().__init__()
        self._sock = QTcpSocket()
        self._pending = None
        self._host = host
        self._log = logging.getLogger("tcp")
        self._sock.connected.connect(self.greet)
        self._sock.connected.connect(self.connected.emit)
        self._sock.disconnected.connect(self.disconnected.emit)
        self._sock.readyRead.connect(self.recv)

    def set_host(self, host):
        self._sock.disconnectFromHost()
        self._host = host

    def _cancel_pending(self):
        self._pending.stop()
        self._pending = None
        self._sock.connected.disconnect(self._connection_success)

    @pyqtSlot()
    def _connection_success(self):
        self._cancel_pending()
        self._log.debug("connection successful")

    @pyqtSlot()
    def _connection_failure(self):
        self._cancel_pending()
        self._log.debug("connection failed")

    def try_connect(self, port):
        if self._pending:
            self._cancel_pending()
        self._sock.disconnectFromHost()
        if self._sock.state() != QAbstractSocket.UnconnectedState:
            self._sock.waitForDisconnected()
        msg = "connecting to ({}:{})"
        msg = msg.format(self._host.toString(), port)
        self._log.debug(msg)
        self._pending = QTimer()
        self._pending.timeout.connect(self._connection_failure)
        self._pending.setSingleShot(True)
        self._sock.connected.connect(self._connection_success)
        self._pending.start(10000)
        self._sock.connectToHost(self._host, port)

    def greet(self):
        self.send(query_tag("port", "udp"), "")

    def recv(self):
        while self._sock.canReadLine():
            data = bytes(self._sock.readLine())  # handle QByteArray
            message = data.decode()
            self.packet.emit(message)

    def send(self, tag, payload):
        message = tag + ":" + payload + "\n"
        data = message.encode()
        self._sock.write(data)
Esempio n. 7
0
class ClientDialog(QtGui.QDialog):

    STATUS = ["Not Connected",
              "Host Lookup",
              "Establishing connection",
              "Connected",
              "The socket is bound to an address and port",
              "For internal use only",
              "Socket is about to close"]
    
    def __init__(self, configdir, recentconndb):
        QtGui.QDialog.__init__(self)
        
        # Variables
        self.configdir = configdir
        self.recentconndb = recentconndb
        
        self.socket = QTcpSocket()
        self.status = self.STATUS[0]
        
        logging.info("Starting Client")

        # Properties        
        self.setModal(True)
        
        # Setup Widget
        self.layout = QtGui.QVBoxLayout()
        self.mainWidget = ControllerClientWidget()
        self.layout.addWidget(self.mainWidget)
        self.setLayout(self.layout)
          
        #Connections
        self.connect(self.socket, QtCore.SIGNAL('error(QAbstractSocket::SocketError)'), self.displayError)
        self.connect(self.socket, QtCore.SIGNAL('connected()'), self.connected)
        self.connect(self.mainWidget.connectButton, QtCore.SIGNAL('pressed()'), self.connectToServer) 
        self.connect(self.mainWidget.hostEdit,  QtCore.SIGNAL('textChanged(QString)'), self.enableConnectButton)
        self.connect(self.mainWidget.portEdit,  QtCore.SIGNAL('textChanged(QString)'), self.enableConnectButton)
        self.connect(self.mainWidget.passEdit,  QtCore.SIGNAL('textChanged(QString)'), self.enableConnectButton)
        self.connect(self.mainWidget.recentConnList, QtCore.SIGNAL('doubleClicked(const QModelIndex &)'), self.recentListHandler)

        self.loadRecentConnDB()
        self.enableConnectButton()
        self.hide()
        
        # Translations
        self.current_language = "en_US"
        self.uiTranslator = QtCore.QTranslator()
        self.uiTranslator.load(":/languages/tr_en_US.qm")
        self.retranslate()
        self.updateStatus()
        
    ###
    ### Translation Related
    ###
    def retranslate(self, language=None):
        if language is not None:
            self.current_language = language
            
        self.uiTranslator.load(":/languages/tr_%s.qm" % self.current_language)
        
        self.setWindowTitle(self.uiTranslator.translate("ControllerClientApp", "Controller Client"))
        #
        # Reusable Strings
        #
        self.clientStatusString = self.uiTranslator.translate("ControllerClientApp", "Status")
        self.connectString = self.uiTranslator.translate("ControllerClientApp", "Connect")
        self.disconnectString = self.uiTranslator.translate("ControllerClientApp", "Disconnect")
        # --- End Reusable Strings
        
        #
        # Connection Settings
        #
        self.mainWidget.toolBox.setItemText(0, self.uiTranslator.translate("ControllerClientApp", "Connection Settings"))
        self.mainWidget.hostLabel.setText(self.uiTranslator.translate("ControllerClientApp", "Host name (or IP Address)"))
        self.mainWidget.portLabel.setText(self.uiTranslator.translate("ControllerClientApp", "Port"))
        self.mainWidget.passLabel.setText(self.uiTranslator.translate("ControllerClientApp", "Passphrase"))
        if self.status == self.STATUS[3]:
            self.mainWidget.connectButton.setText(self.uiTranslator.translate("ControllerClientApp", self.disconnectString))
        else:
            self.mainWidget.connectButton.setText(self.uiTranslator.translate("ControllerClientApp", self.connectString))
        self.updateStatus()
        # --- End Connection Settings
        
        #
        # Recent Connections
        #
        self.mainWidget.toolBox.setItemText(1, self.uiTranslator.translate("ControllerClientApp", "Recent Connections"))
        # --- End Recent Connections
        
    ##
    ## UI Related
    ##
    
    def enableConnectButton(self):
        if self.mainWidget.passEdit.text() == '' or self.mainWidget.hostEdit.text() == '' or self.mainWidget.portEdit.text() == '':
            self.mainWidget.connectButton.setEnabled(False)
        else:
            self.mainWidget.connectButton.setEnabled(True)
    
    def connected(self):
        caddr = self.socket.peerName()
        cport = self.socket.peerPort()
        logging.info("Connected to %s:%s" % (caddr, cport))
        
        self.sendPassphrase()
        self.mainWidget.connectButton.setText(self.disconnectString)
        self.disconnect(self.mainWidget.connectButton, QtCore.SIGNAL('pressed()'), self.connectToServer) 
        self.disconnect(self.mainWidget.passEdit,  QtCore.SIGNAL('textChanged(QString)'), self.enableConnectButton)
        self.connect(self.mainWidget.connectButton, QtCore.SIGNAL('pressed()'), self.disconnectFromHost)
        self.connect(self.socket, QtCore.SIGNAL("disconnected()"), self.disconnectedFromHost)
        
    '''
    This function is for updating the sockets status and the statusLabel. It's called when a stateChanged signal is triggered.
    '''
    def updateStatus(self):
        state = self.socket.state()
        self.status = self.STATUS[state]
        self.mainWidget.statusLabel.setText(self.clientStatusString + ": " + self.status)
        
    '''
    When there is a socket error this function is called to show the error in a QMessageBox
    '''    
    def displayError(self, socketError):
        messageBox = QtGui.QMessageBox.critical(self, QtCore.QString('Error!'), 
                                                   QtCore.QString(self.socket.errorString()))
        logging.error("Socket error %s" % self.socket.errorString())

    ##
    ## Connection Related
    ##
        
    '''
    Function that is called when connect button is pressed.
    '''
    def connectToServer(self):
        caddr = self.mainWidget.hostEdit.text()
        cport = int(self.mainWidget.portEdit.text())
        cpass = self.mainWidget.passEdit.text()
        
        self.connect(self.socket, QtCore.SIGNAL('stateChanged(QAbstractSocket::SocketState)'), self.updateStatus)

        logging.info("Connecting to %s:%s" % (caddr, cport))
        self.socket.connectToHost(caddr, cport)
        
        if not self.socket.waitForConnected(1000):
            logging.error("Socket error %s", self.socket.errorString())
        else:
            # Add to recent connections if connection is successful
            self.addToRecentConnections(caddr, cport, cpass)
    
    def disconnectFromHost(self):
        self.socket.disconnectFromHost()
        
    '''
    Function for disconnecting the client from the host.
    '''
    def disconnectedFromHost(self):
        logging.info("Disconnected from host")
        self.disconnect(self.mainWidget.connectButton, QtCore.SIGNAL('pressed()'), self.disconnectFromHost)
        self.connect(self.mainWidget.connectButton, QtCore.SIGNAL('pressed()'), self.connectToServer)
        self.connect(self.mainWidget.passEdit,  QtCore.SIGNAL('textChanged(QString)'), self.enableConnectButton)
        self.mainWidget.connectButton.setText(self.connectString)
      
    '''
    Function for sending message to the connected server
    '''  
    def sendMessage(self, message):
        logging.info("Sending message: %s", message)
        block = QtCore.QByteArray()
        block.append(message)
        self.socket.write(block)
        
    '''
    This function is for sending the passphrase to the server. It uses the sendMessage function
    '''
    def sendPassphrase(self):
        self.sendMessage(self.mainWidget.passEdit.text())
    
    '''
    This function is for reading message from the server
    '''
    def readMessage(self):
        message = self.socket.read(self.socket.bytesAvailable()) 
        logging("Server said:%s", message)  
        return message

    ##
    ## Recent Connections Related
    ##
    
    def loadRecentConnDB(self):
        model = self.recentconndb.get_recentconn_model()
        self.mainWidget.recentConnList.setModel(model)
        self.mainWidget.recentConnList.setColumnHidden(2, True) # Hide the passphrase column
                
    '''
    This function is for adding a new connection to the recent connections. It checks whether it exists in the database or not.
    '''   
    def addToRecentConnections(self, caddr, cport, cpass):
        self.recentconndb.insert_recentconn(caddr, cport, cpass)
        self.loadRecentConnDB()
        
    '''
    Handler for the recent connections list. When you click on a recent connection the details of the connection are loaded 
    '''
    def recentListHandler(self, connection):
        chost = connection.sibling(connection.row(), 0).data().toString()
        cport = int(connection.sibling(connection.row(), 1).data().toString())
        cpass = connection.sibling(connection.row(), 2).data().toString()
        self.mainWidget.hostEdit.setText(chost)
        self.mainWidget.portEdit.setValue(cport)
        self.mainWidget.passEdit.setText(cpass)
        self.mainWidget.toolBox.setCurrentWidget(self.mainWidget.connWidget)
Esempio n. 8
0
class ConnectWindow(QMainWindow, Ui_ConnectWindow):
    def __init__(self):
        """
        
        Arguments:
        - `self`:
        """
        QMainWindow.__init__(self)
        self.setupUi(self)
        self.socket = QTcpSocket()
        self.connect()

    # Signals
    conn_success = pyqtSignal('QTcpSocket')
    exit_signal = pyqtSignal()

    # Slots
    @pyqtSlot()
    def connect_server(self):
        """
        """
        self.statusBar.clearMessage()
        host = self.serverLine.text().trimmed()
        port = self.portLine.text().trimmed()

        if host and port:
            self.socket.connectToHost(host, int(port))
        else:
            self.statusBar.showMessage(
                'Enter valid a server address and port!')

    @pyqtSlot()
    def on_success(self):
        """
        """
        if self.socket.waitForReadyRead(10000):
            msg = self.socket.readData(1024)
            msg = loads(msg)
            if msg['head'] == CONN_SUCC:
                self.statusBar.showMessage('Connection established')
                self.conn_success.emit(self.socket)
                self.hide()
            else:
                self.statusBar.showMessage('Server is full!')
                self.socket.disconnectFromHost()
        else:
            self.on_error()

    @pyqtSlot()
    def on_error(self):
        self.statusBar.showMessage('Connection cannot be established!')

    def closeEvent(self, event):
        """
        """
        dialog = ExitDialog()
        if dialog.exec_():
            event.accept()
        else:
            event.ignore()

    # Connections
    def connect(self):
        """
        """
        self.connectButton.clicked.connect(self.connect_server)
        self.exitButton.clicked.connect(self.close)
        self.socket.error.connect(self.on_error)
        self.socket.connected.connect(self.on_success)
Esempio n. 9
0
class TcpClient(QObject):
    packet = pyqtSignal(str)
    connected = pyqtSignal()
    disconnected = pyqtSignal()

    def __init__(self, host):
        super().__init__()
        self._sock = QTcpSocket()
        self._pending = None
        self._host = host
        self._log = logging.getLogger('tcp')
        self._sock.connected.connect(self.greet)
        self._sock.connected.connect(self.connected.emit)
        self._sock.disconnected.connect(self.disconnected.emit)
        self._sock.readyRead.connect(self.recv)

    def set_host(self, host):
        self._sock.disconnectFromHost()
        self._host = host

    def _cancel_pending(self):
        self._pending.stop()
        self._pending = None
        self._sock.connected.disconnect(self._connection_success)

    @pyqtSlot()
    def _connection_success(self):
        self._cancel_pending()
        self._log.debug('connection successful')

    @pyqtSlot()
    def _connection_failure(self):
        self._cancel_pending()
        self._log.debug('connection failed')

    def try_connect(self, port):
        if self._pending:
            self._cancel_pending()
        self._sock.disconnectFromHost()
        if self._sock.state() != QAbstractSocket.UnconnectedState:
            self._sock.waitForDisconnected()
        msg = 'connecting to ({}:{})'
        msg = msg.format(self._host.toString(), port)
        self._log.debug(msg)
        self._pending = QTimer()
        self._pending.timeout.connect(self._connection_failure)
        self._pending.setSingleShot(True)
        self._sock.connected.connect(self._connection_success)
        self._pending.start(10000)
        self._sock.connectToHost(self._host, port)

    def greet(self):
        self.send(query_tag('port', 'udp'), '')

    def recv(self):
        while self._sock.canReadLine():
            data = bytes(self._sock.readLine())  # handle QByteArray
            message = data.decode()
            self.packet.emit(message)

    def send(self, tag, payload):
        message = tag + ':' + payload + '\n'
        data = message.encode()
        self._sock.write(data)
Esempio n. 10
0
class ClientDialog(QtGui.QDialog):

    STATUS = [
        "Not Connected", "Host Lookup", "Establishing connection", "Connected",
        "The socket is bound to an address and port", "For internal use only",
        "Socket is about to close"
    ]

    def __init__(self, configdir, recentconndb):
        QtGui.QDialog.__init__(self)

        # Variables
        self.configdir = configdir
        self.recentconndb = recentconndb

        self.socket = QTcpSocket()
        self.status = self.STATUS[0]

        log.info("Starting Client")

        # Properties
        self.setModal(True)

        # Setup Widget
        self.layout = QtGui.QVBoxLayout()
        self.mainWidget = ControllerClientWidget()
        self.layout.addWidget(self.mainWidget)
        self.setLayout(self.layout)

        #Connections
        self.connect(self.socket,
                     QtCore.SIGNAL('error(QAbstractSocket::SocketError)'),
                     self.displayError)
        self.connect(self.socket, QtCore.SIGNAL('connected()'), self.connected)
        self.connect(self.mainWidget.connectButton, QtCore.SIGNAL('pressed()'),
                     self.connectToServer)
        self.connect(self.mainWidget.hostEdit,
                     QtCore.SIGNAL('textChanged(QString)'),
                     self.enableConnectButton)
        self.connect(self.mainWidget.portEdit,
                     QtCore.SIGNAL('textChanged(QString)'),
                     self.enableConnectButton)
        self.connect(self.mainWidget.passEdit,
                     QtCore.SIGNAL('textChanged(QString)'),
                     self.enableConnectButton)
        self.connect(self.mainWidget.recentConnList,
                     QtCore.SIGNAL('doubleClicked(const QModelIndex &)'),
                     self.recentListHandler)

        self.loadRecentConnDB()
        self.enableConnectButton()
        self.hide()

        # Translations
        self.app = QtGui.QApplication.instance()
        self.current_language = "en_US"
        self.uiTranslator = QtCore.QTranslator()
        self.uiTranslator.load(":/languages/tr_en_US.qm")
        self.retranslate()
        self.updateStatus()

    ###
    ### Translation Related
    ###
    def retranslate(self, language=None):
        if language is not None:
            self.current_language = language

        self.uiTranslator.load(":/languages/tr_%s.qm" % self.current_language)

        self.setWindowTitle(
            self.app.translate("ControllerClientApp", "Controller Client"))
        #
        # Reusable Strings
        #
        self.clientStatusString = self.app.translate("ControllerClientApp",
                                                     "Status")
        self.connectString = self.app.translate("ControllerClientApp",
                                                "Connect")
        self.disconnectString = self.app.translate("ControllerClientApp",
                                                   "Disconnect")
        # --- End Reusable Strings

        #
        # Connection Settings
        #
        self.mainWidget.toolBox.setItemText(
            0, self.app.translate("ControllerClientApp",
                                  "Connection Settings"))
        self.mainWidget.hostLabel.setText(
            self.app.translate("ControllerClientApp",
                               "Host name (or IP Address)"))
        self.mainWidget.portLabel.setText(
            self.app.translate("ControllerClientApp", "Port"))
        self.mainWidget.passLabel.setText(
            self.app.translate("ControllerClientApp", "Passphrase"))
        if self.status == self.STATUS[3]:
            self.mainWidget.connectButton.setText(
                self.app.translate("ControllerClientApp",
                                   self.disconnectString))
        else:
            self.mainWidget.connectButton.setText(
                self.app.translate("ControllerClientApp", self.connectString))
        self.updateStatus()
        # --- End Connection Settings

        #
        # Recent Connections
        #
        self.mainWidget.toolBox.setItemText(
            1, self.app.translate("ControllerClientApp", "Recent Connections"))
        # --- End Recent Connections

    ##
    ## UI Related
    ##

    def enableConnectButton(self):
        if self.mainWidget.passEdit.text(
        ) == '' or self.mainWidget.hostEdit.text(
        ) == '' or self.mainWidget.portEdit.text() == '':
            self.mainWidget.connectButton.setEnabled(False)
        else:
            self.mainWidget.connectButton.setEnabled(True)

    def connected(self):
        caddr = self.socket.peerName()
        cport = self.socket.peerPort()
        log.info("Connected to %s:%s" % (caddr, cport))

        self.sendPassphrase()
        self.mainWidget.connectButton.setText(self.disconnectString)
        self.disconnect(self.mainWidget.connectButton,
                        QtCore.SIGNAL('pressed()'), self.connectToServer)
        self.disconnect(self.mainWidget.passEdit,
                        QtCore.SIGNAL('textChanged(QString)'),
                        self.enableConnectButton)
        self.connect(self.mainWidget.connectButton, QtCore.SIGNAL('pressed()'),
                     self.disconnectFromHost)
        self.connect(self.socket, QtCore.SIGNAL("disconnected()"),
                     self.disconnectedFromHost)

    '''
    This function is for updating the sockets status and the statusLabel. It's called when a stateChanged signal is triggered.
    '''

    def updateStatus(self):
        state = self.socket.state()
        self.status = self.STATUS[state]
        self.mainWidget.statusLabel.setText(self.clientStatusString + ": " +
                                            self.status)

    '''
    When there is a socket error this function is called to show the error in a QMessageBox
    '''

    def displayError(self, socketError):
        messageBox = QtGui.QMessageBox.critical(
            self, QtCore.QString('Error!'),
            QtCore.QString(self.socket.errorString()))
        log.error("Socket error %s" % self.socket.errorString())

    ##
    ## Connection Related
    ##
    '''
    Function that is called when connect button is pressed.
    '''

    def connectToServer(self):
        caddr = self.mainWidget.hostEdit.text()
        cport = int(self.mainWidget.portEdit.text())
        cpass = self.mainWidget.passEdit.text()

        self.connect(
            self.socket,
            QtCore.SIGNAL('stateChanged(QAbstractSocket::SocketState)'),
            self.updateStatus)

        log.info("Connecting to %s:%s" % (caddr, cport))
        self.socket.connectToHost(caddr, cport)

        if not self.socket.waitForConnected(1000):
            log.error("Socket error %s", self.socket.errorString())
        else:
            # Add to recent connections if connection is successful
            self.addToRecentConnections(caddr, cport, cpass)

    def disconnectFromHost(self):
        self.socket.disconnectFromHost()

    '''
    Function for disconnecting the client from the host.
    '''

    def disconnectedFromHost(self):
        log.info("Disconnected from host")
        self.disconnect(self.mainWidget.connectButton,
                        QtCore.SIGNAL('pressed()'), self.disconnectFromHost)
        self.connect(self.mainWidget.connectButton, QtCore.SIGNAL('pressed()'),
                     self.connectToServer)
        self.connect(self.mainWidget.passEdit,
                     QtCore.SIGNAL('textChanged(QString)'),
                     self.enableConnectButton)
        self.mainWidget.connectButton.setText(self.connectString)

    '''
    Function for sending message to the connected server
    '''

    def sendMessage(self, message):
        log.info("Sending message: %s", message)
        block = QtCore.QByteArray()
        block.append(message)
        self.socket.write(block)

    '''
    This function is for sending the passphrase to the server. It uses the sendMessage function
    '''

    def sendPassphrase(self):
        self.sendMessage(self.mainWidget.passEdit.text())

    '''
    This function is for reading message from the server
    '''

    def readMessage(self):
        message = self.socket.read(self.socket.bytesAvailable())
        log.info("Server said: %s", message)
        return message

    ##
    ## Recent Connections Related
    ##

    def loadRecentConnDB(self):
        model = self.recentconndb.get_recentconn_model()
        self.mainWidget.recentConnList.setModel(model)
        self.mainWidget.recentConnList.setColumnHidden(
            2, True)  # Hide the passphrase column

    '''
    This function is for adding a new connection to the recent connections. It checks whether it exists in the database or not.
    '''

    def addToRecentConnections(self, caddr, cport, cpass):
        self.recentconndb.insert_recentconn(caddr, cport, cpass)
        self.loadRecentConnDB()

    '''
    Handler for the recent connections list. When you click on a recent connection the details of the connection are loaded
    '''

    def recentListHandler(self, connection):
        chost = connection.sibling(connection.row(), 0).data().toString()
        cport = int(connection.sibling(connection.row(), 1).data().toString())
        cpass = connection.sibling(connection.row(), 2).data().toString()
        self.mainWidget.hostEdit.setText(chost)
        self.mainWidget.portEdit.setValue(cport)
        self.mainWidget.passEdit.setText(cpass)
        self.mainWidget.toolBox.setCurrentWidget(self.mainWidget.connWidget)
Esempio n. 11
0
class ConnectWindow(QMainWindow, Ui_ConnectWindow):
    def __init__(self):
        """
        
        Arguments:
        - `self`:
        """
        QMainWindow.__init__(self)
        self.setupUi(self)
        self.socket = QTcpSocket()
        self.connect()

    # Signals
    conn_success = pyqtSignal('QTcpSocket')
    exit_signal = pyqtSignal()

    # Slots
    @pyqtSlot()
    def connect_server(self):
        """
        """
        self.statusBar.clearMessage()
        host = self.serverLine.text().trimmed()
        port = self.portLine.text().trimmed()

        if host and port:
            self.socket.connectToHost(host, int(port))
        else:
            self.statusBar.showMessage('Enter valid a server address and port!')
        
    @pyqtSlot()
    def on_success(self):
        """
        """
        if self.socket.waitForReadyRead(10000):
            msg = self.socket.readData(1024)
            msg = loads(msg)
            if msg['head'] == CONN_SUCC:
                self.statusBar.showMessage('Connection established')
                self.conn_success.emit(self.socket)
                self.hide()
            else:
                self.statusBar.showMessage('Server is full!')
                self.socket.disconnectFromHost()
        else:
            self.on_error()

    @pyqtSlot()        
    def on_error(self):
        self.statusBar.showMessage('Connection cannot be established!')

    def closeEvent(self, event):
        """
        """
        dialog = ExitDialog()
        if dialog.exec_():
            event.accept()
        else:
            event.ignore()

    # Connections
    def connect(self):
        """
        """
        self.connectButton.clicked.connect(self.connect_server)
        self.exitButton.clicked.connect(self.close)
        self.socket.error.connect(self.on_error)
        self.socket.connected.connect(self.on_success)