B
    Rœ±[.	  ã               @   s.   d dl mZmZ d dlmZ G dd„ dƒZdS )é   )ÚMessageTypeÚHeaderFields)ÚDBusErrorResponsec               @   s2   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZdS )ÚRoutera[  Routing for messages coming back to a client application.
    
    :param handle_factory: Constructor for an object like asyncio.Future,
        with methods *set_result* and *set_exception*. Outgoing method call
        messages will get a handle associated with them.
    :param on_unhandled: Callback for messages not otherwise dispatched.
    Nc             C   s"   || _ || _d| _i | _i | _d S )Né    )Úhandle_factoryÚon_unhandledÚoutgoing_serialÚawaiting_replyÚsignal_callbacks)Úselfr   r   © r   ú.lib/python3.7/site-packages/jeepney/routing.pyÚ__init__   s
    zRouter.__init__c             C   sD   |  j d7  _ | j |j_|jjtjkr@|  ¡  | j|jj< }|S dS )zNSet the serial number in the message & make a handle if a method call
        r   N)r	   ÚheaderÚserialÚmessage_typer   Zmethod_callr   r
   )r   ÚmsgZhandler   r   r   Úoutgoing   s
    
zRouter.outgoingc             C   s   || j |||f< dS )z%Add a callback for a signal.
        N)r   )r   ÚcallbackÚpathÚ	interfaceÚmemberr   r   r   Úsubscribe_signal   s    zRouter.subscribe_signalc             C   sØ   |j }|jtjkrd|j tjd¡|j tjd¡|j tj	d¡f}| j
 |d¡}|dk	rd||jƒ dS |j tjd¡}| j |d¡}|dk	rÄ|jtjkr¦| |j¡ dS |jtjkrÄ| t|ƒ¡ dS | jrÔ|  |¡ dS )z#Route an incoming message.
        Néÿÿÿÿ)r   r   r   ÚsignalZfieldsÚgetr   r   r   r   r   ZbodyÚreply_serialr
   ÚpopZmethod_returnZ
set_resultÚerrorZset_exceptionr   r   )r   r   ZhdrÚkeyÚcbr   Zreply_handler   r   r   Úincoming"   s(    
zRouter.incoming)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r"   r   r   r   r   r      s
   

r   N)Z	low_levelr   r   Zwrappersr   r   r   r   r   r   Ú<module>   s   