3
ZNm                 @   sx   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
 edd dZdZdZd	ZG d
d dZdS )    N)
debugprint)DBusGMainLoop)reduceT)Zset_as_defaultz#org.opensuse.CupsPkHelper.Mechanism/z1org.opensuse.CupsPkHelper.Mechanism.NotPrivilegedc               @   s,  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIS )J
Connectionc             C   sb   d | _ ytj | _tj | _W n$ tjjk
rB   d  | _| _Y nX tj	|||d| _
| j  d S )N)hostport
encryption)_parentdbusZ
SessionBusZ_session_busZ	SystemBus_system_bus
exceptionsDBusExceptioncupsr   _connection_hack_subclass)selfr   r   r	    r   */usr/share/system-config-printer/cupspk.py__init__5   s    

zConnection.__init__c             C   sd   t | jj}xRt| jD ]D}|d dkr*qt| j|}t ||krDqt| |st| ||j qW d S )Nr   _)typer   ZgetPrintersdirgetattrhasattrsetattr__call__)r   Z
methodtypefnamefnr   r   r   r   F   s    
zConnection._hack_subclassc             C   s
   || _ d S )N)r
   )r   parentr   r   r   
set_parentT   s    zConnection.set_parentc             C   sJ   y| j jtt}tj|tS  tjjk
r2   d S  t	k
rD   d S X d S )N)
r   Z
get_objectCUPS_PK_NAMECUPS_PK_PATHr   Z	InterfaceCUPS_PK_IFACEr   r   AttributeError)r   objectr   r   r   _get_cups_pkX   s    zConnection._get_cups_pkc             O   s$  d }|s<| j  }|r<y|j|}W n tjjk
r:   Y nX |sF| rP|||S d}	xyJ|| }	t|	tkr|	dd  }
|	d dkrt|
dkr|
d S |
S P W qV tjjk
r } z2|j t	krt
d|j   tjtjdP W Y d d }~X qVX qVW |	dkr t
d|t|	f  |||S d S )NzPolicyKit communication issue   r    zDBus exception: %sZpkcancelz%PolicyKit call to %s did not work: %s)r&   Zget_dbus_methodr   r   r   r   tuplelenget_dbus_nameCUPS_PK_NEED_AUTHr   get_dbus_messager   ZIPPErrorZIPP_NOT_AUTHORIZEDrepr)r   Zuse_fallbackZpk_function_namepk_argsZfallback_functionargskwdsZpk_functionZcups_pkZ	pk_retvalretvaler   r   r   _call_with_pk_and_fallbackd   s<    


z%Connection._call_with_pk_and_fallbackc             G   s  dg}t |t |kr0d|d< |j| t|S d}x^tt |D ]L}t|| || kr|| tkrt|| tkr|jt||  qDn|| tkrt|| tkr|jt||  qDn|| tkrt|| t	kr|jt||  qDn|| tkr || d kr |jd qDnd|| t
krVt|| tkrV|jt
||  qDn.|| t
kr|| d kr|jg  qDnd}|j||  qDW ||d< t|S )NFTr   r(   )r*   extendr)   ranger   strintappendfloatboollist)r   typesr0   r2   Z	exceptionir   r   r   _args_to_tuple   s<    

 
zConnection._args_to_tuplec             K   s<   g }x.|D ]&}||kr&|j ||  q
|j d q
W t|S )Nr(   )r9   r)   )r   namesr1   Zretnamer   r   r   _kwds_to_vars   s    
zConnection._kwds_to_varsc                s  d}d}g }g }d}t |dkrD| jttttgf| \}}}}}n@d|krT|d }d|krd|d }d|krt|d }d|kr|d }||||f}y | j|d|| jjf||}	W n tk
rB   td	 d|krd
}t |dkrt	dd |}nd}t |dkrt	dd |}nd}|||f}| j|d|| jjf||}	Y nX t |	j
 dkrxt|	t|	j
 d  tkrx|	S i }
|	d k	rxD|	j
 D ]8}t|tjkrt|	| |
t|< n|	| |
|< qW i }d}dt|   fdd|
j
 D }xt |dkrd }i }xF|D ]>}|d t |t    }|dkrH|
| ||< n|
| }qW |d k	rh|||< |d7 }dt|   fdd|
j
 D }qW |S )NFr      timeoutlimitinclude_schemesexclude_schemesZ
DevicesGetz-DevicesGet API exception; using old signatureTc             S   s   | d | S )N,r   )xyr   r   r   <lambda>   s    z'Connection.getDevices.<locals>.<lambda>r(   c             S   s   | d | S )NrH   r   )rI   rJ   r   r   r   rK     s    :c                s   g | ]}|j  r|qS r   )endswith).0rI   )postfixr   r   
<listcomp>   s    z)Connection.getDevices.<locals>.<listcomp>z
device-urir'   c                s   g | ]}|j  r|qS r   )rM   )rN   rI   )rO   r   r   rP   1  s    )r*   r?   r8   r7   r4   r   
getDevices	TypeErrorr   r   keysr   r<   dictr   String)r   r0   r1   
use_pycupsrE   rF   rG   rD   r/   resultZ
result_strr>   ZdevicesnZdevice_keysZ
device_uriZdevice_dictkeyr   )rO   r   rQ      s    $
0



zConnection.getDevicesc             O   s<   | j tgf| \}}|f}| j|d|| jjf|| d S )NZ	JobCancel)r?   r8   r4   r   	cancelJob)r   r0   r1   rV   jobidr/   r   r   r   rZ   9  s    zConnection.cancelJobc             O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZJobSetHoldUntil)r?   r8   r7   r4   r   setJobHoldUntil)r   r0   r1   rV   r[   Zjob_hold_untilr/   r   r   r   r\   E  s    zConnection.setJobHoldUntilc             O   s<   | j tgf| \}}|f}| j|d|| jjf|| d S )NZ
JobRestart)r?   r8   r4   r   
restartJob)r   r0   r1   rV   r[   r/   r   r   r   r]   N  s    zConnection.restartJobc             O   s  d}d}t |dkr0| jttgf| \}}}n\| jtgf| \}}d|krX|d }n4d|krj|d }n"d|kr||d }n|st nd}| o|dk	s|dk	rtjdd\}}	tj| ||	f}
| j|d|
| j	j
f|| tj|	tj}tj|d	}|jd
 |dk	rVtj|d
tj |j }xh|dkrRtj||jd |j }q*W n<|jd
 |j }x(|dkr|j|jd |j }qjW |j  tj|	 n$||f}
| j|d|
| j	j
f|| dS )af   Keeping this as an alternative for the code.
            We don't use it because it's not possible to know if the call was a
            PK-one (and so we push the content of a temporary filename to fd or
            file) or a non-PK-one (in which case nothing should be done).

                filename = None
                fd = None
                file = None
                if use_pycups:
                    if len(kwds) != 1:
                        use_pycups = True
                    elif kwds.has_key('filename'):
                        filename = kwds['filename']
                    elif kwds.has_key('fd'):
                        fd = kwds['fd']
                    elif kwds.has_key('file'):
                        file = kwds['file']
                    else:
                        use_pycups = True

                    if fd or file:
        N   filenamefdfilez/tmp)r   ZFileGetZrtr   r(   zUTF-8)r*   r?   r7   rR   tempfilemkstemposcloser4   r   getFileopenO_RDONLYfdopenseeklseekSEEK_SETreadlinewriteencoderemove)r   r0   r1   file_objectr`   rV   resourcer_   tmpfdtmpfnamer/   Ztmpfileliner   r   r   rf   W  sV    







zConnection.getFilec             O   s  t |dkr(| jttgf| \}}}n\| jtgf| \}}d|krP|d }n4d|krb|d }n"d|krt|d }n|st nd }| o|d k	s|d k	rztj \}}	tj|dtj |d k	rtj|dtj tj	|d}
x`|
dkrtj
||
 tj	|d}
qW n8|jd |j }x$|dkr>tj
|| |j }qW tj| ||	f}| j|d|| jjf|| tj|	 n$||f}| j|d|| jjf|| d S )	Nr^   r_   r`   ra   r   i   r(   ZFilePut)r*   r?   r7   rR   rb   rc   rd   rk   rl   readrn   rj   rm   re   r4   r   putFilerp   )r   r0   r1   rV   rr   r_   r`   rq   rs   rt   Zbufru   r/   r   r   r   rw     sL    






zConnection.putFilec             O   s   | j tgf| \}}| jddddddgf|\}}}}}	}
d}| rx| rx|
rxtjdd	\}}|
j| tj| d}|r| r||	|||f}| j|d
|| j	j
f|| |rtj| n*||	|||f}| j|d|| j	j
f|| d S )Nr_   ppdnameinfolocationdeviceppdFT)textZPrinterAddWithPpdFileZ
PrinterAdd)r?   r7   rB   rb   rc   ZwriteFdrd   re   r4   r   
addPrinterunlink)r   r0   r1   rV   rA   r_   rx   ry   rz   r{   r|   Zneed_unlinkr`   r/   r   r   r   r~     s*    &



zConnection.addPrinterc             O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZPrinterSetDevice)r?   r7   r4   r   setPrinterDevice)r   r0   r1   rV   rA   r{   r/   r   r   r   r     s    zConnection.setPrinterDevicec             O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZPrinterSetInfo)r?   r7   r4   r   setPrinterInfo)r   r0   r1   rV   rA   ry   r/   r   r   r   r     s    zConnection.setPrinterInfoc             O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZPrinterSetLocation)r?   r7   r4   r   setPrinterLocation)r   r0   r1   rV   rA   rz   r/   r   r   r   r     s    zConnection.setPrinterLocationc             O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZPrinterSetShared)r?   r7   r;   r4   r   setPrinterShared)r   r0   r1   rV   rA   Zsharedr/   r   r   r   r     s    zConnection.setPrinterSharedc             O   sH   | j tttgf| \}}}}|||f}| j|d|| jjf|| d S )NZPrinterSetJobSheets)r?   r7   r4   r   setPrinterJobSheets)r   r0   r1   rV   rA   startendr/   r   r   r   r   "  s    
zConnection.setPrinterJobSheetsc             O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZPrinterSetErrorPolicy)r?   r7   r4   r   setPrinterErrorPolicy)r   r0   r1   rV   rA   policyr/   r   r   r   r   ,  s    z Connection.setPrinterErrorPolicyc             O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZPrinterSetOpPolicy)r?   r7   r4   r   setPrinterOpPolicy)r   r0   r1   rV   rA   r   r/   r   r   r   r   6  s    zConnection.setPrinterOpPolicyc             O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZPrinterSetUsersAllowed)r?   r7   r<   r4   r   setPrinterUsersAllowed)r   r0   r1   rV   rA   usersr/   r   r   r   r   @  s    z!Connection.setPrinterUsersAllowedc             O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZPrinterSetUsersDenied)r?   r7   r<   r4   r   setPrinterUsersDenied)r   r0   r1   rV   rA   r   r/   r   r   r   r   J  s    z Connection.setPrinterUsersDeniedc       	      O   sr   | j tttgf| \}}}}|s*|f}n| j tttgf| \}}}}|||f}| j|d|| jjf|| d S )NZPrinterAddOptionDefault)r?   r7   r<   r4   r   addPrinterOptionDefault)	r   r0   r1   rV   rA   optionvaluevaluesr/   r   r   r   r   S  s    
z"Connection.addPrinterOptionDefaultc             O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZPrinterDeleteOptionDefault)r?   r7   r4   r   deletePrinterOptionDefault)r   r0   r1   rV   rA   r   r/   r   r   r   r   e  s    z%Connection.deletePrinterOptionDefaultc             O   s<   | j tgf| \}}|f}| j|d|| jjf|| d S )NZPrinterDelete)r?   r7   r4   r   deletePrinter)r   r0   r1   rV   rA   r/   r   r   r   r   o  s    zConnection.deletePrinterc             O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZClassAddPrinter)r?   r7   r4   r   addPrinterToClass)r   r0   r1   rV   printerrA   r/   r   r   r   r   z  s    zConnection.addPrinterToClassc             O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZClassDeletePrinter)r?   r7   r4   r   deletePrinterFromClass)r   r0   r1   rV   r   rA   r/   r   r   r   r     s    z!Connection.deletePrinterFromClassc             O   s<   | j tgf| \}}|f}| j|d|| jjf|| d S )NZClassDelete)r?   r7   r4   r   deleteClass)r   r0   r1   rV   rA   r/   r   r   r   r     s    zConnection.deleteClassc             O   s<   | j tgf| \}}|f}| j|d|| jjf|| d S )NZPrinterSetDefault)r?   r7   r4   r   
setDefault)r   r0   r1   rV   rA   r/   r   r   r   r     s    zConnection.setDefaultc             O   s>   | j tgf| \}}|df}| j|d|| jjf|| d S )NTPrinterSetEnabled)r?   r7   r4   r   enablePrinter)r   r0   r1   rV   rA   r/   r   r   r   r     s    zConnection.enablePrinterc             O   s>   | j tgf| \}}|df}| j|d|| jjf|| d S )NFr   )r?   r7   r4   r   disablePrinter)r   r0   r1   rV   rA   r/   r   r   r   r     s    zConnection.disablePrinterc             O   s@   | j tgf| \}}|ddf}| j|d|| jjf|| d S )NTr(   PrinterSetAcceptJobs)r?   r7   r4   r   
acceptJobs)r   r0   r1   rV   rA   r/   r   r   r   r     s    
zConnection.acceptJobsc             O   sR   | j tgf| \}}| jdgf|\}|d|f}| j|d|| jjf|| d S )NreasonFr   )r?   r7   rB   r4   r   
rejectJobs)r   r0   r1   rV   rA   r   r/   r   r   r   r     s    
zConnection.rejectJobsc             O   sv   d}f }| j |d|| jjf||}i }|d k	rrx@|j D ]4}t|tjkrbt|| |t|< q:|| ||< q:W |S )NFZServerGetSettings)r4   r   adminGetServerSettingsrS   r   r   rU   r7   )r   r0   r1   rV   r/   rW   settingsr>   r   r   r   r     s    
z!Connection.adminGetServerSettingsc             O   s<   | j tgf| \}}|f}| j|d|| jjf|| d S )NZServerSetSettings)r?   rT   r4   r   adminSetServerSettings)r   r0   r1   rV   r   r/   r   r   r   r     s    z!Connection.adminSetServerSettingsN)'__name__
__module____qualname__r   r   r    r&   r4   r?   rB   rQ   rZ   r\   r]   rf   rw   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   r   4   sH   2.a		R6







	





r   )rd   sysrb   r   r   debugr   Zdbus.mainloop.glibr   	functoolsr   r!   r"   r#   r,   r   r   r   r   r   <module>   s   
