| Index: third_party/twisted_8_1/twisted/internet/udp.py
 | 
| diff --git a/third_party/twisted_8_1/twisted/internet/udp.py b/third_party/twisted_8_1/twisted/internet/udp.py
 | 
| deleted file mode 100644
 | 
| index 1597814f680df30f84508e302377f5f1563b3950..0000000000000000000000000000000000000000
 | 
| --- a/third_party/twisted_8_1/twisted/internet/udp.py
 | 
| +++ /dev/null
 | 
| @@ -1,385 +0,0 @@
 | 
| -# -*- test-case-name: twisted.test.test_udp -*-
 | 
| -
 | 
| -# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
 | 
| -# See LICENSE for details.
 | 
| -
 | 
| -
 | 
| -"""
 | 
| -Various asynchronous UDP classes.
 | 
| -
 | 
| -Please do not use this module directly.
 | 
| -
 | 
| -Maintainer: U{Itamar Shtull-Trauring<mailto:twisted@itamarst.org>}
 | 
| -"""
 | 
| -
 | 
| -# System Imports
 | 
| -import os
 | 
| -import socket
 | 
| -import operator
 | 
| -import struct
 | 
| -import warnings
 | 
| -from zope.interface import implements
 | 
| -
 | 
| -from twisted.python.runtime import platformType
 | 
| -if platformType == 'win32':
 | 
| -    from errno import WSAEWOULDBLOCK as EWOULDBLOCK
 | 
| -    from errno import WSAEINTR as EINTR
 | 
| -    from errno import WSAEMSGSIZE as EMSGSIZE
 | 
| -    from errno import WSAECONNREFUSED as ECONNREFUSED
 | 
| -    from errno import WSAECONNRESET
 | 
| -    EAGAIN=EWOULDBLOCK
 | 
| -else:
 | 
| -    from errno import EWOULDBLOCK, EINTR, EMSGSIZE, ECONNREFUSED, EAGAIN
 | 
| -
 | 
| -# Twisted Imports
 | 
| -from twisted.internet import protocol, base, defer, address
 | 
| -from twisted.persisted import styles
 | 
| -from twisted.python import log, reflect, failure
 | 
| -
 | 
| -# Sibling Imports
 | 
| -import abstract, error, interfaces
 | 
| -
 | 
| -
 | 
| -class Port(base.BasePort):
 | 
| -    """UDP port, listening for packets."""
 | 
| -
 | 
| -    implements(interfaces.IUDPTransport, interfaces.ISystemHandle)
 | 
| -
 | 
| -    addressFamily = socket.AF_INET
 | 
| -    socketType = socket.SOCK_DGRAM
 | 
| -    maxThroughput = 256 * 1024 # max bytes we read in one eventloop iteration
 | 
| -
 | 
| -    # Actual port number being listened on, only set to a non-None
 | 
| -    # value when we are actually listening.
 | 
| -    _realPortNumber = None
 | 
| -
 | 
| -    def __init__(self, port, proto, interface='', maxPacketSize=8192, reactor=None):
 | 
| -        """Initialize with a numeric port to listen on.
 | 
| -        """
 | 
| -        base.BasePort.__init__(self, reactor)
 | 
| -        self.port = port
 | 
| -        self.protocol = proto
 | 
| -        self.maxPacketSize = maxPacketSize
 | 
| -        self.interface = interface
 | 
| -        self.setLogStr()
 | 
| -        self._connectedAddr = None
 | 
| -
 | 
| -    def __repr__(self):
 | 
| -        if self._realPortNumber is not None:
 | 
| -            return "<%s on %s>" % (self.protocol.__class__, self._realPortNumber)
 | 
| -        else:
 | 
| -            return "<%s not connected>" % (self.protocol.__class__,)
 | 
| -
 | 
| -    def getHandle(self):
 | 
| -        """Return a socket object."""
 | 
| -        return self.socket
 | 
| -
 | 
| -    def startListening(self):
 | 
| -        """Create and bind my socket, and begin listening on it.
 | 
| -
 | 
| -        This is called on unserialization, and must be called after creating a
 | 
| -        server to begin listening on the specified port.
 | 
| -        """
 | 
| -        self._bindSocket()
 | 
| -        self._connectToProtocol()
 | 
| -
 | 
| -    def _bindSocket(self):
 | 
| -        try:
 | 
| -            skt = self.createInternetSocket()
 | 
| -            skt.bind((self.interface, self.port))
 | 
| -        except socket.error, le:
 | 
| -            raise error.CannotListenError, (self.interface, self.port, le)
 | 
| -
 | 
| -        # Make sure that if we listened on port 0, we update that to
 | 
| -        # reflect what the OS actually assigned us.
 | 
| -        self._realPortNumber = skt.getsockname()[1]
 | 
| -
 | 
| -        log.msg("%s starting on %s"%(self.protocol.__class__, self._realPortNumber))
 | 
| -
 | 
| -        self.connected = 1
 | 
| -        self.socket = skt
 | 
| -        self.fileno = self.socket.fileno
 | 
| -
 | 
| -    def _connectToProtocol(self):
 | 
| -        self.protocol.makeConnection(self)
 | 
| -        self.startReading()
 | 
| -
 | 
| -
 | 
| -    def doRead(self):
 | 
| -        """Called when my socket is ready for reading."""
 | 
| -        read = 0
 | 
| -        while read < self.maxThroughput:
 | 
| -            try:
 | 
| -                data, addr = self.socket.recvfrom(self.maxPacketSize)
 | 
| -            except socket.error, se:
 | 
| -                no = se.args[0]
 | 
| -                if no in (EAGAIN, EINTR, EWOULDBLOCK):
 | 
| -                    return
 | 
| -                if (no == ECONNREFUSED) or (platformType == "win32" and no == WSAECONNRESET):
 | 
| -                    if self._connectedAddr:
 | 
| -                        self.protocol.connectionRefused()
 | 
| -                else:
 | 
| -                    raise
 | 
| -            else:
 | 
| -                read += len(data)
 | 
| -                try:
 | 
| -                    self.protocol.datagramReceived(data, addr)
 | 
| -                except:
 | 
| -                    log.err()
 | 
| -
 | 
| -
 | 
| -    def write(self, datagram, addr=None):
 | 
| -        """Write a datagram.
 | 
| -
 | 
| -        @param addr: should be a tuple (ip, port), can be None in connected mode.
 | 
| -        """
 | 
| -        if self._connectedAddr:
 | 
| -            assert addr in (None, self._connectedAddr)
 | 
| -            try:
 | 
| -                return self.socket.send(datagram)
 | 
| -            except socket.error, se:
 | 
| -                no = se.args[0]
 | 
| -                if no == EINTR:
 | 
| -                    return self.write(datagram)
 | 
| -                elif no == EMSGSIZE:
 | 
| -                    raise error.MessageLengthError, "message too long"
 | 
| -                elif no == ECONNREFUSED:
 | 
| -                    self.protocol.connectionRefused()
 | 
| -                else:
 | 
| -                    raise
 | 
| -        else:
 | 
| -            assert addr != None
 | 
| -            if not addr[0].replace(".", "").isdigit():
 | 
| -                warnings.warn("Please only pass IPs to write(), not hostnames", DeprecationWarning, stacklevel=2)
 | 
| -            try:
 | 
| -                return self.socket.sendto(datagram, addr)
 | 
| -            except socket.error, se:
 | 
| -                no = se.args[0]
 | 
| -                if no == EINTR:
 | 
| -                    return self.write(datagram, addr)
 | 
| -                elif no == EMSGSIZE:
 | 
| -                    raise error.MessageLengthError, "message too long"
 | 
| -                elif no == ECONNREFUSED:
 | 
| -                    # in non-connected UDP ECONNREFUSED is platform dependent, I think
 | 
| -                    # and the info is not necessarily useful. Nevertheless maybe we
 | 
| -                    # should call connectionRefused? XXX
 | 
| -                    return
 | 
| -                else:
 | 
| -                    raise
 | 
| -
 | 
| -    def writeSequence(self, seq, addr):
 | 
| -        self.write("".join(seq), addr)
 | 
| -
 | 
| -    def connect(self, host, port):
 | 
| -        """'Connect' to remote server."""
 | 
| -        if self._connectedAddr:
 | 
| -            raise RuntimeError, "already connected, reconnecting is not currently supported (talk to itamar if you want this)"
 | 
| -        if not abstract.isIPAddress(host):
 | 
| -            raise ValueError, "please pass only IP addresses, not domain names"
 | 
| -        self._connectedAddr = (host, port)
 | 
| -        self.socket.connect((host, port))
 | 
| -
 | 
| -    def _loseConnection(self):
 | 
| -        self.stopReading()
 | 
| -        if self.connected: # actually means if we are *listening*
 | 
| -            from twisted.internet import reactor
 | 
| -            reactor.callLater(0, self.connectionLost)
 | 
| -
 | 
| -    def stopListening(self):
 | 
| -        if self.connected:
 | 
| -            result = self.d = defer.Deferred()
 | 
| -        else:
 | 
| -            result = None
 | 
| -        self._loseConnection()
 | 
| -        return result
 | 
| -
 | 
| -    def loseConnection(self):
 | 
| -        warnings.warn("Please use stopListening() to disconnect port", DeprecationWarning, stacklevel=2)
 | 
| -        self.stopListening()
 | 
| -
 | 
| -    def connectionLost(self, reason=None):
 | 
| -        """Cleans up my socket.
 | 
| -        """
 | 
| -        log.msg('(Port %s Closed)' % self._realPortNumber)
 | 
| -        self._realPortNumber = None
 | 
| -        base.BasePort.connectionLost(self, reason)
 | 
| -        if hasattr(self, "protocol"):
 | 
| -            # we won't have attribute in ConnectedPort, in cases
 | 
| -            # where there was an error in connection process
 | 
| -            self.protocol.doStop()
 | 
| -        self.connected = 0
 | 
| -        self.socket.close()
 | 
| -        del self.socket
 | 
| -        del self.fileno
 | 
| -        if hasattr(self, "d"):
 | 
| -            self.d.callback(None)
 | 
| -            del self.d
 | 
| -
 | 
| -    def setLogStr(self):
 | 
| -        self.logstr = reflect.qual(self.protocol.__class__) + " (UDP)"
 | 
| -
 | 
| -    def logPrefix(self):
 | 
| -        """Returns the name of my class, to prefix log entries with.
 | 
| -        """
 | 
| -        return self.logstr
 | 
| -
 | 
| -    def getHost(self):
 | 
| -        """
 | 
| -        Returns an IPv4Address.
 | 
| -
 | 
| -        This indicates the address from which I am connecting.
 | 
| -        """
 | 
| -        return address.IPv4Address('UDP', *(self.socket.getsockname() + ('INET_UDP',)))
 | 
| -
 | 
| -
 | 
| -class ConnectedPort(Port):
 | 
| -    """DEPRECATED.
 | 
| -
 | 
| -    A connected UDP socket."""
 | 
| -
 | 
| -    implements(interfaces.IUDPConnectedTransport)
 | 
| -
 | 
| -    def __init__(self, (remotehost, remoteport), port, proto, interface='', maxPacketSize=8192, reactor=None):
 | 
| -        Port.__init__(self, port, proto, interface, maxPacketSize, reactor)
 | 
| -        self.remotehost = remotehost
 | 
| -        self.remoteport = remoteport
 | 
| -
 | 
| -    def startListening(self):
 | 
| -        self._bindSocket()
 | 
| -        if abstract.isIPAddress(self.remotehost):
 | 
| -            self.setRealAddress(self.remotehost)
 | 
| -        else:
 | 
| -            self.realAddress = None
 | 
| -            d = self.reactor.resolve(self.remotehost)
 | 
| -            d.addCallback(self.setRealAddress).addErrback(self.connectionFailed)
 | 
| -
 | 
| -    def setRealAddress(self, addr):
 | 
| -        self.realAddress = addr
 | 
| -        self.socket.connect((addr, self.remoteport))
 | 
| -        self._connectToProtocol()
 | 
| -
 | 
| -    def connectionFailed(self, reason):
 | 
| -        self._loseConnection()
 | 
| -        self.protocol.connectionFailed(reason)
 | 
| -        del self.protocol
 | 
| -
 | 
| -    def doRead(self):
 | 
| -        """Called when my socket is ready for reading."""
 | 
| -        read = 0
 | 
| -        while read < self.maxThroughput:
 | 
| -            try:
 | 
| -                data, addr = self.socket.recvfrom(self.maxPacketSize)
 | 
| -                read += len(data)
 | 
| -                self.protocol.datagramReceived(data)
 | 
| -            except socket.error, se:
 | 
| -                no = se.args[0]
 | 
| -                if no in (EAGAIN, EINTR, EWOULDBLOCK):
 | 
| -                    return
 | 
| -                if (no == ECONNREFUSED) or (platformType == "win32" and no == WSAECONNRESET):
 | 
| -                    self.protocol.connectionRefused()
 | 
| -                else:
 | 
| -                    raise
 | 
| -            except:
 | 
| -                log.deferr()
 | 
| -
 | 
| -    def write(self, data):
 | 
| -        """Write a datagram."""
 | 
| -        try:
 | 
| -            return self.socket.send(data)
 | 
| -        except socket.error, se:
 | 
| -            no = se.args[0]
 | 
| -            if no == EINTR:
 | 
| -                return self.write(data)
 | 
| -            elif no == EMSGSIZE:
 | 
| -                raise error.MessageLengthError, "message too long"
 | 
| -            elif no == ECONNREFUSED:
 | 
| -                self.protocol.connectionRefused()
 | 
| -            else:
 | 
| -                raise
 | 
| -
 | 
| -    def getPeer(self):
 | 
| -        """
 | 
| -        Returns a tuple of ('INET_UDP', hostname, port), indicating
 | 
| -        the remote address.
 | 
| -        """
 | 
| -        return address.IPv4Address('UDP', self.remotehost, self.remoteport, 'INET_UDP')
 | 
| -
 | 
| -
 | 
| -class MulticastMixin:
 | 
| -    """Implement multicast functionality."""
 | 
| -
 | 
| -    def getOutgoingInterface(self):
 | 
| -        i = self.socket.getsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF)
 | 
| -        return socket.inet_ntoa(struct.pack("@i", i))
 | 
| -
 | 
| -    def setOutgoingInterface(self, addr):
 | 
| -        """Returns Deferred of success."""
 | 
| -        return self.reactor.resolve(addr).addCallback(self._setInterface)
 | 
| -
 | 
| -    def _setInterface(self, addr):
 | 
| -        i = socket.inet_aton(addr)
 | 
| -        self.socket.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, i)
 | 
| -        return 1
 | 
| -
 | 
| -    def getLoopbackMode(self):
 | 
| -        return self.socket.getsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP)
 | 
| -
 | 
| -    def setLoopbackMode(self, mode):
 | 
| -        mode = struct.pack("b", operator.truth(mode))
 | 
| -        self.socket.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, mode)
 | 
| -
 | 
| -    def getTTL(self):
 | 
| -        return self.socket.getsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL)
 | 
| -
 | 
| -    def setTTL(self, ttl):
 | 
| -        ttl = struct.pack("B", ttl)
 | 
| -        self.socket.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl)
 | 
| -
 | 
| -    def joinGroup(self, addr, interface=""):
 | 
| -        """Join a multicast group. Returns Deferred of success."""
 | 
| -        return self.reactor.resolve(addr).addCallback(self._joinAddr1, interface, 1)
 | 
| -
 | 
| -    def _joinAddr1(self, addr, interface, join):
 | 
| -        return self.reactor.resolve(interface).addCallback(self._joinAddr2, addr, join)
 | 
| -
 | 
| -    def _joinAddr2(self, interface, addr, join):
 | 
| -        addr = socket.inet_aton(addr)
 | 
| -        interface = socket.inet_aton(interface)
 | 
| -        if join:
 | 
| -            cmd = socket.IP_ADD_MEMBERSHIP
 | 
| -        else:
 | 
| -            cmd = socket.IP_DROP_MEMBERSHIP
 | 
| -        try:
 | 
| -            self.socket.setsockopt(socket.IPPROTO_IP, cmd, addr + interface)
 | 
| -        except socket.error, e:
 | 
| -            return failure.Failure(error.MulticastJoinError(addr, interface, *e.args))
 | 
| -
 | 
| -    def leaveGroup(self, addr, interface=""):
 | 
| -        """Leave multicast group, return Deferred of success."""
 | 
| -        return self.reactor.resolve(addr).addCallback(self._joinAddr1, interface, 0)
 | 
| -
 | 
| -
 | 
| -class MulticastPort(MulticastMixin, Port):
 | 
| -    """UDP Port that supports multicasting."""
 | 
| -
 | 
| -    implements(interfaces.IMulticastTransport)
 | 
| -
 | 
| -    def __init__(self, port, proto, interface='', maxPacketSize=8192, reactor=None, listenMultiple=False):
 | 
| -        Port.__init__(self, port, proto, interface, maxPacketSize, reactor)
 | 
| -        self.listenMultiple = listenMultiple
 | 
| -
 | 
| -    def createInternetSocket(self):
 | 
| -        skt = Port.createInternetSocket(self)
 | 
| -        if self.listenMultiple:
 | 
| -            skt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 | 
| -            if hasattr(socket, "SO_REUSEPORT"):
 | 
| -                skt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
 | 
| -        return skt
 | 
| -
 | 
| -
 | 
| -class ConnectedMulticastPort(MulticastMixin, ConnectedPort):
 | 
| -    """DEPRECATED.
 | 
| -
 | 
| -    Connected UDP Port that supports multicasting."""
 | 
| -
 | 
| -    implements(interfaces.IMulticastTransport)
 | 
| 
 |