Changeset 401
- Timestamp:
- 01/14/03 11:56:48 (6 years ago)
- Files:
-
- trunk/RBFoundation/RBFoundation/SmartSelect.py (modified) (7 diffs)
- trunk/RBTelepathy/RBTelepathy/Stream/Protocol.py (modified) (3 diffs)
- trunk/RBTelepathy/RBTelepathy/Stream/SocketAdaptor.py (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RBFoundation/RBFoundation/SmartSelect.py
r393 r401 49 49 class ClientBase(object): 50 50 """An abstract base class for creating "Smart Sockets" or other select.select able objects""" 51 def _IsComplete(self): return 0 51 52 #def fileno(self): return 0 ## override this, returning something that works with select.select, like socket.fileno 52 53 def _NeedsRead(self): return 0 … … 71 72 self.ProcessState = "Idle", None 72 73 return 0 74 75 self.FilterLists() 73 76 74 77 self.ProcessState = "Waiting", None … … 105 108 class SmartSelectClientBase(ClientBase, SmartSelectBase): 106 109 """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 107 112 def _getReadList(self): return self._NeedsRead() and [self] or [] 108 113 ReadList = property(_getReadList) … … 118 123 class SmartSelectCollection(SmartSelectBase): 119 124 """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 120 128 def _getReadList(self): 121 129 return self.SelectCollection._getReadList() … … 139 147 return self.Process(*args, **kw) 140 148 149 def FilterLists(self, *args, **kw): 150 self[:] = [x for x in self if not x._IsComplete()] 151 141 152 def _getReadList(self): return [x for x in self if x._NeedsRead()] 142 153 ReadList = property(_getReadList) … … 158 169 return self.Process(*args, **kw) 159 170 171 def FilterLists(self, *args, **kw): 172 for key, each in self.items(): 173 if not each._IsComplete(): 174 del self[key] 175 160 176 def _getReadList(self): return [x for x in self.itervalues() if x._NeedsRead()] 161 177 ReadList = property(_getReadList) … … 176 192 return self.Process(*args, **kw) 177 193 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 178 201 def _getReadList(self): return [x for y in self.itervalues() for x in y if x._NeedsRead()] 179 202 ReadList = property(_getReadList) trunk/RBTelepathy/RBTelepathy/Stream/Protocol.py
r398 r401 64 64 self.currentpacket = self._BuildPacket(info) 65 65 if self.currentpacket is None: 66 self.OnStreamError( )66 self.OnStreamError('Incomplete XML Header:\n' + info) 67 67 else: 68 68 self.data = self.currentpacket.OnStreamData(self.data, self._OnPacketComplete) … … 81 81 def OnStreamError(self, error=None): 82 82 self.stream.write('''<error xmlns='%s'>%s</error>%s''' % (StandardStreamPacketBuilder.DefaultNamespace, xmlescape(str(error or 'Unknown')), self.delimiter)) 83 print error83 self.stream.shutdown() 84 84 85 85 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 92 92 except AttributeError: 93 93 packetbuilder = self.packetbuilder = StandardStreamPacketBuilder() 94 self.packetbuilder.BuildPacket(info)94 return self.packetbuilder.BuildPacket(info) 95 95 trunk/RBTelepathy/RBTelepathy/Stream/SocketAdaptor.py
r398 r401 24 24 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 25 25 26 import socket 26 27 import threading 27 28 from RBFoundation import SmartSelect, LazyProperty … … 38 39 39 40 _sendData = "" 41 isshutdown = False 40 42 41 43 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 45 47 def __init__(self, socket): 46 48 self._socket = socket 47 48 49 49 50 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 65 66 write = send 66 67 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 67 76 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 68 77 #~ Protected Methods … … 70 79 71 80 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 73 93 74 94 def _NeedsRead(self): 75 return self._socket and 1 95 return self._socket and True 96 76 97 def _ProcessRead(self, *args, **kw): 77 98 data = self._SocketRecv(*args, **kw) 78 99 if not data: 79 self. _socket = None100 self.isshutdown = True 80 101 self.protocol.OnRecvStreamData(data) 81 102 82 103 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 84 106 def _ProcessWrite(self, *args, **kw): 85 107 nSent = self._SocketSend(self._sendData, *args, **kw) … … 87 109 88 110 def _NeedsError(self): 89 return self._socket and 1 111 return self._socket and True or False 112 90 113 def _ProcessError(self): 91 114 pass … … 97 120 return self._socket.recv(limit) 98 121 except socket.error, exc: 99 self._SetSocketError(exc)100 raise122 if not self._SetSocketError(exc): 123 raise 101 124 102 125 def _SocketSend(self, data): … … 104 127 return self._socket.send(data) 105 128 except socket.error, exc: 106 self._SetSocketError(exc)107 raise129 if not self._SetSocketError(exc): 130 raise 108 131 109 132 def _SetSocketError(self, exc):
