| 
									
										
										
										
											1996-06-26 19:52:38 +00:00
										 |  |  | "Socket wrapper for Windows, which does not support dup()." | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # (And hence, fromfd() and makefile() are unimplemented in C....) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # XXX Living dangerously here -- close() is implemented by deleting a | 
					
						
							|  |  |  | # reference.  Thus we rely on the real _socket module to close on | 
					
						
							|  |  |  | # deallocation, and also hope that nobody keeps a reference to our _sock | 
					
						
							|  |  |  | # member. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							| 
									
										
										
										
											1998-03-26 20:22:30 +00:00
										 |  |  | 	from _socket import * | 
					
						
							| 
									
										
										
										
											1996-06-26 19:52:38 +00:00
										 |  |  | except ImportError: | 
					
						
							| 
									
										
										
										
											1998-03-26 20:22:30 +00:00
										 |  |  | 	from socket import * | 
					
						
							| 
									
										
										
										
											1996-06-26 19:52:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | _realsocketcall = socket | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def socket(family, type, proto=0): | 
					
						
							| 
									
										
										
										
											1998-03-26 20:22:30 +00:00
										 |  |  | 	return _socketobject(_realsocketcall(family, type, proto)) | 
					
						
							| 
									
										
										
										
											1996-06-26 19:52:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _socketobject: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-26 20:22:30 +00:00
										 |  |  | 	def __init__(self, sock): | 
					
						
							|  |  |  | 		self._sock = sock | 
					
						
							| 
									
										
										
										
											1996-06-26 19:52:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-26 20:22:30 +00:00
										 |  |  | 	def close(self): | 
					
						
							|  |  |  | 		self._sock = 0 | 
					
						
							| 
									
										
										
										
											1996-06-26 19:52:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-26 20:22:30 +00:00
										 |  |  | 	def __del__(self): | 
					
						
							|  |  |  | 		self.close() | 
					
						
							| 
									
										
										
										
											1996-06-26 19:52:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-26 20:22:30 +00:00
										 |  |  | 	def accept(self): | 
					
						
							|  |  |  | 		sock, addr = self._sock.accept() | 
					
						
							|  |  |  | 		return _socketobject(sock), addr | 
					
						
							| 
									
										
										
										
											1996-06-26 19:52:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-26 20:22:30 +00:00
										 |  |  | 	def dup(self): | 
					
						
							|  |  |  | 		return _socketobject(self._sock) | 
					
						
							| 
									
										
										
										
											1996-06-26 19:52:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-26 20:22:30 +00:00
										 |  |  | 	def makefile(self, mode='r', bufsize=-1): | 
					
						
							|  |  |  | 		return _fileobject(self._sock, mode, bufsize) | 
					
						
							| 
									
										
										
										
											1996-06-26 19:52:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-26 20:22:30 +00:00
										 |  |  | 	_s = "def %s(self, *args): return apply(self._sock.%s, args)\n\n" | 
					
						
							|  |  |  | 	for _m in ('bind', 'connect', 'fileno', 'listen', | 
					
						
							|  |  |  | 		   'getpeername', 'getsockname', | 
					
						
							|  |  |  | 		   'getsockopt', 'setsockopt', | 
					
						
							|  |  |  | 		   'recv', 'recvfrom', 'send', 'sendto', | 
					
						
							|  |  |  | 		   'setblocking', | 
					
						
							|  |  |  | 		   'shutdown'): | 
					
						
							|  |  |  | 		exec _s % (_m, _m) | 
					
						
							| 
									
										
										
										
											1996-06-26 19:52:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _fileobject: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-26 20:22:30 +00:00
										 |  |  | 	def __init__(self, sock, mode, bufsize): | 
					
						
							|  |  |  | 		self._sock = sock | 
					
						
							|  |  |  | 		self._mode = mode | 
					
						
							|  |  |  | 		if bufsize < 0: | 
					
						
							|  |  |  | 			bufsize = 512 | 
					
						
							|  |  |  | 		self._rbufsize = max(1, bufsize) | 
					
						
							|  |  |  | 		self._wbufsize = bufsize | 
					
						
							|  |  |  | 		self._wbuf = self._rbuf = "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def close(self): | 
					
						
							|  |  |  | 		try: | 
					
						
							|  |  |  | 			if self._sock: | 
					
						
							|  |  |  | 				self.flush() | 
					
						
							|  |  |  | 		finally: | 
					
						
							|  |  |  | 			self._sock = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def __del__(self): | 
					
						
							|  |  |  | 		self.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def flush(self): | 
					
						
							|  |  |  | 		if self._wbuf: | 
					
						
							|  |  |  | 			self._sock.send(self._wbuf) | 
					
						
							|  |  |  | 			self._wbuf = "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def fileno(self): | 
					
						
							|  |  |  | 		return self._sock.fileno() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def write(self, data): | 
					
						
							|  |  |  | 		self._wbuf = self._wbuf + data | 
					
						
							|  |  |  | 		if self._wbufsize == 1: | 
					
						
							|  |  |  | 			if '\n' in data: | 
					
						
							|  |  |  | 				self.flush() | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			if len(self._wbuf) >= self._wbufsize: | 
					
						
							|  |  |  | 				self.flush() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def writelines(self, list): | 
					
						
							|  |  |  | 		filter(self._sock.send, list) | 
					
						
							| 
									
										
										
										
											1996-06-26 19:52:38 +00:00
										 |  |  | 		self.flush() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-26 20:22:30 +00:00
										 |  |  | 	def read(self, n=-1): | 
					
						
							|  |  |  | 		if n >= 0: | 
					
						
							|  |  |  | 			while len(self._rbuf) < n: | 
					
						
							|  |  |  | 				new = self._sock.recv(self._rbufsize) | 
					
						
							|  |  |  | 				if not new: break | 
					
						
							|  |  |  | 				self._rbuf = self._rbuf + new | 
					
						
							|  |  |  | 			data, self._rbuf = self._rbuf[:n], self._rbuf[n:] | 
					
						
							|  |  |  | 			return data | 
					
						
							|  |  |  | 		while 1: | 
					
						
							|  |  |  | 			new = self._sock.recv(self._rbufsize) | 
					
						
							|  |  |  | 			if not new: break | 
					
						
							|  |  |  | 			self._rbuf = self._rbuf + new | 
					
						
							|  |  |  | 		data, self._rbuf = self._rbuf, "" | 
					
						
							|  |  |  | 		return data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def readline(self): | 
					
						
							|  |  |  | 		import string | 
					
						
							|  |  |  | 		data = "" | 
					
						
							|  |  |  | 		i = string.find(self._rbuf, '\n') | 
					
						
							|  |  |  | 		while i < 0: | 
					
						
							|  |  |  | 			new = self._sock.recv(self._rbufsize) | 
					
						
							|  |  |  | 			if not new: break | 
					
						
							|  |  |  | 			i = string.find(new, '\n') | 
					
						
							|  |  |  | 			if i >= 0: i = i + len(self._rbuf) | 
					
						
							|  |  |  | 			self._rbuf = self._rbuf + new | 
					
						
							|  |  |  | 		if i < 0: i = len(self._rbuf) | 
					
						
							|  |  |  | 		else: i = i+1 | 
					
						
							|  |  |  | 		data, self._rbuf = self._rbuf[:i], self._rbuf[i:] | 
					
						
							|  |  |  | 		return data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def readlines(self): | 
					
						
							|  |  |  | 		list = [] | 
					
						
							|  |  |  | 		while 1: | 
					
						
							|  |  |  | 			line = self.readline() | 
					
						
							|  |  |  | 			if not line: break | 
					
						
							|  |  |  | 			list.append(line) | 
					
						
							|  |  |  | 		return list |