
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
À<×eO  ã               @   s   d dl m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
j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mZ dd	lmZ ydd
lmZ dd„ ZW n  ek
rÖ   ddlmZ Y nX e	jjƒ Zdd„ ZG dd„ dej ƒZ!dS )é   )Ú
interfacesé    N)Úismethod)Úpolkit)ÚGLib)ÚFunctionType)ÚDBusException)ÚErrorMessage)Úgetfullargspecc             C   s   t | ƒS )N)r
   )Úfunc© r   ú#/usr/lib/python3.6/dbus_exporter.pyÚ
getargspec   s    r   )r   c             C   s�   t |dd ƒ}|d k	rn0t |ddƒdkr4d|jj }nd|j|jjf }t|tƒrZ|jƒ }ndjtj	|j|ƒƒ}t
|||ƒ}|jƒ sŒ| j|ƒ d S )NZ_dbus_error_nameÚ
__module__Ú Ú__main__zorg.freedesktop.DBus.Python.%sz!org.freedesktop.DBus.Python.%s.%s)r   r   )ÚgetattrÚ	__class__Ú__name__r   Ú
isinstancer   Zget_dbus_messageÚjoinÚ	tracebackÚformat_exception_onlyr	   Zget_no_replyZsend_message)Z
connectionÚmessageZ	exceptionÚnameÚcontentsZreplyr   r   r   Ú_method_reply_error$   s    

r   c               @   s„   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZe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S )ÚDBusExportera+  
	Export method calls through DBus Interface.

	We take a method to be exported and create a simple wrapper function
	to call it. This is required as we need the original function to be
	bound to the original object instance. While the wrapper will be bound
	to an object we dynamically construct.
	c             C   s”   t jƒ tjkrttj_tjjj	dd� d | _
d | _i | _tƒ | _|| _|| _|| _|| _d | _d | _tƒ | _tjtjƒ}tjƒ | _tjtj|ƒ d S )NT)Zset_as_default)ÚlogZgetEffectiveLevelÚloggingÚDEBUGr   ÚdbusÚserviceZmainloopZglibZDBusGMainLoopÚ_dbus_object_clsZ_dbus_objectÚ_dbus_methodsÚsetÚ_signalsÚ	_bus_nameÚ_interface_nameÚ_object_nameÚ
_namespaceÚ_threadÚ_bus_objectr   Ú_polkitÚsignalÚ	getsignalÚSIGINTr   ZMainLoopÚ
_main_loop)ÚselfÚbus_nameÚinterface_nameÚobject_nameÚ	namespaceZsignal_handlerr   r   r   Ú__init__B   s"    
zDBusExporter.__init__c             C   s   | j S )N)r'   )r2   r   r   r   r3   `   s    zDBusExporter.bus_namec             C   s   | j S )N)r(   )r2   r   r   r   r4   d   s    zDBusExporter.interface_namec             C   s   | j S )N)r)   )r2   r   r   r   r5   h   s    zDBusExporter.object_namec             C   s
   | j d k	S )N)r+   )r2   r   r   r   Úrunningl   s    zDBusExporter.runningc             C   sN   dj |jdjt|jƒjƒd�}t|dt| jƒ dƒ}t	|j
d tƒ |jƒ}|S )Nz2def {name}({args}):
					return wrapper({args})
		z, )r   Úargsz<decorator-gen-%d>Úexecr   )Úformatr   r   r   Ú__func__r9   ÚcompileÚlenr$   r   Ú	co_constsÚlocals)r2   ÚmethodÚwrapperÚsourceÚcoder   r   r   r   Ú_prepare_for_dbuso   s    zDBusExporter._prepare_for_dbusc                sj   t ˆ ƒstdƒ‚ˆ j}|ˆjkr(tdƒ‚‡ ‡fdd„}ˆjˆ |ƒ}tjjˆj||dd�|ƒ}|ˆj|< d S )Nz#Only bound methods can be exported.z*Method with this name is already exported.c                s
  ˆj d ˆ j }|d }tjd||f ƒ ˆjj||ƒ}|}|dkrXtjd||f ƒ n¨|dkrttjd||f ƒ nŒ|dkr¦tjd||f ƒ t|d d… ƒd	g }nZ|dkrØtjd
||f ƒ t|d d… ƒd	g }n(tj	d||f ƒ t|d d… ƒd	g }ˆ ||ŽS )NÚ.r   z?checking authorization for action '%s' requested by caller '%s'zJaction '%s' requested by caller '%s' was successfully authorized by polkité   zepolkit error, but action '%s' requested by caller '%s' was successfully authorized by fallback methodr   zLaction '%s' requested by caller '%s' wasn't authorized, ignoring the requestr   zppolkit error and action '%s' requested by caller '%s' wasn't authorized by fallback method, ignoring the requestzvpolkit error and unable to use fallback method to authorize action '%s' requested by caller '%s', ignoring the requestéÿÿÿÿrH   rH   rH   rH   )
r*   r   r   Údebugr-   Zcheck_authorizationÚwarnÚinfoÚlistÚerror)Úownerr9   ÚkwargsZ	action_idÚcallerÚretZ	args_copy)rA   r2   r   r   rB   …   s$    z$DBusExporter.export.<locals>.wrapperrP   )Zsender_keyword)	r   Ú	Exceptionr   r$   rE   r!   r"   rA   r(   )r2   rA   Zin_signatureÚout_signatureÚmethod_namerB   r   )rA   r2   r   Úexport}   s    
zDBusExporter.exportc                sn   t ˆ ƒstdƒ‚ˆ j}|| jkr(tdƒ‚‡ fdd„}| jˆ |ƒ}tjj| j|ƒ|ƒ}|| j|< | j	j
|ƒ d S )Nz#Only bound methods can be exported.z*Method with this name is already exported.c                s
   ˆ ||ŽS )Nr   )rN   r9   rO   )rA   r   r   rB   §   s    z$DBusExporter.signal.<locals>.wrapper)r   rR   r   r$   rE   r!   r"   r.   r(   r&   Úadd)r2   rA   rS   rT   rB   r   )rA   r   r.   Ÿ   s    

zDBusExporter.signalc             O   sf   d}|| j ks| jd krd}yt| j|ƒ}W n tk
rD   d}Y nX |rXtd| ƒ‚n
|||Ž d S )NFTzSignal '%s' doesn't exist.)r&   r,   r   ÚAttributeErrorrR   )r2   r.   r9   rO   ÚerrrA   r   r   r   Úsend_signal°   s    
zDBusExporter.send_signalc             C   s<   | j d k	rtdƒ‚dt| ƒ }t|tjjf| jƒ}|| _ d S )Nz%The exporter class was already build.zDBusExporter_%d)r#   rR   ÚidÚtyper!   r"   ZObjectr$   )r2   Zunique_nameÚclsr   r   r   Ú_construct_dbus_object_class½   s
    
z)DBusExporter._construct_dbus_object_classc             C   sn   | j ƒ rd S | jd kr| jƒ  | jƒ  tjƒ }tjj| j|ƒ}| j|| j	|ƒ| _
tj| jd�| _| jjƒ  d S )N)Útarget)r8   r#   r]   Ústopr!   Z	SystemBusr"   ZBusNamer'   r)   r,   Ú	threadingZThreadÚ_thread_coder+   Ústart)r2   Zbusr3   r   r   r   rb   Æ   s    
zDBusExporter.startc             C   s2   | j d k	r.| j jƒ r.| jjƒ  | j jƒ  d | _ d S )N)r+   Zis_aliver1   Úquitr   )r2   r   r   r   r_   Ó   s    

zDBusExporter.stopc             C   s   | j jƒ  | `d | _d S )N)r1   Zrunr,   )r2   r   r   r   ra   Ù   s    
zDBusExporter._thread_codeN)r   r   Ú__qualname__Ú__doc__r7   Úpropertyr3   r4   r5   r8   rE   rU   r.   rY   r]   rb   r_   ra   r   r   r   r   r   8   s   "	r   )"r   r   Zdbus.servicer!   Zdbus.mainloop.glibZdbus.exceptionsr`   r.   Z
tuned.logsZtunedZtuned.constsZconstsr   r   Úinspectr   Ztuned.utils.polkitr   Zgi.repositoryr   Útypesr   r   Zdbus.lowlevelr	   r
   r   ÚImportErrorZlogsÚgetr   r   ZExporterInterfacer   r   r   r   r   Ú<module>   s.   

