
    >a                        d dl mZmZmZ d dlm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mZ d d
lmZmZmZmZ d dlmZ d dlmZmZmZmZ d dl m!Z!m"Z" d dl#m$Z$ d dl%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+m,Z,  e
dd            G d d          Z-d dZ. G d d          Z/ G d de!          Z0 G d d          Z1d dZ2dS )!    )as_completedFuturewait_for)countN)Optional)warn)IOLoop)IOStream)Event)Queue	QueueFull)
SASLParsermake_auth_externalBEGINAuthenticationError)get_bus)ParserMessageTypeMessageMessageFlag)	ProxyBase
unwrap_msg)Router)message_bus   )MessageFiltersFilterHandleReplyMatcherRouterClosedcheck_replyablezsjeepney.io.tornado is deprecated. Tornado is now built on top of asyncio, so please use jeepney.io.asyncio instead.   )
stacklevelc                   >    e Zd ZdefdZdddefdZdefdZd	 ZdS )
DBusConnectionstreamc                 r    || _         t                      | _        t          d          | _        d | _        d S )Nr   )start)r%   r   parserr   outgoing_serialunique_name)selfr%   s     2lib/python3.11/site-packages/jeepney/io/tornado.py__init__zDBusConnection.__init__   s2    hh$1~~~    Nserialmessagec                   K   |t          | j                  }| j                            |                    |                     d {V  d S N)nextr)   r%   write	serialiser+   r1   r0   s      r,   sendzDBusConnection.send!   sW      >$.//Fk 1 1& 9 9:::::::::::r.   returnc                    K   	 | j                                         }||S | j                            dd           d {V }| j                             |           Z)NTi   partial)r(   get_next_messager%   
read_bytesadd_data)r+   msgbs      r,   receivezDBusConnection.receive'   so      	$+..00C
k,,T4,@@@@@@@@AK  ###	$r.   c                 8    | j                                          d S r3   )r%   closer+   s    r,   rD   zDBusConnection.close0   s    r.   )	__name__
__module____qualname__r
   r-   r   r8   rB   rD    r.   r,   r$   r$      s         x         6: ; ; ;' ; ; ; ;$w $ $ $ $    r.   r$   SESSIONc                   K   t          |           }t          t          j        t          j                            }|                    |           d {V  |                    dt                      z              d {V  t                      }|j        sR|	                    |
                    dd           d {V            |j        rt          |j                  |j        R|                    t                     d {V  t          |          }t          |          5 }t!          t#          t$          |                                          d           d {V }|d         |_        d d d            n# 1 swxY w Y   |S )N)family    i   Tr;   
   r   )r   r
   socketAF_UNIXconnectr5   r   r   authenticatedfeedr>   errorr   r   r$   
DBusRouterr   Proxyr   Hellor*   )busbus_addrr%   auth_parserconnrouter
reply_bodys          r,   open_dbus_connectionr^   4   s     s||Hfm6>:::;;F
..
"
""""""""
,,u1333
4
44444444,,K' 9v00t0DDDDDDDDEEE 	9%k&7888 ' 9
 ,,u

&!!D	D		 )V#E+v$>$>$D$D$F$FKKKKKKKK
%a=) ) ) ) ) ) ) ) ) ) ) ) ) ) ) Ks   (A	E==FFc                       e Zd ZdefdZdddZd Zdddd	ee         fd
Z	d Z
d Zd Zed             ZdefdZdefdZd ZdS )rU   r[   c                    || _         t                      | _        t                      | _        t                      | _        t          j                    	                    | j
                   t          t                    | _        d S r3   )r[   r   _repliesr   _filtersr   _stop_receivingr	   currentadd_callback	_receiverr   r   r\   )r+   r[   s     r,   r-   zDBusRouter.__init__L   s^    	$&(($ww%%dn555 Vnnr.   Nr/   c                N   K   | j                             ||           d {V  d S )Nr/   )r[   r8   r7   s      r,   r8   zDBusRouter.sendV   s6      innWVn44444444444r.   c                 r  K   t          |           | j                                        rt          d          t	          | j        j                  }| j                            |t                                5 }| 
                    ||           d {V  | d {V cd d d            S # 1 swxY w Y   d S )NzThis DBusRouter has stoppedr/   )r    rc   is_setr   r4   r[   r)   ra   catchr   r8   )r+   r1   r0   	reply_futs       r,   send_and_get_replyzDBusRouter.send_and_get_replyY   s         &&(( 	><===di/00]  22 	%i))GF)333333333#OOOOOO	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%s   :%B,,B03B0r   )queuebufsizerm   c                L    t          | j        ||pt          |                    S )a  Create a filter for incoming messages

        Usage::

            with router.filter(rule) as queue:
                matching_msg = await queue.get()

        :param jeepney.MatchRule rule: Catch messages matching this rule
        :param tornado.queues.Queue queue: Matched messages will be added to this
        :param int bufsize: If no queue is passed in, create one with this size
        )r   rb   r   )r+   rulerm   rn   s       r,   filterzDBusRouter.filterd   s#     DM41H%..IIIr.   c                 8    | j                                          d S r3   )rc   setrE   s    r,   stopzDBusRouter.stopr   s      """""r.   c                     | S r3   rI   rE   s    r,   	__enter__zDBusRouter.__enter__u   s    r.   c                 .    |                                   dS )NF)rt   r+   exc_typeexc_valexc_tbs       r,   __exit__zDBusRouter.__exit__x   s    		ur.   c                     | j         j        S r3   )r[   r*   rE   s    r,   r*   zDBusRouter.unique_name~   s    y$$r.   r1   c                    K   |j         j        t          j        k    rA|j         j        t
          j        z  s(t          |                     |           d {V           S | 	                    |           d {V  d S r3   )
headermessage_typer   method_returnflagsr   no_reply_expectedr   rl   r8   )r+   r1   s     r,   send_messagezDBusRouter.send_message   s      +{/HHH -0MM I D$;$;G$D$DDDDDDDEEE))G$$$$$$$$$$$r.   r@   c                     | j                             |          rdS | j                            |          D ]-}	 |j                            |           # t          $ r Y *w xY wdS )zHandle one received messageN)ra   dispatchrb   matchesrm   
put_nowaitr   )r+   r@   rq   s      r,   	_dispatchzDBusRouter._dispatch   s    =!!#&& 	Fm++C00 	 	F'',,,,   	 	s   A
A"!A"c                   K   	 	 t          | j                                        | j                                        g          D ]^}| d{V }|# d| _        | j                                         dS |                     |           | j	        
                    |           _# d| _        | j                                         w xY w)z'Receiver loop - runs in a separate taskTNF)r   r[   rB   rc   wait
is_runningra   drop_allr   r\   incoming)r+   coror@   s      r,   rf   zDBusRouter._receiver   s      	%.($)*;*;*=*=t?S?X?X?Z?Z)[\\ . .D $******C{ $DOM""$$$$$ NN3'''K((----. $DOM""$$$$s   AB$ 31B$ $"C)rF   rG   rH   r$   r-   r8   rl   r   r   rq   rt   rv   r|   propertyr*   r   r   r   rf   rI   r.   r,   rU   rU   K   s        %^ % % % % -1 5 5 5 5 5	% 	% 	% 7;A J J JXe_ J J J J# # #     % % X%%' % % % %	W 	 	 	 	% % % % %r.   rU   c                   0     e Zd Zdef fdZd Zd Z xZS )rV   r\   c                 X    t                                          |           || _        d S r3   )superr-   _router)r+   msggenr\   	__class__s      r,   r-   zProxy.__init__   s&       r.   c                 B    d                     | j        | j                  S )NzProxy({}, {}))format_msggenr   rE   s    r,   __repr__zProxy.__repr__   s    %%dlDLAAAr.   c                       fd}|S )Nc                     K    | i |}|j         j        t          j        u sJ t	          j                            |           d {V           S r3   )r   r   r   method_callr   r   rl   )argskwargsr@   make_msgr+   s      r,   innerz!Proxy._method_call.<locals>.inner   sd      (D+F++C:*k.EEEEEDL$C$CC$H$HHHHHHHIIIr.   rI   )r+   r   r   s   `` r,   _method_callzProxy._method_call   s/    	J 	J 	J 	J 	J 	J
 r.   )rF   rG   rH   rU   r-   r   r   __classcell__)r   s   @r,   rV   rV      se        z      B B B      r.   rV   c                   *    e Zd ZdZdZddZd Zd ZdS )_RouterContextNrJ   c                     || _         d S r3   rX   )r+   rX   s     r,   r-   z_RouterContext.__init__   s    r.   c                    K   t          | j                   d {V | _        t          | j                  | _        | j        S r3   )r^   rX   r[   rU   r\   rE   s    r,   
__aenter__z_RouterContext.__aenter__   sB      .tx88888888	 ++{r.   c                 n   K   | j                                          | j                                         d S r3   )r\   rt   r[   rD   rx   s       r,   	__aexit__z_RouterContext.__aexit__   s2      	r.   rJ   )rF   rG   rH   r[   r\   r-   r   r   rI   r.   r,   r   r      sP        DF     
    r.   r   c                      t          |           S )a  Open a D-Bus 'router' to send and receive messages.

    Use as an async context manager::

        async with open_dbus_router() as req:
            ...

    :param str bus: 'SESSION' or 'SYSTEM' or a supported address.
    :return: :class:`DBusRouter`

    This is a shortcut for::

        conn = await open_dbus_connection()
        async with conn:
            async with conn.router() as req:
                ...
    )r   r   s    r,   open_dbus_routerr      s    $ #r.   r   )3asyncior   r   r   	itertoolsr   rO   typingr   warningsr   tornado.ioloopr	   tornado.iostreamr
   tornado.locksr   tornado.queuesr   r   jeepney.authr   r   r   r   jeepney.busr   jeepney.low_levelr   r   r   r   jeepney.wrappersr   r   jeepney.routingr   jeepney.bus_messagesr   commonr   r   r   r   r    r$   r^   rU   rV   r   r   rI   r.   r,   <module>r      s   2 2 2 2 2 2 2 2 2 2                    ! ! ! ! ! ! % % % % % %       + + + + + + + + S S S S S S S S S S S S       G G G G G G G G G G G G 2 2 2 2 2 2 2 2 " " " " " " , , , , , ,               :FGI I I I       4   .[% [% [% [% [% [% [% [%|    I   "       "     r.   