a
    ið3eœN  ã                   @   sú   d Z dgZddlZddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z	 dd	lm
Z
 dd
lmZ G dd„ de
je
jƒZG dd„ dee
jƒZG dd„ dee
jƒZG dd„ deƒZG dd„ deee
jƒZG dd„ deee
jƒZG dd„ dejƒZdS )z¦Event loop using a proactor and related classes.

A proactor is a "notify-on-completion" multiplexer.  Currently a
proactor is only implemented on Windows with IOCP.
ÚBaseProactorEventLoopé    Né   )Úbase_events)Ú	constants)Úfutures)Ússlproto)Ú
transports)Úloggerc                       sn   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Zej	dkrDdd„ Z
ddd„Zdd„ Zdd„ Zdd„ Z‡  ZS )Ú_ProactorBasePipeTransportz*Base class for pipe and socket transports.Nc                    s–   t ƒ  ||¡ |  |¡ || _|| _|| _d | _d | _d | _d| _	d| _
d| _d| _| jd urh| j ¡  | j | jj| ¡ |d ur’| j |jd ¡ d S )Nr   F)ÚsuperÚ__init__Ú
_set_extraÚ_sockÚ	_protocolÚ_serverÚ_bufferÚ	_read_futÚ
_write_futÚ_pending_writeÚ
_conn_lostÚ_closingÚ_eof_writtenZ_attachÚ_loopÚ	call_soonZconnection_madeZ_set_result_unless_cancelled©ÚselfÚloopÚsockÚprotocolÚwaiterÚextraÚserver©Ú	__class__© úJ/home/pi/bot/my_env/lib/python3.9/site-packages/asyncio/proactor_events.pyr      s"    


z#_ProactorBasePipeTransport.__init__c                 C   s¾   | j jg}| jd u r | d¡ n| jr0| d¡ | jd urN| d| j ¡  ¡ | jd urh| d| j ¡ | jd ur‚| d| j ¡ | jr t	| jƒ}| d| ¡ | j
r°| d¡ dd	 |¡ S )
NÚclosedÚclosingzfd=%szread=%szwrite=%rzwrite_bufsize=%szEOF writtenz<%s>ú )r#   Ú__name__r   Úappendr   Úfilenor   r   r   Úlenr   Újoin)r   ÚinfoÚbufsizer$   r$   r%   Ú__repr__.   s"    







z#_ProactorBasePipeTransport.__repr__c                 C   s   || j d< d S )NÚpipe)Ú_extra©r   r   r$   r$   r%   r   A   s    z%_ProactorBasePipeTransport._set_extrac                 C   s\   | j r
d S d| _ |  jd7  _| js>| jd u r>| j | jd ¡ | jd urX| j ¡  d | _d S )NTr   )	r   r   r   r   r   r   Ú_call_connection_lostr   Úcancel©r   r$   r$   r%   ÚcloseD   s    

z _ProactorBasePipeTransport.close)é   é   c                 C   s&   | j d ur"t d|  t¡ |  ¡  d S )Nzunclosed transport %r)r   ÚwarningsÚwarnÚResourceWarningr7   r6   r$   r$   r%   Ú__del__S   s    
z"_ProactorBasePipeTransport.__del__úFatal error on pipe transportc                 C   sR   t |ttfƒr,| j ¡ rDtjd| |dd n| j ||| | jdœ¡ |  	|¡ d S )Nz%r: %sT©Úexc_info)ÚmessageÚ	exceptionÚ	transportr   )
Ú
isinstanceÚBrokenPipeErrorÚConnectionResetErrorr   Ú	get_debugr	   ÚdebugÚcall_exception_handlerr   Ú_force_close)r   ÚexcrA   r$   r$   r%   Ú_fatal_errorX   s    
üz'_ProactorBasePipeTransport._fatal_errorc                 C   sj   | j r
d S d| _ |  jd7  _| jr4| j ¡  d | _| jrJ| j ¡  d | _d| _d | _| j | j	|¡ d S )NTr   r   )
r   r   r   r5   r   r   r   r   r   r4   )r   rK   r$   r$   r%   rJ   e   s    

z'_ProactorBasePipeTransport._force_closec              	   C   s¤   zV| j  |¡ W t| jdƒr*| j tj¡ | j ¡  d | _| j}|d ur | 	¡  d | _nHt| jdƒrr| j tj¡ | j ¡  d | _| j}|d urž| 	¡  d | _0 d S )NÚshutdown)
r   Zconnection_lostÚhasattrr   rM   ÚsocketÚ	SHUT_RDWRr7   r   Z_detach)r   rK   r!   r$   r$   r%   r4   t   s$    
ù
z0_ProactorBasePipeTransport._call_connection_lostc                 C   s"   | j }| jd ur|t| jƒ7 }|S ©N)r   r   r,   )r   Úsizer$   r$   r%   Úget_write_buffer_size…   s    
z0_ProactorBasePipeTransport.get_write_buffer_size)NNN)r>   )r)   Ú
__module__Ú__qualname__Ú__doc__r   r0   r   r7   ÚsysÚversion_infor=   rL   rJ   r4   rS   Ú__classcell__r$   r$   r"   r%   r
      s     ÿ

r
   c                       s<   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zdd	d
„Z‡  ZS )Ú_ProactorReadPipeTransportzTransport for read pipes.Nc                    s.   t ƒ  ||||||¡ d| _| j | j¡ d S ©NF)r   r   Ú_pausedr   r   Ú_loop_readingr   r"   r$   r%   r      s    z#_ProactorReadPipeTransport.__init__c                 C   s<   | j rtdƒ‚| jrtdƒ‚d| _| j ¡ r8t d| ¡ d S )Nz#Cannot pause_reading() when closingzAlready pausedTz%r pauses reading)r   ÚRuntimeErrorr\   r   rG   r	   rH   r6   r$   r$   r%   Úpause_reading–   s    
z(_ProactorReadPipeTransport.pause_readingc                 C   sJ   | j stdƒ‚d| _ | jrd S | j | j| j¡ | j ¡ rFt 	d| ¡ d S )Nz
Not pausedFz%r resumes reading)
r\   r^   r   r   r   r]   r   rG   r	   rH   r6   r$   r$   r%   Úresume_readingŸ   s    
z)_ProactorReadPipeTransport.resume_readingc              
   C   s”  | j r
d S d }z.zú|d urH| j|u s:| jd u r6| js:J ‚d | _| ¡ }| jr d }W W |rh| j |¡ n4|d urœ| j ¡ r†t 	d| ¡ | j 
¡ }|sœ|  ¡  d S |dkröW W |r¾| j |¡ n4|d urò| j ¡ rÜt 	d| ¡ | j 
¡ }|sò|  ¡  d S | jj | jd¡| _W nÒ tyb } z<| js4|  |d¡ n| j ¡ rNtj	ddd W Y d }~n”d }~0  ty } z|  |¡ W Y d }~nfd }~0  tyÀ } z|  |d¡ W Y d }~n6d }~0  tjyÞ   | jsÚ‚ Y n0 | j | j¡ W |r| j |¡ n:|d ur| j ¡ r&t 	d| ¡ | j 
¡ }|s|  ¡  nP|rT| j |¡ n:|d urŽ| j ¡ rvt 	d| ¡ | j 
¡ }|sŽ|  ¡  0 d S )Nz%r received EOFó    é   z"Fatal read error on pipe transportz*Read error on pipe transport while closingTr?   )r\   r   r   Úresultr   Zdata_receivedr   rG   r	   rH   Zeof_receivedr7   Ú	_proactorÚrecvr   ÚConnectionAbortedErrorrL   rF   rJ   ÚOSErrorr   ÚCancelledErrorÚadd_done_callbackr]   )r   ÚfutÚdataZ	keep_openrK   r$   r$   r%   r]   ©   s‚    ÿ

á

åÿ 


ù

z(_ProactorReadPipeTransport._loop_reading)NNN)N)	r)   rT   rU   rV   r   r_   r`   r]   rY   r$   r$   r"   r%   rZ   Œ   s     ÿ	
rZ   c                   @   s:   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ Zdd„ ZdS )Ú_ProactorBaseWritePipeTransportzTransport for write pipes.c                 C   s¾   t |tttfƒstdt|ƒƒ‚| jr,tdƒ‚|s4d S | jrb| jt	j
krPt d¡ |  jd7  _d S | jd u rŒ| jd u szJ ‚| jt|ƒd n.| js¦t|ƒ| _|  ¡  n| j |¡ |  ¡  d S )Nz#data argument must be byte-ish (%r)zwrite_eof() already calledzsocket.send() raised exception.r   )rk   )rD   ÚbytesÚ	bytearrayÚ
memoryviewÚ	TypeErrorÚtyper   r^   r   r   Z!LOG_THRESHOLD_FOR_CONNLOST_WRITESr	   Úwarningr   r   Ú_loop_writingÚ_maybe_pause_protocolÚextend)r   rk   r$   r$   r%   ÚwriteÞ   s*    ÿ



z%_ProactorBaseWritePipeTransport.writeNc              
   C   s8  zÒ|| j u sJ ‚d | _ d| _|r(| ¡  |d u r<| j}d | _|st| jrV| j | jd ¡ | jrj| j	 
tj¡ |  ¡  n\| jj | j	|¡| _ | j  ¡ sÂ| jdks J ‚t|ƒ| _| j  | j¡ |  ¡  n| j  | j¡ W n` ty } z|  |¡ W Y d }~n:d }~0  ty2 } z|  |d¡ W Y d }~n
d }~0 0 d S )Nr   z#Fatal write error on pipe transport)r   r   rc   r   r   r   r   r4   r   r   rM   rO   ÚSHUT_WRZ_maybe_resume_protocolrd   ÚsendÚdoner,   ri   rs   rt   rF   rJ   rg   rL   )r   Úfrk   rK   r$   r$   r%   rs     s4    



z-_ProactorBaseWritePipeTransport._loop_writingc                 C   s   dS ©NTr$   r6   r$   r$   r%   Úcan_write_eof$  s    z-_ProactorBaseWritePipeTransport.can_write_eofc                 C   s   |   ¡  d S rQ   )r7   r6   r$   r$   r%   Ú	write_eof'  s    z)_ProactorBaseWritePipeTransport.write_eofc                 C   s   |   d ¡ d S rQ   )rJ   r6   r$   r$   r%   Úabort*  s    z%_ProactorBaseWritePipeTransport.abort)NN)	r)   rT   rU   rV   rv   rs   r|   r}   r~   r$   r$   r$   r%   rl   Ú   s   #
#rl   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú_ProactorWritePipeTransportc                    s8   t ƒ j|i |¤Ž | jj | jd¡| _| j | j¡ d S )Né   )	r   r   r   rd   re   r   r   ri   Ú_pipe_closed)r   ÚargsÚkwr"   r$   r%   r   /  s    z$_ProactorWritePipeTransport.__init__c                 C   sv   |  ¡ rd S | ¡ dksJ ‚| jr4| jd u s0J ‚d S || ju sLJ || jfƒ‚d | _| jd urj|  tƒ ¡ n|  ¡  d S )Nra   )Z	cancelledrc   r   r   r   rJ   rE   r7   )r   rj   r$   r$   r%   r   4  s    
z(_ProactorWritePipeTransport._pipe_closed)r)   rT   rU   r   r   rY   r$   r$   r"   r%   r   .  s   r   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú_ProactorDuplexPipeTransportzTransport for duplex pipes.c                 C   s   dS r[   r$   r6   r$   r$   r%   r|   I  s    z*_ProactorDuplexPipeTransport.can_write_eofc                 C   s   t ‚d S rQ   ©ÚNotImplementedErrorr6   r$   r$   r%   r}   L  s    z&_ProactorDuplexPipeTransport.write_eofN)r)   rT   rU   rV   r|   r}   r$   r$   r$   r%   r„   D  s   r„   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú_ProactorSocketTransportz Transport for connected sockets.c              	   C   s¤   || j d< z| ¡ | j d< W n2 tjtfyN   | j ¡ rJtjd|dd Y n0 d| j vr z| 	¡ | j d< W n2 tjtfyž   | j ¡ rštjd|dd Y n0 d S )NrO   Zsocknamezgetsockname() failed on %rTr?   Úpeernamezgetpeername() failed on %r)
r2   ÚgetsocknamerO   ÚerrorÚAttributeErrorr   rG   r	   rr   Úgetpeernamer3   r$   r$   r%   r   U  s     

ÿ

ÿz#_ProactorSocketTransport._set_extrac                 C   s   dS r{   r$   r6   r$   r$   r%   r|   e  s    z&_ProactorSocketTransport.can_write_eofc                 C   s2   | j s| jrd S d| _| jd u r.| j tj¡ d S r{   )r   r   r   r   rM   rO   rw   r6   r$   r$   r%   r}   h  s
    
z"_ProactorSocketTransport.write_eofN)r)   rT   rU   rV   r   r|   r}   r$   r$   r$   r%   r‡   P  s   r‡   c                       sÒ   e Zd Z‡ fdd„Zd,dd„Zd-dddddœdd	„Zd.d
d„Zd/dd„Zd0dd„Z‡ fdd„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd1d d!„Zd"d#„ Zd2d$d%„Zd&d'„ Zd(d)„ Zd*d+„ Z‡  ZS )3r   c                    sH   t ƒ  ¡  t d|jj¡ || _|| _d | _i | _	| 
| ¡ |  ¡  d S )NzUsing proactor: %s)r   r   r	   rH   r#   r)   rd   Ú	_selectorÚ_self_reading_futureÚ_accept_futuresZset_loopÚ_make_self_pipe)r   Zproactorr"   r$   r%   r   r  s    

zBaseProactorEventLoop.__init__Nc                 C   s   t | |||||ƒS rQ   )r‡   )r   r   r   r   r    r!   r$   r$   r%   Ú_make_socket_transport|  s    
ÿz,BaseProactorEventLoop._make_socket_transportF)Úserver_sideÚserver_hostnamer    r!   c          
      C   s<   t  ¡ stdƒ‚t  | |||||¡}	t| ||	||d |	jS )NzOProactor event loop requires Python 3.5 or newer (ssl.MemoryBIO) to support SSL©r    r!   )r   Z_is_sslproto_availabler†   ZSSLProtocolr‡   Z_app_transport)
r   Zrawsockr   Ú
sslcontextr   r’   r“   r    r!   Zssl_protocolr$   r$   r%   Ú_make_ssl_transport  s    ÿÿz)BaseProactorEventLoop._make_ssl_transportc                 C   s   t | ||||ƒS rQ   )r„   ©r   r   r   r   r    r$   r$   r%   Ú_make_duplex_pipe_transport  s    ÿz1BaseProactorEventLoop._make_duplex_pipe_transportc                 C   s   t | ||||ƒS rQ   )rZ   r—   r$   r$   r%   Ú_make_read_pipe_transport”  s    z/BaseProactorEventLoop._make_read_pipe_transportc                 C   s   t | ||||ƒS rQ   )r   r—   r$   r$   r%   Ú_make_write_pipe_transport˜  s    ÿz0BaseProactorEventLoop._make_write_pipe_transportc                    sP   |   ¡ rtdƒ‚|  ¡ rd S |  ¡  |  ¡  | j ¡  d | _d | _tƒ  ¡  d S )Nz!Cannot close a running event loop)	Z
is_runningr^   Ú	is_closedÚ_stop_accept_futuresÚ_close_self_piperd   r7   r   r   r6   r"   r$   r%   r7   ž  s    
zBaseProactorEventLoop.closec                 C   s   | j  ||¡S rQ   )rd   re   )r   r   Únr$   r$   r%   Ú	sock_recv°  s    zBaseProactorEventLoop.sock_recvc                 C   s   | j  ||¡S rQ   )rd   rx   )r   r   rk   r$   r$   r%   Úsock_sendall³  s    z"BaseProactorEventLoop.sock_sendallc              
   C   sh   z| j rt ||¡ W n> tyT } z&tj| d}| |¡ |W  Y d }~S d }~0 0 | j ||¡S d S )N)r   )	Ú_debugr   Z_check_resolved_addressÚ
ValueErrorr   ZFutureZset_exceptionrd   Úconnect)r   r   ÚaddressÚerrrj   r$   r$   r%   Úsock_connect¶  s    
z"BaseProactorEventLoop.sock_connectc                 C   s   | j  |¡S rQ   )rd   Úacceptr3   r$   r$   r%   Úsock_acceptÁ  s    z!BaseProactorEventLoop.sock_acceptc                 C   s   t ‚d S rQ   r…   r6   r$   r$   r%   Ú_socketpairÄ  s    z!BaseProactorEventLoop._socketpairc                 C   sL   | j d ur| j  ¡  d | _ | j ¡  d | _| j ¡  d | _|  jd8  _d S )Nr   )rŽ   r5   Ú_ssockr7   Ú_csockÚ_internal_fdsr6   r$   r$   r%   r   Ç  s    



z&BaseProactorEventLoop._close_self_pipec                 C   sF   |   ¡ \| _| _| j d¡ | j d¡ |  jd7  _|  | j¡ d S )NFr   )r©   rª   r«   Úsetblockingr¬   r   Ú_loop_self_readingr6   r$   r$   r%   r   Ñ  s
    z%BaseProactorEventLoop._make_self_pipec              
   C   s†   z$|d ur|  ¡  | j | jd¡}W nJ tjy:   Y d S  tyn } z|  d|| dœ¡ W Y d }~nd }~0 0 || _| 	| j
¡ d S )Nrb   z.Error on reading from the event loop self pipe)rA   rB   r   )rc   rd   re   rª   r   rh   Ú	ExceptionrI   rŽ   ri   r®   )r   rz   rK   r$   r$   r%   r®   Ù  s    ýz(BaseProactorEventLoop._loop_self_readingc                 C   s   | j  d¡ d S )Nó    )r«   rx   r6   r$   r$   r%   Ú_write_to_selfë  s    z$BaseProactorEventLoop._write_to_selfc                    s&   d‡ ‡‡‡‡‡fdd„	‰ ˆ  ˆ ¡ d S )Nc              
      s$  zˆ| d url|   ¡ \}}ˆjr,t dˆ||¡ ˆƒ }ˆd urVˆj||ˆdd|iˆd nˆj||d|iˆd ˆ ¡ rzW d S ˆj ˆ¡} W n~ t	yê } zJˆ 
¡ dkrÀˆ d|ˆdœ¡ ˆ ¡  nˆjrÖtjd	ˆdd
 W Y d }~n>d }~0  tjy   ˆ ¡  Y n0 | ˆjˆ 
¡ < |  ˆ ¡ d S )Nz#%r got a new connection from %r: %rTrˆ   )r’   r    r!   r”   éÿÿÿÿzAccept failed on a socket)rA   rB   rO   zAccept failed on socket %rr?   )rc   r¡   r	   rH   r–   r‘   r›   rd   r§   rg   r+   rI   r7   r   rh   r   ri   )rz   ÚconnÚaddrr   rK   ©r   Úprotocol_factoryr   r!   r   r•   r$   r%   r   ñ  sH    ÿþþý
ÿz2BaseProactorEventLoop._start_serving.<locals>.loop)N)r   )r   r¶   r   r•   r!   r$   rµ   r%   Ú_start_servingî  s    $z$BaseProactorEventLoop._start_servingc                 C   s   d S rQ   r$   )r   Z
event_listr$   r$   r%   Ú_process_events  s    z%BaseProactorEventLoop._process_eventsc                 C   s&   | j  ¡ D ]}| ¡  q
| j  ¡  d S rQ   )r   Úvaluesr5   Úclear)r   Úfuturer$   r$   r%   rœ     s    
z*BaseProactorEventLoop._stop_accept_futuresc                 C   s    |   ¡  | j |¡ | ¡  d S rQ   )rœ   rd   Ú_stop_servingr7   r3   r$   r$   r%   r¼      s    z#BaseProactorEventLoop._stop_serving)NNN)N)NN)NN)NN)N)NN)r)   rT   rU   r   r‘   r–   r˜   r™   rš   r7   rŸ   r    r¦   r¨   r©   r   r   r®   r±   r·   r¸   rœ   r¼   rY   r$   r$   r"   r%   r   p  s@   
  ÿ
þ  ÿ
  ÿ
  ÿ


 ÿ
))rV   Ú__all__rO   rW   r:   Ú r   r   r   r   r   Úlogr	   Z_FlowControlMixinZBaseTransportr
   ZReadTransportrZ   ZWriteTransportrl   r   Ú	Transportr„   r‡   ZBaseEventLoopr   r$   r$   r$   r%   Ú<module>   s:   ÿwÿNÿTþþ 