B
    R[V4                 @   s  d dl mZmZ d dl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
d
d e
D ZdZdZdZG dd deZdd eD Zdd ZG dd dZeddeddeddeddeddeddeddeddeddedd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 d+d, d,Zd-d. Zd/d0 Zeeed# e gZd1d2 Zd3d4d4d4d"d4d4d5d"d6	Zd7d8 ZG d9d: d:Z G d;d< d<Z!G d=d> d>Z"dS )?    )EnumIntEnumNc               @   s   e Zd ZdS )SizeLimitErrorN)__name__
__module____qualname__ r   r   0lib/python3.7/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   B)r
   r   )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   Zmethod_callZmethod_returnerrorsignalr   r   r   r	   r      s   r   c             C   s   i | ]}||j qS r   )value).0tr   r   r	   
<dictcomp>   s    r   r   r   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_serialZdestinationZsender	signatureZunix_fdsr   r   r   r	   r   $   s   r   c             C   s   i | ]}||j qS r   )r   )r   r   r   r   r	   r   /   s    c             C   s   || |  }||krdS |S )Nr   r   )possteppadr   r   r	   padding1   s    r+   c               @   s4   e Zd Zdd Zdd Z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__9   s    zFixedType.__init__c             C   sJ   |t || j7 }| | j }t||||| j  d }||| j fS )Nr   )r+   r.   r   structunpackr-   )r   bufr(   
endiannesscodevalr   r   r	   
parse_data=   s    zFixedType.parse_datac             C   s.   dt || j }| | j }|t|| S )N    )r+   r.   r   r0   pack)r   datar(   r3   r*   r4   r   r   r	   	serialiseC   s    zFixedType.serialisec             C   s   d | j| jS )NzFixedType({!r}, {!r}))formatr-   r   )r   r   r   r	   __repr__H   s    zFixedType.__repr__c             C   s$   t |tko"| j|jko"| j|jkS )N)typer,   r-   r   )r   otherr   r   r	   __eq__K   s    zFixedType.__eq__N)r   r   r   r/   r6   r:   r<   r?   r   r   r   r	   r,   8   s
   r,   BIhHir#   qQd)
ybnrE   rD   uxr   rG   rB   c               @   s@   e Zd Zdd Zedd Zdd Zdd Zd	d
 Zdd Z	dS )
StringTypec             C   s
   || _ d S )N)length_type)r   rN   r   r   r	   r/   _   s    zStringType.__init__c             C   s   | j jS )N)rN   r-   )r   r   r   r	   r.   b   s    zStringType.alignmentc             C   sR   | j |||\}}|| }||| d}|||d  dksFt||d fS )Nzutf-8r   r7   )rN   r6   decodeAssertionError)r   r2   r(   r3   lengthendr5   r   r   r	   r6   f   s
    zStringType.parse_datac             C   sB   t |tstd||d}| jt|||}|| d S )NzExpected str, not {!r}zutf-8r7   )
isinstancestr	TypeErrorr;   encoderN   r:   len)r   r9   r(   r3   Zencodedlen_datar   r   r	   r:   m   s
    

zStringType.serialisec             C   s   d | jS )NzStringType({!r}))r;   rN   )r   r   r   r	   r<   t   s    zStringType.__repr__c             C   s   t |tko| j|jkS )N)r=   rM   rN   )r   r>   r   r   r	   r?   w   s    zStringType.__eq__N)
r   r   r   r/   propertyr.   r6   r:   r<   r?   r   r   r   r	   rM   ^   s   rM   rK   rH   )sogc               @   s8   e Zd ZdZdd Zdd Z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 )N)rS   	DictEntry)r   fr   r   r	   	<genexpr>   s    z"Struct.__init__.<locals>.<genexpr>zFound dict entry outside array)anyrU   fields)r   rb   r   r   r	   r/      s    zStruct.__init__c             C   sJ   |t |d7 }g }x*| jD ] }||||\}}|| qW t||fS )Nr#   )r+   rb   r6   appendtuple)r   r2   r(   r3   resfieldvr   r   r	   r6      s    zStruct.parse_datac             C   s   t |tstd|t|t| jkrDtdt|t| jdt|| j }|t|7 }g }x<t	|| jD ],\}}|
|||| |t|d 7 }qrW |d| S )NzExpected tuple, not {!r}z{} entries for {} fieldsr7       )rS   rd   rU   r;   rW   rb   
ValueErrorr+   r.   ziprc   r:   join)r   r9   r(   r3   r*   Z
res_piecesitemrf   r   r   r	   r:      s    
zStruct.serialisec             C   s   d t| j| jS )Nz{}({!r}))r;   r=   r   rb   )r   r   r   r	   r<      s    zStruct.__repr__c             C   s   t |t | ko| j|jkS )N)r=   rb   )r   r>   r   r   r	   r?      s    zStruct.__eq__N)	r   r   r   r.   r/   r6   r:   r<   r?   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 {})	rW   rU   rS   r,   rM   r;   r=   superr/   )r   rb   )	__class__r   r	   r/      s    zDictEntry.__init__)r   r   r   r/   __classcell__r   r   )ro   r	   r^      s   r^   c               @   sB   e Zd ZdZeddZdd Zdd Zdd Zd	d
 Z	dd Z
dS )Arrayr   rA   c             C   s
   || _ d S )N)elt_type)r   rr   r   r   r	   r/      s    zArray.__init__c             C   sf   | j |||\}}|t|| jj7 }|| }g }x*||k r\| j|||\}}|| q4W ||fS )N)rN   r6   r+   rr   r.   rc   )r   r2   r(   r3   rQ   rR   re   rg   r   r   r	   r6      s    
zArray.parse_datac             C   sB  t | jtr$t |tr$t| }n2| jtd kr>t |tr>nt |tsVt	d
|t | jtr~| jjt| dkr~tdt|| j}|| d }t|| jj}|| }|d }g }	xB|D ]:}
|	| j|
|| |t|	d 7 }||krtdqW d|	}| jt||| |}|t|7 }d| | d|  | S )	NrH   zNot suitable for array: {!r}i   zArray size exceeds 64 MiB limitr   rh   ri   r7   )rS   rr   r^   dictsorteditemssimple_typesbyteslistrU   r;   r,   r-   rW   r   r+   r.   rc   r:   rl   rN   )r   r9   r(   r3   Zpad1Zpos_after_lengthZpad2Zdata_posZ	limit_posZchunksrm   r2   rX   r   r   r	   r:      s0    


zArray.serialisec             C   s   d | jS )NzArray({!r}))r;   rr   )r   r   r   r	   r<      s    zArray.__repr__c             C   s   t |tko| j|jkS )N)r=   rq   rr   )r   r>   r   r   r	   r?      s    zArray.__eq__N)r   r   r   r.   r,   rN   r/   r6   r:   r<   r?   r   r   r   r	   rq      s   
rq   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )Variantr   c             C   s@   t d |||\}}tt|}||||\}}||f|fS )Nr\   )rv   r6   parse_signaturerx   )r   r2   r(   r3   sigvaltyper5   r   r   r	   r6      s    zVariant.parse_datac             C   s@   |\}}t t|}td |||}||||t| | S )Nr\   )rz   rx   rv   r:   rW   )r   r9   r(   r3   r{   r|   Zsig_bufr   r   r	   r:      s    zVariant.serialisec             C   s   dS )Nz	Variant()r   )r   r   r   r	   r<      s    zVariant.__repr__c             C   s   t |tkS )N)r=   ry   )r   r>   r   r   r	   r?     s    zVariant.__eq__N)r   r   r   r.   r6   r:   r<   r?   r   r   r   r	   ry      s
   	ry   c             C   s   |  d}|dkrtt| S |dkr,t S |dkrjg }x| d dkrV|t|  q:W |  d t|S |dkrg }x| d dkr|t|  qxW |  d t|S |dkrtd	nt| S d
S )z-Parse a symbolic signature into objects.
    r   arg   (){}z)}zUnexpected end of structN)	poprq   rz   ry   rc   r]   r^   rj   rv   )r{   tokenrb   Zder   r   r	   rz     s(    



rz   c             C   st   t d| d d \}t| }t | d | dd \}t | d | dd \}d| }|t|d | S )Ncr   rA   r   r#         )r0   r1   
endian_mapr   r+   )r2   endianbody_lengthZfields_array_lenZ
header_lenr   r   r	   calc_msg_size   s    r   c             C   s$   t | d|\}}dd |D |fS )Nr   c             S   s   i | ]\}}|d  t | qS )r   )header_fields_map)r   krg   r   r   r	   r   .  s    z'parse_header_fields.<locals>.<dictcomp>)_header_fields_typer6   )r2   r3   lr(   r   r   r	   parse_header_fields,  s    r   r[   rZ   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   )r   header_field_codes)r   rD   rg   r   r   r	   
<listcomp>?  s    z+serialise_header_fields.<locals>.<listcomp>r   )rt   ru   r   r:   )rG   r3   r   r   r   r	   serialise_header_fields>  s    r   c               @   s0   e Zd Zdd Zdd Zdd Zedd Zd	S )
Headerc             C   s.   || _ || _|| _|| _|| _|| _|| _d S )N)r3   message_typeflagsprotocol_versionr   serialrb   )r   r3   r   r   r   r   r   rb   r   r   r	   r/   D  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}))r;   r3   r   r   r   r   r   rb   )r   r   r   r	   r<   N  s    zHeader.__repr__c          	   C   sD   | j  d }t|| j  | jj| j| j| j	| j
t| j| j  S )NZcBBBII)r3   r   r0   r8   r   r   r   r   r   r   r   r   rb   )r   rZ   r   r   r	   r:   S  s    

zHeader.serialisec       
      C   sn   t d|d d \}}}}t| }t | d |dd \}}t||\}}	| |t| ||||||	fS )NZcBBBr   ZIIr   )r0   r1   r   r   r   msg_type_map)
clsr2   r   Zmsgtyper   ZpvZbodylenr   rb   r(   r   r   r	   from_buffer[  s     zHeader.from_bufferN)r   r   r   r/   r<   r:   classmethodr   r   r   r   r	   r   C  s   
r   c               @   s4   e Zd ZdZdd Zdd Zedd Z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 )N)headerbody)r   r   r   r   r   r	   r/   k  s    zMessage.__init__c             C   s   d t| j| j| jS )Nz{}({!r}, {!r}))r;   r=   r   r   r   )r   r   r   r	   r<   o  s    zMessage.__repr__c             C   sX   t |\}}d}tj|jkrN|jtj }ttd| }||||jd }| ||S )Nr   z(%s)r   )	r   r   r   r'   rb   rz   rx   r6   r3   )r   r2   r   r(   r   r{   	body_typer   r   r	   r   r  s    zMessage.from_bufferc             C   s~   | j j}tj| j jkrF| j jtj }ttd| }|| jd|}nd}t	|| j _
| j  }dtt	|d }|| | S )zConvert this message to bytes.z(%s)r   ri   r7   r#   )r   r3   r   r'   rb   rz   rx   r:   r   rW   r   r+   )r   r   r{   r   Zbody_bufZ
header_bufr*   r   r   r	   r:   |  s    
zMessage.serialiseN)	r   r   r   __doc__r/   r<   r   r   r:   r   r   r   r	   r   e  s
   
r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	Parserz8Parse DBus messages from a stream of incoming data.
    c             C   s   d| _ d | _d S )Nri   )r2   next_msg_size)r   r   r   r	   r/     s    zParser.__init__c             C   s   |  j |7  _ tt| jdS )zhFeed the parser newly read data.

        Returns a list of messages completed by the new data.
        N)r2   rx   iter_read1)r   r9   r   r   r	   feed  s    zParser.feedc             C   sx   | j d kr$t| jdkr$t| j| _ | j }|d k	rtt| j|krt| jd | | j|d   }| _t|}d | _ |S d S )Nr   )r   rW   r2   r   r   r   )r   ZnmsZraw_msgmsgr   r   r	   r     s    
 
zParser._read1N)r   r   r   r   r/   r   r   r   r   r   r	   r     s   r   )#enumr   r   r0   rj   r   r
   r   r   r   r   r   ZNO_REPLY_EXPECTEDZNO_AUTO_STARTZALLOW_INTERACTIVE_AUTHORIZATIONr   r   r+   r,   rv   rM   updater]   r^   rq   ry   rz   r   r   r   r   r   r   r   r   r   r   r   r	   <module>   sb   

&9	")