
    k7iM                     H   S SK r S SKrS SKJr  S SKJrJrJr  S SKJ	r	   " S S\
5      r " S S\5      r\R                  \R                  S	.r " S
 S\5      r " S S\5      r " S S\5      rS r " S S5      r " S S\5      r " S S\5      r\" SS5      \" SS5      \" SS5      \" 5       \" SS5      \" SS5      \" SS 5      \" SS!5      \" SS"5      \" 5       S#.
r " S$ S%5      r " S& S'\5      r\R5                  \" \S(   5      \" 5       \" \S)   5      S*.5         " S+ S,5      r " S- S.\5      r " S/ S05      r " S1 S25      rS3 rS4 r \" \" \S)   \" 5       /5      5      r!S5 r"S6S7S7S7S(S7S7S8S(S9.	r#S: r$ " S; S<5      r% " S= S>5      r& " S? S@5      r' " SA SB5      r(g)C    N)deque)EnumIntEnumIntFlag)Optionalc                       \ rS rSrSrSrg)SizeLimitError   zRaised 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____firstlineno____doc____static_attributes__r       K/home/james-whalen/.local/lib/python3.13/site-packages/jeepney/low_level.pyr	   r	      s    
 	r   r	   c                   (    \ rS rSrSrSrS rS rSrg)
Endianness         c                 0    U [         R                  L a  S$ S$ )N<>r   littleselfs    r   struct_codeEndianness.struct_code   s    z000s:s:r   c                 0    U [         R                  L a  S$ S$ )N   l   Br   r   s    r   	dbus_codeEndianness.dbus_code   s    
 1 11t<<r   r   N)	r   r   r   r   r   bigr    r%   r   r   r   r   r   r      s    F
C;=r   r   )r#   r$   c                   $    \ rS rSrSrSrSrSrSrg)MessageType   r   r         r   N)	r   r   r   r   method_callmethod_returnerrorsignalr   r   r   r   r)   r)      s    KMEFr   r)   c                        \ rS rSrSrSrSrSrg)MessageFlag$   r   r   r,   r   N)r   r   r   r   no_reply_expectedno_auto_startallow_interactive_authorizationr   r   r   r   r2   r2   $   s    M&'#r   r2   c                   8    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrg)HeaderFields*   r   r   r+   r,         r
      	   r   N)r   r   r   r   path	interfacemember
error_namereply_serialdestinationsender	signatureunix_fdsr   r   r   r   r8   r8   *   s/    DIFJLKFIHr   r8   c                      XU-  -
  nX!:X  a  gU$ Nr   r   )possteppads      r   paddingrL   6   s    
*
C
{Jr   c                   :    \ rS rSrS rS	S jrS
S jrS rS rSr	g)	FixedType=   c                 ,    U=U l         U l        X l        g N)size	alignmentr    )r   rR   r    s      r   __init__FixedType.__init__>   s    %))	DN&r   c                     U[        X R                  5      -  nUR                  5       U R                  -   n[        R                  " XQX"U R
                  -    5      S   nXbU R
                  -   4$ rH   )rL   rS   r    structunpackrR   )r   bufrI   
endiannessfdscodevals          r   
parse_dataFixedType.parse_dataB   s_    wsNN++%%'$*:*::mmDc		/":;A>$))O##r   Nc                     S[        X R                  5      -  nUR                  5       U R                  -   nU[        R                  " Xa5      -   $ )N    )rL   rS   r    rW   pack)r   datarI   rZ   r[   rK   r\   s          r   	serialiseFixedType.serialiseH   sB    gc>>22%%'$*:*::V[[,,,r   c                 N    SR                  U R                  U R                  5      $ )NzFixedType({!r}, {!r}))formatrR   r    r   s    r   __repr__FixedType.__repr__M   s    &--dii9I9IJJr   c                     [        U5      [        L =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ rQ   )typerN   rR   r    r   others     r   __eq__FixedType.__eq__P   s@    Uy( <tyyEJJ/F <%%):)::	<r   )rS   rR   r    r   rQ   )
r   r   r   r   rT   r^   rd   rh   rn   r   r   r   r   rN   rN   =   s    '$-
K<r   rN   c                   D   ^  \ rS rSrU 4S jrSU 4S jjrS rS rSrU =r	$ )BooleanU   c                 &   > [         TU ]  SS5        g Nr,   IsuperrT   r   	__class__s    r   rT   Boolean.__init__V       C r   r   c                 B   > [         TU ]  XU5      u  pV[        U5      U4$ rQ   )rx   r^   bool)r   rY   rI   rZ   r[   r]   new_posrz   s          r   r^   Boolean.parse_dataY   s%    w)#J?Cy'!!r   c                     g)Nz	Boolean()r   r   s    r   rh   Boolean.__repr__]       r   c                 $    [        U5      [        L $ rQ   )rk   rr   rl   s     r   rn   Boolean.__eq__`       E{g%%r   rp   )
r   r   r   r   rT   r^   rh   rn   r   __classcell__rz   s   @r   rr   rr   U   s    !"& &r   rr   c                   T   ^  \ rS rSrU 4S jrSU 4S jjrS	U 4S jjrS rS rSr	U =r
$ )
FileDescriptord   c                 &   > [         TU ]  SS5        g ru   rw   ry   s    r   rT   FileDescriptor.__init__e   r|   r   r   c                 4   > [         TU ]  XU5      u  pVXE   U4$ rQ   )rx   r^   )r   rY   rI   rZ   r[   idxr   rz   s          r   r^   FileDescriptor.parse_datah   s#    w)#J?x  r   c                 P  > Uc  [        S5      e[        US5      (       a  UR                  5       n[        U[        5      (       d  [        U[
        5      (       d  [        S5      eUS:  a  [        SU S35      eUR                  U5        [        TU ])  [        U5      S-
  X#5      $ )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   
isinstancer~   int	TypeError
ValueErrorappendrx   rd   len)r   rc   rI   rZ   r[   rz   s        r   rd   FileDescriptor.serialisel   s    ;LMM4"";;=DdD!!D#)>)> G H H !8B4&JKK

4w SAs??r   c                     g)NzFileDescriptor()r   r   s    r   rh   FileDescriptor.__repr__|   s    !r   c                 $    [        U5      [        L $ rQ   )rk   r   rl   s     r   rn   FileDescriptor.__eq__   s    E{n,,r   rp   rQ   )r   r   r   r   rT   r^   rd   rh   rn   r   r   r   s   @r   r   r   d   s"    !!@ "- -r   r   r   Br   hHr,   irv   r<   qQd)
ynr   br   uxtr   r   c                   P    \ rS rSrS r\S 5       rSS jrS rSS jr	S r
S	 rS
rg)
StringType   c                     Xl         g rQ   length_type)r   r   s     r   rT   StringType.__init__   s    &r   c                 .    U R                   R                  $ rQ   )r   rR   r   s    r   rS   StringType.alignment   s    $$$r   c                     U R                   R                  XU5      u  pRX%-   nXU R                  S5      nXUS-    S:X  d   eXvS-   4$ )Nutf-8r   ra   )r   r^   decode)r   rY   rI   rZ   r[   lengthendr]   s           r   r^   StringType.parse_data   sZ    &&11#JGlcl!!'*sQw5(((!G|r   c                 b    [        U[        5      (       d  [        SR                  U5      5      eg )NzExpected str, not {!r})r   strr   rg   r   rc   s     r   
check_dataStringType.check_data   s+    $$$4;;DABB %r   Nc                     U R                  U5        UR                  S5      nU R                  R                  [	        U5      X#5      nXe-   S-   $ )Nr   ra   )r   encoder   rd   r   )r   rc   rI   rZ   r[   encodedlen_datas          r   rd   StringType.serialise   sF    ++g&##--c'lCL!E))r   c                 8    SR                  U R                  5      $ )NzStringType({!r}))rg   r   r   s    r   rh   StringType.__repr__   s    !(()9)9::r   c                 d    [        U5      [        L =(       a    U R                  UR                  :H  $ rQ   )rk   r   r   rl   s     r   rn   StringType.__eq__   s,    Uz) ;$$(9(99	;r   r   rp   rQ   )r   r   r   r   rT   propertyrS   r^   r   rd   rh   rn   r   r   r   r   r   r      s5    ' % %C*;;r   r   c                   4   ^  \ rS rSrU 4S jrU 4S jrSrU =r$ )ObjectPathType   c                 2   > [         TU ]  [        S   5        g )Nr   )rx   rT   simple_typesry   s    r   rT   ObjectPathType.__init__   s    c*+r   c                   >^ [         TU ]  U5        UR                  S5      (       d  [        SU< S35      eUR	                  S5      (       a  [        U5      S:  a  [        SU< S35      eSU;   a  [        SU< S35      e[        R                  [        R                  -   S-   m[        U4S	 jU 5       5      (       a  [        SU< S
35      eg )N/zObject path (z) must start with /r   z) cannot end with /z//z) cannot contain double /z/_c              3   ,   >#    U  H	  oT;  v   M     g 7frQ   r   ).0cvalid_charss     r   	<genexpr>,ObjectPathType.check_data.<locals>.<genexpr>   s     2T#Ts   z)) can only contain A-Z, a-z, 0-9, / and _)
rx   r   
startswithr   endswithr   stringascii_lettersdigitsany)r   rc   r   rz   s     @r   r   ObjectPathType.check_data   s    4 s##}TH4GHII==#d)a-}TH4GHII4<}TH4MNOO**V]]:TA2T222x'PQ  3r   r   )r   r   r   r   rT   r   r   r   r   s   @r   r   r      s    , r   r   r   r   )sogc                   >    \ rS rSrSrS rS
S jrSS jrS rS r	S	r
g)Struct   r<   c                 T    [        S U 5       5      (       a  [        S5      eXl        g )Nc              3   B   #    U  H  n[        U[        5      v   M     g 7frQ   )r   	DictEntry)r   fs     r   r   "Struct.__init__.<locals>.<genexpr>   s     8Az!Y''s   zFound dict entry outside array)r   r   fields)r   r   s     r   rT   Struct.__init__   s$    8888<==r   c                     U[        US5      -  n/ nU R                   H&  nUR                  XX4S9u  prUR                  U5        M(     [	        U5      U4$ )Nr<   r[   )rL   r   r^   r   tuple)r   rY   rI   rZ   r[   resfieldvs           r   r^   Struct.parse_data   sW    wsA[[E%%c
%DFAJJqM ! Sz3r   Nc           
      &   [        U[        5      (       d  [        SR                  U5      5      e[	        U5      [	        U R
                  5      :w  a7  [        SR                  [	        U5      [	        U R
                  5      5      5      eS[        X R                  5      -  nU[	        U5      -  n/ n[        XR
                  5       H5  u  pxUR                  UR                  XrX4S95        U[	        US   5      -  nM7     USR                  U5      -   $ )NzExpected tuple, not {!r}z{} entries for {} fieldsra   r   r   )r   r   r   rg   r   r   r   rL   rS   zipr   rd   join)	r   rc   rI   rZ   r[   rK   
res_piecesitemr   s	            r   rd   Struct.serialise   s    $&&6==dCDDt9DKK((7>>D	3t{{+   gc>>22s3x
t[[1KDeoodoMN3z"~&&C 2 SXXj)))r   c                 `    SR                  [        U 5      R                  U R                  5      $ )Nz{}({!r}))rg   rk   r   r   r   s    r   rh   Struct.__repr__   s#      d!4!4dkkBBr   c                 n    [        U5      [        U 5      L =(       a    U R                  UR                  :H  $ rQ   )rk   r   rl   s     r   rn   Struct.__eq__   s'    UtDz)Lu||0KLr   )r   rp   rQ   )r   r   r   r   rS   rT   r^   rd   rh   rn   r   r   r   r   r   r      s"    I
*CMr   r   c                   (   ^  \ rS rSrU 4S jrSrU =r$ )r      c                    > [        U5      S:w  a  [        S[        U5      -  5      e[        US   [        [        45      (       d&  [        SR                  [        US   5      5      5      e[        TU ]!  U5        g )Nr   z%Dict entry must have 2 fields, not %dr   z5First field in dict entry must be simple type, not {})	r   r   r   rN   r   rg   rk   rx   rT   )r   r   rz   s     r   rT   DictEntry.__init__   sq    v;!7#f+EG G&)i%<==GVAY(* * 	 r   r   )r   r   r   r   rT   r   r   r   s   @r   r   r      s    ! !r   r   c                   P    \ rS rSrSr\" SS5      rS rSS jrSS jr	S r
S	 rS
rg)Array   r,   rv   c                     Xl         g rQ   elt_type)r   r	  s     r   rT   Array.__init__  s     r   c                    U R                   R                  XU5      u  pRU[        X R                  R                  5      -  nX%-   nU R                  [
        S   :X  a  XU U4$ / nX&:  a4  U R                  R                  XX4S9u  pUR                  U5        X&:  a  M4  [        U R                  [        5      (       a  [        U5      nXr4$ )Nr   r   )
r   r^   rL   r	  rS   r   r   r   r   dict)	r   rY   rI   rZ   r[   r   r   r   r   s	            r   r^   Array.parse_data  s    &&11#JGwsMM3344l==L--3<$$i]]--c
-LFAJJqM i dmmY//s)Cxr   Nc           
         Sn[        U R                  [        5      (       a&  [        U[        5      (       a  UR	                  5       nO^U R                  [
        S   :X  a  [        U[        5      (       a  SnO/[        U[        5      (       d  [        SR                  U5      5      e[        U R                  [        5      (       a1  U R                  R                  [        U5      -  S:  a  [        S5      e[        X R                  5      nX&-   S-   n[        XpR                  R                  5      nU(       a  Un	OoXx-   n
U
S-   n/ nU HM  nUR!                  U R                  R#                  XX4S95        U
[        US	   5      -  n
X:  d  MD  [        S5      e   S
R%                  U5      n	U R&                  R#                  [        U	5      X&-   U5      nSU-  U-   SU-  -   U	-   $ )NFr   TzNot suitable for array: {!r}i   zArray size exceeds 64 MiB limitr,   r   r   r   ra   )r   r	  r   r  itemsr   byteslistr   rg   rN   rR   r   r	   rL   rS   r   rd   r   r   )r   rc   rI   rZ   r[   data_is_bytespad1pos_after_lengthpad2rY   data_pos	limit_poschunksr   r   s                  r   rd   Array.serialise  s   dmmY//JtT4J4J::<Dmm|C00ju6M6M MD$'':AA$GHH dmmY//""SY.%7$%FGGsNN+:>')@)@AC'.H 7*IFdmm55J 6   Cr
O+'()JKK  ((6"C##--c#h*M (EDL9C??r   c                 8    SR                  U R                  5      $ )NzArray({!r}))rg   r	  r   s    r   rh   Array.__repr__<  s    ##DMM22r   c                 d    [        U5      [        L =(       a    U R                  UR                  :H  $ rQ   )rk   r  r	  rl   s     r   rn   Array.__eq__?  s#    Uu$K4==ENN+JKr   r  rp   rQ   )r   r   r   r   rS   rN   r   rT   r^   rd   rh   rn   r   r   r   r   r  r     s/    IAs#K!$$@L3Lr   r  c                   8    \ rS rSrSrS	S jrS
S jrS rS rSr	g)VariantiC  r   r   c                     [         S   R                  XU5      u  pR[        [        U5      5      nUR                  XX4S9u  prXW4U4$ Nr   r   )r   r^   parse_signaturer  )r   rY   rI   rZ   r[   sigvaltyper]   s           r   r^   Variant.parse_dataF  sL    $//*E!$s),%%c
%Dz3r   Nc                     Uu  pQ[        [        U5      5      n[        S   R                  XRU5      nXvR                  X[	        U5      -   X4S9-   $ r!  )r"  r  r   rd   r   )r   rc   rI   rZ   r[   r#  r$  sig_bufs           r   rd   Variant.serialiseO  sY    	!$s),s#--c
C**G$j + 
 
 	
r   c                     g)Nz	Variant()r   r   s    r   rh   Variant.__repr__W  r   r   c                 $    [        U5      [        L $ rQ   )rk   r  rl   s     r   rn   Variant.__eq__Z  r   r   rp   rQ   )
r   r   r   r   rS   r^   rd   rh   rn   r   r   r   r   r  r  C  s    I
&r   r  c                    U R                  S5      nUS:X  a  [        [        U 5      5      $ US:X  a
  [        5       $ US:X  aL  / nU S   S:w  a%  UR	                  [        U 5      5        U S   S:w  a  M%  U R                  S5        [        U5      $ US:X  aL  / nU S   S:w  a%  UR	                  [        U 5      5        U S   S:w  a  M%  U R                  S5        [        U5      $ US;   a  [        S	5      e[        U   $ )
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"  ]  s     GGAJE|_S)**|y	#!fmMM/#./ !fm
f~	#!fmIIoc*+ !fm
}	$344E""r   c                 .   [         R                  " SU S S 5      u  n[        U   n[         R                  " UR                  5       S-   U SS 5      u  n[         R                  " UR                  5       S-   U SS 5      u  nSU-   nU[	        US5      -   U-   $ )Nr   r   rv   r,   r<         )rW   rX   
endian_mapr    rL   )rY   endianbody_lengthfields_array_len
header_lens        r   calc_msg_sizer=  x  s    mmCRa)GFF==!3!3!5!;S1XFLKf&8&8&:S&@#b*M&&J
A..<<r   c                     [         R                  U SU5      u  p#U VVs0 s H  u  pE[        U5      US   _M     snnU4$ s  snnf )Nr6  r   )_header_fields_typer^   r8   )rY   rZ   lrI   kr   s         r   parse_header_fieldsrB    sD     ++CZ@FA012fqLOQqT!2C772s   A r   r   r   )	r   r   r+   r,   r:   r;   r
   r<   r=   c                     [        U R                  5       5       VVs/ s H  u  p#UR                  [        U   U44PM     nnn[        R                  USU5      $ s  snnf )Nr6  )sortedr  valueheader_field_codesr?  rd   )r   rZ   r   r   r@  s        r   serialise_header_fieldsrG    sT    =CAGGI=NO=N6A!''&q)1-	.=NAO((B
;; 	Ps   #Ac                   :    \ rS rSrS rS rSS jr\S 5       rSr	g)	Headeri  c                     Xl         [        U5      U l        [        U5      U l        X@l        XPl        X`l        Xpl        g)zA D-Bus message header

It's not normally necessary to construct this directly: use higher level
functions and methods instead.
N)	rZ   r)   message_typer2   flagsprotocol_versionr:  serialr   )r   rZ   rK  rL  rM  r:  rN  r   s           r   rT   Header.__init__  s8     %'5 '
 0&r   c           	          SR                  U R                  U R                  U R                  U R                  U R
                  U R                  U R                  5      $ )Nz7Header({!r}, {!r}, {!r}, {!r}, {!r}, {!r}, fields={!r}))rg   rZ   rK  rL  rM  r:  rN  r   r   s    r   rh   Header.__repr__  sI    HOOOOT..

!!4#3#3T[[$++O 	Or   Nc           	      f   U R                   R                  5       S-   nUc  U R                  n[        R                  " X R                   R                  5       U R                  R                  U R                  U R                  U R                  U5      [        U R                  U R                   5      -   $ )NcBBBII)rZ   r    rN  rW   rb   r%   rK  rE  rL  rM  r:  rG  r   )r   rN  r   s      r   rd   Header.serialise  s    OO'')H4>[[F{{1oo779,,22DJJ00++V5 *$++tG	H 	Hr   c           	          [         R                  " SUS S 5      u  p#pE[        U   n[         R                  " UR                  5       S-   USS 5      u  pg[	        X5      u  pU " X#XEXgU5      U	4$ )NcBBBr,   IIr6  )rW   rX   r8  r    rB  )
clsrY   r9  msgtyperL  pvbodylenrN  r   rI   s
             r   from_bufferHeader.from_buffer  so    %+]]63r7%C"F# --(:(:(<t(CS2YO)#66EwGLLr   )r:  rZ   r   rL  rK  rM  rN  rQ   )
r   r   r   r   rT   rh   rd   classmethodr\  r   r   r   r   rI  rI    s)    O
H M Mr   rI  c                   V    \ rS rSrSrS rS r\SS\SS 4S jj5       r	SS\4S	 jjr
S
rg)Messagei  zObject representing a DBus message.

It's not normally necessary to construct this directly: use higher level
functions and methods instead.
c                     Xl         X l        g rQ   )headerbody)r   rb  rc  s      r   rT   Message.__init__  s    	r   c                 v    SR                  [        U 5      R                  U R                  U R                  5      $ )Nz{}({!r}, {!r}))rg   rk   r   rb  rc  r   s    r   rh   Message.__repr__  s)    &&tDz':':DKKSSr   rY   returnc                    [         R                  U5      u  p4UR                  R                  [        R
                  S5      nU[        U5      :  a  [        SU S[        U5       S35      eUS U nSn[        R                  UR                  ;   aR  UR                  [        R                     n[        [        SU-  5      5      nUR                  XUR                  US9S   n[        X65      $ )Nr   zMessage expects z FDs, but only z were receivedr   (%s)r   )rI  r\  r   getr8   rF   r   r   rE   r"  r  r^   rZ   r`  )	rX  rY   r[   rb  rI   n_fdsrc  r#  	body_types	            r   r\  Message.from_buffer  s    ((-!!,"7"7;3s8"5'S
.Q  &5k!!V]]2-- 6 67C'Vc\(:;I''&2C2C'MaPDv$$r   Nc                 H   U R                   R                  n[        R                  U R                   R                  ;   aZ  U R                   R                  [        R                     n[        [        SU-  5      5      nUR                  U R                  SX2S9nOSn[        U5      U R                   l
        U(       a0  [        U5      U R                   R                  [        R                  '   U R                   R                  US9nS[        [        U5      S5      -  nXx-   U-   $ )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.
ri  r   r   r   )rN  ra   r<   )rb  rZ   r8   rE   r   r"  r  rd   rc  r   r:  rF   rL   )	r   rN  r[   r9  r#  rl  body_buf
header_bufrK   s	            r   rd   Message.serialise  s     ''!!T[[%7%77++$$\%;%;<C'Vc\(:;I **499a*IHH"%h-8;CDKK|445[[**&*9
ws:22(**r   )rc  rb  rp   )NN)r   r   r   r   r   rT   rh   r^  r  r\  rd   r   r   r   r   r`  r`    sE    
T %e %	 % %+% + +r   r`  c                   P    \ rS rSrSrS rSS\4S jjrS rS r	S\
\   4S	 jrS
rg)Parseri  z8Parse DBus messages from a stream of incoming data.
    c                 >    [        5       U l        / U l        S U l        g rQ   )
BufferPiperY   r[   next_msg_sizer   s    r   rT   Parser.__init__   s    <!r   rc   c                 p    U R                   R                  U5        U R                  R                  U5        g)z)Provide newly received data to the parserN)rY   writer[   extend)r   rc   r[   s      r   add_dataParser.add_data  s"    tr   c                 b    U R                  U5        [        [        U R                  S5      5      $ )zXFeed the parser newly read data.

Returns a list of messages completed by the new data.
N)r{  r  iterget_next_messager   s     r   feedParser.feed
  s(    
 	dD..566r   c                     U R                   R                  nUS:  a  SU-
  $ U R                  c)  [        U R                   R	                  S5      5      U l        U R                  U-
  $ )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.
r7  )rY   bytes_bufferedrv  r=  peek)r   gots     r   bytes_desiredParser.bytes_desired  sZ     hh%%88O%!.txx}}R/@!AD!!C''r   rg  c                 
   U R                   cC  U R                  R                  S:  a)  [        U R                  R	                  S5      5      U l         U R                   nUb  U R                  R                  U:  a  U R                  R                  U5      n[        R                  X R                  S9nSU l         UR                  R                  R                  [        R                  S5      nU R                  US U l        U$ gg)zaParse one message, if there is enough data.

Returns None if it doesn't have a complete message.
Nr7  r   r   )rv  rY   r  r=  r  readr`  r\  r[   rb  r   rj  r8   rF   )r   nmsraw_msgmsgfds_consumeds        r   r  Parser.get_next_message   s    
 %xx&&",%2488==3D%E"  O!8!8C!?hhmmC(G%%g88%<C!%D::,,001F1FJLxx.DHJ "@Or   )rY   r[   rv  Nrp   )r   r   r   r   r   rT   r  r{  r  r  r   r`  r  r   r   r   r   rs  rs    s3    "
U 
7((7"3 r   rs  c                   l    \ rS rSrSrS rS\4S jrS\4S jr	S\S\4S	 jr
S\4S
 jrS\S\4S jrSrg)ru  i2  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    [        5       U l        SU l        g rH   )r   r  r  r   s    r   rT   BufferPipe.__init__8  s    gr   r   c                 v    U R                   R                  U5        U =R                  [        U5      -  sl        g rQ   )r  r   r  r   )r   r   s     r   ry  BufferPipe.write<  s)    1s1v%r   nbytesc              #      #    XR                   ::  d   eU R                   H"  nUS U nU[        U5      -  nUv   US::  d  M"    g    g 7frH   )r  r  r   )r   r  chunks      r   
_peek_iterBufferPipe._peek_iter@  sM     ,,,,,[[E'6NEc%j FK{ !s   <AArg  c                 B    SR                  U R                  U5      5      $ )z=Get exactly nbytes bytes from the front without removing themr   )r   r  r   r  s     r   r  BufferPipe.peekI      xx/00r   c              #     #    XR                   ::  d   e U R                  R                  5       nU =R                   [        U5      -  sl         U[        U5      ::  a  OU[        U5      -  nUv   M\  US U X!S  p2U(       a9  U R                  R	                  U5        U =R                   [        U5      -  sl         Uv   g 7frQ   )r  r  popleftr   
appendleft)r   r  r  rems       r   
_read_iterBufferPipe._read_iterM  s     ,,,,,KK'')E3u:-U#c%j FK  7F^U7^sKK""3'3s8+s   B<B>c                 B    SR                  U R                  U5      5      $ )z1Take & return exactly nbytes bytes from the frontr   )r   r  r  s     r   r  BufferPipe.read^  r  r   )r  r  N)r   r   r   r   r   rT   r  ry  r   r  r  r  r  r   r   r   r   ru  ru  2  sV    
 &u & 13 15 1 "13 15 1r   ru  ))r   rW   collectionsr   enumr   r   r   typingr   r   r	   r   r   r'   r8  r)   r2   r8   rL   rN   rr   r   r   r   r   updater   r   r  r  r"  r=  r?  rB  rF  rG  rI  r`  rs  ru  r   r   r   <module>r     s      ' ' 	Z 	= = %%Z^^<
$ (' (	7 	< <0&i &-Y -@ 
1c		1c		1c			1c		1c		1c		1c		1c			; ;BZ &   	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   