3
NZw                 @   s  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T d dlm	Z	m
Z
mZ d dlmZ dZy^e jdZdZedk	rejdrejd\ZZed	7 Zee jd< d dlZedk	ree jd< W n2 ek
r   e jd
sejd ejd Y nX 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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`dDZadEZbdFZcdGZddHZedIZfdJZgdKZhdLZidMZjdNZkdOZldPZmdQZndRZodSZpdTZqejrdUejsZtejrdVejuZvejrdWejuZwddXdYZxdZd[ Zyd\d] Zzd^d_ Z{d`da Z|ejrdbej}Z~dcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdugZx4ee
jj D ]"Zdve Zeekreje qW edd Zejdwdxdyg dzd{ Zd|d} Zd~d Zdd Zdd Zdd ZdddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdddZdddZdd Zdd Zdd ZdddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZddĄ ZddƄ ZddȄ Zddʄ Zdd̄ Zdd΄ ZddЄ Zdd҄ ZddԄ Zddք Zdd؄ Zddڄ ZdS )    N)*)utilsmodelsos_utils)PY3z!~`!@#$%^&*()=+[]{}()\/,.<>?'";:| ZLANGC.z.UTF-8Z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.*c             C   sL   | dkrg } t jjd|  }x*|D ]"}tjj|d}tjj|r"|S q"W dS )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)propZppd_search_pathsplitospathjoinexists)Zaddtional_pathsZsearch_pathsr"   Zppd_path r%   /usr/share/hplip/prnt/cups.py
getPPDPath   s    
r'   c              C   s   g } g }g }t jjdr"| jd t jjdr8| jd x| D ]}|jtj| q>W xz|D ]r}t|d}xb|D ]Z}|jd rpt|dkrpy|j	 \}}}	}
W n t
k
r   wpY nX |dkrp|j| qpW q\W |jd
 |jd |jd |jd |S )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/*.convsr#r	   application/octet-streamapplication/vnd.cups-postscriptzimage/x-bmpztext/cppzapplication/x-pythonzapplication/hplip-fax)r*   r+   )r!   r"   r$   appendextendglobopen
startswithlenr    
ValueError)pathsZallowable_mime_typesfilesr"   fZ	conv_filelinesourcedestZcostprogr%   r%   r&   getAllowableMIMETypes   s0    









r:   c             C   sf   | j drtj| djd}nt| djd}ytj|jdjd}W n t	k
r`   d}Y nX |S )Nz.gzr(   i   zutf-8r	    )
endswithgzipZGzipFilereadr/   nickname_patsearchdecodegroupAttributeError)r5   Znicknamedescr%   r%   r&   getPPDDescription   s    

rE   c              C   s   t  \} }}i }| dkr|dk rtjdd}tjd|  xVtj|dddD ]B}t|}d	|kprd
|j kprd
|ksL|||< tjd||f  qLW nftjd t	j
 }t }tjddd}	|	 stjj|	 rd}	tjd|  tjd|	  x|D  ]}
|
sqd|
j ks0d|
j kr||
 d dkr||
 d }d	|j kp^d
|j kp^d
|
kstjj|
rt|
}n|ytjj|	|
}W n tk
r   |
}Y nPX tjj|sytjj||
}W n tk
r   |
}Y nX tjj|s|
}|||< qW |S )Nr	   r   dirsppdz&(CUPS 1.1.x) Searching for PPDs in: %szHP*ppd*;hp*ppd*T)pattern	abs_pathsZfoo2Z
gutenprintz%s: %sz8(CUPS 1.2.x) Getting list of PPDs using CUPS_GET_PPDS...Zppdbasez/usr/share/ppdzCUPS PPD base path = %szFoomatic PPD base path = %szhp-hp_zppd-makeZHPzppd-make-and-model)getVersionTuplesys_confgetlogdebugr   	walkFilesrE   lowercupsextZ
getPPDListr'   r!   r"   r$   r#   rC   )majorminorZpatchppdsZppd_dirr5   rD   Zppd_dictZcups_ppd_pathZfoomatic_ppd_pathrG   r"   r%   r%   r&   getSystemPPDs   sX    


rV   c             C   s   t | t | }}||kr.||  } }|| }}tt|d }xtd|d D ]}||gdg|   }}xptd|d D ]^}|| d ||d  d  }}	||d  }
| |d  ||d  kr|
d }
t||	|
||< qxW qNW || S )za
    Calculates the Levenshtein distance between a and b.
    Written by Magnus Lie Hetland.
    r	   r   )r1   listrangemin)abnmZcurrentiZpreviousjadddeleteZchanger%   r%   r&   levenshtein_distance:  s    

rb   z.*?(\d+)z	foomatic:zhp-rJ   zhp z.gzz.ppdzdrv:z-pclz-pcl3z	-jetreadyz-zxsz-zjsz-psz-postscriptz-jrz-lidlz-lidilz-ldlz-hpijsz-%sz-seriesz seriesZ_seriesc             C   s&   | j  } xtD ]}| j|d} qW | S )Nr;   )rQ   STRIP_STRINGS2replace)modelxr%   r%   r&   stripModel2f  s    
rg   c             C   s&   | j  } xtD ]}| j|d} qW | S )Nr;   )rQ   STRIP_STRINGSrd   )re   rf   r%   r%   r&   
stripModelo  s    
ri   c             C   s  t jd i }i }tj}t jd|   xZ|D ]R}ttjj|}t| |||< || dk rpt jd||| f  t	||| }q,W t jd|  xL|D ]D}|| |krx2|D ]}tjj|tjj|krP qW || ||< qW t j| t
|dkrt jd ytj| jd}t|}W n. tk
r4   Y n^ tk
rJ   Y nHX t jd|  i }	x0td	D ]"}
d
|
 }t jd|  t|| | }d\}}x|D ]}y2tjtjj|jd}t|}t jd|  W n2 tk
r   wY n tk
r   wY nX t|| | }t jd|  t jd|  ||krlt jd |d7 }|| |	|< t j|	 t jd qW t
|	rj|	}P qjW |S )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 = %dr   r;   zmins_model_number= %dzmins_adj_model_number=%dzadj_model_number=%dmatchz***)r   r;   )rN   rO   sysmaxsizeri   r!   r"   basenamerb   rY   r1   
number_patrk   rB   intrC   r2   rX   )stripped_modelrU   ZminsZedsZmin_edit_distancer5   tr]   Zmodel_numbermatchesrf   ZfactorZadj_model_numberZnumber_matchingrk   Zmins_model_numberZmins_adj_model_numberr%   r%   r&   
getPPDFilex  sr    











rt   c             C   sL  t j|}| jdd}|dkr(t|}nt|}tjd|  g }x|D ]}tj|}|d k	rH|jd|krHtjd|  y|jdj	d}W n t
k
r   g }Y nX tjrd|kstjrd|kstjrd|ksd	|krH|j|d
d |D f qHW tj| t|}	|	dkrtjd|  ttt||j }
tj|
 t|
}|rx|
D ]\}}tj|}|d k	rTtjd|  y|jdj	d}W n t
k
r   g }Y nX tjrd|kstjrd|kstjrd|ksd	|krT|j|dd |D f qTW tj| t|}	|	dkr>tjdt|  d S |	dkrbtjd |d d dfS tjd|	  xnt jt jt jgD ]Z}xR|D ]J\}}x>|D ]6}t jj|t j|krtjd||f  |dfS qW qW qW tjd|	  xBdD ]:}x2|D ]*\}}||krtjd|  |dfS qW qW tjd |d d dfS )Nzppd-namer   z!Matching PPD list to model  %s...r	   zFound match: %sr   -hpijsZpsc             S   s   g | ]}|r|d kr|qS )rv   r%   ).0pr%   r%   r&   
<listcomp>  s    zgetPPDFile2.<locals>.<listcomp>zFNo PPD found for model %s using new algorithm. Trying old algorithm...c             S   s   g | ]}|r|d kr|qS )rv   r%   )rw   rx   r%   r%   r&   ry     s    z.No PPD found for model %s using old algorithm.zOne match found.r;   z?%d matches found. Searching based on PDL: Host > PS > PCL/OtherzSelecting '-%s' PPD: %sz<%d matches found. Searching based on Filters: HPCUPS > HPIJShpcupszSelecting PPD: %sz<No specific PDL located. Defaulting to first found PPD file.)rz   rv   )r   ZnormalizeModelNamerM   rg   rN   rO   ppd_patrk   rB   r    rC   r   hpcups_buildZhpijs_buildr,   r1   rW   rt   ri   itemserrorZPDL_TYPE_HOSTZPDL_TYPE_PSZPDL_TYPE_PCLZ	PDL_TYPES)mqre   rU   Zppd_namerq   rs   r5   rk   ZpdlsZnum_matchesZmatches2Znum_matches2drx   Zpdl_listrf   r%   r%   r&   getPPDFile2  s~    	










$








r   c             C   s  zd }d}d}t jd|tjf  tjr| jdttkrDd}d}q| jdttksd| jdttkrnd}d}q| jdtt	krd	}d
}qd}d}nb| jdttkrd}d}| jdttks| jdttkrd}d}| jdtt	krd}d}nd}d}g }x,t
jtjdddddD ]}|j| qW t jd|  xN|D ]8}|j|dkr:t||kr:|}t jd|  P q:W t jd|  W d |||fS )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-Fax3-hpijszHP Fax3 hpijszHP-Fax2-hpijszHP Fax2 hpijszHP-Fax4-hpijszHP Fax4 hpijszHP-Fax-hpijszHP Fax hpijsrF   rG   zHP-Fax*.ppd*T)rH   rI   zppds=%sr   zFound fax PPD: %sz8Unable to locate the HPLIP Fax PPD file: %s.ppd.gz file.)rN   rO   r   r|   rM   ZFAX_TYPE_NONEZFAX_TYPE_MARVELLZFAX_TYPE_SOAPZFAX_TYPE_LEDMSOAPZFAX_TYPE_LEDMr   rP   rL   r,   findrE   r~   )r   re   Zfax_ppdZnickZexpected_fax_ppd_namerU   r5   r%   r%   r&   getFaxPPDFile)  sN      
r   c              C   s   d} yt | d}W nB tk
r4   tjd|   Y nb tk
rT   tjd|   Y nBX x>|D ]6}tj|}|d k	r\|jdj }tj	d|  |S q\W tj	d dS )	Nz/etc/cups/cupsd.confr(   z%s not found.z%s: I/O error.r	   zCUPS error_log LogLevel: %sz CUPS error_log LogLevel: unknownunknown)
r/   OSErrorrN   r~   IOErrorpat_cups_error_logrk   rB   rQ   rO   )	cups_confr5   lr]   levelr%   r%   r&   getErrorLogLevel]  s    


r     c       
      C   s   g }d|  }d}yt |d}W n& ttfk
rD   tjd|  dS X |t |dj krtj }d}xr|j }	||	krd}xt	|r|j
|j  q|W |j
|	j  t	||krP qf|rf|j|	j  t	||krfP qfW dj|S d S )	Nz[Job %d]z/var/log/cups/error_logr(   z*Could not open the CUPS error_log file: %sr;   FT
)r/   r   r   rN   r~   r>   r   ZQueuereadliner1   r,   rM   stripZputr#   )
Zjob_idZ	max_linesZcont_intervalZretsr   r5   ZqueueZ	job_foundr6   r%   r%   r&   getPrintJobErrorLogq  s2    
r   c              C   s   t j } | d krtjd | S )Nz$The CUPS default printer is not set.)rR   getDefaultPrinterrN   rO   )r(   r%   r%   r&   r     s    
r   c             C   s    t rt| d} td tj| S )Nzutf-8zOYou do not have permission to set the default printer. You need authentication.)r   strsetPasswordPromptrR   setDefaultPrinter)printer_namer%   r%   r&   r     s    
r   c             C   s   t d t| tS )NzVYou do not have permission to accept jobs on a printer queue. You need authentication.)r   controlPrinterCUPS_ACCEPT_JOBS)r   r%   r%   r&   accept  s    r   c             C   s   t d t| tS )NzVYou do not have permission to reject jobs on a printer queue. You need authentication.)r   r   CUPS_REJECT_JOBS)r   r%   r%   r&   reject  s    r   c             C   s   t d t| tS )NzMYou do not have permission to start a printer queue. You need authentication.)r   r   IPP_RESUME_PRINTER)r   r%   r%   r&   start  s    r   c             C   s   t d t| tS )NzLYou do not have permission to stop a printer queue. You need authentication.)r   r   IPP_PAUSE_PRINTER)r   r%   r%   r&   stop  s    r   c             C   s   t d t| tS )NzBYou do not have permission to purge jobs. You need authentication.)r   r   IPP_PURGE_JOBS)r   r%   r%   r&   purge  s    r   c             C   s"   |t ttttfkrtj| |S dS )Nr   )r   r   r   r   r   rR   r   )r   Zcups_opr%   r%   r&   r     s    r   c             C   s   | sd S t j| S )N)rR   openPPD)printerr%   r%   r&   r     s    r   c               C   s   t j S )N)rR   closePPDr%   r%   r%   r&   r     s    r   c             C   s   | sd S t j| S )N)rR   getPPD)r   r%   r%   r&   r     s    r   c             C   s
   t j| S )N)rR   getPPDOption)optionr%   r%   r&   r     s    r   c               C   s   t j S )N)rR   getPPDPageSizer%   r%   r%   r&   r     s    r   c               C   s   t j S )N)rR   getPrintersr%   r%   r%   r&   r     s    r   c             C   s   t j| |S )N)rR   getJobs)my_jobZ	completedr%   r%   r&   r     s    r   c             C   s   t j| dt j| d S )Nr   r	   )rR   r   )r   r%   r%   r&   
getAllJobs  s    r   c               C   s   t j S )N)rR   
getVersionr%   r%   r%   r&   r     s    r   c               C   s   t j S )N)rR   rK   r%   r%   r%   r&   rK     s    rK   c               C   s   t j S )N)rR   	getServerr%   r%   r%   r&   r     s    r   c             C   sR   t d |d k	rtj|| S tjdd}x$|D ]}|j| kr.tj|j| S q.W dS )NzDYou do not have permission to cancel a job. You need authentication.r   F)r   rR   	cancelJobr   idr8   )Zjobidr8   Zjobsr_   r%   r%   r&   r     s    

r   c               C   s   t j S )N)rR   resetOptionsr%   r%   r%   r&   r     s    r   c             C   s
   t j| S )N)rR   	addOption)r   r%   r%   r&   r     s    r   c               C   s   t j S )N)rR   
getOptionsr%   r%   r%   r&   r     s    r   c             C   s
   t j| S )N)rR   duplicateSection)Zsectionr%   r%   r&   r     s    r   c             C   sD   t jj|r<ts.| jd} |jd}|jd}tj| ||S dS d S )Nzutf-8r	   )r!   r"   r$   r   encoderR   ZprintFileWithOptions)r   filenametitler%   r%   r&   	printFile  s    


r   c             C   sZ   t d tjd| |||||f  |rFtjj| rFtjd|  dS tj| |||||S )NzEYou do not have permission to add a printer. You need authentication.z.addPrinter('%s', '%s', '%s', '%s', '%s', '%s')zPPD file '%s' not found.r	   PPD file not foundr   )r   r   )	r   rN   rO   r!   r"   r$   r~   rR   
addPrinter)r   Z
device_urilocationZppd_filere   infor%   r%   r&   r     s    r   c             C   s   t d tj| S )NzHYou do not have permission to delete a printer. You need authentication.)r   rR   
delPrinter)r   r%   r%   r&   r   (  s    r   c             C   s*   t d tjdd}d|| f }tj|S )NzHYou do not have permission to enable a printer. You need authentication.Z
cupsenableTz%s %s)r   r   Zwhichr   Zexecute)r   Zcmd_full_pathcmdr%   r%   r&   enablePrinter,  s    r   c               C   s   t j S )N)rR   getGroupListr%   r%   r%   r&   r   2  s    r   c             C   s
   t j| S )N)rR   getGroup)rB   r%   r%   r&   r   5  s    r   c             C   s
   t j| S )N)rR   getOptionList)rB   r%   r%   r&   r   8  s    r   c             C   s   t j| |S )N)rR   	getOption)rB   r   r%   r%   r&   r   ;  s    r   c             C   s   t j| |S )N)rR   getChoiceList)rB   r   r%   r%   r&   r   >  s    r   c             C   s   t j| ||S )N)rR   	getChoice)rB   r   Zchoicer%   r%   r&   r   A  s    r   c               C   s   t j S )N)rR   
setOptionsr%   r%   r%   r&   r   D  s    r   c             C   s
   t j| S )N)rR   removeOption)r   r%   r%   r&   r   G  s    r   c             C   s
   t j| S )N)rR   setPasswordCallback)funcr%   r%   r&   r   J  s    r   c             C   s
   t j| S )N)rR   r   )promptr%   r%   r&   r   M  s    r   c             C   s   t j| |S )N)rR   findPPDAttribute)namespecr%   r%   r&   r   P  s    r   c               C   s   t j S )N)rR   releaseCupsInstancer%   r%   r%   r&   r   S  s    r   c       	      G   s   d}xz|dk r~|d7 }| | \}}|t kr.P qt  |dk r|tkrPtjd q|dkrd|jd qddlm} |j|d qW ||fS )Nr   r
   r	   zSCould not connect to CUPS Server due to insufficient privileges.Try with valid userZqt3z]<b>Could not connect to CUPS Server due to insufficient privileges.</b><p>Try with valid user)ui_utils)IPP_FORBIDDENr   ZINTERACTIVE_MODErN   r~   Z	FailureUIZui4r   )	Zoperation_funcmodeZ
ui_toolkitZui_objZcups_op_argsZcntresultZ
status_strr   r%   r%   r&   cups_operationW  s    
r   )N)r   r   )r   r   )r   )N)r!   os.pathr=   reZtimeZtempfiler.   Zbase.gbaser   r   r   Zbase.sixextr   ZINVALID_PRINTER_NAME_CHARSgetenvZcurrent_languageZnewlangcountr    encodingenvironrR   ImportErrorrN   warnrl   exitZIPP_PRINTER_STATE_IDLEZIPP_PRINTER_STATE_PROCESSINGZIPP_PRINTER_STATE_STOPPEDZPPD_UI_BOOLEANZPPD_UI_PICKONEZPPD_UI_PICKMANYZ
UI_SPINNERZUI_UNITS_SPINNERZUI_BANNER_JOB_SHEETSZUI_PAGE_RANGEZUI_JOB_STORAGE_MODEZUI_JOB_STORAGE_PINZUI_JOB_STORAGE_USERNAMEZUI_JOB_STORAGE_IDZUI_JOB_STORAGE_ID_EXISTSZUI_INFOr   r   r   ZCUPS_GET_DEFAULTZCUPS_GET_PRINTERSZCUPS_ADD_MODIFY_PRINTERZCUPS_DELETE_PRINTERZCUPS_GET_CLASSESZCUPS_ADD_MODIFY_CLASSZCUPS_DELETE_CLASSr   r   ZCUPS_SET_DEFAULTZCUPS_GET_DEVICESZCUPS_GET_PPDSZCUPS_MOVE_JOBZCUPS_AUTHENTICATE_JOBZIPP_JOB_PENDINGZIPP_JOB_HELDZIPP_JOB_PROCESSINGZIPP_JOB_STOPPEDZIPP_JOB_CANCELLEDZIPP_JOB_ABORTEDZIPP_JOB_COMPLETEDZIPP_OKZIPP_OK_SUBSTZIPP_OK_CONFLICTZIPP_OK_IGNORED_SUBSCRIPTIONSZIPP_OK_IGNORED_NOTIFICATIONSZIPP_OK_TOO_MANY_EVENTSZIPP_OK_BUT_CANCEL_SUBSCRIPTIONZIPP_OK_EVENTS_COMPLETEZIPP_REDIRECTION_OTHER_SITEZIPP_BAD_REQUESTr   ZIPP_NOT_AUTHENTICATEDZIPP_NOT_AUTHORIZEDZIPP_NOT_POSSIBLEZIPP_TIMEOUTZIPP_NOT_FOUNDZIPP_GONEZIPP_REQUEST_ENTITYZIPP_REQUEST_VALUEZIPP_DOCUMENT_FORMATZIPP_ATTRIBUTESZIPP_URI_SCHEMEZIPP_CHARSETZIPP_CONFLICTZIPP_COMPRESSION_NOT_SUPPORTEDZIPP_COMPRESSION_ERRORZIPP_DOCUMENT_FORMAT_ERRORZIPP_DOCUMENT_ACCESS_ERRORZIPP_ATTRIBUTES_NOT_SETTABLEZIPP_IGNORED_ALL_SUBSCRIPTIONSZIPP_TOO_MANY_SUBSCRIPTIONSZIPP_IGNORED_ALL_NOTIFICATIONSZ IPP_PRINT_SUPPORT_FILE_NOT_FOUNDZIPP_INTERNAL_ERRORZIPP_OPERATION_NOT_SUPPORTEDZIPP_SERVICE_UNAVAILABLEZIPP_VERSION_NOT_SUPPORTEDZIPP_DEVICE_ERRORZIPP_TEMPORARY_ERRORZIPP_NOT_ACCEPTINGZIPP_PRINTER_BUSYZIPP_ERROR_JOB_CANCELLEDZIPP_MULTIPLE_JOBS_NOT_SUPPORTEDZIPP_PRINTER_IS_DEACTIVATEDZCUPS_ERROR_BAD_NAMEZCUPS_ERROR_BAD_PARAMETERScompile	MULTILINEr?   Ir   r{   r'   r:   rE   rV   rb   
IGNORECASEro   rc   rW   ZTECH_CLASS_PDLSvaluesrx   Zppr,   rh   r-   rg   ri   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rK   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r%   r%   r%   r&   <module>   sb  




%H
		Md4
/


