o
    i,                     @   s  d Z ddl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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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   )ffi)libc                 C   s   t d| S )Nzsize_t*)r   newlength r   R/var/www/edux/Edux_v2/venv/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*uint64_tr   r   nspsizeofr   r   r   r	   r
          c                   C   r   Nzint64_t*int64_tr   r   r   r   r	   r
      r   c                   C   r   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      t d| t dfS r   r   r   r   valr   r   r	   r
          c                 C   r   r   r   r   r   r   r	   r
      r   c                 C   r   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   ZMQ_FD_T   )SocketOption_OptType)ZMQError	_check_rc_check_version)Frame)_retry_sys_callc                 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fdnew_int64_pointerbytesnew_binary_datanew_int_pointer)optionr   opt_typer   r   r	   new_pointer_from_opt)   s   
r2   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'   r-   r   buffer)r0   opt_pointerr   r1   r   r   r	   value_from_opt_pointer5   s   

r6   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*   r+   value_int64_pointerr-   value_binary_datavalue_int_pointer)r0   valuer   r1   r   r   r	   initialize_opt_pointerF   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)zmqCOPY_THRESHOLDcopy_thresholdcontextr   cast_zmq_socket_shadowC
zmq_socket_zmq_ctxNULLr!   _closed)selfr@   socket_typeshadowr?   r   r   r	   __init__Y   s   
zSocket.__init__c                 C   s   t td| jS )z+The address of the underlying libzmq socketsize_t)r   r   rA   rB   rI   r   r   r	   
underlyingi   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)rH   getr=   TYPEr!   errnoENOTSOCKETERM)rI   er   r   r	   _check_closed_deepn   s    	
zSocket._check_closed_deepc                 C   s   |   S N)rV   rN   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   rB   T)	rH   hasattrrB   setr=   LINGERrD   	zmq_closer"   )rI   lingerrcr   r   r	   close   s   
zSocket.closec                 C   s   t |tr|d}n|}t |tr|d}t| j|}|dk rdtrAt	 t
jkrA|ddd }d|t}tt	 |dt	 t
jkr^|ddd }d| d	}tt	 |dt| d S d S )
Nutf8r   z://r   zJipc path "{}" is longer than {} characters (sizeof(sockaddr_un.sun_path)).)msgz(No such file or directory for ipc path "z".)
isinstancestrencoder-   decoderD   zmq_bindrB   IPC_PATH_MAX_LEN	zmq_errno	errno_modENAMETOOLONGsplitformatr!   ENOENTr"   )rI   address	address_br^   pathrb   r   r   r	   bind   s*   


zSocket.bindc                 C   8   t dd t|tr|d}t| j|}t| d S )N      unbindr`   )r#   rc   rd   re   rD   
zmq_unbindrB   r"   rI   ro   r^   r   r   r	   rw      
   


zSocket.unbindc                 C   s.   t |tr
|d}t| j|}t| d S )Nr`   )rc   rd   re   rD   zmq_connectrB   r"   ry   r   r   r	   connect   s   

zSocket.connectc                 C   rs   )Nrt   
disconnectr`   )r#   rc   rd   re   rD   zmq_disconnectrB   r"   ry   r   r   r	   r}      rz   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*)rc   rd   	TypeErrorr   r3   r    r   r'   r-   lenr;   r%   rD   zmq_setsockoptrB   r   rA   )rI   r0   r:   r   r1   c_value_pointerc_sizetr   r   r	   rZ      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       ra   )r   r3   r    r   r'   r2   r%   rD   zmq_getsockoptrB   r6   r=   
ROUTING_IDr-   endswith)rI   r0   r1   r   c_sizet_pointerszvr   r   r	   rP      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   rc   r-   
memoryviewtobytesrD   zmq_msg_init_sizer   r"   memcpyzmq_msg_datar%   zmq_msg_sendrB   zmq_msg_close)rI   bufflagszmq_msg	c_messager^   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.)	fast_copyr   r%   rD   r   rB   trackerr_   )rI   framer   
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)rc   rd   r   r$   r   r   r3   r?   r   nbytesr=   _FINISHED_TRACKERr   r_   )	rI   datar   copyr   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 )Nr   )r   )r   r   rD   zmq_msg_initr=   r$   r   r%   zmq_msg_recvrB   	Exceptionr   r4   r   zmq_msg_sizer"   )	rI   r   r   r   r   r   _buffer_bytesr^   r   r   r	   recv.  s&   


zSocket.recvra   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.
        rt   monitorr   Nr`   )r#   r=   	EVENT_ALLr   rG   rc   rd   re   rD   zmq_socket_monitorrB   )rI   addreventsr   r   r	   r   F  s   


zSocket.monitor)NNr   NrW   )r   FF)r   TF)ra   )__name__
__module____qualname__r@   rJ   rB   rH   _refrC   r?   rL   propertyrO   rV   rX   r_   rr   rw   r|   r}   rZ   rP   r   r   r   r   r   r   r   r   r	   r<   P   s4    





r<   rh   )r   )&__doc__rR   rj   _cffir   r   rD   r   new_sizet_pointernew_uint64_pointerr,   r/   r.   value_uint64_pointerr7   r9   r8   r   r*   get_ipc_path_max_lenrh   r=   zmq.constantsr   r    	zmq.errorr!   r"   r#   messager$   utilsr%   r2   r6   r;   r<   __all__r   r   r   r	   <module>   s6    



  