OLD | NEW |
| (Empty) |
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, IAdd
ress | |
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 | |
OLD | NEW |