Changeset 401

Show
Ignore:
Timestamp:
01/14/03 11:56:48 (6 years ago)
Author:
sholloway
Message:

*** empty log message ***

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/RBFoundation/RBFoundation/SmartSelect.py

    r393 r401  
    4949class ClientBase(object): 
    5050    """An abstract base class for creating "Smart Sockets" or other select.select able objects""" 
     51    def _IsComplete(self): return 0 
    5152    #def fileno(self): return 0 ## override this, returning something that works with select.select, like socket.fileno 
    5253    def _NeedsRead(self): return 0 
     
    7172            self.ProcessState = "Idle", None 
    7273            return 0 
     74 
     75        self.FilterLists() 
    7376 
    7477        self.ProcessState = "Waiting", None 
     
    105108class SmartSelectClientBase(ClientBase, SmartSelectBase): 
    106109    """Allows base classes of a smart select to be able to run "by themselves" as if they were their own SmartSelectors""" 
     110    def FilterLists(self, *args, **kw): pass 
     111 
    107112    def _getReadList(self): return self._NeedsRead() and [self] or [] 
    108113    ReadList = property(_getReadList) 
     
    118123class SmartSelectCollection(SmartSelectBase): 
    119124    """Allows base classes of a smart select to be able to run "by themselves" as if they were their own SmartSelectors""" 
     125    def FilterLists(self, *args, **kw): 
     126        return self.SelectCollection.FilterLists(*args, **kw) 
     127 
    120128    def _getReadList(self):  
    121129        return self.SelectCollection._getReadList() 
     
    139147        return self.Process(*args, **kw) 
    140148         
     149    def FilterLists(self, *args, **kw): 
     150        self[:] = [x for x in self if not x._IsComplete()] 
     151 
    141152    def _getReadList(self): return [x for x in self if x._NeedsRead()] 
    142153    ReadList = property(_getReadList) 
     
    158169        return self.Process(*args, **kw) 
    159170         
     171    def FilterLists(self, *args, **kw): 
     172        for key, each in self.items(): 
     173            if not each._IsComplete(): 
     174                del self[key] 
     175 
    160176    def _getReadList(self): return [x for x in self.itervalues() if x._NeedsRead()] 
    161177    ReadList = property(_getReadList) 
     
    176192        return self.Process(*args, **kw) 
    177193         
     194    def FilterLists(self, *args, **kw): 
     195        for key, each in self.items(): 
     196            if each: 
     197                each[:] = [x for x in each if not x._IsComplete()] 
     198            else:  
     199                del self[key] 
     200 
    178201    def _getReadList(self): return [x for y in self.itervalues() for x in y if x._NeedsRead()] 
    179202    ReadList = property(_getReadList) 
  • trunk/RBTelepathy/RBTelepathy/Stream/Protocol.py

    r398 r401  
    6464                    self.currentpacket = self._BuildPacket(info) 
    6565                    if self.currentpacket is None: 
    66                         self.OnStreamError(
     66                        self.OnStreamError('Incomplete XML Header:\n' + info
    6767                    else: 
    6868                        self.data = self.currentpacket.OnStreamData(self.data, self._OnPacketComplete) 
     
    8181    def OnStreamError(self, error=None): 
    8282        self.stream.write('''<error xmlns='%s'>%s</error>%s''' % (StandardStreamPacketBuilder.DefaultNamespace, xmlescape(str(error or 'Unknown')), self.delimiter)) 
    83         print error 
     83        self.stream.shutdown() 
    8484 
    8585    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    9292        except AttributeError: 
    9393            packetbuilder = self.packetbuilder = StandardStreamPacketBuilder() 
    94         self.packetbuilder.BuildPacket(info) 
     94        return self.packetbuilder.BuildPacket(info) 
    9595 
  • trunk/RBTelepathy/RBTelepathy/Stream/SocketAdaptor.py

    r398 r401  
    2424#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    2525 
     26import socket  
    2627import threading  
    2728from RBFoundation import SmartSelect, LazyProperty 
     
    3839 
    3940    _sendData = "" 
     41    isshutdown = False 
    4042 
    4143    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    4547    def __init__(self, socket): 
    4648        self._socket = socket 
    47  
    4849 
    4950    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    6566    write = send 
    6667 
     68    def shutdown(self, how=0): 
     69        try: 
     70            self._socket.shutdown(how) 
     71            self.isshutdown = True 
     72        except socket.error, exc: 
     73            if not self._SetSocketError(exc): 
     74                raise 
     75 
    6776    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    6877    #~ Protected Methods  
     
    7079 
    7180    def fileno(self):  
    72         return self._socket.fileno() 
     81        if self._socket: 
     82            return self._socket.fileno() 
     83        else: return None 
     84 
     85    def _IsComplete(self):  
     86        # if we've been marked to shutdown 
     87        if self.isshutdown: 
     88            # and all data is sent out 
     89            if not self._sendData: 
     90                # then we are done 
     91                return True 
     92        return False 
    7393 
    7494    def _NeedsRead(self):  
    75         return self._socket and 1 
     95        return self._socket and True 
     96 
    7697    def _ProcessRead(self, *args, **kw):  
    7798        data = self._SocketRecv(*args, **kw) 
    7899        if not data: 
    79             self._socket = Non
     100            self.isshutdown = Tru
    80101        self.protocol.OnRecvStreamData(data) 
    81102 
    82103    def _NeedsWrite(self):  
    83         return self._socket and self._sendData and 1 or 0 
     104        return self._socket and self._sendData and True or False 
     105 
    84106    def _ProcessWrite(self, *args, **kw): 
    85107        nSent = self._SocketSend(self._sendData, *args, **kw) 
     
    87109 
    88110    def _NeedsError(self):  
    89         return self._socket and 1 
     111        return self._socket and True or False 
     112 
    90113    def _ProcessError(self):  
    91114        pass 
     
    97120            return self._socket.recv(limit) 
    98121        except socket.error, exc: 
    99             self._SetSocketError(exc) 
    100             raise 
     122            if not self._SetSocketError(exc): 
     123                raise 
    101124 
    102125    def _SocketSend(self, data): 
     
    104127            return self._socket.send(data) 
    105128        except socket.error, exc: 
    106             self._SetSocketError(exc) 
    107             raise 
     129            if not self._SetSocketError(exc): 
     130                raise 
    108131 
    109132    def _SetSocketError(self, exc):