home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2007 September / PCWSEP07.iso / Software / Linux / Linux Mint 3.0 Light / LinuxMint-3.0-Light.iso / casper / filesystem.squashfs / usr / lib / hplip / base / status.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2007-04-29  |  24.2 KB  |  884 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. from __future__ import division
  5. import struct
  6. import cStringIO
  7. import xml.parsers.expat as expat
  8. from g import *
  9. from codes import *
  10. import pml
  11. import utils
  12. STATUS_REV_00 = 0
  13. STATUS_REV_01 = 1
  14. STATUS_REV_02 = 2
  15. STATUS_REV_03 = 3
  16. STATUS_REV_04 = 4
  17. STATUS_REV_V = 255
  18. STATUS_REV_UNKNOWN = 254
  19. vstatus_xlate = {
  20.     'busy': STATUS_PRINTER_BUSY,
  21.     'idle': STATUS_PRINTER_IDLE,
  22.     'prnt': STATUS_PRINTER_PRINTING,
  23.     'offf': STATUS_PRINTER_TURNING_OFF,
  24.     'rprt': STATUS_PRINTER_REPORT_PRINTING,
  25.     'cncl': STATUS_PRINTER_CANCELING,
  26.     'iost': STATUS_PRINTER_IO_STALL,
  27.     'dryw': STATUS_PRINTER_DRY_WAIT_TIME,
  28.     'penc': STATUS_PRINTER_PEN_CHANGE,
  29.     'oopa': STATUS_PRINTER_OUT_OF_PAPER,
  30.     'bnej': STATUS_PRINTER_BANNER_EJECT,
  31.     'bnmz': STATUS_PRINTER_BANNER_MISMATCH,
  32.     'phmz': STATUS_PRINTER_PHOTO_MISMATCH,
  33.     'dpmz': STATUS_PRINTER_DUPLEX_MISMATCH,
  34.     'pajm': STATUS_PRINTER_MEDIA_JAM,
  35.     'cars': STATUS_PRINTER_CARRIAGE_STALL,
  36.     'paps': STATUS_PRINTER_PAPER_STALL,
  37.     'penf': STATUS_PRINTER_PEN_FAILURE,
  38.     'erro': STATUS_PRINTER_HARD_ERROR,
  39.     'pwdn': STATUS_PRINTER_POWER_DOWN,
  40.     'fpts': STATUS_PRINTER_FRONT_PANEL_TEST,
  41.     'clno': STATUS_PRINTER_CLEAN_OUT_TRAY_MISSING }
  42. REVISION_2_TYPE_MAP = {
  43.     0: AGENT_TYPE_NONE,
  44.     1: AGENT_TYPE_BLACK,
  45.     2: AGENT_TYPE_CYAN,
  46.     3: AGENT_TYPE_MAGENTA,
  47.     4: AGENT_TYPE_YELLOW,
  48.     5: AGENT_TYPE_BLACK,
  49.     6: AGENT_TYPE_CYAN,
  50.     7: AGENT_TYPE_MAGENTA,
  51.     8: AGENT_TYPE_YELLOW }
  52. STATUS_BLOCK_UNKNOWN = {
  53.     'revision': STATUS_REV_UNKNOWN,
  54.     'agents': [],
  55.     'status-code': STATUS_UNKNOWN }
  56. NUM_PEN_POS = {
  57.     STATUS_REV_00: 16,
  58.     STATUS_REV_01: 16,
  59.     STATUS_REV_02: 16,
  60.     STATUS_REV_03: 18,
  61.     STATUS_REV_04: 22 }
  62. PEN_DATA_SIZE = {
  63.     STATUS_REV_00: 8,
  64.     STATUS_REV_01: 8,
  65.     STATUS_REV_02: 4,
  66.     STATUS_REV_03: 8,
  67.     STATUS_REV_04: 8 }
  68. STATUS_POS = {
  69.     STATUS_REV_00: 14,
  70.     STATUS_REV_01: 14,
  71.     STATUS_REV_02: 14,
  72.     STATUS_REV_03: 16,
  73.     STATUS_REV_04: 20 }
  74.  
  75. def parseSStatus(s, z = ''):
  76.     Z_SIZE = 6
  77.     z1 = []
  78.     if len(z) > 0:
  79.         z_fields = z.split(',')
  80.         for z_field in z_fields:
  81.             if len(z_field) > 2 and z_field[:2] == '05':
  82.                 z1s = z_field[2:]
  83.                 z1 = [ int(x, 16) for x in z1s ]
  84.                 continue
  85.             []
  86.         
  87.     
  88.     s1 = [ int(x, 16) for x in s ]
  89.     revision = s1[1]
  90.     if revision <= revision:
  91.         pass
  92.     elif not revision <= STATUS_REV_04:
  93.         raise AssertionError
  94.     []
  95.     top_door = bool(s1[2] & 0x8L) + s1[2] & 0x1L
  96.     supply_door = bool(s1[3] & 0x8L) + s1[3] & 0x1L
  97.     duplexer = bool(s1[4] & 0xCL) + s1[4] & 0x1L
  98.     photo_tray = bool(s1[5] & 0x8L) + s1[5] & 0x1L
  99.     if revision == STATUS_REV_02:
  100.         in_tray1 = bool(s1[6] & 0x8L) + s1[6] & 0x1L
  101.         in_tray2 = bool(s1[7] & 0x8L) + s1[7] & 0x1L
  102.     else:
  103.         in_tray1 = bool(s1[6] & 0x8L)
  104.         in_tray2 = bool(s1[7] & 0x8L)
  105.     media_path = bool(s1[8] & 0x8L) + (s1[8] & 0x1L) + (bool(s1[18] & 0x2L) << 1)
  106.     status_pos = STATUS_POS[revision]
  107.     status_byte = (s1[status_pos] << 4) + s1[status_pos + 1]
  108.     stat = status_byte + STATUS_PRINTER_BASE
  109.     (pens, pen, c, d) = ([], { }, NUM_PEN_POS[revision] + 1, 0)
  110.     num_pens = s1[NUM_PEN_POS[revision]]
  111.     log.debug('Num pens=%d' % num_pens)
  112.     index = 0
  113.     pen_data_size = PEN_DATA_SIZE[revision]
  114.     for p in range(num_pens):
  115.         info = long(s[c:c + pen_data_size], 16)
  116.         pen['index'] = index
  117.         if pen_data_size == 4:
  118.             pen['type'] = REVISION_2_TYPE_MAP.get(int((info & 0xF000L) >> 0xCL), 0)
  119.             if index < num_pens / 2:
  120.                 pen['kind'] = AGENT_KIND_HEAD
  121.             else:
  122.                 pen['kind'] = AGENT_KIND_SUPPLY
  123.             pen['level-trigger'] = int((info & 0xE00L) >> 0x9L)
  124.             pen['health'] = int((info & 0x180L) >> 0x7L)
  125.             pen['level'] = int(info & 0x7FL)
  126.             pen['id'] = 31
  127.         elif pen_data_size == 8:
  128.             pen['kind'] = bool(info & 0x80000000L) + (bool(info & 0x40000000L) << 0x1L)
  129.             pen['type'] = int((info & 0x3F000000L) >> 0x18L)
  130.             pen['id'] = int((info & 16252928) >> 0x13L)
  131.             pen['level-trigger'] = int((info & 0x70000L) >> 0x10L)
  132.             pen['health'] = int((info & 0xC000L) >> 0xEL)
  133.             pen['level'] = int(info & 0xFFL)
  134.         else:
  135.             log.error('Pen data size error')
  136.         if len(z1) > 0:
  137.             
  138.             try:
  139.                 pen['dvc'] = long(z1s[d + 1:d + 5], 16)
  140.                 pen['virgin'] = bool(z1[d + 5] & 0x8L)
  141.                 pen['hp-ink'] = bool(z1[d + 5] & 0x4L)
  142.                 pen['known'] = bool(z1[d + 5] & 0x2L)
  143.                 pen['ack'] = bool(z1[d + 5] & 0x1L)
  144.             except IndexError:
  145.                 pen['dvc'] = 0
  146.                 pen['virgin'] = 0
  147.                 pen['hp-ink'] = 0
  148.                 pen['known'] = 0
  149.                 pen['ack'] = 0
  150.             except:
  151.                 None<EXCEPTION MATCH>IndexError
  152.             
  153.  
  154.         None<EXCEPTION MATCH>IndexError
  155.         index += 1
  156.         pens.append(pen)
  157.         pen = { }
  158.         c += pen_data_size
  159.         d += Z_SIZE
  160.     
  161.     return {
  162.         'revision': revision,
  163.         'agents': pens,
  164.         'top-door': top_door,
  165.         'status-code': stat,
  166.         'supply-door': supply_door,
  167.         'duplexer': duplexer,
  168.         'photo-tray': photo_tray,
  169.         'in-tray1': in_tray1,
  170.         'in-tray2': in_tray2,
  171.         'media-path': media_path }
  172.  
  173.  
  174. def parseVStatus(s):
  175.     pens = []
  176.     pen = { }
  177.     c = 0
  178.     fields = s.split(',')
  179.     f0 = fields[0]
  180.     if len(f0) == 20:
  181.         pass
  182.     elif len(f0) == 8:
  183.         for p in f0:
  184.             if c == 0:
  185.                 c += 1
  186.                 continue
  187.             if c == 1:
  188.                 if p in ('a', 'A'):
  189.                     pen['type'] = AGENT_TYPE_NONE
  190.                     pen['kind'] = AGENT_KIND_NONE
  191.                 
  192.                 c += 1
  193.                 continue
  194.             if c == 2:
  195.                 pen['health'] = AGENT_HEALTH_OK
  196.                 pen['kind'] = AGENT_KIND_HEAD_AND_SUPPLY
  197.                 if p in ('b', 'B'):
  198.                     pen['type'] = AGENT_TYPE_BLACK
  199.                 elif p in ('c', 'C'):
  200.                     pen['type'] = AGENT_TYPE_CMY
  201.                 elif p in ('d', 'D'):
  202.                     pen['type'] = AGENT_TYPE_KCM
  203.                 elif p in ('u', 'U'):
  204.                     pen['type'] = AGENT_TYPE_NONE
  205.                     pen['health'] = AGENT_HEALTH_MISINSTALLED
  206.                 
  207.                 c += 1
  208.                 continue
  209.             if c == 3:
  210.                 if p == '0':
  211.                     pen['state'] = 1
  212.                 else:
  213.                     pen['state'] = 0
  214.                 pen['level'] = 0
  215.                 i = 8
  216.                 while True:
  217.                     
  218.                     try:
  219.                         f = fields[i]
  220.                     except IndexError:
  221.                         break
  222.  
  223.                     if f[:2] == 'KP' and pen['type'] == AGENT_TYPE_BLACK:
  224.                         pen['level'] = int(f[2:])
  225.                     elif f[:2] == 'CP' and pen['type'] == AGENT_TYPE_CMY:
  226.                         pen['level'] = int(f[2:])
  227.                     
  228.                     i += 1
  229.                 pens.append(pen)
  230.                 pen = { }
  231.                 c = 0
  232.                 continue
  233.         
  234.     
  235.     if fields[2] == 'DN':
  236.         top_lid = 1
  237.     else:
  238.         top_lid = 2
  239.     stat = vstatus_xlate.get(fields[3].lower(), STATUS_PRINTER_IDLE)
  240.     return {
  241.         'revision': STATUS_REV_V,
  242.         'agents': pens,
  243.         'top-lid': top_lid,
  244.         'status-code': stat,
  245.         'supply-lid': SUPPLY_DOOR_NOT_PRESENT,
  246.         'duplexer': DUPLEXER_NOT_PRESENT,
  247.         'photo-tray': PHOTO_TRAY_NOT_PRESENT,
  248.         'in-tray1': IN_TRAY_NOT_PRESENT,
  249.         'in-tray2': IN_TRAY_NOT_PRESENT,
  250.         'media-path': MEDIA_PATH_CUT_SHEET }
  251.  
  252.  
  253. def parseStatus(DeviceID):
  254.     if 'VSTATUS' in DeviceID:
  255.         return parseVStatus(DeviceID['VSTATUS'])
  256.     elif 'S' in DeviceID:
  257.         return parseSStatus(DeviceID['S'], DeviceID.get('Z', ''))
  258.     else:
  259.         return STATUS_BLOCK_UNKNOWN
  260.  
  261.  
  262. def LaserJetDeviceStatusToPrinterStatus(device_status, printer_status, detected_error_state):
  263.     stat = STATUS_PRINTER_IDLE
  264.     if device_status in (pml.DEVICE_STATUS_WARNING, pml.DEVICE_STATUS_DOWN):
  265.         if detected_error_state & pml.DETECTED_ERROR_STATE_LOW_PAPER_MASK and not (detected_error_state & pml.DETECTED_ERROR_STATE_NO_PAPER_MASK):
  266.             stat = STATUS_PRINTER_LOW_PAPER
  267.         elif detected_error_state & pml.DETECTED_ERROR_STATE_NO_PAPER_MASK:
  268.             stat = STATUS_PRINTER_OUT_OF_PAPER
  269.         elif detected_error_state & pml.DETECTED_ERROR_STATE_DOOR_OPEN_MASK:
  270.             stat = STATUS_PRINTER_DOOR_OPEN
  271.         elif detected_error_state & pml.DETECTED_ERROR_STATE_JAMMED_MASK:
  272.             stat = STATUS_PRINTER_MEDIA_JAM
  273.         elif detected_error_state & pml.DETECTED_ERROR_STATE_OUT_CART_MASK:
  274.             stat = STATUS_PRINTER_NO_TONER
  275.         elif detected_error_state & pml.DETECTED_ERROR_STATE_LOW_CART_MASK:
  276.             stat = STATUS_PRINTER_LOW_TONER
  277.         elif detected_error_state == pml.DETECTED_ERROR_STATE_SERVICE_REQUEST_MASK:
  278.             stat = STATUS_PRINTER_SERVICE_REQUEST
  279.         elif detected_error_state & pml.DETECTED_ERROR_STATE_OFFLINE_MASK:
  280.             stat = STATUS_PRINTER_OFFLINE
  281.         
  282.     elif printer_status == pml.PRINTER_STATUS_IDLE:
  283.         stat = STATUS_PRINTER_IDLE
  284.     elif printer_status == pml.PRINTER_STATUS_PRINTING:
  285.         stat = STATUS_PRINTER_PRINTING
  286.     elif printer_status == pml.PRINTER_STATUS_WARMUP:
  287.         stat = STATUS_PRINTER_WARMING_UP
  288.     
  289.     return stat
  290.  
  291. COLORANT_INDEX_TO_AGENT_TYPE_MAP = {
  292.     'other': AGENT_TYPE_UNSPECIFIED,
  293.     'unknown': AGENT_TYPE_UNSPECIFIED,
  294.     'blue': AGENT_TYPE_BLUE,
  295.     'cyan': AGENT_TYPE_CYAN,
  296.     'magenta': AGENT_TYPE_MAGENTA,
  297.     'yellow': AGENT_TYPE_YELLOW,
  298.     'black': AGENT_TYPE_BLACK }
  299. MARKER_SUPPLES_TYPE_TO_AGENT_KIND_MAP = {
  300.     pml.OID_MARKER_SUPPLIES_TYPE_OTHER: AGENT_KIND_UNKNOWN,
  301.     pml.OID_MARKER_SUPPLIES_TYPE_UNKNOWN: AGENT_KIND_UNKNOWN,
  302.     pml.OID_MARKER_SUPPLIES_TYPE_TONER: AGENT_KIND_TONER_CARTRIDGE,
  303.     pml.OID_MARKER_SUPPLIES_TYPE_WASTE_TONER: AGENT_KIND_UNKNOWN,
  304.     pml.OID_MARKER_SUPPLIES_TYPE_INK: AGENT_KIND_SUPPLY,
  305.     pml.OID_MARKER_SUPPLIES_TYPE_INK_CART: AGENT_KIND_HEAD_AND_SUPPLY,
  306.     pml.OID_MARKER_SUPPLIES_TYPE_INK_RIBBON: AGENT_KIND_HEAD_AND_SUPPLY,
  307.     pml.OID_MARKER_SUPPLIES_TYPE_WASTE_INK: AGENT_KIND_UNKNOWN,
  308.     pml.OID_MARKER_SUPPLIES_TYPE_OPC: AGENT_KIND_DRUM_KIT,
  309.     pml.OID_MARKER_SUPPLIES_TYPE_DEVELOPER: AGENT_KIND_UNKNOWN,
  310.     pml.OID_MARKER_SUPPLIES_TYPE_FUSER_OIL: AGENT_KIND_UNKNOWN,
  311.     pml.OID_MARKER_SUPPLIES_TYPE_SOLID_WAX: AGENT_KIND_UNKNOWN,
  312.     pml.OID_MARKER_SUPPLIES_TYPE_RIBBON_WAX: AGENT_KIND_UNKNOWN,
  313.     pml.OID_MARKER_SUPPLIES_TYPE_WASTE_WAX: AGENT_KIND_UNKNOWN,
  314.     pml.OID_MARKER_SUPPLIES_TYPE_FUSER: AGENT_KIND_MAINT_KIT,
  315.     pml.OID_MARKER_SUPPLIES_TYPE_CORONA_WIRE: AGENT_KIND_UNKNOWN,
  316.     pml.OID_MARKER_SUPPLIES_TYPE_FUSER_OIL_WICK: AGENT_KIND_UNKNOWN,
  317.     pml.OID_MARKER_SUPPLIES_TYPE_CLEANER_UNIT: AGENT_KIND_UNKNOWN,
  318.     pml.OID_MARKER_SUPPLIES_TYPE_FUSER_CLEANING_PAD: AGENT_KIND_UNKNOWN,
  319.     pml.OID_MARKER_SUPPLIES_TYPE_TRANSFER_UNIT: AGENT_KIND_TRANSFER_KIT,
  320.     pml.OID_MARKER_SUPPLIES_TYPE_TONER_CART: AGENT_KIND_TONER_CARTRIDGE,
  321.     pml.OID_MARKER_SUPPLIES_TYPE_FUSER_OILER: AGENT_KIND_UNKNOWN,
  322.     pml.OID_MARKER_SUPPLIES_TYPE_ADF_MAINT_KIT: AGENT_KIND_ADF_KIT }
  323.  
  324. def StatusType3(dev, parsedID):
  325.     
  326.     try:
  327.         dev.openPML()
  328.         (result_code, on_off_line) = dev.getPML(pml.OID_ON_OFF_LINE, pml.INT_SIZE_BYTE)
  329.         (result_code, sleep_mode) = dev.getPML(pml.OID_SLEEP_MODE, pml.INT_SIZE_BYTE)
  330.         (result_code, printer_status) = dev.getPML(pml.OID_PRINTER_STATUS, pml.INT_SIZE_BYTE)
  331.         (result_code, device_status) = dev.getPML(pml.OID_DEVICE_STATUS, pml.INT_SIZE_BYTE)
  332.         (result_code, cover_status) = dev.getPML(pml.OID_COVER_STATUS, pml.INT_SIZE_BYTE)
  333.         (result_code, value) = dev.getPML(pml.OID_DETECTED_ERROR_STATE)
  334.     except Error:
  335.         dev.closePML()
  336.         return {
  337.             'revision': STATUS_REV_UNKNOWN,
  338.             'agents': [],
  339.             'top-door': 0,
  340.             'status-code': STATUS_UNKNOWN,
  341.             'supply-door': 0,
  342.             'duplexer': 1,
  343.             'photo-tray': 0,
  344.             'in-tray1': 0,
  345.             'in-tray2': 0,
  346.             'media-path': 0 }
  347.  
  348.     
  349.     try:
  350.         detected_error_state = struct.unpack('B', value[0])[0]
  351.     except IndexError:
  352.         detected_error_state = pml.DETECTED_ERROR_STATE_OFFLINE_MASK
  353.  
  354.     agents = []
  355.     x = 1
  356.     while True:
  357.         log.debug('%s Agent: %d %s' % ('**********', x, '**********'))
  358.         log.debug('OID_MARKER_SUPPLIES_TYPE_%d:' % x)
  359.         oid = (pml.OID_MARKER_SUPPLIES_TYPE_x % x, pml.OID_MARKER_SUPPLIES_TYPE_x_TYPE)
  360.         (result_code, value) = dev.getPML(oid, pml.INT_SIZE_BYTE)
  361.         if result_code != ERROR_SUCCESS or value is None:
  362.             log.debug('End of supply information.')
  363.             break
  364.         
  365.         for a in MARKER_SUPPLES_TYPE_TO_AGENT_KIND_MAP:
  366.             if value == a:
  367.                 agent_kind = MARKER_SUPPLES_TYPE_TO_AGENT_KIND_MAP[a]
  368.                 break
  369.                 continue
  370.         else:
  371.             agent_kind = AGENT_KIND_UNKNOWN
  372.         log.debug('OID_MARKER_SUPPLIES_LEVEL_%d:' % x)
  373.         oid = (pml.OID_MARKER_SUPPLIES_LEVEL_x % x, pml.OID_MARKER_SUPPLIES_LEVEL_x_TYPE)
  374.         (result_code, agent_level) = dev.getPML(oid)
  375.         if result_code != ERROR_SUCCESS:
  376.             log.debug('Failed')
  377.             break
  378.         
  379.         log.debug('agent%d-level: %d' % (x, agent_level))
  380.         log.debug('OID_MARKER_SUPPLIES_MAX_%d:' % x)
  381.         oid = (pml.OID_MARKER_SUPPLIES_MAX_x % x, pml.OID_MARKER_SUPPLIES_MAX_x_TYPE)
  382.         (result_code, agent_max) = dev.getPML(oid)
  383.         if agent_max == 0:
  384.             agent_max = 1
  385.         
  386.         if result_code != ERROR_SUCCESS:
  387.             log.debug('Failed')
  388.             break
  389.         
  390.         log.debug('agent%d-max: %d' % (x, agent_max))
  391.         log.debug('OID_MARKER_SUPPLIES_COLORANT_INDEX_%d:' % x)
  392.         oid = (pml.OID_MARKER_SUPPLIES_COLORANT_INDEX_x % x, pml.OID_MARKER_SUPPLIES_COLORANT_INDEX_x_TYPE)
  393.         (result_code, colorant_index) = dev.getPML(oid)
  394.         if result_code != ERROR_SUCCESS:
  395.             log.debug('Failed')
  396.             agent_type = AGENT_TYPE_BLACK
  397.         else:
  398.             log.debug('Colorant index: %d' % colorant_index)
  399.             log.debug('OID_MARKER_COLORANT_VALUE_%d' % x)
  400.             oid = (pml.OID_MARKER_COLORANT_VALUE_x % colorant_index, pml.OID_MARKER_COLORANT_VALUE_x_TYPE)
  401.             (result_code, colorant_value) = dev.getPML(oid)
  402.             if result_code != ERROR_SUCCESS:
  403.                 log.debug('Failed. Defaulting to black.')
  404.                 agent_type = AGENT_TYPE_BLACK
  405.             
  406.             if agent_kind in (AGENT_KIND_MAINT_KIT, AGENT_KIND_ADF_KIT, AGENT_KIND_DRUM_KIT, AGENT_KIND_TRANSFER_KIT):
  407.                 agent_type = AGENT_TYPE_UNSPECIFIED
  408.             else:
  409.                 agent_type = AGENT_TYPE_BLACK
  410.                 if result_code != ERROR_SUCCESS:
  411.                     log.debug('OID_MARKER_SUPPLIES_DESCRIPTION_%d:' % x)
  412.                     oid = (pml.OID_MARKER_SUPPLIES_DESCRIPTION_x % x, pml.OID_MARKER_SUPPLIES_DESCRIPTION_x_TYPE)
  413.                     (result_code, colorant_value) = dev.getPML(oid)
  414.                     if result_code != ERROR_SUCCESS:
  415.                         log.debug('Failed')
  416.                         break
  417.                     
  418.                     if colorant_value is not None:
  419.                         log.debug('colorant value: %s' % colorant_value)
  420.                         colorant_value = colorant_value.lower().strip()
  421.                         for c in COLORANT_INDEX_TO_AGENT_TYPE_MAP:
  422.                             if colorant_value.find(c) >= 0:
  423.                                 agent_type = COLORANT_INDEX_TO_AGENT_TYPE_MAP[c]
  424.                                 break
  425.                                 continue
  426.                         else:
  427.                             agent_type = AGENT_TYPE_BLACK
  428.                     
  429.                 elif colorant_value is not None:
  430.                     log.debug('colorant value: %s' % colorant_value)
  431.                     agent_type = COLORANT_INDEX_TO_AGENT_TYPE_MAP.get(colorant_value, AGENT_TYPE_BLACK)
  432.                 
  433.                 if agent_type == AGENT_TYPE_NONE:
  434.                     if agent_kind == AGENT_KIND_TONER_CARTRIDGE:
  435.                         agent_type = AGENT_TYPE_BLACK
  436.                     else:
  437.                         agent_type = AGENT_TYPE_UNSPECIFIED
  438.                 
  439.         log.debug('OID_MARKER_STATUS_%d:' % x)
  440.         oid = (pml.OID_MARKER_STATUS_x % x, pml.OID_MARKER_STATUS_x_TYPE)
  441.         (result_code, agent_status) = dev.getPML(oid)
  442.         if result_code != ERROR_SUCCESS:
  443.             log.debug('Failed')
  444.             agent_trigger = AGENT_LEVEL_TRIGGER_SUFFICIENT_0
  445.             agent_health = AGENT_HEALTH_OK
  446.         else:
  447.             agent_trigger = AGENT_LEVEL_TRIGGER_SUFFICIENT_0
  448.             if agent_status is None:
  449.                 agent_health = AGENT_HEALTH_OK
  450.             elif agent_status == pml.OID_MARKER_STATUS_OK:
  451.                 agent_health = AGENT_HEALTH_OK
  452.             elif agent_status == pml.OID_MARKER_STATUS_MISINSTALLED:
  453.                 agent_health = AGENT_HEALTH_MISINSTALLED
  454.             elif agent_status in (pml.OID_MARKER_STATUS_LOW_TONER_CONT, pml.OID_MARKER_STATUS_LOW_TONER_STOP):
  455.                 agent_health = AGENT_HEALTH_OK
  456.                 agent_trigger = AGENT_LEVEL_TRIGGER_MAY_BE_LOW
  457.             else:
  458.                 agent_health = AGENT_HEALTH_OK
  459.         agent_level = int((agent_level / agent_max) * 100)
  460.         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))
  461.         agents.append({
  462.             'kind': agent_kind,
  463.             'type': agent_type,
  464.             'health': agent_health,
  465.             'level': agent_level,
  466.             'level-trigger': agent_trigger })
  467.         x += 1
  468.     log.debug('on_off_line=%d' % on_off_line)
  469.     log.debug('sleep_mode=%d' % sleep_mode)
  470.     log.debug('printer_status=%d' % printer_status)
  471.     log.debug('device_status=%d' % device_status)
  472.     log.debug('cover_status=%d' % cover_status)
  473.     log.debug('detected_error_state=%d (0x%x)' % (detected_error_state, detected_error_state))
  474.     stat = LaserJetDeviceStatusToPrinterStatus(device_status, printer_status, detected_error_state)
  475.     log.debug('Printer status=%d' % stat)
  476.     if stat == STATUS_PRINTER_DOOR_OPEN:
  477.         supply_door = 0
  478.     else:
  479.         supply_door = 1
  480.     return {
  481.         'revision': STATUS_REV_UNKNOWN,
  482.         'agents': agents,
  483.         'top-door': cover_status,
  484.         'status-code': stat,
  485.         'supply-door': supply_door,
  486.         'duplexer': 1,
  487.         'photo-tray': 0,
  488.         'in-tray1': 1,
  489.         'in-tray2': 1,
  490.         'media-path': 1 }
  491.  
  492.  
  493. def setup_panel_translator():
  494.     global PANEL_TRANSLATOR_FUNC
  495.     printables = list('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\n!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~')
  496.     map = { }
  497.     for x in range(0, 256):
  498.         pass
  499.     
  500.     map.update({
  501.         '\x10': '\xab',
  502.         '\x11': '\xbb',
  503.         '\x12': '\xa3',
  504.         '\x13': '\xbb',
  505.         '\x80': '\xab',
  506.         '\x81': '\xbb',
  507.         '\x82': '*',
  508.         '\x83': '*',
  509.         '\x85': '*',
  510.         '\xa0': '\xab',
  511.         '\x1f': '?',
  512.         '=': ' ' })
  513.     (frm, to) = ('', '')
  514.     map_keys = map.keys()
  515.     map_keys.sort()
  516.     for x in map_keys:
  517.         frm = ''.join([
  518.             frm,
  519.             x])
  520.         to = ''.join([
  521.             to,
  522.             map[x]])
  523.     
  524.     PANEL_TRANSLATOR_FUNC = utils.Translator(frm, to)
  525.  
  526. PANEL_TRANSLATOR_FUNC = None
  527. setup_panel_translator()
  528.  
  529. def PanelCheck(dev):
  530.     (line1, line2) = ('', '')
  531.     
  532.     try:
  533.         dev.openPML()
  534.     except Error:
  535.         pass
  536.  
  537.     oids = [
  538.         (pml.OID_HP_LINE1, pml.OID_HP_LINE2),
  539.         (pml.OID_SPM_LINE1, pml.OID_SPM_LINE2)]
  540.     for oid1, oid2 in oids:
  541.         (result, line1) = dev.getPML(oid1)
  542.         if result < pml.ERROR_MAX_OK:
  543.             line1 = PANEL_TRANSLATOR_FUNC(line1).rstrip()
  544.             if '\n' in line1:
  545.                 (line1, line2) = line1.split('\n', 1)
  546.                 break
  547.             
  548.             (result, line2) = dev.getPML(oid2)
  549.             if result < pml.ERROR_MAX_OK:
  550.                 line2 = PANEL_TRANSLATOR_FUNC(line2).rstrip()
  551.                 break
  552.             
  553.         result < pml.ERROR_MAX_OK
  554.     
  555.     if not line1:
  556.         pass
  557.     if not line1:
  558.         pass
  559.     if not line2:
  560.         pass
  561.     return (bool(line2), '', '')
  562.  
  563. BATTERY_HEALTH_MAP = {
  564.     0: AGENT_HEALTH_OK,
  565.     1: AGENT_HEALTH_OVERTEMP,
  566.     2: AGENT_HEALTH_CHARGING,
  567.     3: AGENT_HEALTH_MISINSTALLED,
  568.     4: AGENT_HEALTH_FAILED }
  569. BATTERY_TRIGGER_MAP = {
  570.     0: AGENT_LEVEL_TRIGGER_SUFFICIENT_0,
  571.     1: AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT,
  572.     2: AGENT_LEVEL_TRIGGER_PROBABLY_OUT,
  573.     3: AGENT_LEVEL_TRIGGER_SUFFICIENT_4,
  574.     4: AGENT_LEVEL_TRIGGER_SUFFICIENT_2,
  575.     5: AGENT_LEVEL_TRIGGER_SUFFICIENT_0 }
  576. BATTERY_PML_TRIGGER_MAP = {
  577.     (100, 80): AGENT_LEVEL_TRIGGER_SUFFICIENT_0,
  578.     (79, 60): AGENT_LEVEL_TRIGGER_SUFFICIENT_1,
  579.     (59, 40): AGENT_LEVEL_TRIGGER_SUFFICIENT_2,
  580.     (39, 30): AGENT_LEVEL_TRIGGER_SUFFICIENT_3,
  581.     (29, 20): AGENT_LEVEL_TRIGGER_SUFFICIENT_4,
  582.     (19, 10): AGENT_LEVEL_TRIGGER_MAY_BE_LOW,
  583.     (9, 5): AGENT_LEVEL_TRIGGER_PROBABLY_OUT,
  584.     (4, -1): AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT }
  585.  
  586. def BatteryCheck(dev, status_block):
  587.     try_dynamic_counters = False
  588.     
  589.     try:
  590.         dev.openPML()
  591.     except Error:
  592.         log.debug('PML channel open failed. Trying dynamic counters...')
  593.         try_dynamic_counters = True
  594.     else:
  595.         (result, battery_level) = dev.getPML(pml.OID_BATTERY_LEVEL)
  596.         (result, power_mode) = dev.getPML(pml.OID_POWER_MODE)
  597.         if battery_level is not None and power_mode is not None:
  598.             if power_mode & pml.POWER_MODE_BATTERY_LEVEL_KNOWN and battery_level >= 0:
  599.                 for x in BATTERY_PML_TRIGGER_MAP:
  600.                     if battery_level >= battery_level:
  601.                         pass
  602.                     elif battery_level > x[1]:
  603.                         battery_trigger_level = BATTERY_PML_TRIGGER_MAP[x]
  604.                         break
  605.                         continue
  606.                 
  607.                 if power_mode & pml.POWER_MODE_CHARGING:
  608.                     agent_health = AGENT_HEALTH_CHARGING
  609.                 elif power_mode & pml.POWER_MODE_DISCHARGING:
  610.                     agent_health = AGENT_HEALTH_DISCHARGING
  611.                 else:
  612.                     agent_health = AGENT_HEALTH_OK
  613.                 status_block['agents'].append({
  614.                     'kind': AGENT_KIND_INT_BATTERY,
  615.                     'type': AGENT_TYPE_UNSPECIFIED,
  616.                     'health': agent_health,
  617.                     'level': battery_level,
  618.                     'level-trigger': battery_trigger_level })
  619.             else:
  620.                 status_block['agents'].append({
  621.                     'kind': AGENT_KIND_INT_BATTERY,
  622.                     'type': AGENT_TYPE_UNSPECIFIED,
  623.                     'health': AGENT_HEALTH_UNKNOWN,
  624.                     'level': 0,
  625.                     'level-trigger': AGENT_LEVEL_TRIGGER_SUFFICIENT_0 })
  626.         else:
  627.             try_dynamic_counters = True
  628.         dev.closePML()
  629.  
  630.  
  631.  
  632. def getPenConfiguration(s):
  633.     pens = [ p['type'] for p in s['agents'] ]
  634.     if AGENT_TYPE_NONE in pens:
  635.         if AGENT_TYPE_BLACK in pens:
  636.             return AGENT_CONFIG_BLACK_ONLY
  637.         elif AGENT_TYPE_CMY in pens:
  638.             return AGENT_CONFIG_COLOR_ONLY
  639.         elif AGENT_TYPE_KCM in pens:
  640.             return AGENT_CONFIG_PHOTO_ONLY
  641.         elif AGENT_TYPE_GGK in pens:
  642.             return AGENT_CONFIG_GREY_ONLY
  643.         else:
  644.             return AGENT_CONFIG_INVALID
  645.     elif AGENT_TYPE_BLACK in pens and AGENT_TYPE_CMY in pens:
  646.         return AGENT_CONFIG_COLOR_AND_BLACK
  647.     elif AGENT_TYPE_CMY in pens and AGENT_TYPE_KCM in pens:
  648.         return AGENT_CONFIG_COLOR_AND_PHOTO
  649.     elif AGENT_TYPE_CMY in pens and AGENT_TYPE_GGK in pens:
  650.         return AGENT_CONFIG_COLOR_AND_GREY
  651.     else:
  652.         return AGENT_CONFIG_INVALID
  653.  
  654.  
  655. def getFaxStatus(dev):
  656.     tx_active = False
  657.     rx_active = False
  658.     
  659.     try:
  660.         dev.openPML()
  661.         (result_code, tx_state) = dev.getPML(pml.OID_FAXJOB_TX_STATUS)
  662.         if result_code == ERROR_SUCCESS:
  663.             if tx_state not in (pml.FAXJOB_TX_STATUS_IDLE, pml.FAXJOB_TX_STATUS_DONE):
  664.                 tx_active = True
  665.             
  666.         
  667.         (result_code, rx_state) = dev.getPML(pml.OID_FAXJOB_RX_STATUS)
  668.         if result_code == ERROR_SUCCESS:
  669.             if rx_state not in (pml.FAXJOB_RX_STATUS_IDLE, pml.FAXJOB_RX_STATUS_DONE):
  670.                 rx_active = True
  671.             
  672.     finally:
  673.         dev.closePML()
  674.  
  675.     return (tx_active, rx_active)
  676.  
  677. TYPE6_STATUS_CODE_MAP = {
  678.     0: STATUS_PRINTER_IDLE,
  679.     -19928: STATUS_PRINTER_IDLE,
  680.     -18995: STATUS_PRINTER_CANCELING,
  681.     -17974: STATUS_PRINTER_WARMING_UP,
  682.     -17973: STATUS_PRINTER_PEN_CLEANING,
  683.     -18993: STATUS_PRINTER_BUSY,
  684.     -17949: STATUS_PRINTER_BUSY,
  685.     -19720: STATUS_PRINTER_MANUAL_DUPLEX_BLOCK,
  686.     -19678: STATUS_PRINTER_BUSY,
  687.     -19695: STATUS_PRINTER_OUT_OF_PAPER,
  688.     -17985: STATUS_PRINTER_MEDIA_JAM,
  689.     -19731: STATUS_PRINTER_OUT_OF_PAPER,
  690.     -18974: STATUS_PRINTER_BUSY,
  691.     -19730: STATUS_PRINTER_OUT_OF_PAPER,
  692.     -19729: STATUS_PRINTER_OUT_OF_PAPER,
  693.     -19933: STATUS_PRINTER_HARD_ERROR,
  694.     -17984: STATUS_PRINTER_DOOR_OPEN,
  695.     -19694: STATUS_PRINTER_DOOR_OPEN,
  696.     -18992: STATUS_PRINTER_MANUAL_FEED_BLOCKED,
  697.     -19690: STATUS_PRINTER_MEDIA_JAM,
  698.     -19689: STATUS_PRINTER_MEDIA_JAM,
  699.     -19611: STATUS_PRINTER_MEDIA_JAM,
  700.     -19686: STATUS_PRINTER_MEDIA_JAM,
  701.     -19688: STATUS_PRINTER_MEDIA_JAM,
  702.     -19685: STATUS_PRINTER_MEDIA_JAM,
  703.     -19684: STATUS_PRINTER_MEDIA_JAM,
  704.     -18848: STATUS_PRINTER_MEDIA_JAM,
  705.     -18847: STATUS_PRINTER_MEDIA_JAM,
  706.     -18846: STATUS_PRINTER_MEDIA_JAM,
  707.     -19687: STATUS_PRINTER_MEDIA_JAM,
  708.     -17992: STATUS_PRINTER_MEDIA_JAM,
  709.     -19700: STATUS_PRINTER_HARD_ERROR,
  710.     -17996: STATUS_PRINTER_FUSER_ERROR,
  711.     -17983: STATUS_PRINTER_FUSER_ERROR,
  712.     -17982: STATUS_PRINTER_FUSER_ERROR,
  713.     -17981: STATUS_PRINTER_FUSER_ERROR,
  714.     -17971: STATUS_PRINTER_FUSER_ERROR,
  715.     -17995: STATUS_PRINTER_HARD_ERROR,
  716.     -17994: STATUS_PRINTER_HARD_ERROR,
  717.     -17993: STATUS_PRINTER_HARD_ERROR,
  718.     -18994: STATUS_PRINTER_HARD_ERROR,
  719.     -17986: STATUS_PRINTER_HARD_ERROR,
  720.     -19904: STATUS_PRINTER_HARD_ERROR,
  721.     -19701: STATUS_PRINTER_NON_HP_INK,
  722.     -19613: STATUS_PRINTER_IDLE,
  723.     -19654: STATUS_PRINTER_NON_HP_INK,
  724.     -19682: STATUS_PRINTER_HARD_ERROR,
  725.     -19693: STATUS_PRINTER_IDLE,
  726.     -19752: STATUS_PRINTER_LOW_TONER,
  727.     -19723: STATUS_PRINTER_BUSY,
  728.     -19703: STATUS_PRINTER_BUSY,
  729.     -19739: STATUS_PRINTER_NO_TONER,
  730.     -19927: STATUS_PRINTER_BUSY,
  731.     -19932: STATUS_PRINTER_BUSY,
  732.     -19931: STATUS_PRINTER_BUSY,
  733.     -11989: STATUS_PRINTER_BUSY,
  734.     -11995: STATUS_PRINTER_BUSY,
  735.     -19954: STATUS_PRINTER_CANCELING,
  736.     -19955: STATUS_PRINTER_REPORT_PRINTING,
  737.     -19956: STATUS_PRINTER_REPORT_PRINTING,
  738.     -19934: STATUS_PRINTER_HARD_ERROR,
  739.     -19930: STATUS_PRINTER_BUSY,
  740.     -11990: STATUS_PRINTER_DOOR_OPEN,
  741.     -11999: STATUS_PRINTER_MEDIA_JAM,
  742.     -12000: STATUS_PRINTER_MEDIA_JAM,
  743.     -11998: STATUS_PRINTER_MEDIA_JAM,
  744.     -11986: STATUS_PRINTER_HARD_ERROR,
  745.     -11994: STATUS_PRINTER_BUSY,
  746.     -14967: STATUS_PRINTER_BUSY,
  747.     -19912: STATUS_PRINTER_HARD_ERROR,
  748.     -14962: STATUS_PRINTER_BUSY,
  749.     -14971: STATUS_PRINTER_BUSY,
  750.     -14973: STATUS_PRINTER_BUSY,
  751.     -14972: STATUS_PRINTER_BUSY,
  752.     -14966: STATUS_PRINTER_DOOR_OPEN,
  753.     -14974: STATUS_PRINTER_MEDIA_JAM,
  754.     -14969: STATUS_PRINTER_HARD_ERROR,
  755.     -14968: STATUS_PRINTER_HARD_ERROR,
  756.     -12996: STATUS_PRINTER_BUSY,
  757.     -12994: STATUS_PRINTER_BUSY,
  758.     -12993: STATUS_PRINTER_BUSY,
  759.     -12991: STATUS_PRINTER_BUSY,
  760.     -12995: STATUS_PRINTER_BUSY,
  761.     -12997: STATUS_PRINTER_HARD_ERROR,
  762.     -12990: STATUS_PRINTER_BUSY,
  763.     -12998: STATUS_PRINTER_BUSY,
  764.     -13000: STATUS_PRINTER_DOOR_OPEN,
  765.     -12999: STATUS_PRINTER_MEDIA_JAM,
  766.     -13859: STATUS_PRINTER_BUSY,
  767.     -13858: STATUS_PRINTER_BUSY,
  768.     -13868: STATUS_PRINTER_BUSY,
  769.     -13867: STATUS_PRINTER_BUSY,
  770.     -13857: STATUS_PRINTER_BUSY,
  771.     -13856: STATUS_PRINTER_BUSY,
  772.     -13855: STATUS_PRINTER_BUSY,
  773.     -13854: STATUS_PRINTER_BUSY,
  774.     -13853: STATUS_PRINTER_BUSY,
  775.     -13839: STATUS_PRINTER_BUSY,
  776.     -13842: STATUS_PRINTER_BUSY,
  777.     -13838: STATUS_PRINTER_BUSY,
  778.     -13847: STATUS_PRINTER_BUSY,
  779.     -13846: STATUS_PRINTER_BUSY,
  780.     -13845: STATUS_PRINTER_BUSY,
  781.     -13844: STATUS_PRINTER_BUSY,
  782.     -13840: STATUS_PRINTER_BUSY,
  783.     -13843: STATUS_PRINTER_BUSY,
  784.     -13850: STATUS_PRINTER_BUSY,
  785.     -13851: STATUS_PRINTER_BUSY,
  786.     -13836: STATUS_PRINTER_BUSY,
  787.     -13864: STATUS_PRINTER_BUSY,
  788.     -13863: STATUS_PRINTER_BUSY,
  789.     -13865: STATUS_PRINTER_BUSY,
  790.     -13862: STATUS_PRINTER_BUSY,
  791.     -13837: STATUS_PRINTER_BUSY,
  792.     -13861: STATUS_PRINTER_BUSY,
  793.     -13866: STATUS_PRINTER_BUSY,
  794.     -13841: STATUS_PRINTER_BUSY,
  795.     -13848: STATUS_PRINTER_BUSY,
  796.     -13849: STATUS_PRINTER_BUSY }
  797.  
  798. def StatusType6(dev):
  799.     info_device_status = cStringIO.StringIO()
  800.     info_ssp = cStringIO.StringIO()
  801.     dev.getEWSUrl('/hp/device/info_device_status.xml', info_device_status)
  802.     dev.getEWSUrl('/hp/device/info_ssp.xml', info_ssp)
  803.     info_device_status = info_device_status.getvalue()
  804.     info_ssp = info_ssp.getvalue()
  805.     device_status = { }
  806.     ssp = { }
  807.     if info_device_status:
  808.         
  809.         try:
  810.             device_status = utils.XMLToDictParser().parseXML(info_device_status)
  811.             log.debug_block('info_device_status', info_device_status)
  812.             log.debug(device_status)
  813.         except expat.ExpatError:
  814.             log.error('Device Status XML parse error')
  815.             device_status = { }
  816.         except:
  817.             None<EXCEPTION MATCH>expat.ExpatError
  818.         
  819.  
  820.     None<EXCEPTION MATCH>expat.ExpatError
  821.     if info_ssp:
  822.         
  823.         try:
  824.             ssp = utils.XMLToDictParser().parseXML(info_ssp)
  825.             log.debug_block('info_spp', info_ssp)
  826.             log.debug(ssp)
  827.         except expat.ExpatError:
  828.             log.error('SSP XML parse error')
  829.             ssp = { }
  830.         except:
  831.             None<EXCEPTION MATCH>expat.ExpatError
  832.         
  833.  
  834.     None<EXCEPTION MATCH>expat.ExpatError
  835.     status_code = device_status.get('devicestatuspage-devicestatus-statuslist-status-code-0', 0)
  836.     if not status_code:
  837.         status_code = ssp.get('devicestatuspage-devicestatus-statuslist-status-code-0', 0)
  838.     
  839.     black_supply_level = device_status.get('devicestatuspage-suppliesstatus-blacksupply-percentremaining', 0)
  840.     black_supply_low = ssp.get('suppliesstatuspage-blacksupply-lowreached', 0)
  841.     agents = []
  842.     agents.append({
  843.         'kind': AGENT_KIND_TONER_CARTRIDGE,
  844.         'type': AGENT_TYPE_BLACK,
  845.         'health': 0,
  846.         'level': black_supply_level,
  847.         'level-trigger': 0 })
  848.     if dev.tech_type == TECH_TYPE_COLOR_LASER:
  849.         cyan_supply_level = device_status.get('devicestatuspage-suppliesstatus-cyansupply-percentremaining', 0)
  850.         agents.append({
  851.             'kind': AGENT_KIND_TONER_CARTRIDGE,
  852.             'type': AGENT_TYPE_CYAN,
  853.             'health': 0,
  854.             'level': cyan_supply_level,
  855.             'level-trigger': 0 })
  856.         magenta_supply_level = device_status.get('devicestatuspage-suppliesstatus-magentasupply-percentremaining', 0)
  857.         agents.append({
  858.             'kind': AGENT_KIND_TONER_CARTRIDGE,
  859.             'type': AGENT_TYPE_MAGENTA,
  860.             'health': 0,
  861.             'level': magenta_supply_level,
  862.             'level-trigger': 0 })
  863.         yellow_supply_level = device_status.get('devicestatuspage-suppliesstatus-yellowsupply-percentremaining', 0)
  864.         agents.append({
  865.             'kind': AGENT_KIND_TONER_CARTRIDGE,
  866.             'type': AGENT_TYPE_YELLOW,
  867.             'health': 0,
  868.             'level': yellow_supply_level,
  869.             'level-trigger': 0 })
  870.     
  871.     return {
  872.         'revision': STATUS_REV_UNKNOWN,
  873.         'agents': agents,
  874.         'top-door': 0,
  875.         'status-code': 0,
  876.         'supply-door': 0,
  877.         'duplexer': 1,
  878.         'photo-tray': 0,
  879.         'in-tray1': 1,
  880.         'in-tray2': 1,
  881.         'media-path': 1,
  882.         'status-code': TYPE6_STATUS_CODE_MAP.get(status_code, STATUS_PRINTER_IDLE) }
  883.  
  884.