diff --git a/doc/listings/i2p.py b/doc/listings/i2p.py new file mode 100644 index 0000000..62520ef --- /dev/null +++ b/doc/listings/i2p.py @@ -0,0 +1,20 @@ +from foolscap.ipb import IConnectionHintHandler +from foolscap.logging import log +import re +from twisted.internet import endpoints +from zope.interface import implementer + +HINT_RE=re.compile(r"^i2p:([A-Za-z.0-9\-]+)(:(\d+){1,5})?$") + +@implementer(IConnectionHintHandler) +class I2PPlugin: + def hint_to_endpoint(self, hint, reactor): + mo = HINT_RE.search(hint) + if not mo: + raise InvalidHintError("unrecognized I2P hint") + host, port = mo.group(1), mo.group(2) + desc = 'i2p:%s:%s' % (host, port) if port else 'i2p:%s' % host + try: + return endpoints.clientFromString(reactor, desc), host + except ValueError: + raise InvalidHintError("txi2p is not installed") diff --git a/doc/listings/pb3calculator.py b/doc/listings/pb3calculator.py index df41931..0418a9a 100644 --- a/doc/listings/pb3calculator.py +++ b/doc/listings/pb3calculator.py @@ -33,7 +33,7 @@ class Calculator(Referenceable): tub = Tub() tub.listenOn("tcp:12345") -tub.setLocation("localhost:12345") +tub.setLocation("i2p:6wata5vdjeo4ma5v2id2nka6jqaig2xfqrfzrlcgrekpcqwklnza.b32.i2p") url = tub.registerReference(Calculator(), "calculator") print "the object is available at:", url diff --git a/doc/listings/pb3user.py b/doc/listings/pb3user.py index 2b05323..915eed7 100644 --- a/doc/listings/pb3user.py +++ b/doc/listings/pb3user.py @@ -3,6 +3,7 @@ import sys from twisted.internet import reactor from foolscap.api import Referenceable, Tub +from i2p import I2PPlugin class Observer(Referenceable): def remote_event(self, msg): @@ -27,6 +28,7 @@ def gotRemote(remote): url = sys.argv[1] tub = Tub() +tub.addConnectionHintHandler('i2p', I2PPlugin()) tub.startService() d = tub.getReference(url) d.addCallback(gotRemote)