o
    UhM                     @   s$  d dl Z d dlZd dlmZ d dlmZmZm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G d'd( d(eZeeed) e eed* d+ G d,d- d-ZG d.d/ d/eZG d0d1 d1ZG d2d3 d3Zd4d5 Zd6d7 Z eeed* e gZ!d8d9 Z"d:d;d;d;d)d;d;d<d)d=	Z#d>d? Z$G d@dA dAZ%G dBdC dCZ&G dDdE dEZ'G dFdG dGZ(dS )H    N)deque)EnumIntEnumIntFlag)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   e/var/www/html/construction_image-detection-poc/venv/lib/python3.10/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      | 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   padding6   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_dataB   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   	serialiseH   s   zFixedType.serialisec                 C   s   d | j| jS )NzFixedType({!r}, {!r}))formatr?   r   r   r   r   r   __repr__M   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__P   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   V   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   Y      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   U   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   e   r   zFileDescriptor.__init__r   c                    s    t  |||\}}|| |fS r>   )rZ   rI   )r   rD   r9   rE   rF   idxr^   r[   r   r   rI   h   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   l   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   d   s    re   r   Br   hHr    irX   r-   qQd)
ynru   brt   uxtrw   rr   c                   @   sL   e Zd Zdd Zedd ZdddZ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_datac                 C   s   t |tstd|d S )NzExpected str, not {!r})rk   strrm   rN   r   rL   r   r   r   
check_data   s   
zStringType.check_dataNc                 C   s4   |  | |d}| jt|||}|| d S )Nr   rJ   )r   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   r   rM   rO   rS   r   r   r   r   r~      s    


r~   c                       s(   e Zd Z fddZ fddZ  ZS )ObjectPathTypec                    s   t  td  d S )Nr{   )rZ   rA   simple_typesr   r[   r   r   rA         zObjectPathType.__init__c                    s   t  | |dstd|d|dr&t|dkr&td|dd|v r2td|dtjtj d  t	 fd	d
|D rMtd|dd S )N/zObject path (z) must start with /r   z) cannot end with /z//z) cannot contain double /z/_c                 3   s    | ]}| vV  qd S r>   r   ).0cvalid_charsr   r   	<genexpr>   s    z,ObjectPathType.check_data.<locals>.<genexpr>z)) can only contain A-Z, a-z, 0-9, / and _)
rZ   r   
startswithrn   endswithrp   stringascii_lettersdigitsanyr   r[   r   r   r      s   

zObjectPathType.check_data)r   r	   r
   rA   r   rd   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)r   fr   r   r   r      s    z"Struct.__init__.<locals>.<genexpr>zFound dict entry outside array)r   rm   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      r   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@   r   ro   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rt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   F  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   O  s   zVariant.serialisec                 C   r`   )Nz	Variant()r   r   r   r   r   rO   W  ra   zVariant.__repr__c                 C   rb   r>   )rP   r   rQ   r   r   r   rS   Z  rc   zVariant.__eq__rT   r>   )r   r	   r
   r@   rI   rM   rO   rS   r   r   r   r   r   C  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   ]  s,   


r   c                 C   st   t d| d d \}t| }t | d | dd \}t | d | dd \}d| }|t|d | S )Nr   r   rX   r    r-         )rB   rC   
endian_mapr   r<   )rD   endianbody_lengthfields_array_len
header_lenr   r   r   calc_msg_sizex  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>  s    z'parse_header_fields.<locals>.<dictcomp>)_header_fields_typerI   )rD   rE   lr9   r   r   r   parse_header_fields  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 )zA 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 )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 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_messager   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 )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)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   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 r8   )r   r   r   r   r   r   r   rA   8  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   I     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_iterM  s   
	
zBufferPipe._read_iterc                 C   r  )z1Take & return exactly nbytes bytes from the frontr   )r   r  r  r   r   r   r  ^  r  zBufferPipe.readN)r   r	   r
   r   rA   r   r   rl   r
  r   r  r  r   r   r   r   r   2  s    	r   ))r   rB   collectionsr   enumr   r   r   typingr   rn   r   r   r   r   r   r   r%   r)   r<   r=   rU   re   r   r~   r   updater   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sp     !

&F	(:5