home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.4)
-
- '''
- Basic infrastructure for asynchronous socket service clients and servers.
-
- There are only two ways to have a program on a single processor do "more
- than one thing at a time". Multi-threaded programming is the simplest and
- most popular way to do it, but there is another very different technique,
- that lets you have nearly all the advantages of multi-threading, without
- actually using multiple threads. it\'s really only practical if your program
- is largely I/O bound. If your program is CPU bound, then pre-emptive
- scheduled threads are probably what you really need. Network servers are
- rarely CPU-bound, however.
-
- If your operating system supports the select() system call in its I/O
- library (and nearly all do), then you can use it to juggle multiple
- communication channels at once; doing other work while your I/O is taking
- place in the "background." Although this strategy can seem strange and
- complex, especially at first, it is in many ways easier to understand and
- control than multi-threaded programming. The module documented here solves
- many of the difficult problems for you, making the task of building
- sophisticated high-performance network servers and clients a snap.
-
- NOTICE: This copy of asyncore has been modified from the Python Std Lib version.
-
- '''
- import select
- import socket
- import sys
- import time
- import os
- from qt import *
- from g import *
- from errno import EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, ENOTCONN, ESHUTDOWN, EINTR, EISCONN, EAGAIN
-
- class ExitNow(Exception):
- pass
-
- channels = { }
-
- class dispatcher(QObject):
- connected = False
- accepting = False
- closing = False
- addr = None
-
- def __init__(self, sock = None):
- self.sock_write_notifier = None
- self.sock_read_notifier = None
- if sock:
- self.set_socket(sock)
- self.socket.setblocking(0)
- self.connected = True
-
- try:
- self.addr = sock.getpeername()
- except socket.error:
- pass
- except:
- None<EXCEPTION MATCH>socket.error
-
-
- None<EXCEPTION MATCH>socket.error
- self.socket = None
-
-
- def add_channel(self):
- channels[self._fileno] = self
- self.sock_read_notifier = QSocketNotifier(self._fileno, QSocketNotifier.Read)
- QObject.connect(self.sock_read_notifier, SIGNAL('activated(int)'), self.handle_read_event)
- self.sock_read_notifier.setEnabled(True)
- self.sock_write_notifier = QSocketNotifier(self._fileno, QSocketNotifier.Write)
- QObject.connect(self.sock_write_notifier, SIGNAL('activated(int)'), self.handle_write_event)
- self.sock_write_notifier.setEnabled(False)
-
-
- def del_channel(self):
- QObject.disconnect(self.sock_read_notifier, SIGNAL('activated(int)'), self.handle_read_event)
- QObject.disconnect(self.sock_write_notifier, SIGNAL('activated(int)'), self.handle_write_event)
- self.sock_write_notifier.setEnabled(False)
- self.sock_read_notifier.setEnabled(False)
-
- try:
- del channels[self._fileno]
- except KeyError:
- pass
-
- self._fileno = 0
-
-
- def create_socket(self, family, type):
- self.family_and_type = (family, type)
- self.socket = socket.socket(family, type)
- self.socket.setblocking(0)
- self._fileno = self.socket.fileno()
- self.add_channel()
-
-
- def set_socket(self, sock):
- self.socket = sock
- self._fileno = sock.fileno()
- self.add_channel()
-
-
- def set_reuse_addr(self):
-
- try:
- self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) | 1)
- except socket.error:
- pass
-
-
-
- def listen(self, num):
- self.accepting = True
- return self.socket.listen(num)
-
-
- def bind(self, addr):
- self.addr = addr
- return self.socket.bind(addr)
-
-
- def connect(self, address):
- self.connected = False
- err = self.socket.connect_ex(address)
- if err in (EINPROGRESS, EALREADY, EWOULDBLOCK):
- (r, w, e) = select.select([], [
- self.socket.fileno()], [], 5.0)
- err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR)
-
- if err in (0, EISCONN):
- self.addr = address
- self.connected = True
- self.handle_connect()
- else:
- raise socket.error, err
-
-
- def accept(self):
-
- try:
- (conn, addr) = self.socket.accept()
- return (conn, addr)
- except socket.error:
- why = None
- if why[0] == EWOULDBLOCK:
- pass
- else:
- raise socket.error, why
- except:
- why[0] == EWOULDBLOCK
-
-
-
- def send(self, data):
-
- try:
- result = self.socket.send(data)
- except socket.error:
- why = None
- if why[0] == EWOULDBLOCK:
- return 0
- elif why[0] == EAGAIN:
- self.sock_write_notifier.setEnabled(True)
- return 0
- else:
- raise socket.error, why
- except:
- why[0] == EWOULDBLOCK
-
- self.sock_write_notifier.setEnabled(False)
- return result
-
-
- def recv(self, buffer_size):
-
- try:
- data = self.socket.recv(buffer_size)
- if not data:
- self.handle_close()
- return ''
- else:
- return data
- except socket.error:
- why = None
- if why[0] in [
- ECONNRESET,
- ENOTCONN,
- ESHUTDOWN]:
- self.handle_close()
- return ''
- else:
- raise socket.error, why
- except:
- why[0] in [
- ECONNRESET,
- ENOTCONN,
- ESHUTDOWN]
-
-
-
- def close(self):
- self.del_channel()
- self.connected = False
- self.socket.close()
-
-
- def __getattr__(self, attr):
- return getattr(self.socket, attr)
-
-
- def handle_read_event(self):
- if self.accepting:
- if not self.connected:
- self.connected = True
-
- self.handle_accept()
- elif not self.connected:
- self.handle_connect()
- self.connected = True
- self.handle_read()
- else:
- self.handle_read()
-
-
- def handle_write_event(self):
- if not self.connected:
- self.handle_connect()
- self.connected = True
-
- self.handle_write()
-
-
- def handle_expt_event(self):
- self.handle_expt()
-
-
- def handle_error(self):
- self.handle_close()
-
-
- def handle_expt(self):
- raise Error
-
-
- def handle_read(self):
- raise Error
-
-
- def handle_write(self):
- raise Error
-
-
- def handle_connect(self):
- pass
-
-
- def handle_accept(self):
- raise Error
-
-
- def handle_close(self):
- self.close()
-
-
-
- def close_all():
- for x in channels.values():
- x.channels.close()
-
- channels.clear()
-
-