hplip/SOURCES/hplip-find-driver.patch

164 lines
7.1 KiB
Diff

diff --git a/prnt/cups.py b/prnt/cups.py
index a9f410a..3783a60 100644
--- a/prnt/cups.py
+++ b/prnt/cups.py
@@ -489,78 +489,77 @@ def getPPDFile2(mq,model, ppds): # New PPD find
#Check if common ppd name is already given in models.dat(This is needed because in case of devices having more than one derivatives
#will have diffrent model name strings in device ID, because of which we don't get the common ppd name for search)
family_check=isfamilydrv(ppds)
- family_class=getFamilyClassName(model)
+
model = models.normalizeModelName(model)
- if family_check==0:
- ppd_name = mq.get('ppd-name',0)
- else:
- ppd_name = mq.get('family-ppd',0)
- if ppd_name == 0:
- stripped_model = stripModel2(model)
- else:
- stripped_model = stripModel2(ppd_name)
+ ppd_name = mq.get('{}'.format('family-ppd' if family_check else 'ppd-name'), 0)
+
+ stripped_model = stripModel2(ppd_name) if ppd_name else stripModel2(model)
+
+ wanted_model = getFamilyClassName(model) if family_check else stripped_model
log.debug("Matching PPD list to model %s..." % stripped_model)
matches = []
- if family_check ==0 :
- for f in ppds:
- match = ppd_pat.match(f)
- if match is not None:
- if match.group(1) == stripped_model:
- log.debug("Found match: %s" % f)
- try:
- pdls = match.group(2).split('-')
- except AttributeError:
- pdls = []
- if (prop.hpcups_build and 'hpijs' not in f) or \
- ((prop.hpijs_build and 'hpijs' in pdls) or (prop.hpcups_build and 'hpijs' not in pdls)) or \
- ('ps' in pdls) or ('pdf' in pdls):
- matches.append((f, [p for p in pdls if p and p != 'hpijs']))
- else:
- for f in ppds:
- match = ppd_pat1.match(f)
- if match is not None:
- if match.group(1) == family_class:
- log.debug("Found match: %s" % f)
- try:
- pdls = match.group(2).split('-')
- except AttributeError:
- pdls = []
- if (prop.hpcups_build and 'hpijs' not in f) or \
- ((prop.hpijs_build and 'hpijs' in pdls) or (prop.hpcups_build and 'hpijs' not in pdls)) or \
- ('ps' in pdls) or ('pdf' in pdls):
- matches.append((f, [p for p in pdls if p and p != 'hpijs']))
- log.debug(matches)
- num_matches = len(matches)
+ for f in ppds:
+ # ignore foomatic and gutenprint drivers
+ if 'foomatic' in f or 'gutenprint' in f:
+ continue
+
+ # see if driver type is in driver name
+ driver_types = []
+ if 'hpcups' in f:
+ driver_types.append('hpcups')
+ if 'hpijs' in f:
+ driver_types.append('hpijs')
+
+
+ ppd_filename = f.rsplit('/', 1)[1].split('.')[0].replace('hp-', '')
+
+ if not ppd_filename:
+ continue
+
+ # we need to sanitize the end of filename - there can be a driver type (-hpijs, -hpcups),
+ # pdl name (-zjstream, -pdf, -ps etc.) or the device can just have '-' in their name
+ # (HP Photosmart Premium C309g-m).
+ # So if we don't know the name after '-', take it as part of device name.
+ # If we know them either like driver type of PDL, remove the string from ppd name
+ # so we can compare it with stripped model
+ pdl_candidates = []
+ pdl_candidates = ppd_filename.split('-')[1:]
+
+ pdls = []
+ ppd_model = ppd_filename
+
+ for pdl in pdl_candidates:
+ if pdl in ['hpijs', 'hpcups']:
+ ppd_model=ppd_model.replace('-{}'.format(pdl), '')
+ continue
- if num_matches == 0:
- log.debug("No PPD found for model %s using new algorithm. Trying old algorithm..." % stripped_model)
- #Using Old algo, ignores the series keyword in ppd searching.
- matches2 = list(getPPDFile(stripModel(stripped_model), ppds).items())
- log.debug(matches2)
- num_matches2 = len(matches2)
- if num_matches2:
- for f, d in matches2:
- match = ppd_pat.match(f)
- if match is not None:
- log.debug("Found match: %s" % f)
- try:
- pdls = match.group(2).split('-')
- except AttributeError:
- pdls = []
+ if not models.PDL_TYPES.get(pdl):
+ log.debug('Unknown PDL named \'{}\' - can be a new PDL or '
+ 'just a part of device name. Assume it is '
+ 'a part of device name.'.format(pdl))
+ else:
+ pdls.append(pdl)
+ ppd_model=ppd_model.replace('-{}'.format(pdl), '')
+
+ if ppd_model != wanted_model and ppd_model != '{}_series'.format(wanted_model):
+ continue
+
+ log.debug("Found match: %s" % f)
- if (prop.hpcups_build and 'hpijs' not in f) or \
- ((prop.hpijs_build and 'hpijs' in pdls) or (prop.hpcups_build and 'hpijs' not in pdls)) or \
- ('ps' in pdls) or ('pdf' in pdls):
- matches.append((f, [p for p in pdls if p and p != 'hpijs']))
+ if (prop.hpcups_build and 'hpijs' not in f) or \
+ ((prop.hpijs_build and 'hpijs' in driver_types) or (prop.hpcups_build and 'hpijs' not in driver_types)) or \
+ ('ps' in pdls) or ('pdf' in pdls):
+ matches.append((f, pdls, [d for d in driver_types if d and d != 'hpijs']))
- log.debug(matches)
- num_matches = len(matches)
+
+ log.debug(matches)
+ num_matches = len(matches)
if num_matches == 0:
- log.error("No PPD found for model %s using old algorithm." % stripModel(stripped_model))
+ log.error("No PPD found for model %s." % stripModel(stripped_model))
return None
elif num_matches == 1:
@@ -570,7 +569,7 @@ def getPPDFile2(mq,model, ppds): # New PPD find
# > 1
log.debug("%d matches found. Searching based on PDL: Host > PS,PDF > PCL/Other" % num_matches)
for p in [models.PDL_TYPE_HOST, models.PDL_TYPE_PS,models.PDL_TYPE_PDF, models.PDL_TYPE_PCL]:
- for f, pdl_list in matches:
+ for f, pdl_list, driver_list in matches:
for x in pdl_list:
# default to HOST-based PDLs, as newly supported PDLs will most likely be of this type
if models.PDL_TYPES.get(x, models.PDL_TYPE_HOST) == p:
@@ -579,8 +578,8 @@ def getPPDFile2(mq,model, ppds): # New PPD find
log.debug("%d matches found. Searching based on Filters: HPCUPS > HPIJS" % num_matches)
for p in ["hpcups","hpijs"]:
- for f, pdl_list in matches:
- if p in f:
+ for f, pdl_list, driver_list in matches:
+ if p in driver_list:
log.debug("Selecting PPD: %s" % (f))
return (f, '')