U
    [e.                     @   s  d Z ddlZddlmZ ddlmZ ddlZddlmZ ddl	Z	ddl
mZmZ ddlZddl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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( dddgZ)G dd dZ*dd Z+dd Z,G dd dZ-G dd de-Z.G dd deZ/dd Z0d*ejd"d#d$Z1d+e.d"d'dZ2e3d(kre2 Z4e5d)e4j6 dS ),z'Synchronous IO wrappers around jeepney
    N)deque)
ECONNRESET)count)DefaultSelector
EVENT_READ)Optional)ParserMessageMessageTypeHeaderFields)AuthenticatorBEGIN)get_bus)FileDescriptorfds_buf_size)	ProxyBase
unwrap_msg)Router)message_bus   )MessageFiltersFilterHandlecheck_replyableopen_dbus_connectionDBusConnectionProxyc                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )_Futurec                 C   s
   d | _ d S N_resultself r"   U/var/www/html/services/stratfitenv/lib/python3.8/site-packages/jeepney/io/blocking.py__init__   s    z_Future.__init__c                 C   s
   t | jS r   )boolr   r    r"   r"   r#   done"   s    z_Future.donec                 C   s   d|f| _ d S NFr   )r!   	exceptionr"   r"   r#   set_exception%   s    z_Future.set_exceptionc                 C   s   d|f| _ d S )NTr   )r!   resultr"   r"   r#   
set_result(   s    z_Future.set_resultc                 C   s   | j \}}|r|S |d S r   r   )r!   successvaluer"   r"   r#   r*   +   s    
z_Future.resultN)__name__
__module____qualname__r$   r&   r)   r+   r*   r"   r"   r"   r#   r      s
   r   c                 C   s   | d k	rt  |  S d S r   )time	monotonictimeoutr"   r"   r#   timeout_to_deadline2   s    r5   c                 C   s   | d k	rt | t  dS d S )Ng        )maxr1   r2   )deadliner"   r"   r#   deadline_to_timeout7   s    r8   c                   @   sv   e Zd ZdZdejdddZdd Zdd	 Zee	e
ej fd
ddZdd Zdd ZdddZdd Zdd ZdS )DBusConnectionBasez8Connection machinery shared by this module and threadingFsockc                 C   sB   || _ || _t | _tdd| _t | _| j|t	| _
d | _d S )Nr   )start)r;   
enable_fdsr   parserr   outgoing_serialr   selectorregisterr   
select_keyunique_name)r!   r;   r=   r"   r"   r#   r$   ?   s    zDBusConnectionBase.__init__c                 C   s   | S r   r"   r    r"   r"   r#   	__enter__H   s    zDBusConnectionBase.__enter__c                 C   s   |    dS r'   )close)r!   exc_typeexc_valexc_tbr"   r"   r#   __exit__K   s    zDBusConnectionBase.__exit__)messagereturnc                 C   s<   |d krt | j}| jr"tdnd }|j||d}||fS )Ni)serialfds)nextr?   r=   arrayZ	serialise)r!   rJ   rM   rN   datar"   r"   r#   
_serialiseO   s
    
zDBusConnectionBase._serialisec                 C   s@   | j |gtjtj|fg}|t|k r<| j ||d   d S r   )r;   sendmsgsocket
SOL_SOCKET
SCM_RIGHTSlensendall)r!   rQ   rN   Z
bytes_sentr"   r"   r#   _send_with_fdsV   s     z!DBusConnectionBase._send_with_fdsc                 C   s@   | j  }|d k	r|S | jt|d\}}| j j||d q d S )Nr3   )rN   )r>   Zget_next_message_read_some_datar8   Zadd_data)r!   r7   msgbrN   r"   r"   r#   _receive_   s
    
zDBusConnectionBase._receiveNc                 C   sR   | j |D ]<\}}|| jkr| jr0|    S t| jdg f  S qtd S )Ni   )	r@   selectrB   r=   _read_with_fdsunwrap_readr;   recvTimeoutError)r!   r4   keyZevr"   r"   r#   rZ   h   s    
z"DBusConnectionBase._read_some_datac                 C   sT   | j  }| j|t \}}}}|ttdd@ rB|   tdt	|t
|fS )N
MSG_CTRUNCr   z&Unable to receive all file descriptors)r>   Zbytes_desiredr;   recvmsgr   getattrrT   rE   RuntimeErrorr`   r   Zfrom_ancdata)r!   nbytesrQ   Zancdataflags_r"   r"   r#   r_   r   s    
z!DBusConnectionBase._read_with_fdsc                 C   s   | j   | j  dS )zClose the connectionN)r@   rE   r;   r    r"   r"   r#   rE   z   s    
zDBusConnectionBase.close)F)N)r.   r/   r0   __doc__rT   r$   rD   rI   r	   bytesr   rP   rR   rY   r]   rZ   r_   rE   r"   r"   r"   r#   r9   =   s   			

r9   c                       s   e Zd Zdejd fddZdedddZeZdd	ed
ddZdd	ddZ	dddddZ
dddee dddZdd	ed
ddZ  ZS )r   Fr:   c                    sJ   t  || d| _tt| _t | _tt	| | _
| j
 }|d | _d S )NFr   )superr$   _unwrap_replyr   r   routerr   _filtersr   r   Z	bus_proxyZHellorC   )r!   r;   r=   Zhello_reply	__class__r"   r#   r$      s    

zDBusConnection.__init__N)rJ   c                 C   s2   |  ||\}}|r"| || n| j| dS )z.Serialise and send a :class:`~.Message` objectN)rR   rY   r;   rX   )r!   rJ   rM   rQ   rN   r"   r"   r#   send   s    zDBusConnection.sendr3   rK   c                C   s   |  t|S )a+  Return the next available message from the connection

        If the data is ready, this will return immediately, even if timeout<=0.
        Otherwise, it will wait for up to timeout seconds, or indefinitely if
        timeout is None. If no message comes in time, it raises TimeoutError.
        )r]   r5   )r!   r4   r"   r"   r#   receive   s    zDBusConnection.receivec                C   s:   | j |d}| j| | j|D ]}|j| q$dS )z\Receive one message and apply filters

        See :meth:`filter`. Returns nothing.
        r3   N)ru   ro   incomingrp   matchesqueueappend)r!   r4   r[   filterr"   r"   r#   recv_messages   s    zDBusConnection.recv_messagesr4   unwrapc          	      C   s   t | t|}|dkr| j}t| j}| j||d | jt|d}|jj	
tjd}||krp|rlt|S |S | j| | j|D ]}|j| qq6dS )zSend a message, wait for the reply and return it

        Filters are applied to other messages received before the reply -
        see :meth:`add_filter`.
        N)rM   r3   )r   r5   rn   rO   r?   send_messageru   r8   headerfieldsgetr   Zreply_serialr   ro   rv   rp   rw   rx   ry   )	r!   rJ   r4   r}   r7   rM   Zmsg_inZreply_torz   r"   r"   r#   send_and_get_reply   s    
z!DBusConnection.send_and_get_replyr   )rx   bufsize)rx   c                C   s    |dkrt |d}t| j||S )a  Create a filter for incoming messages

        Usage::

            with conn.filter(rule) as matches:
                # matches is a deque containing matched messages
                matching_msg = conn.recv_until_filtered(matches)

        :param jeepney.MatchRule rule: Catch messages matching this rule
        :param collections.deque queue: Matched messages will be added to this
        :param int bufsize: If no deque is passed in, create one with this size
        N)maxlen)r   r   rp   )r!   rulerx   r   r"   r"   r#   rz      s    
zDBusConnection.filterc                C   s.   t |}t|dkr&| jt|d q| S )aZ  Process incoming messages until one is filtered into queue

        Pops the message from queue and returns it, or raises TimeoutError if
        the optional timeout expires. Without a timeout, this is equivalent to::

            while len(queue) == 0:
                conn.recv_messages()
            return queue.popleft()

        In the other I/O modules, there is no need for this, because messages
        are placed in queues by a separate task.

        :param collections.deque queue: A deque connected by :meth:`filter`
        :param float timeout: Maximum time to wait in seconds
        r   r3   )r5   rW   r{   r8   popleft)r!   rx   r4   r7   r"   r"   r#   recv_until_filtered   s    z"DBusConnection.recv_until_filtered)F)N)r.   r/   r0   rT   r$   r	   rs   r   ru   r{   r   r   r   rz   r   __classcell__r"   r"   rq   r#   r      s   	
c                       s6   e Zd ZdZdd fdd
Zdd Zdd	 Z  ZS )
r   aj  A blocking proxy for calling D-Bus methods

    You can call methods on the proxy object, such as ``bus_proxy.Hello()``
    to make a method call over D-Bus and wait for a reply. It will either
    return a tuple of returned data, or raise :exc:`.DBusErrorResponse`.
    The methods available are defined by the message generator you wrap.

    You can set a time limit on a call by passing ``_timeout=`` in the method
    call, or set a default when creating the proxy. The ``_timeout`` argument
    is not passed to the message generator.
    All timeouts are in seconds, and :exc:`TimeoutErrror` is raised if it
    expires before a reply arrives.

    :param msggen: A message generator object
    :param ~blocking.DBusConnection connection: Connection to send and receive messages
    :param float timeout: Default seconds to wait for a reply, or None for no limit
    Nr3   c                   s   t  | || _|| _d S r   )rm   r$   _connection_timeout)r!   Zmsggen
connectionr4   rq   r"   r#   r$      s    zProxy.__init__c                 C   s4   | j d krdn
d| j  }d| j d| j | dS )N z
, timeout=zProxy(z, ))r   Z_msggenr   )r!   extrar"   r"   r#   __repr__  s    zProxy.__repr__c                    s   t   fdd}|S )Nc                     s<   | dj} | |}|jjtjks*tjj||ddS )Nr   Tr|   )	popr   r   Zmessage_typer
   method_callAssertionErrorr   r   )argskwargsr4   r[   make_msgr!   r"   r#   inner	  s    
  z!Proxy._method_call.<locals>.inner)	functoolswraps)r!   r   r   r"   r   r#   _method_call  s    zProxy._method_call)r.   r/   r0   rk   r$   r   r   r   r"   r"   rq   r#   r      s   c                 C   s   | st ttt| S )zRaise ConnectionResetError from an empty read.

    Sometimes the socket raises an error itself, sometimes it gives no data.
    I haven't worked out when it behaves each way.
    )ConnectionResetErrorr   osstrerror)r\   r"   r"   r#   r`     s    r`   F       @rt   c              
      s   t j t jdt|  fdd}zR|j|  t|d}|D ]&}|j| |t|jd q@|jt	 W nR t j
k
r } z  td| d|W 5 d}~X Y n      Y nX d S )	z=Create a socket and authenticate ready to send D-Bus messages)familyc                    s    t  | | S r   )
settimeoutr8   )methr   r7   r;   r"   r#   with_sock_deadline(  s    z'prep_socket.<locals>.with_sock_deadline)r=   i   zDid not authenticate in z secondsN)rT   AF_UNIXr5   connectr   rX   feedr`   ra   r   r4   rE   rb   r   )addrr=   r4   r   ZauthrZreq_dataer"   r   r#   prep_socket   s$    
"
r   SESSION      ?c                 C   s$   t | }t|||d}t||}|S )a  Connect to a D-Bus message bus

    Pass ``enable_fds=True`` to allow sending & receiving file descriptors.
    An error will be raised if the bus does not allow this. For simplicity,
    it's advisable to leave this disabled unless you need it.

    D-Bus has an authentication step before sending or receiving messages.
    This takes < 1 ms in normal operation, but there is a timeout so that client
    code won't get stuck if the server doesn't reply. *auth_timeout* configures
    this timeout in seconds.
    r3   )r   r   r   )busr=   Zauth_timeoutZbus_addrr;   connr"   r"   r#   r   >  s    
__main__zUnique name:)Fr   )r   Fr   )7rk   rP   collectionsr   errnor   r   	itertoolsr   r   	selectorsr   r   rT   r1   typingr   Zjeepneyr   r	   r
   r   Zjeepney.authr   r   Zjeepney.busr   Zjeepney.fdsr   r   Zjeepney.wrappersr   r   Zjeepney.routingr   Zjeepney.bus_messagesr   commonr   r   r   __all__r   r5   r8   r9   r   r   r`   r   r   r.   r   printrC   r"   r"   r"   r#   <module>   sN   Cm(     
