+
    QDbmv  c                   s    ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^RIHt ^RIH	t	 ^ RI
Ht  ! R R4      tR tR t ! R	 R
4      t ! R R]4      tR tR tR tR tR tR tR t]R8X  d
   ]! 4        R# R# )i    N)_debugprint)config)reducec                   s   a  ] tR t^t o RR.tR tR tR tR tR t	R t
R	 tR
 tR tR tRR ltRR ltR tR tR tR tR tRR ltRR ltRR ltR tRtV tR# )Printeroptionslocalc                s    Wn         W n        . V n        \        V4      ^ 8  pRpV'       d*   V P                  ! R/ VB  V P
                  '       d   RpMRpV'       d   V P                  4        RV n        R# )z
@param name: printer name
@type name: string
@param connection: CUPS connection
@type connection: CUPS.Connection object
@param kw: printer attributes
@type kw: dict indexed by string
TFN )name
connectionclass_memberslenupdateis_classgetAttributes_ppd)selfr   r   kwZhave_kwZfetch_attrss   &&&,  </usr/lib/python3.14/site-packages/cupshelpers/cupshelpers.py__init__ZPrinter.__init__   sc     	$r(Q,KK2}}}"#!	    c                sf    V P                   e#   \        P                  ! V P                   4       R # R # N)r   osunlinkr      &r   __del__ZPrinter.__del__9   s!    99 IIdii  !r   c                (    R V P                   ,          # )z<cupshelpers.Printer "%s">)r   r   r   r   __repr__ZPrinter.__repr__=   s    -		99r   c                s8   R  pRp\        V4      p\        P                   Fu  pVP                  V4      '       g   K  V! WCR 4      pWPP                  9   d   K8  VR8X  d   Rp\        W\        V P                  \        \        V4      ,          4      4       Kw  	  R# )c                 s"    V P                  4       # r   )lower)strr   r   _ascii_lowerZ+Printer._expand_flags.<locals>._ascii_lowerB   s    99;r   ZCUPS_PRINTER_NZclassr   )	r
   cupsZ__dict__
startswith_flags_blacklistZsetattrbooltypeZgetattr)r   r   ZprefixZprefix_lengthr   Z	attr_name   &     r   _expand_flagsZPrinter._expand_flags@   s    	  !F MMDv&& n!56  5 55x'ZTYYt)<<=? "r   c                sT   VP                  R^ 4      V n        V P                  \        P                  8g  V n        VP                  RR4      V n        VP                  RR4      V n        VP                  RR4      V n        VP                  RR4      V n        VP                  RR4      V n	        VP                  R	^ 4      V n
        VP                  R
R4      V n        \        V P                  4      \        8w  d   V P                  .V n        V P                  4        V P                  f   V P                  '       * V n        V =VP                  R. 4      V n        \        V P                  4      \        8w  d   V P                  .V n        V P                  P!                  4        Wn        R# )zh
Update object from printer attributes.

@param kw: printer attributes
@type kw: dict indexed by string
zprinter-statez
device-uri zprinter-infozprinter-is-sharedNzprinter-locationzprinter-make-and-modelzprinter-typezprinter-uri-supportedzmember-names)getstater   ZIPP_PRINTER_STOPPEDenabled
device_uriinfo	is_sharedlocationmake_and_modelr#   uri_supportedlistr%   Z
not_sharedr	   sortother_attributes)r   r   s   &,r   r   ZPrinter.updateS   sL    VVOQ/
zzT%=%==&&r2FF>2.	 3T:126 ff%=rBFF>1-	VV$;R@##$,"&"4"4!5D>>!!%0DNOVVNB7##$,"&"4"4!5D" "r   c                sX   V P                   P                  V P                  4      p/ V n        / V n        RRRR.3RR. RO3/V n        VP                  4        EF=  w  r#VP                  R4      '       d   VR\        R4      )  pVR9   d   K5  VP                  VR
,           R4      ;'       g'    V P
                  P                  VR4      ;'       g    Rp\        V\        4      '       d   \        R V4      pW0P                  V&   VR
,           V9   d"   WR
,           ,          pW53V P
                  V&   K  K  VP                  R
4      '       d   K  VR8w  g   EK  VR8w  g   EK  VR	8w  g   EK  VP                  R4      '       d   EK/  W0P                  V&   EK@  	  VP                  RR4      w  V n        V n        VP                  RR.4      V n        VP                  RR4      V n        VP                  RR.4      V n        VP                  R	R4      ;'       g    RV n        VP                  RR.4      V n        RV n        . V n        RV9   d   VR,          V n        RV n        MRV9   d   VR,          V n        RP/                  V P,                  4      V n        V P2                  ! R/ VB  R# )z
Fetch further attributes for the printer.

Normally only a small set of attributes is fetched.  This
method is for fetching more.
Z	landscapeZFalseZTruezpage-bordernonez-defaultNprinter-error-policyprinter-op-policyz
-supportedr&   c                 s"    V R ,           V,           # ),r   )ZxZy   &&r   Z<lambda>Z'Printer.getAttributes.<locals>.<lambda>   s    3qr   zjob-sheets-defaultzrequesting-user-name-zjob-sheets-supportedzprinter-error-policy-supportedZdefaultzprinter-op-policy-supportedTzrequesting-user-name-allowedFzrequesting-user-name-deniedz, )r3   Zsinglezsingle-thickZdoublezdouble-thick)z
job-sheetsr4   r5   znotify-eventszdocument-formatznotify-lease-duration)r3   r3   r   )r   ZgetPrinterAttributesr   
attributesr2   possible_attributesitemsZendswithr
   r'   
isinstancer0   r   r    job_sheet_startjob_sheet_endjob_sheets_supportederror_policyerror_policy_supported	op_policyop_policy_supporteddefault_allowexcept_usersZjoinexcept_users_stringr   )r   attrsZkeyvaluer   Z	supportedr$   r   r   ZPrinter.getAttributeso   s    44TYY? "7VW$56V &? @$   ++-JC||J'',S_,- 5 5
 !IId\&94@   4488tD   ud++"$8%@E(-%$- %<&7 8I6;5GD,,T2 . llL11--//,,nn&=>>-2%%c*= (@ 4999 "2440d0$)II.Dvh$O!!II&<fE&+ii,vh'8##6;HHy#(99)I;$8  ")U2 %&D ED!&D*e3 %&C DD#'99T->->#? ur   c                s    V P                   ^ ,          P                  R4      '       g   R# V P                   ^ ,          R,          pVP                  R4      ^ ,          pVP                  R4      ^ ,          pVR8X  d   RpV# )zK
Find out which server defines this printer.

@returns: server URI or None
zipp://N:i   NN/:zlocalhost.localdomainZ	localhost)r/   r    split)r   uri   & r   	getServerZPrinter.getServer   so     !!!$//99  #B'iinQiinQ))C
r   c                s   RpV P                   fL    V P                  P                  V P                  4      V n         \        P
                  ! V P                   4      pVf/   V P                   e!   \        P
                  ! V P                   4      pV#   \        P                   d1   pTP                  w  r4T\        P                  8X  d   Rp Rp?Lsh Rp?ii ; i)zo
Obtain the printer's PPD.

@returns: cups.PPD object, or False for raw queues
@raise cups.IPPError: IPP error
NF)	r   r   getPPDr   r   ZPPDIPPErrorargsZIPP_NOT_FOUND)r   resultZemargseZm   &    r   rN   ZPrinter.getPPD   s     99 OO22499=	499- >dii3XXtyy)F == ***"Fs   A
B C%%CCCc                s
   \        V\        4      '       dG   \        P                  ! \        P                  4      pVR8w  d   \        V4      P                  VR4      pV P                  P                  V P                  W4       R# )z~
Set a printer's option.

@param name: option name
@type name: string
@param value: option value
@type value: option-specific
.N)
r;   ZfloatlocaleZnl_langinfoZ	RADIXCHARr   replacer   ZaddPrinterOptionDefaultr   )r   r   rG   Z	radixchar   &&& r   	setOptionZPrinter.setOption   s]     ue$$**F,<,<=ICU++Y<//		4Gr   c                R    V P                   P                  V P                  V4       R# )zH
Unset a printer's option.

@param name: option name
@type name: string
N)r   ZdeletePrinterOptionDefaultr   )r   r   r7   r   unsetOptionZPrinter.unsetOption   s     	22499dCr   Nc                   V'       d(   V P                   P                  V P                  4       R# V'       d*   V P                   P                  V P                  VR7       R# V P                   P                  V P                  4       R# )z
Set the printer's enabled state.

@param on: whether it will be enabled
@type on: bool
@param reason: reason for this state
@type reason: string
reasonN)r   enablePrinterr   ZdisablePrinterr   onr]      &&&r   
setEnabledZPrinter.setEnabled   sQ     OO))$))4..tyy.H..tyy9r   c                r[   )z
Set the printer's accepting state.

@param on: whether it will be accepting
@type on: bool
@param reason: reason for this state
@type reason: string
r\   N)r   
acceptJobsr   Z
rejectJobsr_   ra   r   setAcceptingZPrinter.setAccepting  sQ     OO&&tyy1**499V*D**4995r   c                rY   )zY
Set the printer's shared state.

@param on: whether it will be accepting
@type on: bool
N)r   ZsetPrinterSharedr   )r   r`   r7   r   	setSharedZPrinter.setShared  s     	((B7r   c                rY   )zS
Set the printer's error policy.

@param policy: error policy
@type policy: string
N)r   ZsetPrinterErrorPolicyr   r   Zpolicyr7   r   setErrorPolicyZPrinter.setErrorPolicy  s     	--dii@r   c                rY   )z[
Set the printer's operation policy.

@param policy: operation policy
@type policy: string
N)r   ZsetPrinterOpPolicyr   rf   r7   r   setOperationPolicyZPrinter.setOperationPolicy'  s     	**499f=r   c                sR    V P                   P                  V P                  W4       R# )zv
Set the printer's job sheets.

@param start: start sheet
@type start: string
@param end: end sheet
@type end: string
N)r   ZsetPrinterJobSheetsr   )r   ZstartZendra   r   setJobSheetsZPrinter.setJobSheets0  s     	++DIIuBr   c                s   \        V\        4      '       d   VP                  4       pV Uu. uF  qDP                  R4      NK  	  pp. pV F  pVP                  V4       K  	  V Uu. uF  qDP	                  4       NK  	  ppV Uu. uF  qU'       g   K  VNK  	  ppV'       d)   V P
                  P                  V P                  V4       R# V P
                  P                  V P                  V4       R# u upi u upi u upi )z
Set access control list.

@param allow: whether to allow by default, otherwise deny
@type allow: bool
@param except_users: exception list
@type except_users: string list
r6   N)	r;   r   rJ   extendstripr   ZsetPrinterUsersDeniedr   ZsetPrinterUsersAllowed)r   ZallowrD   ZusersZuZ_f   &&&   r   	setAccessZPrinter.setAccess;  s     lC(( &&(E+015aWWS\5E1L##A& /;<|!GGI|L<)5<2BBL<OO11$))\JOO22499lK 2 =<s   C2&C7	C<C<c                s"   . p  . ROpV P                   P                  VR7      pTP                  4        F  w  rg TR,          pYP                  R4      ^,           R pYP                  8w  d   K;  T'       d   RT9   g   KL  TR,          R8X  g   K\  TP                  T4       Tf   Ks  \        T4      T8X  g   K   T# 	  T#   \         d    T P                   P                  4       p Li ; i  \        P                   d    Tu # i ; i    K  ; i)z
Find out whether jobs are queued for this printer.

@param only_tests: whether to restrict search to test pages
@type only_tests: bool
@returns: list of job IDs
job-printer-urijob-name)requested_attributesrH   Nz	Test Page)job-idrn   ro   )
r   getJobs	TypeErrorr   rO   r:   rindexr   appendr
   )	r   
only_testslimitretrjobsidrF   rK   s	   &&&      r   
jobsQueuedZPrinter.jobsQueuedR  s    	2=..Q.G IB-.**c*Q./0 iiu$z"k1

B$ce);
! &  
-  2..12 }} 	J	s4    C #D	%C)&C, (C))C, ,DD	Dc                sP   . p  . ROpV P                   P                  RVR7      pTP                  4        F  w  rV TR,          pYwP                  R4      ^,           R pYpP                  8w  d   K;  TP                  R\        P                  4      \        P                  8  d   Kp  TP                  T4       Tf   K  \        T4      T8X  g   K   T# 	  T#   \         d     T P                   P                  RR7      p Li ; i  \        P                   d    Tu # i ; i    K  ; i)	zW
Find out whether there are preserved jobs for this printer.

@return: list of job IDs
rn   	job-stateZ	completed)
which_jobsrp   )r~   rH   N)rq   rn   r}   )r   rr   rs   r   rO   r:   rt   r   r'   ZIPP_JOB_PENDINGZIPP_JOB_COMPLETEDru   r
   )r   rw   rx   ry   rz   r{   rF   rK   s   &&      r   jobsPreservedZPrinter.jobsPreservedw  s$    		H>..;EF / H IB-.**c*Q./0 ii		;//1373I3IJJJO S#Y%%7
 & 
+  H..;.GH }} 	J	s4   !C #D 'D =D ?D  D DD D%c                s(    V P                  RVR7      # )zT
Find out whether test jobs are queued for this printer.

@returns: list of job IDs
T)rv   rw   )r|   )r   rw   r7   r   testsQueuedZPrinter.testsQueued  s     4u==r   c           
     s    V P                   P                  V P                  4       \        P                  ! 4       ;_uu_ 4       p RpV P                   P                  W!P                  4       R7       TP                  ^ 4       TP                  4        Uu. uF  qUP                  R4      NK  	  ppRp^ pT Fa  pTP                  R4      '       g   K  TP!                  R4      ^,          p	YP                  8w  d   RTR	,          ,           Yh&   R
pT^,          pKc  	  T'       d   TP                  ^ 4       TP#                  T Uu. uF  qUP%                  R4      NK  	  up4       TP'                  4        TP)                  4        TP                  ^ 4        T P                   P+                  Y!P                  4       R7       TuuRRR4       #   \        P                   d]   pTP                  w  pT\        P                  \        P                  39   d    Rp?RRR4       R# \        P                  ! T4      hRp?ii ; iu upi u upi   \        P                   d     RRR4       R# i ; i  + '       g   i     R# ; i)z)
Set this printer as the system default.
z/admin/conf/lpoptions)ZfdNFzUTF-8zDefault  zDest :i   NNT)r   
setDefaultr   tempfileZTemporaryFileZgetFileZfilenor   Z	HTTPErrorrP   ZHTTP_NOT_FOUNDZHTTP_AUTHORIZATION_CANCELEDZseekZ	readlinesZdecoder    rJ   Z
writelinesZencodeZtruncateZflushZputFile)
r   fZresourcerR   slineZlinesZchangedZir   s
   &         r   setAsDefaultZPrinter.setAsDefault  s    	""499- ##&&!)2''XX['A FFAJ78{{~G~tkk'*~EGGA??J//::s+A.Dyy(#*T"X#5"&FA  
HG 4HI



!OO++X((++F I '& >> )vv,,d.N.NOO  '& nna(() H I ~~ ! E '&B!C '&&s   I,,G
1#I,H>-I,AI," I,I8I,*I>I,
H;3H6I, H66H;;I,I)I,(I))I,,I=	)r   r8   r	   r   rC   r*   r)   r?   r@   rD   rE   r+   r,   r=   r<   r>   r-   r.   r   rA   rB   r2   r9   r(   r#   r/   r   )FN)__name__
__module____qualname____firstlineno__r!   r   r   r   r%   r   r   rM   rN   rX   rZ   rb   rd   re   rg   rh   ri   rm   r|   r   r   r   __static_attributes____classdictcell__Z__classdict__   @r   r   r      s     !7+4!:?&#8BH0H D:"6"8A>	CL.#J!F>, ,r   r   c                s    V P                  4       pV P                  4       pVP                  4        FD  w  r4\        W03/ VB pWAV&   W29   g   K  W#,          Vn        VP                  P                  4        KF  	  V# )z
Obtain a list of printers.

@param connection: CUPS connection
@type connection: CUPS.Connection object
@returns: L{Printer} list
)getPrintersZ
getClassesr:   r   r	   r1   )r   ZprintersZclassesr   ZprinterrS   r   r   r     sq     %%'H##%G!)$6g6 ?$+MG!!!&&( * Or   c                s,   / pV P                  R4      pV FO  pVP                  R4      R8X  d   K  VP                  R^4      w  rEVP                  4       WP                  4       &   KQ  	  RV9   d   VP                  RVR,          4       RV9   d   VP                  RVR,          4       RV9   d   VP                  RVR,          4       R F  pVP                  VR	4       K  	  VR,          R	8X  d   . VR&   V# VR,          P                  R
4      VR&   V# )z
Parse an IEEE 1284 Device ID, so that it may be indexed by field name.

@param id: IEEE 1284 Device ID, without the two leading length bytes
@type id: string
@returns: dict indexed by field name
;rI   ZMANUFACTURERMFGZMODELMDLzCOMMAND SETCMDr&   r6   )	r   r   r   ZCLSZDESSNZSZPZJ)rJ   findrk   Z
setdefault)r{   id_dictZpiecesZpiecer   rG   r$   r   parseDeviceIDr     s    GXXc]F::c?b kk#a(!&

	 
  5'."9:'5''"235'-"89H4$ Iu~ N !--c2Nr   c                   s6   a  ] tR tRt o RtR tR tR tRtV t	R# )Devicei  z&
This class represents a CUPS device.
c                s<   Wn         VP                  RR4      V n        VP                  RR4      V n        VP                  RR4      V n        VP                  RR4      V n        VP                  RR4      V n        VP                  R4      pV^ ,          V n        \        V4      ^8H  V n
        \        V P
                  4      V n        VP                  R4      pVR8w  d?   V P                  P                  R	R4      '       g   W^,           R
 V P                  R	&   R
# R
# R
# )zV
@param uri: device URI
@type uri: string
@param kw: device attributes
@type kw: dict
zdevice-classr&   zdevice-infozdevice-make-and-modelz	device-idzdevice-locationrI   zserial=r   Nr   )rK   r'   device_classr+   r.   r{   r-   rJ   r#   r
   r   r   r   r   )r   rK   r   Z
uri_piecesr   s   &&,  r   r   ZDevice.__init__  s     FF>26FF="-	 ff%<bA&&b)0"5YYs^
]	J* %dgg.HHY74<<++T"55!$UVDLL 67r   c                r   )z<cupshelpers.Device "%s">)rK   r   r   r   r   ZDevice.__repr__  s    ,txx77r   c                s   Vf   R# V P                   VP                   8w  d   VP                   '       d   R# R# V P                  pVR8X  di   V P                  P                  R4      R8w  d   RpMEV P                  P                  R4      R8w  d   RpM"V P                  P                  R4      R8w  d   R	pVR
8X  d1   V P                  P	                  4       P                  R4      R8w  d   RpVP                  pVR8X  di   VP                  P                  R4      R8w  d   RpMEVP                  P                  R4      R8w  d   RpM"VP                  P                  R4      R8w  d   R	pVR
8X  d1   VP                  P	                  4       P                  R4      R8w  d   RpV P                   '       g   W#8w  d   VR8X  d   R# VR8X  d   R# VR8X  d   R# VR8X  d   R# VR8X  d   R# VR8X  d   R# VR8X  d   R# VR8X  d   R# VR8X  d   R# VR8X  d   R# VR8X  d   R# VR8X  d   R# VR8X  d   R# VR8X  d   R# VR8X  d   R# VR8X  d   R# VR8X  d   R# VR8X  d   R# VR	8X  d   R# VR	8X  d   R# VR8X  d   R# VR8X  d   R# VR
8X  d   R# VR
8X  d   R# VR8X  d   R# VR8X  d   R# \        V P                  4      \        VP                  4      8  pV'       g   V P                  VP                  8  pV# )z)
Compare devices by order of preference.
TFZdnssdz._ippZdnssdiz._pdl-datastreamZdnssdsz	._printerZdnssdlZusbZfaxZusbfaxZserialZparallelZhpZhpfaxZippsZippZsocketZlpdr   )r   r#   rK   r   r   r"   r{   r+   )r   ZotherZstypeZotyperQ      &&   r   __lt__ZDevice.__lt__!  s    ===ENN*~~~		Gxx}}W%+ 12b8 {+r1 E>xx~~$$U+r1 

Gyy~~g&",  23r9 ,2 E>yy %%e,2 }}}%.   
"
"}}  ~~      ~~~~  dggehh/YY+Fr   )	r   r{   r   r+   r   r-   r.   r#   rK   N)
r   r   r   r   Z__doc__r   r   r   r   r   r   r   r   r   r     s      -48^ ^r   r   c                   s,   a  ] tR tRt o R tR tRtV tR# )_GetDevicesCalli  c                s    R V9   d8   VP                  R 4      V n        V P                  VR &   VP                  ! R/ VB # RV n        VP                  ! R/ VB pV P                  W4      # )Zreply_handlerNr   )r'   _client_reply_handler_reply_handler
getDevices)r   r   ZkwdsrQ   rW   r   callZ_GetDevicesCall.call  sk    d")-?)CD&$($7$7D!((1D11%)"&&/$/""J77r   c                s   VP                  4        FL  w  r4\        V3/ VB pWRV&   VP                  R 8w  g   K(  VP                  R 8X  g   K;  VP                  Vn        KN  	  V P                  '       d   V P	                  W4       R# V# )r&   N)r:   r   r+   r.   r   )r   r   ZdevicesrK   Zdatadevicerl   r   r   Z_GetDevicesCall._reply_handler  sp     ICC(4(F!CL{{b V%:%:b%@(.%	 ) %%%&&
<Nr   )r   N)r   r   r   r   r   r   r   r   r   r   r   r   r     s     8
 
r   r   c                s8    \        4       pVP                  W4      # )z
Obtain a list of available CUPS devices.

@param connection: CUPS connection
@type connection: cups.Connection object
@returns: a list of L{Device} objects
@raise cups.IPPError: IPP Error
)r   r   )r   r   Zops   &, r   r   r     s     
	B77J##r   c                s    V P                  V4       V P                  V4       V P                  4       f   V P                  V4       R# R# )z
Set a new printer enabled, accepting jobs, and (if necessary) the
default printer.

@param connection: CUPS connection
@type connection: cups.Connection object
@param name: printer name
@type name: string
@raise cups.IPPError: IPP error
N)r^   rc   Z
getDefaultr   )r   r   r7   r   activateNewPrinterr     sD     d#4  't$ (r   c           
     s  a V3R loV3R lpV! V 4       F  pVP                   R8X  d   K  VP                  VP                   4      pV'       g   K;  VP                  VP                  8X  g   KX  VP                  pVP                   F^  pVR,          V8X  g   K  VP                  VP                   V4       \        R\        VP                   4      : R\        V4      : 24       K`  	  K  	  R# )z
Copy default options between PPDs.

@param ppd1: source PPD
@type ppd1: cups.PPD object
@param ppd2: destination PPD
@type ppd2: cups.PPD object
c                 s   < V P                   R ,          pV P                   F  pVP                  S! V4      4       K  	  V# ):NNN)r   Z	subgroupsrj   )groupr   ZggetPPDGroupOptions   &  r   r   Z*copyPPDOptions.<locals>.getPPDGroupOptions  s6    --"ANN-a01 !r   c              3   s\   <"   V P                    F  pS! V4       F  pVx  K	  	  K  	  R # 5ir   )ZoptionGroups)ppdr   optionr   r   r   iteratePPDOptionsZ)copyPPDOptions.<locals>.iteratePPDOptions  s*     "",U3\ 4 #s   ),Z
PageRegionchoicezset z = N)ZkeywordZ
findOptionZuiZ	defchoiceZchoices
markOptionr    Zrepr)Zppd1Zppd2r   r   Z
new_optionrG   r   r   s   &&     @r   copyPPDOptionsr     s    
 $D)>>\)__V^^4
:&))Z]]2$$E$,,(#U*OOJ$6$6>$
8J8J2K26,"@ A - *r   c                s    Rp. ROpV F  pW8X  g   K  RpK  	   V P                  RV4       \        RV,          4       R#    \        RT,          4        R# ; i)z
Set the PPD page size according to locale.

@param ppd: PPD
@type ppd: cups.PPD object
@param language: language, as given by the first element of
locale.setlocale
@type language: string
ZA4ZLetterZPageSizezset PageSize = %sz*Failed to set PageSize (%s not available?)N)ZCZPOSIXZenZen_USZen_CAZfr_CA)r   r    )r   ZlanguageZsizeZletterZeachr   r   setPPDPageSizer     s[     D>FD J
D)(4/0JADHIs   $A Ac                s*  a RR lp. oV3R lpR;r4V P                  R4      pV'       Ed   VP                  P                  RR4      pVP                  RR4      pVP                  R	R
4      pVP                  RR4      pVP                  R4      R8w  g   VP                  R4      R8w  d   RpVP	                  R4      pV EF  pVP                  4       P	                  R4      p	V	 F  p
V
P                  4       P	                  R4      pV^ ,          pV! V4      pV'       g   V! V4       KE  \        P                  P                  V4      R8X  g   Kk  \        V4      p^pRpW8  g   K  W,          pVP                  V4      '       d)   V\        V4      R pV! V4      pV'       g	   V! V4       K  V^,          pKZ  	  V'       d   EK   M	  V'       g
   V'       Eg2   \        P                  ! RR7      w  pp\        P                  ! V4       V P                  V4       \        P                  ! V^ \        P                   4       \        P"                  ! VRRR7      pRpV F  pVP                  V4      '       g   K  V\        V4      R P                  4       P                  R4      p VP	                  R4      w  pppT! T\$        P&                  R,           4      pT'       d   K  T! \$        P&                  R,           T,           4       K  	  S#     K  ; i)z
Check that all relevant executables for a PPD are installed.

@param ppd: PPD
@type ppd: cups.PPD object
@returns: string list, representing missing executables
c                 s   V R 8X  d   R# V P                  R4      pVR18w  d   V RV p \        V 4      ^ 8X  d   R# V ^ ,          R8X  dT   \        P                  ! V \        P                  4      '       d   \        RV ,          4       V # \        RV ,          4       R# V P                  R4      R18w  d   R# V . R	NR
NRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNR NR!NR"NR#NR$NR%NR&NR'NR(NR)NR*NR+NR,NR-NR.NR/N9   d   R# VP                  R	4       F  pVP                  \        P                  P                  4      \        P                  P                  ,           V ,           p\        P                  ! V\        P                  4      '       g   K  \        RV,          4       Vu # 	  \        V : R0V: 24       R# )2Z-Zbuiltin%NZtruerH   z	%s: foundz%s: NOT foundZ=rI   rT   Z[ZaliasZbindZbreakZcdZcontinueZdeclareZechoZelseZevalZexecZexitZexportZfiZifZkillZletr   ZpopdZprintfZpushdZpwdZreadZreadonlyZsetZshiftZshoptZsourceZtestZthenZtrapr#   ZulimitZumaskZunaliasZunsetZwaitz: NOT found in r   )
r   r
   r   ZaccessZX_OKr    rJ   ZrstrippathZsep)r   r   pZ	componentZfiler   r   	pathcheckZ%missingExecutables.<locals>.pathcheck  sv   3; IIsO78D:?7c>yy$(([4/0_t3499c?b  2S 2# 2s 2G 2V 2W 2d 22!*2,224:2<B22#2%-2/32592;A2CH2 2 %2 '/2 182 :?2 AG2  	2 "'	2 )0	2 29	2 ;C	2
 2
 $2
 &,2
 .42
 6>2
 @G2 2 !(2 *02 2 S)I##RWW[[1BGGKK?$FDyy$(([4/0	 *
 	dD9:r   c                 sd   < V P                  R 4      pVR8w  d   V RV p SP                  V 4       R# )r   Nr   )r   ru   )exer   exes_to_installs   & r   add_missingZ'missingExecutables.<locals>.add_missing  s0    HHcN7bq'C$r   NZFoomaticRIPCommandLinez&&
r&   z&quot;Z"z&lt;Z<z&gt;Z>Z(Z&r   Z|r   Zgsz-sIjsServer=T)ZtextZrtzutf-8)Zencodingz*cupsFilter:z/filter:/usr/lib64/cups/filterz/filter/)z/usr/bin:/binr   )ZfindAttrrG   rV   r   rJ   rk   r   r   Zbasenamer
   r    r   Zmkstempr   ZwriteFdZlseekZSEEK_SETZfdopenr   Zcupsserverbindir)r   r   r   r   ZexepathZattrZcmdlineZpipesZpipeZcmdsZcmdrP   ZargnZargiZsearchZargZtmpfdZtmpfnamer   r   ZmimetypeZcostr   s   &                     @r   missingExecutablesr     s   "H O% C<<12Dt**$$fb1//8S1//63///63/LL#"$LL#"$G s#D::=&&,Dyy|))3/1g#S/%
 77##W-5:DD+F+"j>>622"%c6lm"4C&/oG#* +S 1!	3 6 7? B cc %,,48
		8U
%BKK(IIudW5D''CLM*003993?,0JJ,<)XtS $S%+%<%< @> &>? w!8!8:!E!KL  s   &LLc                s     \        V 4      p. V3# )z
Check that all relevant executables for a PPD are installed.

@param ppd: PPD
@type ppd: cups.PPD object
@returns: string list pair, representing missing packages and
missing executables
)r   )r   ZexecutablesrL   r   missingPackagesAndExecutablesr   p  s     %S)Kr   c                  s    \         P                  ! 4       p \        V 4      P                  4        F#  p\	        VP
                  VP                  4       K%  	  R # r   )r   Z
Connectionr   ZvaluesZprintrK   r   )Zcr   s     r   _mainr   |  s7    AQ-&&(vzz6>>* )r   Z__main__)r   Zpprintr   r   ZreZstringrU   r&   r    r   Z	functoolsr   r   r   r   r   Zobjectr   r   r   r   r   r   r   r   r   r   r   r   <module>r      s   , . - -    r rh$:@ @Df .
$%$A@J.AF
+ Z	G r   