U
    ~fh                     @  sd  d Z ddlmZ ddlZddlZddlZddlZddlmZmZ ddl	m
Z
 ddlmZ zddlmZmZ dZW n ek
r   d	ZY nX z dd
lmZmZmZmZ dZW n0 ek
r   d	ZeZddlmZmZmZ Y nX edjZedjZdZeefejZddddddZ ej!dkr:dddddddZ"ndddddddZ"ddddddZ#dS )z&Internal network layer helper methods.    )annotationsN)AbstractEventLoopFuture)Union)ssl_support)SSLError	SSLSocketTF)BLOCKING_IO_LOOKUP_ERRORBLOCKING_IO_READ_ERRORBLOCKING_IO_WRITE_ERROR_sslConn)r	   r
   r   z<iiiiz<iiB      ?zUnion[socket.socket, _sslConn]bytesNone)sockbufreturnc              
     s   |   }| d t }zzPtrNt| ttfrNtjt	| |||dI d H  ntj|
| ||dI d H  W n0 tjk
r } ztd|W 5 d }~X Y nX W 5 | | X d S )Ng        )timeoutz	timed out)
gettimeout
settimeoutasyncioZget_event_loop	_HAVE_SSL
isinstancer   r   wait_for_async_sendall_sslZsock_sendallTimeoutErrorsocketr   )r   r   r   loopexc r   9/tmp/pip-unpacked-wheel-36gvocj8/pymongo/network_layer.pyasync_sendall=   s    
 "r!   win32r   )r   r   r   r   c              
     s,  t |}|   d}ddd fdd}|t|k r(z|| ||d  7 }W q* tk
r$ } z|    dkrtdd t|tr }	 || |I d H  t|t
rԈ } || |I d H  trt|tr }	 ||  || |I d H  W 5 d }~X Y q*X q*d S )	Nr   r   r   )futr   c                   s.        |  r d S | d  d S N)Zremove_writerZremove_readerdoneZ
set_result)r#   fdr   r   r    	_is_readyV   s
    

z%_async_sendall_ssl.<locals>._is_readyz!Underlying socket has been closed)
memoryviewfilenolensendBLOCKING_IO_ERRORSr   r   r
   Zcreate_futureZ
add_readerr   Z
add_writer_HAVE_PYOPENSSLr	   )r   r   r   viewsentr(   r   r#   r   r&   r    r   O   s0    




r   )r   r   dummyr   c                   sj   t |}t|}d}||k rfz| ||d  }W n( tk
rZ   tdI d H  d}Y nX ||7 }qd S )Nr   r   )r*   r,   r-   r.   r   sleep)r   r   r2   r0   total_length
total_sentr1   r   r   r    r   u   s    
c                 C  s   |  | d S r$   )sendall)r   r   r   r   r    r6      s    r6   )$__doc__
__future__r   r   r   structsysr   r   typingr   Zpymongor   sslr   r   r   ImportErrorZpymongo.pyopenssl_contextr	   r
   r   r   r/   Zpymongo.ssl_supportStructunpackZ_UNPACK_HEADERZ_UNPACK_COMPRESSION_HEADERZ_POLL_TIMEOUTBlockingIOErrorr.   r!   platformr   r6   r   r   r   r    <module>   s:   
&