ó
L]c           @   s  d  Z  d d l Z d d l m Z m Z m Z m Z m Z m	 Z	 m
 Z
 m Z m Z m Z m 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 „ Z d
 d „ Z d
 d „ Z d e f d „  ƒ  YZ  d d g Z! d S(   s   zmq Socket classiÿÿÿÿNi   (   t   Ct   ffit   new_uint64_pointert   new_int64_pointert   new_int_pointert   new_binary_datat   value_uint64_pointert   value_int64_pointert   value_int_pointert   value_binary_datat   IPC_PATH_MAX_LEN(   t   Frame(   t   RCVMORE(   t   _retry_sys_call(   t   ZMQErrort	   _check_rct   _check_version(   t   unicodei    c         C   sJ   d d l  m } m } |  | k r) t ƒ  S|  | k r? t | ƒ St ƒ  Sd  S(   Niÿÿÿÿ(   t   int64_sockoptst   bytes_sockopts(   t   zmq.sugar.constantsR   R   R   R   R   (   t   optiont   lengthR   R   (    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyt   new_pointer_from_opt   s    
c         C   s_   d d l  m } m } |  | k r0 t | d ƒ S|  | k rM t j | | ƒ St | d ƒ Sd  S(   Niÿÿÿÿ(   R   R   i    (   R   R   R   t   intR   t   buffer(   R   t   opt_pointerR   R   R   (    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyt   value_from_opt_pointer#   s    c         C   sS   d d l  m } m } |  | k r, t | ƒ S|  | k rE t | | ƒ St | ƒ Sd  S(   Niÿÿÿÿ(   R   R   (   R   R   R   R   R	   R   (   R   t   valueR   R   R   (    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyt   initialize_opt_pointer.   s    
t   Socketc           B   sÝ   e  Z d Z d Z d Z d Z d Z e Z	 d  Z
 d d 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  e e d „ Z d  e e d „ Z d d „ Z RS(   i    c         C   s   | |  _  | d  k	 rQ t | t ƒ r0 | j } n  t j d | ƒ |  _ t |  _	 n! t
 |  _	 t j | j | ƒ |  _ |  j t j k r t ƒ  ‚ n  t
 |  _ d  S(   Ns   void *(   t   contextt   Nonet
   isinstanceR   t
   underlyingR   t   castt   _zmq_sockett   Truet   _shadowt   FalseR    t
   zmq_sockett   _zmq_ctxt   NULLR   t   _closed(   t   selfR   t   socket_typet   shadow(    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyt   __init__C   s    		c         C   s   t  t j d |  j ƒ ƒ S(   s+   The address of the underlying libzmq sockett   size_t(   R   R   R#   R$   (   R,   (    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyR"   Q   s    c         C   s]   |  j  r t Sy |  j t j ƒ Wn5 t k
 rX } | j t j k rR t |  _  t S‚  n Xt S(   sÒ   thorough 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
        (	   R+   R%   t   gett   zmqt   TYPER   t   errnot   ENOTSOCKR'   (   R,   t   e(    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyt   _check_closed_deepV   s    		c         C   s
   |  j  ƒ  S(   N(   R7   (   R,   (    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyt   closedj   s    c         C   sŽ   d } |  j  rq t |  d ƒ rq |  j d  k	 re | d  k	 rP |  j t j | ƒ n  t j |  j ƒ } n  t	 |  _  n  | d k  rŠ t
 | ƒ n  d  S(   Ni    R$   (   R+   t   hasattrR$   R    t   setR2   t   LINGERR    t	   zmq_closeR%   R   (   R,   t   lingert   rc(    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyt   closen   s    c         C   sH  t  | t ƒ r! | j d ƒ } n  t j |  j | ƒ } | d k  rDt rÁ t j ƒ  t j	 k rÁ t
 t k r~ | j d d ƒ } n  | j d d ƒ d } d j | t ƒ } t t j ƒ  d	 | ƒ‚ qDt j ƒ  t j k r7t
 t k r÷ | j d d ƒ } n  | j d d ƒ d } d
 j | ƒ } t t j ƒ  d	 | ƒ‚ qDt | ƒ n  d  S(   Nt   utf8i    s   utf-8t   replaces   ://i   iÿÿÿÿsL   ipc path "{0}" is longer than {1} characters (sizeof(sockaddr_un.sun_path)).t   msgs-   No such file or directory for ipc path "{0}".(   R!   R   t   encodeR    t   zmq_bindR$   R
   t	   zmq_errnot	   errno_modt   ENAMETOOLONGt   strt   decodet   splitt   formatR   t   ENOENTR   (   R,   t   addressR>   t   pathRB   (    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyt   bindy   s&    	c         C   sQ   t  d d ƒ t | t ƒ r. | j d ƒ } n  t j |  j | ƒ } t | ƒ d  S(   Ni   i   t   unbindR@   (   i   i   (   R   R!   R   RC   R    t
   zmq_unbindR$   R   (   R,   RM   R>   (    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyRP   ’   s
    c         C   sD   t  | t ƒ r! | j d ƒ } n  t j |  j | ƒ } t | ƒ d  S(   NR@   (   R!   R   RC   R    t   zmq_connectR$   R   (   R,   RM   R>   (    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyt   connect™   s    c         C   sQ   t  d d ƒ t | t ƒ r. | j d ƒ } n  t j |  j | ƒ } t | ƒ d  S(   Ni   i   t
   disconnectR@   (   i   i   (   R   R!   R   RC   R    t   zmq_disconnectR$   R   (   R,   RM   R>   (    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyRT   Ÿ   s
    c         C   s¹   d  } t | t ƒ r$ t d ƒ ‚ n  t | t ƒ rg | t j j k rX t d | ƒ ‚ n  t | ƒ } n  t	 | | | ƒ } | d } | d } t
 t j |  j | t j d | ƒ | ƒ d  S(   Ns   unicode not allowed, use bytess   not a bytes sockopt: %si    i   s   void*(   R    R!   R   t	   TypeErrort   bytesR2   t	   constantsR   t   lenR   R   R    t   zmq_setsockoptR$   R   R#   (   R,   R   R   R   t   c_datat   c_value_pointert   c_sizet(    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyR:   ¦   s    

	c         C   sŸ   t  | d d ƒ} | d } | d } t t j |  j | | | ƒ | d } t | | | ƒ } | t j k r› | t j j	 k r› | j
 d ƒ r› | d  } n  | S(   NR   iÿ   i    i   s    iÿÿÿÿ(   R   R   R    t   zmq_getsockoptR$   R   R2   t   IDENTITYRX   R   t   endswith(   R,   R   R[   R\   t   c_sizet_pointert   szt   v(    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyR1   »   s    

	
0c   	      C   s  t  | t ƒ r t d ƒ ‚ n  t  | t ƒ r9 | j } n  t j d ƒ } t  | t ƒ sl t | ƒ j ƒ  } n  t j d | ƒ } t	 j
 | t | ƒ ƒ } t | ƒ t	 j t	 j | ƒ | t | ƒ ƒ t t	 j | |  j | ƒ t	 j | ƒ } t | ƒ | rt j ƒ  Sd  S(   Ns/   Message must be in bytes, not an unicode Objects
   zmq_msg_t*s   char[](   R!   R   RV   R   RW   R   t   newt
   memoryviewt   tobytesR    t   zmq_msg_init_sizeRY   R   t   memcpyt   zmq_msg_dataR   t   zmq_msg_sendR$   t   zmq_msg_closeR2   t   MessageTracker(	   R,   t   messaget   flagst   copyt   trackt   zmq_msgt	   c_messageR>   t   rc2(    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyt   sendÍ   s     
"
c   	      C   sÚ   t  j d ƒ } t j | ƒ y t t j | |  j | ƒ Wn! t k
 r\ t j | ƒ ‚  n Xt  j	 t j
 | ƒ t j | ƒ ƒ } | } t j | ƒ } t | ƒ t | d | ƒ} |  j t ƒ | _ | rÒ | j S| Sd  S(   Ns
   zmq_msg_t*Rp   (   R   Rd   R    t   zmq_msg_initR   t   zmq_msg_recvR$   t	   ExceptionRk   R   Ri   t   zmq_msg_sizeR   R   t
   getsockoptR   t   moreRW   (	   R,   Rn   Ro   Rp   Rq   t   _bufferR   R>   t   frame(    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyt   recvä   s     $
iÿÿÿÿc         C   sz   t  d d ƒ | d k  r% t j } n  | d k r= t j } n  t | t ƒ r^ | j d ƒ } n  t	 j
 |  j | | ƒ } d S(   s  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.
        i   i   t   monitori    R@   N(   i   i   (   R   R2   t	   EVENT_ALLR    R   R*   R!   R   RC   R    t   zmq_socket_monitorR$   (   R,   t   addrt   eventsR>   (    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyR~   û   s    N(   t   __name__t
   __module__R    R   R-   R$   R+   t   _refR'   R&   t   copy_thresholdR/   t   propertyR"   R7   R8   R?   RO   RP   RS   RT   R:   R1   Rt   R%   R}   R~   (    (    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyR   :   s*   							R
   ("   t   __doc__R4   RF   t   _cffiR    R   R   R   R   R   R   R   R   R	   R
   Rm   R   RX   R   t   utilsR   R2   t	   zmq.errorR   R   R   t   zmq.utils.strtypesR   R   R   R   t   objectR   t   __all__(    (    (    s6   lib/python2.7/site-packages/zmq/backend/cffi/socket.pyt   <module>   s   LÝ