o
    DfM                     @   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   N/home/ubuntu/webapp/venv/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  qw )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rt|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    
