PHP 8.5.2
Preview: _posixstdio.py Size: 4.88 KB
//lib/python3/dist-packages/twisted/internet/_posixstdio.py

# -*- test-case-name: twisted.test.test_stdio -*-

"""Standard input/out/err support.

Future Plans::

    support for stderr, perhaps
    Rewrite to use the reactor instead of an ad-hoc mechanism for connecting
        protocols to transport.

Maintainer: James Y Knight
"""

from zope.interface import implementer

from twisted.internet import error, interfaces, process
from twisted.python import failure, log


@implementer(interfaces.IAddress)
class PipeAddress:
    pass


@implementer(
    interfaces.ITransport,
    interfaces.IProducer,
    interfaces.IConsumer,
    interfaces.IHalfCloseableDescriptor,
)
class StandardIO:
    _reader = None
    _writer = None
    disconnected = False
    disconnecting = False

    def __init__(self, proto, stdin=0, stdout=1, reactor=None):
        if reactor is None:
            from twisted.internet import reactor
        self.protocol = proto

        self._writer = process.ProcessWriter(reactor, self, "write", stdout)
        self._reader = process.ProcessReader(reactor, self, "read", stdin)
        self._reader.startReading()
        self.protocol.makeConnection(self)

    # ITransport

    # XXX Actually, see #3597.
    def loseWriteConnection(self):
        if self._writer is not None:
            self._writer.loseConnection()

    def write(self, data):
        if self._writer is not None:
            self._writer.write(data)

    def writeSequence(self, data):
        if self._writer is not None:
            self._writer.writeSequence(data)

    def loseConnection(self):
        self.disconnecting = True

        if self._writer is not None:
            self._writer.loseConnection()
        if self._reader is not None:
            # Don't loseConnection, because we don't want to SIGPIPE it.
            self._reader.stopReading()

    def getPeer(self):
        return PipeAddress()

    def getHost(self):
        return PipeAddress()

    # Callbacks from process.ProcessReader/ProcessWriter
    def childDataReceived(self, fd, data):
        self.protocol.dataReceived(data)

    def childConnectionLost(self, fd, reason):
        if self.disconnected:
            return

        if reason.value.__class__ == error.ConnectionDone:
            # Normal close
            if fd == "read":
                self._readConnectionLost(reason)
            else:
                self._writeConnectionLost(reason)
        else:
            self.connectionLost(reason)

    def connectionLost(self, reason):
        self.disconnected = True

        # Make sure to cleanup the other half
        _reader = self._reader
        _writer = self._writer
        protocol = self.protocol
        self._reader = self._writer = None
        self.protocol = None

        if _writer is not None and not _writer.disconnected:
            _writer.connectionLost(reason)

        if _reader is not None and not _reader.disconnected:
            _reader.connectionLost(reason)

        try:
            protocol.connectionLost(reason)
        except BaseException:
            log.err()

    def _writeConnectionLost(self, reason):
        self._writer = None
        if self.disconnecting:
            self.connectionLost(reason)
            return

        p = interfaces.IHalfCloseableProtocol(self.protocol, None)
        if p:
            try:
                p.writeConnectionLost()
            except BaseException:
                log.err()
                self.connectionLost(failure.Failure())

    def _readConnectionLost(self, reason):
        self._reader = None
        p = interfaces.IHalfCloseableProtocol(self.protocol, None)
        if p:
            try:
                p.readConnectionLost()
            except BaseException:
                log.err()
                self.connectionLost(failure.Failure())
        else:
            self.connectionLost(reason)

    # IConsumer
    def registerProducer(self, producer, streaming):
        if self._writer is None:
            producer.stopProducing()
        else:
            self._writer.registerProducer(producer, streaming)

    def unregisterProducer(self):
        if self._writer is not None:
            self._writer.unregisterProducer()

    # IProducer
    def stopProducing(self):
        self.loseConnection()

    def pauseProducing(self):
        if self._reader is not None:
            self._reader.pauseProducing()

    def resumeProducing(self):
        if self._reader is not None:
            self._reader.resumeProducing()

    def stopReading(self):
        """Compatibility only, don't use. Call pauseProducing."""
        self.pauseProducing()

    def startReading(self):
        """Compatibility only, don't use. Call resumeProducing."""
        self.resumeProducing()

    def readConnectionLost(self, reason):
        # L{IHalfCloseableDescriptor.readConnectionLost}
        raise NotImplementedError()

    def writeConnectionLost(self, reason):
        # L{IHalfCloseableDescriptor.writeConnectionLost}
        raise NotImplementedError()

Directory Contents

Dirs: 3 × Files: 57

Name Size Perms Modified Actions
- drwxr-xr-x 2026-01-08 12:56:22
Edit Download
test DIR
- drwxr-xr-x 2026-01-08 12:56:22
Edit Download
- drwxr-xr-x 2026-01-08 12:56:23
Edit Download
18.84 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
5.14 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
10.87 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
46.82 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
22.75 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
1.85 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
95.88 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
76.59 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
8.73 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
13.14 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
3.16 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
3.42 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
1.24 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
3.55 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
512 B lrw-r--r-- 2024-08-27 10:30:39
Edit Download
14.06 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
95.89 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
10.56 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
1006 B lrw-r--r-- 2024-08-27 10:30:39
Edit Download
5.83 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
20.88 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
43.14 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
26.93 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
853 B lrw-r--r-- 2024-08-27 10:30:39
Edit Download
1.77 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
5.96 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
2.20 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
8.47 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
1006 B lrw-r--r-- 2024-08-27 10:30:39
Edit Download
32.90 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
53.97 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
29.12 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
4.13 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
1.92 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
18.18 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
21.98 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
8.48 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
14.84 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
5.15 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
1.27 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
1.96 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
743 B lrw-r--r-- 2024-08-27 10:30:39
Edit Download
12.29 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
12.61 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
1.39 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
8.97 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
8.49 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
1.99 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
4.88 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
3.82 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
9.46 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
14.06 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
70.68 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
11.31 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
4.69 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
3.04 KB lrw-r--r-- 2024-08-27 10:30:39
Edit Download
521 B lrw-r--r-- 2024-08-27 10:30:39
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).