U
     T‚gb  ã                   @   sr   U d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 e
ƒ Zg Zee ed< eeƒG dd	„ d	ƒƒZd
S )z%
Helpers for working with producers.
é    )ÚList)Úimplementer)ÚIPushProducer)Ú	cooperate)ÚLoggerÚ__all__c                   @   sL   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ ZdS )Ú_PullToPushaÙ  
    An adapter that converts a non-streaming to a streaming producer.

    Because of limitations of the producer API, this adapter requires the
    cooperation of the consumer. When the consumer's C{registerProducer} is
    called with a non-streaming producer, it must wrap it with L{_PullToPush}
    and then call C{startStreaming} on the resulting object. When the
    consumer's C{unregisterProducer} is called, it must call
    C{stopStreaming} on the L{_PullToPush} instance.

    If the underlying producer throws an exception from C{resumeProducing},
    the producer will be unregistered from the consumer.

    @ivar _producer: the underling non-streaming producer.

    @ivar _consumer: the consumer with which the underlying producer was
                     registered.

    @ivar _finished: C{bool} indicating whether the producer has finished.

    @ivar _coopTask: the result of calling L{cooperate}, the task driving the
                     streaming producer.
    Fc                 C   s   || _ || _d S )N)Ú	_producerÚ	_consumer)ÚselfZpullProducerÚconsumer© r   úF/tmp/pip-unpacked-wheel-1_7di8ic/twisted/internet/_producer_helpers.pyÚ__init__3   s    z_PullToPush.__init__c              	   c   sn   t jd| jd��}| j ¡  W 5 Q R X |jrbt jd| jd��}| j ¡  W 5 Q R X |jrbd| _dS dV  q dS )zì
        A generator that calls C{resumeProducing} on the underlying producer
        forever.

        If C{resumeProducing} throws an exception, the producer is
        unregistered, which should result in streaming stopping.
        z+while calling resumeProducing on {producer})Zproducerz.while calling unregisterProducer on {consumer})r   TN)Ú_logZfailuresHandledr	   ÚresumeProducingÚfailedr
   ZunregisterProducerÚ	_finished)r   ÚopZ
handlingopr   r   r   Ú_pull7   s"    	 ÿþz_PullToPush._pullc                 C   s   t |  ¡ ƒ| _dS )z‡
        This should be called by the consumer when the producer is registered.

        Start streaming data to the consumer.
        N)r   r   Ú	_coopTask©r   r   r   r   ÚstartStreamingQ   s    z_PullToPush.startStreamingc                 C   s   | j r
dS d| _ | j ¡  dS )z�
        This should be called by the consumer when the producer is
        unregistered.

        Stop streaming data to the consumer.
        NT)r   r   Ústopr   r   r   r   ÚstopStreamingY   s    z_PullToPush.stopStreamingc                 C   s   | j  ¡  dS )z7
        @see: C{IPushProducer.pauseProducing}
        N)r   Úpauser   r   r   r   ÚpauseProducinge   s    z_PullToPush.pauseProducingc                 C   s   | j  ¡  dS )z8
        @see: C{IPushProducer.resumeProducing}
        N)r   Úresumer   r   r   r   r   k   s    z_PullToPush.resumeProducingc                 C   s   |   ¡  | j ¡  dS )z6
        @see: C{IPushProducer.stopProducing}
        N)r   r	   ÚstopProducingr   r   r   r   r   q   s    z_PullToPush.stopProducingN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r   r   r   r   r   r      s   r   N)r"   Útypingr   Zzope.interfacer   Ztwisted.internet.interfacesr   Ztwisted.internet.taskr   Ztwisted.loggerr   r   r   ÚstrÚ__annotations__r   r   r   r   r   Ú<module>   s   