grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026î £ f1.ã@sqdZddlZddlmZGdd„dejƒZGdd„dƒZGdd „d ƒZd d „ZdS) a¥A class supporting chat-style (command/response) protocols. This class adds support for 'chat' style protocols - where one side sends a 'command', and the other sends a response (examples would be the common internet protocols - smtp, nntp, ftp, etc..). The handle_read() method looks at the input stream for the current 'terminator' (usually '\r\n' for single-line responses, '\r\n.\r\n' for multi-line output), calling self.found_terminator() on its receipt. for example: Say you build an async nntp client using this class. At the start of the connection, you'll have self.terminator set to '\r\n', in order to process the single-line greeting. Just before issuing a 'LIST' command you'll set it to '\r\n.\r\n'. The output of the LIST command will be accumulated (using your own 'collect_incoming_data' method) up to the terminator, and then control will be returned to you - by calling your self.found_terminator() method. éN)Údequec@seZdZdZdZdZdZdZdddd„Zdd „Z d d „Z d d „Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„ZdS)(Ú async_chatz‡This is an abstract class. You must derive from this class, and add the two methods collect_incoming_data() and found_terminator()irzlatin-1NcCs8d|_g|_tƒ|_tjj|||ƒdS)Nó)Ú ac_in_bufferÚincomingrÚ producer_fifoÚasyncoreÚ dispatcherÚ__init__)ÚselfZsockÚmap©r ú-/opt/alt/python34/lib64/python3.4/asynchat.pyr Cs   zasync_chat.__init__cCstdƒ‚dS)Nzmust be implemented in subclass)ÚNotImplementedError)r Údatar r rÚcollect_incoming_dataQsz async_chat.collect_incoming_datacCs|jj|ƒdS)N)rÚappend)r rr r rÚ_collect_incoming_dataTsz!async_chat._collect_incoming_datacCs&dj|jƒ}|jdd…=|S)Nr)Újoinr)r Údr r rÚ _get_dataWszasync_chat._get_datacCstdƒ‚dS)Nzmust be implemented in subclass)r)r r r rÚfound_terminator\szasync_chat.found_terminatorcCsdt|tƒr-|jr-t||jƒ}n*t|tƒrW|dkrWtdƒ‚n||_dS)zdSet the input delimiter. Can be a fixed string of any length, an integer, or None. rz-the number of received bytes must be positiveN)Ú isinstanceÚstrÚ use_encodingÚbytesÚencodingÚintÚ ValueErrorÚ terminator)r Ztermr r rÚset_terminator_s zasync_chat.set_terminatorcCs|jS)N)r)r r r rÚget_terminatorjszasync_chat.get_terminatorcCsry|j|jƒ}WnHtk r.dSYn3tk r`}z|jƒdSWYdd}~XnXt|tƒrŽ|jrŽtt|j ƒ}n|j ||_ xÍ|j rmt |j ƒ}|j ƒ}|sç|j |j ƒd|_ q¡t|tƒrz|}||kr4|j |j ƒd|_ |j||_qj|j |j d|…ƒ|j |d…|_ d|_|jƒq¡t |ƒ}|j j|ƒ}|dkrô|dkrÍ|j |j d|…ƒn|j ||d…|_ |jƒq¡t|j |ƒ}|rQ||krM|j |j d| …ƒ|j | d…|_ nPq¡|j |j ƒd|_ q¡WdS)Nrrééÿÿÿÿ)ZrecvÚac_in_buffer_sizeÚBlockingIOErrorÚOSErrorÚ handle_errorrrrrrrÚlenr!rrrrÚfindÚfind_prefix_at_end)r rZwhyZlbrÚnZterminator_lenÚindexr r rÚ handle_readrsR             zasync_chat.handle_readcCs|jƒdS)N)Ú initiate_send)r r r rÚ handle_writeºszasync_chat.handle_writecCs|jƒdS)N)Úclose)r r r rÚ handle_close½szasync_chat.handle_closecCs­t|tttfƒs0tdt|ƒƒ‚n|j}t|ƒ|kr�xQtdt|ƒ|ƒD]$}|j j ||||…ƒqdWn|j j |ƒ|j ƒdS)Nz#data argument must be byte-ish (%r)r) rrÚ bytearrayÚ memoryviewÚ TypeErrorÚtypeÚac_out_buffer_sizer(Úrangerrr.)r rZsabsÚir r rÚpushÀs %zasync_chat.pushcCs|jj|ƒ|jƒdS)N)rrr.)r Zproducerr r rÚpush_with_producerÌszasync_chat.push_with_producercCsdS)z4predicate for inclusion in the readable for select()r"r )r r r rÚreadableÐszasync_chat.readablecCs|jp|j S)z4predicate for inclusion in the writable for select())rÚ connected)r r r rÚwritableØszasync_chat.writablecCs|jjdƒdS)zAautomatically close this channel once the outgoing queue is emptyN)rr)r r r rÚclose_when_doneÜszasync_chat.close_when_donecCspxi|jrk|jrk|jd}|sO|jd=|dkrO|jƒdSn|j}y|d|…}WnDtk r²|jƒ}|r¡|jj|ƒn |jd=wYnXt|tƒrà|j ràt ||j ƒ}ny|j |ƒ}Wn t k r|jƒdSYnX|rg|t|ƒks@|t|ƒkrZ||d…|jdr.rDr r r rr4s,       H       (rc@s+eZdZddd„Zdd„ZdS)Úsimple_producericCs||_||_dS)N)rÚ buffer_size)r rrJr r rr s zsimple_producer.__init__cCset|jƒ|jkrK|jd|j…}|j|jd…|_|S|j}d|_|SdS)Nr)r(rrJ)r Úresultr r rr?s  zsimple_producer.moreN)rErFrGr r?r r r rrIs rIc@s[eZdZddd„Zdd„Zdd„Zdd „Zd d „Zd d „ZdS)ÚfifoNcCs(|stƒ|_nt|ƒ|_dS)N)rÚlist)r rMr r rr !sz fifo.__init__cCs t|jƒS)N)r(rM)r r r rÚ__len__'sz fifo.__len__cCs|j S)N)rM)r r r rÚis_empty*sz fifo.is_emptycCs |jdS)Nr)rM)r r r rrB-sz fifo.firstcCs|jj|ƒdS)N)rMr)r rr r rr90sz fifo.pushcCs$|jrd|jjƒfSdSdS)Nr"r)rN)rMÚpopleft)r r r rÚpop3s zfifo.pop) rErFrGr rNrOrBr9rQr r r rrL s     rLcCsEt|ƒd}x.|r@|j|d|…ƒ r@|d8}qW|S)Nr")r(Úendswith)ZhaystackZneedleÚlr r rr*Is#r*) rHrÚ collectionsrr rrIrLr*r r r rÚ/s  Û)