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
syntax highlighted by Code2HTML, v. 0.9.1