Ejemplo n.º 1
0
 def recvEvent(self):
     data = self.sock.recv()
     dataLen = len(data)
     messages = []
     offset = 0
     
     #process data
     while not offset >= dataLen:
         #loop until all received data was processed
         if self.inMessage is None:
             ##there is no finished message that needs bulk data
             endOfMessage = data.find('\n', offset)
             if endOfMessage == -1:
                 #only the beginning of a message, store it in the inbound queue
                 self.inQueue.append(data[offset:])
                 offset = dataLen
                 
             else:
                 #the whole message or the ending
                 message = data[offset:endOfMessage]
                 offset = endOfMessage + 1
                 if len(self.inQueue) > 0:
                     #get the beginning of the message out of the queue
                     self.inQueue.append(message)
                     message = ''.join(self.inQueue)
                     self.inQueue.clear()
                 
                 #parse message
                 if self.log is not None:
                     self.log.debug("Got Message: \"%s\"", message)
                 message = SamMessages.parseMessage(message)
                     
                 #check if we need to wait for more data
                 if 'SIZE' in message['msgParas']:
                     message['Data'] = []
                     message['DataCurrentLen'] = 0
                     message['DataTargetLen'] = int(message['msgParas']['SIZE'])
                     self.inMessage = message
                 else:
                     messages.append(message)
         else:
             ##only missing a few bytes here ...
             assert len(self.inQueue) == 0, 'receiving data but stuff in the inqueue?!'
             missingBytes = self.inMessage['DataTargetLen'] - self.inMessage['DataCurrentLen']
             remainingBytes = dataLen - offset
             if remainingBytes >= missingBytes:
                 #got all
                 if self.log is not None:
                     self.log.debug("Got missing %i bytes for message", missingBytes)
                 self.inMessage['Data'].append(data[offset:offset+missingBytes])
                 self.inMessage['DataCurrentLen'] += missingBytes
                 assert self.inMessage['DataCurrentLen'] == self.inMessage['DataTargetLen'], 'message finished but too short?!'
                 offset += missingBytes
                 messages.append(self.inMessage)
                 self.inMessage = None
             
             else:
                 #still missing a bit
                 if self.log is not None:
                     self.log.debug("Got %i bytes for message but still missing %i bytes", remainingBytes, (missingBytes - remainingBytes))
                 self.inMessage['Data'].append(data[offset:])
                 self.inMessage['DataCurrentLen'] += remainingBytes
                 offset += remainingBytes        
     
     #handle messages
     self._handleMessages(messages)