
    @ia`                        d dl Z 	 d dlmZ d dlZd dlmZ d dlm	Z	m
Z
mZmZ dZ e j                  d      Zd dlmZmZmZmZmZ d dlmZ  G d	 d
      Z G d d      Z G d de      Z G d de      Zy# e$ r	 d dlmZ Y vw xY w)    N)RLock)process_introspection_data)DBusExceptionIntrospectionParserExceptionMissingErrorHandlerExceptionMissingReplyHandlerExceptionrestructuredtextzdbus.proxies)BUS_DAEMON_IFACEBUS_DAEMON_NAMEBUS_DAEMON_PATHINTROSPECTABLE_IFACE
LOCAL_PATH)is_py2c                   "    e Zd ZdZd Zd Zd Zy)_DeferredMethodzXA proxy method which will only get called once we have its
    introspection reply.
    c                 P    || _         |j                  | _        || _        || _        y N)_proxy_method_method_name_append_block)selfproxy_methodappendblocks       ./usr/lib/python3/dist-packages/dbus/proxies.py__init__z_DeferredMethod.__init__8   s&    )(55    c                     d|v s|j                  dd      r| j                  | j                  ||       y | j                           | j                  |i |S )Nreply_handlerignore_replyF)getr   r   r   r   argskeywordss      r   __call__z_DeferredMethod.__call__?   sT    x'LL/LL++T8< KKM%4%%t8x88r   c                 >    | j                  | j                  ||       y r   )r   r   r#   s      r   
call_asyncz_DeferredMethod.call_asyncJ   s    T''x8r   N__name__
__module____qualname____doc__r   r&   r(    r   r   r   r   4   s    	99r   r   c                   "    e Zd ZdZd Zd Zd Zy)_ProxyMethodzA proxy method.

    Typically a member of a ProxyObject. Calls to the
    method produce messages that travel over the Bus and are routed
    to a specific named Service.
    c                     |t         k(  rt        dt         z        || _        || _        || _        || _        t        j                  |       || _        |t        j                  |       || _
        y )Nz1Methods may not be called on the reserved path %s)r   r   _proxy_connection_named_service_object_path_dbus_bindingsvalidate_member_namer   validate_interface_name_dbus_interface)r   proxy
connectionbus_nameobject_pathmethod_nameifaces          r   r   z_ProxyMethod.__init__U   sw    *$ !*,6!7 8 8  %)'*++K8*2259$r   c           
         |j                  dd       }|j                  dd       }|j                  dd      }|j                  dd       }||%|
t               |
t               |rt        d      |j                  d| j                        }|G|| j
                  }n|dz   | j
                  z   }| j                  j                  j                  |d       }|s|C | j                  j                  | j                  | j                  || j
                  ||||fi | y  | j                  j                  | j                  | j                  || j
                  ||fi |S )	Nr    error_handlerr!   F	signaturez6ignore_reply and reply_handler cannot be used togetherdbus_interface.)popr   r   	TypeErrorr9   r   r2   _introspect_method_mapr"   r3   r(   r4   r5   call_blocking)	r   r$   r%   r    rA   r!   rB   rC   keys	            r   r&   z_ProxyMethod.__call__i   s|    _d; _d;||NE:LLd3	$(A$244&244 !0 1 1 "&68L8LM%''$s*T->->>::>>sDII=4'D''(;(;(,(9(9(6(,(9(9(1(,(5(54 +34 24##11$2E2E262C2C2@262C2C2;26> 5=> >r   c           
         |j                  dd       }|j                  dd       }|j                  dd       }|j                  d| j                        }|G|r|dz   | j                  z   }n| j                  }| j                  j                  j                  |d       } | j                  j                  | j                  | j                  || j                  ||||fi | y )Nr    rA   rB   rC   rD   )
rE   r9   r   r2   rG   r"   r3   r(   r4   r5   )r   r$   r%   r    rA   rB   rC   rI   s           r   r(   z_ProxyMethod.call_async   s     _d; _d;LLd3	!&68L8LM$s*T->->>''::>>sDII###D$7$7$($5$5$2$($5$5$-$($1$1	0 '/	0r   Nr)   r.   r   r   r0   r0   N   s    %(*>X0r   r0   c                       e Zd ZdZeZeZdZdZ	dZ
	 	 ddZ ed ddd      Z ed	 ddd
      Z ed ddd      ZddZd Zd Zd Zd Zd Zd Zd ZddZd ZeZy)ProxyObjectzA proxy to the remote Object.

    A ProxyObject is provided by the Bus. ProxyObjects
    have member functions, and can be called like normal Python objects.
    r         Nc                    |j                  dd      }|$|t        d      |}ddlm}  |dt        d       |j                  d	d      }	|	$|t        d
      |	}ddlm}  |dt        d       |r+t        ddj                  |j                               z        |r|j                          || _        |t        j                  |       |x| _        | _        t        j                  |       || _        |s|j                  |      | _        d| _        g | _        i | _        t'               | _        |r| j                  t*        k(  r| j,                  | _        y| j0                  | _        | j3                         | _        y)a  Initialize the proxy object.

        :Parameters:
            `conn` : `dbus.connection.Connection`
                The bus or connection on which to find this object.
                The keyword argument `bus` is a deprecated alias for this.
            `bus_name` : str
                A bus name for the application owning the object, to be used
                as the destination for method calls and the sender for
                signal matches. The keyword argument ``named_service`` is a
                deprecated alias for this.
            `object_path` : str
                The object path at which the application exports the object
            `introspect` : bool
                If true (default), attempt to introspect the remote
                object to find out supported methods and their signatures
            `follow_name_owner_changes` : bool
                If true (default is false) and the `bus_name` is a
                well-known name, follow ownership changes for that name
        busNz%conn and bus cannot both be specifiedr   )warnz`Passing the bus parameter to ProxyObject by name is deprecated: please use positional parametersrN   )
stacklevelnamed_servicez3bus_name and named_service cannot both be specifiedzjPassing the named_service parameter to ProxyObject by name is deprecated: please use positional parametersz>ProxyObject.__init__ does not take these keyword arguments: %sz, )rE   rF   warningsrQ   DeprecationWarningjoinkeys_require_main_loop_busr6   validate_bus_namer4   _requested_bus_namevalidate_object_path__dbus_object_path__activate_name_owner_pending_introspect_pending_introspect_queuerG   r   _introspect_lockr    INTROSPECT_STATE_DONT_INTROSPECT_introspect_state'INTROSPECT_STATE_INTROSPECT_IN_PROGRESS_Introspect)
r   connr<   r=   
introspectfollow_name_owner_changeskwargsrP   rQ   rS   s
             r   r   zProxyObject.__init__   s   , jj%? GHHD% @#3 

?D9$# !, - -$H% C#3  4"ii67 8 8 % ##%	,,X6 :BAd6++K8$/!("&":":8"DD $( )+&&(# !&T66*D%)%J%JD"%)%Q%QD"'+'7'7'9D$r   c                     | j                   S r   )r4   r   s    r   <lambda>zProxyObject.<lambda>  s    T%8%8 r   a  The bus name to which this proxy is bound. (Read-only,
            may change.)

            If the proxy was instantiated using a unique name, this property
            is that unique name.

            If the proxy was instantiated with a well-known name and with
            ``follow_name_owner_changes`` set false (the default), this
            property is the unique name of the connection that owned that
            well-known name when the proxy was instantiated, which might
            not actually own the requested well-known name any more.

            If the proxy was instantiated with a well-known name and with
            ``follow_name_owner_changes`` set true, this property is that
            well-known name.
            c                     | j                   S r   )r[   rk   s    r   rl   zProxyObject.<lambda>   s    t/G/G r   z[The bus name which was requested when this proxy was
            instantiated.
            c                     | j                   S r   )r]   rk   s    r   rl   zProxyObject.<lambda>&  s    (A(A r   zThe object-path of this proxy.c                 n     | j                   j                  |f||| j                  | j                  d|S )ax  Arrange for the given function to be called when the given signal
        is received.

        :Parameters:
            `signal_name` : str
                The name of the signal
            `handler_function` : callable
                A function to be called when the signal is emitted by
                the remote object. Its positional arguments will be the
                arguments of the signal; optionally, it may be given
                keyword arguments as described below.
            `dbus_interface` : str
                Optional interface with which to qualify the signal name.
                If None (the default) the handler will be called whenever a
                signal of the given member name is received, whatever
                its interface.
        :Keywords:
            `utf8_strings` : bool
                If True, the handler function will receive any string
                arguments as dbus.UTF8String objects (a subclass of str
                guaranteed to be UTF-8). If False (default) it will receive
                any string arguments as dbus.String objects (a subclass of
                unicode).
            `byte_arrays` : bool
                If True, the handler function will receive any byte-array
                arguments as dbus.ByteArray objects (a subclass of str).
                If False (default) it will receive any byte-array
                arguments as a dbus.Array of dbus.Byte (subclasses of:
                a list of ints).
            `sender_keyword` : str
                If not None (the default), the handler function will receive
                the unique name of the sending endpoint as a keyword
                argument with this name
            `destination_keyword` : str
                If not None (the default), the handler function will receive
                the bus name of the destination (or None if the signal is a
                broadcast, as is usual) as a keyword argument with this name.
            `interface_keyword` : str
                If not None (the default), the handler function will receive
                the signal interface as a keyword argument with this name.
            `member_keyword` : str
                If not None (the default), the handler function will receive
                the signal name as a keyword argument with this name.
            `path_keyword` : str
                If not None (the default), the handler function will receive
                the object-path of the sending object as a keyword argument
                with this name
            `message_keyword` : str
                If not None (the default), the handler function will receive
                the `dbus.lowlevel.SignalMessage` as a keyword argument with
                this name.
            `arg...` : unicode or UTF-8 str
                If there are additional keyword parameters of the form
                ``arg``\ *n*, match only signals where the *n*\ th argument
                is the value given for that keyword parameter. As of this time
                only string arguments can be matched (in particular,
                object paths and signatures can't).
        )signal_namerC   r<   path)rY   add_signal_receiverr4   r]   r   rp   handler_functionrC   r%   s        r   connect_to_signalzProxyObject.connect_to_signal2  sH    x 	&		%%&6 	22=5C/3/B/B+/+D+D		2
 )1	2	2r   c           
          i } | j                   j                  | j                  | j                  t        ddd| j
                  | j                  fddi|S )N
Introspect r.   require_main_loopF)rY   r(   r4   r]   r   _introspect_reply_handler_introspect_error_handler)r   ri   s     r   re   zProxyObject._Introspectu  sf    #tyy##D$7$7$($=$=$8,B$($B$B$($B$B	G
 7<G
 @FG 	Gr   c                 L    | j                   D ]  \  }}} ||i |  g | _         y r   )r`   )r   r   r$   r%   s       r   _introspect_execute_queuez%ProxyObject._introspect_execute_queue~  s5     /3.L.L 	,*\4$+(+	,)+&r   c                    | j                   j                          	 	 t        |      | _        | j                  | _        d | _	        | j                          | j                   j                          y # t        $ r5}| j                  |       Y d }~| j                   j                          y d }~ww xY w# | j                   j                          w xY wr   )ra   acquirer   rG   r   r{   release INTROSPECT_STATE_INTROSPECT_DONErc   r_   r}   )r   dataes      r   rz   z%ProxyObject._introspect_reply_handler  s    %%'	,.H.N+
 &*%J%JD"'+D$**,!!))+ 0 ..q1 !!))+ !!))+s.   A0 (B1 0	B.9B)
B1 )B..B1 1Cc                    t        j                          t        j                  d| j                  | j
                  |j                  j                  |j                  j                  |       | j                  j                          	 t        j                  d       | j                  | _        d | _        | j                          | j                  j!                          y # | j                  j!                          w xY w)Nz$Introspect error on %s:%s: %s.%s: %sz'Executing introspect queue due to error)loggingbasicConfig_loggererrorr4   r]   	__class__r+   r*   ra   r   debugrb   rc   r_   r}   r   )r   r   s     r   r{   z%ProxyObject._introspect_error_handler  s    <))4+D+Doo00%//2J2J	 	%%'	,MMCD%)%J%JD"'+D$**,!!))+D!!))+s   =C C:c                     | j                   j                          	 | j                  | j                  j                          | j                   j	                          y # | j                   j	                          w xY wr   )ra   r   r_   r   r   rk   s    r   _introspect_blockzProxyObject._introspect_block  s^    %%'	,''3((..0 !!))+D!!))+s   &A A9c                 ,   | j                   j                          	 | j                  | j                  k(  r| j                  j                  |||f       n ||i | | j                   j                          y # | j                   j                          w xY wr   )ra   r   rc   rd   r`   r   r   )r   callbackr$   ri   s       r   _introspect_add_to_queuez$ProxyObject._introspect_add_to_queue  s|    %%'	,%%)U)UU..55xv6NO $)&)!!))+D!!))+s   A A7 7Bc                 ~    |j                  d      r|j                  d      rt        |      | j                  |      S N__)
startswithendswithAttributeErrorget_dbus_methodr   members     r   __getattr__zProxyObject.__getattr__  s7    T"vt'< ((''//r   c                     | j                  | | j                  | j                  | j                  ||      }| j                  | j
                  k(  r'| j                  || j                  | j                        }|S )a,  Return a proxy method representing the given D-Bus method. The
        returned proxy method can be called in the usual way. For instance, ::

            proxy.get_dbus_method("Foo", dbus_interface='com.example.Bar')(123)

        is equivalent to::

            proxy.Foo(123, dbus_interface='com.example.Bar')

        or even::

            getattr(proxy, "Foo")(123, dbus_interface='com.example.Bar')

        However, using `get_dbus_method` is the only way to call D-Bus
        methods with certain awkward names - if the author of a service
        implements a method called ``connect_to_signal`` or even
        ``__getattr__``, you'll need to use `get_dbus_method` to call them.

        For services which follow the D-Bus convention of CamelCaseMethodNames
        this won't be a problem.
        )	ProxyMethodClassrY   r4   r]   rc   rd   DeferredMethodClassr   r   )r   r   rC   rets       r   r   zProxyObject.get_dbus_method  st    . ##D$))$($7$7$($=$=v$24 !!T%Q%QQ**30M0M+/+A+ACC 
r   c                 b    d| j                   | j                  | j                  t        |       fz  S )Nz&<ProxyObject wrapping %s %s %s at %#x>)rY   r4   r]   idrk   s    r   __repr__zProxyObject.__repr__  s4    7IIt**D,E,Er$x9Q Q 	Qr   )NNNTFr   )r*   r+   r,   r-   r0   r   r   r   rb   rd   r   r   propertyr<   requested_bus_namer=   ru   re   r}   rz   r{   r   r   r   r   r   __str__r.   r   r   rL   rL      s    
 $)'($./+'($=A<AQ:f 8$H$ ""G$ A$02KA2FG,,,,
,0$LQ Gr   rL   c                       e Zd ZdZd Z ed ddd      ZeZ ed ddd      Z ed ddd	      Z	 ed
 ddd      Z
 ed ddd      Z	 ddZd ZddZd ZeZy)	InterfacezAn interface into a remote object.

    An Interface can be used to wrap ProxyObjects
    so that calls can be routed to their correct
    D-Bus interface.
    c                 r    t        |t              r|j                  | _        || _        y|| _        || _        y)a:  Construct a proxy for the given interface on the given object.

        :Parameters:
            `object` : `dbus.proxies.ProxyObject` or `dbus.Interface`
                The remote object or another of its interfaces
            `dbus_interface` : str
                An interface the `object` implements
        N)
isinstancer   proxy_object_objr9   )r   objectrC   s      r   r   zInterface.__init__  s6     fi(++DI  . DI-r   c                 .    | j                   j                  S r   )r   r=   rk   s    r   rl   zInterface.<lambda>  s    )>)> r   Nz.The D-Bus object path of the underlying objectc                 .    | j                   j                  S r   )r   r<   rk   s    r   rl   zInterface.<lambda>  s    dii&8&8 r   z:The bus name to which the underlying proxy object is boundc                 .    | j                   j                  S r   )r   r   rk   s    r   rl   zInterface.<lambda>	  s    		0L0L r   zGThe bus name which was requested when the underlying object was createdc                     | j                   S r   )r   rk   s    r   rl   zInterface.<lambda>  s
    $)) r   zThe underlying proxy objectc                     | j                   S r   )r9   rk   s    r   rl   zInterface.<lambda>  s    D,@,@ r   zThe D-Bus interface representedc                 \    |s| j                   } | j                  j                  |||fi |S )aa  Arrange for a function to be called when the given signal is
        emitted.

        The parameters and keyword arguments are the same as for
        `dbus.proxies.ProxyObject.connect_to_signal`, except that if
        `dbus_interface` is None (the default), the D-Bus interface that
        was passed to the `Interface` constructor is used.
        )r9   r   ru   rs   s        r   ru   zInterface.connect_to_signal  s>     !11N*tyy**;8H+9G=EG 	Gr   c                     |j                  d      r|j                  d      rt        |      | j                  j	                  || j
                        S r   )r   r   r   r   r   r9   r   s     r   r   zInterface.__getattr__"  sC    T"vt'< ((99,,VT5I5IJJr   c                 V    || j                   }| j                  j                  ||      S )a&  Return a proxy method representing the given D-Bus method.

        This is the same as `dbus.proxies.ProxyObject.get_dbus_method`
        except that if `dbus_interface` is None (the default),
        the D-Bus interface that was passed to the `Interface` constructor
        is used.
        )r9   r   r   )r   r   rC   s      r   r   zInterface.get_dbus_method(  s,     !!11Nyy((@@r   c                 L    d| j                   | j                  t        |       fz  S )Nz%<Interface %r implementing %r at %#x>)r   r9   r   rk   s    r   r   zInterface.__repr__4  s)    6		4''D83 3 	3r   r   )r*   r+   r,   r-   r   r   r=   r]   r<   r   r   rC   ru   r   r   r   r   r.   r   r   r   r     s    . >dLNK&8$$%H "#L#'$CD 3T4>@L@$DFN *.G K
A3 Gr   r   )r   	threadingr   ImportErrordummy_threadingr6   dbus._expat_introspect_parserr   dbus.exceptionsr   r   r   r   __docformat__	getLoggerr   r
   r   r   r   r   dbus._compatr   r   r0   r   rL   r   r.   r   r   <module>r      s   8 &  D" " # '

N
+   9 94]0 ]0@{& {|	K KY  &%&s   A5 5BB