o
    Òó·ib  ã                   @   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   úhC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/internet/_producer_helpers.pyÚ__init__3   s   
z_PullToPush.__init__c                 c   s–   � 	 t jd| jd��}| j ¡  W d  ƒ n1 sw   Y  |jrGt jd| jd��}| j ¡  W d  ƒ n1 s:w   Y  |jrGd| _dS dV  q)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.
        Tz+while calling resumeProducing on {producer})ZproducerNz.while calling unregisterProducer on {consumer})r   )Ú_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   ó   | j  ¡  dS )z7
        @see: C{IPushProducer.pauseProducing}
        N)r   Zpauser   r   r   r   ÚpauseProducinge   ó   z_PullToPush.pauseProducingc                 C   r   )z8
        @see: C{IPushProducer.resumeProducing}
        N)r   Úresumer   r   r   r   r   k   r   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   