]> granicus.if.org Git - python/commitdiff
socket wrapper module around _socket for all Window platforms
authorGuido van Rossum <guido@python.org>
Wed, 26 Jun 1996 19:52:38 +0000 (19:52 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 26 Jun 1996 19:52:38 +0000 (19:52 +0000)
Lib/plat-win/socket.py [new file with mode: 0755]
Lib/win/socket.py [new file with mode: 0755]

diff --git a/Lib/plat-win/socket.py b/Lib/plat-win/socket.py
new file mode 100755 (executable)
index 0000000..ec016f4
--- /dev/null
@@ -0,0 +1,136 @@
+"Socket wrapper for Windows, which does not support dup()."
+
+print "new socket.py loading"
+
+# (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:
+    from _socket import *
+except ImportError:
+    from socket import *
+
+_realsocketcall = socket
+
+
+def socket(family, type, proto=0):
+    return _socketobject(_realsocketcall(family, type, proto))
+
+
+class _socketobject:
+
+    def __init__(self, sock):
+       print "creating _socketobject", sock
+       self._sock = sock
+
+    def close(self):
+       self._sock = None
+
+    def __del__(self):
+       self.close()
+
+    def accept(self):
+       sock, addr = self._sock.accept()
+       return _socketobject(sock), addr
+
+    def dup(self):
+       return _socketobject(self._sock)
+
+    def makefile(self, mode='r', bufsize=-1):
+       return _fileobject(self._sock, mode, bufsize)
+
+    _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)
+
+
+class _fileobject:
+
+    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 = None
+
+    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)
+       self.flush()
+
+    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
diff --git a/Lib/win/socket.py b/Lib/win/socket.py
new file mode 100755 (executable)
index 0000000..ec016f4
--- /dev/null
@@ -0,0 +1,136 @@
+"Socket wrapper for Windows, which does not support dup()."
+
+print "new socket.py loading"
+
+# (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:
+    from _socket import *
+except ImportError:
+    from socket import *
+
+_realsocketcall = socket
+
+
+def socket(family, type, proto=0):
+    return _socketobject(_realsocketcall(family, type, proto))
+
+
+class _socketobject:
+
+    def __init__(self, sock):
+       print "creating _socketobject", sock
+       self._sock = sock
+
+    def close(self):
+       self._sock = None
+
+    def __del__(self):
+       self.close()
+
+    def accept(self):
+       sock, addr = self._sock.accept()
+       return _socketobject(sock), addr
+
+    def dup(self):
+       return _socketobject(self._sock)
+
+    def makefile(self, mode='r', bufsize=-1):
+       return _fileobject(self._sock, mode, bufsize)
+
+    _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)
+
+
+class _fileobject:
+
+    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 = None
+
+    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)
+       self.flush()
+
+    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