blob: 7e1b3727b22d353dbb6ddf4e0f53bde4bc28b22a [file] [log] [blame]
Guido van Rossum80b0fa01996-06-26 19:52:38 +00001"Socket wrapper for Windows, which does not support dup()."
2
Guido van Rossum80b0fa01996-06-26 19:52:38 +00003# (And hence, fromfd() and makefile() are unimplemented in C....)
4
5# XXX Living dangerously here -- close() is implemented by deleting a
6# reference. Thus we rely on the real _socket module to close on
7# deallocation, and also hope that nobody keeps a reference to our _sock
8# member.
9
10
11
12try:
13 from _socket import *
14except ImportError:
15 from socket import *
16
17_realsocketcall = socket
18
19
20def socket(family, type, proto=0):
21 return _socketobject(_realsocketcall(family, type, proto))
22
23
24class _socketobject:
25
26 def __init__(self, sock):
Guido van Rossum80b0fa01996-06-26 19:52:38 +000027 self._sock = sock
28
29 def close(self):
30 self._sock = None
31
32 def __del__(self):
33 self.close()
34
35 def accept(self):
36 sock, addr = self._sock.accept()
37 return _socketobject(sock), addr
38
39 def dup(self):
40 return _socketobject(self._sock)
41
42 def makefile(self, mode='r', bufsize=-1):
43 return _fileobject(self._sock, mode, bufsize)
44
45 _s = "def %s(self, *args): return apply(self._sock.%s, args)\n\n"
46 for _m in ('bind', 'connect', 'fileno', 'listen',
47 'getpeername', 'getsockname',
48 'getsockopt', 'setsockopt',
49 'recv', 'recvfrom', 'send', 'sendto',
50 'setblocking',
51 'shutdown'):
52 exec _s % (_m, _m)
53
54
55class _fileobject:
56
57 def __init__(self, sock, mode, bufsize):
58 self._sock = sock
59 self._mode = mode
60 if bufsize < 0:
61 bufsize = 512
62 self._rbufsize = max(1, bufsize)
63 self._wbufsize = bufsize
64 self._wbuf = self._rbuf = ""
65
66 def close(self):
67 try:
68 if self._sock:
69 self.flush()
70 finally:
71 self._sock = None
72
73 def __del__(self):
74 self.close()
75
76 def flush(self):
77 if self._wbuf:
78 self._sock.send(self._wbuf)
79 self._wbuf = ""
80
81 def fileno(self):
82 return self._sock.fileno()
83
84 def write(self, data):
85 self._wbuf = self._wbuf + data
86 if self._wbufsize == 1:
87 if '\n' in data:
88 self.flush()
89 else:
90 if len(self._wbuf) >= self._wbufsize:
91 self.flush()
92
93 def writelines(self, list):
94 filter(self._sock.send, list)
95 self.flush()
96
97 def read(self, n=-1):
98 if n >= 0:
99 while len(self._rbuf) < n:
100 new = self._sock.recv(self._rbufsize)
101 if not new: break
102 self._rbuf = self._rbuf + new
103 data, self._rbuf = self._rbuf[:n], self._rbuf[n:]
104 return data
105 while 1:
106 new = self._sock.recv(self._rbufsize)
107 if not new: break
108 self._rbuf = self._rbuf + new
109 data, self._rbuf = self._rbuf, ""
110 return data
111
112 def readline(self):
113 import string
114 data = ""
115 i = string.find(self._rbuf, '\n')
116 while i < 0:
117 new = self._sock.recv(self._rbufsize)
118 if not new: break
119 i = string.find(new, '\n')
120 if i >= 0: i = i + len(self._rbuf)
121 self._rbuf = self._rbuf + new
122 if i < 0: i = len(self._rbuf)
123 else: i = i+1
124 data, self._rbuf = self._rbuf[:i], self._rbuf[i:]
125 return data
126
127 def readlines(self):
128 list = []
129 while 1:
130 line = self.readline()
131 if not line: break
132 list.append(line)
133 return list