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 / prnt / cups.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2007-04-29  |  15.0 KB  |  472 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. import os
  5. import os.path as os
  6. import gzip
  7. import re
  8. import time
  9. import urllib
  10. import tempfile
  11. import glob
  12. from base.g import *
  13. from base import utils
  14.  
  15. try:
  16.     import cupsext
  17. except ImportError:
  18.     pass
  19.  
  20. nickname_pat = re.compile('\\*NickName:\\s*\\"(.*)"', re.MULTILINE)
  21. IPP_PRINTER_STATE_IDLE = 3
  22. IPP_PRINTER_STATE_PROCESSING = 4
  23. IPP_PRINTER_STATE_STOPPED = 5
  24. PPD_UI_BOOLEAN = 0
  25. PPD_UI_PICKONE = 1
  26. PPD_UI_PICKMANY = 2
  27. UI_SPINNER = 100
  28. UI_UNITS_SPINNER = 101
  29. UI_BANNER_JOB_SHEETS = 102
  30. IPP_PAUSE_PRINTER = 16
  31. IPP_RESUME_PRINTER = 17
  32. IPP_PURGE_JOBS = 18
  33. CUPS_GET_DEFAULT = 16385
  34. CUPS_GET_PRINTERS = 16386
  35. CUPS_ADD_MODIFY_PRINTER = 16387
  36. CUPS_DELETE_PRINTER = 16388
  37. CUPS_GET_CLASSES = 16389
  38. CUPS_ADD_MODIFY_CLASS = 16390
  39. CUPS_DELETE_CLASS = 16391
  40. CUPS_ACCEPT_JOBS = 16392
  41. CUPS_REJECT_JOBS = 16393
  42. CUPS_SET_DEFAULT = 16394
  43. CUPS_GET_DEVICES = 16395
  44. CUPS_GET_PPDS = 16396
  45. CUPS_MOVE_JOB = 16397
  46. CUPS_AUTHENTICATE_JOB = 16398
  47. IPP_JOB_PENDING = 3
  48. IPP_JOB_HELD = 4
  49. IPP_JOB_PROCESSING = 5
  50. IPP_JOB_STOPPED = 6
  51. IPP_JOB_CANCELLED = 7
  52. IPP_JOB_ABORTED = 8
  53. IPP_JOB_COMPLETED = 8
  54. IPP_OK = 0
  55. IPP_OK_SUBST = 1
  56. IPP_OK_CONFLICT = 2
  57. IPP_OK_IGNORED_SUBSCRIPTIONS = 3
  58. IPP_OK_IGNORED_NOTIFICATIONS = 4
  59. IPP_OK_TOO_MANY_EVENTS = 5
  60. IPP_OK_BUT_CANCEL_SUBSCRIPTION = 6
  61. IPP_OK_EVENTS_COMPLETE = 7
  62. IPP_REDIRECTION_OTHER_SITE = 768
  63. IPP_BAD_REQUEST = 1024
  64. IPP_FORBIDDEN = 1025
  65. IPP_NOT_AUTHENTICATED = 1026
  66. IPP_NOT_AUTHORIZED = 1027
  67. IPP_NOT_POSSIBLE = 1028
  68. IPP_TIMEOUT = 1029
  69. IPP_NOT_FOUND = 1030
  70. IPP_GONE = 1031
  71. IPP_REQUEST_ENTITY = 1032
  72. IPP_REQUEST_VALUE = 1033
  73. IPP_DOCUMENT_FORMAT = 1034
  74. IPP_ATTRIBUTES = 1035
  75. IPP_URI_SCHEME = 1036
  76. IPP_CHARSET = 1037
  77. IPP_CONFLICT = 1038
  78. IPP_COMPRESSION_NOT_SUPPORTED = 1039
  79. IPP_COMPRESSION_ERROR = 1040
  80. IPP_DOCUMENT_FORMAT_ERROR = 1041
  81. IPP_DOCUMENT_ACCESS_ERROR = 1042
  82. IPP_ATTRIBUTES_NOT_SETTABLE = 1043
  83. IPP_IGNORED_ALL_SUBSCRIPTIONS = 1044
  84. IPP_TOO_MANY_SUBSCRIPTIONS = 1045
  85. IPP_IGNORED_ALL_NOTIFICATIONS = 1046
  86. IPP_PRINT_SUPPORT_FILE_NOT_FOUND = 1047
  87. IPP_INTERNAL_ERROR = 1280
  88. IPP_OPERATION_NOT_SUPPORTED = 1281
  89. IPP_SERVICE_UNAVAILABLE = 1282
  90. IPP_VERSION_NOT_SUPPORTED = 1283
  91. IPP_DEVICE_ERROR = 1284
  92. IPP_TEMPORARY_ERROR = 1285
  93. IPP_NOT_ACCEPTING = 1286
  94. IPP_PRINTER_BUSY = 1287
  95. IPP_ERROR_JOB_CANCELLED = 1288
  96. IPP_MULTIPLE_JOBS_NOT_SUPPORTED = 1289
  97. IPP_PRINTER_IS_DEACTIVATED = 1290
  98. CUPS_ERROR_BAD_NAME = 3840
  99. CUPS_ERROR_BAD_PARAMETERS = 3841
  100.  
  101. def restartCUPS():
  102.     os.system('killall -HUP cupsd')
  103.  
  104.  
  105. def getPPDPath(addtional_paths = None):
  106.     '''
  107.         Returns the CUPS ppd path (not the foomatic one under /usr/share/ppd).
  108.         Usually this is /usr/share/cups/model.
  109.     '''
  110.     if addtional_paths is None:
  111.         addtional_paths = []
  112.     
  113.     search_paths = prop.ppd_search_path.split(';') + addtional_paths
  114.     for path in search_paths:
  115.         ppd_path = os.path.join(path, 'cups/model')
  116.         if os.path.exists(ppd_path):
  117.             return ppd_path
  118.             continue
  119.     
  120.  
  121.  
  122. def getAllowableMIMETypes():
  123.     '''
  124.         Scan all /etc/cups/*.convs files for allowable file formats.
  125.     '''
  126.     files = glob.glob('/etc/cups/*.convs')
  127.     allowable_mime_types = []
  128.     for f in files:
  129.         conv_file = file(f, 'r')
  130.         for line in conv_file:
  131.             if not line.startswith('#') and len(line) > 1:
  132.                 
  133.                 try:
  134.                     (source, dest, cost, prog) = line.split()
  135.                 except ValueError:
  136.                     continue
  137.  
  138.                 if source not in ('application/octet-stream', 'application/vnd.cups-postscript'):
  139.                     allowable_mime_types.append(source)
  140.                 
  141.             source not in ('application/octet-stream', 'application/vnd.cups-postscript')
  142.         
  143.     
  144.     allowable_mime_types.append('image/x-bmp')
  145.     allowable_mime_types.append('text/cpp')
  146.     return allowable_mime_types
  147.  
  148.  
  149. def getPPDDescription(f):
  150.     if f.endswith('.gz'):
  151.         nickname = gzip.GzipFile(f, 'r').read(4096)
  152.     else:
  153.         nickname = file(f, 'r').read(4096)
  154.     
  155.     try:
  156.         desc = nickname_pat.search(nickname).group(1)
  157.     except AttributeError:
  158.         desc = ''
  159.  
  160.     return desc
  161.  
  162.  
  163. def getSystemPPDs():
  164.     (major, minor, patch) = getVersionTuple()
  165.     ppds = { }
  166.     if major == 1 and minor < 2:
  167.         log.debug('(CUPS 1.1.x) Searching for PPDs in: %s' % sys_cfg.dirs.ppd)
  168.         for f in utils.walkFiles(sys_cfg.dirs.ppd, pattern = 'HP*ppd*;hp*ppd*', abs_paths = True):
  169.             desc = getPPDDescription(f)
  170.             ppds[f] = desc
  171.             log.debug('%s: %s' % (f, desc))
  172.         
  173.     else:
  174.         log.debug('(CUPS 1.2.x) Getting list of PPDs using CUPS_GET_PPDS...')
  175.         ppd_dict = cupsext.getPPDList()
  176.         cups_ppd_path = getPPDPath()
  177.         foomatic_ppd_path = sys_cfg.dirs.ppdbase
  178.         if not foomatic_ppd_path or not os.path.exists(foomatic_ppd_path):
  179.             foomatic_ppd_path = '/usr/share/ppd'
  180.         
  181.         log.debug('CUPS PPD base path = %s' % cups_ppd_path)
  182.         log.debug('Foomatic PPD base path = %s' % foomatic_ppd_path)
  183.         for ppd in ppd_dict:
  184.             if ('HP-' in ppd or 'HP_' in ppd) and ppd_dict[ppd]['ppd-make'] == 'HP':
  185.                 desc = ppd_dict[ppd]['ppd-make-and-model']
  186.                 path = os.path.join(foomatic_ppd_path, ppd)
  187.                 if not os.path.exists(path):
  188.                     path = os.path.join(cups_ppd_path, ppd)
  189.                     if not os.path.exists(path):
  190.                         path = ppd
  191.                     
  192.                 
  193.                 ppds[path] = desc
  194.                 log.debug('%s: %s' % (path, desc))
  195.                 continue
  196.         
  197.     return ppds
  198.  
  199.  
  200. def levenshtein_distance(a, b):
  201.     '''
  202.     Calculates the Levenshtein distance between a and b.
  203.     Written by Magnus Lie Hetland.
  204.     '''
  205.     n = len(a)
  206.     m = len(b)
  207.     if n > m:
  208.         a = b
  209.         b = a
  210.         n = m
  211.         m = n
  212.     
  213.     current = range(n + 1)
  214.     for i in range(1, m + 1):
  215.         previous = current
  216.         current = [
  217.             i] + [
  218.             0] * m
  219.         for j in range(1, n + 1):
  220.             add = previous[j] + 1
  221.             delete = current[j - 1] + 1
  222.             change = previous[j - 1]
  223.             if a[j - 1] != b[i - 1]:
  224.                 change = change + 1
  225.             
  226.             current[j] = min(add, delete, change)
  227.         
  228.     
  229.     return current[n]
  230.  
  231. number_pat = re.compile('.*?(\\d+)', re.IGNORECASE)
  232.  
  233. def getPPDFile(stripped_model, ppds):
  234.     '''
  235.         Match up a model name to a PPD from a list of system PPD files.
  236.     '''
  237.     log.debug('1st stage edit distance match')
  238.     mins = { }
  239.     eds = { }
  240.     min_edit_distance = sys.maxint
  241.     for f in ppds:
  242.         t = os.path.basename(f).lower().replace('hp-', '').replace('-hpijs', '').replace('.gz', '').replace('.ppd', '').replace('hp_', '').replace('_series', '').replace('foomatic:', '').lower()
  243.         eds[f] = levenshtein_distance(stripped_model, t)
  244.         log.debug("dist('%s', '%s') = %d" % (stripped_model, t, eds[f]))
  245.         min_edit_distance = min(min_edit_distance, eds[f])
  246.     
  247.     log.debug('Min. dist = %d' % min_edit_distance)
  248.     for f in ppds:
  249.         if eds[f] == min_edit_distance:
  250.             for m in mins:
  251.                 if os.path.basename(m) == os.path.basename(f):
  252.                     break
  253.                     continue
  254.             else:
  255.                 mins[f] = ppds[f]
  256.     
  257.     log.debug(mins)
  258.     if len(mins) > 1:
  259.         log.debug('2nd stage matching with model number')
  260.         
  261.         try:
  262.             model_number = number_pat.match(stripped_model).group(1)
  263.             model_number = int(model_number)
  264.         except AttributeError:
  265.             pass
  266.         except ValueError:
  267.             pass
  268.  
  269.         log.debug('model_number=%d' % model_number)
  270.         matches = { }
  271.         for x in range(3):
  272.             factor = 10 ** x
  273.             log.debug('Factor = %d' % factor)
  274.             adj_model_number = int(model_number / factor) * factor
  275.             (number_matching, match) = (0, '')
  276.             for m in mins:
  277.                 
  278.                 try:
  279.                     mins_model_number = number_pat.match(os.path.basename(m)).group(1)
  280.                     mins_model_number = int(mins_model_number)
  281.                     log.debug('mins_model_number= %d' % mins_model_number)
  282.                 except AttributeError:
  283.                     continue
  284.                 except ValueError:
  285.                     continue
  286.  
  287.                 mins_adj_model_number = int(mins_model_number / factor) * factor
  288.                 log.debug('mins_adj_model_number=%d' % mins_adj_model_number)
  289.                 log.debug('adj_model_number=%d' % adj_model_number)
  290.                 if mins_adj_model_number == adj_model_number:
  291.                     log.debug('match')
  292.                     number_matching += 1
  293.                     matches[m] = ppds[m]
  294.                     log.debug(matches)
  295.                 
  296.                 log.debug('***')
  297.             
  298.             if len(matches):
  299.                 mins = matches
  300.                 break
  301.                 continue
  302.         
  303.     
  304.     return mins
  305.  
  306.  
  307. def getDefaultPrinter():
  308.     return cupsext.getDefaultPrinter()
  309.  
  310.  
  311. def setDefaultPrinter(printer_name):
  312.     return cupsext.setDefaultPrinter(printer_name)
  313.  
  314.  
  315. def accept(printer_name):
  316.     return controlPrinter(printer_name, CUPS_ACCEPT_JOBS)
  317.  
  318.  
  319. def reject(printer_name):
  320.     return controlPrinter(printer_name, CUPS_REJECT_JOBS)
  321.  
  322.  
  323. def start(printer_name):
  324.     return controlPrinter(printer_name, IPP_RESUME_PRINTER)
  325.  
  326.  
  327. def stop(printer_name):
  328.     return controlPrinter(printer_name, IPP_PAUSE_PRINTER)
  329.  
  330.  
  331. def purge(printer_name):
  332.     return controlPrinter(printer_name, IPP_PURGE_JOBS)
  333.  
  334.  
  335. def controlPrinter(printer_name, cups_op):
  336.     if cups_op in (CUPS_ACCEPT_JOBS, CUPS_REJECT_JOBS, IPP_PAUSE_PRINTER, IPP_RESUME_PRINTER, IPP_PURGE_JOBS):
  337.         return cupsext.controlPrinter(printer_name, cups_op)
  338.     
  339.     return 0
  340.  
  341.  
  342. def openPPD(printer):
  343.     if not printer:
  344.         return None
  345.     
  346.     return cupsext.openPPD(printer)
  347.  
  348.  
  349. def closePPD():
  350.     return cupsext.closePPD()
  351.  
  352.  
  353. def getPPD(printer):
  354.     if not printer:
  355.         return None
  356.     
  357.     return cupsext.getPPD(printer)
  358.  
  359.  
  360. def getPPDOption(option):
  361.     return cupsext.getPPDOption(option)
  362.  
  363.  
  364. def getPPDPageSize():
  365.     return cupsext.getPPDPageSize()
  366.  
  367.  
  368. def getPrinters():
  369.     return cupsext.getPrinters()
  370.  
  371.  
  372. def getJobs(my_job = 0, completed = 0):
  373.     return cupsext.getJobs(my_job, completed)
  374.  
  375.  
  376. def getAllJobs(my_job = 0):
  377.     return cupsext.getJobs(my_job, 0) + cupsext.getJobs(my_job, 1)
  378.  
  379.  
  380. def getVersion():
  381.     return cupsext.getVersion()
  382.  
  383.  
  384. def getVersionTuple():
  385.     return cupsext.getVersionTuple()
  386.  
  387.  
  388. def getServer():
  389.     return cupsext.getServer()
  390.  
  391.  
  392. def cancelJob(jobid, dest = None):
  393.     if dest is not None:
  394.         return cupsext.cancelJob(dest, jobid)
  395.     else:
  396.         jobs = cupsext.getJobs(0, 0)
  397.         for j in jobs:
  398.             if j.id == jobid:
  399.                 return cupsext.cancelJob(j.dest, jobid)
  400.                 continue
  401.         
  402.     return False
  403.  
  404.  
  405. def resetOptions():
  406.     return cupsext.resetOptions()
  407.  
  408.  
  409. def addOption(option):
  410.     return cupsext.addOption(option)
  411.  
  412.  
  413. def getOptions():
  414.     return cupsext.getOptions()
  415.  
  416.  
  417. def printFile(printer, filename, title):
  418.     if os.path.exists(filename):
  419.         return cupsext.printFileWithOptions(printer, filename, title)
  420.     else:
  421.         return -1
  422.  
  423.  
  424. def addPrinter(printer_name, device_uri, location, ppd_file, model, info):
  425.     log.debug("addPrinter('%s', '%s', '%s', '%s', '%s', '%s')" % (printer_name, device_uri, location, ppd_file, model, info))
  426.     if ppd_file and not os.path.exists(ppd_file):
  427.         log.error("PPD file '%s' not found." % ppd_file)
  428.         return (-1, 'PPD file not found')
  429.     
  430.     return cupsext.addPrinter(printer_name, device_uri, location, ppd_file, model, info)
  431.  
  432.  
  433. def delPrinter(printer_name):
  434.     return cupsext.delPrinter(printer_name)
  435.  
  436.  
  437. def getGroupList():
  438.     return cupsext.getGroupList()
  439.  
  440.  
  441. def getGroup(group):
  442.     return cupsext.getGroup(group)
  443.  
  444.  
  445. def getOptionList(group):
  446.     return cupsext.getOptionList(group)
  447.  
  448.  
  449. def getOption(group, option):
  450.     return cupsext.getOption(group, option)
  451.  
  452.  
  453. def getChoiceList(group, option):
  454.     return cupsext.getChoiceList(group, option)
  455.  
  456.  
  457. def getChoice(group, option, choice):
  458.     return cupsext.getChoice(group, option, choice)
  459.  
  460.  
  461. def setOptions():
  462.     return cupsext.setOptions()
  463.  
  464.  
  465. def removeOption(option):
  466.     return cupsext.removeOption(option)
  467.  
  468.  
  469. def setPasswordCallback(func):
  470.     return cupsext.setPasswordCallback(func)
  471.  
  472.