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