home *** CD-ROM | disk | FTP | other *** search
/ Enter 2004 April / enter-2004-04.iso / files / EVE_1424_100181.exe / socket.py < prev    next >
Encoding:
Python Source  |  2004-04-20  |  5.2 KB  |  193 lines

  1. ##########################################################################################
  2. ## ///////////////////////////////////////////////////////////////////////////////////////
  3. ## //
  4. ## //   socket.py
  5. ## //
  6. ## //   Authors:   Matthφas ┴sgeirsson
  7. ## //   Created:   August 2002
  8. ## //   Project:   EVE
  9. ## //
  10. ## //   Description:
  11. ## //
  12. ## //   A wrapper to give NetClient.RawSocket the same (for most part)
  13. ## //   interface as the standard python socket class
  14. ## //   to be implemented as needed
  15. ## //
  16. ## //   Dependencies:
  17. ## //
  18. ## //   PyAIO or NetClient
  19. ## //
  20. ## //
  21. ## //   (c) CCP 2002
  22. ## //
  23. ## //
  24.  
  25.  
  26. import blue
  27.  
  28. socketType = ""
  29.  
  30. if boot.role == "client":
  31.     Import("NetClient")
  32.     socketType = "NetClient.AsyncSocket"
  33. else:
  34.     Import("PyAIO")
  35.     socketType = "PyAIO.Socket"
  36.  
  37.  
  38. # put in commonly used constants, just give them some values
  39. # since they will be ignored.
  40. AF_INET = 1
  41. SOCK_STREAM = 2
  42.  
  43. import net
  44. import sys
  45.  
  46. error = net.SocketClosed
  47.  
  48. LINE_DELIMETER = "\r\n"
  49.  
  50.  
  51.  
  52. #
  53. # Utility functions, implemented as needed
  54. #
  55. def getaddrinfo(host, port, something, stream):
  56.     return [[AF_INET, SOCK_STREAM, 0, 0, (host,port)]]
  57.  
  58. def getfqdn(name = None):
  59.     if name != None:
  60.         raise "not implemented"
  61.     if boot.role == "client":
  62.         return NetClient.DNS().GetLocalHostname()
  63.     else:
  64.         return NetUtil.Util().GetLocalHostname()
  65.  
  66.  
  67. def gethostbyname(hostname):
  68.     if boot.role == "client":
  69.         return NetClient.DNS().LookupHostname(hostname)
  70.     else:
  71.         return NetUtil.Util().LookupHostname(hostname)
  72.  
  73. #  FileWrap
  74. #  A wrapper which implements a file like interface, returned by
  75. #  the makefile method in socket
  76. class FileWrap:
  77.     def __init__(self, s):
  78.         self.socket = s
  79.         self.buff   = ""
  80.  
  81.     def readline(self):
  82.         try:
  83.             while self.buff.find(LINE_DELIMETER) == -1:
  84.                 self.buff = self.buff + self.socket.recv()
  85.  
  86.             i = self.buff.find(LINE_DELIMETER)
  87.             result = self.buff[:i]
  88.             self.buff = self.buff[i+2:]
  89.             return result
  90.         except:
  91.             return self.buff
  92.  
  93.     def readlines(self, num):
  94.         ##print "FileWrap.readlines"
  95.         # just ignore num and read all lines
  96.         result = []
  97.         try:
  98.             while 1:
  99.                 result.append(self.readline())
  100.         except socket.error, e:
  101.             pass
  102.         return result
  103.  
  104.     def read(self, bytes = sys.maxint):
  105.         # there is a reason for this implementation
  106.         # if the default value of bytes is used data
  107.         # will be read from the connection until the connection
  108.         # is closed.  This is the only way to read from a HTTP/1.0
  109.         # connection with the standard libraries.
  110.         # The code I removed broke existing code.  What code I don't know.
  111.         # If it was your code, just let me know and we might be able
  112.         # to find a solution which does not break existing code
  113.         try:
  114.             while len(self.buff) < bytes:
  115.                 self.buff += self.socket.recv()
  116.         except:
  117.             ret = self.buff
  118.             self.buff = ""
  119.             return ret
  120.  
  121.         result = ""
  122.         if len(self.buff) <= bytes:
  123.             result = self.buff
  124.             self.buff = ""
  125.         else:
  126.             result = self.buff[:bytes]
  127.             self.buff = self.buff[bytes:]
  128.         return result
  129.  
  130.  
  131.     def close(self):
  132.         self.socket.close()
  133.         self.socket = None
  134.  
  135. class socket:
  136.     def __init__(self, family_type = 0, stream = 0, notused = 0):
  137.         global socketType
  138.         self.ep = blue.os.CreateInstance(socketType)
  139.         self.closed = 0     # this variable is only used to prevent close from being called     
  140.                             # twice since that crashes the client when using httplib
  141.  
  142.     def connect(self, (addr, port)):
  143.         self.ep.Connect(addr,port)
  144.  
  145.  
  146.     def getpeername(self):
  147.         return self.clientHostname
  148.  
  149.  
  150.     def send(self, buffer, flags = 0):
  151.         self.ep.Write(buffer)
  152.  
  153.     def sendall(self, buffer, flags = 0):
  154.         self.ep.Write(buffer)
  155.  
  156.     def recv(self, size = 0, flags = 0):
  157.         return self.ep.Read()
  158.  
  159.     def shutdown(self, how):
  160.         self.ep.Shutdown()
  161.  
  162.     def close(self):
  163.         if self.closed:
  164.             return
  165.         try:
  166.             self.ep.Close()
  167.         except:
  168.             pass
  169.         self.closed = 1
  170.  
  171.     def makefile(self, mode, bufsize=0):
  172.         return FileWrap(self)
  173.  
  174.     # unipmlemented methods... implement as needed
  175.     # (or change code which uses it)
  176.     def libd(self, addr):
  177.         raise AttributeError("libd is not implemented in lib\socket")
  178.  
  179.     def accept(self):
  180.         raise AttributeError("accept is not implemented in lib\socket")
  181.  
  182.     def getsockname(self):
  183.         raise AttributeError("getsockname is not implemented in lib\socket")
  184.  
  185.     def fileno():
  186.         raise AttributeError("fileno is not implemented in lib\socket")
  187.  
  188.     def setblocking(self, flag):
  189.         raise AttributeError("setblocking is not implemented in lib\socket")
  190.  
  191.     def setsockopt(self, optname, value):
  192.         raise AttributeError("setsockopt is not implemented in lib\socket")
  193.