o
    vvXj©  ã                   @   s€   d Z ddlmZmZ ddlZddlmZmZ ddlm	Z	m
Z
 ddlmZ ddlmZmZ d	gZe d
¡ZdZG dd	„ d	eƒZdS )z.Code common to Connection and Channel objects.é    )Úabsolute_importÚunicode_literalsN)Úensure_promiseÚpromiseé   )ÚAMQPNotImplementedErrorÚRecoverableConnectionError)Úbytes_if_py2)ÚdumpsÚloadsÚAbstractChannelÚamqpzIReceived method %s during closing channel %s. This method will be ignoredc                   @   sT   e Zd ZdZd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   úR/var/www/html/myproject/venv/lib/python3.10/site-packages/amqp/abstract_channel.pyÚ__init__    s   
zAbstractChannel.__init__c                 C   s   | S ©Nr   ©r   r   r   r   Ú	__enter__,   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tdƒ}z|	 d| j|||¡ W n ty0   tdƒ‚w |r8| |¡ |ƒ  |rD| j	||d�S |S )Nzconnection already closedÚ r   )Úreturns_tuple)
r   r   r   r
   r	   Úframe_writerr   ÚStopIterationÚthenÚwait)
r   ÚsigÚformatÚargsÚcontentr&   Úcallbackr"   ÚpÚconnr   r   r   Úsend_method2   s    ÿ
zAbstractChannel.send_methodc                 C   s   t dƒ‚)z!Close this Channel or Connection.zMust be overriden in subclass)ÚNotImplementedErrorr   r   r   r   r   G   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+   r0   r"   r,   ÚpendingÚprev_pÚmr)   ÚkwargsÚir   r   r   r&   K   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 {0!r}é   )r   Ú_ALLOWED_METHODS_WHEN_CLOSINGÚAMQP_LOGGERÚwarningÚ#IGNORED_METHOD_DURING_CHANNEL_CLOSEr   r   ÚhasattrÚbodyÚdecoder@   Ú	ExceptionÚ_METHODSÚKeyErrorr   r(   r   r   r9   r)   r   r*   r3   )
r   Ú
method_sigÚpayloadr*   Úamqp_methodÚ	listenersÚone_shotr)   Ú_Úlistenerr   r   r   Údispatch_methode   s`   ÿþÿþÿÿÿÿÿÿ

ÿzAbstractChannel.dispatch_method)NNNNNF)NNF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r    r.   r   r&   rS   rJ   r   r   r   r   r      s    	
þ
3)rW   Ú
__future__r   r   ÚloggingÚviner   r   Ú
exceptionsr   r   Úfiver	   Úserializationr
   r   Ú__all__Ú	getLoggerrC   rE   Úobjectr   r   r   r   r   Ú<module>   s    
