home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / hplip / base / status.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  29.0 KB  |  1,150 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. from __future__ import division
  5. import struct
  6. import cStringIO
  7. import xml.parsers.expat as expat
  8. import re
  9. from g import *
  10. from codes import *
  11. import pml
  12. import utils
  13. STATUS_REV_00 = 0
  14. STATUS_REV_01 = 1
  15. STATUS_REV_02 = 2
  16. STATUS_REV_03 = 3
  17. STATUS_REV_04 = 4
  18. STATUS_REV_V = 255
  19. STATUS_REV_UNKNOWN = 254
  20. vstatus_xlate = {
  21.     'busy': STATUS_PRINTER_BUSY,
  22.     'idle': STATUS_PRINTER_IDLE,
  23.     'prnt': STATUS_PRINTER_PRINTING,
  24.     'offf': STATUS_PRINTER_TURNING_OFF,
  25.     'rprt': STATUS_PRINTER_REPORT_PRINTING,
  26.     'cncl': STATUS_PRINTER_CANCELING,
  27.     'iost': STATUS_PRINTER_IO_STALL,
  28.     'dryw': STATUS_PRINTER_DRY_WAIT_TIME,
  29.     'penc': STATUS_PRINTER_PEN_CHANGE,
  30.     'oopa': STATUS_PRINTER_OUT_OF_PAPER,
  31.     'bnej': STATUS_PRINTER_BANNER_EJECT,
  32.     'bnmz': STATUS_PRINTER_BANNER_MISMATCH,
  33.     'phmz': STATUS_PRINTER_PHOTO_MISMATCH,
  34.     'dpmz': STATUS_PRINTER_DUPLEX_MISMATCH,
  35.     'pajm': STATUS_PRINTER_MEDIA_JAM,
  36.     'cars': STATUS_PRINTER_CARRIAGE_STALL,
  37.     'paps': STATUS_PRINTER_PAPER_STALL,
  38.     'penf': STATUS_PRINTER_PEN_FAILURE,
  39.     'erro': STATUS_PRINTER_HARD_ERROR,
  40.     'pwdn': STATUS_PRINTER_POWER_DOWN,
  41.     'fpts': STATUS_PRINTER_FRONT_PANEL_TEST,
  42.     'clno': STATUS_PRINTER_CLEAN_OUT_TRAY_MISSING }
  43. REVISION_2_TYPE_MAP = {
  44.     0: AGENT_TYPE_NONE,
  45.     1: AGENT_TYPE_BLACK,
  46.     2: AGENT_TYPE_CYAN,
  47.     3: AGENT_TYPE_MAGENTA,
  48.     4: AGENT_TYPE_YELLOW,
  49.     5: AGENT_TYPE_BLACK,
  50.     6: AGENT_TYPE_CYAN,
  51.     7: AGENT_TYPE_MAGENTA,
  52.     8: AGENT_TYPE_YELLOW }
  53. STATUS_BLOCK_UNKNOWN = {
  54.     'revision': STATUS_REV_UNKNOWN,
  55.     'agents': [],
  56.     'status-code': STATUS_UNKNOWN }
  57. NUM_PEN_POS = {
  58.     STATUS_REV_00: 16,
  59.     STATUS_REV_01: 16,
  60.     STATUS_REV_02: 16,
  61.     STATUS_REV_03: 18,
  62.     STATUS_REV_04: 22 }
  63. PEN_DATA_SIZE = {
  64.     STATUS_REV_00: 8,
  65.     STATUS_REV_01: 8,
  66.     STATUS_REV_02: 4,
  67.     STATUS_REV_03: 8,
  68.     STATUS_REV_04: 8 }
  69. STATUS_POS = {
  70.     STATUS_REV_00: 14,
  71.     STATUS_REV_01: 14,
  72.     STATUS_REV_02: 14,
  73.     STATUS_REV_03: 16,
  74.     STATUS_REV_04: 20 }
  75.  
  76. def parseSStatus(s, z = ''):
  77.     Z_SIZE = 6
  78.     z1 = []
  79.     if len(z) > 0:
  80.         z_fields = z.split(',')
  81.         for z_field in z_fields:
  82.             if len(z_field) > 2 and z_field[:2] == '05':
  83.                 z1s = z_field[2:]
  84.                 z1 = [ int(x, 16) for x in z1s ]
  85.                 continue
  86.             []
  87.         
  88.     
  89.     s1 = [ int(x, 16) for x in s ]
  90.     revision = s1[1]
  91.     if revision <= revision:
  92.         pass
  93.     elif not revision <= STATUS_REV_04:
  94.         raise AssertionError
  95.     []
  96.     top_door = bool(s1[2] & 0x8L) + s1[2] & 0x1L
  97.     supply_door = bool(s1[3] & 0x8L) + s1[3] & 0x1L
  98.     duplexer = bool(s1[4] & 0xCL) + s1[4] & 0x1L
  99.     photo_tray = bool(s1[5] & 0x8L) + s1[5] & 0x1L
  100.     if revision == STATUS_REV_02:
  101.         in_tray1 = bool(s1[6] & 0x8L) + s1[6] & 0x1L
  102.         in_tray2 = bool(s1[7] & 0x8L) + s1[7] & 0x1L
  103.     else:
  104.         in_tray1 = bool(s1[6] & 0x8L)
  105.         in_tray2 = bool(s1[7] & 0x8L)
  106.     media_path = bool(s1[8] & 0x8L) + (s1[8] & 0x1L) + (bool(s1[18] & 0x2L) << 1)
  107.     status_pos = STATUS_POS[revision]
  108.     status_byte = (s1[status_pos] << 4) + s1[status_pos + 1]
  109.     stat = status_byte + STATUS_PRINTER_BASE
  110.     (pens, pen, c, d) = ([], { }, NUM_PEN_POS[revision] + 1, 0)
  111.     num_pens = s1[NUM_PEN_POS[revision]]
  112.     log.debug('Num pens=%d' % num_pens)
  113.     index = 0
  114.     pen_data_size = PEN_DATA_SIZE[revision]
  115.     for p in range(num_pens):
  116.         info = long(s[c:c + pen_data_size], 16)
  117.         pen['index'] = index
  118.         if pen_data_size == 4:
  119.             pen['type'] = REVISION_2_TYPE_MAP.get(int((info & 0xF000L) >> 0xCL), 0)
  120.             if index < num_pens / 2:
  121.                 pen['kind'] = AGENT_KIND_HEAD
  122.             else:
  123.                 pen['kind'] = AGENT_KIND_SUPPLY
  124.             pen['level-trigger'] = int((info & 0xE00L) >> 0x9L)
  125.             pen['health'] = int((info & 0x180L) >> 0x7L)
  126.             pen['level'] = int(info & 0x7FL)
  127.             pen['id'] = 31
  128.         elif pen_data_size == 8:
  129.             pen['kind'] = bool(info & 0x80000000L) + (bool(info & 0x40000000L) << 0x1L)
  130.             pen['type'] = int((info & 0x3F000000L) >> 0x18L)
  131.             pen['id'] = int((info & 16252928) >> 0x13L)
  132.             pen['level-trigger'] = int((info & 0x70000L) >> 0x10L)
  133.             pen['health'] = int((info & 0xC000L) >> 0xEL)
  134.             pen['level'] = int(info & 0xFFL)
  135.         else:
  136.             log.error('Pen data size error')
  137.         if len(z1) > 0:
  138.             
  139.             try:
  140.                 pen['dvc'] = long(z1s[d + 1:d + 5], 16)
  141.                 pen['virgin'] = bool(z1[d + 5] & 0x8L)
  142.                 pen['hp-ink'] = bool(z1[d + 5] & 0x4L)
  143.                 pen['known'] = bool(z1[d + 5] & 0x2L)
  144.                 pen['ack'] = bool(z1[d + 5] & 0x1L)
  145.             except IndexError:
  146.                 pen['dvc'] = 0
  147.                 pen['virgin'] = 0
  148.                 pen['hp-ink'] = 0
  149.                 pen['known'] = 0
  150.                 pen['ack'] = 0
  151.             except:
  152.                 None<EXCEPTION MATCH>IndexError
  153.             
  154.  
  155.         None<EXCEPTION MATCH>IndexError
  156.         index += 1
  157.         pens.append(pen)
  158.         pen = { }
  159.         c += pen_data_size
  160.         d += Z_SIZE
  161.     
  162.     return {
  163.         'revision': revision,
  164.         'agents': pens,
  165.         'top-door': top_door,
  166.         'status-code': stat,
  167.         'supply-door': supply_door,
  168.         'duplexer': duplexer,
  169.         'photo-tray': photo_tray,
  170.         'in-tray1': in_tray1,
  171.         'in-tray2': in_tray2,
  172.         'media-path': media_path }
  173.  
  174.  
  175. def parseVStatus(s):
  176.     pens = []
  177.     pen = { }
  178.     c = 0
  179.     fields = s.split(',')
  180.     log.debug(fields)
  181.     f0 = fields[0]
  182.     if len(f0) == 20:
  183.         pass
  184.     elif len(f0) == 8:
  185.         for p in f0:
  186.             if c == 0:
  187.                 c += 1
  188.                 continue
  189.             if c == 1:
  190.                 if p in ('a', 'A'):
  191.                     pen['type'] = AGENT_TYPE_NONE
  192.                     pen['kind'] = AGENT_KIND_NONE
  193.                 
  194.                 c += 1
  195.                 continue
  196.             if c == 2:
  197.                 pen['health'] = AGENT_HEALTH_OK
  198.                 pen['kind'] = AGENT_KIND_HEAD_AND_SUPPLY
  199.                 if p in ('b', 'B'):
  200.                     pen['type'] = AGENT_TYPE_BLACK
  201.                 elif p in ('c', 'C'):
  202.                     pen['type'] = AGENT_TYPE_CMY
  203.                 elif p in ('d', 'D'):
  204.                     pen['type'] = AGENT_TYPE_KCM
  205.                 elif p in ('u', 'U'):
  206.                     pen['type'] = AGENT_TYPE_NONE
  207.                     pen['health'] = AGENT_HEALTH_MISINSTALLED
  208.                 
  209.                 c += 1
  210.                 continue
  211.             if c == 3:
  212.                 if p == '0':
  213.                     pen['state'] = 1
  214.                 else:
  215.                     pen['state'] = 0
  216.                 pen['level'] = 0
  217.                 i = 8
  218.                 while True:
  219.                     
  220.                     try:
  221.                         f = fields[i]
  222.                     except IndexError:
  223.                         break
  224.  
  225.                     if f[:2] == 'KP' and pen['type'] == AGENT_TYPE_BLACK:
  226.                         pen['level'] = int(f[2:])
  227.                     elif f[:2] == 'CP' and pen['type'] == AGENT_TYPE_CMY:
  228.                         pen['level'] = int(f[2:])
  229.                     
  230.                     i += 1
  231.                 pens.append(pen)
  232.                 pen = { }
  233.                 c = 0
  234.                 continue
  235.         
  236.     
  237.     
  238.     try:
  239.         fields[2]
  240.     except IndexError:
  241.         top_lid = 1
  242.  
  243.     if fields[2] == 'DN':
  244.         top_lid = 1
  245.     else:
  246.         top_lid = 2
  247.     
  248.     try:
  249.         stat = vstatus_xlate.get(fields[3].lower(), STATUS_PRINTER_IDLE)
  250.     except IndexError:
  251.         stat = STATUS_PRINTER_IDLE
  252.  
  253.     return {
  254.         'revision': STATUS_REV_V,
  255.         'agents': pens,
  256.         'top-lid': top_lid,
  257.         'status-code': stat,
  258.         'supply-lid': SUPPLY_DOOR_NOT_PRESENT,
  259.         'duplexer': DUPLEXER_NOT_PRESENT,
  260.         'photo-tray': PHOTO_TRAY_NOT_PRESENT,
  261.         'in-tray1': IN_TRAY_NOT_PRESENT,
  262.         'in-tray2': IN_TRAY_NOT_PRESENT,
  263.         'media-path': MEDIA_PATH_CUT_SHEET }
  264.  
  265.  
  266. def parseStatus(DeviceID):
  267.     if 'VSTATUS' in DeviceID:
  268.         return parseVStatus(DeviceID['VSTATUS'])
  269.     if 'S' in DeviceID:
  270.         return parseSStatus(DeviceID['S'], DeviceID.get('Z', ''))
  271.     return STATUS_BLOCK_UNKNOWN
  272.  
  273.  
  274. def LaserJetDeviceStatusToPrinterStatus(device_status, printer_status, detected_error_state):
  275.     stat = STATUS_PRINTER_IDLE
  276.     if device_status in (pml.DEVICE_STATUS_WARNING, pml.DEVICE_STATUS_DOWN):
  277.         if detected_error_state & pml.DETECTED_ERROR_STATE_LOW_PAPER_MASK and not (detected_error_state & pml.DETECTED_ERROR_STATE_NO_PAPER_MASK):
  278.             stat = STATUS_PRINTER_LOW_PAPER
  279.         elif detected_error_state & pml.DETECTED_ERROR_STATE_NO_PAPER_MASK:
  280.             stat = STATUS_PRINTER_OUT_OF_PAPER
  281.         elif detected_error_state & pml.DETECTED_ERROR_STATE_DOOR_OPEN_MASK:
  282.             stat = STATUS_PRINTER_DOOR_OPEN
  283.         elif detected_error_state & pml.DETECTED_ERROR_STATE_JAMMED_MASK:
  284.             stat = STATUS_PRINTER_MEDIA_JAM
  285.         elif detected_error_state & pml.DETECTED_ERROR_STATE_OUT_CART_MASK:
  286.             stat = STATUS_PRINTER_NO_TONER
  287.         elif detected_error_state & pml.DETECTED_ERROR_STATE_LOW_CART_MASK:
  288.             stat = STATUS_PRINTER_LOW_TONER
  289.         elif detected_error_state == pml.DETECTED_ERROR_STATE_SERVICE_REQUEST_MASK:
  290.             stat = STATUS_PRINTER_SERVICE_REQUEST
  291.         elif detected_error_state & pml.DETECTED_ERROR_STATE_OFFLINE_MASK:
  292.             stat = STATUS_PRINTER_OFFLINE
  293.         
  294.     elif printer_status == pml.PRINTER_STATUS_IDLE:
  295.         stat = STATUS_PRINTER_IDLE
  296.     elif printer_status == pml.PRINTER_STATUS_PRINTING:
  297.         stat = STATUS_PRINTER_PRINTING
  298.     elif printer_status == pml.PRINTER_STATUS_WARMUP:
  299.         stat = STATUS_PRINTER_WARMING_UP
  300.     
  301.     return stat
  302.  
  303. COLORANT_INDEX_TO_AGENT_TYPE_MAP = {
  304.     'other': AGENT_TYPE_UNSPECIFIED,
  305.     'unknown': AGENT_TYPE_UNSPECIFIED,
  306.     'blue': AGENT_TYPE_BLUE,
  307.     'cyan': AGENT_TYPE_CYAN,
  308.     'magenta': AGENT_TYPE_MAGENTA,
  309.     'yellow': AGENT_TYPE_YELLOW,
  310.     'black': AGENT_TYPE_BLACK }
  311. MARKER_SUPPLES_TYPE_TO_AGENT_KIND_MAP = {
  312.     pml.OID_MARKER_SUPPLIES_TYPE_OTHER: AGENT_KIND_UNKNOWN,
  313.     pml.OID_MARKER_SUPPLIES_TYPE_UNKNOWN: AGENT_KIND_UNKNOWN,
  314.     pml.OID_MARKER_SUPPLIES_TYPE_TONER: AGENT_KIND_TONER_CARTRIDGE,
  315.     pml.OID_MARKER_SUPPLIES_TYPE_WASTE_TONER: AGENT_KIND_UNKNOWN,
  316.     pml.OID_MARKER_SUPPLIES_TYPE_INK: AGENT_KIND_SUPPLY,
  317.     pml.OID_MARKER_SUPPLIES_TYPE_INK_CART: AGENT_KIND_HEAD_AND_SUPPLY,
  318.     pml.OID_MARKER_SUPPLIES_TYPE_INK_RIBBON: AGENT_KIND_HEAD_AND_SUPPLY,
  319.     pml.OID_MARKER_SUPPLIES_TYPE_WASTE_INK: AGENT_KIND_UNKNOWN,
  320.     pml.OID_MARKER_SUPPLIES_TYPE_OPC: AGENT_KIND_DRUM_KIT,
  321.     pml.OID_MARKER_SUPPLIES_TYPE_DEVELOPER: AGENT_KIND_UNKNOWN,
  322.     pml.OID_MARKER_SUPPLIES_TYPE_FUSER_OIL: AGENT_KIND_UNKNOWN,
  323.     pml.OID_MARKER_SUPPLIES_TYPE_SOLID_WAX: AGENT_KIND_UNKNOWN,
  324.     pml.OID_MARKER_SUPPLIES_TYPE_RIBBON_WAX: AGENT_KIND_UNKNOWN,
  325.     pml.OID_MARKER_SUPPLIES_TYPE_WASTE_WAX: AGENT_KIND_UNKNOWN,
  326.     pml.OID_MARKER_SUPPLIES_TYPE_FUSER: AGENT_KIND_MAINT_KIT,
  327.     pml.OID_MARKER_SUPPLIES_TYPE_CORONA_WIRE: AGENT_KIND_UNKNOWN,
  328.     pml.OID_MARKER_SUPPLIES_TYPE_FUSER_OIL_WICK: AGENT_KIND_UNKNOWN,
  329.     pml.OID_MARKER_SUPPLIES_TYPE_CLEANER_UNIT: AGENT_KIND_UNKNOWN,
  330.     pml.OID_MARKER_SUPPLIES_TYPE_FUSER_CLEANING_PAD: AGENT_KIND_UNKNOWN,
  331.     pml.OID_MARKER_SUPPLIES_TYPE_TRANSFER_UNIT: AGENT_KIND_TRANSFER_KIT,
  332.     pml.OID_MARKER_SUPPLIES_TYPE_TONER_CART: AGENT_KIND_TONER_CARTRIDGE,
  333.     pml.OID_MARKER_SUPPLIES_TYPE_FUSER_OILER: AGENT_KIND_UNKNOWN,
  334.     pml.OID_MARKER_SUPPLIES_TYPE_ADF_MAINT_KIT: AGENT_KIND_ADF_KIT }
  335.  
  336. def StatusType3(dev, parsedID):
  337.     
  338.     try:
  339.         dev.openPML()
  340.         (result_code, printer_status) = dev.getPML(pml.OID_PRINTER_STATUS, pml.INT_SIZE_BYTE)
  341.         (result_code, device_status) = dev.getPML(pml.OID_DEVICE_STATUS, pml.INT_SIZE_BYTE)
  342.         (result_code, cover_status) = dev.getPML(pml.OID_COVER_STATUS, pml.INT_SIZE_BYTE)
  343.         (result_code, value) = dev.getPML(pml.OID_DETECTED_ERROR_STATE)
  344.     except Error:
  345.         dev.closePML()
  346.         return {
  347.             'revision': STATUS_REV_UNKNOWN,
  348.             'agents': [],
  349.             'top-door': 0,
  350.             'status-code': STATUS_UNKNOWN,
  351.             'supply-door': 0,
  352.             'duplexer': 1,
  353.             'photo-tray': 0,
  354.             'in-tray1': 0,
  355.             'in-tray2': 0,
  356.             'media-path': 0 }
  357.  
  358.     
  359.     try:
  360.         detected_error_state = struct.unpack('B', value[0])[0]
  361.     except (IndexError, TypeError):
  362.         detected_error_state = pml.DETECTED_ERROR_STATE_OFFLINE_MASK
  363.  
  364.     agents = []
  365.     x = 1
  366.     while True:
  367.         log.debug('%s Agent: %d %s' % ('**********', x, '**********'))
  368.         log.debug('OID_MARKER_SUPPLIES_TYPE_%d:' % x)
  369.         oid = (pml.OID_MARKER_SUPPLIES_TYPE_x % x, pml.OID_MARKER_SUPPLIES_TYPE_x_TYPE)
  370.         (result_code, value) = dev.getPML(oid, pml.INT_SIZE_BYTE)
  371.         if result_code != ERROR_SUCCESS or value is None:
  372.             log.debug('End of supply information.')
  373.             break
  374.         
  375.         for a in MARKER_SUPPLES_TYPE_TO_AGENT_KIND_MAP:
  376.             if value == a:
  377.                 agent_kind = MARKER_SUPPLES_TYPE_TO_AGENT_KIND_MAP[a]
  378.                 break
  379.                 continue
  380.         else:
  381.             agent_kind = AGENT_KIND_UNKNOWN
  382.         log.debug('OID_MARKER_SUPPLIES_LEVEL_%d:' % x)
  383.         oid = (pml.OID_MARKER_SUPPLIES_LEVEL_x % x, pml.OID_MARKER_SUPPLIES_LEVEL_x_TYPE)
  384.         (result_code, agent_level) = dev.getPML(oid)
  385.         if result_code != ERROR_SUCCESS:
  386.             log.debug('Failed')
  387.             break
  388.         
  389.         log.debug('agent%d-level: %d' % (x, agent_level))
  390.         log.debug('OID_MARKER_SUPPLIES_MAX_%d:' % x)
  391.         oid = (pml.OID_MARKER_SUPPLIES_MAX_x % x, pml.OID_MARKER_SUPPLIES_MAX_x_TYPE)
  392.         (result_code, agent_max) = dev.getPML(oid)
  393.         if agent_max == 0:
  394.             agent_max = 1
  395.         
  396.         if result_code != ERROR_SUCCESS:
  397.             log.debug('Failed')
  398.             break
  399.         
  400.         log.debug('agent%d-max: %d' % (x, agent_max))
  401.         log.debug('OID_MARKER_SUPPLIES_COLORANT_INDEX_%d:' % x)
  402.         oid = (pml.OID_MARKER_SUPPLIES_COLORANT_INDEX_x % x, pml.OID_MARKER_SUPPLIES_COLORANT_INDEX_x_TYPE)
  403.         (result_code, colorant_index) = dev.getPML(oid)
  404.         if result_code != ERROR_SUCCESS:
  405.             log.debug('Failed')
  406.             agent_type = AGENT_TYPE_BLACK
  407.         else:
  408.             log.debug('Colorant index: %d' % colorant_index)
  409.             log.debug('OID_MARKER_COLORANT_VALUE_%d' % x)
  410.             oid = (pml.OID_MARKER_COLORANT_VALUE_x % colorant_index, pml.OID_MARKER_COLORANT_VALUE_x_TYPE)
  411.             (result_code, colorant_value) = dev.getPML(oid)
  412.             if result_code != ERROR_SUCCESS:
  413.                 log.debug('Failed. Defaulting to black.')
  414.                 agent_type = AGENT_TYPE_BLACK
  415.             
  416.             if agent_kind in (AGENT_KIND_MAINT_KIT, AGENT_KIND_ADF_KIT, AGENT_KIND_DRUM_KIT, AGENT_KIND_TRANSFER_KIT):
  417.                 agent_type = AGENT_TYPE_UNSPECIFIED
  418.             else:
  419.                 agent_type = AGENT_TYPE_BLACK
  420.                 if result_code != ERROR_SUCCESS:
  421.                     log.debug('OID_MARKER_SUPPLIES_DESCRIPTION_%d:' % x)
  422.                     oid = (pml.OID_MARKER_SUPPLIES_DESCRIPTION_x % x, pml.OID_MARKER_SUPPLIES_DESCRIPTION_x_TYPE)
  423.                     (result_code, colorant_value) = dev.getPML(oid)
  424.                     if result_code != ERROR_SUCCESS:
  425.                         log.debug('Failed')
  426.                         break
  427.                     
  428.                     if colorant_value is not None:
  429.                         log.debug('colorant value: %s' % colorant_value)
  430.                         colorant_value = colorant_value.lower().strip()
  431.                         for c in COLORANT_INDEX_TO_AGENT_TYPE_MAP:
  432.                             if colorant_value.find(c) >= 0:
  433.                                 agent_type = COLORANT_INDEX_TO_AGENT_TYPE_MAP[c]
  434.                                 break
  435.                                 continue
  436.                         else:
  437.                             agent_type = AGENT_TYPE_BLACK
  438.                     
  439.                 elif colorant_value is not None:
  440.                     log.debug('colorant value: %s' % colorant_value)
  441.                     agent_type = COLORANT_INDEX_TO_AGENT_TYPE_MAP.get(colorant_value, AGENT_TYPE_BLACK)
  442.                 
  443.                 if agent_type == AGENT_TYPE_NONE:
  444.                     if agent_kind == AGENT_KIND_TONER_CARTRIDGE:
  445.                         agent_type = AGENT_TYPE_BLACK
  446.                     else:
  447.                         agent_type = AGENT_TYPE_UNSPECIFIED
  448.                 
  449.         log.debug('OID_MARKER_STATUS_%d:' % x)
  450.         oid = (pml.OID_MARKER_STATUS_x % x, pml.OID_MARKER_STATUS_x_TYPE)
  451.         (result_code, agent_status) = dev.getPML(oid)
  452.         if result_code != ERROR_SUCCESS:
  453.             log.debug('Failed')
  454.             agent_trigger = AGENT_LEVEL_TRIGGER_SUFFICIENT_0
  455.             agent_health = AGENT_HEALTH_OK
  456.         else:
  457.             agent_trigger = AGENT_LEVEL_TRIGGER_SUFFICIENT_0
  458.             if agent_status is None:
  459.                 agent_health = AGENT_HEALTH_OK
  460.             elif agent_status == pml.OID_MARKER_STATUS_OK:
  461.                 agent_health = AGENT_HEALTH_OK
  462.             elif agent_status == pml.OID_MARKER_STATUS_MISINSTALLED:
  463.                 agent_health = AGENT_HEALTH_MISINSTALLED
  464.             elif agent_status in (pml.OID_MARKER_STATUS_LOW_TONER_CONT, pml.OID_MARKER_STATUS_LOW_TONER_STOP):
  465.                 agent_health = AGENT_HEALTH_OK
  466.                 agent_trigger = AGENT_LEVEL_TRIGGER_MAY_BE_LOW
  467.             else:
  468.                 agent_health = AGENT_HEALTH_OK
  469.         agent_level = int((agent_level / agent_max) * 100)
  470.         log.debug('agent%d: kind=%d, type=%d, health=%d, level=%d, level-trigger=%d' % (x, agent_kind, agent_type, agent_health, agent_level, agent_trigger))
  471.         agents.append({
  472.             'kind': agent_kind,
  473.             'type': agent_type,
  474.             'health': agent_health,
  475.             'level': agent_level,
  476.             'level-trigger': agent_trigger })
  477.         x += 1
  478.         if x > 20:
  479.             break
  480.             continue
  481.     if not printer_status:
  482.         pass
  483.     printer_status = STATUS_PRINTER_IDLE
  484.     log.debug('printer_status=%d' % printer_status)
  485.     if not device_status:
  486.         pass
  487.     device_status = pml.DEVICE_STATUS_RUNNING
  488.     log.debug('device_status=%d' % device_status)
  489.     if not cover_status:
  490.         pass
  491.     cover_status = pml.COVER_STATUS_CLOSED
  492.     log.debug('cover_status=%d' % cover_status)
  493.     if not detected_error_state:
  494.         pass
  495.     detected_error_state = pml.DETECTED_ERROR_STATE_NO_ERROR
  496.     log.debug('detected_error_state=%d (0x%x)' % (detected_error_state, detected_error_state))
  497.     stat = LaserJetDeviceStatusToPrinterStatus(device_status, printer_status, detected_error_state)
  498.     log.debug('Printer status=%d' % stat)
  499.     if stat == STATUS_PRINTER_DOOR_OPEN:
  500.         supply_door = 0
  501.     else:
  502.         supply_door = 1
  503.     return {
  504.         'revision': STATUS_REV_UNKNOWN,
  505.         'agents': agents,
  506.         'top-door': cover_status,
  507.         'status-code': stat,
  508.         'supply-door': supply_door,
  509.         'duplexer': 1,
  510.         'photo-tray': 0,
  511.         'in-tray1': 1,
  512.         'in-tray2': 1,
  513.         'media-path': 1 }
  514.  
  515.  
  516. def setup_panel_translator():
  517.     global PANEL_TRANSLATOR_FUNC
  518.     printables = list('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\n!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~')
  519.     map = { }
  520.     for x in range(0, 256):
  521.         pass
  522.     
  523.     map.update({
  524.         '\x10': '\xab',
  525.         '\x11': '\xbb',
  526.         '\x12': '\xa3',
  527.         '\x13': '\xbb',
  528.         '\x80': '\xab',
  529.         '\x81': '\xbb',
  530.         '\x82': '*',
  531.         '\x83': '*',
  532.         '\x85': '*',
  533.         '\xa0': '\xab',
  534.         '\x1f': '?',
  535.         '=': ' ' })
  536.     (frm, to) = ('', '')
  537.     map_keys = map.keys()
  538.     map_keys.sort()
  539.     for x in map_keys:
  540.         frm = ''.join([
  541.             frm,
  542.             x])
  543.         to = ''.join([
  544.             to,
  545.             map[x]])
  546.     
  547.     PANEL_TRANSLATOR_FUNC = utils.Translator(frm, to)
  548.  
  549. PANEL_TRANSLATOR_FUNC = None
  550. setup_panel_translator()
  551.  
  552. def PanelCheck(dev):
  553.     (line1, line2) = ('', '')
  554.     if dev.io_mode not in (IO_MODE_RAW, IO_MODE_UNI):
  555.         
  556.         try:
  557.             dev.openPML()
  558.         except Error:
  559.             pass
  560.  
  561.         oids = [
  562.             (pml.OID_HP_LINE1, pml.OID_HP_LINE2),
  563.             (pml.OID_SPM_LINE1, pml.OID_SPM_LINE2)]
  564.         for oid1, oid2 in oids:
  565.             (result, line1) = dev.getPML(oid1)
  566.             if result < pml.ERROR_MAX_OK:
  567.                 line1 = PANEL_TRANSLATOR_FUNC(line1).rstrip()
  568.                 if '\n' in line1:
  569.                     (line1, line2) = line1.split('\n', 1)
  570.                     break
  571.                 
  572.                 (result, line2) = dev.getPML(oid2)
  573.                 if result < pml.ERROR_MAX_OK:
  574.                     line2 = PANEL_TRANSLATOR_FUNC(line2).rstrip()
  575.                     break
  576.                 
  577.             result < pml.ERROR_MAX_OK
  578.         
  579.     
  580.     if not line1:
  581.         pass
  582.     if not line1:
  583.         pass
  584.     if not line2:
  585.         pass
  586.     return (bool(line2), '', '')
  587.  
  588. BATTERY_HEALTH_MAP = {
  589.     0: AGENT_HEALTH_OK,
  590.     1: AGENT_HEALTH_OVERTEMP,
  591.     2: AGENT_HEALTH_CHARGING,
  592.     3: AGENT_HEALTH_MISINSTALLED,
  593.     4: AGENT_HEALTH_FAILED }
  594. BATTERY_TRIGGER_MAP = {
  595.     0: AGENT_LEVEL_TRIGGER_SUFFICIENT_0,
  596.     1: AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT,
  597.     2: AGENT_LEVEL_TRIGGER_PROBABLY_OUT,
  598.     3: AGENT_LEVEL_TRIGGER_SUFFICIENT_4,
  599.     4: AGENT_LEVEL_TRIGGER_SUFFICIENT_2,
  600.     5: AGENT_LEVEL_TRIGGER_SUFFICIENT_0 }
  601. BATTERY_PML_TRIGGER_MAP = {
  602.     (100, 80): AGENT_LEVEL_TRIGGER_SUFFICIENT_0,
  603.     (79, 60): AGENT_LEVEL_TRIGGER_SUFFICIENT_1,
  604.     (59, 40): AGENT_LEVEL_TRIGGER_SUFFICIENT_2,
  605.     (39, 30): AGENT_LEVEL_TRIGGER_SUFFICIENT_3,
  606.     (29, 20): AGENT_LEVEL_TRIGGER_SUFFICIENT_4,
  607.     (19, 10): AGENT_LEVEL_TRIGGER_MAY_BE_LOW,
  608.     (9, 5): AGENT_LEVEL_TRIGGER_PROBABLY_OUT,
  609.     (4, -1): AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT }
  610.  
  611. def BatteryCheck(dev, status_block, battery_check):
  612.     try_dynamic_counters = False
  613.     
  614.     try:
  615.         dev.openPML()
  616.     except Error:
  617.         if battery_check == STATUS_BATTERY_CHECK_STD:
  618.             log.debug('PML channel open failed. Trying dynamic counters...')
  619.             try_dynamic_counters = True
  620.         
  621.     except:
  622.         battery_check == STATUS_BATTERY_CHECK_STD
  623.     elif battery_check == STATUS_BATTERY_CHECK_PML:
  624.         (result, battery_level) = dev.getPML(pml.OID_BATTERY_LEVEL_2)
  625.         if result > pml.ERROR_MAX_OK:
  626.             status_block['agents'].append({
  627.                 'kind': AGENT_KIND_INT_BATTERY,
  628.                 'type': AGENT_TYPE_UNSPECIFIED,
  629.                 'health': AGENT_HEALTH_UNKNOWN,
  630.                 'level': 0,
  631.                 'level-trigger': AGENT_LEVEL_TRIGGER_SUFFICIENT_0 })
  632.             return None
  633.         status_block['agents'].append({
  634.             'kind': AGENT_KIND_INT_BATTERY,
  635.             'type': AGENT_TYPE_UNSPECIFIED,
  636.             'health': AGENT_HEALTH_OK,
  637.             'level': battery_level,
  638.             'level-trigger': AGENT_LEVEL_TRIGGER_SUFFICIENT_0 })
  639.         return None
  640.     else:
  641.         (result, battery_level) = dev.getPML(pml.OID_BATTERY_LEVEL)
  642.         (result, power_mode) = dev.getPML(pml.OID_POWER_MODE)
  643.         if battery_level is not None and power_mode is not None:
  644.             if power_mode & pml.POWER_MODE_BATTERY_LEVEL_KNOWN and battery_level >= 0:
  645.                 for x in BATTERY_PML_TRIGGER_MAP:
  646.                     if battery_level >= battery_level:
  647.                         pass
  648.                     elif battery_level > x[1]:
  649.                         battery_trigger_level = BATTERY_PML_TRIGGER_MAP[x]
  650.                         break
  651.                         continue
  652.                 
  653.                 if power_mode & pml.POWER_MODE_CHARGING:
  654.                     agent_health = AGENT_HEALTH_CHARGING
  655.                 elif power_mode & pml.POWER_MODE_DISCHARGING:
  656.                     agent_health = AGENT_HEALTH_DISCHARGING
  657.                 else:
  658.                     agent_health = AGENT_HEALTH_OK
  659.                 status_block['agents'].append({
  660.                     'kind': AGENT_KIND_INT_BATTERY,
  661.                     'type': AGENT_TYPE_UNSPECIFIED,
  662.                     'health': agent_health,
  663.                     'level': battery_level,
  664.                     'level-trigger': battery_trigger_level })
  665.                 return None
  666.             status_block['agents'].append({
  667.                 'kind': AGENT_KIND_INT_BATTERY,
  668.                 'type': AGENT_TYPE_UNSPECIFIED,
  669.                 'health': AGENT_HEALTH_UNKNOWN,
  670.                 'level': 0,
  671.                 'level-trigger': AGENT_LEVEL_TRIGGER_SUFFICIENT_0 })
  672.             return None
  673.         power_mode is not None
  674.         try_dynamic_counters = True
  675.     finally:
  676.         dev.closePML()
  677.  
  678.     if battery_check == STATUS_BATTERY_CHECK_STD and try_dynamic_counters:
  679.         
  680.         try:
  681.             battery_health = dev.getDynamicCounter(200)
  682.             battery_trigger_level = dev.getDynamicCounter(201)
  683.             battery_level = dev.getDynamicCounter(202)
  684.             status_block['agents'].append({
  685.                 'kind': AGENT_KIND_INT_BATTERY,
  686.                 'type': AGENT_TYPE_UNSPECIFIED,
  687.                 'health': BATTERY_HEALTH_MAP[battery_health],
  688.                 'level': battery_level,
  689.                 'level-trigger': BATTERY_TRIGGER_MAP[battery_trigger_level] })
  690.         except Error:
  691.             result > pml.ERROR_MAX_OK
  692.             result > pml.ERROR_MAX_OK
  693.             status_block['agents'].append({
  694.                 'kind': AGENT_KIND_INT_BATTERY,
  695.                 'type': AGENT_TYPE_UNSPECIFIED,
  696.                 'health': AGENT_HEALTH_UNKNOWN,
  697.                 'level': 0,
  698.                 'level-trigger': AGENT_LEVEL_TRIGGER_SUFFICIENT_0 })
  699.         except:
  700.             result > pml.ERROR_MAX_OK
  701.         finally:
  702.             dev.closePrint()
  703.  
  704.     else:
  705.         status_block['agents'].append({
  706.             'kind': AGENT_KIND_INT_BATTERY,
  707.             'type': AGENT_TYPE_UNSPECIFIED,
  708.             'health': AGENT_HEALTH_UNKNOWN,
  709.             'level': 0,
  710.             'level-trigger': AGENT_LEVEL_TRIGGER_SUFFICIENT_0 })
  711.  
  712.  
  713. def getPenConfiguration(s):
  714.     pens = [ p['type'] for p in s['agents'] ]
  715.     if utils.all(pens, (lambda x: x == AGENT_TYPE_NONE)):
  716.         return AGENT_CONFIG_NONE
  717.     if AGENT_TYPE_NONE in pens:
  718.         if AGENT_TYPE_BLACK in pens:
  719.             return AGENT_CONFIG_BLACK_ONLY
  720.         if AGENT_TYPE_CMY in pens:
  721.             return AGENT_CONFIG_COLOR_ONLY
  722.         if AGENT_TYPE_KCM in pens:
  723.             return AGENT_CONFIG_PHOTO_ONLY
  724.         if AGENT_TYPE_GGK in pens:
  725.             return AGENT_CONFIG_GREY_ONLY
  726.         return AGENT_CONFIG_INVALID
  727.     AGENT_TYPE_NONE in pens
  728.     if AGENT_TYPE_BLACK in pens and AGENT_TYPE_CMY in pens:
  729.         return AGENT_CONFIG_COLOR_AND_BLACK
  730.     if AGENT_TYPE_CMY in pens and AGENT_TYPE_KCM in pens:
  731.         return AGENT_CONFIG_COLOR_AND_PHOTO
  732.     if AGENT_TYPE_CMY in pens and AGENT_TYPE_GGK in pens:
  733.         return AGENT_CONFIG_COLOR_AND_GREY
  734.     return AGENT_CONFIG_INVALID
  735.  
  736.  
  737. def getFaxStatus(dev):
  738.     tx_active = False
  739.     rx_active = False
  740.     if dev.io_mode not in (IO_MODE_UNI, IO_MODE_RAW):
  741.         
  742.         try:
  743.             dev.openPML()
  744.             (result_code, tx_state) = dev.getPML(pml.OID_FAXJOB_TX_STATUS)
  745.             if result_code == ERROR_SUCCESS and tx_state:
  746.                 if tx_state not in (pml.FAXJOB_TX_STATUS_IDLE, pml.FAXJOB_TX_STATUS_DONE):
  747.                     tx_active = True
  748.                 
  749.             
  750.             (result_code, rx_state) = dev.getPML(pml.OID_FAXJOB_RX_STATUS)
  751.             if result_code == ERROR_SUCCESS and rx_state:
  752.                 if rx_state not in (pml.FAXJOB_RX_STATUS_IDLE, pml.FAXJOB_RX_STATUS_DONE):
  753.                     rx_active = True
  754.                 
  755.         finally:
  756.             dev.closePML()
  757.  
  758.     
  759.     return (tx_active, rx_active)
  760.  
  761. TYPE6_STATUS_CODE_MAP = {
  762.     0: STATUS_PRINTER_IDLE,
  763.     -19928: STATUS_PRINTER_IDLE,
  764.     -18995: STATUS_PRINTER_CANCELING,
  765.     -17974: STATUS_PRINTER_WARMING_UP,
  766.     -17973: STATUS_PRINTER_PEN_CLEANING,
  767.     -18993: STATUS_PRINTER_BUSY,
  768.     -17949: STATUS_PRINTER_BUSY,
  769.     -19720: STATUS_PRINTER_MANUAL_DUPLEX_BLOCK,
  770.     -19678: STATUS_PRINTER_BUSY,
  771.     -19695: STATUS_PRINTER_OUT_OF_PAPER,
  772.     -17985: STATUS_PRINTER_MEDIA_JAM,
  773.     -19731: STATUS_PRINTER_OUT_OF_PAPER,
  774.     -18974: STATUS_PRINTER_BUSY,
  775.     -19730: STATUS_PRINTER_OUT_OF_PAPER,
  776.     -19729: STATUS_PRINTER_OUT_OF_PAPER,
  777.     -19933: STATUS_PRINTER_HARD_ERROR,
  778.     -17984: STATUS_PRINTER_DOOR_OPEN,
  779.     -19694: STATUS_PRINTER_DOOR_OPEN,
  780.     -18992: STATUS_PRINTER_MANUAL_FEED_BLOCKED,
  781.     -19690: STATUS_PRINTER_MEDIA_JAM,
  782.     -19689: STATUS_PRINTER_MEDIA_JAM,
  783.     -19611: STATUS_PRINTER_MEDIA_JAM,
  784.     -19686: STATUS_PRINTER_MEDIA_JAM,
  785.     -19688: STATUS_PRINTER_MEDIA_JAM,
  786.     -19685: STATUS_PRINTER_MEDIA_JAM,
  787.     -19684: STATUS_PRINTER_MEDIA_JAM,
  788.     -18848: STATUS_PRINTER_MEDIA_JAM,
  789.     -18847: STATUS_PRINTER_MEDIA_JAM,
  790.     -18846: STATUS_PRINTER_MEDIA_JAM,
  791.     -19687: STATUS_PRINTER_MEDIA_JAM,
  792.     -17992: STATUS_PRINTER_MEDIA_JAM,
  793.     -19700: STATUS_PRINTER_HARD_ERROR,
  794.     -17996: STATUS_PRINTER_FUSER_ERROR,
  795.     -17983: STATUS_PRINTER_FUSER_ERROR,
  796.     -17982: STATUS_PRINTER_FUSER_ERROR,
  797.     -17981: STATUS_PRINTER_FUSER_ERROR,
  798.     -17971: STATUS_PRINTER_FUSER_ERROR,
  799.     -17995: STATUS_PRINTER_HARD_ERROR,
  800.     -17994: STATUS_PRINTER_HARD_ERROR,
  801.     -17993: STATUS_PRINTER_HARD_ERROR,
  802.     -18994: STATUS_PRINTER_HARD_ERROR,
  803.     -17986: STATUS_PRINTER_HARD_ERROR,
  804.     -19904: STATUS_PRINTER_HARD_ERROR,
  805.     -19701: STATUS_PRINTER_NON_HP_INK,
  806.     -19613: STATUS_PRINTER_IDLE,
  807.     -19654: STATUS_PRINTER_NON_HP_INK,
  808.     -19682: STATUS_PRINTER_HARD_ERROR,
  809.     -19693: STATUS_PRINTER_IDLE,
  810.     -19752: STATUS_PRINTER_LOW_TONER,
  811.     -19723: STATUS_PRINTER_BUSY,
  812.     -19703: STATUS_PRINTER_BUSY,
  813.     -19739: STATUS_PRINTER_NO_TONER,
  814.     -19927: STATUS_PRINTER_BUSY,
  815.     -19932: STATUS_PRINTER_BUSY,
  816.     -19931: STATUS_PRINTER_BUSY,
  817.     -11989: STATUS_PRINTER_BUSY,
  818.     -11995: STATUS_PRINTER_BUSY,
  819.     -19954: STATUS_PRINTER_CANCELING,
  820.     -19955: STATUS_PRINTER_REPORT_PRINTING,
  821.     -19956: STATUS_PRINTER_REPORT_PRINTING,
  822.     -19934: STATUS_PRINTER_HARD_ERROR,
  823.     -19930: STATUS_PRINTER_BUSY,
  824.     -11990: STATUS_PRINTER_DOOR_OPEN,
  825.     -11999: STATUS_PRINTER_MEDIA_JAM,
  826.     -12000: STATUS_PRINTER_MEDIA_JAM,
  827.     -11998: STATUS_PRINTER_MEDIA_JAM,
  828.     -11986: STATUS_PRINTER_HARD_ERROR,
  829.     -11994: STATUS_PRINTER_BUSY,
  830.     -14967: STATUS_PRINTER_BUSY,
  831.     -19912: STATUS_PRINTER_HARD_ERROR,
  832.     -14962: STATUS_PRINTER_BUSY,
  833.     -14971: STATUS_PRINTER_BUSY,
  834.     -14973: STATUS_PRINTER_BUSY,
  835.     -14972: STATUS_PRINTER_BUSY,
  836.     -14966: STATUS_PRINTER_DOOR_OPEN,
  837.     -14974: STATUS_PRINTER_MEDIA_JAM,
  838.     -14969: STATUS_PRINTER_HARD_ERROR,
  839.     -14968: STATUS_PRINTER_HARD_ERROR,
  840.     -12996: STATUS_PRINTER_BUSY,
  841.     -12994: STATUS_PRINTER_BUSY,
  842.     -12993: STATUS_PRINTER_BUSY,
  843.     -12991: STATUS_PRINTER_BUSY,
  844.     -12995: STATUS_PRINTER_BUSY,
  845.     -12997: STATUS_PRINTER_HARD_ERROR,
  846.     -12990: STATUS_PRINTER_BUSY,
  847.     -12998: STATUS_PRINTER_BUSY,
  848.     -13000: STATUS_PRINTER_DOOR_OPEN,
  849.     -12999: STATUS_PRINTER_MEDIA_JAM,
  850.     -13859: STATUS_PRINTER_BUSY,
  851.     -13858: STATUS_PRINTER_BUSY,
  852.     -13868: STATUS_PRINTER_BUSY,
  853.     -13867: STATUS_PRINTER_BUSY,
  854.     -13857: STATUS_PRINTER_BUSY,
  855.     -13856: STATUS_PRINTER_BUSY,
  856.     -13855: STATUS_PRINTER_BUSY,
  857.     -13854: STATUS_PRINTER_BUSY,
  858.     -13853: STATUS_PRINTER_BUSY,
  859.     -13839: STATUS_PRINTER_BUSY,
  860.     -13842: STATUS_PRINTER_BUSY,
  861.     -13838: STATUS_PRINTER_BUSY,
  862.     -13847: STATUS_PRINTER_BUSY,
  863.     -13846: STATUS_PRINTER_BUSY,
  864.     -13845: STATUS_PRINTER_BUSY,
  865.     -13844: STATUS_PRINTER_BUSY,
  866.     -13840: STATUS_PRINTER_BUSY,
  867.     -13843: STATUS_PRINTER_BUSY,
  868.     -13850: STATUS_PRINTER_BUSY,
  869.     -13851: STATUS_PRINTER_BUSY,
  870.     -13836: STATUS_PRINTER_BUSY,
  871.     -13864: STATUS_PRINTER_BUSY,
  872.     -13863: STATUS_PRINTER_BUSY,
  873.     -13865: STATUS_PRINTER_BUSY,
  874.     -13862: STATUS_PRINTER_BUSY,
  875.     -13837: STATUS_PRINTER_BUSY,
  876.     -13861: STATUS_PRINTER_BUSY,
  877.     -13866: STATUS_PRINTER_BUSY,
  878.     -13841: STATUS_PRINTER_BUSY,
  879.     -13848: STATUS_PRINTER_BUSY,
  880.     -13849: STATUS_PRINTER_BUSY }
  881.  
  882. def StatusType6(dev):
  883.     info_device_status = cStringIO.StringIO()
  884.     info_ssp = cStringIO.StringIO()
  885.     
  886.     try:
  887.         dev.getEWSUrl('/hp/device/info_device_status.xml', info_device_status)
  888.         dev.getEWSUrl('/hp/device/info_ssp.xml', info_ssp)
  889.     except:
  890.         pass
  891.  
  892.     info_device_status = info_device_status.getvalue()
  893.     info_ssp = info_ssp.getvalue()
  894.     device_status = { }
  895.     ssp = { }
  896.     if info_device_status:
  897.         
  898.         try:
  899.             log.debug_block('info_device_status', info_device_status)
  900.             device_status = utils.XMLToDictParser().parseXML(info_device_status)
  901.             log.debug(device_status)
  902.         except expat.ExpatError:
  903.             log.error('Device Status XML parse error')
  904.             device_status = { }
  905.         except:
  906.             None<EXCEPTION MATCH>expat.ExpatError
  907.         
  908.  
  909.     None<EXCEPTION MATCH>expat.ExpatError
  910.     if info_ssp:
  911.         
  912.         try:
  913.             log.debug_block('info_spp', info_ssp)
  914.             ssp = utils.XMLToDictParser().parseXML(info_ssp)
  915.             log.debug(ssp)
  916.         except expat.ExpatError:
  917.             log.error('SSP XML parse error')
  918.             ssp = { }
  919.         except:
  920.             None<EXCEPTION MATCH>expat.ExpatError
  921.         
  922.  
  923.     None<EXCEPTION MATCH>expat.ExpatError
  924.     status_code = device_status.get('devicestatuspage-devicestatus-statuslist-status-code-0', 0)
  925.     if not status_code:
  926.         status_code = ssp.get('devicestatuspage-devicestatus-statuslist-status-code-0', 0)
  927.     
  928.     black_supply_level = device_status.get('devicestatuspage-suppliesstatus-blacksupply-percentremaining', 0)
  929.     black_supply_low = ssp.get('suppliesstatuspage-blacksupply-lowreached', 0)
  930.     agents = []
  931.     agents.append({
  932.         'kind': AGENT_KIND_TONER_CARTRIDGE,
  933.         'type': AGENT_TYPE_BLACK,
  934.         'health': 0,
  935.         'level': black_supply_level,
  936.         'level-trigger': 0 })
  937.     if dev.tech_type == TECH_TYPE_COLOR_LASER:
  938.         cyan_supply_level = device_status.get('devicestatuspage-suppliesstatus-cyansupply-percentremaining', 0)
  939.         agents.append({
  940.             'kind': AGENT_KIND_TONER_CARTRIDGE,
  941.             'type': AGENT_TYPE_CYAN,
  942.             'health': 0,
  943.             'level': cyan_supply_level,
  944.             'level-trigger': 0 })
  945.         magenta_supply_level = device_status.get('devicestatuspage-suppliesstatus-magentasupply-percentremaining', 0)
  946.         agents.append({
  947.             'kind': AGENT_KIND_TONER_CARTRIDGE,
  948.             'type': AGENT_TYPE_MAGENTA,
  949.             'health': 0,
  950.             'level': magenta_supply_level,
  951.             'level-trigger': 0 })
  952.         yellow_supply_level = device_status.get('devicestatuspage-suppliesstatus-yellowsupply-percentremaining', 0)
  953.         agents.append({
  954.             'kind': AGENT_KIND_TONER_CARTRIDGE,
  955.             'type': AGENT_TYPE_YELLOW,
  956.             'health': 0,
  957.             'level': yellow_supply_level,
  958.             'level-trigger': 0 })
  959.     
  960.     return {
  961.         'revision': STATUS_REV_UNKNOWN,
  962.         'agents': agents,
  963.         'top-door': 0,
  964.         'supply-door': 0,
  965.         'duplexer': 1,
  966.         'photo-tray': 0,
  967.         'in-tray1': 1,
  968.         'in-tray2': 1,
  969.         'media-path': 1,
  970.         'status-code': TYPE6_STATUS_CODE_MAP.get(status_code, STATUS_PRINTER_IDLE) }
  971.  
  972. PJL_STATUS_MAP = {
  973.     10001: STATUS_PRINTER_IDLE,
  974.     10002: STATUS_PRINTER_OFFLINE,
  975.     10003: STATUS_PRINTER_WARMING_UP,
  976.     10004: STATUS_PRINTER_BUSY,
  977.     10005: STATUS_PRINTER_BUSY,
  978.     10006: STATUS_PRINTER_LOW_TONER,
  979.     10007: STATUS_PRINTER_CANCELING,
  980.     10010: STATUS_PRINTER_SERVICE_REQUEST,
  981.     10011: STATUS_PRINTER_OFFLINE,
  982.     10013: STATUS_PRINTER_BUSY,
  983.     10014: STATUS_PRINTER_REPORT_PRINTING,
  984.     10015: STATUS_PRINTER_BUSY,
  985.     10016: STATUS_PRINTER_BUSY,
  986.     10017: STATUS_PRINTER_REPORT_PRINTING,
  987.     10018: STATUS_PRINTER_BUSY,
  988.     10019: STATUS_PRINTER_BUSY,
  989.     10020: STATUS_PRINTER_BUSY,
  990.     10021: STATUS_PRINTER_BUSY,
  991.     10022: STATUS_PRINTER_REPORT_PRINTING,
  992.     10023: STATUS_PRINTER_PRINTING,
  993.     10024: STATUS_PRINTER_SERVICE_REQUEST,
  994.     10025: STATUS_PRINTER_SERVICE_REQUEST,
  995.     10026: STATUS_PRINTER_BUSY,
  996.     10027: STATUS_PRINTER_MEDIA_JAM,
  997.     10028: STATUS_PRINTER_REPORT_PRINTING,
  998.     10029: STATUS_PRINTER_PRINTING,
  999.     10030: STATUS_PRINTER_BUSY,
  1000.     10031: STATUS_PRINTER_BUSY,
  1001.     10032: STATUS_PRINTER_BUSY,
  1002.     10033: STATUS_PRINTER_SERVICE_REQUEST,
  1003.     10034: STATUS_PRINTER_CANCELING,
  1004.     10035: STATUS_PRINTER_PRINTING,
  1005.     10036: STATUS_PRINTER_WARMING_UP,
  1006.     10200: STATUS_PRINTER_LOW_BLACK_TONER,
  1007.     10201: STATUS_PRINTER_LOW_CYAN_TONER,
  1008.     10202: STATUS_PRINTER_LOW_MAGENTA_TONER,
  1009.     10203: STATUS_PRINTER_LOW_YELLOW_TONER,
  1010.     10204: STATUS_PRINTER_LOW_TONER,
  1011.     10205: STATUS_PRINTER_LOW_BLACK_TONER,
  1012.     10206: STATUS_PRINTER_LOW_CYAN_TONER,
  1013.     10207: STATUS_PRINTER_LOW_MAGENTA_TONER,
  1014.     10208: STATUS_PRINTER_LOW_YELLOW_TONER,
  1015.     10209: STATUS_PRINTER_LOW_BLACK_TONER,
  1016.     10210: STATUS_PRINTER_LOW_CYAN_TONER,
  1017.     10211: STATUS_PRINTER_LOW_MAGENTA_TONER,
  1018.     10212: STATUS_PRINTER_LOW_YELLOW_TONER,
  1019.     10213: STATUS_PRINTER_SERVICE_REQUEST,
  1020.     10214: STATUS_PRINTER_SERVICE_REQUEST,
  1021.     10215: STATUS_PRINTER_SERVICE_REQUEST,
  1022.     10216: STATUS_PRINTER_SERVICE_REQUEST,
  1023.     10217: STATUS_PRINTER_SERVICE_REQUEST,
  1024.     10218: STATUS_PRINTER_LOW_TONER,
  1025.     10300: STATUS_PRINTER_LOW_BLACK_TONER,
  1026.     10301: STATUS_PRINTER_LOW_CYAN_TONER,
  1027.     10302: STATUS_PRINTER_LOW_MAGENTA_TONER,
  1028.     10303: STATUS_PRINTER_LOW_YELLOW_TONER,
  1029.     10304: STATUS_PRINTER_SERVICE_REQUEST,
  1030.     10305: STATUS_PRINTER_SERVICE_REQUEST,
  1031.     10306: STATUS_PRINTER_SERVICE_REQUEST,
  1032.     10307: STATUS_PRINTER_SERVICE_REQUEST,
  1033.     10308: STATUS_PRINTER_SERVICE_REQUEST,
  1034.     10309: STATUS_PRINTER_SERVICE_REQUEST,
  1035.     10310: STATUS_PRINTER_SERVICE_REQUEST,
  1036.     10311: STATUS_PRINTER_SERVICE_REQUEST,
  1037.     10312: STATUS_PRINTER_SERVICE_REQUEST,
  1038.     10313: STATUS_PRINTER_SERVICE_REQUEST,
  1039.     10314: STATUS_PRINTER_SERVICE_REQUEST,
  1040.     10315: STATUS_PRINTER_SERVICE_REQUEST,
  1041.     10316: STATUS_PRINTER_SERVICE_REQUEST,
  1042.     10317: STATUS_PRINTER_SERVICE_REQUEST,
  1043.     10318: STATUS_PRINTER_SERVICE_REQUEST,
  1044.     10400: STATUS_PRINTER_NON_HP_INK,
  1045.     10401: STATUS_PRINTER_IDLE,
  1046.     10402: STATUS_PRINTER_SERVICE_REQUEST,
  1047.     10403: STATUS_PRINTER_IDLE,
  1048.     30119: STATUS_PRINTER_MEDIA_JAM,
  1049.     40021: STATUS_PRINTER_DOOR_OPEN,
  1050.     40022: STATUS_PRINTER_MEDIA_JAM,
  1051.     40038: STATUS_PRINTER_LOW_TONER,
  1052.     40600: STATUS_PRINTER_NO_TONER }
  1053. MIN_PJL_ERROR_CODE = 10001
  1054. DEFAULT_PJL_ERROR_CODE = 10001
  1055.  
  1056. def MapPJLErrorCode(error_code, str_code = None):
  1057.     if error_code < MIN_PJL_ERROR_CODE:
  1058.         return STATUS_PRINTER_BUSY
  1059.     if str_code is None:
  1060.         str_code = str(error_code)
  1061.     
  1062.     if len(str_code) < 5:
  1063.         return STATUS_PRINTER_BUSY
  1064.     status_code = PJL_STATUS_MAP.get(error_code, None)
  1065.     log.debug('Mapped PJL error code %d to status code %d' % (error_code, status_code))
  1066.     return status_code
  1067.  
  1068. pjl_code_pat = re.compile('^CODE\\s*=\\s*(\\d.*)$', re.IGNORECASE)
  1069.  
  1070. def StatusType8(dev):
  1071.     
  1072.     try:
  1073.         dev.openPrint()
  1074.     except Error:
  1075.         e = None
  1076.         log.warn(e.msg)
  1077.         status_code = STATUS_PRINTER_BUSY
  1078.  
  1079.     
  1080.     try:
  1081.         dev.writePrint('\x1b%-12345X@PJL INFO STATUS \r\n\x1b%-12345X')
  1082.         pjl_return = dev.readPrint(1024, timeout = 5, allow_short_read = True)
  1083.         dev.close()
  1084.         log.debug_block('PJL return:', pjl_return)
  1085.         str_code = '10001'
  1086.         for line in pjl_return.splitlines():
  1087.             line = line.strip()
  1088.             match = pjl_code_pat.match(line)
  1089.             if match is not None:
  1090.                 str_code = match.group(1)
  1091.                 break
  1092.                 continue
  1093.         
  1094.         log.debug('Code = %s' % str_code)
  1095.         
  1096.         try:
  1097.             error_code = int(str_code)
  1098.         except ValueError:
  1099.             error_code = DEFAULT_PJL_ERROR_CODE
  1100.  
  1101.         log.debug('Error code = %d' % error_code)
  1102.         status_code = MapPJLErrorCode(error_code, str_code)
  1103.     except Error:
  1104.         status_code = STATUS_PRINTER_HARD_ERROR
  1105.     finally:
  1106.         
  1107.         try:
  1108.             dev.closePrint()
  1109.         except Error:
  1110.             pass
  1111.  
  1112.  
  1113.     agents = []
  1114.     if status_code in (STATUS_PRINTER_LOW_TONER, STATUS_PRINTER_LOW_BLACK_TONER):
  1115.         health = AGENT_HEALTH_OK
  1116.         level_trigger = AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT
  1117.         level = 0
  1118.     elif status_code == STATUS_PRINTER_NO_TONER:
  1119.         health = AGENT_HEALTH_MISINSTALLED
  1120.         level_trigger = AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT
  1121.         level = 0
  1122.     else:
  1123.         health = AGENT_HEALTH_OK
  1124.         level_trigger = AGENT_LEVEL_TRIGGER_SUFFICIENT_0
  1125.         level = 100
  1126.     log.debug('Agent: health=%d, level=%d, trigger=%d' % (health, level, level_trigger))
  1127.     agents.append({
  1128.         'kind': AGENT_KIND_TONER_CARTRIDGE,
  1129.         'type': AGENT_TYPE_BLACK,
  1130.         'health': health,
  1131.         'level': level,
  1132.         'level-trigger': level_trigger })
  1133.     if status_code == 40021:
  1134.         top_door = 0
  1135.     else:
  1136.         top_door = 1
  1137.     log.debug('Status code = %d' % status_code)
  1138.     return {
  1139.         'revision': STATUS_REV_UNKNOWN,
  1140.         'agents': agents,
  1141.         'top-door': top_door,
  1142.         'supply-door': top_door,
  1143.         'duplexer': 0,
  1144.         'photo-tray': 0,
  1145.         'in-tray1': 1,
  1146.         'in-tray2': 1,
  1147.         'media-path': 1,
  1148.         'status-code': status_code }
  1149.  
  1150.