o
    tf,                     @   s  d Z ddlZddlZddlmZmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ d
d  ZZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZeddkZe Z d'ddZ!d'd d!Z"d'd"d#Z#G d$d% d%Z$d%d&gZ%dS )(zzmq Socket class    N)SocketOption_OptType)ZMQError	_check_rc_check_version   )ffi)lib)Frame)_retry_sys_callc                 C   s   t d| S )Nzsize_t*)r   newlength r   `/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/zmq/backend/cffi/socket.py<lambda>   s    r   c                   C      t dtt dfS Nz	uint64_t*Zuint64_tr   r   nspsizeofr   r   r   r   new_uint64_pointer      r   c                   C   r   Nzint64_t*Zint64_tr   r   r   r   r   new_int64_pointer   r   r   c                   C   r   Nzint*intr   r   r   r   r   new_int_pointer   r   r   c                 C   s    t d|  tt d|  fS )Nchar[%d]charr   r   r   r   r   new_binary_data    s    r    c                 C      t d| t dfS r   r   r   r   valr   r   r   value_uint64_pointer$      r%   c                 C   r!   r   r"   r#   r   r   r   value_int64_pointer(   r&   r'   c                 C   r!   r   r"   r#   r   r   r   value_int_pointer,   r&   r(   c                 C   s"   t d|d  | t d| fS )Nr   r   r   r"   )r$   r   r   r   r   value_binary_data0   s   "r)   ZZMQ_FD_T   c                 C   sD   t | dtj}|tjkstr|tjkrt S |tjkrt|S t	 S N	_opt_type)
getattrr   r   int64ZMQ_FD_64BITfdr   bytesr    r   )optionr   opt_typer   r   r   new_pointer_from_opt9   s   
r4   c                 C   sV   zt | } W n ty   tj}Y nw | j}|tjkr%t||d d  S t|d S )Nr   )r   
ValueErrorr   r   r,   r1   r   buffer)r2   Zopt_pointerr   r3   r   r   r   value_from_opt_pointerE   s   

r7   c                 C   sJ   t | dtj}|tjkstr|tjkrt|S |tjkr!t||S t	|S r+   )
r-   r   r   r.   r/   r0   r'   r1   r)   r(   )r2   valuer   r3   r   r   r   initialize_opt_pointerV   s   

r9   c                   @   s   e Zd ZdZdZdZdZdZdZdZ	d&ddZ
edd Zdd	 Zed
d Zd'ddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd(ddZd)d!d"Zd*d$d%ZdS )+SocketNFr   c                 C   sf   |d u rt j}|| _|| _|rtd|| _d| _nd| _t	|j
|| _| jtjkr.t d| _d S )Nzvoid *TF)zmqZCOPY_THRESHOLDcopy_thresholdcontextr   cast_zmq_socket_shadowCZ
zmq_socketZ_zmq_ctxNULLr   _closed)selfr=   socket_typeZshadowr<   r   r   r   __init__i   s   
zSocket.__init__c                 C   s   t td| jS )z+The address of the underlying libzmq socketZsize_t)r   r   r>   r?   rD   r   r   r   
underlyingy   s   zSocket.underlyingc              
   C   st   | j rdS z	| tj W dS  ty9 } z|jtjkr&d| _ W Y d}~dS |jtjkr-n W Y d}~dS d}~ww )zthorough check of whether the socket has been closed,
        even if by another entity (e.g. ctx.destroy).

        Only used by the `closed` property.

        returns True if closed, False otherwise
        TNF)rC   getr;   ZTYPEr   errnoENOTSOCKZETERM)rD   er   r   r   _check_closed_deep~   s    	
zSocket._check_closed_deepc                 C   s   |   S N)rM   rG   r   r   r   closed   s   zSocket.closedc                 C   s^   d}| j s#t| dr#| jd ur |d ur| tj| t| j}d| _ |dk r-t| d S d S )Nr   r?   T)	rC   hasattrr?   setr;   ZLINGERrA   Z	zmq_closer   )rD   Zlingerrcr   r   r   close   s   
zSocket.closec                 C   s   t |tr|d}n|}t |tr|d}t| j|}|dk rgtrDt	 t
jkrD|ddd }d| dt d}tt	 |d	t	 t
jkra|ddd }d
| d}tt	 |d	t| d S d S )Nutf8r   z://r   z
ipc path "z" is longer than z+ characters (sizeof(sockaddr_un.sun_path)).)msgz(No such file or directory for ipc path "z".)
isinstancestrencoder1   decoderA   Zzmq_bindr?   IPC_PATH_MAX_LENZ	zmq_errno	errno_modZENAMETOOLONGsplitr   ENOENTr   )rD   addressZ	address_brR   pathrV   r   r   r   bind   s$   


zSocket.bindc                 C   8   t dd t|tr|d}t| j|}t| d S )N      unbindrT   )r   rW   rX   rY   rA   Z
zmq_unbindr?   r   rD   r_   rR   r   r   r   rf      
   


zSocket.unbindc                 C   s.   t |tr
|d}t| j|}t| d S )NrT   )rW   rX   rY   rA   Zzmq_connectr?   r   rg   r   r   r   connect   s   

zSocket.connectc                 C   rb   )Nrc   
disconnectrT   )r   rW   rX   rY   rA   Zzmq_disconnectr?   r   rg   r   r   r   rj      rh   zSocket.disconnectc                 C   s   d }t |trtdzt|}W n ty   tj}Y nw |j}t |tr5|tjkr1td| t	|}t
|||\}}ttj| j|td|| d S )Nzunicode not allowed, use bytesznot a bytes sockopt: %szvoid*)rW   rX   	TypeErrorr   r5   r   r   r,   r1   lenr9   r   rA   Zzmq_setsockoptr?   r   r>   )rD   r2   r8   r   r3   c_value_pointerZc_sizetr   r   r   rQ      s*   




z
Socket.setc                 C   s   zt |}W n ty   tj}Y nw |j}t|dd\}}ttj| j	||| |d }t
|||}|tj jkrH|tjkrH|drH|d d }|S )N   r   r       rU   )r   r5   r   r   r,   r4   r   rA   Zzmq_getsockoptr?   r7   r;   Z
ROUTING_IDr1   endswith)rD   r2   r3   rm   Zc_sizet_pointerszvr   r   r   rI      s$   

z
Socket.getc                 C   s   t d}t|tst| }t d|}t|t|}t	| t
t||t| ttj|| j| t|}t	| dS )zSend a copy of a bufferable
zmq_msg_t*zchar[]N)r   r   rW   r1   
memoryviewtobytesrA   Zzmq_msg_init_sizerl   r   Zmemcpyzmq_msg_datar   zmq_msg_sendr?   zmq_msg_close)rD   bufflagszmq_msgZ	c_messagerR   Zrc2r   r   r   
_send_copy  s   


zSocket._send_copyc                 C   s2   |  }|j}ttj|| j| |j}|  |S )z1Send a Frame on this socket in a non-copy manner.)Z	fast_copyr{   r   rA   rw   r?   trackerrS   )rD   framerz   Z
frame_copyr{   r}   r   r   r   _send_frame  s   zSocket._send_framec           	      C   s   t |tr	td|rt |ts| ||S d}t |tr)|r&|js&td|}n | jr?t|}|j	| jk r?| || t
jS t||| jd}d}| ||}|rU|  |S )Nz.Message must be in bytes, not a unicode objectFzNot a tracked message)trackr<   T)rW   rX   rk   r
   r|   r}   r5   r<   rt   nbytesr;   Z_FINISHED_TRACKERr   rS   )	rD   datarz   copyr   Zclose_framer~   ry   r}   r   r   r   send!  s(   


zSocket.sendTc           	      C   s   |rt d}t| n	tj|d}|j}zttj|| j	| W n t
y0   |r/t|  w |s5|S t t|t|}|d d  }t|}t| |S )Nrs   )r   )r   r   rA   Zzmq_msg_initr;   r
   r{   r   Zzmq_msg_recvr?   	Exceptionrx   r6   rv   Zzmq_msg_sizer   )	rD   rz   r   r   r{   r~   _bufferZ_bytesrR   r   r   r   recv<  s&   


zSocket.recvrU   c                 C   sN   t dd |dk rtj}|du rtj}t|tr|d}t	| j
|| dS )a   s.monitor(addr, flags)

        Start publishing socket events on inproc.
        See libzmq docs for zmq_monitor for details.

        Note: requires libzmq >= 3.2

        Parameters
        ----------
        addr : str
            The inproc url used for monitoring. Passing None as
            the addr will cause an existing socket monitor to be
            deregistered.
        events : int [default: zmq.EVENT_ALL]
            The zmq event bitmask for which events will be sent to the monitor.
        rc   monitorr   NrT   )r   r;   Z	EVENT_ALLr   rB   rW   rX   rY   rA   Zzmq_socket_monitorr?   )rD   addreventsr   r   r   r   T  s   


zSocket.monitor)NNr   NrN   )r   FF)r   TF)rU   )__name__
__module____qualname__r=   rE   r?   rC   Z_refr@   r<   rF   propertyrH   rM   rO   rS   ra   rf   ri   rj   rQ   rI   r|   r   r   r   r   r   r   r   r   r:   `   s4    





r:   r[   )r   )&__doc__rJ   r\   r;   Zzmq.constantsr   r   Z	zmq.errorr   r   r   Z_cffir   r	   rA   messager
   utilsr   r   Znew_sizet_pointerr   r   r   r    r%   r'   r(   r)   r   r/   Zget_ipc_path_max_lenr[   r4   r7   r9   r:   __all__r   r   r   r   <module>   s6    



  