예제 #1
0
class clientTCP(clientAbstract.clientAbstract):
    """ OSC-client running on GOD.
    sends OSC-messages to SMi.
    receives OSC-messages from SMi (and emits signals with the data)
    """

    def __init__(self, host, port, oscprefix='', verbose=False):
        super(clientTCP, self).__init__(oscprefix=oscprefix, verbose=verbose)
        self.remote = (host, port) ## FIXXME: 'host' is not canonicalized
        self.keepListening=True

        self.slip = SLIP()
        
        self.socket = QTcpSocket()
        self.socket.readyRead.connect(self._callback)
        self.socket.connectToHost(host, port);
        self.sender=(host, port)

    def __del__(self):
        self.shutdown()

    def shutdown(self):
        self.keepListening=False
        if self.socket is not None:
            try:
                self.socket.shutdown()
                self.socket.close()
            except:
                pass
        if self.addressManager is not None:
            del self.addressManager
            self.addressManager = None
        self.remote = None
        self.socket = None

    def _callback(self):
        '''Asynchronous connection listener. Starts a handler for each connection.'''
##        while self.socket.hasPendingDatagrams():
##            datagram, sender, senderPort = self.socket.readDatagram(self.socket.pendingDatagramSize())
##            self.addressManager.handle(datagram.data(), (sender.toString(), senderPort))
        data=str(self.socket.readAll())
        self.slip.append(data)
        for d in self.slip.get():
            self.addressManager.handle(d, self.sender)
        
    def _send(self, data):
        if self.socket is not None and self.remote is not None:
            logging.log(1, "sending '%s' to %s" % (str(data), str(self.remote)))
            slip = SLIP();
            slip+=data;
            sdata=str(slip.getData())
            self.socket.writeData(sdata, len(sdata))