home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / lib / hplip / base / msg.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-08-31  |  4.3 KB  |  184 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import sys
  5. import cStringIO
  6. import select
  7. import socket
  8. from g import *
  9. from codes import *
  10. valid_encodings = ('', 'none', 'base64')
  11. valid_char_encodings = ('', 'utf-8', 'latin-1')
  12.  
  13. def buildResultMessage(msg_type, payload = None, result_code = ERROR_SUCCESS, other_fields = { }):
  14.     other_fields.update({
  15.         'result-code': result_code })
  16.     return buildMessage(msg_type, payload, other_fields)
  17.  
  18.  
  19. def buildMessage(msg_type, payload = None, other_fields = { }):
  20.     if msg_type is None or not msg_type:
  21.         raise Error(ERROR_INVALID_MSG_TYPE)
  22.     
  23.     msg = cStringIO.StringIO()
  24.     msg.write('msg=%s\n' % msg_type.lower())
  25.     if other_fields:
  26.         for k in other_fields:
  27.             msg.write('%s=%s\n' % (k, str(other_fields[k])))
  28.         
  29.     
  30.     if payload is not None:
  31.         msg.write('encoding=none\n')
  32.         msg.write('length=%d\n' % len(str(payload)))
  33.         msg.write('data:\n%s' % str(payload))
  34.     
  35.     return msg.getvalue()
  36.  
  37.  
  38. def parseMessage(message):
  39.     (fields, data_found, data, remaining_msg) = ({ }, False, '', '')
  40.     msg_key_found = False
  41.     second_msg_key = False
  42.     
  43.     try:
  44.         msg = cStringIO.StringIO(message)
  45.     except TypeError:
  46.         raise Error(ERROR_INVALID_MSG_TYPE)
  47.  
  48.     while True:
  49.         pos = msg.tell()
  50.         line = msg.readline().strip()
  51.         if line == '':
  52.             break
  53.         
  54.         if line.startswith('data:'):
  55.             if not msg.read(fields['length']):
  56.                 pass
  57.             data = ''
  58.             data_found = True
  59.             continue
  60.         
  61.         if line.startswith('#'):
  62.             continue
  63.         
  64.         
  65.         try:
  66.             (key, value) = line.split('=', 1)
  67.             key = key.strip().lower()
  68.         except ValueError:
  69.             raise Error(ERROR_INVALID_MSG_TYPE)
  70.  
  71.         if key == 'msg':
  72.             if msg_key_found:
  73.                 second_msg_key = True
  74.                 break
  75.             else:
  76.                 msg_key_found = True
  77.         
  78.         
  79.         try:
  80.             fields[key] = int(value)
  81.         continue
  82.         except ValueError:
  83.             fields[key] = value
  84.             continue
  85.         
  86.  
  87.         None<EXCEPTION MATCH>ValueError
  88.     if second_msg_key:
  89.         msg.seek(pos)
  90.         if not msg.read():
  91.             pass
  92.         remaining_msg = ''
  93.     
  94.     return (fields, data, remaining_msg)
  95.  
  96.  
  97. def sendEvent(sock, msg_type, payload = None, other_fields = { }, timeout = prop.read_timeout):
  98.     m = buildMessage(msg_type, payload, other_fields)
  99.     log.debug('Sending data on channel (%d)' % sock.fileno())
  100.     log.debug(repr(m))
  101.     (r, w, e) = select.select([], [
  102.         sock], [], timeout)
  103.     if w == []:
  104.         raise Error(ERROR_INTERNAL)
  105.     
  106.     
  107.     try:
  108.         sock.send(m)
  109.     except socket.error:
  110.         log.exception()
  111.         raise Error(ERROR_INTERNAL)
  112.  
  113.  
  114.  
  115. def xmitMessage(sock, msg_type, payload = None, other_fields = { }, timeout = prop.read_timeout):
  116.     fields = { }
  117.     data = ''
  118.     result_code = ERROR_INTERNAL
  119.     msg_type = msg_type.lower().strip()
  120.     m = buildMessage(msg_type, payload, other_fields)
  121.     log.debug('(xmit) Sending data on channel (%d)' % sock.fileno())
  122.     log.debug(repr(m))
  123.     (r, w, e) = select.select([], [
  124.         sock], [], timeout)
  125.     if w == []:
  126.         raise Error(ERROR_INTERNAL)
  127.     
  128.     
  129.     try:
  130.         sock.send(m)
  131.     except socket.error:
  132.         log.exception()
  133.         raise Error(ERROR_INTERNAL)
  134.  
  135.     read_tries = 0
  136.     read_flag = True
  137.     while read_flag:
  138.         remaining = ''
  139.         read_tries += 1
  140.         if read_tries > 3:
  141.             break
  142.         
  143.         (r, w, e) = select.select([
  144.             sock], [], [], timeout)
  145.         if r == []:
  146.             raise Error(ERROR_INTERNAL)
  147.         
  148.         m = sock.recv(prop.max_message_read)
  149.         if m == '':
  150.             continue
  151.         
  152.         log.debug('(xmit) Reading data on channel (%d)' % sock.fileno())
  153.         while True:
  154.             log.debug(repr(m))
  155.             (fields, data, remaining) = parseMessage(m)
  156.             
  157.             try:
  158.                 result_code = fields['result-code']
  159.             except KeyError:
  160.                 result_code = ERROR_INTERNAL
  161.  
  162.             del fields['result-code']
  163.             
  164.             try:
  165.                 result_msg_type = fields['msg'].lower().strip()
  166.             except KeyError:
  167.                 result_msg_type = ''
  168.  
  169.             del fields['msg']
  170.             if result_msg_type == ''.join([
  171.                 msg_type,
  172.                 'result']) or result_msg_type == 'messageerror':
  173.                 read_flag = False
  174.                 break
  175.             else:
  176.                 log.debug('Ignored out of sequence message')
  177.             if remaining:
  178.                 log.debug('Remaining message')
  179.                 m = remaining
  180.                 continue
  181.             break
  182.     return (fields, data, result_code)
  183.  
  184.