a
    ވa*+                     @   s  d Z ddlZddlmZ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lmZ ddlmZ ddlmZ ddlZddlmZmZmZ ddl m!Z! dddZ"d ddZ#d!ddZ$G dd de%Z&ddgZ'dS )"zzmq Socket class    N   )libffic                 C   s   t d| S )Nzsize_t*)r   newlength r   6lib/python3.9/site-packages/zmq/backend/cffi/socket.py<lambda>       r
   c                   C   s   t dtt dfS Nz	uint64_t*Zuint64_tr   r   nspsizeofr   r   r   r	   r
      r   c                   C   s   t dtt dfS Nzint64_t*Zint64_tr   r   r   r   r	   r
      r   c                   C   s   t dtt dfS Nzint*intr   r   r   r   r	   r
      r   c                 C   s    t d|  tt d|  fS )Nchar[%d]charr   r   r   r   r	   r
      s    c                 C   s   t d| t dfS r   r   r   r   valr   r   r	   r
      r   c                 C   s   t d| t dfS r   r   r   r   r   r	   r
      r   c                 C   s   t d| t dfS r   r   r   r   r   r	   r
      r   c                 C   s"   t d|d  | t d| fS )Nr   r   r   r   )r   r   r   r   r	   r
      s    ZZMQ_FD_T   )Frame)RCVMORE)_retry_sys_call)ZMQError	_check_rc_check_version)unicodec                 C   sH   ddl m}m}m} | |v s(tr.| |v r.t S | |v r>t|S t S d S Nr   )int64_sockoptsbytes_sockoptsfd_sockopts)zmq.sugar.constantsr!   r"   r#   ZMQ_FD_64BITnew_int64_pointernew_binary_datanew_int_pointer)optionr   r!   r"   r#   r   r   r	   new_pointer_from_opt+   s    r*   c                 C   s`   ddl m}m}m} | |v s(tr4| |v r4t|d S | |v rPt||d d  S t|d S d S r    )r$   r!   r"   r#   r%   r   r   buffer)r)   Zopt_pointerr   r!   r"   r#   r   r   r	   value_from_opt_pointer;   s    r,   c                 C   sN   ddl m}m}m} | |v s(tr0| |v r0t|S | |v rBt||S t|S d S r    )r$   r!   r"   r#   r%   value_int64_pointervalue_binary_datavalue_int_pointer)r)   valuer   r!   r"   r#   r   r   r	   initialize_opt_pointerJ   s    
r1   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r4t|tr|j}td|| _d| _nd| _t	|j
|| _| jtjkr\t d| _d S )Nzvoid *TF)context
isinstancer2   
underlyingr   cast_zmq_socket_shadowCZ
zmq_socketZ_zmq_ctxNULLr   _closed)selfr3   socket_typeZshadowr   r   r	   __init__b   s    
zSocket.__init__c                 C   s   t td| jS )z+The address of the underlying libzmq socketZsize_t)r   r   r6   r7   r<   r   r   r	   r5   p   s    zSocket.underlyingc              
   C   sf   | j r
dS z| tj W nF ty` } z.|jtjkrJd| _ W Y d}~dS  W Y d}~n
d}~0 0 dS )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)r;   getzmqZTYPEr   errnoZENOTSOCK)r<   er   r   r	   _check_closed_deepu   s    zSocket._check_closed_deepc                 C   s   |   S )N)rD   r?   r   r   r	   closed   s    zSocket.closedc                 C   sZ   d}| j sFt| drF| jd ur@|d ur4| tj| t| j}d| _ |dk rVt| d S )Nr   r7   T)	r;   hasattrr7   setrA   ZLINGERr9   Z	zmq_closer   )r<   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 rtrt	 t
jkr|ddd }d|t}tt	 |dnBt	 t
jkr|ddd }d|}tt	 |dnt| d S )	Nutf8r   z://r   zLipc path "{0}" is longer than {1} characters (sizeof(sockaddr_un.sun_path)).)msgz-No such file or directory for ipc path "{0}".)r4   r   encodebytesdecoder9   Zzmq_bindr7   IPC_PATH_MAX_LENZ	zmq_errno	errno_modZENAMETOOLONGsplitformatr   ZENOENTr   )r<   addressZ	address_brH   pathrL   r   r   r	   bind   s&    



zSocket.bindc                 C   s8   t dd t|tr|d}t| j|}t| d S )N      unbindrJ   )r   r4   r   rM   r9   Z
zmq_unbindr7   r   r<   rT   rH   r   r   r	   rZ      s
    


zSocket.unbindc                 C   s.   t |tr|d}t| j|}t| d S )NrJ   )r4   r   rM   r9   Zzmq_connectr7   r   r[   r   r   r	   connect   s    

zSocket.connectc                 C   s8   t dd t|tr|d}t| j|}t| d S )NrW   
disconnectrJ   )r   r4   r   rM   r9   Zzmq_disconnectr7   r   r[   r   r   r	   r]      s
    


zSocket.disconnectc                 C   s|   d }t |trtdt |tr@|tjjvr8td| t|}t|||}|d }|d }t	t
j| j|td|| d S )Nzunicode not allowed, use bytesznot a bytes sockopt: %sr   r   zvoid*)r4   r   	TypeErrorrN   rA   	constantsr"   lenr1   r   r9   Zzmq_setsockoptr7   r   r6   )r<   r)   r0   r   c_datac_value_pointerZc_sizetr   r   r	   rG      s"    


z
Socket.setc                 C   st   t |dd}|d }|d }ttj| j||| |d }t|||}|tjkrp|tjj	v rp|
drp|d d }|S )N   r   r   r       rK   )r*   r   r9   Zzmq_getsockoptr7   r,   rA   ZIDENTITYr_   r"   endswith)r<   r)   ra   rb   Zc_sizet_pointerZszvr   r   r	   r@      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   r4   rN   
memoryviewtobytesr9   Zzmq_msg_init_sizer`   r   Zmemcpyzmq_msg_datar   zmq_msg_sendr7   zmq_msg_close)r<   bufflagszmq_msgZ	c_messagerH   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_copyro   r   r9   rk   r7   trackerrI   )r<   framern   Z
frame_copyro   rq   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rR|rL|jsLtd|}n@| jr~t|}|j	| jk r~| || t
jS t||| jd}d}| ||}|r|  |S d S )Nz.Message must be in bytes, not a unicode objectFzNot a tracked message)trackcopy_thresholdT)r4   r   r^   r   rp   rq   
ValueErrorru   rh   nbytesrA   Z_FINISHED_TRACKERrs   rI   )	r<   datarn   copyrt   Zclose_framerr   rm   rq   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
yd   |r^t|  Y n0 |sn|S t t|t|}|d d  }t|}t| |S )Nrg   )rt   )r   r   r9   Zzmq_msg_initrA   r   ro   r   Zzmq_msg_recvr7   	Exceptionrl   r+   rj   Zzmq_msg_sizer   )	r<   rn   ry   rt   ro   rr   Z_bufferZ_bytesrH   r   r   r	   recv%  s$    


zSocket.recvrK   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.
        rW   monitorr   NrJ   )r   rA   Z	EVENT_ALLr   r:   r4   r   rM   r9   Zzmq_socket_monitorr7   )r<   ZaddrZeventsrH   r   r   r	   r}   =  s    


zSocket.monitor)NNN)N)r   FF)r   TF)rK   )__name__
__module____qualname__r3   r=   r7   r;   Z_refr8   ru   r>   propertyr5   rD   rE   rI   rV   rZ   r\   r]   rG   r@   rp   rs   rz   r|   r}   r   r   r   r	   r2   Y   s2   





r2   rP   )r   )r   )r   )(__doc__rB   rQ   Z_cffir   r9   r   r   Znew_sizet_pointerZnew_uint64_pointerr&   r(   r'   Zvalue_uint64_pointerr-   r/   r.   r   r%   Zget_ipc_path_max_lenrP   messager   r_   r   Zutilsr   rA   Z	zmq.errorr   r   r   Zzmq.utils.strtypesr   r*   r,   r1   objectr2   __all__r   r   r   r	   <module>   s4   


  