o
    t3b(F                     @   s   d Z dZddlZddlZddlmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z# d	eeef Z$	 d
Z%e&dZ'G dd de(Z)G dd deZ*dS ))BusConnectionreStructuredText    N)BUS_DAEMON_IFACEBUS_DAEMON_NAMEBUS_DAEMON_PATHBUS_SESSIONBUS_STARTER
BUS_SYSTEM DBUS_START_REPLY_ALREADY_RUNNINGDBUS_START_REPLY_SUCCESSNAME_FLAG_ALLOW_REPLACEMENTNAME_FLAG_DO_NOT_QUEUENAME_FLAG_REPLACE_EXISTINGRELEASE_NAME_REPLY_NON_EXISTENTRELEASE_NAME_REPLY_NOT_OWNERRELEASE_NAME_REPLY_RELEASED REQUEST_NAME_REPLY_ALREADY_OWNERREQUEST_NAME_REPLY_EXISTSREQUEST_NAME_REPLY_IN_QUEUE REQUEST_NAME_REPLY_PRIMARY_OWNERvalidate_bus_namevalidate_error_namevalidate_interface_namevalidate_member_namevalidate_object_path)
Connection)DBusException)HANDLER_RESULT_NOT_YET_HANDLED)is_py2zWtype='signal',sender='%s',interface='%s',member='NameOwnerChanged',path='%s',arg0='%%s'z)org.freedesktop.DBus.Error.NameHasNoOwnerzdbus.busc                   @   s    e Zd ZdZdd Zdd ZdS )NameOwnerWatch)_match_pending_callc              	      sr   t   fdd} fdd}|j|dttt d| _i }tr%d|d< |jtttd	d
 f|fi || _d S )Nc                    s    | d S N )owned	old_owner	new_owner)callbackr#   */usr/lib/python3/dist-packages/dbus/bus.py	signal_cbB   s   z*NameOwnerWatch.__init__.<locals>.signal_cbc                    s<   |   tkrd d S t  tjd | j| d fd d S )N zGetNameOwner(%s) failed:)exc_info)get_dbus_name_NAME_HAS_NO_OWNERloggingbasicConfig_loggerdebug	__class__)ebus_namer'   r#   r(   error_cbE   s   

z)NameOwnerWatch.__init__.<locals>.error_cbNameOwnerChanged)arg0Tutf8_stringsGetNameOwners)	r   add_signal_receiverr   r   r   r    r   
call_asyncr!   )selfbus_connr5   r'   r)   r6   keywordsr#   r4   r(   __init__?   s,   zNameOwnerWatch.__init__c                 C   s8   | j d ur
| j   | jd ur| j  d | _ d | _d S r"   )r    remover!   cancel)r>   r#   r#   r(   rC   ^   s   




zNameOwnerWatch.cancelN)__name__
__module____qualname__	__slots__rA   rC   r#   r#   r#   r(   r   <   s    r   c                       s   e Zd ZdZeZ	 eZ	 eZ		 e
ZeZedfddZ			d* fdd	Zdd Zd	d
 Z		d+ddZdd Zd,ddZd,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(d) Z  Z S )-r   zxA connection to a D-Bus daemon that implements the
    ``org.freedesktop.DBus`` pseudo-service.

    :Since: 0.81.0
    Nc                 C   s$   | j ||d}t |_i |_	 |S )N)mainloop)_new_for_busweakrefWeakValueDictionary
_bus_names_signal_sender_matches)clsaddress_or_typerH   busr#   r#   r(   __new__{   s
   
zBusConnection.__new__c                    s   | dd }|d ur!|d urtd|}ddlm} |dtdd tt| j|||||fi | |d urV|tkrV|d d d	krH fd
d}	n j	}	| 
||	}
|
| j < | t   S )Nnamed_service3bus_name and named_service cannot both be specifiedr   warnzrPassing the named_service parameter to add_signal_receiver by name is deprecated: please use positional parameters   
stacklevel   :c                    s   | dkr
    d S d S )Nr*   )rB   )r&   matchr#   r(   r'      s   z3BusConnection.add_signal_receiver.<locals>.callback)pop	TypeErrorwarningsrU   DeprecationWarningsuperr   r<   r   set_sender_name_ownerwatch_name_ownerrM   add_match_stringstr)r>   handler_functionsignal_namedbus_interfacer5   pathr@   rR   rU   r'   watchr2   r[   r(   r<      s.   

z!BusConnection.add_signal_receiverc                 C   s4   |  t| | j|d }|d ur|  d S d S r"   ) remove_match_string_non_blockingre   rM   r]   rC   )r>   r\   rj   r#   r#   r(   _clean_up_signal_match   s
   z$BusConnection._clean_up_signal_matchc              
   C   sx   |d ur:|d d dkr:|t kr:z| |W S  ty9 } z| tkr% | | | |W  Y d }~S d }~ww |S )NrY   rZ   )r   get_name_ownerr   r,   r-   start_service_by_name)r>   r5   r3   r#   r#   r(   activate_name_owner   s   
z!BusConnection.activate_name_ownerTFc                 K   s|   |r|    |dd}|dur'|durtdddlm} |dtdd |}|r4td	d
|  | j| ||||dS )aJ  Return a local proxy for the given remote object.

        Method calls on the proxy are translated into method calls on the
        remote object.

        :Parameters:
            `bus_name` : str
                A bus name (either the unique name or a well-known name)
                of the application owning the object. The keyword argument
                named_service is a deprecated alias for this.
            `object_path` : str
                The object path of the desired 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 the object path is a well-known name and this parameter
                is false (default), resolve the well-known name to the unique
                name of its current owner and bind to that instead; if the
                ownership of the well-known name changes in future,
                keep communicating with the original owner.
                This is necessary if the D-Bus API used is stateful.

                If the object path is a well-known name and this parameter
                is true, whenever the well-known name changes ownership in
                future, bind to the new owner, if any.

                If the given object path is a unique name, this parameter
                has no effect.

        :Returns: a `dbus.proxies.ProxyObject`
        :Raises `DBusException`: if resolving the well-known name to a
            unique name fails
        rR   NrS   r   rT   ziPassing the named_service parameter to get_object by name is deprecated: please use positional parametersrV   rW   z4get_object does not take these keyword arguments: %sz, )
introspectfollow_name_owner_changes)	_require_main_loopr]   r^   r_   rU   r`   joinkeysProxyObjectClass)r>   r5   object_pathrq   rr   kwargsrR   rU   r#   r#   r(   
get_object   s&   $
zBusConnection.get_objectc                 C   s   t | | tttdd|fS )zGet the numeric uid of the process owning the given bus name.

        :Parameters:
            `bus_name` : str
                A bus name, either unique or well-known
        :Returns: a `dbus.UInt32`
        :Since: 0.80.0
        GetConnectionUnixUserr;   r   call_blockingr   r   r   r>   r5   r#   r#   r(   get_unix_user   s
   	zBusConnection.get_unix_userr   c              
   C   s$   t | d| tttdd||ffS )a?  Start a service which will implement the given bus name on this Bus.

        :Parameters:
            `bus_name` : str
                The well-known bus name to be activated.
            `flags` : dbus.UInt32
                Flags to pass to StartServiceByName (currently none are
                defined)

        :Returns: A tuple of 2 elements. The first is always True, the
            second is either START_REPLY_SUCCESS or
            START_REPLY_ALREADY_RUNNING.

        :Raises `DBusException`: if the service could not be started.
        :Since: 0.80.0
        TStartServiceByNamesur{   )r>   r5   flagsr#   r#   r(   ro     s   
z#BusConnection.start_service_by_namec              	   C   s$   t |dd | tttdd||fS )a  Request a bus name.

        :Parameters:
            `name` : str
                The well-known name to be requested
            `flags` : dbus.UInt32
                A bitwise-OR of 0 or more of the flags
                `NAME_FLAG_ALLOW_REPLACEMENT`,
                `NAME_FLAG_REPLACE_EXISTING`
                and `NAME_FLAG_DO_NOT_QUEUE`
        :Returns: `REQUEST_NAME_REPLY_PRIMARY_OWNER`,
            `REQUEST_NAME_REPLY_IN_QUEUE`,
            `REQUEST_NAME_REPLY_EXISTS` or
            `REQUEST_NAME_REPLY_ALREADY_OWNER`
        :Raises `DBusException`: if the bus daemon cannot be contacted or
            returns an error.
        Fallow_uniqueRequestNamer   r{   )r>   namer   r#   r#   r(   request_name  s
   zBusConnection.request_namec                 C   s"   t |dd | tttdd|fS )as  Release a bus name.

        :Parameters:
            `name` : str
                The well-known name to be released
        :Returns: `RELEASE_NAME_REPLY_RELEASED`,
            `RELEASE_NAME_REPLY_NON_EXISTENT`
            or `RELEASE_NAME_REPLY_NOT_OWNER`
        :Raises `DBusException`: if the bus daemon cannot be contacted or
            returns an error.
        Fr   ReleaseNamer;   r{   )r>   r   r#   r#   r(   release_name3  s
   zBusConnection.release_namec                 C   ,   i }t rd|d< | jtttdddfi |S )zReturn a list of all currently-owned names on the bus.

        :Returns: a dbus.Array of dbus.UTF8String
        :Since: 0.81.0
        Tr9   	ListNamesr*   r#   r   r|   r   r   r   r>   r@   r#   r#   r(   
list_namesD     zBusConnection.list_namesc                 C   r   )zReturn a list of all names that can be activated on the bus.

        :Returns: a dbus.Array of dbus.UTF8String
        :Since: 0.81.0
        Tr9   ListActivatableNamesr*   r#   r   r   r#   r#   r(   list_activatable_namesQ  r   z$BusConnection.list_activatable_namesc                 C   s:   i }t rd|d< t|dd | jtttdd|ffi |S )zReturn the unique connection name of the primary owner of the
        given name.

        :Raises `DBusException`: if the `bus_name` has no owner
        :Since: 0.81.0
        Tr9   Fr   r:   r;   )r   r   r|   r   r   r   )r>   r5   r@   r#   r#   r(   rn   ^  s   zBusConnection.get_name_ownerc                 C   s   t | ||S )a  Watch the unique connection name of the primary owner of the
        given name.

        `callback` will be called with one argument, which is either the
        unique connection name, or the empty string (meaning the name is
        not owned).

        :Since: 0.81.0
        )r   )r>   r5   r'   r#   r#   r(   rc   m  s   
zBusConnection.watch_name_ownerc              	   C   s   t | tttdd|fS )zReturn True iff the given bus name has an owner on this bus.

        :Parameters:
            `bus_name` : str
                The bus name to look up
        :Returns: a `bool`
        NameHasOwnerr;   )boolr|   r   r   r   r}   r#   r#   r(   name_has_ownery  s   
zBusConnection.name_has_ownerc                 C      |  tttdd|f dS )  Arrange for this application to receive messages on the bus that
        match the given rule. This version will block.

        :Parameters:
            `rule` : str
                The match rule
        :Raises `DBusException`: on error.
        :Since: 0.80.0
        AddMatchr;   Nr|   r   r   r   r>   ruler#   r#   r(   rd        

zBusConnection.add_match_stringc              
   C      |  tttdd|fdd dS )=  Arrange for this application to receive messages on the bus that
        match the given rule. This version will not block, but any errors
        will be ignored.


        :Parameters:
            `rule` : str
                The match rule
        :Raises `DBusException`: on error.
        :Since: 0.80.0
        r   r;   Nr=   r   r   r   r   r#   r#   r(   add_match_string_non_blocking     
z+BusConnection.add_match_string_non_blockingc                 C   r   )r   RemoveMatchr;   Nr   r   r#   r#   r(   remove_match_string  r   z!BusConnection.remove_match_stringc              
   C   r   )r   r   r;   Nr   r   r#   r#   r(   rl     r   z.BusConnection.remove_match_string_non_blocking)NNNN)TF)r   )!rD   rE   rF   __doc__r   TYPE_SESSIONr	   TYPE_SYSTEMr   TYPE_STARTERr   START_REPLY_SUCCESSr
   START_REPLY_ALREADY_RUNNINGrQ   r<   rm   rp   ry   r~   ro   r   r   r   r   rn   rc   r   rd   r   r   rl   __classcell__r#   r#   rk   r(   r   g   sB     
9

r   )+__all____docformat__r.   rJ   _dbus_bindingsr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   dbus.connectionr   dbus.exceptionsr   dbus.lowlevelr   dbus._compatr   _NAME_OWNER_CHANGE_MATCHr-   	getLoggerr0   objectr   r   r#   r#   r#   r(   <module>   s&   d

+