U
    óåêf  ã                   @   s´   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Zd dl
Zd dlmZmZmZmZ eedƒrzejZnejZG dd„ deƒZG dd„ deƒZG dd	„ d	eƒZdS )
é    N)ÚBaseQuicStreamÚBaseQuicConnectionÚBaseQuicManagerÚQUIC_MAX_DATAGRAMÚPollSelectorc                       sX   e Zd Z‡ fdd„Zdd„ Zddd„Zdd	d
„Zdd„ Zdd„ Zdd„ Z	dd„ Z
‡  ZS )ÚSyncQuicStreamc                    s&   t ƒ  ||¡ t ¡ | _t ¡ | _d S ©N)ÚsuperÚ__init__Ú	threadingÚ	ConditionÚ_wake_upÚLockÚ_lock)ÚselfÚ
connectionÚ	stream_id©Ú	__class__© ú\/home/www/findmeahotel.co.uk/times_travel/venv/lib/python3.8/site-packages/dns/quic/_sync.pyr
      s    
zSyncQuicStream.__init__c              	   C   sf   |   |¡}| j& | j |¡r,W 5 Q R £ d S || _W 5 Q R X | j | j |¡ W 5 Q R X d| _q
d S )Nr   )Z_timeout_from_expirationr   Ú_bufferZhaveZ
_expectingr   Úwait)r   ÚamountÚ
expirationÚtimeoutr   r   r   Úwait_for#   s    
zSyncQuicStream.wait_forNc              
   C   st   |   |¡}|  d|¡ | j t d| j d¡¡\}W 5 Q R X |  ||¡ | j | j |¡W  5 Q R £ S Q R X d S )Né   z!H)Z_expiration_from_timeoutr   r   ÚstructÚunpackr   Úget)r   r   r   Úsizer   r   r   Úreceive.   s    
 zSyncQuicStream.receiveFc                 C   s    |   |¡}| j | j||¡ d S r   )Z_encapsulateÚ_connectionÚwriteZ
_stream_id)r   ÚdatagramÚis_endÚdatar   r   r   Úsend7   s    
zSyncQuicStream.sendc              	   C   s,   |   ||¡r(| j | j ¡  W 5 Q R X d S r   )Z_common_add_inputr   Únotify)r   r'   r&   r   r   r   Ú
_add_input;   s    zSyncQuicStream._add_inputc              	   C   s   | j  |  ¡  W 5 Q R X d S r   )r   Ú_close©r   r   r   r   Úclose@   s    zSyncQuicStream.closec                 C   s   | S r   r   r,   r   r   r   Ú	__enter__D   s    zSyncQuicStream.__enter__c              	   C   s(   |   ¡  | j | j ¡  W 5 Q R X dS ©NF)r-   r   r)   )r   Úexc_typeÚexc_valÚexc_tbr   r   r   Ú__exit__G   s    zSyncQuicStream.__exit__)N)F)Ú__name__Ú
__module__Ú__qualname__r
   r   r"   r(   r*   r-   r.   r3   Ú__classcell__r   r   r   r   r      s   
	
r   c                       sj   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zddd„Zdd„ Z	dd„ Z
‡ fdd„Zdd„ Z‡  ZS )ÚSyncQuicConnectionc                    sÈ   t ƒ  ||||||¡ t | jtjd¡| _| j | j¡ t ¡ \| _	| _
| j
 d¡ | j d¡ | jd k	rªz| j tj | j| j¡¡ W n  tk
r¨   | j ¡  ‚ Y nX t ¡ | _d | _t ¡ | _d S )Nr   F)r	   r
   ÚsocketZ_afÚ
SOCK_DGRAMÚ_socketÚconnectÚ_peerÚ
socketpairÚ_send_wakeupÚ_receive_wakeupÚsetblockingÚ_sourceÚbindÚdnsZinetZlow_level_address_tupleÚ	Exceptionr-   r   ÚEventÚ_handshake_completeÚ_worker_threadr   r   )r   r   ÚaddressÚportÚsourceÚsource_portÚmanagerr   r   r   r
   O   s"    
ÿ

zSyncQuicConnection.__init__c              	   C   sn   d}|dk rj|d7 }z| j  t¡}W n tk
r:   Y d S X | j  | j || jd t ¡ ¡ W 5 Q R X qd S )Nr   é
   é   )	r;   Úrecvr   ÚBlockingIOErrorr   r#   Zreceive_datagramr=   Útime)r   Úcountr%   r   r   r   Ú_readb   s    zSyncQuicConnection._readc                 C   s.   z| j  d¡ W q  tk
r&   Y d S X q d S )Né    )r@   rP   rQ   r,   r   r   r   Ú_drain_wakeupm   s    z SyncQuicConnection._drain_wakeupc           	   	   C   sÐ   t ƒ }| | jtj| j¡ | | jtj| j¡ | jsÌ|  	d¡\}}| 
|¡}|D ]\}}| ¡  qP| j  |  |¡ | j t ¡ ¡}W 5 Q R X |D ].\}}z| j |¡ W q’ tk
r¾   Y q’X q’|  ¡  q.d S r/   )Ú_selector_classÚregisterr;   Ú	selectorsÚ
EVENT_READrT   r@   rV   Ú_doneZ_get_timer_valuesÚselectr'   r   Z_handle_timerr#   Zdatagrams_to_sendrR   r(   rQ   Ú_handle_events)	r   Úselr   ÚintervalÚitemsÚkeyÚ_Z	datagramsr%   r   r   r   Ú_workert   s"    


zSyncQuicConnection._workerc              	   C   sÈ   | j  | j ¡ }W 5 Q R X |d kr(d S t|tjjjƒrn| j  | j 	|j
¡}W 5 Q R X |rÂ| |j|j¡ q t|tjjjƒrŠ| j ¡  q t|tjjjƒsªt|tjjjƒr | j  d| _W 5 Q R X q d S )NT)r   r#   Z
next_eventÚ
isinstanceÚaioquicZquicÚeventsZStreamDataReceivedÚ_streamsr    r   r*   r'   Z
end_streamZHandshakeCompletedrG   ÚsetZConnectionTerminatedZStreamResetr[   )r   ÚeventÚstreamr   r   r   r]   ˆ   s&     ÿþz!SyncQuicConnection._handle_eventsFc              	   C   s2   | j  | j |||¡ W 5 Q R X | j d¡ d S )Nó   )r   r#   Zsend_stream_datar?   r(   )r   rj   r'   r&   r   r   r   r$   ›   s    zSyncQuicConnection.writec                 C   s(   | j r
d S tj| jd| _| j ¡  d S )N)Útarget)Ú_closedr   ÚThreadrc   rH   Ústartr,   r   r   r   Úrun    s    zSyncQuicConnection.runc              	   C   s@   | j  ¡  | j& | j d¡}t| |ƒ}|| j|< W 5 Q R X |S r/   )rG   r   r   r#   Zget_next_available_stream_idr   rg   )r   r   rj   r   r   r   Úmake_stream¦   s    

zSyncQuicConnection.make_streamc              	      s"   | j  tƒ  |¡ W 5 Q R X d S r   )r   r	   Úclose_stream)r   r   r   r   r   rr   ®   s    zSyncQuicConnection.close_streamc              	   C   sj   | j P | jrW 5 Q R £ d S | j | jd | jd ¡ d| _| j ¡  | j d¡ W 5 Q R X | j	 
¡  d S )Nr   rO   Trk   )r   rm   Ú_managerÚclosedr=   r#   r-   r?   r(   rH   Újoinr,   r   r   r   r-   ²   s    
zSyncQuicConnection.close)F)r4   r5   r6   r
   rT   rV   rc   r]   r$   rp   rq   rr   r-   r7   r   r   r   r   r8   N   s   
r8   c                       sJ   e Zd Zdejf‡ fdd„	Zddd„Z‡ fdd	„Zd
d„ Zdd„ Z	‡  Z
S )ÚSyncQuicManagerNc                    s   t ƒ  ||t¡ t ¡ | _d S r   )r	   r
   r8   r   r   r   )r   ÚconfÚverify_moder   r   r   r
   ¾   s    zSyncQuicManager.__init__éU  r   c              
   C   sB   | j 2 |  ||||¡\}}|r(| ¡  |W  5 Q R £ S Q R X d S r   )r   Ú_connectrp   )r   rI   rJ   rK   rL   r   ro   r   r   r   r<   Â   s
    zSyncQuicManager.connectc              	      s$   | j  tƒ  ||¡ W 5 Q R X d S r   )r   r	   rt   )r   rI   rJ   r   r   r   rt   É   s    zSyncQuicManager.closedc                 C   s   | S r   r   r,   r   r   r   r.   Í   s    zSyncQuicManager.__enter__c                 C   s$   t | j ¡ ƒ}|D ]}| ¡  qdS r/   )ÚlistZ_connectionsÚvaluesr-   )r   r0   r1   r2   Úconnectionsr   r   r   r   r3   Ð   s    
zSyncQuicManager.__exit__)ry   Nr   )r4   r5   r6   ÚsslÚCERT_REQUIREDr
   r<   rt   r.   r3   r7   r   r   r   r   rv   ½   s
   
rv   )r9   r~   rY   r   r   rR   Zaioquic.quic.configurationre   Zaioquic.quic.connectionZaioquic.quic.eventsZdns.inetrD   Zdns.quic._commonr   r   r   r   Úhasattrr   rW   ÚSelectSelectorr   r8   rv   r   r   r   r   Ú<module>   s    
1o