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 / fax / fax.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2007-04-29  |  37.3 KB  |  1,333 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. from __future__ import generators
  5. import sys
  6. import os
  7. import os.path as os
  8. import mmap
  9. import struct
  10. import time
  11. import threading
  12. import Queue
  13. import socket
  14. from cStringIO import StringIO
  15. from base.g import *
  16. from base.codes import *
  17. from base import device, utils, status, pml, msg
  18. from base.kirbybase import KirbyBase
  19. from prnt import cups
  20.  
  21. try:
  22.     import coverpages
  23. except ImportError:
  24.     pass
  25.  
  26. PAGE_FLAG_NONE = 0
  27. PAGE_FLAG_NEW_PAGE = 1
  28. PAGE_FLAG_END_PAGE = 2
  29. PAGE_FLAG_NEW_DOC = 4
  30. PAGE_FLAG_END_DOC = 8
  31. PAGE_FLAG_END_STREAM = 16
  32. MAJOR_VER = 2
  33. MINOR_VER = 0
  34. MFPDTF_RASTER_BITMAP = 0
  35. MFPDTF_RASTER_GRAYMAP = 1
  36. MFPDTF_RASTER_MH = 2
  37. MFPDTF_RASTER_MR = 3
  38. MFPDTF_RASTER_MMR = 4
  39. MFPDTF_RASTER_RGB = 5
  40. MFPDTF_RASTER_YCC411 = 6
  41. MFPDTF_RASTER_JPEG = 7
  42. MFPDTF_RASTER_PCL = 8
  43. MFPDTF_RASTER_NOT = 9
  44. DT_UNKNOWN = 0
  45. DT_FAX_IMAGES = 1
  46. DT_SCANNED_IMAGES = 2
  47. DT_DIAL_STRINGS = 3
  48. DT_DEMO_PAGES = 4
  49. DT_SPEED_DIALS = 5
  50. DT_FAX_LOGS = 6
  51. DT_CFG_PARMS = 7
  52. DT_LANG_STRS = 8
  53. DT_JUNK_FAX_CSIDS = 9
  54. DT_REPORT_STRS = 10
  55. DT_FONTS = 11
  56. DT_TTI_BITMAP = 12
  57. DT_COUNTERS = 13
  58. DT_DEF_PARMS = 14
  59. DT_SCAN_OPTIONS = 15
  60. DT_FW_JOB_TABLE = 17
  61. RT_START_PAGE = 0
  62. RT_RASTER = 1
  63. RT_END_PAGE = 2
  64. FIXED_HEADER_SIZE = 8
  65. IMAGE_VARIANT_HEADER_SIZE = 10
  66. DIAL_STRINGS_VARIANT_HEADER_SIZE = 6
  67. FAX_IMAGE_VARIANT_HEADER_SIZE = 74
  68. SOP_RECORD_SIZE = 36
  69. RASTER_RECORD_SIZE = 4
  70. EOP_RECORD_SIZE = 12
  71. DIAL_STRING_RECORD_SIZE = 51
  72. PAGE_FLAG_NEW_PAGE = 1
  73. PAGE_FLAG_END_PAGE = 2
  74. PAGE_FLAG_NEW_DOC = 4
  75. PAGE_FLAG_END_DOC = 8
  76. PAGE_FLAG_END_STREAM = 16
  77. SRC_UNKNOWN = 0
  78. SRC_HOST = 2
  79. SRC_SCANNER = 5
  80. SRC_HOST_THEN_SCANNER = 6
  81. SRC_SCANNER_THEN_HOST = 7
  82. TTI_NONE = 0
  83. TTI_PREPENDED_TO_IMAGE = 1
  84. TTI_OVERLAYED_ON_IMAGE = 2
  85. RASTER_DATA_SIZE = 504
  86. STATUS_IDLE = 0
  87. STATUS_PROCESSING_FILES = 1
  88. STATUS_DIALING = 2
  89. STATUS_CONNECTING = 3
  90. STATUS_SENDING = 4
  91. STATUS_COMPLETED = 5
  92. STATUS_CREATING_COVER_PAGE = 6
  93. STATUS_ERROR = 7
  94. STATUS_BUSY = 8
  95. STATUS_CLEANUP = 9
  96. EVENT_FAX_SEND_CANCELED = 1
  97. FILE_HEADER_SIZE = 28
  98. PAGE_HEADER_SIZE = 24
  99.  
  100. class FaxAddressBook(KirbyBase):
  101.     
  102.     def __init__(self):
  103.         KirbyBase.__init__(self)
  104.         t = os.path.expanduser('~/.hplip.fab')
  105.         self._fab = os.path.expanduser('~/hpfax/fab.db')
  106.         fax_dir = os.path.expanduser('~/hpfax')
  107.         if not os.path.exists(fax_dir):
  108.             os.mkdir(fax_dir)
  109.         
  110.         if os.path.exists(t) and not os.path.exists(self._fab):
  111.             import shutil
  112.             shutil.move(t, self._fab)
  113.         
  114.         if not os.path.exists(self._fab):
  115.             log.debug('Creating new fax address book: %s' % self._fab)
  116.             self.create()
  117.         
  118.  
  119.     
  120.     def create(self):
  121.         return KirbyBase.create(self, self._fab, [
  122.             'name:str',
  123.             'title:str',
  124.             'firstname:str',
  125.             'lastname:str',
  126.             'fax:str',
  127.             'groups:str',
  128.             'notes:str'])
  129.  
  130.     
  131.     def filename(self):
  132.         return self._fab
  133.  
  134.     
  135.     def last_modification_time(self):
  136.         return os.stat(self._fab).st_mtime
  137.  
  138.     
  139.     def close(self):
  140.         return KirbyBase.close(self)
  141.  
  142.     
  143.     def insert(self, values):
  144.         return KirbyBase.insert(self, self._fab, values)
  145.  
  146.     
  147.     def insertBatch(self, batchRecords):
  148.         return KirbyBase.insertBatch(self, self._fab, batchRecords)
  149.  
  150.     
  151.     def update(self, fields, searchData, updates, filter = None, useRegExp = False):
  152.         return KirbyBase.update(self, self._fab, fields, searchData, updates, filter, useRegExp)
  153.  
  154.     
  155.     def delete(self, fields, searchData, useRegExp = False):
  156.         return KirbyBase.delete(self, self._fab, fields, searchData, useRegExp)
  157.  
  158.     
  159.     def select(self, fields, searchData, filter = None, useRegExp = False, sortFields = [], sortDesc = [], returnType = 'list', rptSettings = [
  160.         0,
  161.         False]):
  162.         return KirbyBase.select(self, self._fab, fields, searchData, filter, useRegExp, sortFields, sortDesc, returnType, rptSettings)
  163.  
  164.     
  165.     def pack(self):
  166.         return KirbyBase.pack(self, self._fab)
  167.  
  168.     
  169.     def validate(self):
  170.         return KirbyBase.validate(self, self._fab)
  171.  
  172.     
  173.     def drop(self):
  174.         return KirbyBase.drop(self, self._fab)
  175.  
  176.     
  177.     def getFieldNames(self):
  178.         return KirbyBase.getFieldNames(self, self._fab)
  179.  
  180.     
  181.     def getFieldTypes(self):
  182.         return KirbyBase.getFieldTypes(self, self._fab)
  183.  
  184.     
  185.     def len(self):
  186.         return KirbyBase.len(self, self._fab)
  187.  
  188.     
  189.     def GetEntryByRecno(self, recno):
  190.         return AddressBookEntry(self.select([
  191.             'recno'], [
  192.             recno])[0])
  193.  
  194.     
  195.     def AllRecords(self):
  196.         return self.select([
  197.             'recno'], [
  198.             '*'])
  199.  
  200.     
  201.     def AllRecordEntries(self):
  202.         return [ AddressBookEntry(rec) for rec in self.select([
  203.             'recno'], [
  204.             '*']) ]
  205.  
  206.     
  207.     def GroupEntries(self, group):
  208.         return _[1]
  209.  
  210.     
  211.     def AllGroups(self):
  212.         temp = { }
  213.         for abe in self.AllRecordEntries():
  214.             for g in abe.group_list:
  215.                 temp.setdefault(g)
  216.             
  217.         
  218.         return temp.keys()
  219.  
  220.     
  221.     def UpdateGroupEntries(self, group_name, member_entries):
  222.         for entry in self.AllRecordEntries():
  223.             if entry.name in member_entries:
  224.                 if group_name not in entry.group_list:
  225.                     entry.group_list.append(group_name)
  226.                     self.update([
  227.                         'recno'], [
  228.                         entry.recno], [
  229.                         ','.join(entry.group_list)], [
  230.                         'groups'])
  231.                 
  232.             group_name not in entry.group_list
  233.             if group_name in entry.group_list:
  234.                 entry.group_list.remove(group_name)
  235.                 self.update([
  236.                     'recno'], [
  237.                     entry.recno], [
  238.                     ','.join(entry.group_list)], [
  239.                     'groups'])
  240.                 continue
  241.         
  242.  
  243.     
  244.     def DeleteGroup(self, group_name):
  245.         for entry in self.AllRecordEntries():
  246.             if group_name in entry.group_list:
  247.                 entry.group_list.remove(group_name)
  248.                 self.update([
  249.                     'recno'], [
  250.                     entry.recno], [
  251.                     ','.join(entry.group_list)], [
  252.                     'groups'])
  253.                 continue
  254.         
  255.  
  256.  
  257.  
  258. class AddressBookEntry(object):
  259.     
  260.     def __init__(self, rec = None):
  261.         if rec is not None:
  262.             rec = [ '' for x in rec ]
  263.             (self.recno, self.name, self.title, self.firstname, self.lastname, self.fax, self.groups, self.notes) = rec
  264.             self.group_list = []
  265.             if len(self.groups):
  266.                 for g in self.groups.split(','):
  267.                     self.group_list.append(g.strip())
  268.                 
  269.             
  270.         
  271.  
  272.     
  273.     def __str__(self):
  274.         return 'Recno=%d, Name=%s, Title=%s, First=%s, Last=%s, Fax=%s, Groups=%s, Notes=%s\n' % (self.recno, self.name, self.title, self.firstname, self.lastname, self.fax, self.group_list, self.notes)
  275.  
  276.  
  277.  
  278. class FaxDevice(device.Device):
  279.     
  280.     def __init__(self, device_uri = None, printer_name = None, hpssd_sock = None, hpiod_sock = None, callback = None):
  281.         device.Device.__init__(self, device_uri, printer_name, hpssd_sock, hpiod_sock, callback)
  282.         self.send_fax_thread = None
  283.         self.upload_log_thread = None
  284.  
  285.     
  286.     def setPhoneNum(self, num):
  287.         return self.setPML(pml.OID_FAX_LOCAL_PHONE_NUM, str(num))
  288.  
  289.     
  290.     def getPhoneNum(self):
  291.         return utils.printable(str(self.getPML(pml.OID_FAX_LOCAL_PHONE_NUM)[1]))
  292.  
  293.     phone_num = property(getPhoneNum, setPhoneNum, doc = 'OID_FAX_LOCAL_PHONE_NUM')
  294.     
  295.     def setStationName(self, name):
  296.         return self.setPML(pml.OID_FAX_STATION_NAME, str(name))
  297.  
  298.     
  299.     def getStationName(self):
  300.         return utils.printable(str(self.getPML(pml.OID_FAX_STATION_NAME)[1]))
  301.  
  302.     station_name = property(getStationName, setStationName, doc = 'OID_FAX_STATION_NAME')
  303.     
  304.     def setDateAndTime(self):
  305.         t = time.localtime()
  306.         p = struct.pack('BBBBBBB', t[0] - 2000, t[1], t[2], t[6] + 1, t[3], t[4], t[5])
  307.         log.debug(repr(p))
  308.         return self.setPML(pml.OID_DATE_AND_TIME, p)
  309.  
  310.     
  311.     def uploadLog(self):
  312.         if not self.isUloadLogActive():
  313.             self.upload_log_thread = UploadLogThread(self)
  314.             self.upload_log_thread.start()
  315.             return True
  316.         else:
  317.             return False
  318.  
  319.     
  320.     def isUploadLogActive(self):
  321.         if self.upload_log_thread is not None:
  322.             return self.upload_log_thread.isAlive()
  323.         else:
  324.             return False
  325.  
  326.     
  327.     def waitForUploadLogThread(self):
  328.         if self.upload_log_thread is not None and self.upload_log_thread.isAlive():
  329.             self.upload_log_thread.join()
  330.         
  331.  
  332.     
  333.     def sendFaxes(self, phone_num_list, fax_file_list, cover_message = '', cover_re = '', cover_func = None, printer_name = '', update_queue = None, event_queue = None):
  334.         if not self.isSendFaxActive():
  335.             self.send_fax_thread = FaxSendThread(self, phone_num_list, fax_file_list, cover_message, cover_re, cover_func, printer_name, update_queue, event_queue)
  336.             self.send_fax_thread.start()
  337.             return True
  338.         else:
  339.             return False
  340.  
  341.     
  342.     def isSendFaxActive(self):
  343.         if self.send_fax_thread is not None:
  344.             return self.send_fax_thread.isAlive()
  345.         else:
  346.             return False
  347.  
  348.     
  349.     def waitForSendFaxThread(self):
  350.         if self.send_fax_thread is not None and self.send_fax_thread.isAlive():
  351.             self.send_fax_thread.join()
  352.         
  353.  
  354.  
  355.  
  356. class UploadLogThread(threading.Thread):
  357.     
  358.     def __init__(self, dev):
  359.         threading.Thread.__init__(self)
  360.         self.dev = dev
  361.  
  362.     
  363.     def run(self):
  364.         STATE_DONE = 0
  365.         STATE_ABORT = 10
  366.         STATE_SUCCESS = 20
  367.         STATE_BUSY = 25
  368.         STATE_DEVICE_OPEN = 28
  369.         STATE_CHECK_IDLE = 30
  370.         STATE_REQUEST_START = 40
  371.         STATE_WAIT_FOR_ACTIVE = 50
  372.         STATE_UPLOAD_DATA = 60
  373.         STATE_DEVICE_CLOSE = 70
  374.         state = STATE_CHECK_IDLE
  375.         while state != STATE_DONE:
  376.             if state == STATE_ABORT:
  377.                 continue
  378.             if state == STATE_SUCCESS:
  379.                 continue
  380.             if state == STATE_BUSY:
  381.                 continue
  382.             if state == STATE_DEVICE_OPEN:
  383.                 state = STATE_REQUEST_START
  384.                 
  385.                 try:
  386.                     self.dev.open()
  387.                 except Error:
  388.                     e = None
  389.                     log.error('Unable to open device (%s).' % e.msg)
  390.                     state = STATE_ERROR
  391.  
  392.                 
  393.                 try:
  394.                     dev.setPML(pml.OID_UPLOAD_TIMEOUT, pml.DEFAULT_UPLOAD_TIMEOUT)
  395.                 except Error:
  396.                     state = STATE_ERROR
  397.                 except:
  398.                     None<EXCEPTION MATCH>Error
  399.                 
  400.  
  401.             None<EXCEPTION MATCH>Error
  402.             if state == STATE_CHECK_IDLE:
  403.                 state = STATE_REQUEST_START
  404.                 ul_state = self.getCfgUploadState()
  405.                 if ul_state != pml.UPDN_STATE_IDLE:
  406.                     state = STATE_BUSY
  407.                 
  408.             ul_state != pml.UPDN_STATE_IDLE
  409.             if state == STATE_REQUEST_START:
  410.                 state = STATE_WAIT_FOR_ACTIVE
  411.                 self.dev.setPML(pml.OID_FAX_CFG_UPLOAD_DATA_TYPE, pml.FAX_CFG_UPLOAD_DATA_TYPE_FAXLOGS)
  412.                 self.dev.setPML(pml.OID_DEVICE_CFG_UPLOAD, pml.UPDN_STATE_REQSTART)
  413.                 continue
  414.             if state == STATE_WAIT_FOR_ACTIVE:
  415.                 state = STATE_UPLOAD_DATA
  416.                 tries = 0
  417.                 while True:
  418.                     tries += 1
  419.                     ul_state = self.getCfgUploadState()
  420.                     if ul_state == pml.UPDN_STATE_XFERACTIVE:
  421.                         break
  422.                     
  423.                     if ul_state in (pml.UPDN_STATE_ERRORABORT, pml.UPDN_STATE_XFERDONE):
  424.                         log.error('Cfg upload aborted!')
  425.                         state = STATE_ERROR
  426.                         break
  427.                     
  428.                     if tries > 10:
  429.                         state = STATE_ERROR
  430.                         log.error('Unable to get into active state!')
  431.                         break
  432.                     
  433.                     time.sleep(0.5)
  434.                 continue
  435.             if state == STATE_UPLOAD_DATA:
  436.                 continue
  437.             if state == STATE_DEVICE_CLOSE:
  438.                 self.dev.close()
  439.                 continue
  440.  
  441.  
  442.  
  443. class FaxSendThread(threading.Thread):
  444.     
  445.     def __init__(self, dev, phone_num_list, fax_file_list, cover_message = '', cover_re = '', cover_func = None, printer_name = '', update_queue = None, event_queue = None):
  446.         threading.Thread.__init__(self)
  447.         self.dev = dev
  448.         self.phone_num_list = phone_num_list
  449.         self.fax_file_list = fax_file_list
  450.         self.update_queue = update_queue
  451.         self.event_queue = event_queue
  452.         self.cover_message = cover_message
  453.         self.cover_re = cover_re
  454.         self.cover_func = cover_func
  455.         self.current_printer = printer_name
  456.         self.stream = StringIO()
  457.         self.prev_update = ''
  458.         self.remove_temp_file = False
  459.  
  460.     
  461.     def run(self):
  462.         results = { }
  463.         STATE_DONE = 0
  464.         STATE_ABORTED = 10
  465.         STATE_SUCCESS = 20
  466.         STATE_BUSY = 25
  467.         STATE_READ_SENDER_INFO = 30
  468.         STATE_PRERENDER = 40
  469.         STATE_COUNT_PAGES = 50
  470.         STATE_NEXT_RECIPIENT = 60
  471.         STATE_COVER_PAGE = 70
  472.         STATE_SINGLE_FILE = 80
  473.         STATE_MERGE_FILES = 90
  474.         STATE_SINGLE_FILE = 100
  475.         STATE_SEND_FAX = 110
  476.         STATE_CLEANUP = 120
  477.         STATE_ERROR = 130
  478.         next_recipient = self.next_recipient_gen()
  479.         state = STATE_READ_SENDER_INFO
  480.         self.rendered_file_list = []
  481.         while state != STATE_DONE:
  482.             if self.check_for_cancel():
  483.                 state = STATE_ABORTED
  484.             
  485.             log.debug('STATE=(%d, 0, 0)' % state)
  486.             if state == STATE_ABORTED:
  487.                 log.error('Aborted by user.')
  488.                 self.write_queue((STATUS_IDLE, 0, ''))
  489.                 state = STATE_CLEANUP
  490.                 continue
  491.             if state == STATE_SUCCESS:
  492.                 log.debug('Success.')
  493.                 self.write_queue((STATUS_COMPLETED, 0, ''))
  494.                 state = STATE_CLEANUP
  495.                 continue
  496.             if state == STATE_ERROR:
  497.                 log.error('Error, aborting.')
  498.                 self.write_queue((STATUS_ERROR, 0, ''))
  499.                 state = STATE_CLEANUP
  500.                 continue
  501.             if state == STATE_BUSY:
  502.                 log.error('Device busy, aborting.')
  503.                 self.write_queue((STATUS_BUSY, 0, ''))
  504.                 state = STATE_CLEANUP
  505.                 continue
  506.             if state == STATE_READ_SENDER_INFO:
  507.                 log.debug('%s State: Get sender info' % '********************')
  508.                 state = STATE_PRERENDER
  509.                 
  510.                 try:
  511.                     self.dev.open()
  512.                 except Error:
  513.                     e = None
  514.                     log.error('Unable to open device (%s).' % e.msg)
  515.                     state = STATE_ERROR
  516.                 else:
  517.                     
  518.                     try:
  519.                         self.sender_name = self.dev.station_name
  520.                         log.debug('Sender name=%s' % self.sender_name)
  521.                         self.sender_fax = self.dev.phone_num
  522.                         log.debug('Sender fax=%s' % self.sender_fax)
  523.                     except Error:
  524.                         log.error('PML get failed!')
  525.                         state = STATE_ERROR
  526.  
  527.                 finally:
  528.                     self.dev.close()
  529.  
  530.                 continue
  531.             if state == STATE_PRERENDER:
  532.                 log.debug('%s State: Pre-render non-G3 files' % '********************')
  533.                 state = STATE_COUNT_PAGES
  534.                 cover_page_present = False
  535.                 log.debug(self.fax_file_list)
  536.                 for fax_file in self.fax_file_list:
  537.                     (fax_file_name, fax_file_type, fax_file_desc, fax_file_title, fax_file_pages) = fax_file
  538.                     if fax_file_type == 'application/hplip-fax-coverpage':
  539.                         cover_page_present = True
  540.                         log.debug('Skipping coverpage')
  541.                     else:
  542.                         self.rendered_file_list.append((fax_file_name, 'application/hplip-fax', 'HP Fax', fax_file_title))
  543.                         log.debug('Processing pre-rendered file: %s (%d pages)' % (fax_file_name, fax_file_pages))
  544.                     if self.check_for_cancel():
  545.                         state = STATE_ABORTED
  546.                         continue
  547.                 
  548.                 log.debug(self.rendered_file_list)
  549.                 continue
  550.             if state == STATE_COUNT_PAGES:
  551.                 log.debug('%s State: Get total page count' % '********************')
  552.                 state = STATE_NEXT_RECIPIENT
  553.                 recipient_file_list = self.rendered_file_list[:]
  554.                 log.debug('Counting total pages...')
  555.                 self.job_total_pages = 0
  556.                 log.debug(recipient_file_list)
  557.                 i = 0
  558.                 for fax_file in recipient_file_list:
  559.                     fax_file_name = fax_file[0]
  560.                     log.debug('Processing file (counting pages): %s...' % fax_file_name)
  561.                     if os.path.exists(fax_file_name):
  562.                         results[fax_file_name] = ERROR_SUCCESS
  563.                         fax_file_fd = file(fax_file_name, 'r')
  564.                         header = fax_file_fd.read(FILE_HEADER_SIZE)
  565.                         (magic, version, total_pages, hort_dpi, vert_dpi, page_size, resolution, encoding, reserved1, reserved2) = self.decode_fax_header(header)
  566.                         if magic != 'hplip_g3':
  567.                             log.error('Invalid file header. Bad magic.')
  568.                             results[fax_file_name] = ERROR_FAX_INVALID_FAX_FILE
  569.                             state = STATE_ERROR
  570.                             continue
  571.                         
  572.                         if not i:
  573.                             (job_hort_dpi, job_vert_dpi, job_page_size, job_resolution, job_encoding) = (hort_dpi, vert_dpi, page_size, resolution, encoding)
  574.                             i += 1
  575.                         elif job_hort_dpi != hort_dpi and job_vert_dpi != vert_dpi and job_page_size != page_size and job_resolution != resolution or job_encoding != encoding:
  576.                             log.error('Incompatible options for file: %s' % fax_file_name)
  577.                             results[fax_file_name] = ERROR_FAX_INCOMPATIBLE_OPTIONS
  578.                             state = STATE_ERROR
  579.                         
  580.                         log.debug('Magic=%s Ver=%d Pages=%d hDPI=%d vDPI=%d Size=%d Res=%d Enc=%d' % (magic, version, total_pages, hort_dpi, vert_dpi, page_size, resolution, encoding))
  581.                         self.job_total_pages += total_pages
  582.                         fax_file_fd.close()
  583.                     else:
  584.                         log.error('Unable to find HP Fax file: %s' % fax_file_name)
  585.                         results[fax_file_name] = ERROR_FAX_FILE_NOT_FOUND
  586.                         state = STATE_ERROR
  587.                         break
  588.                     if self.check_for_cancel():
  589.                         state = STATE_ABORTED
  590.                         break
  591.                         continue
  592.                 
  593.                 if cover_page_present:
  594.                     self.job_total_pages += 1
  595.                 
  596.                 log.debug('Total fax pages=%d' % self.job_total_pages)
  597.                 continue
  598.             if state == STATE_NEXT_RECIPIENT:
  599.                 log.debug('%s State: Next recipient' % '********************')
  600.                 state = STATE_COVER_PAGE
  601.                 
  602.                 try:
  603.                     recipient = next_recipient.next()
  604.                     log.debug('Processing for recipient %s' % recipient.name)
  605.                 except StopIteration:
  606.                     state = STATE_SUCCESS
  607.                     log.debug('Last recipient.')
  608.                     continue
  609.  
  610.                 recipient_file_list = self.rendered_file_list[:]
  611.                 continue
  612.             if state == STATE_COVER_PAGE:
  613.                 log.debug('%s State: Render cover page' % '********************')
  614.                 if self.job_total_pages > 1:
  615.                     state = STATE_MERGE_FILES
  616.                 else:
  617.                     state = STATE_SINGLE_FILE
  618.                 if cover_page_present:
  619.                     log.debug('Creating cover page for recipient: %s' % recipient.name)
  620.                     (fax_file, canceled) = self.render_cover_page(recipient)
  621.                     if canceled:
  622.                         state = STATE_ABORTED
  623.                     elif not fax_file:
  624.                         state = STATE_ERROR
  625.                     else:
  626.                         recipient_file_list.insert(0, (fax_file, 'application/hplip-fax', 'HP Fax', 'Cover Page'))
  627.                         log.debug('Cover page G3 file: %s' % fax_file)
  628.                         results[fax_file] = ERROR_SUCCESS
  629.                 
  630.             cover_page_present
  631.             if state == STATE_SINGLE_FILE:
  632.                 log.debug('%s State: Handle single file' % '********************')
  633.                 state = STATE_SEND_FAX
  634.                 log.debug('Processing single file...')
  635.                 f = recipient_file_list[0][0]
  636.                 
  637.                 try:
  638.                     f_fd = file(f, 'r')
  639.                 except IOError:
  640.                     log.error('Unable to open fax file: %s' % f)
  641.                     state = STATE_ERROR
  642.  
  643.                 header = f_fd.read(FILE_HEADER_SIZE)
  644.                 (magic, version, total_pages, hort_dpi, vert_dpi, page_size, resolution, encoding, reserved1, reserved2) = self.decode_fax_header(header)
  645.                 results[f] = ERROR_SUCCESS
  646.                 if magic != 'hplip_g3':
  647.                     log.error('Invalid file header. Bad magic.')
  648.                     results[f] = ERROR_FAX_INVALID_FAX_FILE
  649.                     state = STATE_ERROR
  650.                 
  651.                 log.debug('Magic=%s Ver=%d Pages=%d hDPI=%d vDPI=%d Size=%d Res=%d Enc=%d' % (magic, version, total_pages, hort_dpi, vert_dpi, page_size, resolution, encoding))
  652.                 f_fd.close()
  653.                 continue
  654.             if state == STATE_MERGE_FILES:
  655.                 log.debug('%s State: Merge multiple files' % '********************')
  656.                 log.debug(recipient_file_list)
  657.                 log.debug('Merging g3 files...')
  658.                 state = STATE_SEND_FAX
  659.                 self.remove_temp_file = True
  660.                 if self.job_total_pages:
  661.                     (f_fd, f) = utils.make_temp_file()
  662.                     log.debug('Temp file=%s' % f)
  663.                     data = struct.pack('>8sBIHHBBBII', 'hplip_g3', 0x1L, self.job_total_pages, job_hort_dpi, job_vert_dpi, job_page_size, job_resolution, job_encoding, 0x0L, 0x0L)
  664.                     os.write(f_fd, data)
  665.                     job_page_num = 1
  666.                     for fax_file in recipient_file_list:
  667.                         fax_file_name = fax_file[0]
  668.                         log.debug('Processing file: %s...' % fax_file_name)
  669.                         if results[fax_file_name] == ERROR_SUCCESS:
  670.                             fax_file_fd = file(fax_file_name, 'r')
  671.                             header = fax_file_fd.read(FILE_HEADER_SIZE)
  672.                             (magic, version, total_pages, hort_dpi, vert_dpi, page_size, resolution, encoding, reserved1, reserved2) = self.decode_fax_header(header)
  673.                             if magic != 'hplip_g3':
  674.                                 log.error('Invalid file header. Bad magic.')
  675.                                 state = STATE_ERROR
  676.                                 break
  677.                             
  678.                             log.debug('Magic=%s Ver=%d Pages=%d hDPI=%d vDPI=%d Size=%d Res=%d Enc=%d' % (magic, version, total_pages, hort_dpi, vert_dpi, page_size, resolution, encoding))
  679.                             for p in range(total_pages):
  680.                                 header = fax_file_fd.read(PAGE_HEADER_SIZE)
  681.                                 (page_num, ppr, rpp, bytes_to_read, thumbnail_bytes, reserved2) = self.decode_page_header(header)
  682.                                 if page_num == -1:
  683.                                     log.error('Page header error')
  684.                                     state - STATE_ERROR
  685.                                     break
  686.                                 
  687.                                 header = struct.pack('>IIIIII', job_page_num, ppr, rpp, bytes_to_read, thumbnail_bytes, 0x0L)
  688.                                 os.write(f_fd, header)
  689.                                 self.write_queue((STATUS_PROCESSING_FILES, job_page_num, ''))
  690.                                 log.debug('Page=%d PPR=%d RPP=%d BPP=%d Thumb=%s' % (page_num, ppr, rpp, bytes_to_read, thumbnail_bytes))
  691.                                 os.write(f_fd, fax_file_fd.read(bytes_to_read))
  692.                                 job_page_num += 1
  693.                             
  694.                             fax_file_fd.close()
  695.                             if self.check_for_cancel():
  696.                                 state = STATE_ABORTED
  697.                                 break
  698.                             
  699.                         self.check_for_cancel()
  700.                         log.error('Skipping file: %s' % fax_file_name)
  701.                     
  702.                     os.close(f_fd)
  703.                     log.debug('Total pages=%d' % self.job_total_pages)
  704.                 
  705.             self.job_total_pages
  706.             if state == STATE_SEND_FAX:
  707.                 log.debug('%s State: Send fax' % '********************')
  708.                 state = STATE_NEXT_RECIPIENT
  709.                 FAX_SEND_STATE_DONE = 0
  710.                 FAX_SEND_STATE_ABORT = 10
  711.                 FAX_SEND_STATE_ERROR = 20
  712.                 FAX_SEND_STATE_BUSY = 25
  713.                 FAX_SEND_STATE_SUCCESS = 30
  714.                 FAX_SEND_STATE_DEVICE_OPEN = 40
  715.                 FAX_SEND_STATE_SET_TOKEN = 50
  716.                 FAX_SEND_STATE_EARLY_OPEN = 60
  717.                 FAX_SEND_STATE_SET_PARAMS = 70
  718.                 FAX_SEND_STATE_CHECK_IDLE = 80
  719.                 FAX_SEND_STATE_START_REQUEST = 90
  720.                 FAX_SEND_STATE_LATE_OPEN = 100
  721.                 FAX_SEND_STATE_SEND_DIAL_STRINGS = 110
  722.                 FAX_SEND_STATE_SEND_FAX_HEADER = 120
  723.                 FAX_SEND_STATE_SEND_PAGES = 130
  724.                 FAX_SEND_STATE_SEND_END_OF_STREAM = 140
  725.                 FAX_SEND_STATE_WAIT_FOR_COMPLETE = 150
  726.                 FAX_SEND_STATE_RESET_TOKEN = 160
  727.                 FAX_SEND_STATE_CLOSE_SESSION = 170
  728.                 monitor_state = False
  729.                 fax_send_state = FAX_SEND_STATE_DEVICE_OPEN
  730.                 while fax_send_state != FAX_SEND_STATE_DONE:
  731.                     if self.check_for_cancel():
  732.                         log.error('Fax send aborted.')
  733.                         fax_send_state = FAX_SEND_STATE_ABORT
  734.                     
  735.                     if monitor_state:
  736.                         fax_state = self.getFaxDownloadState()
  737.                         if fax_state not in (pml.UPDN_STATE_XFERACTIVE, pml.UPDN_STATE_XFERDONE):
  738.                             log.error('D/L error state=%d' % fax_state)
  739.                             fax_send_state = FAX_SEND_STATE_ERROR
  740.                             state = STATE_ERROR
  741.                         
  742.                     
  743.                     log.debug('STATE=(%d, %d, 0)' % (STATE_SEND_FAX, fax_send_state))
  744.                     if fax_send_state == FAX_SEND_STATE_ABORT:
  745.                         monitor_state = False
  746.                         fax_send_state = FAX_SEND_STATE_RESET_TOKEN
  747.                         state = STATE_ABORTED
  748.                         continue
  749.                     if fax_send_state == FAX_SEND_STATE_ERROR:
  750.                         log.error('Fax send error.')
  751.                         monitor_state = False
  752.                         fax_send_state = FAX_SEND_STATE_RESET_TOKEN
  753.                         state = STATE_ERROR
  754.                         continue
  755.                     if fax_send_state == FAX_SEND_STATE_BUSY:
  756.                         log.error('Fax device busy.')
  757.                         monitor_state = False
  758.                         fax_send_state = FAX_SEND_STATE_RESET_TOKEN
  759.                         state = STATE_BUSY
  760.                         continue
  761.                     if fax_send_state == FAX_SEND_STATE_SUCCESS:
  762.                         log.debug('Fax send success.')
  763.                         monitor_state = False
  764.                         fax_send_state = FAX_SEND_STATE_RESET_TOKEN
  765.                         state = STATE_NEXT_RECIPIENT
  766.                         continue
  767.                     if fax_send_state == FAX_SEND_STATE_DEVICE_OPEN:
  768.                         log.debug('%s State: Open device' % '********************')
  769.                         fax_send_state = FAX_SEND_STATE_SET_TOKEN
  770.                         
  771.                         try:
  772.                             self.dev.open()
  773.                         except Error:
  774.                             e = None
  775.                             log.error('Unable to open device (%s).' % e.msg)
  776.                             fax_send_state = FAX_SEND_STATE_ERROR
  777.  
  778.                         if self.dev.device_state == DEVICE_STATE_NOT_FOUND:
  779.                             fax_send_state = FAX_SEND_STATE_ERROR
  780.                         
  781.                     self.dev.device_state == DEVICE_STATE_NOT_FOUND
  782.                     if fax_send_state == FAX_SEND_STATE_SET_TOKEN:
  783.                         log.debug('%s State: Acquire fax token' % '********************')
  784.                         
  785.                         try:
  786.                             (result_code, token) = self.dev.getPML(pml.OID_FAX_TOKEN)
  787.                         except Error:
  788.                             log.debug('Unable to acquire fax token (1).')
  789.                             fax_send_state = FAX_SEND_STATE_EARLY_OPEN
  790.  
  791.                     None if result_code > pml.ERROR_MAX_OK else check_token == token
  792.                     if fax_send_state == FAX_SEND_STATE_EARLY_OPEN:
  793.                         log.debug('%s State: Early open' % '********************')
  794.                         fax_send_state = FAX_SEND_STATE_CHECK_IDLE
  795.                         if self.dev.fax_type == FAX_TYPE_BLACK_SEND_EARLY_OPEN:
  796.                             log.debug('Opening fax channel.')
  797.                             
  798.                             try:
  799.                                 self.dev.openFax()
  800.                             except Error:
  801.                                 e = None
  802.                                 log.error('Unable to open channel (%s).' % e.msg)
  803.                                 fax_send_state = FAX_SEND_STATE_ERROR
  804.                             except:
  805.                                 None<EXCEPTION MATCH>Error
  806.                             
  807.  
  808.                         None<EXCEPTION MATCH>Error
  809.                         log.debug('Skipped.')
  810.                         continue
  811.                     if fax_send_state == FAX_SEND_STATE_CHECK_IDLE:
  812.                         log.debug('%s State: Check idle' % '********************')
  813.                         fax_send_state = FAX_SEND_STATE_START_REQUEST
  814.                         dl_state = self.getFaxDownloadState()
  815.                         tx_status = self.getFaxJobTxStatus()
  816.                         rx_status = self.getFaxJobRxStatus()
  817.                         if dl_state == pml.UPDN_STATE_IDLE and dl_state == pml.UPDN_STATE_ERRORABORT or dl_state == pml.UPDN_STATE_XFERDONE:
  818.                             if tx_status == pml.FAXJOB_TX_STATUS_IDLE or tx_status == pml.FAXJOB_TX_STATUS_DONE:
  819.                                 pass
  820.                         None if rx_status == pml.FAXJOB_RX_STATUS_IDLE or rx_status == pml.FAXJOB_RX_STATUS_DONE else state == pml.UPDN_STATE_IDLE
  821.                         fax_send_state = FAX_SEND_STATE_BUSY
  822.                         continue
  823.                     if fax_send_state == FAX_SEND_STATE_START_REQUEST:
  824.                         log.debug('%s State: Request start' % '********************')
  825.                         fax_send_state = FAX_SEND_STATE_SET_PARAMS
  826.                         dl_state = self.getFaxDownloadState()
  827.                         if dl_state == pml.UPDN_STATE_IDLE:
  828.                             self.dev.setPML(pml.OID_FAX_DOWNLOAD, pml.UPDN_STATE_REQSTART)
  829.                             time.sleep(1)
  830.                             log.debug('Waiting for active state...')
  831.                             i = 0
  832.                             while i < 10:
  833.                                 log.debug('Try: %d' % i)
  834.                                 
  835.                                 try:
  836.                                     dl_state = self.getFaxDownloadState()
  837.                                 except Error:
  838.                                     log.error('PML/SNMP error')
  839.                                     fax_send_state = FAX_SEND_STATE_ERROR
  840.                                     break
  841.  
  842.                                 if dl_state == pml.UPDN_STATE_XFERACTIVE:
  843.                                     break
  844.                                 
  845.                                 time.sleep(1)
  846.                                 self.dev.setPML(pml.OID_FAX_DOWNLOAD, pml.UPDN_STATE_REQSTART)
  847.                                 i += 1
  848.                             log.error('Could not get into active state!')
  849.                             fax_send_state = FAX_SEND_STATE_BUSY
  850.                             monitor_state = True
  851.                         else:
  852.                             log.error('Could not get into idle state!')
  853.                             fax_send_state = FAX_SEND_STATE_BUSY
  854.                     dl_state == pml.UPDN_STATE_IDLE
  855.                     if fax_send_state == FAX_SEND_STATE_SET_PARAMS:
  856.                         log.debug('%s State: Set params' % '********************')
  857.                         fax_send_state = FAX_SEND_STATE_LATE_OPEN
  858.                         
  859.                         try:
  860.                             self.dev.setPML(pml.OID_DEV_DOWNLOAD_TIMEOUT, pml.DEFAULT_DOWNLOAD_TIMEOUT)
  861.                             self.dev.setPML(pml.OID_FAXJOB_TX_TYPE, pml.FAXJOB_TX_TYPE_HOST_ONLY)
  862.                             log.debug('Setting date and time on device.')
  863.                             self.dev.setDateAndTime()
  864.                         except Error:
  865.                             e = None
  866.                             log.error('PML/SNMP error (%s)' % e.msg)
  867.                             fax_send_state = FAX_SEND_STATE_ERROR
  868.                         except:
  869.                             None<EXCEPTION MATCH>Error
  870.                         
  871.  
  872.                     None<EXCEPTION MATCH>Error
  873.                     if fax_send_state == FAX_SEND_STATE_LATE_OPEN:
  874.                         log.debug('%s State: Late open' % '********************')
  875.                         fax_send_state = FAX_SEND_STATE_SEND_DIAL_STRINGS
  876.                         if self.dev.fax_type == FAX_TYPE_BLACK_SEND_LATE_OPEN:
  877.                             log.debug('Opening fax channel.')
  878.                             
  879.                             try:
  880.                                 self.dev.openFax()
  881.                             except Error:
  882.                                 log.error('Unable to open channel.')
  883.                                 fax_send_state = FAX_SEND_STATE_ERROR
  884.                             except:
  885.                                 None<EXCEPTION MATCH>Error
  886.                             
  887.  
  888.                         None<EXCEPTION MATCH>Error
  889.                         log.debug('Skipped.')
  890.                         continue
  891.                     if fax_send_state == FAX_SEND_STATE_SEND_DIAL_STRINGS:
  892.                         log.debug('%s State: Send dial strings' % '********************')
  893.                         fax_send_state = FAX_SEND_STATE_SEND_FAX_HEADER
  894.                         log.debug('Dialing: %s' % recipient.fax)
  895.                         log.debug('Sending dial strings...')
  896.                         self.create_mfpdtf_fixed_header(DT_DIAL_STRINGS, True, PAGE_FLAG_NEW_DOC | PAGE_FLAG_END_DOC | PAGE_FLAG_END_STREAM)
  897.                         self.create_mfpdtf_dial_strings(recipient.fax)
  898.                         
  899.                         try:
  900.                             self.write_stream()
  901.                         except Error:
  902.                             log.error('Channel write error.')
  903.                             fax_send_state = FAX_SEND_STATE_ERROR
  904.                         except:
  905.                             None<EXCEPTION MATCH>Error
  906.                         
  907.  
  908.                     None<EXCEPTION MATCH>Error
  909.                     if fax_send_state == FAX_SEND_STATE_SEND_FAX_HEADER:
  910.                         log.debug('%s State: Send fax header' % '********************')
  911.                         fax_send_state = FAX_SEND_STATE_SEND_PAGES
  912.                         
  913.                         try:
  914.                             ff = file(f, 'r')
  915.                         except IOError:
  916.                             log.error('Unable to read fax file.')
  917.                             fax_send_state = FAX_SEND_STATE_ERROR
  918.                             continue
  919.  
  920.                         
  921.                         try:
  922.                             header = ff.read(FILE_HEADER_SIZE)
  923.                         except IOError:
  924.                             log.error('Unable to read fax file.')
  925.                             fax_send_state = FAX_SEND_STATE_ERROR
  926.                             continue
  927.  
  928.                         (magic, version, total_pages, hort_dpi, vert_dpi, page_size, resolution, encoding, reserved1, reserved2) = self.decode_fax_header(header)
  929.                     None if magic != 'hplip_g3' else None<EXCEPTION MATCH>Error
  930.                     if fax_send_state == FAX_SEND_STATE_SEND_PAGES:
  931.                         log.debug('%s State: Send pages' % '********************')
  932.                         fax_send_state = FAX_SEND_STATE_SEND_END_OF_STREAM
  933.                         page = StringIO()
  934.                         for p in range(total_pages):
  935.                             if self.check_for_cancel():
  936.                                 fax_send_state = FAX_SEND_STATE_ABORT
  937.                             
  938.                             if fax_send_state == FAX_SEND_STATE_ABORT:
  939.                                 break
  940.                             
  941.                             
  942.                             try:
  943.                                 header = ff.read(PAGE_HEADER_SIZE)
  944.                             except IOError:
  945.                                 log.error('Unable to read fax file.')
  946.                                 fax_send_state = FAX_SEND_STATE_ERROR
  947.                                 continue
  948.  
  949.                             (page_num, ppr, rpp, bytes_to_read, thumbnail_bytes, reserved2) = self.decode_page_header(header)
  950.                             log.debug('Page=%d PPR=%d RPP=%d BPP=%d Thumb=%d' % (page_num, ppr, rpp, bytes_to_read, thumbnail_bytes))
  951.                             page.write(ff.read(bytes_to_read))
  952.                             thumbnail = ff.read(thumbnail_bytes)
  953.                             page.seek(0)
  954.                             self.create_mfpdtf_fixed_header(DT_FAX_IMAGES, page_flags = PAGE_FLAG_NEW_PAGE)
  955.                             self.create_sop_record(page_num, hort_dpi, vert_dpi, ppr, rpp, encoding)
  956.                             
  957.                             try:
  958.                                 data = page.read(RASTER_DATA_SIZE)
  959.                             except IOError:
  960.                                 log.error('Unable to read fax file.')
  961.                                 fax_send_state = FAX_SEND_STATE_ERROR
  962.                                 continue
  963.  
  964.                             if data == '':
  965.                                 log.error('No data!')
  966.                                 fax_send_state = FAX_SEND_STATE_ERROR
  967.                                 continue
  968.                             
  969.                             self.create_raster_data_record(data)
  970.                             total_read = RASTER_DATA_SIZE
  971.                             while True:
  972.                                 data = page.read(RASTER_DATA_SIZE)
  973.                                 total_read += RASTER_DATA_SIZE
  974.                                 self.getFaxDownloadState()
  975.                                 if data == '':
  976.                                     self.create_eop_record(rpp)
  977.                                     
  978.                                     try:
  979.                                         self.write_stream()
  980.                                     except Error:
  981.                                         log.error('Channel write error.')
  982.                                         fax_send_state = FAX_SEND_STATE_ERROR
  983.  
  984.                                     break
  985.                                 else:
  986.                                     
  987.                                     try:
  988.                                         self.write_stream()
  989.                                     except Error:
  990.                                         log.error('Channel write error.')
  991.                                         fax_send_state = FAX_SEND_STATE_ERROR
  992.                                         break
  993.  
  994.                                 status = self.getFaxJobTxStatus()
  995.                                 while status == pml.FAXJOB_TX_STATUS_DIALING:
  996.                                     self.write_queue((STATUS_DIALING, 0, recipient.fax))
  997.                                     time.sleep(1)
  998.                                     if self.check_for_cancel():
  999.                                         fax_send_state = FAX_SEND_STATE_ABORT
  1000.                                         break
  1001.                                     
  1002.                                     dl_state = self.getFaxDownloadState()
  1003.                                     if dl_state == pml.UPDN_STATE_ERRORABORT:
  1004.                                         fax_send_state = FAX_SEND_STATE_ERROR
  1005.                                         break
  1006.                                     
  1007.                                     status = self.getFaxJobTxStatus()
  1008.                                 if fax_send_state not in (FAX_SEND_STATE_ABORT, FAX_SEND_STATE_ERROR):
  1009.                                     while status == pml.FAXJOB_TX_STATUS_CONNECTING:
  1010.                                         self.write_queue((STATUS_CONNECTING, 0, recipient.fax))
  1011.                                         time.sleep(1)
  1012.                                         if self.check_for_cancel():
  1013.                                             fax_send_state = FAX_SEND_STATE_ABORT
  1014.                                             break
  1015.                                         
  1016.                                         dl_state = self.getFaxDownloadState()
  1017.                                         if dl_state == pml.UPDN_STATE_ERRORABORT:
  1018.                                             fax_send_state = FAX_SEND_STATE_ERROR
  1019.                                             break
  1020.                                         
  1021.                                         status = self.getFaxJobTxStatus()
  1022.                                 
  1023.                                 if status == pml.FAXJOB_TX_STATUS_TRANSMITTING:
  1024.                                     self.write_queue((STATUS_SENDING, page_num, recipient.fax))
  1025.                                 
  1026.                                 self.create_mfpdtf_fixed_header(DT_FAX_IMAGES, page_flags = 0)
  1027.                                 self.create_raster_data_record(data)
  1028.                                 if fax_send_state in (FAX_SEND_STATE_ABORT, FAX_SEND_STATE_ERROR):
  1029.                                     break
  1030.                                     continue
  1031.                             page.truncate(0)
  1032.                             page.seek(0)
  1033.                         
  1034.                     if fax_send_state == FAX_SEND_STATE_SEND_END_OF_STREAM:
  1035.                         log.debug('%s State: Send EOS' % '********************')
  1036.                         fax_send_state = FAX_SEND_STATE_WAIT_FOR_COMPLETE
  1037.                         log.debug('End of stream...')
  1038.                         self.create_mfpdtf_fixed_header(DT_FAX_IMAGES, False, PAGE_FLAG_END_STREAM)
  1039.                         
  1040.                         try:
  1041.                             self.write_stream()
  1042.                         except Error:
  1043.                             log.error('Channel write error.')
  1044.                             fax_send_state = FAX_SEND_STATE_ERROR
  1045.  
  1046.                         monitor_state = False
  1047.                         continue
  1048.                     if fax_send_state == FAX_SEND_STATE_WAIT_FOR_COMPLETE:
  1049.                         log.debug('%s State: Wait for completion' % '********************')
  1050.                         fax_send_state = FAX_SEND_STATE_WAIT_FOR_COMPLETE
  1051.                         time.sleep(1)
  1052.                         status = self.getFaxJobTxStatus()
  1053.                         if status == pml.FAXJOB_TX_STATUS_DIALING:
  1054.                             self.write_queue((STATUS_DIALING, 0, recipient.fax))
  1055.                         elif status == pml.FAXJOB_TX_STATUS_TRANSMITTING:
  1056.                             self.write_queue((STATUS_SENDING, page_num, recipient.fax))
  1057.                         elif status in (pml.FAXJOB_TX_STATUS_DONE, pml.FAXJOB_RX_STATUS_IDLE):
  1058.                             fax_send_state = FAX_SEND_STATE_RESET_TOKEN
  1059.                             state = STATE_NEXT_RECIPIENT
  1060.                         else:
  1061.                             self.write_queue((STATUS_SENDING, page_num, recipient.fax))
  1062.                     status == pml.FAXJOB_TX_STATUS_DIALING
  1063.                     if fax_send_state == FAX_SEND_STATE_RESET_TOKEN:
  1064.                         self.write_queue((STATUS_CLEANUP, 0, ''))
  1065.                         log.debug('%s State: Release fax token' % '********************')
  1066.                         
  1067.                         try:
  1068.                             self.dev.setPML(pml.OID_FAX_TOKEN, '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
  1069.                         except Error:
  1070.                             log.error('Unable to release fax token.')
  1071.  
  1072.                         fax_send_state = FAX_SEND_STATE_CLOSE_SESSION
  1073.                         continue
  1074.                     if fax_send_state == FAX_SEND_STATE_CLOSE_SESSION:
  1075.                         log.debug('%s State: Close session' % '********************')
  1076.                         fax_send_state = FAX_SEND_STATE_DONE
  1077.                         log.debug('Closing session...')
  1078.                         
  1079.                         try:
  1080.                             mm.close()
  1081.                         except NameError:
  1082.                             pass
  1083.  
  1084.                         
  1085.                         try:
  1086.                             ff.close()
  1087.                         except NameError:
  1088.                             pass
  1089.  
  1090.                         if self.dev.fax_type == FAX_TYPE_BLACK_SEND_LATE_OPEN:
  1091.                             log.debug('Closing fax channel.')
  1092.                             self.dev.closeFax()
  1093.                         
  1094.                         self.dev.setPML(pml.OID_FAX_DOWNLOAD, pml.UPDN_STATE_IDLE)
  1095.                         time.sleep(1)
  1096.                         if self.dev.fax_type == FAX_TYPE_BLACK_SEND_EARLY_OPEN:
  1097.                             log.debug('Closing fax channel.')
  1098.                             self.dev.closeFax()
  1099.                         
  1100.                         self.dev.close()
  1101.                         continue
  1102.                 continue
  1103.             if state == STATE_CLEANUP:
  1104.                 log.debug('%s State: Cleanup' % '********************')
  1105.                 if self.remove_temp_file:
  1106.                     log.debug('Removing merged file: %s' % f)
  1107.                     
  1108.                     try:
  1109.                         os.remove(f)
  1110.                         log.debug('Removed')
  1111.                     except OSError:
  1112.                         log.debug('Not found')
  1113.                     except:
  1114.                         None<EXCEPTION MATCH>OSError
  1115.                     
  1116.  
  1117.                 None<EXCEPTION MATCH>OSError
  1118.                 state = STATE_DONE
  1119.                 continue
  1120.  
  1121.     
  1122.     def next_recipient_gen(self):
  1123.         for a in self.phone_num_list:
  1124.             yield a
  1125.         
  1126.  
  1127.     
  1128.     def render_file(self, path, title, mime_type, force_single_page = False):
  1129.         all_pages = True
  1130.         page_range = ''
  1131.         page_set = 0
  1132.         nup = 1
  1133.         cups.resetOptions()
  1134.         if mime_type in ('application/x-cshell', 'application/x-perl', 'application/x-python', 'application/x-shell', 'text/plain'):
  1135.             cups.addOption('prettyprint')
  1136.         
  1137.         if nup > 1:
  1138.             cups.addOption('number-up=%d' % nup)
  1139.         
  1140.         if force_single_page:
  1141.             cups.addOption('page-ranges=1')
  1142.         
  1143.         sent_job_id = cups.printFile(self.current_printer, path, title)
  1144.         cups.resetOptions()
  1145.         log.debug('Job ID=%d' % sent_job_id)
  1146.         job_id = 0
  1147.         time.sleep(1)
  1148.         fax_file = ''
  1149.         complete = False
  1150.         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  1151.         
  1152.         try:
  1153.             sock.connect((prop.hpssd_host, prop.hpssd_port))
  1154.         except socket.error:
  1155.             log.error('Unable to contact HPLIP I/O (hpssd).')
  1156.             return ('', True)
  1157.  
  1158.         end_time = time.time() + 120
  1159.         while time.time() < end_time:
  1160.             log.debug('Waiting for fax...')
  1161.             (fields, data, result_code) = msg.xmitMessage(sock, 'FaxCheck', None, {
  1162.                 'username': prop.username })
  1163.             if result_code == ERROR_FAX_PROCESSING:
  1164.                 log.debug('Fax is being rendered...')
  1165.             elif result_code == ERROR_FAX_READY:
  1166.                 break
  1167.             
  1168.             if self.check_for_cancel():
  1169.                 log.error('Render canceled. Canceling job #%d...' % sent_job_id)
  1170.                 cups.cancelJob(sent_job_id)
  1171.                 os.close(fd)
  1172.                 sock.close()
  1173.                 return ('', True)
  1174.             
  1175.             time.sleep(1)
  1176.         log.error('Timeout waiting for rendering. Canceling job #%d...' % sent_job_id)
  1177.         cups.cancelJob(sent_job_id)
  1178.         return ('', False)
  1179.         (fd, fax_file) = utils.make_temp_file()
  1180.         while True:
  1181.             log.debug('Transfering fax data...')
  1182.             (fields, data, result_code) = msg.xmitMessage(sock, 'FaxGetData', None, {
  1183.                 'username': prop.username,
  1184.                 'job-id': sent_job_id })
  1185.             if data and result_code == ERROR_SUCCESS:
  1186.                 os.write(fd, data)
  1187.             else:
  1188.                 complete = True
  1189.                 break
  1190.             if self.check_for_cancel():
  1191.                 log.error('Render canceled. Canceling job #%d...' % sent_job_id)
  1192.                 cups.cancelJob(sent_job_id)
  1193.                 os.close(fd)
  1194.                 sock.close()
  1195.                 return ('', True)
  1196.                 continue
  1197.         os.close(fd)
  1198.         sock.close()
  1199.         return (fax_file, False)
  1200.  
  1201.     
  1202.     def check_for_cancel(self):
  1203.         canceled = False
  1204.         while self.event_queue.qsize():
  1205.             
  1206.             try:
  1207.                 event = self.event_queue.get(0)
  1208.                 if event[0] == EVENT_FAX_SEND_CANCELED:
  1209.                     canceled = True
  1210.                     log.debug('Cancel pressed!')
  1211.             continue
  1212.             except Queue.Empty:
  1213.                 break
  1214.                 continue
  1215.             
  1216.  
  1217.             None<EXCEPTION MATCH>Queue.Empty
  1218.         return canceled
  1219.  
  1220.     
  1221.     def render_cover_page(self, a):
  1222.         log.debug('Creating cover page...')
  1223.         pdf = self.cover_func(page_size = coverpages.PAGE_SIZE_LETTER, total_pages = self.job_total_pages, recipient_name = a.name, recipient_phone = '', recipient_fax = a.fax, sender_name = self.sender_name, sender_phone = user_cfg.fax.voice_phone, sender_fax = self.sender_fax, sender_email = user_cfg.fax.email_address, regarding = self.cover_re, message = self.cover_message)
  1224.         log.debug('PDF File=%s' % pdf)
  1225.         (fax_file, canceled) = self.render_file(pdf, 'Cover Page', 'application/pdf', force_single_page = True)
  1226.         
  1227.         try:
  1228.             os.remove(pdf)
  1229.         except IOError:
  1230.             pass
  1231.  
  1232.         return (fax_file, canceled)
  1233.  
  1234.     
  1235.     def write_queue(self, message):
  1236.         if self.update_queue is not None and message != self.prev_update:
  1237.             self.update_queue.put(message)
  1238.             time.sleep(0)
  1239.             self.prev_update = message
  1240.         
  1241.  
  1242.     
  1243.     def getFaxDownloadState(self):
  1244.         (result_code, state) = self.dev.getPML(pml.OID_FAX_DOWNLOAD)
  1245.         log.debug('D/L State=%d (%s)' % (state, pml.UPDN_STATE_STR.get(state, 'Unknown')))
  1246.         return state
  1247.  
  1248.     
  1249.     def getFaxJobTxStatus(self):
  1250.         (result_code, status) = self.dev.getPML(pml.OID_FAXJOB_TX_STATUS)
  1251.         log.debug('Tx Status=%d (%s)' % (status, pml.FAXJOB_TX_STATUS_STR.get(status, 'Unknown')))
  1252.         return status
  1253.  
  1254.     
  1255.     def getFaxJobRxStatus(self):
  1256.         (result_code, status) = self.dev.getPML(pml.OID_FAXJOB_RX_STATUS)
  1257.         log.debug('Rx Status=%d (%s)' % (status, pml.FAXJOB_RX_STATUS_STR.get(status, 'Unknown')))
  1258.         return status
  1259.  
  1260.     
  1261.     def getCfgUploadState(self):
  1262.         (result_code, state) = self.dev.getPML(pml.OID_DEVICE_CFG_UPLOAD)
  1263.         log.debug('Cfg Upload State = %d (%s)' % (state, pml.UPDN_STATE_STR.get(state, 'Unknown')))
  1264.         return state
  1265.  
  1266.     
  1267.     def create_mfpdtf_fixed_header(self, data_type, send_variant = False, page_flags = 0):
  1268.         header_len = FIXED_HEADER_SIZE
  1269.         if send_variant:
  1270.             if data_type == DT_DIAL_STRINGS:
  1271.                 header_len += DIAL_STRINGS_VARIANT_HEADER_SIZE
  1272.             elif data_type == DT_FAX_IMAGES:
  1273.                 header_len += FAX_IMAGE_VARIANT_HEADER_SIZE
  1274.             
  1275.         
  1276.         self.stream.write(struct.pack('<IHBB', 0, header_len, data_type, page_flags))
  1277.  
  1278.     
  1279.     def create_mfpdtf_dial_strings(self, number):
  1280.         self.stream.write(struct.pack('<BBHH51s', MAJOR_VER, MINOR_VER, 1, 51, number[:51]))
  1281.  
  1282.     
  1283.     def adjust_fixed_header_block_size(self):
  1284.         size = self.stream.tell()
  1285.         self.stream.seek(0)
  1286.         self.stream.write(struct.pack('<I', size))
  1287.  
  1288.     
  1289.     def create_sop_record(self, page_num, hort_dpi, vert_dpi, ppr, rpp, encoding, bpp = 1):
  1290.         self.stream.write(struct.pack('<BBHHHIHHHHHHIHHHH', RT_START_PAGE, encoding, page_num, ppr, bpp, rpp, 0, hort_dpi, 0, vert_dpi, ppr, bpp, rpp, 0, hort_dpi, 0, vert_dpi))
  1291.  
  1292.     
  1293.     def create_eop_record(self, rpp):
  1294.         self.stream.write(struct.pack('<BBBBII', RT_END_PAGE, 0, 0, 0, rpp, 0))
  1295.  
  1296.     
  1297.     def create_raster_data_record(self, data):
  1298.         if not len(data) <= RASTER_DATA_SIZE:
  1299.             raise AssertionError
  1300.         self.stream.write(struct.pack('<BBH', RT_RASTER, 0, len(data)))
  1301.         self.stream.write(data)
  1302.  
  1303.     
  1304.     def create_mfpdtf_fax_header(self, total_pages):
  1305.         self.stream.write(struct.pack('<BBBHBI20s20s20sI', MAJOR_VER, MINOR_VER, SRC_HOST, total_pages, TTI_PREPENDED_TO_IMAGE, 0, '', '', '', 0))
  1306.  
  1307.     
  1308.     def write_stream(self):
  1309.         self.adjust_fixed_header_block_size()
  1310.         self.dev.writeFax(self.stream.getvalue())
  1311.         self.stream.truncate(0)
  1312.         self.stream.seek(0)
  1313.  
  1314.     
  1315.     def decode_fax_header(self, header):
  1316.         
  1317.         try:
  1318.             return struct.unpack('>8sBIHHBBBII', header)
  1319.         except struct.error:
  1320.             return (-1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
  1321.  
  1322.  
  1323.     
  1324.     def decode_page_header(self, header):
  1325.         
  1326.         try:
  1327.             return struct.unpack('>IIIIII', header)
  1328.         except struct.error:
  1329.             return (-1, -1, -1, -1, -1, -1)
  1330.  
  1331.  
  1332.  
  1333.