o
    Œ¨ÊhM  ã                   @   s`   d Z ddlZddlmZmZ ddlmZmZ ddlm	Z	m
Z
 dZe d¡Zd	ZG d
d„ dƒZdS )z.Code common to Connection and Channel objects.é    N)Úensure_promiseÚpromiseé   )ÚAMQPNotImplementedErrorÚRecoverableConnectionError)ÚdumpsÚloads)ÚAbstractChannelÚamqpzIReceived method %s during closing channel %s. This method will be ignoredc                   @   sX   e Zd ZdZdd„ ZdZdd„ Zdd„ Z			
ddd„Zdd„ Z	ddd„Z
dd„ Zi Zd	S )r	   a   Superclass for Connection and Channel.

    The connection is treated as channel 0, then comes
    user-created channel objects.

    The subclasses must have a _METHOD_MAP class property, mapping
    between AMQP method signatures and Python methods.
    c                 C   s@   d| _ || _|| _| |j|< g | _d| _i | _i | _|  ¡  d S )NF)	Ú
is_closingÚ
connectionÚ
channel_idÚchannelsÚmethod_queueÚauto_decodeÚ_pendingÚ
_callbacksÚ_setup_listeners)Úselfr   r   © r   úG/var/www/html/env/lib/python3.10/site-packages/amqp/abstract_channel.pyÚ__init__   s   
zAbstractChannel.__init__)	r   r   r   r   r   r   r   Ú__dict__Ú__weakref__c                 C   s   | S ©Nr   ©r   r   r   r   Ú	__enter__7   s   zAbstractChannel.__enter__c                 G   s   |   ¡  d S r   )Úclose)r   Úexc_infor   r   r   Ú__exit__:   s   zAbstractChannel.__exit__NFc           
      C   sˆ   t ƒ }| j}	|	d u rtdƒ‚|rt||ƒnd}z|	 d| j|||¡ W n ty.   tdƒ‚w |r6| |¡ |ƒ  |rB| j||d�S |S )Nzconnection already closedÚ r   )Úreturns_tuple)	r   r   r   r   Úframe_writerr   ÚStopIterationÚthenÚwait)
r   ÚsigÚformatÚargsÚcontentr%   Úcallbackr!   ÚpÚconnr   r   r   Úsend_method=   s    ÿ
zAbstractChannel.send_methodc                 C   s   t dƒ‚)z!Close this Channel or Connection.zMust be overridden in subclass)ÚNotImplementedErrorr   r   r   r   r   R   s   zAbstractChannel.closec                 C   sB  t |ƒ}| j}g }t|tƒs|g}|D ]}| | |¡¡ |||< qza|js0| jj|d� |jr&|j	re|j	\}	}
|	dd … }	|rB|	n|	oG|	d W t
|ƒD ]\}}|| d ur]|| ||< qL| |d ¡ qLS W t
|ƒD ]\}}|| d ur{|| ||< qj| |d ¡ qjd S t
|ƒD ]\}}|| d ur™|| ||< qˆ| |d ¡ qˆw )N)Útimeoutr   r   )r   r   Ú
isinstanceÚlistÚappendÚgetÚreadyr   Údrain_eventsÚvalueÚ	enumerateÚpop)r   Úmethodr*   r/   r!   r+   ÚpendingÚprev_pÚmr(   ÚkwargsÚir   r   r   r%   V   s>   

ÿ
üûüüzAbstractChannel.waitc           
      C   s@  | j r|| jvrt t|| j¡ d S |r0| jr0t|dƒr0z
|j 	|j
¡|_W n	 ty/   Y nw z| j| }W n tyE   td|›�ƒ‚w z| j| g}W n tyY   g }Y nw d }z| j |¡}W n tyr   |spY d S Y nw g }|jr�t|j|dƒ\}}|jr‰| |¡ |D ]}	|	|Ž  q‹|rž||g|¢R Ž  d S d S )NÚcontent_encodingzUnknown AMQP method é   )r   Ú_ALLOWED_METHODS_WHEN_CLOSINGÚAMQP_LOGGERÚwarningÚ#IGNORED_METHOD_DURING_CHANNEL_CLOSEr   r   ÚhasattrÚbodyÚdecoder?   Ú	ExceptionÚ_METHODSÚKeyErrorr   r   r   r8   r(   r   r)   r2   )
r   Ú
method_sigÚpayloadr)   Úamqp_methodÚ	listenersÚone_shotr(   Ú_Úlistenerr   r   r   Údispatch_methodp   s`   ÿþÿþÿÿÿÿÿÿ

ÿzAbstractChannel.dispatch_method)NNNNNF)NNF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú	__slots__r   r   r-   r   r%   rR   rI   r   r   r   r   r	      s    	
þ
3r	   )rV   ÚloggingÚviner   r   Ú
exceptionsr   r   Úserializationr   r   Ú__all__Ú	getLoggerrB   rD   r	   r   r   r   r   Ú<module>   s    
