3
Zh                 @   s   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 d dlmZ d dlZej	d d dl
Z
d dlT d dlZd dlZejejejd G d	d
 d
e jZG dd dZG dd dZG dd deZedkred G dd dZe  ej  dS )    N)GObject)GLib)Gdk)Gtkz1.9.60)*)Zdomain	localedirc               @   sP   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdddZdd Z	dd Z
dS )_IPPConnectionThreadNc
       
      C   sn   t jj|  | jd || _|| _|| _|| _|	| _|| _	|| _
|| _tjd| _|| _d| _td|   d S )NT   Fz+%s)	threadingThread__init__Z	setDaemon_queue_connhostport_encryption_reply_handler_error_handler_auth_handlerqueueQueue_auth_queueuser
_destroyed
debugprint)
selfZmyqueueconnreply_handlererror_handlerauth_handlerr   r   r   
encryption r!   ,/usr/share/system-config-printer/asyncipp.pyr   0   s    
z_IPPConnectionThread.__init__c             C   s   t jd|   d S )Nz-%s)debugr   )r   r!   r!   r"   __del__C   s    z_IPPConnectionThread.__del__c             C   s   | j j| d S )N)r   put)r   passwordr!   r!   r"   set_auth_infoF   s    z"_IPPConnectionThread.set_auth_infoc             C   s  | j d krtj | _ | jd kr(tj | _| jd kr<tj | _| jrPtj| j n
tj	 | _tj
| j y$tj| j | j| jd}| jd  W n0 tk
r } zd }| j| W Y d d }~X nX xtd | jj | _| jj }tdt|  |d kr| jj  P n| jr| jj  qd| _|\}}}}}}	|dkr@|| _|dkrP|| _|	dkr`|	| _|dkr|d | _tj| j td| j  tj
| j y6tj| j | j| jd}td | jj  | jd  W q tk
r } z"td	 | jj  | j| W Y d d }~X qX qyZtd
|  ||f||}
|tjjjkrZ|
i krZtjtjdtd | j|
 W n> tk
r } z tdt|  | j| W Y d d }~X nX | jj  qW td | ` | `| `| `| `| `!~tj
d  d S )N)r   r   r    zAwaiting further instructionszNext task: %sFTr   zSet user=%s; reconnecting...z...reconnectedz	...failedzCall %s z
...successz...failure (%s)zThread exiting)"r   cupsZ	getServerr   ZgetPortr   ZgetEncryptionr   ZsetUsergetUserZsetPasswordCB2_auth
Connection_replyRuntimeError_errorr   r   emptyidlegetreprZ	task_doner   r   r   r   ZadminGetServerSettings__call__IPPErrorIPP_NOT_AUTHORIZED	Exceptionr   r   )r   r   eitemfnargskwdsZrhZehZahresultr!   r!   r"   runI   s    




















z_IPPConnectionThread.runc             C   s   d| _ | jjd  d S )NT)r   r   r%   )r   r!   r!   r"   stop   s    z_IPPConnectionThread.stopc                s:    fdd}j d kr dS tj|| jj }|S )Nc                s>   t j   d kr j| j nj| j t j  dS )NF)r   threads_enterr   r   threads_leave)prompt)r   methodresourcer   r!   r"   prompt_auth   s    z/_IPPConnectionThread._auth.<locals>.prompt_authr(   )r   r   idle_addr   r2   )r   rB   r   rC   rD   rE   r&   r!   )r   rC   rD   r   r"   r+      s    


z_IPPConnectionThread._authc                s.    fdd} j  r* jr*tj| j| d S )Nc                s&    j s"tj  |  j| tj  dS )NF)r   r   r@   r   rA   )handlerr=   )r   r!   r"   
send_reply   s
    z/_IPPConnectionThread._reply.<locals>.send_reply)r   r   r   rF   )r   r=   rH   r!   )r   r"   r-      s    z_IPPConnectionThread._replyc                s<    fdd} j  r8 jr8td j  tj| j| d S )Nc                s&    j s"tj  |  j| tj  dS )NF)r   r   r@   r   rA   )rG   exc)r   r!   r"   
send_error   s
    z/_IPPConnectionThread._error.<locals>.send_errorzAdd %s to idle)r   r   r   r   rF   )r   rI   rJ   r!   )r   r"   r/      s    z_IPPConnectionThread._error)NNNNNNN)NNN)__name__
__module____qualname__r   r$   r'   r>   r?   r+   r-   r/   r!   r!   r!   r"   r   /   s     
c
r   c               @   sT   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdddZ	dd Z
dd ZdS )IPPConnectiona  
    This class starts a new thread to handle IPP operations.

    Each IPP operation method takes optional reply_handler,
    error_handler and auth_handler parameters.

    If an operation requires a password to proceed, the auth_handler
    function will be called.  The operation will continue once
    set_auth_info (in this class) is called.

    Once the operation has finished either reply_handler or
    error_handler will be called.
    Nc	             C   s   t d || _tj | _t| j| |||||||d	| _| jj  ttj	j
}	g }
xVttj	D ]H}|d dkrnq\ttj	|}t||	krq\t| || j| |
j| q\W |
| _t d|   d S )NzNew IPPConnection)r   r   r   r   r   r   r    r    z+%s)r   Z_parentr   r   r   threadstarttyper)   r,   ZgetPrintersdirgetattrsetattr_make_bindingappendbindings)r   r   r   r   r   r   r   r    parentZ
methodtyperX   fnamer:   r!   r!   r"   r      s,    


zIPPConnection.__init__c             C   s   t jd|   d S )Nz-%s)r#   r   )r   r!   r!   r"   r$     s    zIPPConnection.__del__c             C   sT   t d|   x| jD ]}t| | qW | jj rPt d | jj  tjd| j d S )NzDESTROY: %szStopping worker threadr	   )	r   rX   delattrrP   ZisAliver?   r   Ztimeout_add_seconds_reap_thread)r   Zbindingr!   r!   r"   destroy  s    

zIPPConnection.destroyc             C   s(   | j jr| jj  dS td| j   dS )NFz Thread %s still processing tasksT)rP   r1   r   joinr   )r   r!   r!   r"   r\     s
    
zIPPConnection._reap_threadc             C   s   | j j| dS )z*Call this from your auth_handler function.N)rP   r'   )r   r&   r!   r!   r"   r'     s    zIPPConnection.set_auth_infoc             C   s&   t d | jjd|fi ||df d S )NzReconnect...TF)r   r   r%   )r   r   r   r   r!   r!   r"   	reconnect!  s    zIPPConnection.reconnectc                s    fddS )Nc                 s   j  f| |S )N)_call_function)r;   r<   )r:   r   r!   r"   <lambda>'  s    z-IPPConnection._make_binding.<locals>.<lambda>r!   )r   r:   r!   )r:   r   r"   rV   &  s    zIPPConnection._make_bindingc             O   sj   d } }}d|kr"|d }|d= d|kr8|d }|d= d|krN|d }|d= | j j||||||f d S )NFr   r   r   )r   r%   )r   r:   r;   r<   r   r   r   r!   r!   r"   r`   )  s    zIPPConnection._call_function)NNNNNNNN)NN)rK   rL   rM   __doc__r   r$   r]   r\   r'   r_   rV   r`   r!   r!   r!   r"   rN      s     


rN   c               @   sh   e Zd ZdddZdd Zdd Zdd	 Zdd
dZdd Zdd Z	dd Z
dd Zdd Zdd ZdS )_IPPAuthOperationNc             C   sh   d| _ d| _d| _d| _d| _d| _|| _|| _| jj| _	|| _
|| _|| _|| _|| _td|   d S )NFr(   z+%s)_auth_called_dialog_shown_use_password_cancel
_reconnect_reconnected_userr   try_as_root_try_as_root
_client_fn_client_args_client_kwds_client_reply_handler_client_error_handlerr   )r   r   r   r   r   r:   r;   r<   r!   r!   r"   r   A  s    
z_IPPAuthOperation.__init__c             C   s   t jd|   d S )Nz-%s)r#   r   )r   r!   r!   r"   r$   T  s    z_IPPAuthOperation.__del__c             C   s   | ` | `| `| `| `| `d S )N)r   rm   rn   ro   rp   rq   )r   r!   r!   r"   _destroyW  s    z_IPPAuthOperation._destroyc       	      C   s  | j d krtd | j||S | jr:td|   | j|S | jrxd| _d| _td| | jf  |j| j| j	| jd d S d}t
|tjkr|j\}}|tjks|tjks|tjkr|tjk}n |tjkr| j||S | j|S nRt
|tjkr(|j\}|tjks|tjkr|tjk}n
| j|S n
| j|S |rFtd|   ntd|   | jr| jd	kr| jjjd
 dks|rtd d	| _|j| j| j	| jd d S | js| j|S |jj}|jj}tjj||d d| _td| | jf  |j| j| j	| jd d S )NzConnection/reconnection failedz,%s (_error_handler): canceled so chaining upFTz,%s (_error_handler): reconnecting (as %s)...)r   r   z%s (_error_handler): forbiddenz#%s (_error_handler): not authorizedrootr   /zAuthentication: Try as root)r   r   r(   )rm   r   _reconnect_errorrg   r/   rh   ri   rj   r_   _reconnect_replyrR   r)   r5   r;   r6   ZIPP_FORBIDDENZIPP_AUTHENTICATION_CANCELEDZIPP_SERVICE_UNAVAILABLEZ	HTTPErrorZHTTP_UNAUTHORIZEDZHTTP_FORBIDDENrl   r   rP   r   rd   r   authconnglobal_authinfocacheremove_auth_inforf   )	r   r   rI   Z	forbiddenr8   msr   r   r!   r!   r"   r   _  sp    








	

z_IPPAuthOperation.error_handlerc             C   s  | j dkrj| jd krtj | _| jr|jj}|jj}tjj	||d}|r|d | jkrf|d | _
d| _~n&|jj}|jj}tjj||d d| _
d| _ | jrtd d| _|j| j
 d S d| _|js|j| j
 d S | jr"tj| jjddtjjtjjtdd	}|jtd
 |j  |j  d }	|jr8|jj }	|	d krRtj|jd}ntd|	 }
tj|
|jd}|j d | jd krtj | _|jddg |j!d |j"d |j#  |j$d| j% d| _d S )NF)r   r   r   r	   Tr(   z%Supplying password after reconnectionzNot authorized)rY   modaldestroy_with_parentmessage_typebuttonstextzThe password may be incorrect.)rY   zAuthentication (%s))titlerY   Zusernameresponse)&rd   rj   r)   r*   rP   r   r   rw   rx   lookup_auth_inforf   ri   ry   r   r'   prompt_allowedre   r   MessageDialogr   rY   MessageTypeERRORButtonsTypeZCLOSE_format_secondary_textr>   r]   semanticcurrent_operationZ
AuthDialogZ
set_promptZfield_grab_focusZset_keep_aboveshow_allconnect_on_auth_dialog_response)r   rB   r   rC   rD   r   r   credsdopr   r!   r!   r"   r     sl    











z_IPPAuthOperation.auth_handlerc             C   s0   d| _ | jjj| j| j| j| j| j| j	f d S )NF)
rd   r   r   r%   rm   rn   ro   rp   r   r   )r   r!   r!   r"   submit_task  s    z_IPPAuthOperation.submit_taskc             C   s   |j  \}}|dkr| j}tjj||f| jjj| jjjd || _	|j
  |tjjksb|tjjkrd| _| jjd tjj| jjj| jjjd td d S || jkr|| _| jj| td d S || _|| _d| _| jjd td| j  d S )Nr(   )r   r   TzAuth canceledzPassword supplied.zWill try as %s)Zget_auth_inforj   rw   rx   Zcache_auth_infor   rP   r   r   Z_dialogZhider   ResponseTypeCANCELZDELETE_EVENTrg   r'   ry   r   rf   rh   )r   dialogr   r   r&   r!   r!   r"   r     s6    
z*_IPPAuthOperation._on_auth_dialog_responsec             C   s$   t d| j  | jd k	r | j  d S )NzConnected as %s)r   rj   rm   r   )r   r   r=   r!   r!   r"   rv     s    
z"_IPPAuthOperation._reconnect_replyc             C   s   t d| j  | jjs$| j| d S d }|jr8|jj }|d krJtd}ntd| }tj	| jj
ddtjjtjj|d}| jd krt|tkrd}n"t|tjkr|jd }nt|}|jtd|  |jtjtjjtd	tjj |jtjj |jd
| j t d| ||f  |j  d S )NzFailed to connect as %szCUPS server errorzCUPS server error (%s)T)rY   r|   r}   r~   r   r   z!service-error-service-unavailabler	   z3There was an error during the CUPS operation: '%s'.ZRetryr   z7%s (_reconnect_error): presenting error dialog (%s; %s)) r   rj   r   r   r/   r   r   r   r   r   rY   r   r   r   ZNONErm   rR   r.   r)   r5   r;   r3   r   Zadd_buttonsZSTOCK_CANCELr   r   OKZset_default_responser   _on_retry_server_error_responseZshow)r   r   rI   r   msgr   messager!   r!   r"   ru   %  s:    




z"_IPPAuthOperation._reconnect_errorc             C   sn   |j   |tjjkrHtd| | jjjf  | jj| jjj| j	| j
d n"td|   | jtjdtd d S )Nz/%s: got retry response, reconnecting (as %s)...)r   r   z%s: got cancel responser   zOperation canceled)r]   r   r   r   r   r   rP   r   r_   rv   ru   r/   r)   r5   r   )r   r   r   r!   r!   r"   r   L  s    z1_IPPAuthOperation._on_retry_server_error_responsec             C   sT   t d| t|f  | jrDt d| | jf  | j| j| | j  nt d|   d S )Nz%s (_error): handling %sz%s (_error): calling %sz(%s (_error): no client error handler set)r   r3   rq   r   rr   )r   rI   r!   r!   r"   r/   X  s    
z_IPPAuthOperation._error)NNNN)NN)rK   rL   rM   r   r$   rr   r   r   r   r   rv   ru   r   r/   r!   r!   r!   r"   rc   @  s   
S
A
 'rc   c            
   @   s&   e Zd Zd	ddZdd Zdd ZdS )
IPPAuthConnectionNTc          
   C   sx   || _ |	| _|| _|
| _d }tjj||d}|rJ|d dks@|rH|d }~t||| }tj	| ||j
|j||||d d S )N)r   r   r   rs   )r   r   r   r   r   r   r    )rY   r   rk   r   rw   rx   r   rc   rN   r   r   r   )r   r   r   r   r   r   r    rY   rk   r   r   r   r   r   r!   r!   r"   r   f  s     zIPPAuthConnection.__init__c             C   s   d | _ tj|  d S )N)r   rN   r]   )r   r!   r!   r"   r]   ~  s    zIPPAuthConnection.destroyc             O   sr   d } }}d|kr"|d }|d= d|kr8|d }|d= d|krN|d }|d= t ||| | jj|||}|j  d S )NFr   r   r   )rc   rP   r   r   )r   r:   r;   r<   r   r   r   r   r!   r!   r"   r`     s    z IPPAuthConnection._call_function)
NNNNNNNTTN)rK   rL   rM   r   r]   r`   r!   r!   r!   r"   r   e  s      
r   __main__Tc               @   sL   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S )UIc             C   s   t j }|jd| j t jjd}|jd| j t j }|j|ddd |j	| t jjd| _
| j
jd| j | j
jd |j| j
ddd d | _|j  d S )Nr]   ZConnectZclickedFr   zGet Devices)r   ZWindowr   r]   ZButtonZnew_with_labelconnect_clickedZVBoxZ
pack_startaddget_devices_buttonget_devicesset_sensitiver   r   )r   wbZvboxr!   r!   r"   r     s    
zUI.__init__c             C   s0   y| j j  W n tk
r"   Y nX tj  d S )N)r   r]   AttributeErrorr   Z	main_quit)r   Zwindowr!   r!   r"   r]     s
    z
UI.destroyc             C   s&   | j r| j j  t| j| jd| _ d S )N)r   r   )r   r]   r   	connectedconnect_failed)r   buttonr!   r!   r"   r     s    
zUI.connect_clickedc             C   s    t dt|  | jjd d S )NzSuccess: %sT)r   r3   r   r   )r   r   r=   r!   r!   r"   r     s    zUI.connectedc             C   s*   t dt|  | jjd | jj  d S )NzExc %sF)r   r3   r   r   r   r]   )r   r   rI   r!   r!   r"   r     s    zUI.connect_failedc             C   s*   |j d td | jj| j| jd d S )NFzGetting devices)r   r   )r   r   r   Z
getDevicesget_devices_replyget_devices_error)r   r   r!   r!   r"   r     s    

zUI.get_devicesc             C   s6   || j krtd d S tdt|  | jjd d S )NzIgnoring stale replyzGot devices: %sT)r   r   r3   r   r   )r   r   r=   r!   r!   r"   r     s
    
zUI.get_devices_replyc             C   s6   || j krtd d S tdt|  | jjd d S )NzIgnoring stale errorzError getting devices: %sT)r   r   r3   r   r   )r   r   rI   r!   r!   r"   r     s
    
zUI.get_devices_errorN)rK   rL   rM   r   r]   r   r   r   r   r   r   r!   r!   r!   r"   r     s   r   )r
   configr)   Zgi.repositoryr   r   r   r   r   Zrequirerw   r#   gettextinstallZPACKAGEr   r   r   rN   rc   r   rK   Zset_debuggingr   mainr!   r!   r!   r"   <module>   s2   
 /c  '1>