~landscape/zope3/newer-from-ztk

« back to all changes in this revision

Viewing changes to src/twisted/internet/_win32stdio.py

  • Committer: Thomas Hervé
  • Date: 2009-07-08 13:52:04 UTC
  • Revision ID: thomas@canonical.com-20090708135204-df5eesrthifpylf8
Remove twisted copy

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# -*- test-case-name: twisted.test.test_process.ProcessTestCase.testStdio -*-
2
 
 
3
 
import win32api
4
 
import os, msvcrt
5
 
 
6
 
from zope.interface import implements
7
 
 
8
 
from twisted.internet.interfaces import IHalfCloseableProtocol, ITransport, IAddress
9
 
from twisted.internet.interfaces import IConsumer, IPushProducer
10
 
 
11
 
from twisted.internet import _pollingfile, main
12
 
 
13
 
class Win32PipeAddress(object):
14
 
    implements(IAddress)
15
 
 
16
 
class StandardIO(_pollingfile._PollingTimer):
17
 
 
18
 
    implements(ITransport,
19
 
               IConsumer,
20
 
               IPushProducer)
21
 
 
22
 
    disconnecting = False
23
 
    disconnected = False
24
 
 
25
 
    def __init__(self, proto):
26
 
        """
27
 
        Start talking to standard IO with the given protocol.
28
 
 
29
 
        Also, put it stdin/stdout/stderr into binary mode.
30
 
        """
31
 
        from twisted.internet import reactor
32
 
 
33
 
        for stdfd in range(0, 1, 2):
34
 
            msvcrt.setmode(stdfd, os.O_BINARY)
35
 
 
36
 
        _pollingfile._PollingTimer.__init__(self, reactor)
37
 
        self.proto = proto
38
 
 
39
 
        hstdin = win32api.GetStdHandle(win32api.STD_INPUT_HANDLE)
40
 
        hstdout = win32api.GetStdHandle(win32api.STD_OUTPUT_HANDLE)
41
 
 
42
 
        self.stdin = _pollingfile._PollableReadPipe(
43
 
            hstdin, self.dataReceived, self.readConnectionLost)
44
 
 
45
 
        self.stdout = _pollingfile._PollableWritePipe(
46
 
            hstdout, self.writeConnectionLost)
47
 
 
48
 
        self._addPollableResource(self.stdin)
49
 
        self._addPollableResource(self.stdout)
50
 
 
51
 
        self.proto.makeConnection(self)
52
 
 
53
 
    def dataReceived(self, data):
54
 
        self.proto.dataReceived(data)
55
 
 
56
 
    def readConnectionLost(self):
57
 
        if IHalfCloseableProtocol.providedBy(self.proto):
58
 
            self.proto.readConnectionLost()
59
 
        self.checkConnLost()
60
 
 
61
 
    def writeConnectionLost(self):
62
 
        if IHalfCloseableProtocol.providedBy(self.proto):
63
 
            self.proto.writeConnectionLost()
64
 
        self.checkConnLost()
65
 
 
66
 
    connsLost = 0
67
 
 
68
 
    def checkConnLost(self):
69
 
        self.connsLost += 1
70
 
        if self.connsLost >= 2:
71
 
            self.disconnecting = True
72
 
            self.disconnected = True
73
 
            self.proto.connectionLost(main.CONNECTION_DONE)
74
 
 
75
 
    # ITransport
76
 
 
77
 
    def write(self, data):
78
 
        self.stdout.write(data)
79
 
 
80
 
    def writeSequence(self, seq):
81
 
        self.stdout.write(''.join(seq))
82
 
 
83
 
    def loseConnection(self):
84
 
        self.disconnecting = True
85
 
        self.stdin.close()
86
 
        self.stdout.close()
87
 
 
88
 
    def getPeer(self):
89
 
        return Win32PipeAddress()
90
 
 
91
 
    def getHost(self):
92
 
        return Win32PipeAddress()
93
 
 
94
 
    # IConsumer
95
 
 
96
 
    def registerProducer(self, producer, streaming):
97
 
        return self.stdout.registerProducer(producer, streaming)
98
 
 
99
 
    def unregisterProducer(self):
100
 
        return self.stdout.unregisterProducer()
101
 
 
102
 
    # def write() above
103
 
 
104
 
    # IProducer
105
 
 
106
 
    def stopProducing(self):
107
 
        self.stdin.stopProducing()
108
 
 
109
 
    # IPushProducer
110
 
 
111
 
    def pauseProducing(self):
112
 
        self.stdin.pauseProducing()
113
 
 
114
 
    def resumeProducing(self):
115
 
        self.stdin.resumeProducing()
116