
    =	fe                     n   d dl Z d dlZ d dlZd dlZd dlZd dlZd dlZd dl d dlm	Z	m
Z
mZ d dlmZ dZ	  e j                  d      ZdZe*ej%                  d      rej'                  d      \  ZZed	z  Zee j*                  d<    e	j,                  d
      Zeee j*                  d<   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Z.dZ/dZ0d Z1d!Z2d"Z3d#Z4d$Z5d%Z6d&Z7d'Z8d(Z9d)Z:d*Z;d+Z<d,Z=dZ>dZ?dZ@d-ZAd.ZBd/ZCd/ZDd ZEdZFdZGdZHdZIdZJd-ZKd.ZLd0ZMd1ZNd2ZOd3ZPd4ZQd5ZRd6ZSd7ZTd8ZUd9ZVd:ZWd;ZXd<ZYd=ZZd>Z[d?Z\d@Z]dAZ^dBZ_dCZ`dDZadEZbdFZcdGZddHZedIZfdJZgdKZhdLZidMZjdNZkdOZldPZmdQZndRZodSZpdTZqdUZr ej                  dVej                        Zu ej                  dWej                        Zw ej                  dXej                        Zx ej                  dYej                        ZydZ Zzd[ Z{d\ Z|dd]Z}dd^Z~d_ Zd` Zda Zdb Z ej                  dcej                        Zg ddZ ee
j                  j                               D ]  Zdeez  Zeevsej                  e         edd Zej                  g df       dg Zdh Zdi Zdj Zdk Zdl ZddmZdn Zdo Zdp Zdq Zdr Zds Zdt Zdu Zdv Zdw Zdx Zdy Zdz Zd{ Zdd|Zdd}Zd~ Zd Zd ZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy# e$ r8  e j                  d      s"ej5                  d       ej9                  d       Y w xY w)    N)*)utilsmodelsos_utils)PY3z!~`!@#$%^&*()=+[]{}()\/,.<>?'";:| LANGC.z.UTF-8cupsextHPLIP_BUILDz=CUPSEXT could not be loaded. Please check HPLIP installation.               d   e   f   g   h   i   j   k   l   m            i@  i@  i@  i@  i@  i@  i@  i@  i	@  i
@  i@  i@  i@  i@           i   i   i  i  i  i  i  i  i  i  i	  i
  i  i  i  i  i  i  i  i  i  i  i  i  i  i   i  i  i  i  i  i  i  i  i	  i
  i   i  z\*NickName:\s*\"(.*)"z/^loglevel\s?(debug|debug2|warn|info|error|none)z.*hp-(.*?)(-.*)*\.ppd.*z.*hp-(.*?)(_.*)*\.ppd.*c                     t               }t        j                         }|j                  d      }g }|D ]  }| |v s||   d   } t        j                  D ]
  }||v s|c S  y )NFzfamily-class)
getPPDPathr   	ModelDataread_all_filesFAMILY_CLASSES)model
models_dirmdictfamily_typefs         /usr/share/hplip/prnt/cups.pygetFamilyClassNamer.      st    JA	
		%	 DK /A:Aw~.+/ "" 8    c                 \   t        j                         }|j                  d      }|D ]  }| |v r{t        d||          d}|||   j	                         v r||   d   dz   }9| j                  d      r| dz   }P| j                  d      r| j                  dd      }|dz   }yd| z   dz   } S )	zq
    get ppds from models.dat for postscript printers
    for pclm printers forming ppd name from model name
    Fzdict[m]ppd-name.gzapolloz.ppd.gzhp_hp-)r   r$   r%   printkeys
startswithreplace)r'   r)   r*   keyppd_namemodel1s         r-   
getPpdNamer=      s     	A	
		%	 D A:
	$q'
"#DGLLN"Awz*U2X   *	/""5)uU3 *+i/ )* Or/   c                     d}d}t        |d      }|D ]4  }d|v s|j                  d      }||dz   t        |      dz
   }|dk(  s3d}6 |S )Nr   /etc/hp/hplip.confrzclass-driver=r   yesopenfindlen)ppdsfamily_checkfilename_config	file_conflinecountfamily_check_strs          r-   isfamilydrvrN      sl    L
 +O_S)I !T!IIcNE#E!GCIaK85( ! r/   c                     | g } t         j                  j                  d      | z   }|D ]E  }t        j                  j                  |d      }t        j                  j                  |      sC|c S  y)z
        Returns the CUPS ppd path (not the foomatic one under /usr/share/ppd).
        Usually this is /usr/share/cups/model.
    N;z
cups/model)propppd_search_pathsplitospathjoinexists)addtional_pathssearch_pathsrU   ppd_paths       r-   r#   r#      sb    
 ''--c2_DL 77<<l377>>(#Or/   c                     d}t        |d      }|D ],  }d|v s|j                  d      }||dz   t        |      dz
   }. S )z*
        return path for hplip ppds. 
    r?   r@   zppd=rA   r   rC   )rX   rI   rJ   rK   rL   rZ   s         r-   getPPDPath1r\      sW    
 +O_S)I 1T>IIcNEE!GCIaK0H	1 Or/   c                     g } g }g }t         j                  j                  d      r| j                  d       t         j                  j                  d      r| j                  d       | D ]&  }|j	                  t        j
                  |             ( |D ]b  }t        |d      }|D ]O  }|j                  d      rt        |      dkD  s$	 |j                         \  }}}	}
|dvs?|j                  |       Q d |j                  d	       |j                  d
       |j                  d       |j                  d       |S # t        $ r Y w xY w)zk
        Scan all /etc/cups/*.convs and /usr/share/cups/mime
        files for allowable file formats.
    z	/etc/cupsz/etc/cups/*.convsz/usr/share/cups/mimez/usr/share/cups/mime/*.convsr@   #r   )zapplication/octet-streamzapplication/vnd.cups-postscriptzimage/x-bmpztext/cppzapplication/x-pythonzapplication/hplip-fax)rT   rU   rW   appendextendglobrD   r8   rF   rS   
ValueError)pathsallowable_mime_typesfilesrU   r,   	conv_filerK   sourcedestcostprogs              r-   getAllowableMIMETypesrk     s9   
 EE	ww~~k"()	ww~~,-34 &TYYt_%& 8CL	 	8D??3'CIM04

,FD$ !``(//7	8	8 .
+ 67 78 " s   
D??	E
Ec                 6   | j                  d      r&t        j                  | d      j                  d      }nt	        | d      j                  d      }	 t
        j                  |j                  d            j                  d      }|S # t        $ r d}Y |S w xY w)Nr2   r@   i   utf-8r    )
endswithgzipGzipFilereadrD   nickname_patsearchdecodegroupAttributeError)r,   nicknamedescs      r-   getPPDDescriptionrz   0  s    zz%==C(--d33<$$T*""8??7#;<BB1E K  Ks   3B	 	BBc                     t               \  } }}i }| dk(  r|dk  rt        j                  dd      }t        j	                  d|z         t        j                  |dd      D ]I  }t        |      }d	|v rd
|j                         v r&d
|v r+|||<   t        j	                  |d|       K |S t        j	                  d       t        j                         }t               }t        j                  ddd      }	|	rt        j                  j                  |	      sd}	t        j	                  d|z         t        j	                  d|	z         |D ]  }
|
sd|
j                         v sd|
j                         v s,||
   d   dk(  s8||
   d   }d	|j                         v rSd
|j                         v rfd
|
v rkt        j                  j                  |
      r|
}n	 t        j                  j                  |	|
      }t        j                  j                  |      sC	 t        j                  j                  ||
      }t        j                  j                  |      s|
}	 |||<    |S # t         $ r |
}Y w xY w# t         $ r |
}Y (w xY w)Nr   r   dirsppdz&(CUPS 1.1.x) Searching for PPDs in: %szHP*ppd*;hp*ppd*Tpattern	abs_pathsfoo2
gutenprintz: z8(CUPS 1.2.x) Getting list of PPDs using CUPS_GET_PPDS...ppdbasez/usr/share/ppdzCUPS PPD base path = %szFoomatic PPD base path = %sr5   r4   zppd-makeHPzppd-make-and-model)getVersionTuplesys_confgetlogdebugr   	walkFilesrz   lowerr   
getPPDListr#   rT   rU   rW   rV   rw   )majorminorpatchrG   ppd_dirr,   ry   ppd_dictcups_ppd_pathfoomatic_ppd_pathr}   rU   s               r-   getSystemPPDsr   >  sF   )+E5%Dzeai,,vu-		:WDE2CtT 	0A$Q'DdN DJJL0 A%Q		a./	0x Kc 			LM%%'"$LL<LM 7H(I 0		+m;<		/2CCD #	&C		#u		';j)T1}%9:$**,.$

4$+ ww~~c*"3#%77<<0A3#GD $&77>>$#7!3+-77<<s+KD ,.77>>$+?/2!%DJG#	&L K (6 !/+.D!/  . '#&D's$    I9 I((I65I69JJc                 j   t        |       t        |      }}||kD  r|| }} ||}}t        t        |dz               }t        d|dz         D ]c  }||gdg|z  z   }}t        d|dz         D ]C  }||   dz   ||dz
     dz   }	}||dz
     }
| |dz
     ||dz
     k7  r|
dz   }
t        ||	|
      ||<   E e ||   S )za
    Calculates the Levenshtein distance between a and b.
    Written by Magnus Lie Hetland.
    r   r   )rF   listrangemin)abnr)   currentipreviousjadddeletechanges              r-   levenshtein_distancer     s    
 q63q6qA1u!!51:G1QqS\ 
2#aS!QY'q1 	2A"1+a-1aCac]F1v1Q3!S&&1GAJ	2
2 1:r/   z.*?(\d+))z	foomatic:r5   r4   zhp r2   z.ppdzdrv:z-pclz-pcl3z	-jetreadyz-zxsz-zjsz-psz-postscriptz-pdfz-jrz-lidlz-lidilz-ldlz-hpijsz-%s)z-seriesz series_seriesc                 `    | j                         } t        D ]  }| j                  |d      }  | S Nrn   )r   STRIP_STRINGS2r9   r'   xs     r-   stripModel2r     s3    KKME %a$% Lr/   c                 `    | j                         } t        D ]  }| j                  |d      }  | S r   )r   STRIP_STRINGSr9   r   s     r-   
stripModelr     s3    KKME %a$% Lr/   c                 x   t         j                  d       i }i }t        j                  }t         j                  d| z         |D ]m  }t	        t
        j                  j                  |            }t        | |      ||<   ||   dk  rt         j                  d|||   fz         t        |||         }o t         j                  d|z         |D ][  }||   |k(  s|D ]C  }t
        j                  j                  |      t
        j                  j                  |      k(  sC S ||   ||<   ] t         j                  |       t        |      dkD  rt         j                  d       	 t        j                  |       j                  d      }t        |      }t         j                  d|z         i }	t        d	      D ]D  }
d
|
z  }t         j                  d|z         t        ||z        |z  }d\  }}|D ]  }	 t        j                  t
        j                  j                  |            j                  d      }t        |      }t         j                  d|z         t        ||z        |z  }t         j                  d|z         t         j                  d|z         ||k(  r7t         j                  d       |dz  }||   |	|<   t         j                  |	       t         j                  d        t        |	      sB|	} |S  |S |S # t         $ r Y t"        $ r Y *w xY w# t         $ r Y |S t"        $ r Y |S w xY w)zM
        Match up a model name to a PPD from a list of system PPD files.
    z1st stage edit distance matchzFDetermining edit distance from %s (only showing edit distances < 4)...r   zdist('%s') = %dzMin. dist = %dr   z$2nd stage matching with model numberzmodel_number=%dr   
   zFactor = %d)r   rn   zmins_model_number= %dzmins_adj_model_number=%dzadj_model_number=%dmatchz***)r   r   sysmaxsizer   rT   rU   basenamer   r   rF   
number_patr   rv   intr   rw   rb   )stripped_modelrG   minsedsmin_edit_distancer,   tr)   model_numbermatchesr   factoradj_model_numbernumber_matchingr   mins_model_numbermins_adj_model_numbers                    r-   
getPPDFiler     s(    II-.D
CIIVYggh ;rww''*+%na8Aq6A:II'1c!f+56 13q6:; II!223 "q6&& "77##A&"''*:*:1*==" q'Q" IIdO
4y1}		89(	%++N;AA!DL|,L II',67G1X Q		-&01#&|F':#;F#B ).& %A!,6,<,<RWW=M=Ma=P,Q,W,WXY,Z),/0A,B)		"9<M"MN -00A&0H,I&,P)II8;PPQII36FFG,0@@		'*'1,%)!W
		'*IIe$)%, w<"DKA@ K4K+ * ! % ! !)  	L KK  	H KK	s1   &/L! 7A$L	LLL!	L9-L98L9c           	      
   t        |      }t        |      }t        j                  |      }|dk(  r| j	                  dd      }n| j	                  dd      }|dk(  rt        |      }nt        |      }t        j                  d|z         g }|dk(  r|D ]  }t        j                  |      }	|	|	j                  d      |k(  s0t        j                  d|z         	 |	j                  d      j                  d      }
t        j                  rd	|vs1t        j                  rd	|
v st        j                  rd	|
vs	d
|
v sd|
v s|j!                  ||
D cg c]  }|s|d	k7  s| c}f        n|D ]  }t"        j                  |      }	|	|	j                  d      |k(  s0t        j                  d|z         	 |	j                  d      j                  d      }
t        j                  rd	|vs1t        j                  rd	|
v st        j                  rd	|
vs	d
|
v sd|
v s|j!                  ||
D cg c]  }|s|d	k7  s| c}f        t        j                  |       t%        |      }|dk(  rPt        j                  d|z         t'        t)        t+        |      |      j-                               }t        j                  |       t%        |      }|r|D ]  \  }}t        j                  |      }	|	t        j                  d|z         	 |	j                  d      j                  d      }
t        j                  rd	|vs1t        j                  rd	|
v st        j                  rd	|
vs	d
|
v sd|
v s|j!                  ||
D cg c]  }|s|d	k7  s| c}f        t        j                  |       t%        |      }|dk(  r"t        j/                  dt+        |      z         y |dk(  rt        j                  d       |d   d   dfS t        j                  d|z         t        j0                  t        j2                  t        j4                  t        j6                  fD ]i  }|D ]b  \  }}|D ]X  }t        j8                  j	                  |t        j0                        |k(  s5t        j                  d|d|       |dfc c c S  d k t        j                  d|z         dD ]0  }|D ])  \  }}||v st        j                  d|z         |dfc c S  2 t        j                  d       |d   d   dfS # t        $ r g }
Y Kw xY wc c}w # t        $ r g }
Y w xY wc c}w # t        $ r g }
Y Fw xY wc c}w )Nr   r1   z
family-ppdz!Matching PPD list to model  %s...r   zFound match: %sr   -hpijspspdfzFNo PPD found for model %s using new algorithm. Trying old algorithm...z.No PPD found for model %s using old algorithm.zOne match found.rn   zC%d matches found. Searching based on PDL: Host > PS,PDF > PCL/OtherzSelecting '-z' PPD: z<%d matches found. Searching based on Filters: HPCUPS > HPIJS)hpcupsr   zSelecting PPD: %sz<No specific PDL located. Defaulting to first found PPD file.)rN   r.   r   normalizeModelNamer   r   r   r   ppd_patr   rv   rS   rw   rQ   hpcups_buildhpijs_buildr_   ppd_pat1rF   r   r   r   itemserrorPDL_TYPE_HOSTPDL_TYPE_PSPDL_TYPE_PDFPDL_TYPE_PCL	PDL_TYPES)mqr'   rG   rH   family_classr;   r   r   r,   r   pdlspnum_matchesmatches2num_matches2dpdl_listr   s                     r-   getPPDFile2r     s    T"L#E*L%%e,EQ&&A&x&&a(x1}$U+$X.II1NBCGa 	WAMM!$E ;;q>^3II/!34##kk!n2237t ))gQ.>**w$DDUDUZaimZm$,ETM!..!-TAqG|a-T)UV	W  	WANN1%E ;;q>\1II/!34##kk!n2237t ))gQ.>**w$DDUDUZaimZm$,ETM!..!-TAqG|a-T)UV	W IIgg,Ka		Z]kkl
:n#=tDJJLM		(8}  U1a($II/!34"${{1~33C8 ))gQ.>))go4CTCTY`hlYl%4-t+R!qQ'\A+R'STU 			''la		BZP^E__`				$%
1r"" IISVaab""F$6$6v7J7JFL_L_` #" 	#KAx ###''6+?+?@AEII1a@Ar7N	#	## IIL{Z[ " 	KAxAv		-342w	 IILMAJqM2U * # "#
 .U * # "#
 .U" * "!" ,Ssl    T9UUU9 U.U"6U"<U" U'U9U9U99UUUU'U65U6c                    	 d }d}d}t         j                  d|t        j                  fz         t        j                  r\| j	                  dt
              }|t        k(  rd}d}n|t        k(  s	|t        k(  rd}d}n|t        k(  rd	}d
}n|t        k(  rd}d}nd}d}n| j	                  dt
              t        k(  rd}d}| j	                  dt
              t        k(  s| j	                  dt
              t        k(  rd}d}| j	                  dt
              t        k(  rd}d}nd}d}g }t        j                  t        j	                  dd      dd      D ]  }|j                  |        t         j                  d|z         |D ]A  }|j                  |      dk\  st!        |      |k(  s'|}t         j                  d|z          n t         j#                  d|z         |||fS # fc cY S xY w)NzHP Fax hpcupszHP-Fax-hpcupsz4Searching for fax PPD for model %s  hpcups_build =%dzfax-typezHP-Fax3-hpcupszHP Fax3 hpcupszHP-Fax2-hpcupszHP Fax2 hpcupszHP-Fax4-hpcupszHP Fax4 hpcupszHP-Fax-CDM-hpcupszHP Fax CDM hpcupszHP-Fax3-hpijszHP Fax3 hpijszHP-Fax2-hpijszHP Fax2 hpijszHP-Fax4-hpijszHP Fax4 hpijszHP-Fax-hpijszHP Fax hpijsr|   r}   zHP-Fax*.ppd*Tr~   zppds=%sr   zFound fax PPD: %sz8Unable to locate the HPLIP Fax PPD file: %s.ppd.gz file.)r   r   rQ   r   r   FAX_TYPE_NONEFAX_TYPE_MARVELLFAX_TYPE_SOAPFAX_TYPE_LEDMSOAPFAX_TYPE_LEDMFAX_TYPE_CDMr   r   r   r_   rE   rz   r   )r   r'   fax_ppdnickexpected_fax_ppd_namefaxTyperG   r,   s           r-   getFaxPPDFiler     s   23 /		HERVRcRcKddeffZ7G**(8%'M)W8I-I(8%'M)(8%'L((;%*(7%& vvj-04DD(7%&vvj-0MARVVJXeEfj{E{(7%&vvj-0MA(7%&(6%%fe!<n`de 	AKKN			)D.! 	hAvv+,16G6Jd6R		-12		h IIPQffg ,d22w,d22s   FG  G  &5G   G*c                     d} 	 t        | d      }|D ]T  }t        j                  |      }||j                  d      j	                         }t
        j                  d|z         |c S  	 t
        j                  d       y# t        $ r t
        j                  d| z         Y 9t        $ r t
        j                  d| z         Y [w xY w)	Nz/etc/cups/cupsd.confr@   r   zCUPS error_log LogLevel: %sz%s not found.z%s: I/O error.z CUPS error_log LogLevel: unknownunknown)
rD   pat_cups_error_logr   rv   r   r   r   OSErrorr   IOError)	cups_confr,   lr)   levels        r-   getErrorLogLevelr     s    &IC   	A"((+A}
((*		7%?@	 II01  /		/I-. 0		"Y./0s   B   !C# CCc                 h   g }d| z  }d}	 	 t        |d      }|t        |d      j                         v rt        j                         }d}	 |j	                         }	||	v rfd}t        |      r+|j                  |j                                t        |      r+|j                  |	j                                t        |      |kD  r1n1|r.|j                  |	j                                t        |      |kD  rndj                  |      S # t        t        f$ r t        j                  d|z         Y yw xY w)	Nz[Job %d]z/var/log/cups/error_logr@   FT
z*Could not open the CUPS error_log file: %srn   )rD   rr   r   QueuereadlinerF   r_   r   stripputrV   r   r   r   r   )
job_id	max_linescont_intervalretsr   r,   queue	job_foundrK   s
             r-   getPrintJobErrorLogr    s   
CVA)I 	 	"Y$A DC(--//!	::<DDy$(	!%jJJuyy{3 "%j 

4::<0s8i/! %!IIdjjl3"5zM9 %' * 99S>!= ! 	IIBYNO	s   D 'D10D1c                  \    t         j                         } | t        j                  d       | S )Nz$The CUPS default printer is not set.)r   getDefaultPrinterr   r   )r@   s    r-   r  r    s'    !!#Ay		89Hr/   c                 f    t         rt        | d      } t        d       t        j	                  |       S )Nrm   zOYou do not have permission to set the default printer. You need authentication.)r   strsetPasswordPromptr   setDefaultPrinterprinter_names    r-   r  r  	  s+    
,0|gh$$\22r/   c                 8    t        d       t        | t              S )NzVYou do not have permission to accept jobs on a printer queue. You need authentication.)r  controlPrinterCUPS_ACCEPT_JOBSr  s    r-   acceptr        no,(899r/   c                 8    t        d       t        | t              S )NzVYou do not have permission to reject jobs on a printer queue. You need authentication.)r  r  CUPS_REJECT_JOBSr  s    r-   rejectr    r  r/   c                 8    t        d       t        | t              S )NzMYou do not have permission to start a printer queue. You need authentication.)r  r  IPP_RESUME_PRINTERr  s    r-   startr    s    ef,(:;;r/   c                 8    t        d       t        | t              S )NzLYou do not have permission to stop a printer queue. You need authentication.)r  r  IPP_PAUSE_PRINTERr  s    r-   stopr    s    de,(9::r/   c                 8    t        d       t        | t              S )NzBYou do not have permission to purge jobs. You need authentication.)r  r  IPP_PURGE_JOBSr  s    r-   purger    s    Z[,77r/   c                 j    |t         t        t        t        t        fv rt
        j                  | |      S y)Nr   )r  r  r  r  r  r   r  )r	  cups_ops     r-   r  r  #  s0    #%57HJ\^lmm%%lG<<r/   c                 2    | sy t         j                  |       S N)r   openPPDprinters    r-   r  r  )  s    ??7##r/   c                  *    t         j                         S r  )r   closePPD r/   r-   r#  r#  /  s    r/   c                 2    | sy t         j                  |       S r  )r   getPPDr   s    r-   r&  r&  2  s    >>'""r/   c                 ,    t         j                  |       S r  )r   getPPDOptionoptions    r-   r(  r(  8      ''r/   c                  *    t         j                         S r  )r   getPPDPageSizer$  r/   r-   r-  r-  ;  s    !!##r/   c                  *    t         j                         S r  )r   getPrintersr$  r/   r-   r/  r/  >  s       r/   c                 .    t         j                  | |      S r  r   getJobs)my_job	completeds     r-   r2  r2  M  s    ??69--r/   c                 \    t         j                  | d      t         j                  | d      z   S )Nr   r   r1  )r3  s    r-   
getAllJobsr6  P  s#    ??61%(BBBr/   c                  *    t         j                         S r  )r   
getVersionr$  r/   r-   r8  r8  S      r/   c                  *    t         j                         S r  )r   r   r$  r/   r-   r   r   V  s    ""$$r/   c                  *    t         j                         S r  )r   	getServerr$  r/   r-   r<  r<  Y  s    r/   c                     t        d       |t        j                  ||       S t        j                  dd      }|D ]3  }|j                  | k(  st        j                  |j
                  |       c S  y)NzDYou do not have permission to cancel a job. You need authentication.r   F)r  r   	cancelJobr2  idrh   )jobidrh   jobsr   s       r-   r>  r>  \  sj    \]  u--q!$ 	8Attu}((77	8 r/   c                  *    t         j                         S r  )r   resetOptionsr$  r/   r-   rC  rC  h      !!r/   c                 ,    t         j                  |       S r  )r   	addOptionr)  s    r-   rF  rF  k  s    V$$r/   c                  *    t         j                         S r  )r   
getOptionsr$  r/   r-   rH  rH  n  r9  r/   c                 ,    t         j                  |       S r  )r   duplicateSection)sections    r-   rJ  rJ  q  s    ##G,,r/   c                     t         j                  j                  |      rPt        s3| j	                  d      } |j	                  d      }|j	                  d      }t
        j                  | ||      S y)Nrm   )rT   rU   rW   r   encoder   printFileWithOptions)r!  filenametitles      r-   	printFilerR  t  sY    	ww~~hnnW-Gw/HLL)E++GXuEE r/   c                    t        d       t        j                  d| d|d|d|d|d|d       |r8t        j                  j                  |      st        j                  d|z         yt        j                  | |||||      S )NzEYou do not have permission to add a printer. You need authentication.zaddPrinter('z', 'z')zPPD file '%s' not found.)rM  zPPD file not found)	r  r   r   rT   rU   rW   r   r   
addPrinter)r	  
device_urilocationppd_filer'   infos         r-   rT  rT    sp    ]^II

HhtE F x0		,x78)lJ(ESWXXr/   c                 B    t        d       t        j                  |       S )NzHYou do not have permission to delete a printer. You need authentication.)r  r   
delPrinterr  s    r-   rZ  rZ    s    `al++r/   c                 |    t        d       t        j                  dd      }|d| }t        j                  |      S )NzHYou do not have permission to enable a printer. You need authentication.
cupsenableT )r  r   whichr   execute)r	  cmd_full_pathcmds      r-   enablePrinterrb    s6    `aKKd3M!<	0CC  r/   c                  *    t         j                         S r  )r   getGroupListr$  r/   r-   rd  rd    rD  r/   c                 ,    t         j                  |       S r  )r   getGrouprv   s    r-   rf  rf    s    E""r/   c                 ,    t         j                  |       S r  )r   getOptionListrg  s    r-   ri  ri    s      ''r/   c                 .    t         j                  | |      S r  )r   	getOptionrv   r*  s     r-   rk  rk    s    UF++r/   c                 .    t         j                  | |      S r  )r   getChoiceListrl  s     r-   rn  rn    s      //r/   c                 0    t         j                  | ||      S r  )r   	getChoice)rv   r*  choices      r-   rp  rp    s    UFF33r/   c                  *    t         j                         S r  )r   
setOptionsr$  r/   r-   rs  rs    r9  r/   c                 ,    t         j                  |       S r  )r   removeOptionr)  s    r-   ru  ru    r+  r/   c                 ,    t         j                  |       S r  )r   setPasswordCallback)funcs    r-   rw  rw    s    &&t,,r/   c                 ,    t         j                  |       S r  )r   r  )prompts    r-   r  r    s    $$V,,r/   c                 .    t         j                  | |      S r  )r   findPPDAttribute)namespecs     r-   r|  r|    s    ##D$//r/   c                  *    t         j                         S r  )r   releaseCupsInstancer$  r/   r-   r  r    s    &&((r/   c                    d}|dk  r~|dz  } | | \  }}|t         k7  r	 ||fS t                |dk  rN|t        k(  rt        j	                  d       n/|dk(  r|j                  d       nddlm} |j                  |d       |dk  r~fS )Nr   r   r   zSCould not connect to CUPS Server due to insufficient privileges.Try with valid userqt3z]<b>Could not connect to CUPS Server due to insufficient privileges.</b><p>Try with valid user)ui_utils)IPP_FORBIDDENr  INTERACTIVE_MODEr   r   	FailureUIui4r  )	operation_funcmode
ui_toolkitui_objcups_op_argscntresult
status_strr  s	            r-   cups_operationr    s    
C
'q+\:
]" :  !Qw++IIst5($$  &E  F,&&v  0O  P '  :r/   r  )i  r   )r   r   )r   )rT   os.pathrp   retimetempfilera   base.gbaser   r   r   base.sixextr   INVALID_PRINTER_NAME_CHARSgetenvcurrent_languagenewlangrL   rS   encodingenviron
import_extr   ImportErrorr   warnr   exitIPP_PRINTER_STATE_IDLEIPP_PRINTER_STATE_PROCESSINGIPP_PRINTER_STATE_STOPPEDPPD_UI_BOOLEANPPD_UI_PICKONEPPD_UI_PICKMANY
UI_SPINNERUI_UNITS_SPINNERUI_BANNER_JOB_SHEETSUI_PAGE_RANGEUI_JOB_STORAGE_MODEUI_JOB_STORAGE_PINUI_JOB_STORAGE_USERNAMEUI_JOB_STORAGE_IDUI_JOB_STORAGE_ID_EXISTSUI_INFOr  r  r  CUPS_GET_DEFAULTCUPS_GET_PRINTERSCUPS_ADD_MODIFY_PRINTERCUPS_DELETE_PRINTERCUPS_GET_CLASSESCUPS_ADD_MODIFY_CLASSCUPS_DELETE_CLASSr  r  CUPS_SET_DEFAULTCUPS_GET_DEVICESCUPS_GET_PPDSCUPS_MOVE_JOBCUPS_AUTHENTICATE_JOBIPP_JOB_PENDINGIPP_JOB_HELDIPP_JOB_PROCESSINGIPP_JOB_STOPPEDIPP_JOB_CANCELLEDIPP_JOB_ABORTEDIPP_JOB_COMPLETEDIPP_OKIPP_OK_SUBSTIPP_OK_CONFLICTIPP_OK_IGNORED_SUBSCRIPTIONSIPP_OK_IGNORED_NOTIFICATIONSIPP_OK_TOO_MANY_EVENTSIPP_OK_BUT_CANCEL_SUBSCRIPTIONIPP_OK_EVENTS_COMPLETEIPP_REDIRECTION_OTHER_SITEIPP_BAD_REQUESTr  IPP_NOT_AUTHENTICATEDIPP_NOT_AUTHORIZEDIPP_NOT_POSSIBLEIPP_TIMEOUTIPP_NOT_FOUNDIPP_GONEIPP_REQUEST_ENTITYIPP_REQUEST_VALUEIPP_DOCUMENT_FORMATIPP_ATTRIBUTESIPP_URI_SCHEMEIPP_CHARSETIPP_CONFLICTIPP_COMPRESSION_NOT_SUPPORTEDIPP_COMPRESSION_ERRORIPP_DOCUMENT_FORMAT_ERRORIPP_DOCUMENT_ACCESS_ERRORIPP_ATTRIBUTES_NOT_SETTABLEIPP_IGNORED_ALL_SUBSCRIPTIONSIPP_TOO_MANY_SUBSCRIPTIONSIPP_IGNORED_ALL_NOTIFICATIONS IPP_PRINT_SUPPORT_FILE_NOT_FOUNDIPP_INTERNAL_ERRORIPP_OPERATION_NOT_SUPPORTEDIPP_SERVICE_UNAVAILABLEIPP_VERSION_NOT_SUPPORTEDIPP_DEVICE_ERRORIPP_TEMPORARY_ERRORIPP_NOT_ACCEPTINGIPP_PRINTER_BUSYIPP_ERROR_JOB_CANCELLEDIPP_MULTIPLE_JOBS_NOT_SUPPORTEDIPP_PRINTER_IS_DEACTIVATEDCUPS_ERROR_BAD_NAMECUPS_ERROR_BAD_PARAMETERScompile	MULTILINErs   Ir   r   r   r.   r=   rN   r#   r\   rk   rz   r   r   
IGNORECASEr   r   r   TECH_CLASS_PDLSvaluesr   ppr_   r   r`   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r#  r&  r(  r-  r/  r2  r6  r8  r   r<  r>  rC  rF  rH  rJ  rR  rT  rZ  rb  rd  rf  ri  rk  rn  rp  rs  ru  rw  r  r|  r  r  r$  r/   r-   <module>r     s  . 
   	     ( ( F  ryy(G #(8(>(>s(C,22378 BJJvey)G #-

6       
        
                     
$ $  !&  "        &  " " $  & #  & #)   $   "       "( #  " rzz6ERZZ VXZX\X\] 
"**3RTT
:2::4bdd;B  " JDP4 RZZ7
= 
f$$++-	. "A	B	b!" q!   6 7JZkn33p(("^3::<;8$#($!.C %
"% -
	Y,!"#(,04 (--0)y  299]#PQs   A2K7 79L43L4