pbnew.py   [plain text]


import sys
###################
###################
###################
sys.path.append("/home/exarkun/projects/python/Twisted/sandbox/exarkun/papers/2004/pycon/migration/pb")
import pb
import schema

from twisted.spread.pb import Avatar, PBServerFactory, PBClientFactory, IPerspective, IPBRoot
pb.Avatar = Avatar
pb.IPerspective = IPerspective
pb.PBServerFactory = PBServerFactory
pb.PBClientFactory = PBClientFactory
###################
###################
###################

from twisted.python import components

class ISliceable(components.Interface):
    def start(self):
        pass
    def slice(self):
        pass
    def finish(self):
        pass

class InterfacefulRootSlicer(pb.PBRootSlicer):
    def slicerFactoryForObject(self, obj):
        print 'slicerFactoryFor', obj
        slicerClass = pb.PBRootSlicer.slicerFactoryForObject(self, obj)
        if slicerClass is None:
            slicerClass = ISliceable(obj, default=None)
        return slicerClass

class InterfacefulBroker(pb.Broker):
    slicerClass = InterfacefulRootSlicer

    def __init__(self, isClient=1):
        pb.Broker.__init__(self)
        self.isClient = isClient
        self.names = {}

    def setNameForLocal(self, name, obj):
        self.names[name] = self.putObj(obj)

    def remoteForName(self, name):
        return pb.RemoteReference(self, 1)

    def connectionMade(self):
        print 'Conn', self.factory
        self.factory.clientConnectionMade(self)

class PBServerFactory(pb.PBServerFactory):
    protocol = InterfacefulBroker

class PBClientFactory(pb.PBClientFactory):
    protocol = InterfacefulBroker

    def _cbSendUsername(self, root, username, password, client):
        return root.callRemote("login", username=username
                               ).addCallback(self._cbResponse, password, client
                                             )

    def _cbResponse(self, (challenge, challenger), password, client):
        resp = respond(challenge, password)
        return challenger.callRemote("respond", response=resp, mind=client)

class Root:
    __implements__ = IPBRoot
    def rootObject(self, broker):
        return self

    def remote_ready(self, receiver):
        print 'Woo woo', receiver

    def getMethodSchema(self, methodname):
        return None