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_serviceú3bus_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 )zêGet 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 )z‰Return 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‰   )z�Return 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 )z²Return 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 )z»Return 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
ÿý
+