102
107
def __init__(self, device_uri, printer_name, event_code,
103
108
username=prop.username, job_id=0, title='',
106
self.device_uri = unicode(utils.xrstrip(device_uri, '\x00'))[:128].encode('utf-8')
107
self.printer_name = unicode(utils.xrstrip(printer_name, '\x00'))[:128].encode('utf-8')
110
# UniStr = lambda title: isinstance(title, str) and utils.xrstrip(title, '\x00')[:128] or utils.xrstrip(title, '\x00')[:128].encode('utf-8')
111
self.device_uri = UniStr(device_uri)
112
self.printer_name = UniStr(printer_name)
108
113
self.event_code = int(event_code)
109
self.username = unicode(utils.xrstrip(username, '\x00'))[:32].encode('utf-8')
114
self.username = UniStr(username)
110
115
self.job_id = int(job_id)
111
self.title = unicode(utils.xrstrip(title, '\x00'))[:128].encode('utf-8')
116
self.title = UniStr(title)
114
119
self.timedate = float(timedate)
1829
#Check if device itself is sending the supplies info. If so, then in that case we need not check model.dat static data and
1830
#compare with region, kind and type values.
1831
dynamic_sku_data = False
1832
for agent in agents:
1834
if agent['agent-sku'] != '':
1835
dynamic_sku_data = True
1810
mq_agent_kind = self.mq.get('r%d-agent%d-kind' % (r_value, a), -1)
1812
if mq_agent_kind == -1:
1815
mq_agent_type = self.mq.get('r%d-agent%d-type' % (r_value, a), 0)
1816
mq_agent_sku = self.mq.get('r%d-agent%d-sku' % (r_value, a), '')
1820
log.debug("Looking for kind=%d, type=%d..." % (mq_agent_kind, mq_agent_type))
1821
for agent in agents:
1842
if dynamic_sku_data:
1846
mq_agent_sku = agent['agent-sku']
1822
1847
agent_kind = agent['kind']
1823
1848
agent_type = agent['type']
1825
if agent_kind == mq_agent_kind and \
1826
agent_type == mq_agent_type:
1851
mq_agent_kind = self.mq.get('r%d-agent%d-kind' % (r_value, a), -1)
1852
if mq_agent_kind == -1:
1854
mq_agent_type = self.mq.get('r%d-agent%d-type' % (r_value, a), 0)
1855
mq_agent_sku = self.mq.get('r%d-agent%d-sku' % (r_value, a), '')
1858
log.debug("Looking for kind=%d, type=%d..." % (mq_agent_kind, mq_agent_type))
1859
for agent in agents:
1860
agent_kind = agent['kind']
1861
agent_type = agent['type']
1863
if agent_kind == mq_agent_kind and \
1864
agent_type == mq_agent_type:
1831
1869
log.debug("found: r%d-kind%d-type%d" % (r_value, agent_kind, agent_type))
1848
1886
# if agent health is OK, check for low supplies. If low, use
1849
1887
# the agent level trigger description for the agent description.
1850
1888
# Otherwise, report the agent health.
1851
if (status_code == STATUS_PRINTER_IDLE or status_code == STATUS_PRINTER_OUT_OF_INK) and \
1889
if (status_code == STATUS_PRINTER_POWER_SAVE or status_code == STATUS_PRINTER_IDLE or status_code == STATUS_PRINTER_OUT_OF_INK) and \
1852
1890
(agent_health == AGENT_HEALTH_OK or
1853
1891
(agent_health == AGENT_HEALTH_FAIR_MODERATE and agent_kind == AGENT_KIND_HEAD)) and \
1854
1892
agent_level_trigger >= AGENT_LEVEL_TRIGGER_MAY_BE_LOW:
2111
2149
def readEWS_LEDM(self, bytes_to_read, stream=None, timeout=prop.read_timeout, allow_short_read=True):
2112
2150
return self.__readChannel(self.openEWS_LEDM, bytes_to_read, stream, timeout, allow_short_read)
2152
def readLEDM(self, bytes_to_read, stream=None, timeout=prop.read_timeout, allow_short_read=True):
2153
return self.__readChannel(self.openLEDM, bytes_to_read, stream, timeout, allow_short_read)
2155
def readMarvell_EWS(self, bytes_to_read, stream=None, timeout=prop.read_timeout, allow_short_read=True):
2156
return self.__readChannel(self.openMarvell_EWS, bytes_to_read, stream, timeout, allow_short_read)
2114
2158
def readSoapFax(self, bytes_to_read, stream=None, timeout=prop.read_timeout, allow_short_read=True):
2115
2159
return self.__readChannel(self.openSoapFax, bytes_to_read, stream, timeout, allow_short_read)
2194
2238
def writeEWS_LEDM(self, data):
2195
2239
return self.__writeChannel(self.openEWS_LEDM, data)
2241
def writeLEDM(self, data):
2242
return self.__writeChannel(self.openLEDM, data)
2244
def writeMarvell_EWS(self, data):
2245
return self.__writeChannel(self.openMarvell_EWS, data)
2197
2247
def writeCfgDownload(self, data):
2198
2248
return self.__writeChannel(self.openCfgDownload, data)
2445
2495
url2 = "%s&loc=%s" % (self.device_uri.replace('hpfax:', 'hp:'), url)
2497
opener = LocalOpenerEWS_LEDM({})
2500
return opener.open_hp(url2, data, footer)
2502
return opener.open_hp(url2, data)
2504
log.debug("Status read failed: %s" % url2)
2506
self.closeEWS_LEDM()
2508
def getUrl_LEDM(self, url, stream, footer=""):
2510
url2 = "%s&loc=%s" % (self.device_uri.replace('hpfax:', 'hp:'), url)
2447
2512
opener = LocalOpener_LEDM({})
2450
2515
return opener.open_hp(url2, data, footer)
2452
return opener.open_hp(url2, data)
2517
return opener.open_hp(url2, data)
2454
2519
log.debug("Status read failed: %s" % url2)
2457
self.closeEWS_LEDM()
2524
def FetchLEDMUrl(self, url, footer=""):
2525
data_fp = cStringIO.StringIO()
2527
data = self.getUrl_LEDM(url, data_fp, footer)
2529
data = self.getUrl_LEDM(url, data_fp)
2531
data = data.split('\r\n\r\n', 1)[1]
2533
data = status.clean(data)
2536
#-------------------------For LEDM SOAP PROTOCOL(FAX) Devices----------------------------------------------------------------------#
2538
def FetchEWS_LEDMUrl(self, url, footer=""):
2539
data_fp = cStringIO.StringIO()
2541
data = self.getEWSUrl_LEDM(url, data_fp, footer)
2543
data = self.getEWSUrl_LEDM(url, data_fp)
2545
data = data.split('\r\n\r\n', 1)[1]
2547
data = status.clean(data)
2550
def readAttributeFromXml_EWS(self, uri, attribute):
2551
stream = cStringIO.StringIO()
2552
data = self.FetchEWS_LEDMUrl(uri)
2554
log.error("Unable To read the XML data from device")
2556
xmlDict = utils.XMLToDictParser().parseXML(data)
2558
#return str(xmlDict[attribute])
2559
return xmlDict[attribute]
2563
#---------------------------------------------------------------------------------------------------#
2458
2565
def readAttributeFromXml(self,uri,attribute):
2459
2566
stream = cStringIO.StringIO()
2460
data = status.StatusType10FetchUrl(self,uri)
2567
data = self.FetchLEDMUrl(uri)
2462
2569
log.error("Unable To read the XML data from device")
2464
xmlDict = utils.XMLToDictParser().parseXML(data)
2465
return str(xmlDict[attribute])
2571
xmlDict = utils.XMLToDictParser().parseXML(data)
2573
return str(xmlDict[attribute])
2467
2577
def downloadFirmware(self, usb_bus_id=None, usb_device_id=None): # Note: IDs not currently used
2469
2579
filename = os.path.join(prop.data_dir, "firmware", self.model.lower() + '.fw.gz')
2561
2671
reply = xStringIO()
2563
while dev.readEWS_LEDM(8080, reply, timeout=3):
2567
return reply.getvalue()
2673
while dev.readEWS_LEDM(512, reply, timeout=3):
2677
return reply.getvalue()
2679
# URLs: hp:/usb/HP_OfficeJet_7500?serial=00XXXXXXXXXX&loc=/hp/device/info_device_status.xml
2680
class LocalOpener_LEDM(urllib.URLopener):
2681
def open_hp(self, url, dev, foot=""):
2682
log.debug("open_hp(%s)" % url)
2684
match_obj = http_pat_url.search(url)
2685
loc = url.split("=")[url.count("=")]
2690
dev.writeLEDM("""%s""" % foot)
2692
dev.writeLEDM("""POST %s HTTP/1.1\r\nContent-Type:text/xml\r\nContent-Length:%s\r\nAccept-Encoding: UTF-8\r\nHost:localhost\r\nUser-Agent:hplip\r\n\r\n """ % (loc, len(foot)))
2693
dev.writeLEDM("""%s""" % foot)
2695
dev.writeLEDM("""GET %s HTTP/1.1\r\nAccept: text/plain\r\nHost:localhost\r\nUser-Agent:hplip\r\n\r\n""" % loc)
2699
while dev.readLEDM(512, reply, timeout=3):
2702
#TODO:Need to add following code in order to improve the delay.
2703
#exp_end_of_data="0\r\n\r\n"
2704
#num_of_bytes_read = dev.readEWS_LEDM(512, reply, timeout=5)
2706
#while num_of_bytes_read:
2707
#temp_buf = xStringIO()
2708
#num_of_bytes_read = dev.readEWS_LEDM(512, temp_buf, timeout=5)
2709
#reply.write(temp_buf.getvalue())
2711
#if num_of_bytes_read == 5 and exp_end_of_data == temp_buf.getvalue():
2716
return reply.getvalue()