Mini Shell

Direktori : /usr/lib/python3.6/site-packages/cupshelpers/__pycache__/
Upload File :
Current File : //usr/lib/python3.6/site-packages/cupshelpers/__pycache__/ppds.cpython-36.pyc

3

�'Y���@s�ddlZddlmZddlmZddlZddlZddlZddlZddl	Z
ddlZddlZddlm
Z
mZddlmZddgZd	ejd
�fdejd�fd
ejd�fdejd�fdejd�fdejd�fdejd�fdejd�fdejd�fdejd�fdejd�fdejd �fgZiZxeD]\ZZeeej�<�qWd!d"d#d$d%d&d'�Zejd(�Zejd)�Zejd*�Zejd+ej�Zd,d�Zd-d.�Zd/d0�ZGd1d�d�Z d2d3�Z!dS)4�N�)�
parseDeviceID)�xmldriverprefs)�_debugprint�set_debugprint_fn)�reduce�ppdMakeModelSplit�PPDs�HPzhdeskjet|dj[ 0-9]?|laserjet|lj|color laserjet|color lj|designjet|officejet|oj|photosmart|ps |psc|edgelineZEpsonzstylus|aculaserZApplez.stylewriter|imagewriter|deskwriter|laserwriterZCanonz%pixus|pixma|selphy|imagerunner|bj|lbpZBrotherz
hl|dcp|mfcZXeroxz/docuprint|docupage|phaser|workcentre|homecentre�Lexmarkzoptra|(:color )?jetprinterzKONICA MINOLTAzmagicolor|pageworks|pagepro�Kyocerazfs-|km-|taskalfaZRicohZaficioZOceZ
varioprintZOkizokipage|microlineZDeskJetZLaserJetZ	OfficeJetzColor LaserJet�
PhotoSmart�)ZdjZljZojzcolor ljzps zhp Z
turboprintz! v(?:er\.)?\d(?:\d*\.\d+)?(?: |$)zn,| hpijs| foomatic/| - | w/| \(| postscript| ps| pdf| pxl| zjs| zxs| pcl3| printer|_bt| pcl| ufr ii| br-scriptz series| all-in-onecCs<|j�d}d}|j�}x$tD]\}}|j|�r|}|}PqW|dkoNtj|��r|jd�}|d'kr�|jd�}||kr�||d|�}n|d|�}y|jdd�\}}Wn|}d}YnXt	j
dd	|�}t	j
d
d	|�}t	j
dd	|�}t	j
d
d	|�}t	j
dd|�}t	j
d
d|�}d}n�|jd��r6d}|dd�}n�|jd��rTd}|dd�}n�|jd��rrd}|dd�}nj|jd��r�d}|dd�}nL|jd��r�d}|dd�}n.d}y|jd	d�\}}Wn|}d}YnX|j�}	|�rB|	jd��r|	jd��rd }d!}	n6|	jd"��r.|	jd#��r.d}d$}	nt
j|	�}|�rB|}|j�}
|
jd%�}|d(k�r�tj|
�}|�r�|j�}
|
d|
�}
|d|
�}tj|
�}|�r�|j�}|
d|�}
|d|�}tjd|dd&�\}}|�r�|j�}
|	d!k�r,x@tj�D]4\}}|
j|��r�||t|�d�}|j�}
P�q�W|j�}||fS))z�
    Split a ppd-make-and-model string into a canonical make and model pair.

    @type ppd_make_and_model: string
    @param ppd_make_and_model: IPP ppd-make-and-model attribute
    @return: a string pair representing the make and the model
    NFz TurboPrintr��_rz(?<=[a-z])(?=[0-9])� z(?<=[a-z])(?=[A-Z])z JetZJetzPhoto Smartr
Tzkonica minolta zKONICA MINOLTA�zlexmark international r�z
kyocera mita r�
zkyocera �zfuji xerox z
Fuji Xerox�ZhewlettZpackardr
�hpZkonicaZminoltazkonica minoltaz v)�count���r)�strip�lower�
_MFR_BY_RANGE�match�_RE_turboprint�search�find�rfind�split�re�sub�
startswith�endswith�_MFR_NAMES_BY_LOWER�get�_RE_version_numbers�start�_RE_ignore_suffix�_RE_ignore_series�subn�_HP_MODEL_BY_NAME�items�len)�ppd_make_and_model�makeZcleanup_make�l�mfr�regexp�model�tZt2ZmakelZmodell�vZvmatchZvstart�suffixZsuffixstart�n�name�fullname�r=�v/builddir/build/BUILDROOT/system-config-printer-1.5.11-13.el8.i386/usr/lib/python3.6/site-packages/cupshelpers/ppds.pyrws�











c	Cs�|j�j�}d}d}d}d}|}d}x�tt|��D]p}||j�r\||krV|rV|d7}|}n*||j�r�||kr||r||d7}|}n|}||j�r2|||7}d}q2W|S)Nrrr�FrT)rr�ranger0�isalpha�isdigit�isalnum)	ZstrinZlstrinZ
normalizedZBLANKZALPHAZDIGITZlastcharZ
alnumfound�ir=r=r>�	normalize�s*rEcCst|t�r|dS|S)z{If we don't know whether getPPDs() or getPPDs2() was used, this
    function can unwrap an item from a list in either case.r)�
isinstance�list)�xr=r=r>�
_singleton)s
rIc
@s�eZdZdZdZdZdZdZej	j
Z
ej	jZej	jZej	j
Z
ej	jZe
eeeeee
eeeiZd"dd�Zd	d
�Zdd�Zd
d�Zdd�Zdd�Zd#dd�Zd$dd�Zd%dd�Zdd�Zd&dd�Zdd�Zd d!�ZdS)'r	a\
    This class is for handling the list of PPDs returned by CUPS.  It
    indexes by PPD name and device ID, filters by natural language so
    that foreign-language PPDs are not included, and sorts by driver
    type.  If an exactly-matching PPD is not available, it can
    substitute with a PPD for a similar model or for a generic driver.
    rrr?�NcCs�|j�|_d|_d|_tj�|_tj�|_|dkrbt	j
jd�}|dkrbddlm
}t	jj|jd�}y8t	jj|d�}tj|�\}}|jj|�|jj|�Wn>tk
r�}z"td||f�d|_d|_WYdd}~XnX|dks�|dks�|d	kr�d
}|jd�}	|	dk�r|d|	�}
n|}
g}xx|jj�D]j\}}
yt|
d�}Wntk
�r^�w,YnX|d
k�rn�q,||k�r|�q,||
k�r��q,|j|��q,Wx|D]}|j|=�q�Wd|jk�r�t|jdd�}|jd��s�d||jdd<dS)a%
        @type ppds: dict
        @param ppds: dict of PPDs as returned by cups.Connection.getPPDs()
        or cups.Connection.getPPDs2()

        @type language: string
	@param language: language name, as given by the first element
        of the pair returned by locale.getlocale()
        NZCUPSHELPERS_XMLDIRr)�config�cupshelperszpreferreddrivers.xmlzError loading %s: %s�CZPOSIX�en_USrzppd-natural-language�en�rawzppd-make-and-modelzGeneric r)�copy�ppds�makes�idsrZDriverTypes�drivertypesZPreferenceOrder�	preforder�os�environr(rrK�path�joinZ
sysconfdirZPreferredDrivers�load�	Exception�printr r/rI�KeyError�appendr%)�selfrR�languageZxml_dirrKZxmlfilerUZpreferenceorder�e�uZshort_languageZ	to_remove�ppdname�ppddictZnatural_languageZ	makemodelr=r=r>�__init__Ks\










z
PPDs.__init__cCsX|j�t|jj��}|jtjd�y|jd�|jdd�Wnt	k
rRYnX|S)zb
	@returns: a list of strings representing makes, sorted according
        to the current locale
	)�key�Genericr)
�_init_makesrGrS�keys�sort�locale�strxfrm�remove�insert�
ValueError)r`Z
makes_listr=r=r>�getMakes�s
z
PPDs.getMakescCsR|j�yt|j|j��}Wntk
r2gSXdd�}|jtj|�d�|S)zS
	@returns: a list of strings representing models, sorted using
	cups.modelSort()
	cSst|�}t|�}tj||�S)N)rE�cups�	modelSort)�a�b�first�secondr=r=r>�compare_models�sz&PPDs.getModels.<locals>.compare_models)rg)rirGrSrjr^rk�	functools�
cmp_to_key)r`r2Zmodels_listrxr=r=r>�	getModels�szPPDs.getModelscCs0|j�y|j||Stk
r*iSXdS)z�
	Obtain a list of PPDs that are suitable for use with a
        particular printer model, given its make and model name.

	@returns: a dict, indexed by ppd-name, of dicts representing
        PPDs (as given by cups.Connection.getPPDs)
	N)rirSr^)r`r2r6r=r=r>�getInfoFromModel�s
zPPDs.getInfoFromModelcCs
|j|S)zM
	@returns: a dict representing a PPD, as given by
	cups.Connection.getPPDs
	)rR)r`rdr=r=r>�getInfoFromPPDName�szPPDs.getInfoFromPPDNamecCs|jj|tjj�S)N)�_fit_to_statusr(r�
DriverType�FIT_NONE)r`�fitr=r=r>�getStatusFromFit�szPPDs.getStatusFromFitcCsJ|dkrg}|dkrg}|dkr$i}|jr�|jr�i}x|D]}|j|||<q:W|jj|j||�}tdt|��|jj|||�}	tdt|	��dd�|	D�}tdt|��t�}
x&|D]}|jd�\}}
}|
j	|�q�W|
�rFg}x.|D]&}|jd�\}}
}||
kr�|j
|�q�W|�rFx"|D]}||k�r$|j
|��q$W|}|S)a`

	Sort a list of PPD names by preferred driver type.

	@param ppdnamelist: PPD names
	@type ppdnamelist: string list
        @param downloadedfiles: Filenames from packages downloaded
        @type downloadedfiles: string list
        @param make_and_model: device-make-and-model name
        @type make_and_model: string
        @param devid: Device ID dict
        @type devid: dict indexed by Device ID field name, of strings;
        except for CMD field which must be a string list
        @param fit: Driver fit string for each PPD name
        @type fit: dict of PPD name:fit
	@returns: string list
	Nz9Valid driver types for this printer in priority order: %sz5PPDs with assigned driver types in priority order: %scSsg|]}|d�qS)rr=)�.0Ztyp_namer=r=r>�
<listcomp>�sz2PPDs.orderPPDNamesByPreference.<locals>.<listcomp>z(Resulting PPD list in priority order: %s�/)rUrVrRZget_ordered_typesr�reprZget_ordered_ppdnames�set�
rpartition�addr_)r`�ppdnamelist�downloadedfiles�make_and_model�devidr�rRrdZorderedtypesZorderedppdsZdownloadedfnamesZdownloadedfilerYZslash�fnameZdownloadedppdnamesZppdfnamer=r=r>�orderPPDNamesByPreference�sF





zPPDs.orderPPDNamesByPreferencerc.Cstd||f�|}|}|j�|dkr,g}i}	|j�}
|j�}d}y*x |j|
|D]}
|j|	|
<qVWd}Wntk
r�YnX|
dkr�yXx |jd|D]}
|j|	|
<q�Wtd|jd|�td||f�td	�d}Wntk
r�YnXtd
�d}|j�d}|
dk�r8t|�\}}t|�}
t|�}td|
�td
|�dddd�}|
|j	k�rt|j	|
}n<|
|k�r�||
}||j	k�r�|}|}
td|
�|j	|
}td|�|dk	�r�|j
|}|jt|�}xL|
ddgD]>}|j|d��r�|t
|�dd�}t|�}td|��q�W||j|
k�r|||}x�||j�D]$}
|j|	|
<td|	|
|
f��qRWnzt|d|�\}}t|�}td|�||j|
k�r�||}x8t||j��D]$}
|j|	|
<td|	|
|
f��q�W|	�rL|�rL|j||�\}}||jk�rLx*|D]"}
||	|
<td|	|
|
f��q&W|�r�t|�tk�rj|jd�}td�|j|�}|�r�x,|D]$}|j|	|<td|	||f��q�W|�s�|jd��rR|jd��rR|jd��s�d|k�rRt�}x(|	j�D]}|jd��r�|j|��q�Wt
|�dk�rLtd |�x|D]}
|	|
=�q<Wt�}|�r�t
|�dk�r�t�}t�}x�|	j�D]�}d}|j|} t| jd!��}!|!�r�t|!�}"|"d"}|�r�|jd#�d<k�r�t| jd$��}#|#d%k�r�d&g}|�s�q|d}$x|D]}%|%|k�r�d}$P�q�W|$�r(|j|�n
|j|��q|Wx:|D]2}
|	|
|jk�r>|j|	|
<t|jd'|
��q>Wt
|�t
d(d)�|	j�D��k�r�td*|�x&|D]}
|	|
=�q�Wntd+|d,�|	�svd-d.g}&d}'xt|&D]l}(td/|(�|(d0})x<|jj�D].}*|*j|(��s |*j|)��r|j|	|*<d}'P�qW|'�r>Ptd1|(��q�W|'�svtd2�|j|	t|jj��d<|�st j!d3d4t"|�d5�}+yt#d6d7�|�},Wnt$k
�r�d},YnXd8||f}-|,�r�|-d9|,7}-|�r�|-d:|7}-td;|+�t|-�|	S)=a9
	Obtain a best-effort PPD match for an IEEE 1284 Device ID.

	@param mfg: MFG or MANUFACTURER field
	@type mfg: string
	@param mdl: MDL or MODEL field
	@type mdl: string
	@param description: DES or DESCRIPTION field, optional
	@type description: string
	@param commandsets: CMD or COMMANDSET field, optional
	@type commandsets: string
	@param uri: device URI, optional (only needed for debugging)
	@type uri: string
        @param make_and_model: device-make-and-model string
        @type make_and_model: string
	@returns: a dict of fit (string) indexed by PPD name
	z
%s %sNFTzhewlett-packardrz&**** Incorrect IEEE 1284 Device ID: %sz **** Actual ID is MFG:%s;MDL:%s;z4**** Please report a bug against the HPLIP componentzTrying make/model namesrzmfgl: %szmdll: %sZlexmarkzkyocera mita)zhewlett-packardzlexmark internationalZkyocerazremapped mfgl: %szmake: %srrzunprefixed mdll: %sz%s: %szre-split mdll: %s�,zChecking CMD fieldzipp:zipps:Zdnssdz._ippzdriverless:rz$Removed %s due to non-IPP connectionz
ppd-device-id�CMD�:zppd-type�
postscriptZ
POSTSCRIPTz: %scSsg|]\}}|dkr|�qS)�genericr=)r��d�mr=r=r>r��sz0PPDs.getPPDNamesFromDeviceID.<locals>.<listcomp>zRemoved %s due to CMD mis-matchzNot removing %s z3due to CMD mis-match as it would leave nothing goodztextonly.ppdzpostscript.ppdz
'%s' fallbackz.gzzFallback '%s' not availablez#No fallback available; choosing anyz
//[^@]*@/?z//)�pattern�repl�stringcSs|d|S)Nr�r=)rH�yr=r=r>�<lambda>sz.PPDs.getPPDNamesFromDeviceID.<locals>.<lambda>zMFG:%s;MDL:%s;zCMD:%s;zDES:%s;zNo ID match for device %s:r)%r�	_init_idsrrT�	FIT_EXACTr^rirrE�lmakesrS�lmodelsr%r0rjrG�_findBestMatchPPDsr��typer"�_getPPDNameFromCommandSet�FIT_GENERICr�r�rRrIr(rr �
FIT_EXACT_CMDr/r&r#r$�strr�	TypeError).r`�mfg�mdl�description�commandsets�urir�Zorig_mfgZorig_mdlr�Zmfgl�mdllZ
id_matchedZeach�mdlsr2ZmfgreplZrmfgZmdlsl�prefixr6Zmfg2Zmdl2Zmdl2l�srRr�ZdriverZfailedrdZ	exact_cmdZ
ppd_cmd_fieldZppdZ
ppd_device_idZppd_device_id_dictZppd_typeZusableZpdlZ	fallbacks�found�fallbackZ
fallbackgzZppdpathZ
sanitised_uri�cmd�idr=r=r>�getPPDNamesFromDeviceIDsP



















 



zPPDs.getPPDNamesFromDeviceIDcCs�|dkrg}|dkrg}|j||||||�}||||d�}	|jt|j��|||	|�}
tdt|
��|j||
d�}td|
d|f�||
dfS)a�
	Obtain a best-effort PPD match for an IEEE 1284 Device ID.
	The status is one of:

	  - L{STATUS_SUCCESS}: the match was successful, and an exact
            match was found

	  - L{STATUS_MODEL_MISMATCH}: a similar match was found, but
            the model name does not exactly match

	  - L{STATUS_GENERIC_DRIVER}: no match was found, but a
            generic driver is available that can drive this device
            according to its command set list

	  - L{STATUS_NO_DRIVER}: no match was found at all, and the
            returned PPD name is a last resort

	@param mfg: MFG or MANUFACTURER field
	@type mfg: string
	@param mdl: MDL or MODEL field
	@type mdl: string
	@param description: DES or DESCRIPTION field, optional
	@type description: string
	@param commandsets: CMD or COMMANDSET field, optional
	@type commandsets: string
	@param uri: device URI, optional (only needed for debugging)
	@type uri: string
        @param downloadedfiles: filenames from downloaded packages
        @type downloadedfiles: string list
        @param make_and_model: device-make-and-model string
        @type make_and_model: string
	@returns: an integer,string pair of (status,ppd-name)
	N)�MFG�MDLZDESr�zFound PPDs: %srzUsing %s (status: %d))r�r�rGrjrr�r�)r`r�r�r�r�r�r�r�r�r�r��statusr=r=r>�getPPDNameFromDeviceID#s$&
zPPDs.getPPDNameFromDeviceIDcs�td�|j�}|jd�r2|dd�}|dd�}d}d}t�j��}dd�|D�}|j||f�|jtjdd	��d
�|j	||f�}||dg}	|dt
|�kr�|	j||d�t|	ddd|d|	dd�nt|	ddd|�xX|	D]P\}
}tjj
||g�}t
|�|k�r�t�|
j��}t
|�}td
|
|f��q�W|�r�|t
|�dk�r�|}
|t
|�k�r�|j}n|j}�n
|j}d}
|jtjtj�d
��fdd�|D�}d}x^|jd�D]P}|dk�r�|}d}x*tt
|��D]}||j��r�d}P�q�W|�r�|}P�q�Wd}d}d}xLtt
|��D]<}||j��rj|dk�r\|}|}|d7}n|dk�r<P�q<W|d7}d}|dk�r�t|||��}|d|�d||d�}td|||f�d}d}d}x�||k�r�td|�}||||}td|||f�xP|D]H\}}x(|jd�D]}|j�|k�r.d}P�q.W|�rt|j��}P�qW|�rnP|d7}|dk�r�P�q�W|�r�|}
|j}||
fS)z|
        Find the best-matching PPDs based on the MDL Device ID.
        This function could be made a lot smarter.
        zTrying best matchz seriesN�rcSsg|]}||j�f�qSr=)r)r�rHr=r=r>r�usz+PPDs._findBestMatchPPDs.<locals>.<listcomp>cSstj|d|d�S)Nr)rrrs)rHr�r=r=r>r�wsz)PPDs._findBestMatchPPDs.<locals>.<lambda>)rgrz <= z%s: match length %dr?csg|]}|j��|f�qSr=)r)r�rH)r�r=r>r��srFTz%dz'Searching for model ID '%s', '%s' %% %d�
z#Ignoring %d of %d digits, trying %si����i����rrrr)rrr&rGrjr_rkryrz�indexr0rWrY�commonprefixr��	FIT_CLOSEr�rrrsr"r@rB�int�pow)r`r�r�r�Zbest_mdlZ
best_matchlenZmdlnamesZ	mdlnameslrD�
candidates�	candidateZ
candidatelr�r�r�ZmdlitemsZmodelid�wordZhave_digits�digitsZdigits_startZ
digits_endZmodelnumberZmodelpatternZ
ignore_digitsr�Zdivr;rRr=)r�r>r�ds�








zPPDs._findBestMatchPPDscs|dkrg}y�j��jd�Wntk
r6dSX��fdd�}dd�|D�}d|ksld|ksld	|krt|d
�Sd|ks�d|ks�d
|ks�d|kr�|dd�Sd|kr�|dd�Sd|kr�|dd�Sd|ks�d|kr�|dd�Sd|kr�|dd�Sd|k�sd|k�sd|k�r|d�SdS)zfReturn ppd-name list or None, given a list of strings representing
        the command sets supported.Nrhcs0x*|D]"}�j�|�\}}|�jkr|SqWdS)N)r�r�)r�r6r�rR)�modelsr`r=r>r(�s


z+PPDs._getPPDNameFromCommandSet.<locals>.getcSsg|]}|j��qSr=)r)r�rHr=r=r>r��sz2PPDs._getPPDNameFromCommandSet.<locals>.<listcomp>r�Zpostscript2zpostscript level 2 emulationZ
PostScriptZpclxlzpcl-xlZpcl6zpcl 6 emulationzPCL 6/PCL XLz	PCL LaserZpcl5ezPCL 5eZpcl5czPCL 5cZpcl5zpcl 5 emulationzPCL 5ZpclzPCL 3Zescpl2zesc/p2Zescp2ezESC/P Dot Matrix)rirSr^)r`r�r(Zcmdsetsr=)r�r`r>r��s6





zPPDs._getPPDNameFromCommandSetcCs�|jr
dStj�}i}i}i}i}�x|jj�D�]�\}}t|d�}t|�}	t|	g�}
|jdg�}t|t	�st|g}tdd�|D��}|�r.t
|�dkr�t�}t|jdd��j�}|r�|d7}t|�}
xf|D]^}|j
d	�r�|jd
�r�|dt
|�d�}|�sq�t|�}|j
|
��s||}|
jt|��q�Wx�|
D]�\}}t|�}
t|�}|
|k�rp|||
<i||
<i||<n||
}|||
k�r�|||
|<i|||<n||
|}|||||<�q4W|	|
k�r�|
j|	�|
r0|	\}}||k�r||j|t��}ni||<t�}|jdd�|
D��}||||<q0Wx�|j�D]�\}}t|�}
||
}xv|j�D]j\}}||
jt|��}|�s��q^|||}x6|D].}||
jt|��}|||}|j|��q�W�q^W�q<W||_||_||_tdtj�|�dS)
Nzppd-make-and-modelzppd-productcSsg|]}|jd�r|�qS)�()r%)r�rHr=r=r>r�sz$PPDs._init_makes.<locals>.<listcomp>rzppd-makerrr��)cSsg|]}|d�qS)rr=)r�rHr=r=r>r�Yszinit_makes: %.3fs)rS�timerRr/rIrr�r(rFrGr0�rstriprEr%r&r�rn�union�updater�r�r)r`ZtstartrSr�r��aliasesrdrer1Zppd_mm_splitZppd_makes_and_modelsZppd_productsr2ZlmakeZppd_productZlprodr6Zlmodelr�Z	main_makeZ
modelnamesZ
main_modelZ	main_ppdsZ	eachmodelZ
this_modelrRr=r=r>ris�











zPPDs._init_makesc	Cs�|jr
dSi}x�|jj�D]�\}}t|jd��}|s6qt|�}|dj�}|dj�}d}t|�dkrjd}t|�dkrzd}|r�q||kr�i||<|||kr�g|||<|||j|�qW||_dS)Nz
ppd-device-idr�r�FrT)	rTrRr/rIr(rrr0r_)	r`rTrdrer�Zid_dictZlmfgZlmdlZbadr=r=r>r�rs.zPPDs._init_ids)NN)NNNNN)rNNN)rNNNN)N)�__name__�
__module__�__qualname__�__doc__ZSTATUS_SUCCESSZSTATUS_MODEL_MISMATCHZSTATUS_GENERIC_DRIVERZSTATUS_NO_DRIVERrrr�r�r�r�r�r~rfrqr{r|r}r�r�r�r�r�r�rir�r=r=r=r>r	0sL
K
C


>y
(mcCstd�dS)NzBusage: ppds.py [--deviceid] [--list-models] [--list-ids] [--debug])r]r=r=r=r>�
_show_help�sr�)"rrrLrrr�	itertoolsr�r�rl�os.pathrWryr#rrr�__all__�compilerr'r4r5rr.rr)r+�Ir,rrErIr	r�r=r=r=r>�<module>sd



.h