
    h                         S r SSKJr  SSKJr  \" \R
                  \R                  5       " S S5      5       r " S S\5      rg)	z
Producer-Consumer Proxy.
    )implementer)
interfacesc                   r    \ rS rSrSrSrSrSrSrSr	Sr
SrS rS rS rS	 rS
 rS rS rS rS\4S jrSrg)BasicProducerConsumerProxy   aA  
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                 \    / U l         Ub"  Xl        UR                  X R                  5        g g N)_bufferconsumerregisterProduceriAmStreaming)selfr   s     \/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/twisted/protocols/pcp.py__init__#BasicProducerConsumerProxy.__init__#   s-    $M%%d,=,=>      c                 j    SU l         U R                  (       a  U R                  R                  5         g g NT)pausedproducerpauseProducingr   s    r   r   )BasicProducerConsumerProxy.pauseProducing+   s%    ==MM((* r   c                 <   SU l         U R                  (       aD  U R                  R                  SR	                  U R                  5      5        / U R                  S S & OU R
                  (       d  SU l        U R                  b  U R                  R                  5         g g )NF T)	r   r
   r   writejoinr   outstandingPullr   resumeProducingr   s    r   r   *BasicProducerConsumerProxy.resumeProducing0   sl    <<MM 56 DLLO$$'+$==$MM))+ %r   c                 r    U R                   b  U R                   R                  5         U R                  b  U ?g g r	   )r   stopProducingr   r   s    r   r"   (BasicProducerConsumerProxy.stopProducing=   s0    ==$MM'')==$ %r   c                    U R                   (       d"  U R                  (       d-  U R                  (       d  U R                  R	                  U5        g U R
                  b#  U R
                  R                  U5        SU l        g g NF)r   r   r   r
   appendr   r   r   datas     r   r    BasicProducerConsumerProxy.writeE   sT    ;;t009M9MLL%]]&MM%#(D  'r   c                 r    U R                   b  U R                   R                  5         U R                  5         g r	   )r   finishunregisterProducerr   s    r   r+   !BasicProducerConsumerProxy.finishN   s(    ==$MM  "!r   c                     Xl         X l        g r	   )r   producerIsStreamingr   r   	streamings      r   r   +BasicProducerConsumerProxy.registerProducerS   s     #, r   c                 ~    U R                   b  U ? U ?U R                  (       a  U R                  R                  5         g g r	   )r   r/   r   r,   r   s    r   r,   -BasicProducerConsumerProxy.unregisterProducerW   s3    ==$(==MM,,. r   returnc                 V    SU R                    S[        U 5      S SU R                   S3$ )N<@xz around >)	__class__idr   r   s    r   __repr__#BasicProducerConsumerProxy.__repr__^   s,    4>>"!BtHQ<xaHHr   )r
   r   r   r   r   r/   )__name__
__module____qualname____firstlineno____doc__r   r   r/   r   r   r   stoppedr   r   r   r"   r   r+   r   r,   strr=   __static_attributes__ r   r   r   r      sc    	 HHLOFG?+
,)"
-/I# Ir   r   c                   H    \ rS rSrSrSrSrSrS rS r	S r
S rS	 rS
 rSrg)ProducerConsumerProxyb   zProducerConsumerProxy 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                     SU l         g r   )r   r   s    r   r   $ProducerConsumerProxy.pauseProducingo   s     r   c                 2   SU l         U R                  (       ax  SR                  U R                  5      nU R                  U5      nU[	        U5      :  a-  XS  nU R
                  (       a   S5       eU/U R                  S S & O/ U R                  S S & OSnU R                  (       a?  U(       a8  U R                  (       d'  U R                  b  U R                  R                  5         U R
                  (       d  U(       + U l	        U R                  b  [        S U R                   5       5      nU R                  (       a1  X@R                  :  a"  SU l        U R                  R                  5         g U R                  (       a  U R                  R                  5         g g g )NFr   .Streaming producer did not write all its data.r   c              3   8   #    U  H  n[        U5      v   M     g 7fr	   len.0ss     r   	<genexpr>8ProducerConsumerProxy.resumeProducing.<locals>.<genexpr>        =1A   )r   r
   r   _writeSomeDatarQ   r   unregisteredr   r,   r   r   sumproducerPaused
bufferSizer   )r   r(   	bytesSentunsentbytesBuffereds        r   r   %ProducerConsumerProxy.resumeProducingt   s5   <<774<<(D++D1I3t9$j)))DCD)#)(Q"$QI LL)MM,,.  '0=D ==$===M ""(G&+#--/%% --/ & %r   c                 ~   U R                   (       d"  U R                  (       d-  U R                  (       d  U R                  R	                  U5        OU R
                  bt  U R                  (       a   S5       eU R                  U5      nSU l        U[        U5      :X  d5  U R                  (       a   S5       eU R                  R	                  XS  5        U R                  b`  U R                  (       aN  [        S U R                   5       5      nX0R                  :  a"  U R                  R                  5         SU l        g g g g )Nz9Writing fresh data to consumer before my buffer is empty!FrN   c              3   8   #    U  H  n[        U5      v   M     g 7fr	   rP   rR   s     r   rU   .ProducerConsumerProxy.write.<locals>.<genexpr>   rW   rX   T)r   r   r   r
   r&   r   rY   rQ   r   r/   r[   r]   r   r\   )r   r(   r^   r`   s       r   r   ProducerConsumerProxy.write   s    ;;t009M9MLL%]]&LLKJK  ++D1I#(D D	)))DCD)##D$45MM%4+C+C===M/,,.&*# 0 ,D%r   c                 n    SU l         [        R                  XU5        U(       d  UR                  5         g g r%   )rZ   r   r   r   r0   s      r   r   &ProducerConsumerProxy.registerProducer   s.    !"33DIN$$& r   c                     U R                   b  U ? U ?SU l        U R                  (       a-  U R                  (       d  U R                  R                  5         g g g r   )r   r/   rZ   r   r
   r,   r   s    r   r,   (ProducerConsumerProxy.unregisterProducer   sC    ==$( ==MM,,. ".=r   c                 j    U R                   c  gU R                   R                  U5        [        U5      $ )zPWrite as much of this data as possible.

@returns: The number of bytes written.
r   )r   r   rQ   r'   s     r   rY   $ProducerConsumerProxy._writeSomeData   s-    
 == D!4yr   )r   r   r\   rZ   N)r?   r@   rA   rB   rC   r]   r\   rZ   r   r   r   r   r,   rY   rF   rG   r   r   rI   rI   b   s7     JNL
+0Z+8'/r   rI   N)	rC   zope.interfacer   twisted.internetr   	IProducer	IConsumerr   rI   rG   r   r   <module>rp      sT   
 ' ' Z!!:#7#78PI PI 9PIfq6 qr   