File: //proc/self/root/opt/alt/python311/lib64/python3.11/__pycache__/asynchat.cpython-311.pyc
�
    !A?h2-  �                   �   � d Z ddlZddlmZ ddlmZ dZ eeed��  �          G d� d	ej        �  �        Z	 G d
� d�  �        Z
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)�deque)�_deprecatedznThe {name} module is deprecated and will be removed in Python {remove}. The recommended replacement is asyncio)�   �   )�removec                   �   � e Zd ZdZdZdZdZdZdd�Zd� Z	d� Z
d	� Zd
� Zd� Z
d� Zd
� Zd� Zd� Zd� Zd� Zd� Zd� Zd� Zd� Zd� 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()i   r   zlatin-1Nc                 �   � d| _         g | _        t          �   �         | _        t          j        �                    | ||�  �         d S �N�    )�ac_in_buffer�incomingr   �
producer_fifo�asyncore�
dispatcher�__init__)�self�sock�maps      �//opt/alt/python311/lib64/python3.11/asynchat.pyr   zasync_chat.__init__J   sB   � ����
 ��
� #�W�W�����$�$�T�4��5�5�5�5�5r   c                 �    � t          d�  �        ��Nzmust be implemented in subclass��NotImplementedError�r   �datas     r   �collect_incoming_dataz async_chat.collect_incoming_dataX   �   � �!�"C�D�D�Dr   c                 �:   � | j         �                    |�  �         d S �N)r   �appendr   s     r   �_collect_incoming_dataz!async_chat._collect_incoming_data[   s   � ��
���T�"�"�"�"�"r   c                 �N   � d�                     | j        �  �        }| j        d d �= |S r   )�joinr   )r   �ds     r   �	_get_datazasync_chat._get_data^   s(   � ��H�H�T�]�#�#���M�!�!�!���r   c                 �    � t          d�  �        �r   r   �r   s    r   �found_terminatorzasync_chat.found_terminatorc   r   r   c                 ��   � t          |t          �  �        r| j        rt          || j        �  �        }n*t          |t
          �  �        r|dk     rt
          d�  �        �|| _        dS )zdSet the input delimiter.
        Can be a fixed string of any length, an integer, or None.
        r   z-the number of received bytes must be positiveN)�
isinstance�str�use_encoding�bytes�encoding�int�
ValueError�
terminator)r   �terms     r   �set_terminatorzasync_chat.set_terminatorf   sj   � �
 �d�C� � � 	N�T�%6� 	N���t�}�-�-�D�D�
��c�
"�
"� 	N�t�a�x�x��L�M�M�M�����r   c                 �   � | j         S r    )r2   r(   s    r   �get_terminatorzasync_chat.get_terminatorq   s
   � ���r   c                 �   � 	 | �                     | j        �  �        }n1# t          $ r Y d S t          $ r | �                    �   �          Y d S w xY wt          |t          �  �        r!| j        rt          t          | j	        �  �        }| j
        |z   | _
        | j
        �r�t          | j
        �  �        }| �                    �   �         }|s#| �
                    | j
        �  �         d| _
        �n�t          |t          �  �        r�|}||k     r2| �
                    | j
        �  �         d| _
        | j        |z
  | _        �nM| �
                    | j
        d |�         �  �         | j
        |d �         | _
        d| _        | �                    �   �          n�t          |�  �        }| j
        �                    |�  �        }|dk    rT|dk    r"| �
                    | j
        d |�         �  �         | j
        ||z   d �         | _
        | �                    �   �          nxt%          | j
        |�  �        }|r@||k    r8| �
                    | j
        d | �         �  �         | j
        | d �         | _
        d S | �
                    | j
        �  �         d| _
        | j
        ���d S d S )Nr   r   ���)�recv�ac_in_buffer_size�BlockingIOError�OSError�handle_errorr+   r,   r-   r.   r/   r
   �lenr6   r   r0   r2   r)   �find�find_prefix_at_end)r   r   �lbr2   �n�terminator_len�indexs          r   �handle_readzasync_chat.handle_ready   s�  � �	��9�9�T�3�4�4�D�D��� 	� 	� 	��F�F�� 	� 	� 	��������F�F�	���� �d�C� � � 	-�T�%6� 	-���d�m�,�,�D� �-��4��� �� 3	0��T�&�'�'�B��,�,�.�.�J�� 0
0��*�*�4�+<�=�=�=�$'��!�!��J��,�,� ,
0�����6�6��.�.�t�/@�A�A�A�(+�D�%�&*�o��&:�D�O�O��.�.�t�/@��!��/D�E�E�E�(,�(9�!�"�"�(=�D�%�&'�D�O��)�)�+�+�+�+� "%�Z�����)�.�.�z�:�:���B�;�;��q�y�y� �2�2�4�3D�V�e�V�3L�M�M�M�(,�(9�%��:N�:O�:O�(P�D�%� �)�)�+�+�+�+� /�t�/@�*�M�M�E�� 	0� �B�;�;� �6�6�t�7H��5�&��7Q�R�R�R�04�0A�5�&�'�'�0J�D�-��� �2�2�4�3D�E�E�E�,/��)�g �� 3	0� 3	0� 3	0� 3	0� 3	0s   � �
A�A�
Ac                 �.   � | �                     �   �          d S r    )�
initiate_sendr(   s    r   �handle_writezasync_chat.handle_write�   s   � ��������r   c                 �.   � | �                     �   �          d S r    )�closer(   s    r   �handle_closezasync_chat.handle_close�   s   � ��
�
�����r   c                 �  � t          |t          t          t          f�  �        st	          dt          |�  �        �  �        �| j        }t          |�  �        |k    rGt          dt          |�  �        |�  �        D ]'}| j	        �
                    ||||z   �         �  �         �(n| j	        �
                    |�  �         | �                    �   �          d S )Nz#data argument must be byte-ish (%r)r   )r+   r.   �	bytearray�
memoryview�	TypeError�type�ac_out_buffer_sizer>