3 \@, ã @ s@ d dl Z d dlmZ G dd„ de jƒZG dd„ dƒZdd„ ZdS ) é N)Údequec @ s¦ e Zd ZdZdZdZdZd'dd„Zdd„ Zd d „ Z dd„ Z d d„ Zdd„ Zdd„ Z dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ ZdS )(Ú async_chati r zlatin-1Nc C s( d| _ g | _tƒ | _tjj| ||ƒ d S )Nó )Úac_in_bufferÚincomingr Ú producer_fifoÚasyncoreÚ dispatcherÚ__init__)ÚselfZsockÚmap© r ú /usr/lib64/python3.6/asynchat.pyr C s zasync_chat.__init__c C s t dƒ‚d S )Nzmust be implemented in subclass)ÚNotImplementedError)r Údatar r r Úcollect_incoming_dataQ s z async_chat.collect_incoming_datac C s | j j|ƒ d S )N)r Úappend)r r r r r Ú_collect_incoming_dataT s z!async_chat._collect_incoming_datac C s dj | jƒ}| jd d …= |S )Nr )Újoinr )r Údr r r Ú _get_dataW s zasync_chat._get_datac C s t dƒ‚d S )Nzmust be implemented in subclass)r )r r r r Úfound_terminator\ s zasync_chat.found_terminatorc C sB t |tƒr| jrt|| jƒ}nt |tƒr8|dk r8tdƒ‚|| _d S )Nr z-the number of received bytes must be positive)Ú isinstanceÚstrÚuse_encodingÚbytesÚencodingÚintÚ ValueErrorÚ terminator)r Ztermr r r Úset_terminator_ s zasync_chat.set_terminatorc C s | j S )N)r )r r r r Úget_terminatorj s zasync_chat.get_terminatorc C sÒ y| j | jƒ}W n: tk r$ d S tk rJ } z| jƒ d S d }~X nX t|tƒrh| jrhtt| j ƒ}| j | | _ �xV| j �rÌt| j ƒ}| jƒ }|sª| j | j ƒ d| _ qxt|tƒ�r|}||k râ| j | j ƒ d| _ | j| | _n2| j | j d |… ƒ | j |d … | _ d| _| jƒ qxt|ƒ}| j j|ƒ}|dk�rp|dk�rR| j | j d |… ƒ | j || d … | _ | jƒ qxt| j |ƒ}|�r¸||k�r´| j | j d | … ƒ | j | d … | _ P qx| j | j ƒ d| _ qxW d S )Nr r é éÿÿÿÿ)ZrecvÚac_in_buffer_sizeÚBlockingIOErrorÚOSErrorÚhandle_errorr r r r r r Úlenr! r r r r ÚfindÚfind_prefix_at_end)r r ZwhyZlbr ÚnZterminator_lenÚindexr r r Úhandle_readr sR zasync_chat.handle_readc C s | j ƒ d S )N)Ú initiate_send)r r r r Úhandle_writeº s zasync_chat.handle_writec C s | j ƒ d S )N)Úclose)r r r r Úhandle_close½ s zasync_chat.handle_closec C s| t |tttfƒstdt|ƒƒ‚| j}t|ƒ|krdx>tdt|ƒ|ƒD ]}| j j |||| … ƒ qBW n| j j |ƒ | jƒ d S )Nz#data argument must be byte-ish (%r)r )r r Ú bytearrayÚ memoryviewÚ TypeErrorÚtypeÚac_out_buffer_sizer( Úranger r r. )r r ZsabsÚir r r ÚpushÀ s zasync_chat.pushc C s | j j|ƒ | jƒ d S )N)r r r. )r Zproducerr r r Úpush_with_producerÌ s zasync_chat.push_with_producerc C s dS )Nr" r )r r r r ÚreadableÐ s zasync_chat.readablec C s | j p| j S )N)r Ú connected)r r r r ÚwritableØ s zasync_chat.writablec C s | j jd ƒ d S )N)r r )r r r r Úclose_when_doneÜ s zasync_chat.close_when_donec C s �x| j o| j�r| j d }|s<| j d= |d kr<| jƒ d S | j}y|d |… }W n8 tk rŠ |jƒ }|r|| j j|ƒ n| j d= wY nX t|tƒr¨| j r¨t || jƒ}y| j|ƒ}W n t k rÒ | jƒ d S X |�r|t|ƒk sô|t|ƒk �r||d … | j d<