
    QDbN                         d dl Z d dlZd dlZddlmZ d Z G d d          Z G d d          Z G d	 d
          Z	 G d d          Z
 G d d          ZddZdS )    N   )parseDeviceIDc                     t           j        j                            t	          |                                                     }t          |          S N)xmletreeElementTreeXMLopenreadlist)filenamepreferreddriverss     </usr/lib/python3/dist-packages/cupshelpers/xmldriverprefs.pyPreferredDriversr      s<    y,00$//2F2F2I2IJJ !!!    c                   $    e Zd ZdZd Zd Zd ZdS )DeviceIDMatchzK
    A set of fields and regular expressions for matching a Device ID.
    c                 ,    t                      | _        d S r   )dict_reselfs    r   __init__zDeviceIDMatch.__init__$   s    66r   c                 x    t          j        |t           j                  | j        |                                <   d S r   )recompileIr   upper)r   fieldpatterns      r   	add_fieldzDeviceIDMatch.add_field'   s*    #%:w#=#=   r   c                     | j                                         D ][\  }}||vr dS |dk    r+d}||         D ]}|                    |          rd} n|s dS |                    ||                   s dS \dS )z
        Match against a parsed Device ID dictionary.

        The CMD field is treated specially.  If any of the
        comma-separated words in this field value match, the Device ID
        pattern is considered to match.
        FCMDT)r   itemsmatch)r   deviceidr    r&   this_field_matchescmds         r   r&   zDeviceIDMatch.match*   s     !HNN-- 	 	LE5H$$uu~~%*"#E?  C{{C(( -1* * ! 55;;00 uu tr   N)__name__
__module____qualname____doc__r   r"   r&    r   r   r   r       sK           > > >    r   r   c                   b    e Zd ZdZdZdZdZdZdZd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd ZdS )
DriverTypez
    A type of driver.
    z	exact-cmdexactclosegenericnonec                     || _         d | _        g | _        g | _         G d d          } |            | _        d | _        d S )Nc                       e Zd ZddZdS )'DriverType.__init__.<locals>.AlwaysTrueNc                     dS NTr.   )r   kds      r   getz+DriverType.__init__.<locals>.AlwaysTrue.getX   s    tr   r   )r*   r+   r,   r<   r.   r   r   
AlwaysTruer7   W   s(             r   r=   )nameppd_name
attributesr'   _fit_packagehint)r   r>   r=   s      r   r   zDriverType.__init__Q   sc    		 	 	 	 	 	 	 	 JMM	 r   c                    t          j        |t           j                  | _        | j        dS |                    dd          }t          |          dk    rv|d         }|dk    r\|d         }|                    d          r;|dd         }|                    d          }|d	k    r|d|         }d
|z  | _        dS dS dS d|z  | _        dS dS )z:
        An optional PPD name regular expression.
        N:r   r   drvz///   /z/usr/share/cups/drv/%sz/usr/lib/cups/driver/%s)	r   r   r   r?   rB   splitlen
startswithrfind)r   r!   partsschemerestrE   fs          r   add_ppd_namezDriverType.add_ppd_name^   s     
GRT22 (FsA&&;;??1XFQx??E** Kqrr(C		3ABww!"1"g,Ds,J)))K K w %>$F!!! ?r   c                 x    | j                             |t          j        |t          j                  f           dS )zl
        An optional IPP attribute name and regular expression to match
        against its values.
        N)r@   appendr   r   r   )r   r>   r!   s      r   add_attributezDriverType.add_attributew   s3    
 	rz7BD'A'A BCCCCCr   c                 :    | j                             |           dS )z8
        An optional IEEE 1284 Device ID match.
        Nr'   rS   r   deviceid_matchs     r   add_deviceid_matchzDriverType.add_deviceid_match~         	n-----r   c                     i | _         |                                D ]&}d| j         |<   || j        k    rd| j         | j        <   'd S r9   )rA   rI   	FIT_EXACTFIT_EXACT_CMD)r   textfittypes      r   add_fitzDriverType.add_fit   sU    	zz|| 	5 	5G!%DIg $.((04	$,-	5 	5r   c                     || _         d S r   )_packagekit)r   hints     r   set_packagehintzDriverType.set_packagehint   s    r   c                     | j         S )z7
        Return the name for this driver type.
        )r>   r   s    r   get_namezDriverType.get_name   s     yr   c                 4    d| j         t          |           fz  S )Nz <DriverType %s instance at 0x%x>)r>   idr   s    r   __repr__zDriverType.__repr__   s    1TYD		4JJJr   c                 (   | j                             |d          }|r#| j        r| j                            |          sd}|r[| j        D ]S\  }}||vrd} nG||         }t          |t                    s|g}d}|D ]}	|                    |	          rd} n|sd} nT|rr| j        rd|vrd}nd| j        r]|d         }
t          |
t                    s|
g}
d}|
D ]4}t          |          }| j        D ]}|                    |          rd} n5|sd}|S )z
        Return True if there is a match for all specified criteria.

        ppdname: string

        attributes: dict

        fit: string
        FTzppd-device-id)	rA   r<   r?   r&   r@   
isinstancer   r'   r   )r   r?   r@   fitmatchesr>   r&   valuesany_value_matchesvaluedeviceidlistany_id_matchesdeviceidstrr'   s                 r   r&   zDriverType.match   s    )--e,, 	t} 	T]-@-@(-K-K 	G 	#  ez))#GE#D)!6400 &$XF$)!#  E{{E** ,0) ) #GE  	$} $
!B!B $  */:!<66 2$0>L!&#/ " "K,k::H!% " " ;;11 "-1N!E" & $#Gr   c                     d S r   r.   r   s    r   get_packagehintzDriverType.get_packagehint   s    tr   N)r*   r+   r,   r-   r]   r\   	FIT_CLOSEFIT_GENERICFIT_NONEr   rQ   rT   rY   r`   rd   rf   ri   r&   ru   r.   r   r   r0   r0   F   s          $MII!KH! ! !G G G2D D D. . .5 5 5       K K K: : :x    r   r0   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )DriverTypesz!
    A list of driver types.
    c                     g | _         d S r   )drivertypesr   s    r   r   zDriverTypes.__init__   s    r   c                    g }t          |          D ]G}t          |j        d                   }t          |          D ]}|j        dk    r!|                    |j        d                    /|j        dk    r-|                    |j        d         |j        d                    g|j        dk    rmt                      }t          |          D ]9}|j        dk    r,|                    |j        d         |j        d                    :|                    |           |j        dk    r|	                    |j
                   |                    |           I|| _        dS )	zA
        Load the list of driver types from an XML file.
        r>   ppdnamer&   	attributer'   r    rl   N)r   r0   attribtagrQ   rT   r   r"   rY   r`   r^   rS   r|   )r   r|   types
drivertypetchildrX   r    s           r   loadzDriverTypes.load   sy   
 {++ 	 	JJ-f566Aj)) + +9	))NNEL$9::::Y+--OOU\&%9%*\'%:< < < <Y*,,%2%5%5N!%e M M 9//*44el66J6;l76KM M M ((.9999Y%''IIuz***LL! r   c                 P    | j         D ]}|                    |||          r|c S dS )z
        Return the first matching drivertype for a PPD, given its name,
        attributes, and fitness, or None if there is no match.
        N)r|   r&   )r   r~   ppddictrl   r   s        r   r&   zDriverTypes.match   sH     * 	" 	"J'377 "!!!!" tr   c                 J    t          j        d | j        D             |          S )z[
        Return the subset of driver type names that match a glob
        pattern.
        c                 6    g | ]}|                                 S r.   )rf   ).0xs     r   
<listcomp>z&DriverTypes.filter.<locals>.<listcomp>  s     HHH!

HHHr   )fnmatchfilterr|   r   r!   s     r   r   zDriverTypes.filter
  s/     ~HHt7GHHH&( ( 	(r   c           	         g }i }t           j        }|                                D ]y\  }}|                     |||                    ||                    }	|	r|	                                }
nd}
|                    |
g           }|                    |           |||
<   z|D ]7}|                    |g           D ]}||v r|                    ||f           8|S )a  
        Given a list of driver type names, a dict of PPD attributes by
        PPD name, and a dict of driver fitness status codes by PPD
        name, return a list of tuples in the form (driver-type-name,
        PPD-name), representing PPDs that match the list of driver
        types.

        The returned tuples will have driver types in the same order
        as the driver types given, with the exception that any
        blacklisted driver types will be omitted from the returned
        result.
        r4   )r0   rv   r%   r&   r<   rf   rS   )r   r|   ppdsdictrl   ppdnamesppdtypesfit_defaultr?   ppd_dictr   r>   mdrivertypenames                r   get_ordered_ppdnamesz DriverTypes.get_ordered_ppdnames  s      *"*.."3"3 
	 
	HhXx(BM:O :O P PJ !**--dB''AHHhHTNN * 	= 	=N$LL."== = =x''.(!;<<<<	= r   N)	r*   r+   r,   r-   r   r   r&   r   r   r.   r   r   rz   rz      si           ! ! !<
 
 
( ( (' ' ' ' 'r   rz   c                   N    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZdS )PrinterTypez
    A make-and-model pattern and/or set of IEEE 1284 Device ID
    patterns for matching a set of printers, together with an ordered
    list of driver type names.
    c                 |    d | _         g | _        g | _        t                      | _        t                      | _        d S r   )make_and_modelr'   drivertype_patternssetavoid	blacklistr   s    r   r   zPrinterType.__init__C  s3    "#% UU
r   c                 N    t          j        |t           j                  | _        dS )zR
        Set a make-and-model regular expression.  Only one is permitted.
        N)r   r   r   r   r   s     r   add_make_and_modelzPrinterType.add_make_and_modelJ  s      !j'2488r   c                 :    | j                             |           dS )z(
        Add a Device ID match.
        NrV   rW   s     r   rY   zPrinterType.add_deviceid_matchP  rZ   r   c                 ^    | j                             |                                           dS )z/
        Append a driver type pattern.
        N)r   rS   stripr   r>   s     r   add_drivertype_patternz"PrinterType.add_drivertype_patternV  s)     	 ''77777r   c                     | j         S )z:
        Return the list of driver type patterns.
        )r   r   s    r   get_drivertype_patternsz#PrinterType.get_drivertype_patterns\  s     ''r   c                 :    | j                             |           dS )z3
        Add an avoid driver type pattern.
        N)r   addr   s     r   add_avoidtype_patternz!PrinterType.add_avoidtype_patternb  s     	
r   c                     | j         S )zB
        Return the set of driver type patterns to avoid.
        )r   r   s    r   get_avoidtype_patternsz"PrinterType.get_avoidtype_patternsh  s     zr   c                 :    | j                             |           dS )z8
        Add a blacklisted driver type pattern.
        N)r   r   r   s     r   add_blacklistedzPrinterType.add_blacklistedn  s      	D!!!!!r   c                     | j         S )zE
        Return the set of blacklisted driver type patterns.
        )r   r   s    r   get_blacklistzPrinterType.get_blacklistt  s     ~r   c                     | j         du o
| j        g k    }| j         r| j                             |          rd}|s#| j        D ]}|                    |          rd} n|S )a}  
        Return True if there are no constraints to match against; if
        the make-and-model pattern matches; or if all of the IEEE 1284
        Device ID patterns match.

        The deviceid parameter must be a dict indexed by Device ID
        field key, of strings; except for the CMD field which must be
        a list of strings.

        Return False otherwise.
        NT)r   r'   r&   )r   r   r'   rm   r&   s        r   r&   zPrinterType.matchz  s     &$.F4=B3F 	"((.99  	  ;;)) "GE r   N)r*   r+   r,   r-   r   r   rY   r   r   r   r   r   r   r&   r.   r   r   r   r   <  s           9 9 9. . .8 8 8( ( (    " " "      r   r   c                   $    e Zd ZdZd Zd Zd ZdS )PreferenceOrderzA
    A policy for choosing the preference order for drivers.
    c                     g | _         d S r   )ptypesr   s    r   r   zPreferenceOrder.__init__  s    r   c                 >   t          |          D ]}t                      }t          |          D ]O}|j        dk    r!|                    |j        d                    /|j        dk    rmt                      }t          |          D ]9}|j        dk    r,|                    |j        d         |j        d                    :|                    |           |j        dk    r-t          |          D ]}|                    |j	                   |j        dk    r.t          |          D ]}|
                    |j	                   |j        dk    r,t          |          D ]}|                    |j	                   Q| j                            |           d	S )
z3
        Load the policy from an XML file.
        zmake-and-modelr&   r'   r    r>   driversr   r   N)r   r   r   r   r   r   r"   rY   r   r^   r   r   r   rS   )r   r   printerptyper   rX   r    r   s           r   r   zPreferenceOrder.load  s   
 ,-- 	' 	'GNNEg @ @9 000,,el7.CDDDDY*,,%2%5%5N!%e M M 9//*44el66J6;l76KM M M,,n====Y)++&*5kk G G
44joFFFFG Y'))&*5kk F F
33Z_EEEEF Y+--&*5kk @ @
--z????K&&&&3	' 	'r   c                 2   |i }|d}g }t                      }t                      }| j        D ]}|                    ||          r|                                D ]3}|                    |          D ]}	|	|vr|                    |	           4|                                D ]/}|                    |          D ]}	|                    |	           0|                                D ]/}|                    |          D ]}	|                    |	           0|rZg }
|D ]@}	 |	                    |          }||= |
                    |           1# t          $ r Y =w xY w|                    |
           |r"g }|D ]}||vr|                    |           |}|S )a  
        Return an accumulated list of driver types from all printer
        types that match a given printer's device-make-and-model and
        IEEE 1284 Device ID.

        The deviceid parameter must be None or a dict indexed by
        short-form upper-case field keys.
        N )r   r   r&   r   r   rS   r   r   r   index
IndexErrorextend)r   r|   r   r'   orderedtypesr   
avoidtypesr   r!   r   avoidedr   i	remainings                 r   get_ordered_typesz!PreferenceOrder.get_ordered_types  s-    H!NEE	UU
[ 	3 	3E{{NH55 3$<<?? = =G&1&8&8'&B&B = =
%\99(//<<<=
  %;;>> 4 4G&1&8&8'&B&B 4 4
"
33334  %2255 3 3G&1&8&8'&B&B 3 3
!z22223  
	*G  $**A..A$QNNA&&&&!   H ))) 	%I! ) )I%%$$a((($Ls    -E
EEN)r*   r+   r,   r-   r   r   r   r.   r   r   r   r     sL           ' ' '@= = = = =r   r   Fc           
         dd l }dd l}ddlm} ddlm} ddlm} dd l}	|rd }
|                    |
           |                    |j	        d           | Q|	j
                            |	j
                            |	j
                            t                    d          d	          } | |	j        d
<   |	j
                            | d          }  |            }t          |           \  }}t!                      }|                    |           t%                      }|                    |            |            |z
  }|rt'          d| |fz             |                                }	 |                                }n$# t,          $ r |                                }Y nw xY w|                    |          }|s|r|r*|                    d           |                                }n't7          |          }d||d         d|d         di}|                                D ]Z\  }}|                    d          dk    r |                    dd          }t?          |t@                    r|d         }|sV|!                    d          st'          |           t7          |          }|"                    |d         |d         |d         |d         |          }|                    dd          }|#                    |||          }i }|$                                D ]}|%                    |          ||<   |&                    |||          }d}|D ]&\  }} t'          d|| |||          fz             |dz  }'\d S |'                                D ]}!|(                    |!          D ]}"|)                    |!|"          }#|!dz   |"z   }|#                    ||d           }i }|#$                                D ]}tT          j+        ||<   |&                    ||#|          }t'          |dz              d}|D ]\  }} t'          d|| |fz             |dz  } t'                       d S )Nr   r   )ppds)pprint)timec                 $    t          |            d S r   )print)r   s    r   
debugprintztest.<locals>.debugprint  s    1IIIIIr   r   z..r   CUPSHELPERS_XMLDIRzpreferreddrivers.xmlzTime to load %s: %.3fsrootz	xxx://yyyMFG MDL)	device-iddevice-make-and-modelrD   rH   r   zxxx:DESr$   r   z%d  %s
    (%s, %s)z%d  %s
    (%s)),cupslocaler   r   r   r   os.pathset_debugprint_fn	setlocaleLC_ALLpathjoindirname__file__environr   rz   r   r   r   
ConnectiongetPPDs2AttributeErrorgetPPDsPPDssetUser
getDevicesr   r%   findr<   rk   r   rK   getPPDNamesFromDeviceIDr   keysgetInfoFromPPDNamer   getMakes	getModelsgetInfoFromModelr0   rv   )$xml_pathattachedr'   debugr   r   r   r   r   osr   	loadstartxmldrivertypesxmlpreferenceorderr|   	preforderloadtimeccupsppds	ppdfinderdevicesdevidurideviceid_dictrl   mmr   r~   orderedppdsr   r   ppdmakemodelr   s$                                       r   testr    sC   KKKMMMNNN ,	 	 	 	
+++
fmR(((7<<rw/I/I/3"5 "5!&( ( (0BJ#$w||X'=>>HI+;X+F+F(^'..Kn%%%""INN&'''tww"H ?&(H)==>>>A ::==      99<<  		8$$I E8 E 
	LL&!!!llooGG!8,,E#+3BG,,,BG,,8P   G #==++ #	 #	KCxx~~##JJR00E5$'' !a >>6** s#U++G33WU^5<U^5<U^5<U^58	: :C 4b99B$668:GE EL D88;; G G ) < <g F FW%::L<@<?A AK A%  3,33s8/DDEEEQC#	 #	J &&)) 	 	D",,d33  $55tUCCCZ%'(::K<> F  F '}}// 8 8G#-#7CLL)>>@H#O Ob3h)  FAs,3{:;;;FAA%	 	s   &E; ;FF)NFNF)r   r   xml.etree.ElementTreer   cupshelpersr   r   r   r0   rz   r   r   r  r.   r   r   <module>r	     sW  .  				     & & & & & &" " "$ $ $ $ $ $ $ $LP P P P P P P Pdb b b b b b b bHV V V V V V V Vpe e e e e e e ePo o o o o or   