Changeset 406

Show
Ignore:
Timestamp:
01/16/03 22:38:14 (6 years ago)
Author:
sholloway
Message:

*** empty log message ***

Files:

Legend:

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

    r393 r406  
    118118        else: raise ValueError, 'Expected string, but received %r' % type(uri) 
    119119 
     120    def __repr__(self): 
     121        return '<URI: %s>' % (self.geturi(),) 
     122 
    120123    def __str__(self): 
    121124        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)) 
    122131 
    123132    def geturi(self): 
  • trunk/RBFoundation/RBFoundation/XMLObjectify.py

    r396 r406  
    283283        return self._addElement((obj.__namespace__, obj.__node__), obj) 
    284284 
    285     def _addNewElement(self, namespace, node, **attributes): 
     285    def _addNewElement(self, namespace, node, klass=None, **attributes): 
    286286        """Creates and adds a new element in namespace, with name node, having attributes as given.  Uses self.__class__ for creating the element instance.""" 
    287287        namespace = namespace or self.__namespace__ 
     288        klass = klass or self.__class__ 
    288289        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)) 
    290291         
    291292    def _removeElement(self, element): 
     
    295296        if delta: self._elements = elements 
    296297        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 
    297305 
    298306    def _clearData(self): 
  • trunk/RBTelepathy/.cvsignore

    r405 r406  
    1 RBRenderer\__init__.pyc 
    21*.pyc 
    3 *.pyc 
  • trunk/RBTelepathy/RBTelepathy/Packet/Elements.py

    r402 r406  
    2727from RBFoundation.XMLClassBuilder import XMLClassBuilderObjectMixin 
    2828from RBFoundation.XMLObjectify import BaseObjectifiedXML, ObjectifiedXML 
     29from URIAddress import URIAddress 
    2930 
    3031#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    3334 
    3435class PacketElementBase(BaseObjectifiedXML): 
     36    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     37    #~ Public Methods  
     38    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     39 
    3540    def __init__(self, owner, *args, **kw): 
    3641        BaseObjectifiedXML.__init__(self, owner, *args, **kw) 
    3742        self._owner = owner 
    3843         
     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 
    3955    def OnUpdateContent(self): 
    4056        pass 
     
    4460        return BaseObjectifiedXML._toXML(self, *args, **kw) 
    4561 
     62#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     63 
     64class Error(PacketElementBase): 
     65    pass 
     66 
     67#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     68#~ Messages 
    4669#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    4770 
     
    77100        return ''.join(results) 
    78101 
     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 
    79136#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    80137 
    81 class Error(PacketElementBase): 
    82     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    83     #~ OnStreamData adaptor 
    84     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     138class 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) 
    85147 
    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) 
    90151 
    91     def GetStreamHeader(self): 
    92         return self._toXML() 
    93  
    94     def GetStreamData(self): 
    95         return '' 
    96  
  • trunk/RBTelepathy/RBTelepathy/Packet/__init__.py

    r402 r406  
    7979    ElementFactories = XMLClassBuilder.ElementFactorySet({ 
    8080            ('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), 
    8283            ('http://namespaces.runeblade.com/RBMessaging', ): MessageErrorFactory(), 
    8384            None: EF.Static(ObjectifiedXML), 
  • trunk/RBTelepathy/RBTelepathy/Stream/Protocol.py

    r402 r406  
    5151    def __init__(self, PacketBuilderClass=StandardStreamPacketBuilder): 
    5252        self.packetbuilder = PacketBuilderClass() 
    53         self.log.debug('StreamProtocol created') 
     53        self.log.debug('Created') 
    5454 
    5555    def __del__(self): 
    56         self.log.debug('StreamProtocol destroyed') 
     56        self.log.debug('Destroyed') 
    5757 
    5858    def SendPacket(self, packet): 
     
    9696                        self.StreamError('%s: %s' % (e.__class__.__name__, str(e))) 
    9797                        self.log.error(e) 
     98                        #raise 
    9899            else: 
    99100                self.data = self.currentpacket.OnStreamData(self.data, self._OnPacketComplete) 
    100101 
    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): 
    103103        if namespace is None: 
    104104            try: 
     
    116116        self.log.info('Stream error from client connection.  Shutting down.') 
    117117        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() 
    119121 
    120122    def OnPacketComplete(self, packet): 
     
    127129    def _OnPacketComplete(self, packet): 
    128130        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 
    130138 
  • trunk/RBTelepathy/RBTelepathy/Stream/SocketAdaptor.py

    r401 r406  
    4040    _sendData = "" 
    4141    isshutdown = False 
     42    log = logging.getLogger('.'.join((__name__, 'SocketStream'))) 
    4243 
    4344    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    99100        if not data: 
    100101            self.isshutdown = True 
     102            self.log.info('Connection closed by remote connection') 
    101103        self.protocol.OnRecvStreamData(data) 
    102104 
     
    131133 
    132134    def _SetSocketError(self, exc): 
     135        self.log.error(exc) 
     136        self.isshutdown = True 
     137        del self._sendData 
    133138        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  
    134143 
    135144#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  • trunk/RBTelepathy/test/test_packet.py

    r391 r406  
    3737class AddressedPacketTestCase(unittest.TestCase): 
    3838    toAddresses = ('someone', 'act@network') 
    39     XMLHeader = '''<message><to>%s</to><to>%s</to></message>''' % toAddresses 
     39    XMLHeader = '''<message><to addr='%s'/><to addr='%s'/></message>''' % toAddresses 
    4040    Data = '' 
    4141 
     
    4949        self.failUnlessEqual(len(toNodes), len(self.toAddresses)) 
    5050        for value, expected in zip(toNodes, self.toAddresses): 
    51             self.failUnlessEqual(value, expected) 
     51            self.failUnlessEqual(str(value.addr), expected) 
    5252 
    5353#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~