[Twisted-Python] Re: Twisted protocol

Andrew Bennetts andrew-twisted at puzzling.org
Mon Mar 11 18:25:10 MST 2002


On Mon, Mar 11, 2002 at 06:51:57PM +0100, David wrote:
> Hello spiv, this is supposed to be reaching you =)
> I was told by radix on #python at opn that you had written "a little proxy 
> protocol which dispatches to multiple other protocol objects" in 
> twisted. This is exactly what i need for a project of mine.
> I'd very much appriciate if you would share this little piece of code 
> with me or alternativly explain how it works.

Heh.  I'm CC'ing the list with this, just for the sake of it :)

Here is the class.  I created it for a case where I had a protocol that was
sometimes inheriting from one Protocol, and sometimes another, and I didn't
want to diddle with __bases__ or munge the two bases into one class
(although perhaps that is the "better" solution?).  If you like, imagine
PacketBasedProtocolA/B to be basic.LineReceiver and Int32StringReceiver,
where lineReceived and stringReceived are both aliased to packetReceived.

class ProxiedPacketProtocol(Protocol):
    """General packet-based protocol.
    
    This class provides a simple way to use either PacketBasedProtocolA or
    PacketBasedProtocolB (or potentially others) as protocol for a data feed,
    without having to change which one you inherit from at runtime.  It
    basically acts as a proxy protocol between the low-level protocol and your
    subclass.  

    Simply override parentProtocol with the "parent" protocol (the default is
    PacketBasedProtocolA) and then when packetReceived is triggered in the
    parent, packetReceived is called in me.  

    Inherit from this class, and override packetReceived."""
    
    parentProtocol = PacketBasedProtocolA
    packets = {}        # This is copied to the parent

    def __init__(self):
        # Create a private subclass of the parentProtocol so that we can
        # override its class-level data attribute(s).
        class ParentProtocol(self.parentProtocol):
            packets = self.packets

        # Create the parent protocol
        self.parent = ParentProtocol()

        # Raw data should get delivered to the parent...
        self.dataReceived = self.parent.dataReceived
        
        # ...and processed packets should come back to me
        self.parent.packetReceived = self.packetReceived
        self.parent.unknownPacket = self.unknownPacket

        # Data from the pinger needs to come via me
        self.parent.transport = self.transport

    def packetReceived(self, packet):
        """Override this.  
        
        Called whenever the parentProtocol receives a packet."""
        pass

    def unknownPacket(self, messageType, data):
        print "Received unknown packet of type '%s': %s" \
              % (messageType, repr(data))


David, I hope this is what you were after :)

It should be fairly easy to use and adapt -- but my question for the list is,
is it worth the extra effort it would take to make this more general?  i.e.
take arbitrary lists of attributes to copy from the parent to the proxy (and
vice versa?), instead of hard-coded names in __init__?

My other question is, is this a useful enough concept to include it in 
Twisted?  :)

-Andrew.





More information about the Twisted-Python mailing list