
    Zd,                     (   d Z ddlZddlmZ ddlmZ d xZZd Z	d Z
d	 Zd
 Zd Zd Zd Zd Z ej        d          dk    Z ej                    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Z!ddZ"ddZ# G d d          Z$ddgZ%dS )zzmq Socket class    N   )ffi)libc                 ,    t          j        d|           S )Nzsize_t*)r   newlengths    7lib/python3.11/site-packages/zmq/backend/cffi/socket.py<lambda>r      s    F)C)C     c                  l    t          j        d          t          t          j        d                    fS Nz	uint64_t*uint64_tr   r   nspsizeof r   r
   r   r      s'    cgk22C
:8N8N4O4OP r   c                  l    t          j        d          t          t          j        d                    fS Nzint64_t*int64_tr   r   r   r
   r   r      s'    SWZ00#cj6K6K2L2LM r   c                  l    t          j        d          t          t          j        d                    fS Nzint*intr   r   r   r
   r   r      s%    376??C
50A0A,B,BC r   c                 x    t          j        d| z            t          t          j        d          | z            fS )Nchar[%d]charr   r   s    r
   r   r      s5    GJ&!""
6V#$$" r   c                 T    t          j        d|           t          j        d          fS r   r   r   r   vals    r
   r   r      s!    CGK$=$=sz*?U?U#V r   c                 T    t          j        d|           t          j        d          fS r   r   r   s    r
   r   r      s!    37:s#;#;SZ	=R=R"S r   c                 T    t          j        d|           t          j        d          fS r   r   r   s    r
   r   r      s!    !5!5sz%7H7H I r   c                 f    t          j        d|dz   z  |           t          j        d          |z  fS )Nr   r   r   r   )r    r	   s     r
   r   r      s3    GJ&1*%s++Jv) r   ZMQ_FD_T   )SocketOption_OptType)ZMQError	_check_rc_check_version)Frame)_retry_sys_callc                     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_types      r
   new_pointer_from_optr:   )   sh    v{HL99H8>!!l!x8;7N7N """	X^	#	#v&&&    r   c                     	 t          |           } | j        }n# t          $ r t          j        }Y nw xY w|t          j        k    rt          j        ||          d d          S t	          |d                   S )Nr   )r&   r/   
ValueErrorr'   r   r5   r   buffer)r8   opt_pointerr	   r9   s       r
   value_from_opt_pointerr?   5   s    $f%% #        <	  8>!!z+v..qqq11;q>"""    22c                    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.   )
r0   r'   r   r1   r2   r3   value_int64_pointerr5   value_binary_datavalue_int_pointer)r8   valuer	   r9   s       r
   initialize_opt_pointerrF   F   sl    v{HL99H8>!!l!x8;7N7N"5)))	X^	#	# /// '''r   c                       e Zd ZdZdZdZdZdZdZdZ	ddZ
ed             Zd Zed             ZddZd	 Zd
 Zd Zd Zd Zd Zd Zd ZddZddZddZdS )SocketNFr   c                 &   |t           j        }|| _        || _        |r"t	          j        d|          | _        d| _        n&d| _        t          j	        |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)selfrM   socket_typeshadowrL   s        r
   __init__zSocket.__init__Y   s    ! /N, 	K"x&99DDLL DL |G,<kJJDsx''**r   c                 P    t          t          j        d| j                            S )z+The address of the underlying libzmq socketsize_t)r   r   rN   rO   rV   s    r
   
underlyingzSocket.underlyingi   s!     38Hd&677888r   c                     | j         rdS 	 |                     t          j                   nP# t          $ rC}|j        t          j        k    rd| _         Y d}~dS |j        t          j        k    rn Y d}~nd}~ww xY w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)rU   getrJ   TYPEr(   errnoENOTSOCKETERM)rV   es     r
   _check_closed_deepzSocket._check_closed_deepn   s     < 	4		HHSX 	 	 	w#,&&#tttttCI%% 	 us   + 
A8A3A33A8c                 *    |                                  S N)re   r\   s    r
   closedzSocket.closed   s    &&(((r   c                     d}| j         sYt          | d          rI| j        ;| |                     t          j        |           t          j        | j                  }d| _         |dk     rt          |           d S d S )Nr   rO   T)	rU   hasattrrO   setrJ   LINGERrQ   	zmq_closer)   )rV   lingerrcs      r
   closezSocket.close   s    | 	 m < < 	 +%HHSZ000[!122DL66bMMMMM 6r   c                    t          |t                    r|                    d          }n|}t          |t                    r|                    d          }t          j        | j        |          }|dk     rt          rzt          j	                    t          j        k    rY|                    dd          d         }d                    |t                    }t          t          j	                    |          t          j	                    t          j        k    rD|                    dd          d         }d| d	}t          t          j	                    |          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encoder5   decoderQ   zmq_bindrO   IPC_PATH_MAX_LEN	zmq_errno	errno_modENAMETOOLONGsplitformatr(   ENOENTr)   )rV   address	address_bro   pathrt   s         r
   bindzSocket.bind   sI   gs## 	 v..IIIgu%% 	/&&v..GZ()4466 AKMMY5K$K$K}}UA..r2AAG.B B  q{}}#6666)"222}}UA..r2IIIIq{}}#6666" 6r   c                     t          dd           t          |t                    r|                    d          }t	          j        | j        |          }t          |           d S )N      unbindrr   )r*   ru   rv   rw   rQ   
zmq_unbindrO   r)   rV   r   ro   s      r
   r   zSocket.unbind   sX    vx(((gs## 	-nnV,,G\$*G44"r   c                     t          |t                    r|                    d          }t          j        | j        |          }t          |           d S )Nrr   )ru   rv   rw   rQ   zmq_connectrO   r)   r   s      r
   connectzSocket.connect   sH    gs## 	-nnV,,G]4+W55"r   c                     t          dd           t          |t                    r|                    d          }t	          j        | j        |          }t          |           d S )Nr   
disconnectrr   )r*   ru   rv   rw   rQ   zmq_disconnectrO   r)   r   s      r
   r   zSocket.disconnect   sY    v|,,,gs## 	-nnV,,Gd.88"r   c           	         d }t          |t                    rt          d          	 t          |          }|j        }n# t
          $ r t          j        }Y nw xY wt          |t                    r1|t          j        k    rt          d|z            t          |          }t          |||          \  }}t          t          j        | j        |t          j        d|          |           d S )Nzunicode not allowed, use bytesznot a bytes sockopt: %szvoid*)ru   rv   	TypeErrorr&   r/   r<   r'   r   r5   lenrF   r,   rQ   zmq_setsockoptrO   r   rN   )rV   r8   rE   r	   r9   c_value_pointerc_sizets          r
   rk   z
Socket.set   s   eS!! 	><===	(!&))F 'HH  	$ 	$ 	$  |HHH		$ eU## 	 8>)) 9F BCCCZZF#9&%#P#P HWo..	
 	
 	
 	
 	
s   ? AAc                    	 t          |          }|j        }n# t          $ r t          j        }Y nw xY wt          |d          \  }}t          t          j        | j	        |||           |d         }t          |||          }|t          j         j        k    r/|t          j        k    r|                    d          r
|d d         }|S )N   r   r       rs   )r&   r/   r<   r'   r   r:   r,   rQ   zmq_getsockoptrO   r?   rJ   
ROUTING_IDr5   endswith)rV   r8   r9   r   c_sizet_pointerszvs          r
   r_   z
Socket.get   s    	(!&))F 'HH  	$ 	$ 	$  |HHH		$ ,@s+S+S+S(d.	
 	
 	
 Q"6?B??c&111HN**

5!! + #2#Ar@   c                    t          j        d          }t          |t                    s!t	          |                                          }t          j        d|          }t          j        |t          |                    }t          |           t          j
        t          j        |          |t          |                     t          t          j        || j        |           t          j        |          }t          |           dS )zSend a copy of a bufferable
zmq_msg_t*zchar[]N)r   r   ru   r5   
memoryviewtobytesrQ   zmq_msg_init_sizer   r)   memcpyzmq_msg_datar,   zmq_msg_sendrO   zmq_msg_close)rV   bufflagszmq_msg	c_messagero   rc2s          r
   
_send_copyzSocket._send_copy   s    ',''#u%% 	,S//))++CGHc**	 #c((33"	(()SXX>>>1A5IIIog&&#r   c                     |                                 }|j        }t          t          j        || j        |           |j        }|                                 |S )z1Send a Frame on this socket in a non-copy manner.)	fast_copyr   r,   rQ   r   rO   trackerrp   )rV   framer   
frame_copyr   r   s         r
   _send_framezSocket._send_frame  sS     __&&
$1A5III$r   c                 &   t          |t                    rt          d          |r+t          |t                    s|                     ||          S d}t          |t                    r|r|j        st          d          |}na| j        rAt          |          }|j	        | j        k     r"|                     ||           t          j        S t          ||| j                  }d}|                     ||          }|r|                                 |S )Nz.Message must be in bytes, not a unicode objectFzNot a tracked message)trackrL   T)ru   rv   r   r+   r   r   r<   rL   r   nbytesrJ   _FINISHED_TRACKERr   rp   )	rV   datar   copyr   close_framer   r   r   s	            r
   sendzSocket.send  s   dC   	NLMMM 	
4// 	??4///K$&& # > >$%<===& 5$T**CzD$777U333"44d%@STTT"&&ue44G Nr   Tc                    |r)t          j        d          }t          j        |           nt	          j        |          }|j        }	 t          t          j        || j	        |           n%# t          $ r |rt          j        |            w xY w|s|S t          j        t          j        |          t          j        |                    }|d d          }t          j        |          }t          |           |S )Nr   )r   )r   r   rQ   zmq_msg_initrJ   r+   r   r,   zmq_msg_recvrO   	Exceptionr   r=   r   zmq_msg_sizer)   )	rV   r   r   r   r   r   _buffer_bytesro   s	            r
   recvzSocket.recv.  s     	$gl++GN7####IE***EmG	ANGT5EuMMMM 	 	 	 )(((	
  	L*Q^G44anW6M6MNN_W%%"s   	!A+ +"Brs   c                     t          dd           |dk     rt          j        }|t          j        }t          |t                    r|                    d          }t          j	        | 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.
        r   monitorr   Nrr   )r*   rJ   	EVENT_ALLr   rT   ru   rv   rw   rQ   zmq_socket_monitorrO   )rV   addreventss      r
   r   zSocket.monitorF  sq    $ 	vy)))A::]F<8DdC   	';;v&&D	T-tV<<<<<r   )NNr   Nrg   )r   FF)r   TF)rs   )__name__
__module____qualname__rM   rW   rO   rU   _refrP   rL   rY   propertyr]   re   rh   rp   r   r   r   r   rk   r_   r   r   r   r   r   r   r   r
   rH   rH   P   sX       GKKGDGN     9 9 X9  , ) ) X)	 	 	 	  2      
 
 
<  6  	 	 	   6   0= = = = = =r   rH   rz   )r   )&__doc__ra   r|   _cffir   r   rQ   r   new_sizet_pointernew_uint64_pointerr4   r7   r6   value_uint64_pointerrB   rD   rC   r   r2   get_ipc_path_max_lenrz   rJ   zmq.constantsr&   r'   	zmq.errorr(   r)   r*   messager+   utilsr,   r:   r?   rF   rH   __all__r   r   r
   <module>r      s    
                CC CPP MM CC 
 WV SS II   
 sz*%%*)1)++  



 0 0 0 0 0 0 0 0 9 9 9 9 9 9 9 9 9 9       " " " " " "	! 	! 	! 	!# # # #"( ( ( (O= O= O= O= O= O= O= O=d '
(r   