
    &h#                     V   S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrS r	SR                  S5      r\R                  " 5       S:X  aY  S r
S r SSKrSS	KJr  \R"                  R$                  r\R"                  R$                  R&                  rSS
 jrSS jrS rSSKrOSSKJrJrJr  SSK r SSK!r!\RD                  r" " S S\RF                  5      r#SS jr$ " S S\RJ                  5      r&\'S:X  a  \RP                  " 5         gg! \ a    SSKJrJr  SSKJr  SSKJr   Nf = f)zR

Modification of http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440554

    Nc                  2    [         R                  " 5       S   $ N   )sysexc_info     Y/var/www/auris/envauris/lib/python3.13/site-packages/pygame/tests/test_utils/async_sub.pygeterrorr      s    <<>!r	    asciiWindowsc                 $    U R                  S5      $ Nr   )encode)ss    r
   r   r          xx  r	   c                 $    U R                  S5      $ r   )decode)bs    r
   r   r      r   r	   )DWORDc                 L   [        5       n[        R                  R                  R	                  U [        R
                  " [        U5      5      [        U5      [        R                  " U5      U5      n[        R                  R                  R                  5       UR                  4$ N)r   ctypeswindllkernel32	WriteFilecreate_string_bufferr   lenbyrefGetLastErrorvalue)handledataol	c_writtensuccesss        r
   r   r   )   sr    Imm,,66++F4L9D	Y'G ==))668)//IIr	   c                 f   [        5       n[        R                  " US-   5      n[        R                  R                  R                  XU[        R                  " U5      U5      n[        XCR                  '   [        R                  R                  R                  5       [        UR                  5      4$ r   )r   r   r   r   r   ReadFiler    	null_byter"   r!   r   )r#   desired_bytesr%   c_readbufferr'   s         r
   r)   r)   4   s    WF001BCFmm,,55v||F/CRG $-F<< ==))668&:NNNr	   c           
         [        5       n[        5       nUS:  a  [        5       n[        R                  " US-   5      n[        R                  R                  R                  U UU[        R                  " U5      [        R                  " U5      [        R                  " U5      5      n[        XTR                  '   [        UR                  5      UR                  UR                  4$ [        R                  R                  R                  U S US [        R                  " U5      [        R                  " U5      5      nSUR                  UR                  4$ )Nr   r    )
r   r   r   r   r   PeekNamedPiper    r*   r"   r   )r#   r+   c_avail	c_messager,   r-   r'   s          r
   r0   r0   =   s    gGIq 44]Q5FG --00>>!LL(LL)LL+ (1||$fll+W]]IOOKK --00>>!LL)LL+ 7==)//99r	   )r)   r   )r0   )TerminateProcess)SIGINTSIGTERMSIGKILLc                       \ rS rSrSS jrSS jrSS jrSS jrS rS r	S	 r
\R                  " 5       S
:X  a  S rS rS rSrgS rS rS rSrg)Popenj   Nc                 &    U R                  SU5      $ )Nstdout_recvselfmaxsizes     r
   recv
Popen.recvk       zz(G,,r	   c                 &    U R                  SU5      $ )Nstderrr<   r>   s     r
   recv_errPopen.recv_errn   rC   r	   c                 f    U R                  U5      U R                  U5      U R                  U5      4$ r   )sendrA   rF   )r?   inputr@   s      r
   	send_recvPopen.send_recvq   s*    yy7!3T]]75KKKr	   c                    US:  a  Sn[         R                   " 5       U-   n/ nSnU R                  nU(       a  U R                  n[         R                   " 5       U:  d  U(       a  U" 5       nUc  U(       a  [        S5      eOvU(       a  UR	                  U5        O9[         R
                  " [        U[         R                   " 5       -
  U-  S5      5        [         R                   " 5       U:  a  M  U(       a  M  SR                  U5      $ )Nr   r/   Other end disconnected!r   )timerA   rF   	Exceptionappendsleepmaxjoin)	r?   waitetrrE   xyrprs	            r
   
read_asyncPopen.read_asynct   s    6BIIK$YYBiikAoAy#$=>>

3DIIK25q9: iikAo wwqzr	   c                     [        U5      (       a=  U R                  U5      nUc  [        S5      e[        X5      n[        U5      (       a  M<  g g )NrN   )r   rI   rP   
memoryview)r?   r$   sents      r
   send_allPopen.send_all   s>    $ii99T?D| 9::d)D	 $iir	   c                 8    Uc  SnOUS:  a  Sn[        X5      U4$ )Ni   r   )getattr)r?   whichr@   s      r
   get_conn_maxsizePopen.get_conn_maxsize   s(    ?Gq[Gt#W,,r	   c                 N    [        X5      R                  5         [        XS 5        g r   )rd   closesetattr)r?   re   s     r
   _closePopen._close   s    ""$T"r	   r   c                 B    [        [        U R                  5      S5        g)zkill function for Win32r   N)r3   int_handle)r?   s    r
   kill
Popen.kill   s     S.2r	   c                    U R                   (       d  g  [        R                  " U R                   R                  5       5      n[	        X!5      u  p4U$ ! [
         a    U R                  S5      s $ [        R                  R                  [        4 a6    [        5       S   S[        R                  4;   a  U R                  S5      s $ e f = f)Nstdinr   m   )rs   msvcrtget_osfhandlefilenor   
ValueErrorrk   
subprocess
pywintypeserrorrP   r   errno	ESHUTDOWN)r?   rJ   rX   errCodewrittens        r
   rI   
Popen.send   s    ::(():):)<=%.q%8" N  ,{{7++))//; :a=S%//$::;;w//s   ;A C.ACCc                 *   U R                  X5      u  p2Uc  g  [        R                  " UR                  5       5      n[	        US5      u  pVnX&:  a  UnUS:  a  [        XFS 5      u  pU R                  (       a"  UR!                  SS5      R!                  SS5      nU$ ! [         a    U R                  U5      s $ [        R                  R                  [        4 a6    [        5       S   S[        R                  4;   a  U R                  U5      s $ e f = f)Nr   rt   

)rf   ru   rv   rw   r0   r)   rx   rk   ry   rz   r{   rP   r   r|   r}   universal_newlinesreplace)	r?   re   r@   connrX   readnAvailnMessager~   s	            r
   r=   Popen._recv   s     11%AMD|((7+8A+>(x#$FA:&.q$&?OW && ||FD199$EK  *{{5))))//; :a=S%//$::;;u--s   AB D9ADDc                 N   [        [        [        /S-  5       H  u  pUS-  S:X  a!  [        R                  " U R
                  U5        [        R                  " XS-  -  S-  S-   5        [        R                  " U R
                  [        R                  5      u  p4US:w  d  M    g    g )N   r   g      @g{Gz?)
	enumerater5   r6   osrp   pidrO   rR   waitpidWNOHANG)r?   isig
killed_pidstats        r
   rp   rq      s{    #Wg$6$:;q5A:GGDHHc*

AQK#-56#%::dhh

#C 
? <r	   c                 f   U R                   (       d  g [        R                  " / U R                   // S5      S   (       d  g [        R                  " U R                   R	                  5       U5      nU$ ! [
         a4    [        5       S   [        R                  :X  a  U R                  S5      s $ e f = f)Nr   r   rs   )
rs   selectr   writerw   OSErrorr   r|   EPIPErk   )r?   rJ   r   s      r
   rI   r      s    ::==djj\2q9!<((4::#4#4#6> N  :a=EKK/;;w//s   /A2 2:B0.B0c                 2   U R                  X5      u  p2Uc  g [        R                  " U// / S5      S   (       d  gUR                  U5      nU(       d  U R                  U5      $ U R                  (       a"  UR                  SS5      R                  SS5      nU$ )Nr   r/   r   r   r   )rf   r   r   rk   r   r   )r?   re   r@   r   rZ   s        r
   r=   r      s     11%AMD|==$R3A6		'"A{{5))&&IIfd+33D$?Hr	   r   r   )r/   N)皙?r      r   )__name__
__module____qualname____firstlineno__rA   rF   rK   r\   ra   rf   rk   platformsystemrp   rI   r=   __static_attributes__r   r	   r
   r8   r8   j   sU    --L,*-# I%	3	 	6		 	r	   r8   c           
         [        U UU[        R                  [        R                  [        R                  SS9nS n/ n[        R                  " 5       nUc`  [        R                  " 5       U-
  U:  aD  UR                  5       nXdR                  SSS9/-  nUc  [        R                  " 5       U-
  U:  a  MD  Uc  SU S3n UR                  5         US-  nUSR                  U5      4$ ! [         a    US	[        5        S
3-  n N0f = f)Nr   )cwdenvrs   r;   rE   r   r   r   )rU   rV   z"Process timed out (time_out = z secs) z and was successfully terminated"z#and termination failed (exception: z)"r/   )r8   ry   PIPESTDOUTrO   pollr\   rp   rP   r   rT   )cmdtime_outwdr   procret_coderesponsets           r
   proc_in_time_or_killr      s   oo  D HH		A

qH <99;__#_344 
qH < 4XJgF	MIIK::H RWWX&&&  	M=hj\LLH	Ms    C( (DDc                       \ rS rSrS rSrg)	AsyncTesti   c                     [        [        R                  SS/SS9u  pU R                  SU5        U R                  SU5        g )Nz-czwhile True: passr   )r   zrocess timed outzsuccessfully terminated)r   r   
executableassertIn)r?   r   r   s      r
   test_proc_in_time_or_kill#AsyncTest.test_proc_in_time_or_kill!  s@    1^^T#56
 	((3/:r	   r   N)r   r   r   r   r   r   r   r	   r
   r   r      s    ;r	   r   __main__r   )NN))__doc__r   r   ry   r|   rO   r   unittesttempfiler   r   r*   r   r   r   ctypes.wintypesr   r   r   r3   r   r)   r0   ImportError	win32file	win32pipewin32apiru   signalr4   r5   r6   r   fcntlr   r8   r   TestCaser   r   mainr   r	   r
   <module>r      s   
     
   MM'"	??	!!!9.)==))!==11BB		J	O	:>  0/ 
OJ Oj'B;!! ; zMMO i  .1+-.s   AD D('D(