U
    luf!                     @   sr   d Z ddlZddlmZmZmZ G dd dZG dd deeZG dd	 d	eeZG d
d deeZ	dd	dgZ
dS )zProxy classes and functions.    N)DeviceProcessDeviceThreadDevicec                   @   sN   e Zd ZdZejfddZdd Zdd Zdd	 Z	d
d Z
dd Zdd ZdS )	ProxyBasez"Base class for overriding methods.c                 C   s,   t j| ||d || _g | _g | _g | _d S )N)in_typeout_type)r   __init__mon_type
_mon_binds_mon_connects_mon_sockopts)selfr   r   r	    r   ;/tmp/pip-unpacked-wheel-h6ekxre8/zmq/devices/proxydevice.pyr      s
    zProxyBase.__init__c                 C   s   | j | dS )zaEnqueue ZMQ address for binding on mon_socket.

        See zmq.Socket.bind for details.
        N)r
   appendr   addrr   r   r   bind_mon   s    zProxyBase.bind_monc                 O   s(   | j |f||}| d||f  |S )zEnqueue a random port on the given interface for binding on
        mon_socket.

        See zmq.Socket.bind_to_random_port for details.

        .. versionadded:: 18.0
        z%s:%i)Z_reserve_random_portr   )r   r   argskwargsportr   r   r   bind_mon_to_random_port   s    z!ProxyBase.bind_mon_to_random_portc                 C   s   | j | dS )zgEnqueue ZMQ address for connecting on mon_socket.

        See zmq.Socket.connect for details.
        N)r   r   r   r   r   r   connect_mon)   s    zProxyBase.connect_monc                 C   s   | j ||f dS )zfEnqueue setsockopt(opt, value) for mon_socket

        See zmq.Socket.setsockopt for details.
        N)r   r   )r   optvaluer   r   r   setsockopt_mon0   s    zProxyBase.setsockopt_monc                 C   s~   t | \}}| j}|| j}| j| | jD ]\}}||| q2| j	D ]}|
| qN| jD ]}|| qd|||fS N)r   _setup_sockets_contextsocketr	   Z_socketsr   r   
setsockoptr
   bindr   connect)r   insoutsctxmonsr   r   Zifacer   r   r   r   7   s    

zProxyBase._setup_socketsc                 C   s    |   \}}}t||| d S r   )r   zmqproxy)r   r#   r$   r&   r   r   r   
run_deviceI   s    zProxyBase.run_deviceN)__name__
__module____qualname____doc__r'   ZPUBr   r   r   r   r   r   r)   r   r   r   r   r   
   s   r   c                   @   s   e Zd ZdZdS )Proxya  Threadsafe Proxy object.

    See zmq.devices.Device for most of the spec. This subclass adds a
    <method>_mon version of each <method>_{in|out} method, for configuring the
    monitor socket.

    A Proxy is a 3-socket ZMQ Device that functions just like a
    QUEUE, except each message is also sent out on the monitor socket.

    A PUB socket is the most logical choice for the mon_socket, but it is not required.
    Nr*   r+   r,   r-   r   r   r   r   r.   N   s   r.   c                   @   s   e Zd ZdZdS )ThreadProxyz&Proxy in a Thread. See Proxy for more.Nr/   r   r   r   r   r0   \   s   r0   c                   @   s   e Zd ZdZdS )ProcessProxyz'Proxy in a Process. See Proxy for more.Nr/   r   r   r   r   r1   `   s   r1   )r-   r'   Zzmq.devices.basedevicer   r   r   r   r.   r0   r1   __all__r   r   r   r   <module>   s   D