U
    9_m                     @   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 | _ zt | _t | _W n$ tjjk
rB   d  | _| _Y nX tj	|||d| _
|   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   s`   t | jj}t| jD ]D}|d dkr(qt| j|}t ||krBqt| |st| ||j q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   sP   z| j tt}t|tW S  tjjk
r6   Y d S  t	k
rJ   Y d S X d S r   )
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   sB  d }| dd }|sH|  }	|	rHz|	|}W n tjjk
rF   Y nX |sP|sZ|||S d}
zX||d|i}
t|
tkr|
dd  }|
d dkrt|dkr|d W S |W S W qW q^ tjjk
r } z8|	 t
krtd|   ttjdW Y qW 5 d }~X Y q^X q^|
dkr>td|t|
f  |||S d S )	NZ	signaturezPolicyKit communication issue   r    zDBus exception: %sZpkcancelz%PolicyKit call to %s did not work: %s)popr'   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dbus_args_signatureZ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< || t|S d}tt |D ]L}t|| || kr|| tkrt|| tkr|t||  q@n|| tkrt|| tkr|t||  q@n|| tkrt|| t	kr|t||  q@n|| tkr|| d kr|d q@nd|| t
krRt|| tkrR|t
||  q@n.|| t
kr||| d kr||g  q@nd}|||  q@||d< t|S )NFTr   r)   )r,   extendr+   ranger   strintappendfloatboollist)r   typesr2   r4   Z	exceptionir   r   r   _args_to_tuple   s<    

 
zConnection._args_to_tuplec                 K   s8   g }|D ]&}||kr$| ||  q| d qt|S )Nr)   )r;   r+   )r   namesr3   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}z | 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 |	
 dkrxt|	t|	
 d  tkrx|	S i }
|	d k	r|	
 D ]8}t|tjkrt|	| |
t|< n|	| |
|< qi }d}dt|   fdd|

 D }t |dkrd }i }|D ]>}|d t |t    }|dkr@|
| ||< n|
| }q|d k	r^|||< |d7 }dt|   fdd|

 D }q|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>       z'Connection.getDevices.<locals>.<lambda>r)   c                 S   s   | d | S rJ   r   rL   r   r   r   rO     rP   :c                    s   g | ]}|  r|qS r   endswith.0rM   Zpostfixr   r   
<listcomp>"  s     
 z)Connection.getDevices.<locals>.<listcomp>z
device-urir(   c                    s   g | ]}|  r|qS r   rR   rT   rV   r   r   rW   3  s     
 )r,   rA   r:   r9   r6   r   
getDevices	TypeErrorr   r   keysr   r>   dictr   String)r   r2   r3   
use_pycupsrG   rH   rI   rF   r1   resultZ
result_strr@   ZdevicesnZdevice_keysZ
device_uriZdevice_dictkeyr   rV   r   rX      s    $ 
 
0


zConnection.getDevicesc                 O   s<   | j tgf| \}}|f}| j|d|| jjf|| d S )NZ	JobCancel)rA   r:   r6   r   	cancelJobr   r2   r3   r]   jobidr1   r   r   r   ra   ;  s     zConnection.cancelJobc                 O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZJobSetHoldUntil)rA   r:   r9   r6   r   setJobHoldUntil)r   r2   r3   r]   rc   Zjob_hold_untilr1   r   r   r   rd   G  s     zConnection.setJobHoldUntilc                 O   s<   | j tgf| \}}|f}| j|d|| jjf|| d S )NZ
JobRestart)rA   r:   r6   r   
restartJobrb   r   r   r   re   P  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}|s|dk	s|dk	rtjdd\}}	t| ||	f}
| j|d|
| j	j
f|| t|	tj}t|d	}|d
 |dk	rRt|d
tj | }|dkrt||d | }q(n8|d
 | }|dkr||d | }qd|  t|	 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,   rA   r9   rY   tempfilemkstemposcloser6   r   getFileopenO_RDONLYfdopenseeklseekSEEK_SETreadlinewriteencoderemove)r   r2   r3   file_objectrh   r]   resourcerg   tmpfdtmpfnamer1   Ztmpfileliner   r   r   rn   Y  sj    



 




 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 }|s||d k	s|d k	r|t \}}	t|dtj |d k	rt|dtj t	|d}
|
dkrB|
dkrBt
||
 t	|d}
qn4|d | }|dkrBt
|| | }q t| ||	f}| j|d	|| jjf|| t|	 n$||f}| j|d	|| jjf|| d S )
Nrf   rg   rh   ri   r   i   r)   rP   ZFilePut)r,   rA   r9   rY   rj   rk   rl   rs   rt   readrv   rr   ru   rm   r6   r   putFilerx   )r   r2   r3   r]   rz   rg   rh   ry   r{   r|   Zbufr}   r1   r   r   r   r     s`    






  zConnection.putFilec                 O   s   | j tgf| \}}| jddddddgf|\}}}}}	}
d}|st|st|
rttjdd	\}}|
| t| d}|r|s||	|||f}| j|d
|| j	j
f|| |rt| n*||	|||f}| j|d|| j	j
f|| d S )Nrg   ppdnameinfolocationdeviceppdFT)textZPrinterAddWithPpdFileZ
PrinterAdd)rA   r9   rD   rj   rk   ZwriteFdrl   rm   r6   r   
addPrinterunlink)r   r2   r3   r]   rC   rg   r   r   r   r   r   Zneed_unlinkrh   r1   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)rA   r9   r6   r   setPrinterDevice)r   r2   r3   r]   rC   r   r1   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)rA   r9   r6   r   setPrinterInfo)r   r2   r3   r]   rC   r   r1   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)rA   r9   r6   r   setPrinterLocation)r   r2   r3   r]   rC   r   r1   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)rA   r9   r=   r6   r   setPrinterShared)r   r2   r3   r]   rC   Zsharedr1   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)rA   r9   r6   r   setPrinterJobSheets)r   r2   r3   r]   rC   startendr1   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)rA   r9   r6   r   setPrinterErrorPolicyr   r2   r3   r]   rC   Zpolicyr1   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)rA   r9   r6   r   setPrinterOpPolicyr   r   r   r   r   8  s     zConnection.setPrinterOpPolicyc                 O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZPrinterSetUsersAllowed)rA   r9   r>   r6   r   setPrinterUsersAllowedr   r2   r3   r]   rC   Zusersr1   r   r   r   r   B  s     z!Connection.setPrinterUsersAllowedc                 O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZPrinterSetUsersDenied)rA   r9   r>   r6   r   setPrinterUsersDeniedr   r   r   r   r   L  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)rA   r9   r>   r6   r   addPrinterOptionDefault)	r   r2   r3   r]   rC   optionvaluevaluesr1   r   r   r   r   U  s    
 z"Connection.addPrinterOptionDefaultc                 O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZPrinterDeleteOptionDefault)rA   r9   r6   r   deletePrinterOptionDefault)r   r2   r3   r]   rC   r   r1   r   r   r   r   g  s     z%Connection.deletePrinterOptionDefaultc                 O   s<   | j tgf| \}}|f}| j|d|| jjf|| d S )NZPrinterDelete)rA   r9   r6   r   deletePrinterr   r2   r3   r]   rC   r1   r   r   r   r   q  s     zConnection.deletePrinterc                 O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZClassAddPrinter)rA   r9   r6   r   addPrinterToClassr   r2   r3   r]   ZprinterrC   r1   r   r   r   r   |  s     zConnection.addPrinterToClassc                 O   sB   | j ttgf| \}}}||f}| j|d|| jjf|| d S )NZClassDeletePrinter)rA   r9   r6   r   deletePrinterFromClassr   r   r   r   r     s     z!Connection.deletePrinterFromClassc                 O   s<   | j tgf| \}}|f}| j|d|| jjf|| d S )NZClassDelete)rA   r9   r6   r   deleteClassr   r   r   r   r     s     zConnection.deleteClassc                 O   s<   | j tgf| \}}|f}| j|d|| jjf|| d S )NZPrinterSetDefault)rA   r9   r6   r   
setDefaultr   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)rA   r9   r6   r   enablePrinterr   r   r   r   r     s     zConnection.enablePrinterc                 O   s>   | j tgf| \}}|df}| j|d|| jjf|| d S )NFr   )rA   r9   r6   r   disablePrinterr   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)rA   r9   r6   r   
acceptJobsr   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   )rA   r9   rD   r6   r   
rejectJobs)r   r2   r3   r]   rC   r   r1   r   r   r   r     s    
 zConnection.rejectJobsc                 O   sr   d}d}| j |d|| jjf||}i }|d k	rn| D ]4}t|tjkr`t|| |t|< q8|| ||< q8|S )NFr   ZServerGetSettings)r6   r   adminGetServerSettingsrZ   r   r   r\   r9   )r   r2   r3   r]   r1   r^   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)rA   r[   r6   r   adminSetServerSettings)r   r2   r3   r]   r   r1   r   r   r   r     s     z!Connection.adminSetServerSettingsN)'__name__
__module____qualname__r   r   r!   r'   r6   rA   rD   rX   ra   rd   re   rn   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   r   4   sH   4.a		R6







	





r   )rl   sysrj   r   r   debugr   Zdbus.mainloop.glibr   	functoolsr   r"   r#   r$   r.   r   r   r   r   r   <module>   s   
