Changeset 406
- Timestamp:
- 01/16/03 22:38:14 (6 years ago)
- Files:
-
- trunk/RBFoundation/RBFoundation/URIparser.py (modified) (1 diff)
- trunk/RBFoundation/RBFoundation/XMLObjectify.py (modified) (2 diffs)
- trunk/RBTelepathy/.cvsignore (modified) (1 diff)
- trunk/RBTelepathy/RBTelepathy/Packet/Elements.py (modified) (4 diffs)
- trunk/RBTelepathy/RBTelepathy/Packet/URIAddress.py (added)
- trunk/RBTelepathy/RBTelepathy/Packet/__init__.py (modified) (1 diff)
- trunk/RBTelepathy/RBTelepathy/Routing/RouterBase.py (added)
- trunk/RBTelepathy/RBTelepathy/Routing/SimpleRouter.py (added)
- trunk/RBTelepathy/RBTelepathy/Stream/Protocol.py (modified) (4 diffs)
- trunk/RBTelepathy/RBTelepathy/Stream/SocketAdaptor.py (modified) (3 diffs)
- trunk/RBTelepathy/test/test_packet.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RBFoundation/RBFoundation/URIparser.py
r393 r406 118 118 else: raise ValueError, 'Expected string, but received %r' % type(uri) 119 119 120 def __repr__(self): 121 return '<URI: %s>' % (self.geturi(),) 122 120 123 def __str__(self): 121 124 return self.geturi() 125 126 def __cmp__(self, other): 127 return cmp(str(self), str(other)) 128 129 def __hash__(self): 130 return hash(str(self)) 122 131 123 132 def geturi(self): trunk/RBFoundation/RBFoundation/XMLObjectify.py
r396 r406 283 283 return self._addElement((obj.__namespace__, obj.__node__), obj) 284 284 285 def _addNewElement(self, namespace, node, **attributes):285 def _addNewElement(self, namespace, node, klass=None, **attributes): 286 286 """Creates and adds a new element in namespace, with name node, having attributes as given. Uses self.__class__ for creating the element instance.""" 287 287 namespace = namespace or self.__namespace__ 288 klass = klass or self.__class__ 288 289 namespacemap = XMLBuilder.ChainedDict({}, self.__namespace_map__) 289 return self._addElement((namespace, node), self.__class__(self, self, (namespace, node), attributes, namespacemap))290 return self._addElement((namespace, node), klass(self, self, (namespace, node), attributes, namespacemap)) 290 291 291 292 def _removeElement(self, element): … … 295 296 if delta: self._elements = elements 296 297 return delta 298 299 def _getElementIndex(self, element): 300 idx = 0 301 for each in self._elements: 302 if each[-1] is element: 303 return idx 304 idx += 1 297 305 298 306 def _clearData(self): trunk/RBTelepathy/.cvsignore
r405 r406 1 RBRenderer\__init__.pyc2 1 *.pyc 3 *.pyctrunk/RBTelepathy/RBTelepathy/Packet/Elements.py
r402 r406 27 27 from RBFoundation.XMLClassBuilder import XMLClassBuilderObjectMixin 28 28 from RBFoundation.XMLObjectify import BaseObjectifiedXML, ObjectifiedXML 29 from URIAddress import URIAddress 29 30 30 31 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 33 34 34 35 class PacketElementBase(BaseObjectifiedXML): 36 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 37 #~ Public Methods 38 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 39 35 40 def __init__(self, owner, *args, **kw): 36 41 BaseObjectifiedXML.__init__(self, owner, *args, **kw) 37 42 self._owner = owner 38 43 44 def OnStreamData(self, data, OnPacketComplete=None): 45 if OnPacketComplete is not None: 46 OnPacketComplete(self) 47 return data 48 49 def GetStreamHeader(self): 50 return self._toXML() 51 52 def GetStreamData(self): 53 return '' 54 39 55 def OnUpdateContent(self): 40 56 pass … … 44 60 return BaseObjectifiedXML._toXML(self, *args, **kw) 45 61 62 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 64 class Error(PacketElementBase): 65 pass 66 67 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 68 #~ Messages 46 69 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 47 70 … … 77 100 return ''.join(results) 78 101 102 #~ Utility Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 103 104 def GetAddresses(self, nodename='to'): 105 existing = self._getElements(node=nodename, namespace=self.__namespace__) 106 return [each.addr for each in existing] 107 108 def SetAddresses(self, addresses, nodename='to'): 109 # Figure out which addresses we are to maintain 110 existing = self._getElements(node=nodename, namespace=self.__namespace__) 111 if existing: 112 idxAddresses = self._getElementIndex(existing[0]) 113 else: idxAddresses = 0 114 115 existing = [(each.addr, each) for each in existing if each.addr in addresses] 116 existing = dict(existing) 117 118 # Remove all existing addresses 119 self._delElements(node=nodename, namespace=self.__namespace__) 120 121 for address in addresses: 122 element = existing.get(address) 123 if element is None: 124 # Create a new element 125 element = self._addNewElement(self.__namespace__, nodename, klass=URIAddressElement)[-1] 126 element.addr = address 127 element._xmlInitStarted() 128 element._xmlInitComplete() 129 else: 130 self._addObjectifiedElement(element) 131 132 self._elements.insert(idxAddresses, self._elements.pop()) 133 134 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 135 #~ Message Supporting elements 79 136 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 137 81 class Error(PacketElementBase): 82 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 #~ OnStreamData adaptor 84 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 138 class URIAddressElement(PacketElementBase): 139 def _xmlInitStarted(self): 140 try: 141 self.addr = self._attributes['addr'] 142 except KeyError: 143 if not hasattr(self, 'addr'): 144 raise KeyError, '"%s" element has no attribute "addr"' % (self.__node__,) 145 else: 146 self.addr = URIAddress(self.addr) 85 147 86 def OnStreamData(self, data, OnPacketComplete=None): 87 if OnPacketComplete is not None: 88 OnPacketComplete(self) 89 return data 148 def OnUpdateContent(self): 149 PacketElementBase.OnUpdateContent(self) 150 self._attributes['addr'] = str(self.addr) 90 151 91 def GetStreamHeader(self):92 return self._toXML()93 94 def GetStreamData(self):95 return ''96 trunk/RBTelepathy/RBTelepathy/Packet/__init__.py
r402 r406 79 79 ElementFactories = XMLClassBuilder.ElementFactorySet({ 80 80 ('http://namespaces.runeblade.com/RBMessaging', 'stream'): StreamFormatFactory(), 81 ('http://namespaces.runeblade.com/RBMessaging', 'to'): EF.Static(ObjectifiedXML), 81 ('http://namespaces.runeblade.com/RBMessaging', 'to'): EF.Static(MessageElements.URIAddressElement), 82 ('http://namespaces.runeblade.com/RBMessaging', 'from'): EF.Static(MessageElements.URIAddressElement), 82 83 ('http://namespaces.runeblade.com/RBMessaging', ): MessageErrorFactory(), 83 84 None: EF.Static(ObjectifiedXML), trunk/RBTelepathy/RBTelepathy/Stream/Protocol.py
r402 r406 51 51 def __init__(self, PacketBuilderClass=StandardStreamPacketBuilder): 52 52 self.packetbuilder = PacketBuilderClass() 53 self.log.debug(' StreamProtocol created')53 self.log.debug('Created') 54 54 55 55 def __del__(self): 56 self.log.debug(' StreamProtocol destroyed')56 self.log.debug('Destroyed') 57 57 58 58 def SendPacket(self, packet): … … 96 96 self.StreamError('%s: %s' % (e.__class__.__name__, str(e))) 97 97 self.log.error(e) 98 #raise 98 99 else: 99 100 self.data = self.currentpacket.OnStreamData(self.data, self._OnPacketComplete) 100 101 101 102 def StreamError(self, error='Unknown Error', errortype='stream', namespace=None): 102 def StreamError(self, error='Unknown Error', errortype='stream', shutdown=True, namespace=None): 103 103 if namespace is None: 104 104 try: … … 116 116 self.log.info('Stream error from client connection. Shutting down.') 117 117 self.stream.write('''<error %s %s>%s</error>%s''' % (namespace, errortype, error, self.delimiter)) 118 self.stream.shutdown() 118 119 if shutdown: 120 self.stream.shutdown() 119 121 120 122 def OnPacketComplete(self, packet): … … 127 129 def _OnPacketComplete(self, packet): 128 130 del self.currentpacket 129 self.OnPacketComplete(packet) 131 try: 132 self.OnPacketComplete(packet) 133 except Exception, e: 134 # Something happened, report to the client 135 self.StreamError('%s: %s' % (e.__class__.__name__, str(e)), 'warning', shutdown=False) 136 self.log.error(e) 137 #raise 130 138 trunk/RBTelepathy/RBTelepathy/Stream/SocketAdaptor.py
r401 r406 40 40 _sendData = "" 41 41 isshutdown = False 42 log = logging.getLogger('.'.join((__name__, 'SocketStream'))) 42 43 43 44 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 99 100 if not data: 100 101 self.isshutdown = True 102 self.log.info('Connection closed by remote connection') 101 103 self.protocol.OnRecvStreamData(data) 102 104 … … 131 133 132 134 def _SetSocketError(self, exc): 135 self.log.error(exc) 136 self.isshutdown = True 137 del self._sendData 133 138 del exc 139 # We've logged it and taken care of the stream, 140 # therefore don't propigate. If you want to do 141 # something else, override it =) 142 return True 134 143 135 144 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ trunk/RBTelepathy/test/test_packet.py
r391 r406 37 37 class AddressedPacketTestCase(unittest.TestCase): 38 38 toAddresses = ('someone', 'act@network') 39 XMLHeader = '''<message><to >%s</to><to>%s</to></message>''' % toAddresses39 XMLHeader = '''<message><to addr='%s'/><to addr='%s'/></message>''' % toAddresses 40 40 Data = '' 41 41 … … 49 49 self.failUnlessEqual(len(toNodes), len(self.toAddresses)) 50 50 for value, expected in zip(toNodes, self.toAddresses): 51 self.failUnlessEqual( value, expected)51 self.failUnlessEqual(str(value.addr), expected) 52 52 53 53 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
