Index: third_party/twisted_8_1/twisted/flow/protocol.py |
diff --git a/third_party/twisted_8_1/twisted/flow/protocol.py b/third_party/twisted_8_1/twisted/flow/protocol.py |
deleted file mode 100644 |
index accad21034b36ede5b4e9b439767f722401b9dce..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/flow/protocol.py |
+++ /dev/null |
@@ -1,151 +0,0 @@ |
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
-# |
-# Author: Clark Evans (cce@clarkevans.com) |
-# |
- |
-""" |
-flow.protocol |
- |
-This allows one to use flow module to create protocols, a protocol is actually |
-a controller, but it is specialized enough to deserve its own module. |
-""" |
- |
-import types |
-from base import * |
-from wrap import wrap |
-from stage import Callback |
-from twisted.internet import protocol |
-from twisted.internet.error import ConnectionLost, ConnectionDone |
- |
-def makeProtocol(controller, baseClass = protocol.Protocol, |
- *callbacks, **kwargs): |
- """ |
- Construct a flow based protocol |
- |
- This takes a base protocol class, and a set of callbacks and creates a |
- connection flow based on the two. For example, the following would build a |
- simple 'echo' protocol:: |
- |
- from __future__ import generators |
- from twisted.internet import reactor, protocol |
- from twisted.flow import flow |
- PORT = 8392 |
- |
- def echoServer(conn): |
- yield conn |
- for data in conn: |
- conn.write(data) |
- yield conn |
- |
- def echoClient(conn): |
- conn.write("hello, world!") |
- yield conn |
- print "server said: ", conn.next() |
- reactor.callLater(0,reactor.stop) |
- |
- server = protocol.ServerFactory() |
- server.protocol = flow.makeProtocol(echoServer) |
- reactor.listenTCP(PORT,server) |
- client = protocol.ClientFactory() |
- client.protocol = flow.makeProtocol(echoClient) |
- reactor.connectTCP("localhost", PORT, client) |
- reactor.run() |
- |
- Of course, the best part about flow is that you can nest stages. Therefore |
- it is quite easy to make a lineBreaker generator which takes an input |
- connection and produces and output connection. Anyway, the code is almost |
- identical as far as the client/server is concerned:: |
- |
- # this is a filter generator, it consumes from the |
- # incoming connection, and yields results to |
- # the next stage, the echoServer below |
- def lineBreaker(conn, lineEnding = "\\n"): |
- lst = [] |
- yield conn |
- for chunk in conn: |
- pos = chunk.find(lineEnding) |
- if pos > -1: |
- lst.append(chunk[:pos]) |
- yield "".join(lst) |
- lst = [chunk[pos+1:]] |
- else: |
- lst.append(chunk) |
- yield conn |
- yield "".join(lst) |
- |
- # note that this class is only slightly modified, |
- # simply comment out the line breaker line to see |
- # how the server behaves without the filter... |
- def echoServer(conn): |
- lines = flow.wrap(lineBreaker(conn)) |
- yield lines |
- for data in lines: |
- conn.write(data) |
- yield lines |
- |
- # and the only thing that is changed is that we |
- # are sending data in strange chunks, and even |
- # putting the last chunk on hold for 2 seconds. |
- def echoClient(conn): |
- conn.write("Good Morning!\\nPlease ") |
- yield conn |
- print "server said: ", conn.next() |
- conn.write("do not disregard ") |
- reactor.callLater(2, conn.write, "this.\\n") |
- yield conn |
- print "server said: ", conn.next() |
- reactor.callLater(0,reactor.stop) |
- """ |
- if not callbacks: |
- callbacks = ('dataReceived',) |
- trap = kwargs.get("trap", tuple()) |
- class _Protocol(Controller, Callback, baseClass): |
- def __init__(self): |
- Callback.__init__(self, *trap) |
- setattr(self, callbacks[0], self) |
- # TODO: support more than one callback via Concurrent |
- def _execute(self, dummy = None): |
- cmd = self._controller |
- self.write = self.transport.write |
- while True: |
- instruction = cmd._yield() |
- if instruction: |
- if isinstance(instruction, CallLater): |
- instruction.callLater(self._execute) |
- return |
- raise Unsupported(instruction) |
- if cmd.stop: |
- self.transport.loseConnection() |
- return |
- if cmd.failure: |
- self.transport.loseConnection() |
- cmd.failure.trap() |
- return |
- if cmd.results: |
- self.transport.writeSequence(cmd.results) |
- cmd.results = [] |
- def connectionMade(self): |
- if types.ClassType == type(self.controller): |
- self._controller = wrap(self.controller(self)) |
- else: |
- self._controller = wrap(self.controller()) |
- self._execute() |
- def connectionLost(self, reason=protocol.connectionDone): |
- if isinstance(reason.value, ConnectionDone) or \ |
- (isinstance(reason.value, ConnectionLost) and \ |
- self.finishOnConnectionLost): |
- self.finish() |
- else: |
- self.errback(reason) |
- self._execute() |
- _Protocol.finishOnConnectionLost = kwargs.get("finishOnConnectionLost",True) |
- _Protocol.controller = controller |
- return _Protocol |
- |
-def _NotImplController(protocol): |
- raise NotImplementedError |
-Protocol = makeProtocol(_NotImplController) |
-Protocol.__doc__ = """ A concrete flow.Protocol for inheritance """ |
- |