
    +cJ                     2   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e	      Z
 G d de      Zej                  ej                  d	Z G d
 de      Z G d de      Z G d de      Zd Z G d d      Z G d de      Z G 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%      Zej1                   eed&          eed&          eed'         d(        G d) d*      Z G d+ d,e      Z G d- d.      Z G d/ d0      Zd1 Zd2 Z e eed'    e       g            Zd3 Z d4d5d5d5d&d5d5d6d&d7	Z!d8 Z" G d9 d:      Z# G d; d<      Z$ G d= d>      Z% G d? d@      Z&y)A    )deque)EnumIntEnumIntFlagN)Optionalc                       e Zd ZdZy)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__     3/usr/lib/python3/dist-packages/jeepney/low_level.pyr	   r	      s    
 	r   r	   c                        e Zd ZdZdZd Zd Zy)
Endianness      c                 .    | t         j                  u rdS dS )N<>r   littleselfs    r   struct_codezEndianness.struct_code   s    z000s:s:r   c                 .    | t         j                  u rdS dS )N   l   Br   r   s    r   	dbus_codezEndianness.dbus_code   s    
 1 11t<<r   N)r
   r   r   r   bigr   r    r   r   r   r   r      s    F
C;=r   r   )r   r   c                       e Zd ZdZdZdZdZy)MessageTyper   r         N)r
   r   r   method_callmethod_returnerrorsignalr   r   r   r#   r#      s    KMEFr   r#   c                       e Zd ZdZdZdZy)MessageFlagr   r   r%   N)r
   r   r   no_reply_expectedno_auto_startallow_interactive_authorizationr   r   r   r+   r+   #   s    M&'#r   r+   c                   0    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zy
)HeaderFieldsr   r   r$   r%               	   N)r
   r   r   path	interfacemember
error_namereply_serialdestinationsender	signatureunix_fdsr   r   r   r0   r0   )   s/    DIFJLKFIHr   r0   c                 "    || |z  z
  }||k(  ry|S Nr   r   )possteppads      r   paddingrD   5   s    
#*
C
d{Jr   c                   .    e Zd Zd ZddZddZd Zd Zy)		FixedTypec                 .    |x| _         | _        || _        y N)size	alignmentr   )r   rI   r   s      r   __init__zFixedType.__init__=   s    %))	DN&r   c                     |t        || j                        z  }|j                         | j                  z   }t        j                  ||||| j
                  z          d   }||| j
                  z   fS r@   )rD   rJ   r   structunpackrI   )r   bufrA   
endiannessfdscodevals          r   
parse_datazFixedType.parse_dataA   sg    wsDNN++%%'$*:*::mmD#c#		/":;A>C$))O##r   Nc                     dt        || j                        z  }|j                         | j                  z   }|t        j                  ||      z   S )N    )rD   rJ   r   rM   pack)r   datarA   rP   rQ   rC   rR   s          r   	serialisezFixedType.serialiseG   sF    gc4>>22%%'$*:*::V[[t,,,r   c                 N    dj                  | j                  | j                        S )NzFixedType({!r}, {!r}))formatrI   r   r   s    r   __repr__zFixedType.__repr__L   s    &--dii9I9IJJr   c                     t        |      t        u xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rH   )typerF   rI   r   r   others     r   __eq__zFixedType.__eq__O   s@    Uy( <tyyEJJ/F <%%):)::	<r   r   rH   )r
   r   r   rK   rT   rY   r\   ra   r   r   r   rF   rF   <   s    '$-
K<r   rF   c                   6     e Zd Z fdZd fd	Zd Zd Z xZS )Booleanc                 &    t         |   dd       y Nr%   IsuperrK   r   	__class__s    r   rK   zBoolean.__init__U       C r   c                 F    t         |   |||      \  }}t        |      |fS rH   )ri   rT   bool)r   rO   rA   rP   rQ   rS   new_posrk   s          r   rT   zBoolean.parse_dataX   s)    w)#sJ?WCy'!!r   c                      y)Nz	Boolean()r   r   s    r   r\   zBoolean.__repr__\       r   c                 $    t        |      t        u S rH   )r^   rd   r_   s     r   ra   zBoolean.__eq___       E{g%%r   rb   )r
   r   r   rK   rT   r\   ra   __classcell__rk   s   @r   rd   rd   T   s    !"&r   rd   c                   B     e Zd Z fdZd fd	Zd fd	Zd Zd Z xZS )FileDescriptorc                 &    t         |   dd       y rf   rh   rj   s    r   rK   zFileDescriptor.__init__d   rl   r   c                 :    t         |   |||      \  }}||   |fS rH   )ri   rT   )r   rO   rA   rP   rQ   idxro   rk   s          r   rT   zFileDescriptor.parse_datag   s)    w)#sJ?W3x  r   c                 0   |t        d      t        |d      r|j                         }t        |t              st        |t
              st        d      |dk  rt        d| d      |j                  |       t        | )  t        |      dz
  ||      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hasattrr|   
isinstancern   int	TypeError
ValueErrorappendri   rY   len)r   rX   rA   rP   rQ   rk   s        r   rY   zFileDescriptor.serialisek   s    ;LMM4";;=DdD!D#)> G H H !8B4&JKK

4w SAsJ??r   c                      y)NzFileDescriptor()r   r   s    r   r\   zFileDescriptor.__repr__{   s    !r   c                 $    t        |      t        u S rH   )r^   rw   r_   s     r   ra   zFileDescriptor.__eq__~   s    E{n,,r   rb   rH   )	r
   r   r   rK   rT   rY   r\   ra   rt   ru   s   @r   rw   rw   c   s    !!@ "-r   rw   r   Br   hHr%   irg   r4   qQd)
ynr   br   uxtr   r   c                   >    e Zd Zd Zed        ZddZd	dZd Zd Z	y)

StringTypec                     || _         y rH   )length_type)r   r   s     r   rK   zStringType.__init__   s
    &r   c                 .    | j                   j                  S rH   )r   rI   r   s    r   rJ   zStringType.alignment   s    $$$r   c                     | j                   j                  |||      \  }}||z   }||| j                  d      }|||dz    dk(  sJ ||dz   fS )Nutf-8r   rV   )r   rT   decode)r   rO   rA   rP   rQ   lengthendrS   s           r   rT   zStringType.parse_data   sf    &&11#sJGFl#cl!!'*3sQw5(((C!G|r   Nc                     t        |t              st        dj                  |            |j	                  d      }| j
                  j                  t        |      ||      }||z   dz   S )NzExpected str, not {!r}r   rV   )r   strr   r[   encoder   rY   r   )r   rX   rA   rP   rQ   encodedlen_datas          r   rY   zStringType.serialise   s_    $$4;;DABB++g&##--c'lCL'!E))r   c                 8    dj                  | j                        S )NzStringType({!r}))r[   r   r   s    r   r\   zStringType.__repr__   s    !(()9)9::r   c                 Z    t        |      t        u xr | j                  |j                  k(  S rH   )r^   r   r   r_   s     r   ra   zStringType.__eq__   s,    Uz) ;$$(9(99	;r   rb   rH   )
r
   r   r   rK   propertyrJ   rT   rY   r\   ra   r   r   r   r   r      s/    ' % %*;;r   r   r   r   )sogc                   2    e Zd ZdZd ZddZd	dZd Zd Zy)
Structr4   c                 L    t        d |D              rt        d      || _        y )Nc              3   <   K   | ]  }t        |t                y wrH   )r   	DictEntry).0fs     r   	<genexpr>z"Struct.__init__.<locals>.<genexpr>   s     8Az!Y'8s   zFound dict entry outside array)anyr   fields)r   r   s     r   rK   zStruct.__init__   s#    888<==r   c                     |t        |d      z  }g }| j                  D ]+  }|j                  ||||      \  }}|j                  |       - t	        |      |fS )Nr4   rQ   )rD   r   rT   r   tuple)r   rO   rA   rP   rQ   resfieldvs           r   rT   zStruct.parse_data   sb    wsA[[ 	E%%c3
%DFAsJJqM	 Sz3r   Nc           	      &   t        |t              st        dj                  |            t	        |      t	        | j
                        k7  r7t        dj                  t	        |      t	        | j
                                    dt        || j                        z  }|t	        |      z  }g }t        || j
                        D ]:  \  }}|j                  |j                  ||||             |t	        |d         z  }< |dj                  |      z   S )NzExpected tuple, not {!r}z{} entries for {} fieldsrV   r   r   )r   r   r   r[   r   r   r   rD   rJ   zipr   rY   join)	r   rX   rA   rP   rQ   rC   
res_piecesitemr   s	            r   rY   zStruct.serialise   s    $&6==dCDDt9DKK((7>>D	3t{{+   gc4>>22s3x
tT[[1 	'KD%eoodCoMN3z"~&&C	' SXXj)))r   c                 `    dj                  t        |       j                  | j                        S )Nz{}({!r}))r[   r^   r
   r   r   s    r   r\   zStruct.__repr__   s#      d!4!4dkkBBr   c                 d    t        |      t        |       u xr | j                  |j                  k(  S rH   )r^   r   r_   s     r   ra   zStruct.__eq__   s'    UtDz)Lu||0KLr   rb   rH   )	r
   r   r   rJ   rK   rT   rY   r\   ra   r   r   r   r   r      s"    I
*CMr   r   c                        e Zd Z fdZ xZS )r   c                     t        |      dk7  rt        dt        |      z        t        |d   t        t        f      s&t        dj                  t        |d                     t        | !  |       y )Nr   z%Dict entry must have 2 fields, not %dr   z5First field in dict entry must be simple type, not {})	r   r   r   rF   r   r[   r^   ri   rK   )r   r   rk   s     r   rK   zDictEntry.__init__   sn    v;!7#f+EG G&)i%<=GVAY(* * 	 r   )r
   r   r   rK   rt   ru   s   @r   r   r      s    ! !r   r   c                   D    e Zd ZdZ edd      Zd Zd	dZd
dZd Z	d Z
y)Arrayr%   rg   c                     || _         y rH   )elt_type)r   r   s     r   rK   zArray.__init__   s	     r   c                    | j                   j                  |||      \  }}|t        || j                  j                        z  }||z   }| j                  t
        d   k(  r||| |fS g }||k  r9| j                  j                  ||||      \  }}|j                  |       ||k  r9t        | j                  t              rt        |      }||fS )Nr   r   )
r   rT   rD   r   rJ   simple_typesr   r   r   dict)	r   rO   rA   rP   rQ   r   r   r   r   s	            r   rT   zArray.parse_data   s    &&11#sJGwsDMM3344Fl==L--s3<$$Ci]]--c3
-LFAsJJqM Ci dmmY/s)CCxr   Nc           	         d}t        | j                  t              r!t        |t              r|j	                         }nS| j                  t
        d   k(  rt        |t              rd}n*t        |t              st        dj                  |            t        | j                  t              r0| j                  j                  t        |      z  dkD  rt        d      t        || j                        }||z   dz   }t        || j                  j                        }|r|}	ns||z   }
|
dz   }g }|D ]Q  }|j!                  | j                  j#                  ||
||             |
t        |d	         z  }
|
|kD  sHt        d       d
j%                  |      }	| j&                  j#                  t        |	      ||z   |      }d|z  |z   d|z  z   |	z   S )NFr   TzNot suitable for array: {!r}i   zArray size exceeds 64 MiB limitr%   r   r   r   rV   )r   r   r   r   itemsr   byteslistr   r[   rF   rI   r   r	   rD   rJ   r   rY   r   r   )r   rX   rA   rP   rQ   data_is_bytespad1pos_after_lengthpad2rO   data_pos	limit_poschunksr   r   s                  r   rY   zArray.serialise   s   dmmY/JtT4J::<Dmm|C00ju6M MD$':AA$GHH dmmY/""SY.%7$%FGGsDNN+:>')@)@AC'$.H 7*IF Ldmm55(JC 6   Cr
O+i'()JKKL ((6"C##--c#hD*M (EDL9C??r   c                 8    dj                  | j                        S )NzArray({!r}))r[   r   r   s    r   r\   zArray.__repr__%  s    ##DMM22r   c                 Z    t        |      t        u xr | j                  |j                  k(  S rH   )r^   r   r   r_   s     r   ra   zArray.__eq__(  s#    Uu$K4==ENN+JKr   rb   rH   )r
   r   r   rJ   rF   r   rK   rT   rY   r\   ra   r   r   r   r   r      s/    IAs#K!$$@L3Lr   r   c                   ,    e Zd ZdZddZddZd Zd Zy)	Variantr   c                     t         d   j                  |||      \  }}t        t        |            }|j                  ||||      \  }}||f|fS Nr   r   )r   rT   parse_signaturer   )r   rO   rA   rP   rQ   sigvaltyperS   s           r   rT   zVariant.parse_data/  sX    $//S*ES!$s),%%c3
%DSSz3r   Nc                     |\  }}t        t        |            }t        d   j                  |||      }||j                  ||t	        |      z   ||      z   S r   )r   r   r   rY   r   )r   rX   rA   rP   rQ   r   r   sig_bufs           r   rY   zVariant.serialise8  sc    	T!$s),s#--c3
C**#G$jc + 
 
 	
r   c                      y)Nz	Variant()r   r   s    r   r\   zVariant.__repr__@  rq   r   c                 $    t        |      t        u S rH   )r^   r   r_   s     r   ra   zVariant.__eq__C  rs   r   rb   rH   )r
   r   r   rJ   rT   rY   r\   ra   r   r   r   r   r   ,  s    I
&r   r   c                    | j                  d      }|dk(  rt        t        |             S |dk(  r
t               S |dk(  rIg }| d   dk7  r#|j	                  t        |              | d   dk7  r#| j                  d       t        |      S |dk(  rIg }| d   dk7  r#|j	                  t        |              | d   dk7  r#| j                  d       t        |      S |dv rt        d	      t        |   S )
z-Parse a symbolic signature into objects.
    r   ar   (r}   {}z)}zUnexpected end of struct)	popr   r   r   r   r   r   r   r   )r   tokenr   des       r   r   r   F  s     GGAJE|_S)**|y	#!fmMM/#./ !fm
f~	#!fmIIoc*+ !fm
}	$344E""r   c                 (   t        j                  d| d d       \  }t        |   }t        j                  |j                         dz   | dd       \  }t        j                  |j                         dz   | dd       \  }d|z   }|t	        |d      z   |z   S )Ncr   rg   r%   r4         )rM   rN   
endian_mapr   rD   )rO   endianbody_lengthfields_array_len
header_lens        r   calc_msg_sizer   a  s    mmCRa)GFF==!3!3!5!;S1XFLKf&8&8&:S&@#b*M&&J
A..<<r   c                     t         j                  | d|      \  }}|D ci c]  \  }}t        |      |d    c}}|fS c c}}w )Nr   r   )_header_fields_typerT   r0   )rO   rP   lrA   kr   s         r   parse_header_fieldsr   m  sD     ++CZ@FAs012fq!LOQqT!2C772s   ?r   r   r   )	r   r   r$   r%   r1   r2   r3   r4   r5   c                     t        | j                               D cg c]  \  }}|j                  t        |   |ff }}}t        j                  |d|      S c c}}w )Nr   )sortedr   valueheader_field_codesr   rY   )r   rP   r   r   r   s        r   serialise_header_fieldsr     sS    =CAGGI=NO6Aq!''&q)1-	.OAO((B
;; 	Ps   !Ac                   0    e Zd Zd Zd ZddZed        Zy)Headerc                     || _         t        |      | _        t        |      | _        || _        || _        || _        || _        y)zA D-Bus message header

        It's not normally necessary to construct this directly: use higher level
        functions and methods instead.
        N)	rP   r#   message_typer+   flagsprotocol_versionr   serialr   )r   rP   r  r  r  r   r  r   s           r   rK   zHeader.__init__  sB     %'5 '
 0&r   c           	          dj                  | j                  | j                  | j                  | j                  | j
                  | j                  | j                        S )Nz7Header({!r}, {!r}, {!r}, {!r}, {!r}, {!r}, fields={!r}))r[   rP   r  r  r  r   r  r   r   s    r   r\   zHeader.__repr__  sI    HOOOOT..

!!4#3#3T[[$++O 	Or   Nc           	      d   | j                   j                         dz   }|| j                  }t        j                  || j                   j                         | j                  j                  | j                  | j                  | j                  |      t        | j                  | j                         z   S )NcBBBII)rP   r   r  rM   rW   r    r  r   r  r  r   r   r   )r   r  r   s      r   rY   zHeader.serialise  s    OO'')H4>[[F{{1doo779,,22DJJ00++V5 *$++tG	H 	Hr   c           	          t        j                  d|d d       \  }}}}t        |   }t        j                  |j                         dz   |dd       \  }}t	        ||      \  }}	 | |||||||      |	fS )NcBBBr%   IIr   )rM   rN   r   r   r   )
clsrO   r   msgtyper  pvbodylenr  r   rA   s
             r   from_bufferzHeader.from_buffer  s    %+]]63r7%C"F# --(:(:(<t(CS2YO)#v667E2wGLLr   rH   )r
   r   r   rK   r\   rY   classmethodr  r   r   r   r   r     s)    O
H M Mr   r   c                   F    e Zd ZdZd Zd Zed	dedd fd       Zd
defdZ	y)MessagezObject representing a DBus message.

    It's not normally necessary to construct this directly: use higher level
    functions and methods instead.
    c                      || _         || _        y rH   )headerbody)r   r  r  s      r   rK   zMessage.__init__  s    	r   c                 v    dj                  t        |       j                  | j                  | j                        S )Nz{}({!r}, {!r}))r[   r^   r
   r  r  r   s    r   r\   zMessage.__repr__  s)    &&tDz':':DKKSSr   rO   returnc                    t         j                  |      \  }}|j                  j                  t        j
                  d      }|t        |      kD  rt        d| dt        |       d      |d | }d}t        j                  |j                  v rV|j                  t        j                     }t        t        d|z              }|j                  |||j                  |      d   }t        ||      S )Nr   zMessage expects z FDs, but only z were receivedr   (%s)r   )r   r  r   getr0   r>   r   r   r=   r   r   rT   rP   r  )	r  rO   rQ   r  rA   n_fdsr  r   	body_types	            r   r  zMessage.from_buffer  s    ((-!!,"7"7;3s8"5'S
.Q  &5k!!V]]2-- 6 67C'Vc\(:;I''S&2C2C'MaPDvt$$r   Nc                 J   | j                   j                  }t        j                  | j                   j                  v r^| j                   j                  t        j                     }t        t        d|z              }|j                  | j                  d||      }nd}t        |      | j                   _
        |r0t        |      | j                   j                  t        j                  <   | j                   j                  |      }dt        t        |      d      z  }||z   |z   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  rV   r4   )r  rP   r0   r=   r   r   r   rY   r  r   r   r>   rD   )	r   r  rQ   r   r   r  body_buf
header_bufrC   s	            r   rY   zMessage.serialise  s     ''!!T[[%7%77++$$\%;%;<C'Vc\(:;I **499aS*IHH"%h-8;CDKK|445[[**&*9
ws:22C(**r   rb   )NN)
r
   r   r   r   rK   r\   r  r   r  rY   r   r   r   r  r    s@    
T %e %	 % %+% +r   r  c                   B    e Zd ZdZd Zd
defdZd Zd Zde	e
   fdZy	)Parserz8Parse DBus messages from a stream of incoming data.
    c                 >    t               | _        g | _        d | _        y rH   )
BufferPiperO   rQ   next_msg_sizer   s    r   rK   zParser.__init__  s    <!r   rX   c                 p    | j                   j                  |       | j                  j                  |       y)z)Provide newly received data to the parserN)rO   writerQ   extend)r   rX   rQ   s      r   add_datazParser.add_data  s"    tr   c                 b    | j                  |       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   rX   s     r   feedzParser.feed  s(    
 	dD..566r   c                     | j                   j                  }|dk  rd|z
  S | j                  )t        | j                   j	                  d            | _        | j                  |z
  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   )rO   bytes_bufferedr%  r   peek)r   gots     r   bytes_desiredzParser.bytes_desired  sZ     hh%%88O%!.txx}}R/@!AD!!C''r   r  c                 
   | j                   B| j                  j                  dk\  r)t        | j                  j	                  d            | _         | j                   }|| j                  j                  |k\  r| j                  j                  |      }t        j                  || j                        }d| _         |j                  j                  j                  t        j                  d      }| j                  |d | _        |S yy)zqParse one message, if there is enough data.

        Returns None if it doesn't have a complete message.
        Nr   r   r   )r%  rO   r/  r   r0  readr  r  rQ   r  r   r  r0   r>   )r   nmsraw_msgmsgfds_consumeds        r   r,  zParser.get_next_message	  s    
 %xx&&",%2488==3D%E"  O!8!8C!?hhmmC(G%%g488%<C!%D::,,001F1FJLxx.DHJ "@Or   Nrb   )r
   r   r   r   rK   r   r)  r-  r2  r   r  r,  r   r   r   r"  r"    s3    "
U 
7((7"3 r   r"  c                   Z    e Zd ZdZd ZdefdZdefdZdedefdZ	defd	Z
dedefd
Zy)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                 0    t               | _        d| _        y r@   )r   r   r/  r   s    r   rK   zBufferPipe.__init__!  s    gr   r   c                 v    | j                   j                  |       | xj                  t        |      z  c_        y rH   )r   r   r/  r   )r   r   s     r   r'  zBufferPipe.write%  s)    1s1v%r   nbytesc              #      K   || j                   k  sJ | j                  D ]   }|d | }|t        |      z  }| |dk  s  y  y wr@   )r/  r   r   )r   r<  chunks      r   
_peek_iterzBufferPipe._peek_iter)  sU     ,,,,,[[ 	E'6NEc%j FK{	s   =A Ar  c                 B    dj                  | j                  |            S )z=Get exactly nbytes bytes from the front without removing themr   )r   r?  r   r<  s     r   r0  zBufferPipe.peek2      xx/00r   c              #   v  K   || j                   k  sJ 	 | j                  j                         }| xj                   t        |      z  c_         |t        |      k  rn|t        |      z  }| Z|d | ||d  }}|r9| j                  j	                  |       | xj                   t        |      z  c_         | y wrH   )r/  r   popleftr   
appendleft)r   r<  r>  rems       r   
_read_iterzBufferPipe._read_iter6  s     ,,,,,KK'')E3u:-U#c%j FK  7F^U67^sKK""3'3s8+s   B7B9c                 B    dj                  | j                  |            S )z1Take & return exactly nbytes bytes from the frontr   )r   rG  rA  s     r   r4  zBufferPipe.readG  rB  r   N)r
   r   r   r   rK   r   r'  r   r?  r0  rG  r4  r   r   r   r$  r$    sV    
 &u & 13 15 1 "13 15 1r   r$  )'collectionsr   enumr   r   r   rM   typingr   r   r	   r   r   r!   r   r#   r+   r0   rD   rF   rd   rw   r   r   updater   r   r   r   r   r   r   r   r   r   r   r  r"  r$  r   r   r   <module>rM     s    ' '  	Z 	= = %%Z^^<
$ (' (	7 	< <0&i &-Y -@ 
1c		1c		1c			1c		1c		1c		1c		1c			; ;<   	L%	&	L%	&	L%	& #M #ML	! 	!CL CLL& &4#6= FL$5wy#ABC 8 








 <
%M %MP7+ 7+t2 2j.1 .1r   