o
    Zh,                     @   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   N/var/www/html/lang_env/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| d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 dd| t d| fS )Nr   r   r   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   
r6   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.   r3   r   buffer)r4   Zopt_pointerr   r5   r   r   r   value_from_opt_pointerE   s   

r9   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   r0   r1   r2   r)   r3   r+   r*   )r4   valuer   r5   r   r   r   initialize_opt_pointerV   s   

r;   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@   rA   rF   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)rE   getr=   ZTYPEr   errnoENOTSOCKZETERM)rF   er   r   r   _check_closed_deep~   s    	
zSocket._check_closed_deepc                 C   s   |   S N)rO   rI   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   rA   T)	rE   hasattrrA   setr=   ZLINGERrC   Z	zmq_closer   )rF   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encoder3   decoderC   Zzmq_bindrA   IPC_PATH_MAX_LENZ	zmq_errno	errno_modZENAMETOOLONGsplitr   ENOENTr   )rF   addressZ	address_brT   pathrX   r   r   r   bind   s$   


zSocket.bindc                 C   8   t dd t|tr|d}t| j|}t| d S )N      unbindrV   )r   rY   rZ   r[   rC   Z
zmq_unbindrA   r   rF   ra   rT   r   r   r   rh      
   


zSocket.unbindc                 C   s.   t |tr
|d}t| j|}t| d S )NrV   )rY   rZ   r[   rC   Zzmq_connectrA   r   ri   r   r   r   connect   s   

zSocket.connectc                 C   rd   )Nre   
disconnectrV   )r   rY   rZ   r[   rC   Zzmq_disconnectrA   r   ri   r   r   r   rl      rj   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r6|tjkr2td| t	|}t
|||\}}ttj| j|td|| d S )Nzunicode not allowed, use bytesznot a bytes sockopt: zvoid*)rY   rZ   	TypeErrorr   r7   r   r   r.   r3   lenr;   r   rC   Zzmq_setsockoptrA   r   r@   )rF   r4   r:   r   r5   c_value_pointerZc_sizetr   r   r   rS      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       rW   )r   r7   r   r   r.   r6   r   rC   Zzmq_getsockoptrA   r9   r=   Z
ROUTING_IDr3   endswith)rF   r4   r5   ro   Zc_sizet_pointerszvr   r   r   rK      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   rY   r3   
memoryviewtobytesrC   Zzmq_msg_init_sizern   r   Zmemcpyzmq_msg_datar   zmq_msg_sendrA   zmq_msg_close)rF   bufflagszmq_msgZ	c_messagerT   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   rC   ry   rA   trackerrU   )rF   framer|   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)rY   rZ   rm   r
   r~   r   r7   r>   rv   nbytesr=   Z_FINISHED_TRACKERr   rU   )	rF   datar|   copyr   Zclose_framer   r{   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 )Nru   )r   )r   r   rC   Zzmq_msg_initr=   r
   r}   r   Zzmq_msg_recvrA   	Exceptionrz   r8   rx   Zzmq_msg_sizer   )	rF   r|   r   r   r}   r   _bufferZ_bytesrT   r   r   r   recv<  s&   


zSocket.recvrW   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.
        re   monitorr   NrV   )r   r=   Z	EVENT_ALLr   rD   rY   rZ   r[   rC   Zzmq_socket_monitorrA   )rF   addreventsr   r   r   r   T  s   


zSocket.monitor)NNr   NrP   )r   FF)r   TF)rW   )__name__
__module____qualname__r?   rG   rA   rE   Z_refrB   r>   rH   propertyrJ   rO   rQ   rU   rc   rh   rk   rl   rS   rK   r~   r   r   r   r   r   r   r   r   r<   `   s4    





r<   r]   )r   )&__doc__rL   r^   r=   Zzmq.constantsr   r   Z	zmq.errorr   r   r   Z_cffir   r	   rC   messager
   utilsr   r   Znew_sizet_pointerr   r   r   r"   r'   r)   r*   r+   r   r1   Zget_ipc_path_max_lenr]   r6   r9   r;   r<   __all__r   r   r   r   <module>   s6    



  