Ë
    oj  ã                   óŠ   — d Z ddlmZ ddlmZ  eej
                  ej                  «       G d„ d«      «       Z G d„ de«      Zy)	z
Producer-Consumer Proxy.
é    )Úimplementer)Ú
interfacesc                   óh   — e Zd ZdZdZdZdZdZdZdZ	dZ
d„ Zd„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zdefd„Zy)ÚBasicProducerConsumerProxyaa  
    I can act as a man in the middle between any Producer and Consumer.

    @ivar producer: the Producer I subscribe to.
    @type producer: L{IProducer<interfaces.IProducer>}
    @ivar consumer: the Consumer I publish to.
    @type consumer: L{IConsumer<interfaces.IConsumer>}
    @ivar paused: As a Producer, am I paused?
    @type paused: bool
    NTFc                 ó^   — g | _         |�$|| _        |j                  | | j                  «       y y ©N)Ú_bufferÚconsumerÚregisterProducerÚiAmStreaming)Úselfr
   s     ú7/usr/lib/python3/dist-packages/twisted/protocols/pcp.pyÚ__init__z#BasicProducerConsumerProxy.__init__#   s1   € ØˆŒØÐØ$ˆDŒMØ×%Ñ% d¨D×,=Ñ,=Õ>ð  ó    c                 ó`   — d| _         | j                  r| j                  j                  «        y y ©NT)ÚpausedÚproducerÚpauseProducing©r   s    r   r   z)BasicProducerConsumerProxy.pauseProducing+   s%   € ØˆŒØ�=Š=Ø�M‰M×(Ñ(Õ*ð r   c                 ó&  — d| _         | j                  rD| j                  j                  dj	                  | j                  «      «       g | j                  d d  n| j
                  sd| _        | j                  �| j                  j                  «        y y )NFÚ T)	r   r	   r
   ÚwriteÚjoinr   ÚoutstandingPullr   ÚresumeProducingr   s    r   r   z*BasicProducerConsumerProxy.resumeProducing0   sl   € ØˆŒØ�<Š<à�M‰M×Ñ §¡¨¯©Ó 5Ô6Ø ˆD�L‰L™‰Oà×$Ò$Ø'+�Ô$à�=‰=Ð$Ø�M‰M×)Ñ)Õ+ð %r   c                 ón   — | j                   �| j                   j                  «        | j                  �| `y y r   )r   ÚstopProducingr
   r   s    r   r   z(BasicProducerConsumerProxy.stopProducing=   s0   € Ø�=‰=Ð$Ø�M‰M×'Ñ'Ô)Ø�=‰=Ð$Ø‘ð %r   c                 óâ   — | j                   s| j                  s(| j                  s| j                  j	                  |«       y | j
                  �#| j
                  j                  |«       d| _        y y ©NF)r   r   r   r	   Úappendr
   r   ©r   Údatas     r   r   z BasicProducerConsumerProxy.writeE   sT   € Ø�;Š;˜t×0Ò0¸×9MÒ9Mà�L‰L×Ñ Õ%à�]‰]Ð&Ø�M‰M×Ñ Ô%Ø#(ˆDÕ ð 'r   c                 óp   — | j                   �| j                   j                  «        | j                  «        y r   )r
   ÚfinishÚunregisterProducerr   s    r   r%   z!BasicProducerConsumerProxy.finishN   s(   € Ø�=‰=Ð$Ø�M‰M× Ñ Ô"Ø×ÑÕ!r   c                 ó    — || _         || _        y r   )r   ÚproducerIsStreaming©r   r   Ú	streamings      r   r   z+BasicProducerConsumerProxy.registerProducerS   s   € Ø ˆŒØ#,ˆÕ r   c                 ór   — | j                   �| ` | `| j                  r| j                  j                  «        y y r   )r   r(   r
   r&   r   s    r   r&   z-BasicProducerConsumerProxy.unregisterProducerW   s3   € Ø�=‰=Ð$Ø�ØÐ(Ø�=Š=Ø�M‰M×,Ñ,Õ.ð r   Úreturnc                 óV   — d| j                   › dt        | «      d›d| j                  › d�S )Nú<ú@Úxz around ú>)Ú	__class__Úidr
   r   s    r   Ú__repr__z#BasicProducerConsumerProxy.__repr__^   s,   € Ø�4—>‘>Ð" !¤B t£H¨Q <¨x¸¿¹°ÀaÐHÐHr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r   r(   r   r   r   Ústoppedr   r   r   r   r   r%   r   r&   Ústrr4   © r   r   r   r      sc   „ ñ	ð €HØ€HØÐØ€LØ€OØ€FØ€Gò?ò+ò
,òò)ò"ò
-ò/ðI˜#ô Ir   r   c                   ó@   — e Zd ZdZdZdZdZd„ Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zy
)ÚProducerConsumerProxyz˜ProducerConsumerProxy with a finite buffer.

    When my buffer fills up, I have my parent Producer pause until my buffer
    has room in it again.
    i   Fc                 ó   — d| _         y r   )r   r   s    r   r   z$ProducerConsumerProxy.pauseProducingo   s   € ð ˆ�r   c                 óÖ  — d| _         | j                  rsdj                  | j                  «      }| j                  |«      }|t	        |«      k  r)||d  }| j
                  rJ d«       ‚|g| j                  d d  ng | j                  d d  nd}| j                  r4|r2| j                  s&| j                  �| j                  j                  «        | j
                  s| | _	        | j                  ��t        d„ | j                  D «       «      }| j                  r1|| j                  k  r"d| _        | j                  j                  «        y | j                  r| j                  j                  «        y y y )NFr   ú.Streaming producer did not write all its data.r   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr   ©Úlen©Ú.0Úss     r   ú	<genexpr>z8ProducerConsumerProxy.resumeProducing.<locals>.<genexpr>�   ó   è ø€ Ò=¨1¤ A§Ñ=ùó   ‚)r   r	   r   Ú_writeSomeDatarC   r   Úunregisteredr
   r&   r   r   ÚsumÚproducerPausedÚ
bufferSizer   )r   r#   Ú	bytesSentÚunsentÚbytesBuffereds        r   r   z%ProducerConsumerProxy.resumeProducingt   s9  € ØˆŒØ�<Š<Ø—7‘7˜4Ÿ<™<Ó(ˆDØ×+Ñ+¨DÓ1ˆIØœ3˜t›9Ò$Ø˜i˜jÐ)�à×)Ò)ðDàCóDØ)à#) (�—‘™Q‘à"$�—‘™Q‘àˆIð ×ÒÙØ—L’LØ—‘Ð)à�M‰M×,Ñ,Ô.à× Ò Ø'0 =ˆDÔ à�=‰=Ð$ÜÑ=°·±Ô=Ó=ˆMð ×"Ò"¨¸¿¹Ò(Gà&+�Ô#Ø—‘×-Ñ-Õ/Ø×%Ò%ð —‘×-Ñ-Õ/ð &ð %r   c                 ó>  — | j                   s| j                  s(| j                  s| j                  j	                  |«       nv| j
                  �j| j                  rJ d«       ‚| j                  |«      }d| _        |t        |«      k(  s1| j                  rJ d«       ‚| j                  j	                  ||d  «       | j                  �[| j                  rNt        d„ | j                  D «       «      }|| j                  k\  r"| j                  j                  «        d| _        y y y y )Nz9Writing fresh data to consumer before my buffer is empty!Fr@   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr   rB   rD   s     r   rG   z.ProducerConsumerProxy.write.<locals>.<genexpr>¸   rH   rI   T)r   r   r   r	   r!   r
   rJ   rC   r   r(   rL   rN   r   rM   )r   r#   rO   rQ   s       r   r   zProducerConsumerProxy.write¡   s   € Ø�;Š;˜t×0Ò0¸×9MÒ9Mà�L‰L×Ñ Õ%à�]‰]Ð&à—L’LðKàJóKØ ð ×+Ñ+¨DÓ1ˆIØ#(ˆDÔ Ø¤ D£	Ò)à×)Ò)ðDàCóDØ)à—‘×#Ñ# D¨¨Ð$4Ô5à�M‰MÐ%¨4×+CÒ+CÜÑ=°·±Ô=Ó=ˆMØ §¡Ò/Ø—‘×,Ñ,Ô.Ø&*�Õ#ð 0ð ,DÐ%r   c                 óf   — d| _         t        j                  | ||«       |s|j                  «        y y r    )rK   r   r   r   r)   s      r   r   z&ProducerConsumerProxy.registerProducer½   s0   € Ø!ˆÔÜ"×3Ñ3°D¸(ÀIÔNÙØ×$Ñ$Õ&ð r   c                 óš   — | j                   �| ` | `d| _        | j                  r(| j                  s| j                  j                  «        y y y r   )r   r(   rK   r
   r	   r&   r   s    r   r&   z(ProducerConsumerProxy.unregisterProducerÃ   sC   € Ø�=‰=Ð$Ø�ØÐ(Ø ˆÔØ�=Š= §¢Ø�M‰M×,Ñ,Õ.ð ".ˆ=r   c                 óh   — | j                   €y| j                   j                  |«       t        |«      S )z`Write as much of this data as possible.

        @returns: The number of bytes written.
        r   )r
   r   rC   r"   s     r   rJ   z$ProducerConsumerProxy._writeSomeDataË   s-   € ð
 �=‰=Ð ØØ�‰×Ñ˜DÔ!Ü�4‹yÐr   N)r5   r6   r7   r8   rN   rM   rK   r   r   r   r   r&   rJ   r;   r   r   r=   r=   b   s7   „ ñð €Jà€NØ€Lòò
+0òZ+ò8'ò/ór   r=   N)	r8   Úzope.interfacer   Útwisted.internetr   Ú	IProducerÚ	IConsumerr   r=   r;   r   r   ú<module>r[      sT   ðñ
õ 'å 'ñ ˆZ×!Ñ! :×#7Ñ#7Ó8÷PIð PIó 9ðPIôfqÐ6õ qr   