| Index: third_party/twisted_8_1/twisted/application/internet.py
|
| diff --git a/third_party/twisted_8_1/twisted/application/internet.py b/third_party/twisted_8_1/twisted/application/internet.py
|
| deleted file mode 100644
|
| index 5ca2d18ce1964f74e22bc85e1417bd2b3f560c5e..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/application/internet.py
|
| +++ /dev/null
|
| @@ -1,270 +0,0 @@
|
| -# -*- test-case-name: twisted.test.test_application,twisted.test.test_cooperator -*-
|
| -
|
| -# Copyright (c) 2001-2007 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -"""
|
| -Reactor-based Services
|
| -
|
| -Here are services to run clients, servers and periodic services using
|
| -the reactor.
|
| -
|
| -This module (dynamically) defines various Service subclasses that let
|
| -you represent clients and servers in a Service hierarchy.
|
| -
|
| -They are as follows::
|
| -
|
| - TCPServer, TCPClient,
|
| - UNIXServer, UNIXClient,
|
| - SSLServer, SSLClient,
|
| - UDPServer, UDPClient,
|
| - UNIXDatagramServer, UNIXDatagramClient,
|
| - MulticastServer
|
| -
|
| -These classes take arbitrary arguments in their constructors and pass
|
| -them straight on to their respective reactor.listenXXX or
|
| -reactor.connectXXX calls.
|
| -
|
| -For example, the following service starts a web server on port 8080:
|
| -C{TCPServer(8080, server.Site(r))}. See the documentation for the
|
| -reactor.listen/connect* methods for more information.
|
| -
|
| -Maintainer: U{Moshe Zadka<mailto:moshez@twistedmatrix.com>}
|
| -"""
|
| -
|
| -from twisted.python import log
|
| -from twisted.application import service
|
| -from twisted.internet import task
|
| -
|
| -
|
| -class _VolatileDataService(service.Service):
|
| -
|
| - volatile = []
|
| -
|
| - def __getstate__(self):
|
| - d = service.Service.__getstate__(self)
|
| - for attr in self.volatile:
|
| - if attr in d:
|
| - del d[attr]
|
| - return d
|
| -
|
| -
|
| -
|
| -class _AbstractServer(_VolatileDataService):
|
| - """
|
| - @cvar volatile: list of attribute to remove from pickling.
|
| - @type volatile: C{list}
|
| -
|
| - @ivar method: the type of method to call on the reactor, one of B{TCP},
|
| - B{UDP}, B{SSL} or B{UNIX}.
|
| - @type method: C{str}
|
| -
|
| - @ivar reactor: the current running reactor.
|
| - @type reactor: a provider of C{IReactorTCP}, C{IReactorUDP},
|
| - C{IReactorSSL} or C{IReactorUnix}.
|
| -
|
| - @ivar _port: instance of port set when the service is started.
|
| - @type _port: a provider of C{IListeningPort}.
|
| - """
|
| -
|
| - volatile = ['_port']
|
| - method = None
|
| - reactor = None
|
| -
|
| - _port = None
|
| -
|
| - def __init__(self, *args, **kwargs):
|
| - self.args = args
|
| - if 'reactor' in kwargs:
|
| - self.reactor = kwargs.pop("reactor")
|
| - self.kwargs = kwargs
|
| -
|
| -
|
| - def privilegedStartService(self):
|
| - service.Service.privilegedStartService(self)
|
| - self._port = self._getPort()
|
| -
|
| -
|
| - def startService(self):
|
| - service.Service.startService(self)
|
| - if self._port is None:
|
| - self._port = self._getPort()
|
| -
|
| -
|
| - def stopService(self):
|
| - service.Service.stopService(self)
|
| - # TODO: if startup failed, should shutdown skip stopListening?
|
| - # _port won't exist
|
| - if self._port is not None:
|
| - d = self._port.stopListening()
|
| - del self._port
|
| - return d
|
| -
|
| -
|
| - def _getPort(self):
|
| - """
|
| - Wrapper around the appropriate listen method of the reactor.
|
| -
|
| - @return: the port object returned by the listen method.
|
| - @rtype: an object providing L{IListeningPort}.
|
| - """
|
| - if self.reactor is None:
|
| - from twisted.internet import reactor
|
| - else:
|
| - reactor = self.reactor
|
| - return getattr(reactor, 'listen%s' % (self.method,))(
|
| - *self.args, **self.kwargs)
|
| -
|
| -
|
| -
|
| -class _AbstractClient(_VolatileDataService):
|
| - """
|
| - @cvar volatile: list of attribute to remove from pickling.
|
| - @type volatile: C{list}
|
| -
|
| - @ivar method: the type of method to call on the reactor, one of B{TCP},
|
| - B{UDP}, B{SSL} or B{UNIX}.
|
| - @type method: C{str}
|
| -
|
| - @ivar reactor: the current running reactor.
|
| - @type reactor: a provider of C{IReactorTCP}, C{IReactorUDP},
|
| - C{IReactorSSL} or C{IReactorUnix}.
|
| -
|
| - @ivar _connection: instance of connection set when the service is started.
|
| - @type _connection: a provider of C{IConnector}.
|
| - """
|
| - volatile = ['_connection']
|
| - method = None
|
| - reactor = None
|
| -
|
| - _connection = None
|
| -
|
| - def __init__(self, *args, **kwargs):
|
| - self.args = args
|
| - if 'reactor' in kwargs:
|
| - self.reactor = kwargs.pop("reactor")
|
| - self.kwargs = kwargs
|
| -
|
| -
|
| - def startService(self):
|
| - service.Service.startService(self)
|
| - self._connection = self._getConnection()
|
| -
|
| -
|
| - def stopService(self):
|
| - service.Service.stopService(self)
|
| - if self._connection is not None:
|
| - self._connection.disconnect()
|
| - del self._connection
|
| -
|
| -
|
| - def _getConnection(self):
|
| - """
|
| - Wrapper around the appropriate connect method of the reactor.
|
| -
|
| - @return: the port object returned by the connect method.
|
| - @rtype: an object providing L{IConnector}.
|
| - """
|
| - if self.reactor is None:
|
| - from twisted.internet import reactor
|
| - else:
|
| - reactor = self.reactor
|
| - return getattr(reactor, 'connect%s' % (self.method,))(
|
| - *self.args, **self.kwargs)
|
| -
|
| -
|
| -
|
| -_doc={
|
| -'Client':
|
| -"""Connect to %(tran)s
|
| -
|
| -Call reactor.connect%(method)s when the service starts, with the
|
| -arguments given to the constructor.
|
| -""",
|
| -'Server':
|
| -"""Serve %(tran)s clients
|
| -
|
| -Call reactor.listen%(method)s when the service starts, with the
|
| -arguments given to the constructor. When the service stops,
|
| -stop listening. See twisted.internet.interfaces for documentation
|
| -on arguments to the reactor method.
|
| -""",
|
| -}
|
| -
|
| -import new
|
| -for tran in 'Generic TCP UNIX SSL UDP UNIXDatagram Multicast'.split():
|
| - for side in 'Server Client'.split():
|
| - if tran == "Multicast" and side == "Client":
|
| - continue
|
| - base = globals()['_Abstract'+side]
|
| - method = {'Generic': 'With'}.get(tran, tran)
|
| - doc = _doc[side]%vars()
|
| - klass = new.classobj(tran+side, (base,),
|
| - {'method': method, '__doc__': doc})
|
| - globals()[tran+side] = klass
|
| -
|
| -
|
| -class TimerService(_VolatileDataService):
|
| -
|
| - """Service to periodically call a function
|
| -
|
| - Every C{step} seconds call the given function with the given arguments.
|
| - The service starts the calls when it starts, and cancels them
|
| - when it stops.
|
| - """
|
| -
|
| - volatile = ['_loop']
|
| -
|
| - def __init__(self, step, callable, *args, **kwargs):
|
| - self.step = step
|
| - self.call = (callable, args, kwargs)
|
| -
|
| - def startService(self):
|
| - service.Service.startService(self)
|
| - callable, args, kwargs = self.call
|
| - # we have to make a new LoopingCall each time we're started, because
|
| - # an active LoopingCall remains active when serialized. If
|
| - # LoopingCall were a _VolatileDataService, we wouldn't need to do
|
| - # this.
|
| - self._loop = task.LoopingCall(callable, *args, **kwargs)
|
| - self._loop.start(self.step, now=True).addErrback(self._failed)
|
| -
|
| - def _failed(self, why):
|
| - # make a note that the LoopingCall is no longer looping, so we don't
|
| - # try to shut it down a second time in stopService. I think this
|
| - # should be in LoopingCall. -warner
|
| - self._loop.running = False
|
| - log.err(why)
|
| -
|
| - def stopService(self):
|
| - if self._loop.running:
|
| - self._loop.stop()
|
| - return service.Service.stopService(self)
|
| -
|
| -
|
| -
|
| -class CooperatorService(service.Service):
|
| - """
|
| - Simple L{service.IService} which starts and stops a L{twisted.internet.task.Cooperator}.
|
| - """
|
| - def __init__(self):
|
| - self.coop = task.Cooperator(started=False)
|
| -
|
| -
|
| - def coiterate(self, iterator):
|
| - return self.coop.coiterate(iterator)
|
| -
|
| -
|
| - def startService(self):
|
| - self.coop.start()
|
| -
|
| -
|
| - def stopService(self):
|
| - self.coop.stop()
|
| -
|
| -
|
| -
|
| -__all__ = (['TimerService', 'CooperatorService'] +
|
| - [tran+side
|
| - for tran in 'Generic TCP UNIX SSL UDP UNIXDatagram Multicast'.split()
|
| - for side in 'Server Client'.split()])
|
|
|