a
    a                     @   s  d 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	 e dkZ
ddlmZ dZdd Zed	Zd ddZd!ddZe Zg fddZG dd deZe Zedkrejdksed dZeejejZe d e!ej"ej#d e$e e%d eejejZ&e&'e e&(d)d e* \Z+Z,ede+-de,f  ed ee&d edee+  e&.  e.  ed dS )"z,BSD socket interface communication utilities    N)get_debug_levelSTDERR   )pickle   c              
   G   sh   z
|| W S  | y` } z>t jdkr*tjntj}|jd |krJW Y d}~q  W Y d}~q d}~0 0 q dS )z?Retry to execute function, ignoring EINTR error (interruptions)ntr   N)osnameerrnoZWSAEINTRZEINTRargs)errorZfunr   eZeintr r   5lib/python3.9/site-packages/spyder/utils/bsdsocket.pytemp_fail_retry   s    
r   lFc                 C   sT   |r
|}nt |t}tdt|| }t|}|dkrP|ttj| j	|8 }q2dS )zWrite *data* to socket *sock*r   r   N)
r   dumpsPICKLE_HIGHEST_PROTOCOLstructZpacklenr   socketr   send)sockdataZalready_pickledZ	sent_dataZnsendr   r   r   write_packet*   s    r   c              	   C   s*  |  | d\}}zztjdkrZ| t}td|\}d}t||k r|| |7 }q<nBtt	j
| jtt	j}t|tkrtd|\}tt	j
| j|t	j}W n, t	jy    Y n t	j
y   d}Y n0 W |  d n|  d 0 |dur&zt|W S  ty$   trtjtd Y dS 0 dS )zO
    Read data from socket *sock*
    Returns None if something went wrong
    )NNr   r       N)file)Z
settimeoutr   r	   recvSZr   Zunpackr   r   r   r   ZMSG_WAITALLtimeoutr   loads	ExceptionDEBUG_EDITOR	traceback	print_excr   )r   r   Zdlenr   Zdatalenr   r   r   read_packet6   s:    





r%   c                 C   sH   z8t   t| | |D ]}t| | qt| W t   S t   0 dS )zCommunicate with monitorN)COMMUNICATE_LOCKacquirer   r%   release)r   ZcommandZsettingsZoptionr   r   r   communicatee   s    
r)   c                   @   s   e Zd ZdS )PacketNotReceivedN)__name__
__module____qualname__r   r   r   r   r*      s   r*   __main__r   z.-- Testing standard Python socket interface --)z	127.0.0.1i'     zdata to be catchedzutf-8z..got "%s" from %si   z1-- Testing BSD socket write_packet/read_packet --za tiny piece of dataz..got "%s" from read_packet()z-- Done.)F)N)/__doc__r   r   r   Z	threadingr
   r#   Zspyder.config.baser   r   r"   Zspyder.py3compatr   r   r   Zcalcsizer   r   r%   ZLockr&   r)   objectr*   ZPACKET_NOT_RECEIVEDr+   r	   printZaddressZAF_INETZSOCK_STREAMZserverZsetblockingZ
setsockoptZ
SOL_SOCKETZSO_REUSEADDRZbindZlistenZclientZconnectr   encodeZacceptZaccsockZaddrr   closer   r   r   r   <module>   sL   



+%




	
