U
    9¡_d&  ã                   @   s´   d dl Z d dlZd dlT d dlZG dd„ deƒZG dd„ dƒZG dd„ deƒZed	kr°d d
lm	Z	 e
dƒ G dd„ dƒZedƒZe	 ¡ Ze ¡  e ¡  edƒZe ¡  e ¡  dS )é    N)Ú*c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚSemanticOperationsc                 C   s
   g | _ d S ©N)Ú_operation_stack©Úself© r   ú-/usr/share/system-config-printer/asyncconn.pyÚ__init__   s    zSemanticOperations.__init__c                 C   s   | j  |¡ d S r   )r   Úappend)r   Z	operationr   r   r	   Ú_begin_operation"   s    z#SemanticOperations._begin_operationc                 C   s   | j  ¡  d S r   )r   Úpopr   r   r   r	   Ú_end_operation%   s    z!SemanticOperations._end_operationc                 C   s(   z| j d W S  tk
r"   Y d S X d S )Nr   )r   Ú
IndexErrorr   r   r   r	   Úcurrent_operation(   s    z$SemanticOperations.current_operationN)Ú__name__Ú
__module__Ú__qualname__r
   r   r   r   r   r   r   r	   r      s   r   c                   @   sD   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S )Ú_AsyncMethodCallc                 C   s.   || _ || _|| _|| _d| _td|  ƒ d S )NFú+%s)Ú_fnÚ_reply_handlerÚ_error_handlerÚ_auth_handlerÚ
_destroyedÚ
debugprint)r   ÚfnÚreply_handlerÚerror_handlerÚauth_handlerr   r   r	   r
   3   s    z_AsyncMethodCall.__init__c                 C   s   t d|  ƒ d S ©Nz-%s)r   r   r   r   r	   Ú__del__;   s    z_AsyncMethodCall.__del__c                 C   sD   | j r
d S td|  ƒ d| _ d | _d | _d | _d | _d | _d | _d S ©NúDESTROY: %sT)r   r   r   r   r   Ú_reply_dataÚ_error_dataÚ
_auth_datar   r   r   r	   Údestroy>   s    z_AsyncMethodCall.destroyc                 O   sd   |  d¡| _|  d¡| _|  d¡| _| j|d< | j|d< | j|d< td| | jf ƒ | j||Ž d S )Nr   r   r   z%s: calling %s)	Úgetr$   r%   r&   r   r   r   r   r   )r   ÚargsÚkwdsr   r   r	   ÚrunK   s    


z_AsyncMethodCall.runc                 G   s0   | j s,td| | jf ƒ | j| | jf|žŽ  d S )Nz%s: to reply_handler at %s)r   r   r   r$   ©r   r)   r   r   r	   r   U   s
    ÿz_AsyncMethodCall.reply_handlerc                 G   s0   | j s,td| | jf ƒ | j| | jf|žŽ  d S )Nz%s: to error_handler at %s)r   r   r   r%   r,   r   r   r	   r   [   s
    ÿz_AsyncMethodCall.error_handlerc                 G   s0   | j s,td| | jf ƒ | j| | jf|žŽ  d S )Nz%s: to auth_handler at %s)r   r   r   Z	auth_datar,   r   r   r	   r   a   s
    ÿz_AsyncMethodCall.auth_handlerN)
r   r   r   r
   r!   r'   r+   r   r   r   r   r   r   r	   r   2   s   
r   c                	       s^   e Zd Zd‡ f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‡  ZS )Ú
ConnectionNTc
                    s|  t tˆƒ ¡  dˆ_|d kr$t ¡ }| d¡s6|dko@t ¡ dk}
‡‡fdd„}‡‡fdd„}‡ ‡fd	d
„}|
r¢|r¢t	dƒ dd l
}|j||||||d}|ˆ_n4t	dƒ dd l}|j|||||||||	ˆd
}|ˆ_tˆjjƒ}tˆjjƒ}g }tˆjƒD ]b}| d¡rqütˆj|ƒ}t|ƒ|kr8t|ƒ|kr8qütˆ|ƒsütˆ|ˆ |¡ƒ | |¡ qü|ˆ_g ˆ_t	dˆ ƒ d S )NFú/Z	localhostr   c                    s   ˆ  d ˆ |¡ d S r   )Ú_subst_reply_handler)ÚconnZreply)r   r   r   r	   Úsubst_reply_handlerz   s    z0Connection.__init__.<locals>.subst_reply_handlerc                    s   ˆ  d ˆ |¡ d S r   )Ú_subst_error_handler)r0   Úexc)r   r   r   r	   Úsubst_error_handler}   s    z0Connection.__init__.<locals>.subst_error_handlerc                    s   ˆ  d ˆ | ||¡ d S r   )Ú_subst_auth_handler)Úpromptr0   ÚmethodÚresource)r   r   r   r	   Úsubst_auth_handler€   s    z/Connection.__init__.<locals>.subst_auth_handlerzUsing polkit-1 connection class)r   r   ÚhostÚportÚ
encryptionÚparentzUsing IPP connection class)
r   r   r   r:   r;   r<   r=   Útry_as_rootÚprompt_allowedZsemanticÚ_r   )Úsuperr-   r
   r   ÚcupsZ	getServerÚ
startswithÚosÚgetuidr   Úasyncpk1ZPK1ConnectionÚ_connÚasyncippZIPPAuthConnectionÚtypeZgetPrintersÚ
getDevicesÚdirÚgetattrÚhasattrÚsetattrÚ_make_bindingr   Ú	_bindingsÚ_methodcalls)r   r   r   r   r:   r;   r<   r=   r>   r?   Zuse_pkr1   r4   r9   rF   ÚcrH   Z
methodtypeZinstancemethodtypeZbindingsÚfnamer   ©Ú	__class__)r   r   r   r   r	   r
   m   sd    
ÿ ü ø	
zConnection.__init__c                 C   s   t  d|  ¡ d S r    ©Údebugr   r   r   r   r	   r!   «   s    zConnection.__del__c                 C   sd   t d|  ƒ d| _z| j ¡  W n tk
r4   Y nX | jD ]}| ¡  q<| jD ]}t| |ƒ qPd S r"   )r   r   rG   r'   ÚAttributeErrorrQ   rP   Údelattr)r   Ú
methodcallZbindingr   r   r	   r'   ®   s    


zConnection.destroyc                    s   ‡ ‡fdd„S )Nc                     s   ˆj ˆ f| ž|ŽS r   )Ú_call_function)r)   r*   ©r   r   r   r	   Ú<lambda>½   ó    z*Connection._make_binding.<locals>.<lambda>r   )r   r   r   r\   r	   rO   ¼   s    zConnection._make_bindingc                 O   s0   t || j| j| jƒ}| j |¡ |j||Ž d S r   )r   r/   r2   r5   rQ   r   r+   )r   r   r)   r*   rZ   r   r   r	   r[   ¿   s    ýzConnection._call_functionc                 G   sX   |r,|  ¡  | j |¡}| j|= |dd … }|rT| jsTtd| |f ƒ || f|žŽ  d S ©Né   ú%s: chaining up to %s©r'   rQ   Úindexr   r   )r   rZ   r   r)   Úir   r   r	   r/   Ç   s    
zConnection._subst_reply_handlerc                 G   sX   |r,|  ¡  | j |¡}| j|= |dd … }|rT| jsTtd| |f ƒ || f|žŽ  d S r_   rb   )r   rZ   r   r)   rd   r   r   r	   r2   Ñ   s    
zConnection._subst_error_handlerc                 C   sL   |r |  ¡  | j |¡}| j|= |rH| jsHtd| |f ƒ ||| ||ƒ d S )Nra   rb   )r   rZ   r   r6   r7   r8   rd   r   r   r	   r5   Û   s    
zConnection._subst_auth_handlerc                 C   s   | j  |¡ dS )z*Call this from your auth_handler function.N)ÚthreadÚset_auth_info)r   Zpasswordr   r   r	   rf   ä   s    zConnection.set_auth_info)	NNNNNNNTT)r   r   r   r
   r!   r'   rO   r[   r/   r2   r5   rf   Ú__classcell__r   r   rT   r	   r-   l   s"                þ>

	r-   Ú__main__)ÚGObjectTc                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚTestc                 C   s   t ƒ | _|| _td|  ƒ d S )Nr   )r-   rG   Ú_quitr   )r   Úquitr   r   r	   r
   î   s    zTest.__init__c                 C   s   t  d|  ¡ d S r    rV   r   r   r   r	   r!   ó   s    zTest.__del__c                 C   s(   t d|  ƒ | j ¡  | jr$t ¡  d S )Nr#   )r   rG   r'   rk   Úlooprl   r   r   r   r	   r'   ö   s    
zTest.destroyc                 C   s   | j j| j| jd d S )N)r   r   )rG   rJ   ÚgetDevices_replyÚgetDevices_errorr   r   r   r	   rJ   ü   s    
ÿzTest.getDevicesc                 C   s   t ||ƒ |  ¡  d S r   )Úprintr'   )r   r0   Úresultr   r   r	   rn      s    
zTest.getDevices_replyc                 C   s   t t|ƒƒ |  ¡  d S r   )rp   Úreprr'   )r   r0   r3   r   r   r	   ro     s    zTest.getDevices_errorN)	r   r   r   r
   r!   r'   rJ   rn   ro   r   r   r   r	   rj   í   s   rj   F)rB   rD   rW   Úobjectr   r   r-   r   Zgi.repositoryri   Zset_debuggingrj   ÚtZMainLooprm   rJ   r'   r+   r   r   r   r	   Ú<module>   s"   :|