o
    •ºé`¯J  ã                   @   s  d dl mZ d dlmZmZmZ d dlZd dlmZ G dd„ de	ƒZ
G dd„ deƒZejejd	œZG d
d„ deƒZG dd„ deƒZG dd„ deƒZdd„ ZG dd„ dƒZG dd„ deƒZG dd„ deƒZeddƒeddƒeddƒeƒ eddƒeddƒed d!ƒed d"ƒed d#ƒeƒ d$œ
ZG d%d&„ d&ƒZe eed' ƒeed' ƒeed( ƒd)œ¡ G d*d+„ d+ƒZG d,d-„ d-eƒZG d.d/„ d/ƒZG d0d1„ d1ƒZd2d3„ Zd4d5„ Zeeed( eƒ gƒƒZd6d7„ Z d8d9d9d9d'd9d9d:d'd;œ	Z!d<d=„ Z"G d>d?„ d?ƒZ#G d@dA„ dAƒZ$G dBdC„ dCƒZ%G dDdE„ dEƒZ&dS )Fé    )Údeque)ÚEnumÚIntEnumÚIntFlagN)ÚOptionalc                   @   s   e Zd ZdZdS )ÚSizeLimitErrorz¥Raised when trying to (de-)serialise data exceeding D-Bus' size limit.

    This is currently only implemented for arrays, where the maximum size is
    64 MiB.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   ú3/usr/lib/python3/dist-packages/jeepney/low_level.pyr      s    r   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )Ú
Endiannessé   é   c                 C   ó   | t ju rdS dS )Nú<ú>©r   Úlittle©Úselfr   r   r   Ústruct_code   ó   zEndianness.struct_codec                 C   r   )Nó   ló   Br   r   r   r   r   Ú	dbus_code   r   zEndianness.dbus_codeN)r   r	   r
   r   Úbigr   r   r   r   r   r   r      s
    r   )r   r   c                   @   s   e Zd ZdZdZdZdZdS )ÚMessageTyper   r   é   é   N)r   r	   r
   Úmethod_callÚmethod_returnÚerrorÚsignalr   r   r   r   r      s
    r   c                   @   s   e Zd ZdZdZdZdS )ÚMessageFlagr   r   r    N)r   r	   r
   Úno_reply_expectedÚno_auto_startÚallow_interactive_authorizationr   r   r   r   r%   #   s    r%   c                   @   s0   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )ÚHeaderFieldsr   r   r   r    é   é   é   é   é	   N)r   r	   r
   ÚpathÚ	interfaceÚmemberÚ
error_nameÚreply_serialÚdestinationÚsenderÚ	signatureÚunix_fdsr   r   r   r   r)   )   s    r)   c                 C   s   || |  }||krdS |S ©Nr   r   )ÚposÚstepÚpadr   r   r   Úpadding5   s   r<   c                   @   s8   e Zd Zdd„ Zddd„Zddd„Zd	d
„ Zdd„ ZdS )Ú	FixedTypec                 C   s   | | _ | _|| _d S ©N)ÚsizeÚ	alignmentr   )r   r?   r   r   r   r   Ú__init__=   s   
zFixedType.__init__r   c                 C   sJ   |t || jƒ7 }| ¡ | j }t ||||| j … ¡d }||| j fS r8   )r<   r@   r   ÚstructÚunpackr?   )r   Úbufr9   Ú
endiannessÚfdsÚcodeÚvalr   r   r   Ú
parse_dataA   s   zFixedType.parse_dataNc                 C   s.   dt || jƒ }| ¡ | j }|t ||¡ S )Nó    )r<   r@   r   rB   Úpack)r   Údatar9   rE   rF   r;   rG   r   r   r   Ú	serialiseG   s   zFixedType.serialisec                 C   s   d  | j| j¡S )NzFixedType({!r}, {!r}))Úformatr?   r   r   r   r   r   Ú__repr__L   s   zFixedType.__repr__c                 C   s$   t |ƒtu o| j|jko| j|jkS r>   )Útyper=   r?   r   ©r   Úotherr   r   r   Ú__eq__O   s   
ÿzFixedType.__eq__©r   r>   )r   r	   r
   rA   rI   rM   rO   rS   r   r   r   r   r=   <   s    

r=   c                       s:   e Zd Z‡ fdd„Zd
‡ fdd„	Zdd„ Zdd	„ Z‡  ZS )ÚBooleanc                    ó   t ƒ  dd¡ d S ©Nr    ÚI©ÚsuperrA   r   ©Ú	__class__r   r   rA   U   r   zBoolean.__init__r   c                    s    t ƒ  |||¡\}}t|ƒ|fS r>   )rZ   rI   Úbool)r   rD   r9   rE   rF   rH   Únew_posr[   r   r   rI   X   ó   zBoolean.parse_datac                 C   ó   dS )Nz	Boolean()r   r   r   r   r   rO   \   ó   zBoolean.__repr__c                 C   ó   t |ƒtu S r>   )rP   rU   rQ   r   r   r   rS   _   ó   zBoolean.__eq__rT   )r   r	   r
   rA   rI   rO   rS   Ú__classcell__r   r   r[   r   rU   T   s
    rU   c                       sH   e Zd Z‡ fdd„Zd‡ fdd„	Zd‡ fdd„	Zd	d
„ Zdd„ Z‡  ZS )ÚFileDescriptorc                    rV   rW   rY   r   r[   r   r   rA   d   r   zFileDescriptor.__init__r   c                    s    t ƒ  |||¡\}}|| |fS r>   )rZ   rI   )r   rD   r9   rE   rF   Úidxr^   r[   r   r   rI   g   r_   zFileDescriptor.parse_dataNc                    sx   |d u rt dƒ‚t|dƒr| ¡ }t|tƒst|tƒstdƒ‚|dk r+td|› d�ƒ‚| |¡ t	ƒ  
t|ƒd ||¡S )Nz+Sending FDs is not supported or not enabledÚfilenozYCannot use {data!r} as file descriptor. Expected an int or an object with fileno() methodr   z#File descriptor can't be negative (ú)r   )ÚRuntimeErrorÚhasattrrg   Ú
isinstancer]   ÚintÚ	TypeErrorÚ
ValueErrorÚappendrZ   rM   Úlen)r   rL   r9   rE   rF   r[   r   r   rM   k   s   

zFileDescriptor.serialisec                 C   r`   )NzFileDescriptor()r   r   r   r   r   rO   {   ra   zFileDescriptor.__repr__c                 C   rb   r>   )rP   re   rQ   r   r   r   rS   ~   rc   zFileDescriptor.__eq__rT   r>   )	r   r	   r
   rA   rI   rM   rO   rS   rd   r   r   r[   r   re   c   s    re   r   ÚBr   ÚhÚHr    ÚirX   r-   ÚqÚQÚd)
ÚyÚnru   Úbrt   ÚuÚxÚtrw   rr   c                   @   sD   e Zd Zdd„ Zedd„ ƒZddd„Zdd	d
„Zdd„ Zdd„ Z	dS )Ú
StringTypec                 C   ó
   || _ d S r>   )Úlength_type)r   r€   r   r   r   rA   ‘   ó   
zStringType.__init__c                 C   s   | j jS r>   )r€   r?   r   r   r   r   r@   ”   s   zStringType.alignmentr   c                 C   sR   | j  |||¡\}}|| }|||…  d¡}|||d … dks#J ‚||d fS )Núutf-8r   rJ   )r€   rI   Údecode)r   rD   r9   rE   rF   ÚlengthÚendrH   r   r   r   rI   ˜   s
   zStringType.parse_dataNc                 C   sB   t |tƒstd |¡ƒ‚| d¡}| j t|ƒ||¡}|| d S )NzExpected str, not {!r}r‚   rJ   )rk   Ústrrm   rN   Úencoder€   rM   rp   )r   rL   r9   rE   rF   ÚencodedÚlen_datar   r   r   rM   Ÿ   s
   

zStringType.serialisec                 C   ó   d  | j¡S )NzStringType({!r}))rN   r€   r   r   r   r   rO   ¦   rc   zStringType.__repr__c                 C   ó   t |ƒtu o| j|jkS r>   )rP   r~   r€   rQ   r   r   r   rS   ©   s   
ÿzStringType.__eq__rT   r>   )
r   r	   r
   rA   Úpropertyr@   rI   rM   rO   rS   r   r   r   r   r~   �   s    


r~   r{   rx   )ÚsÚoÚgc                   @   s<   e Zd ZdZdd„ Zddd„Zddd	„Zd
d„ Zdd„ ZdS )ÚStructr-   c                 C   s$   t dd„ |D ƒƒrtdƒ‚|| _d S )Nc                 s   s   � | ]}t |tƒV  qd S r>   )rk   Ú	DictEntry)Ú.0Úfr   r   r   Ú	<genexpr>¹   s   € z"Struct.__init__.<locals>.<genexpr>zFound dict entry outside array)Úanyrm   Úfields©r   r–   r   r   r   rA   ¸   s   
zStruct.__init__r   c                 C   sJ   |t |dƒ7 }g }| jD ]}|j||||d�\}}| |¡ qt|ƒ|fS )Nr-   ©rF   )r<   r–   rI   ro   Útuple)r   rD   r9   rE   rF   ÚresÚfieldÚvr   r   r   rI   ½   s   
zStruct.parse_dataNc           	   	   C   s°   t |tƒstd |¡ƒ‚t|ƒt| jƒkr"td t|ƒt| jƒ¡ƒ‚dt|| jƒ }|t|ƒ7 }g }t	|| jƒD ]\}}| 
|j||||d�¡ |t|d ƒ7 }q8|d |¡ S )NzExpected tuple, not {!r}z{} entries for {} fieldsrJ   r˜   éÿÿÿÿó    )rk   r™   rm   rN   rp   r–   rn   r<   r@   Úzipro   rM   Újoin)	r   rL   r9   rE   rF   r;   Ú
res_piecesÚitemr›   r   r   r   rM   Å   s   
ÿzStruct.serialisec                 C   s   d  t| ƒj| j¡S )Nz{}({!r}))rN   rP   r   r–   r   r   r   r   rO   Ô   s   zStruct.__repr__c                 C   s   t |ƒt | ƒu o| j|jkS r>   )rP   r–   rQ   r   r   r   rS   ×   s   zStruct.__eq__rT   r>   )	r   r	   r
   r@   rA   rI   rM   rO   rS   r   r   r   r   r�   µ   s    

r�   c                       s   e Zd Z‡ fdd„Z‡  ZS )r‘   c                    sT   t |ƒdkrtdt |ƒ ƒ‚t|d ttfƒs"td t|d ƒ¡ƒ‚tƒ  |¡ d S )Nr   z%Dict entry must have 2 fields, not %dr   z5First field in dict entry must be simple type, not {})	rp   rm   rk   r=   r~   rN   rP   rZ   rA   r—   r[   r   r   rA   Ü   s   
ÿþzDictEntry.__init__)r   r	   r
   rA   rd   r   r   r[   r   r‘   Û   s    r‘   c                   @   sF   e Zd ZdZeddƒZdd„ Zddd„Zdd	d
„Zdd„ Z	dd„ Z
dS )ÚArrayr    rX   c                 C   r   r>   )Úelt_type)r   r¤   r   r   r   rA   ê   r�   zArray.__init__r   c           	      C   sž   | j  |||¡\}}|t|| jjƒ7 }|| }| jtd kr&|||… |fS g }||k rA| jj||||d�\}}| |¡ ||k s,t| jtƒrKt	|ƒ}||fS )Nrx   r˜   )
r€   rI   r<   r¤   r@   Úsimple_typesro   rk   r‘   Údict)	r   rD   r9   rE   rF   r„   r…   rš   rœ   r   r   r   rI   í   s   
ýzArray.parse_dataNc              	   C   sD  d}t | jtƒrt |tƒr| ¡ }n| jtd kr!t |tƒr!d}nt |tƒs-td 	|¡ƒ‚t | jt
ƒrA| jjt|ƒ dkrAtdƒ‚t|| jƒ}|| d }t|| jjƒ}|rY|}	n1|| }
|
d }g }|D ]}| | jj||
||d�¡ |
t|d	 ƒ7 }
|
|kr„tdƒ‚qed
 |¡}	| j t|	ƒ|| |¡}d| | d|  |	 S )NFrx   TzNot suitable for array: {!r}i   zArray size exceeds 64 MiB limitr    r˜   r�   rž   rJ   )rk   r¤   r‘   r¦   Úitemsr¥   ÚbytesÚlistrm   rN   r=   r?   rp   r   r<   r@   ro   rM   r    r€   )r   rL   r9   rE   rF   Údata_is_bytesÚpad1Úpos_after_lengthÚpad2rD   Údata_posÚ	limit_posÚchunksr¢   r‰   r   r   r   rM   ÿ   s:   


ÿÿ
zArray.serialisec                 C   rŠ   )NzArray({!r}))rN   r¤   r   r   r   r   rO   %  rc   zArray.__repr__c                 C   r‹   r>   )rP   r£   r¤   rQ   r   r   r   rS   (  ó   zArray.__eq__rT   r>   )r   r	   r
   r@   r=   r€   rA   rI   rM   rO   rS   r   r   r   r   r£   æ   s    


&r£   c                   @   s4   e Zd ZdZddd„Zddd„Zdd	„ Zd
d„ ZdS )ÚVariantr   r   c                 C   sD   t d  |||¡\}}tt|ƒƒ}|j||||d�\}}||f|fS ©Nr�   r˜   )r¥   rI   Úparse_signaturer©   )r   rD   r9   rE   rF   ÚsigÚvaltyperH   r   r   r   rI   /  s   zVariant.parse_dataNc                 C   sD   |\}}t t|ƒƒ}td  |||¡}||j||t|ƒ ||d� S r³   )r´   r©   r¥   rM   rp   )r   rL   r9   rE   rF   rµ   r¶   Úsig_bufr   r   r   rM   8  s   ÿzVariant.serialisec                 C   r`   )Nz	Variant()r   r   r   r   r   rO   @  ra   zVariant.__repr__c                 C   rb   r>   )rP   r²   rQ   r   r   r   rS   C  rc   zVariant.__eq__rT   r>   )r   r	   r
   r@   rI   rM   rO   rS   r   r   r   r   r²   ,  s    

	r²   c                 C   sÌ   |   d¡}|dkrtt| ƒƒS |dkrtƒ S |dkr8g }| d dkr/| t| ƒ¡ | d dks"|   d¡ t|ƒS |dkrZg }| d dkrQ| t| ƒ¡ | d dksD|   d¡ t|ƒS |dv rbtd	ƒ‚t| S )
z-Parse a symbolic signature into objects.
    r   Úarœ   ú(rh   ú{ú}z)}zUnexpected end of struct)	Úpopr£   r´   r²   ro   r�   r‘   rn   r¥   )rµ   Útokenr–   Úder   r   r   r´   F  s,   
ÿ
ÿ
r´   c                 C   st   t  d| d d… ¡\}t| }t  | ¡ d | dd… ¡\}t  | ¡ d | dd… ¡\}d| }|t|dƒ | S )NÚcr   rX   r    r-   é   é   )rB   rC   Ú
endian_mapr   r<   )rD   ÚendianÚbody_lengthÚfields_array_lenÚ
header_lenr   r   r   Úcalc_msg_sizea  s   rÇ   c                 C   s$   t  | d|¡\}}dd„ |D ƒ|fS )NrÀ   c                 S   s   i | ]\}}t |ƒ|d  “qS )r   )r)   )r’   Úkrœ   r   r   r   Ú
<dictcomp>o  s    z'parse_header_fields.<locals>.<dictcomp>)Ú_header_fields_typerI   )rD   rE   Úlr9   r   r   r   Úparse_header_fieldsm  s   rÌ   rŽ   r�   r�   )	r   r   r   r    r*   r+   r,   r-   r.   c                 C   s$   dd„ t |  ¡ ƒD ƒ}t |d|¡S )Nc                 S   s"   g | ]\}}|j t| |ff‘qS r   )ÚvalueÚheader_field_codes)r’   rt   rœ   r   r   r   Ú
<listcomp>€  s   " z+serialise_header_fields.<locals>.<listcomp>rÀ   )Úsortedr§   rÊ   rM   )rw   rE   rË   r   r   r   Úserialise_header_fields  s   rÑ   c                   @   s2   e Zd Zdd„ Zdd„ Zd
dd„Zedd	„ ƒZdS )ÚHeaderc                 C   s6   || _ t|ƒ| _t|ƒ| _|| _|| _|| _|| _dS )z˜A D-Bus message header

        It's not normally necessary to construct this directly: use higher level
        functions and methods instead.
        N)	rE   r   Úmessage_typer%   ÚflagsÚprotocol_versionrÄ   Úserialr–   )r   rE   rÓ   rÔ   rÕ   rÄ   rÖ   r–   r   r   r   rA   …  s   


zHeader.__init__c              	   C   s$   d  | j| j| j| j| j| j| j¡S )Nz7Header({!r}, {!r}, {!r}, {!r}, {!r}, {!r}, fields={!r}))rN   rE   rÓ   rÔ   rÕ   rÄ   rÖ   r–   r   r   r   r   rO   ”  s   þzHeader.__repr__Nc              	   C   sP   | j  ¡ d }|d u r| j}t || j  ¡ | jj| j| j	| j
|¡t| j| j ƒ S )NÚcBBBII)rE   r   rÖ   rB   rK   r   rÓ   rÍ   rÔ   rÕ   rÄ   rÑ   r–   )r   rÖ   r�   r   r   r   rM   ™  s   
ýüzHeader.serialisec           
      C   sj   t  d|d d… ¡\}}}}t| }t  | ¡ d |dd… ¡\}}t||ƒ\}}	| |||||||ƒ|	fS )NÚcBBBr    ÚIIrÀ   )rB   rC   rÂ   r   rÌ   )
ÚclsrD   rÃ   ÚmsgtyperÔ   ÚpvÚbodylenrÖ   r–   r9   r   r   r   Úfrom_buffer£  s
    zHeader.from_bufferr>   )r   r	   r
   rA   rO   rM   ÚclassmethodrÞ   r   r   r   r   rÒ   „  s    

rÒ   c                   @   sH   e Zd ZdZdd„ Zdd„ Zeddedd fd	d
„ƒZddefdd„Z	dS )ÚMessagez™Object representing a DBus message.

    It's not normally necessary to construct this directly: use higher level
    functions and methods instead.
    c                 C   s   || _ || _d S r>   )ÚheaderÚbody)r   rá   râ   r   r   r   rA   ²  s   
zMessage.__init__c                 C   s   d  t| ƒj| j| j¡S )Nz{}({!r}, {!r}))rN   rP   r   rá   râ   r   r   r   r   rO   ¶  r±   zMessage.__repr__r   rD   Úreturnc           	      C   sž   t  |¡\}}|j tjd¡}|t|ƒkr"td|› dt|ƒ› d�ƒ‚|d |… }d}tj|jv rJ|jtj }t	t
d| ƒƒ}|j|||j|d�d }t||ƒS )Nr   zMessage expects z FDs, but only z were receivedr   ú(%s)r˜   )rÒ   rÞ   r–   Úgetr)   r7   rp   rn   r6   r´   r©   rI   rE   rà   )	rÚ   rD   rF   rá   r9   Ún_fdsrâ   rµ   Ú	body_typer   r   r   rÞ   ¹  s   ÿ
zMessage.from_bufferNc           	      C   sœ   | j j}tj| j jv r%| j jtj }ttd| ƒƒ}|j| jd||d�}nd}t	|ƒ| j _
|r8t	|ƒ| j jtj< | j j|d�}dtt	|ƒdƒ }|| | S )aÔ  Convert this message to bytes.

        Specifying *serial* overrides the ``msg.header.serial`` field, so a
        connection can use its own serial number without modifying the message.

        If file-descriptor support is in use, *fds* should be a
        :class:`array.array` object with type ``'i'``. Any file descriptors in
        the message will be added to the array. If the message contains FDs,
        it can't be serialised without this array.
        rä   r   r˜   rž   )rÖ   rJ   r-   )rá   rE   r)   r6   r–   r´   r©   rM   râ   rp   rÄ   r7   r<   )	r   rÖ   rF   rÃ   rµ   rç   Úbody_bufÚ
header_bufr;   r   r   r   rM   É  s   zMessage.serialiserT   )NN)
r   r	   r
   r   rA   rO   rß   r¨   rÞ   rM   r   r   r   r   rà   ¬  s    rà   c                   @   sJ   e Zd ZdZdd„ Zddefdd„Zdd	„ Zd
d„ Zde	e
 fdd„ZdS )ÚParserz8Parse DBus messages from a stream of incoming data.
    c                 C   s   t ƒ | _g | _d | _d S r>   )Ú
BufferPiperD   rF   Únext_msg_sizer   r   r   r   rA   é  s   
zParser.__init__r   rL   c                 C   s   | j  |¡ | j |¡ dS )z)Provide newly received data to the parserN)rD   ÚwriterF   Úextend)r   rL   rF   r   r   r   Úadd_dataî  s   zParser.add_datac                 C   s   |   |¡ tt| jdƒƒS )zhFeed the parser newly read data.

        Returns a list of messages completed by the new data.
        N)rï   r©   ÚiterÚget_next_message)r   rL   r   r   r   Úfeedó  s   
zParser.feedc                 C   s>   | j j}|dk rd| S | jdu rt| j  d¡ƒ| _| j| S )zÆHow many bytes can be received without going beyond the next message?

        This is only used with file-descriptor passing, so we don't get too many
        FDs in a single recvmsg call.
        rÁ   N)rD   Úbytes_bufferedrì   rÇ   Úpeek)r   Úgotr   r   r   Úbytes_desiredû  s   

zParser.bytes_desiredrã   c                 C   s’   | j du r| jjdkrt| j d¡ƒ| _ | j }|durE| jj|krG| j |¡}tj|| jd�}d| _ |j	j
 tjd¡}| j|d… | _|S dS dS )zqParse one message, if there is enough data.

        Returns None if it doesn't have a complete message.
        NrÁ   r˜   r   )rì   rD   ró   rÇ   rô   Úreadrà   rÞ   rF   rá   r–   rå   r)   r7   )r   ÚnmsÚraw_msgÚmsgÚfds_consumedr   r   r   rñ   	  s   
úzParser.get_next_messageNrT   )r   r	   r
   r   rA   r¨   rï   rò   rö   r   rà   rñ   r   r   r   r   rê   æ  s    rê   c                   @   sf   e Zd ZdZdd„ Zdefdd„Zdefdd	„Zded
efdd„Z	defdd„Z
ded
efdd„ZdS )rë   z²A place to store received data until we can parse a complete message

    The main difference from io.BytesIO is that read & write operate at
    opposite ends, like a pipe.
    c                 C   s   t ƒ | _d| _d S r8   )r   r°   ró   r   r   r   r   rA   !  s   
zBufferPipe.__init__rz   c                 C   s"   | j  |¡ |  jt|ƒ7  _d S r>   )r°   ro   ró   rp   )r   rz   r   r   r   rí   %  s   zBufferPipe.writeÚnbytesc                 c   sL   � || j ksJ ‚| jD ]}|d |… }|t|ƒ8 }|V  |dkr# d S qd S r8   )ró   r°   rp   )r   rü   Úchunkr   r   r   Ú
_peek_iter)  s   €
ÿüzBufferPipe._peek_iterrã   c                 C   ó   d  |  |¡¡S )z=Get exactly nbytes bytes from the front without removing themrž   )r    rþ   ©r   rü   r   r   r   rô   2  ó   zBufferPipe.peekc                 c   s–   � || j ksJ ‚	 | j ¡ }|  j t|ƒ8  _ |t|ƒkrn
|t|ƒ8 }|V  q	|d |… ||d … }}|rF| j |¡ |  j t|ƒ7  _ |V  d S r>   )ró   r°   Úpopleftrp   Ú
appendleft)r   rü   rý   Úremr   r   r   Ú
_read_iter6  s   €
ú	
zBufferPipe._read_iterc                 C   rÿ   )z1Take & return exactly nbytes bytes from the frontrž   )r    r  r   r   r   r   r÷   G  r  zBufferPipe.readN)r   r	   r
   r   rA   r¨   rí   rl   rþ   rô   r  r÷   r   r   r   r   rë     s    	rë   )'Úcollectionsr   Úenumr   r   r   rB   Útypingr   rn   r   r   r   r   rÂ   r   r%   r)   r<   r=   rU   re   r¥   r~   Úupdater�   r‘   r£   r²   r´   rÇ   rÊ   rÌ   rÎ   rÑ   rÒ   rà   rê   rë   r   r   r   r   Ú<module>   sl     ö


ý&F	÷(:5