U
    [eJ                     @   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 )SizeLimitErrorzRaised 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   S/var/www/html/services/stratfitenv/lib/python3.8/site-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   s   | t jkrdS dS )N<>r   littleselfr   r   r   struct_code   s    zEndianness.struct_codec                 C   s   | t jkrdS dS )N   l   Br   r   r   r   r   	dbus_code   s    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_callZ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
   Zno_reply_expectedZno_auto_startZ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
   pathZ	interfacememberZ
error_nameZreply_serialdestinationZ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    r2   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   r5   r   r   r   r   __init__=   s    zFixedType.__init__r   c                 C   sJ   |t || j7 }| | j }t||||| j  d }||| j fS r.   )r2   r6   r   structunpackr5   )r   bufr/   
endiannessfdscodevalr   r   r   
parse_dataA   s    zFixedType.parse_dataNc                 C   s.   dt || j }| | j }|t|| S )N    )r2   r6   r   r8   pack)r   datar/   r;   r<   r1   r=   r   r   r   	serialiseG   s    zFixedType.serialisec                 C   s   d | j| jS )NzFixedType({!r}, {!r}))formatr5   r   r   r   r   r   __repr__L   s    zFixedType.__repr__c                 C   s$   t |tko"| j|jko"| j|jkS r4   )typer3   r5   r   r   otherr   r   r   __eq__O   s    
zFixedType.__eq__)r   )N)r   r	   r
   r7   r?   rC   rE   rI   r   r   r   r   r3   <   s
   

r3   c                       s:   e Zd Z fddZd
 fdd	Zdd Zdd	 Z  ZS )Booleanc                    s   t  dd d S Nr   Isuperr7   r   	__class__r   r   r7   U   s    zBoolean.__init__r   c                    s    t  |||\}}t||fS r4   )rN   r?   bool)r   r:   r/   r;   r<   r>   new_posrO   r   r   r?   X   s    zBoolean.parse_datac                 C   s   dS )Nz	Boolean()r   r   r   r   r   rE   \   s    zBoolean.__repr__c                 C   s   t |tkS r4   )rF   rJ   rG   r   r   r   rI   _   s    zBoolean.__eq__)r   )r   r	   r
   r7   r?   rE   rI   __classcell__r   r   rO   r   rJ   T   s   rJ   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                    s   t  dd d S rK   rM   r   rO   r   r   r7   d   s    zFileDescriptor.__init__r   c                    s    t  |||\}}|| |fS r4   )rN   r?   )r   r:   r/   r;   r<   idxrR   rO   r   r   r?   g   s    zFileDescriptor.parse_dataNc                    sx   |d krt dt|dr"| }t|ts6t|ts>td|dk rVt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hasattrrV   
isinstancerQ   int	TypeError
ValueErrorappendrN   rC   len)r   rB   r/   r;   r<   rO   r   r   rC   k   s    

zFileDescriptor.serialisec                 C   s   dS )NzFileDescriptor()r   r   r   r   r   rE   {   s    zFileDescriptor.__repr__c                 C   s   t |tkS r4   )rF   rT   rG   r   r   r   rI   ~   s    zFileDescriptor.__eq__)r   )N)	r   r	   r
   r7   r?   rC   rE   rI   rS   r   r   rO   r   rT   c   s
   rT   r   Br   hHr   irL   r'   qQd)
ynrd   brc   uxtrf   ra   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   s
   || _ d S r4   )length_type)r   rn   r   r   r   r7      s    zStringType.__init__c                 C   s   | j jS r4   )rn   r5   r   r   r   r   r6      s    zStringType.alignmentr   c                 C   sR   | j |||\}}|| }||| d}|||d  dksFt||d fS )Nutf-8r   r@   )rn   r?   decodeAssertionError)r   r:   r/   r;   r<   lengthendr>   r   r   r   r?      s
    zStringType.parse_dataNc                 C   sB   t |tstd||d}| jt|||}|| d S )NzExpected str, not {!r}ro   r@   )rZ   strr\   rD   encodern   rC   r_   )r   rB   r/   r;   r<   encodedlen_datar   r   r   rC      s
    

zStringType.serialisec                 C   s   d | jS )NzStringType({!r}))rD   rn   r   r   r   r   rE      s    zStringType.__repr__c                 C   s   t |tko| j|jkS r4   )rF   rm   rn   rG   r   r   r   rI      s    
zStringType.__eq__)r   )N)
r   r	   r
   r7   propertyr6   r?   rC   rE   rI   r   r   r   r   rm      s   


rm   rj   rg   )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 r4   )rZ   	DictEntry).0fr   r   r   	<genexpr>   s     z"Struct.__init__.<locals>.<genexpr>zFound dict entry outside array)anyr\   fieldsr   r   r   r   r   r7      s    zStruct.__init__r   c                 C   sJ   |t |d7 }g }| jD ]$}|j||||d\}}|| qt||fS )Nr'   r<   )r2   r   r?   r^   tuple)r   r:   r/   r;   r<   resfieldvr   r   r   r?      s    
zStruct.parse_dataNc           	   	   C   s   t |tstd|t|t| jkrDtdt|t| jdt|| j }|t|7 }g }t	|| jD ]0\}}|
|j||||d |t|d 7 }qp|d| S )NzExpected tuple, not {!r}z{} entries for {} fieldsr@   r       )rZ   r   r\   rD   r_   r   r]   r2   r6   zipr^   rC   join)	r   rB   r/   r;   r<   r1   Z
res_piecesitemr   r   r   r   rC      s    
 zStruct.serialisec                 C   s   d t| j| jS )Nz{}({!r}))rD   rF   r   r   r   r   r   r   rE      s    zStruct.__repr__c                 C   s   t |t | ko| j|jkS r4   )rF   r   rG   r   r   r   rI      s    zStruct.__eq__)r   )N)	r   r	   r
   r6   r7   r?   rC   rE   rI   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sDt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 {})	r_   r\   rZ   r3   rm   rD   rF   rN   r7   r   rO   r   r   r7      s    

zDictEntry.__init__)r   r	   r
   r7   rS   r   r   rO   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   rL   c                 C   s
   || _ d S r4   )elt_type)r   r   r   r   r   r7      s    zArray.__init__r   c           	      C   s   | j |||\}}|t|| jj7 }|| }| jtd krL||| |fS g }||k r|| jj||||d\}}|| qPt| jtrt	|}||fS )Nrg   r   )
rn   r?   r2   r   r6   simple_typesr^   rZ   r}   dict)	r   r:   r/   r;   r<   rr   rs   r   r   r   r   r   r?      s    zArray.parse_dataNc              	   C   sD  d}t | jtr$t |tr$| }n6| jtd krBt |trBd}nt |tsZtd	|t | jt
r| jjt| dkrtdt|| j}|| d }t|| jj}|r|}	nb|| }
|
d }g }|D ]>}|| jj||
||d |
t|d	 7 }
|
|krtdqd
|}	| jt|	|| |}d| | d|  |	 S )NFrg   TzNot suitable for array: {!r}i   zArray size exceeds 64 MiB limitr   r   r   r   r@   )rZ   r   r}   r   itemsr   byteslistr\   rD   r3   r5   r_   r   r2   r6   r^   rC   r   rn   )r   rB   r/   r;   r<   Zdata_is_bytesZpad1Zpos_after_lengthZpad2r:   Zdata_posZ	limit_poschunksr   rw   r   r   r   rC      s>    


   

zArray.serialisec                 C   s   d | jS )NzArray({!r}))rD   r   r   r   r   r   rE   %  s    zArray.__repr__c                 C   s   t |tko| j|jkS r4   )rF   r   r   rG   r   r   r   rI   (  s    zArray.__eq__)r   )N)r   r	   r
   r6   r3   rn   r7   r?   rC   rE   rI   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   r?   parse_signaturer   )r   r:   r/   r;   r<   sigvaltyper>   r   r   r   r?   /  s    zVariant.parse_dataNc                 C   sD   |\}}t t|}td |||}||j||t| ||d S r   )r   r   r   rC   r_   )r   rB   r/   r;   r<   r   r   Zsig_bufr   r   r   rC   8  s     
  zVariant.serialisec                 C   s   dS )Nz	Variant()r   r   r   r   r   rE   @  s    zVariant.__repr__c                 C   s   t |tkS r4   )rF   r   rG   r   r   r   rI   C  s    zVariant.__eq__)r   )N)r   r	   r
   r6   r?   rC   rE   rI   r   r   r   r   r   ,  s
   
	
r   c                 C   s   |  d}|dkrtt| S |dkr,t S |dkrfg }| d dkrT|t|  q8|  d t|S |dkrg }| d dkr|t|  qr|  d t|S |dkrtd	nt| S d
S )z-Parse a symbolic signature into objects.
    r   ar   (rW   {}z)}zUnexpected end of structN)	popr   r   r   r^   r|   r}   r]   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   rL   r   r'         )r8   r9   
endian_mapr   r2   )r:   endianbody_lengthZfields_array_lenZ
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_typer?   )r:   r;   lr/   r   r   r   parse_header_fieldsm  s    r   rz   ry   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~   rc   r   r   r   r   
<listcomp>  s     z+serialise_header_fields.<locals>.<listcomp>r   )sortedr   r   rC   )rf   r;   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 )zA D-Bus message header

        It's not normally necessary to construct this directly: use higher level
        functions and methods instead.
        N)	r;   r   message_typer"   flagsprotocol_versionr   serialr   )r   r;   r   r   r   r   r   r   r   r   r   r7     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}))rD   r;   r   r   r   r   r   r   r   r   r   r   rE     s         zHeader.__repr__Nc              	   C   sP   | j  d }|d kr| j}t|| j  | jj| j| j	| j
|t| j| j  S )NZcBBBII)r;   r   r   r8   rA   r   r   r   r   r   r   r   r   )r   r   ry   r   r   r   rC     s      zHeader.serialisec           
      C   sj   t d|d d \}}}}t| }t | d |dd \}}t||\}}	| ||||||||	fS )NZcBBBr   ZIIr   )r8   r9   r   r   r   )
clsr:   r   Zmsgtyper   pvZbodylenr   r   r/   r   r   r   from_buffer  s
     zHeader.from_buffer)N)r   r	   r
   r7   rE   rC   classmethodr   r   r   r   r   r     s
   

r   c                   @   sF   e Zd ZdZdd Zdd Zeded ddd	ZdedddZ	d
S )MessagezObject 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 r4   )headerbody)r   r   r   r   r   r   r7     s    zMessage.__init__c                 C   s   d t| j| j| jS )Nz{}({!r}, {!r}))rD   rF   r   r   r   r   r   r   r   rE     s    zMessage.__repr__r   )r:   returnc           	      C   s   t |\}}|jtjd}|t|krDtd| dt| d|d | }d}tj|jkr|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#   r-   r_   r]   r,   r   r   r?   r;   r   )	r   r:   r<   r   r/   Zn_fdsr   r   	body_typer   r   r   r     s    zMessage.from_bufferNr   c           	      C   s   | j j}tj| j jkrJ| j jtj }ttd| }|j| jd||d}nd}t	|| j _
|rpt	|| 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   r@   r'   )r   r;   r#   r,   r   r   r   rC   r   r_   r   r-   r2   )	r   r   r<   r   r   r   Zbody_bufZ
header_bufr1   r   r   r   rC     s    zMessage.serialise)r   )NN)
r   r	   r
   r   r7   rE   r   r   r   rC   r   r   r   r   r     s   r   c                   @   sJ   e Zd ZdZdd ZdedddZdd	 Zd
d Ze	e
 dddZdS )Parserz8Parse DBus messages from a stream of incoming data.
    c                 C   s   t  | _g | _d | _d S r4   )
BufferPiper:   r<   next_msg_sizer   r   r   r   r7     s    zParser.__init__r   )rB   c                 C   s   | j | | j| dS )z)Provide newly received data to the parserN)r:   writer<   extend)r   rB   r<   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   rB   r   r   r   feed  s    
zParser.feedc                 C   s>   | j j}|dk rd| S | jdkr4t| j d| _| j| S )zHow 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)r:   bytes_bufferedr   r   peek)r   gotr   r   r   bytes_desired  s    
zParser.bytes_desiredr   c                 C   s   | j dkr(| jjdkr(t| jd| _ | j }|dk	r| jj|kr| j|}tj|| jd}d| _ |j	j
tjd}| j|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   r:   r   r   r   readr   r   r<   r   r   r   r#   r-   )r   ZnmsZraw_msgmsgZfds_consumedr   r   r   r   	  s    
zParser.get_next_messageN)r   )r   r	   r
   r   r7   r   r   r   r   r   r   r   r   r   r   r   r     s   r   c                   @   sb   e Zd ZdZdd ZedddZeddd	Zeed
ddZ	edddZ
eed
ddZdS )r   zA 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 r.   )r   r   r   r   r   r   r   r7   !  s    zBufferPipe.__init__)ri   c                 C   s"   | j | |  jt|7  _d S r4   )r   r^   r   r_   )r   ri   r   r   r   r   %  s    zBufferPipe.write)nbytesc                 c   sH   || j kst| jD ].}|d | }|t|8 }|V  |dkr qDqd S r.   )r   rq   r   r_   )r   r   chunkr   r   r   
_peek_iter)  s    
zBufferPipe._peek_iter)r   r   c                 C   s   d | |S )z=Get exactly nbytes bytes from the front without removing themr   )r   r   r   r   r   r   r   r   2  s    zBufferPipe.peekc                 c   s   || j kst| j }|  j t|8  _ |t|kr8qL|t|8 }|V  q|d | ||d   }}|r| j| |  j t|7  _ |V  d S r4   )r   rq   r   popleftr_   
appendleft)r   r   r   remr   r   r   
_read_iter6  s    
zBufferPipe._read_iterc                 C   s   d | |S )z1Take & return exactly nbytes bytes from the frontr   )r   r   r   r   r   r   r   G  s    zBufferPipe.readN)r   r	   r
   r   r7   r   r   r[   r   r   r   r   r   r   r   r   r     s   	r   )'collectionsr   enumr   r   r   r8   typingr   r]   r   r   r   r   r   r   r"   r#   r2   r3   rJ   rT   r   rm   updater|   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sj    


&F	(:5