Changeset 437
- Timestamp:
- 02/05/03 01:09:46 (6 years ago)
- Files:
-
- trunk/RBFoundation/RBFoundation/XMLBuilder.py (modified) (4 diffs)
- trunk/RBFoundation/RBFoundation/XMLNode.py (modified) (8 diffs)
- trunk/RBTelepathy/RBTelepathy/Connection.py (modified) (2 diffs)
- trunk/RBTelepathy/RBTelepathy/Packet/AuthenticationHandler.py (modified) (2 diffs)
- trunk/RBTelepathy/RBTelepathy/Packet/Builder.py (modified) (1 diff)
- trunk/RBTelepathy/RBTelepathy/Packet/Elements.py (modified) (1 diff)
- trunk/RBTelepathy/RBTelepathy/Packet/MessageHandler.py (modified) (1 diff)
- trunk/RBTelepathy/RBTelepathy/Routing/RouterBase.py (modified) (2 diffs)
- trunk/RBTelepathy/RBTelepathy/Routing/SimpleRouter.py (modified) (1 diff)
- trunk/RBTelepathy/RBTelepathy/Stream/Protocol.py (modified) (7 diffs)
- trunk/RBTelepathy/RBTelepathy/Stream/SocketAdaptor.py (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RBFoundation/RBFoundation/XMLBuilder.py
r435 r437 119 119 """Part of the tree-style template method, called at the before the beginning of an XML node parse 120 120 to manage namespaces.""" 121 # Don't forget to substitute our namespace synonyms! 122 uri = self.NamespaceSynonyms.get(uri or None, uri) 123 # Add the prefix/uri to our current namespace mapping 121 124 self._current_namespacemap.setxmlns(prefix, uri) 122 125 … … 143 146 """Part of the tree-style template method, called at the closing of an XML node parse. 144 147 Simply notifies the element that it is complete.""" 145 self._current_namespacemap = self._current_namespacemap.newchain(-1)146 148 147 149 if self._elements: … … 152 154 except AttributeError: result = element 153 155 else: result = xmlGetElement() 154 else: result = None 156 self._current_namespacemap = self._current_namespacemap.nextmap 157 else: 158 result = None 159 self._current_namespacemap = XMLNamespaceMap() 155 160 return result 156 161 … … 170 175 namespace = combined[0:idx] 171 176 name = combined[idx + len(self._seperator):] 172 namespace = self.NamespaceSynonyms.get(namespace , namespace)177 namespace = self.NamespaceSynonyms.get(namespace or None, namespace) 173 178 return namespace, name 174 179 trunk/RBFoundation/RBFoundation/XMLNode.py
r436 r437 128 128 def __init__(self, node, namespace=None, prefix='', default_namespaces=None, attrlookup=None): 129 129 self.enableattrlookup(attrlookup) 130 self.namespaces = (default_namespaces or self.default_namespaces).copy() 130 if default_namespaces: self.namespaces = default_namespaces 131 else: self.namespaces = self.default_namespaces.copy() 131 132 self.elems = self.default_elements[:] 132 133 self.attrs = self.default_attributes.copy() … … 247 248 else: return self.addnode(*elem) 248 249 249 def setxmlns(self, prefix, namespace):250 self.namespaces.setxmlns(prefix, namespace)250 def setxmlns(self, *args, **kw): 251 return self.namespaces.setxmlns(*args, **kw) 251 252 252 253 #~ iteration over elements ~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 254 254 def enumdata(self, match=None ):255 def enumdata(self, match=None, idxonly=True): 255 256 """Returns a generator to iterate through the matching data indices in xmlnode""" 256 257 if not match: match = _any … … 260 261 if isinstance(each, basestring): 261 262 if each == match: 262 yield idx 263 if idxonly: yield idx 264 else: yield idx, each 263 265 idx += 1 264 266 … … 292 294 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 295 294 def enumnodes(self, node=_any, namespace=_any, prefix=_any ):296 def enumnodes(self, node=_any, namespace=_any, prefix=_any, idxonly=True): 295 297 """Returns a generator to iterate through the matching child node indicies of xmlnode""" 296 298 idx = 0 … … 298 300 if not isinstance(each, basestring): 299 301 if node == each.node and namespace == each.namespace and prefix == each.prefix: 300 yield idx 302 if idxonly: yield idx 303 else: yield idx, each 301 304 idx += 1 302 305 … … 376 379 def _getnamespace(self): 377 380 """Returns the namespace of the xmlnode""" 378 return self.namespaces. get(self.prefix or '', None)381 return self.namespaces.xmlns(self.prefix or '') 379 382 def _setnamespace(self, namespace): 380 383 """Sets the namespace of the xmlnode""" 381 384 if isinstance(namespace, tuple): 382 385 if len(namespace) == 1: 383 self.prefix, namespace = namespace[0], None386 self.prefix, namespace = namespace[0], '' 384 387 else: 385 388 self.prefix, namespace = namespace 389 self.prefix = self.prefix or '' 386 390 if namespace is not None: 387 self.namespaces.setxmlns(self.prefix or '', namespace)391 self.namespaces.setxmlns(self.prefix, namespace) 388 392 def _delnamespace(self): 389 393 """Removes the namespace of the xmlnode""" … … 463 467 464 468 def __init__(self, owner, parent, node, attributes, namespacemap): 465 try:466 prefix = namespacemap.prefix(node[0], False)467 xmlnode.__init__(self, node[1], node[0], prefix, default_namespaces=namespacemap)468 e xcept KeyError:469 xmlnode.__init__(self, node[1], default_namespaces=namespacemap)469 prefix = namespacemap.prefix(node[0]) 470 if node[0] in namespacemap: 471 nodename, xmlns = node[1], node[0] 472 else: nodename, xmlns = node[1], None 473 xmlnode.__init__(self, nodename, xmlns, prefix, default_namespaces=namespacemap) 470 474 471 475 for key, value in attributes.iteritems(): … … 495 499 496 500 def __init__(self, owner, parent, node, attributes, namespacemap): 497 try:498 prefix = namespacemap.prefix(node[0], False)499 self.result = xmlnode(node[1], node[0], prefix, default_namespaces=namespacemap)500 e xcept KeyError:501 self.result = xmlnode(node[1], default_namespaces=namespacemap)501 prefix = namespacemap.prefix(node[0]) 502 if node[0] in namespacemap or not namespacemap.nextmap: 503 nodename, xmlns = node[1], node[0] 504 else: nodename, xmlns = node[1], None 505 self.result = xmlnode(nodename, xmlns, prefix, default_namespaces=namespacemap) 502 506 503 507 for key, value in attributes.iteritems(): trunk/RBTelepathy/RBTelepathy/Connection.py
r433 r437 56 56 def OnRoutedPacket(self, packet, *args, **kw): 57 57 self.log.debug('Received Routed packet (%s, %s)', packet.namespace, packet.node) 58 #print '>>>', packet.toxml() 58 59 59 60 # Lookup our packet handler … … 70 71 def OnStreamPacket(self, packet, *args, **kw): 71 72 self.log.debug('Received Stream packet (%s, %s)', packet.namespace, packet.node) 73 #print '>>>', packet.toxml() 72 74 73 75 # Lookup our packet handler trunk/RBTelepathy/RBTelepathy/Packet/AuthenticationHandler.py
r433 r437 70 70 AuthType = packet.attrs['type'] 71 71 except KeyError: 72 print packet.toxml(True)73 72 raise ErrorTypes.AuthenticationError('Sequence type not specified') 73 74 74 try: 75 75 OnAuthType = self._ValidTypes[AuthType] … … 91 91 xml += ">" + XMLBody + "</authentication>" 92 92 else: xml += "/>" 93 #print '* '*1094 #print xml95 #print96 93 connection.SendPacket(xml) 97 94 trunk/RBTelepathy/RBTelepathy/Packet/Builder.py
r433 r437 79 79 raise ErrorTypes.PacketInvalidXMLError(str(e)) 80 80 except StandardError, e: 81 # Change these to PacketErrors81 # XXX: Change these to PacketErrors 82 82 #raise ErrorTypes.PacketError(str(e)) 83 83 raise trunk/RBTelepathy/RBTelepathy/Packet/Elements.py
r433 r437 120 120 class RouteableRootElement(RootElementBase): 121 121 def GetAddresses(self, nodename='to'): 122 existing = self. _getElements(node=nodename, namespace=RBMessagingNamespace)122 existing = self.iternodes(nodename, RBMessagingNamespace) 123 123 result = [each.addr for each in existing] 124 124 return result 125 125 126 126 def SetAddresses(self, addresses, nodename='to'): 127 print "XXX: RouteableRootElement.SetAddresses needs work" 127 128 # Figure out which addresses we are to maintain 128 existing = self._getElements(node=nodename, namespace=RBMessagingNamespace) 129 if existing: 130 idxAddresses = self._getElementIndex(existing[0]) 131 else: idxAddresses = 0 129 #existing = self.iternodes(nodename, RBMessagingNamespace) 130 #if existing: 131 # idxAddresses = self._getElementIndex(existing[0]) 132 #else: idxAddresses = 0 133 #idxAddresses = 0 132 134 133 existing = [(each.addr, each) for each in existing if each.addr in addresses]134 existing = dict(existing)135 #existing = [(each.addr, each) for each in existing if each.addr in addresses] 136 #existing = dict(existing) 135 137 136 # Remove all existing addresses137 self._delElements(node=nodename, namespace=RBMessagingNamespace)138 ## Remove all existing addresses 139 #self.delnodes(nodename, RBMessagingNamespace) 138 140 139 for address in addresses:140 element = existing.get(address)141 if element is None:142 # Create a new element143 element = self._addNewElement(self.namespace, nodename, klass=URIAddressElement)[-1]144 element.addr = address145 element._xmlInitStarted()146 element._xmlInitComplete()147 else:148 self._addObjectifiedElement(element)149 150 self._elements.insert(idxAddresses, self._elements.pop())141 #for address in addresses: 142 # element = existing.get(address) 143 # if element is None: 144 # # Create a new element 145 # element = self.addnode(nodename, self.namespace, klass=URIAddressElement) 146 # element.addr = address 147 # element._xmlInitStarted() 148 # element._xmlInitComplete() 149 # else: 150 # self._addObjectifiedElement(element) 151 # 152 # self._elements.insert(idxAddresses, self._elements.pop()) 151 153 152 154 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ trunk/RBTelepathy/RBTelepathy/Packet/MessageHandler.py
r433 r437 75 75 def OnRoutedPacket(self, connection, packet, addresses): 76 76 # Copy the root level packet, so we can adjust it's addresses 77 packet = copy.copy(packet)77 #packet = copy.copy(packet) 78 78 # Change the address lists in the packet 79 79 packet.SetAddresses(addresses) trunk/RBTelepathy/RBTelepathy/Routing/RouterBase.py
r406 r437 23 23 #~ Imports 24 24 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 25 26 from RBMessaging import ErrorTypes 25 27 26 28 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 59 61 """Returns the default destination for an otherwise unrouteable address. 60 62 Can return None, raise an error, or return a valid destination.""" 61 raise KeyError, "No route found for '%s'" % (address,)63 raise ErrorTypes.RoutingError("No route found for '%s'" % (address,)) 62 64 63 65 def FindRouteDestinations(self, address): trunk/RBTelepathy/RBTelepathy/Routing/SimpleRouter.py
r415 r437 25 25 26 26 from RouterBase import RouterBase 27 from RBMessaging import ErrorTypes 27 28 28 29 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ trunk/RBTelepathy/RBTelepathy/Stream/Protocol.py
r433 r437 43 43 currentpacket = None 44 44 packetbuilder = None 45 completepackets = () 45 46 log = logging.getLogger('StreamProtocol') 46 47 … … 62 63 def OnRecvStreamData(self, streamdata): 63 64 """Called from Stream object to introduce more raw stream bytes into the system""" 64 if self.data: 65 self.data += streamdata 66 else: 67 self.data = streamdata 65 if streamdata: 66 if self.data: 67 self.data += streamdata 68 else: 69 self.data = streamdata 68 70 69 71 while self.ProcessData(): … … 91 93 self._BuildData() 92 94 95 if self.completepackets: 96 self._SendCompleteStreamPacket(self.completepackets.pop(0)) 97 93 98 return self.data and True or False 94 99 … … 106 111 if error.shutdown or forceshutdown: 107 112 self.stream.shutdown('local') 113 del self.data 108 114 else: 109 115 self.log.critical(str(error), exc_info=1) … … 114 120 if forceshutdown: 115 121 self.stream.shutdown('local') 116 return False 122 del self.data 123 124 # Reraise any non-RBMessaging error 125 return isinstance(error, ErrorTypes.RBMessagingError) 117 126 118 127 def OnStreamPacket(self, packet): … … 145 154 if self.currentpacket is not None: 146 155 try: 147 self.data = self.currentpacket.OnStreamData(self.data, self._OnStreamPacket) 156 self.data = self.currentpacket.OnStreamData(self.data, self._OnStreamPacket) or '' 148 157 except ErrorTypes.RBMessagingError, rbError: 149 158 if self.StreamError(rbError) is False: … … 154 163 155 164 def _OnStreamPacket(self, packet): 165 if self.completepackets: 166 self.completepackets.append(packet) 167 else: self.completepackets = [packet] 156 168 del self.currentpacket 169 170 def _SendCompleteStreamPacket(self, packet): 157 171 try: 158 172 self.OnStreamPacket(packet) trunk/RBTelepathy/RBTelepathy/Stream/SocketAdaptor.py
r432 r437 40 40 _sendData = "" 41 41 isshutdown = False 42 _isshutdown_send = False 43 _isshutdown_recv = False 42 44 log = logging.getLogger('SocketStream') 43 45 … … 48 50 def __init__(self, socket): 49 51 self.socket = socket 52 try: 53 del self.isshutdown 54 del self._isshutdown_send 55 del self._isshutdown_recv 56 except AttributeError: pass 50 57 51 58 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 57 64 return self._sendData 58 65 def _setSendData(self, data): 59 self._sendData = data 66 if self._isshutdown_send: 67 raise ErrorTypes.StreamError('Cannot write to stream after shutdown') 68 else: 69 self._sendData = data 60 70 def _delSendData(self): 61 71 del self._sendData … … 67 77 write = send 68 78 69 def shutdown(self, how='local', allowread=False, allowwrite=True):79 def shutdown(self, how='local', *args, **kw): 70 80 try: 71 81 if not self.isshutdown: 72 82 self.OnShutdown(how) 73 83 self.log.info('Connection closed by "%s" on %s', how, self.socket.getpeername()) 74 self.isshutdown |= (allowread << 1) | (allowwrite << 0) 75 if self.isshutdown > 0: 76 self.socket.shutdown(self.isshutdown-1) 84 self.isshutdown = True 85 return self._SocketShutdown(*args, **kw) 77 86 except socket.error, exc: 78 87 self.log.exception("Socket error on shutdown") … … 101 110 # if we've been marked to shutdown 102 111 if self.isshutdown: 103 # and all data is sent out 104 if not self._sendData: 105 # then we are done 106 return True 112 # and all data is sent out, or there is no more sending allowed 113 return (not self._sendData) or self._isshutdown_send 107 114 return False 108 115 109 116 def _NeedsRead(self): 110 return self.socket and True117 return self.socket and not self._isshutdown_recv 111 118 112 119 def _ProcessRead(self, *args, **kw): … … 114 121 if not data: 115 122 # The remote side shutdown the connection 116 self.shutdown('remote' , False, True)123 self.shutdown('remote') 117 124 self.OnRecvStreamData(data) 118 125 119 126 def _NeedsWrite(self): 120 return self.socket and self._sendData and True or False 127 if self._isshutdown_send: 128 return False 129 else: 130 return self.socket and self._sendData 121 131 122 132 def _ProcessWrite(self, *args, **kw): 123 133 nSent = self._SocketSend(self._sendData, *args, **kw) 124 134 self._sendData = self._sendData[nSent:] 125 if self.isshutdown and not self._sendData:135 if self.isshutdown: 126 136 # Ok, we're shutdown, but were still sending data 127 # Now that we are done, shutdown the connection. 128 self.shutdown('local', True, False) 137 if not self._sendData: 138 # Now that we are done, shutdown the connection. 139 self._SocketShutdown(False, True) 129 140 130 141 def _NeedsError(self): … … 132 143 133 144 def _ProcessError(self): 134 pass145 self.log.critical('Received an error on SocketAdaptor.socket') 135 146 136 147 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 149 160 if not self._SetSocketError(exc): 150 161 raise 162 163 def _SocketShutdown(self, disallowrecv=True, disallowsend=False): 164 assert self.isshutdown, '_SocketShutdown assumes shutdown has already been called' 165 try: 166 self._isshutdown_recv |= disallowrecv and 1 or 0 167 self._isshutdown_send |= disallowsend and 1 or 0 168 flags = (self._isshutdown_send << 1) | (self._isshutdown_recv << 0) 169 if flags > 0: 170 self.socket.shutdown(flags-1) 171 except socket.error, exc: 172 self.log.exception("Socket error on shutdown") 151 173 152 174 def _SetSocketError(self, exc): … … 154 176 del self._sendData 155 177 del exc 156 self.shutdown('error' , False, False)178 self.shutdown('error') 157 179 # We've logged it and taken care of the stream, 158 180 # therefore don't propigate. If you want to do
