a
    xdM                     @   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)AbstractChannelZamqpzIReceived method %s during closing channel %s. This method will be ignoredc                   @   sT   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_idZchannelsmethod_queueauto_decode_pending
_callbacksZ_setup_listeners)selfr   r    r   M/var/www/html/Ranjet/env/lib/python3.9/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Y n0 |rp|| |  |r| j||dS |S )Nzconnection already closed r   )returns_tuple)	r   r   r   r   Zframe_writerr   StopIterationZthenwait)
r   sigformatargscontentr    callbackr   pconnr   r   r   send_method=   s    
zAbstractChannel.send_methodc                 C   s   t ddS )z!Close this Channel or Connection.zMust be overridden in subclassN)NotImplementedErrorr   r   r   r   r   R   s    zAbstractChannel.closec                 C   sD  t |}| j}g }t|ts"|g}|D ]}||| |||< q&z|js\| jj|d qF|j	r|j	\}	}
|	dd  }	|r|	n
|	o|	d W t
|D ].\}}|| d ur|| ||< q||d  qS W t
|D ].\}}|| d ur|| ||< q||d  qn>t
|D ]2\}}|| d ur.|| ||< n||d  q
0 d S )N)timeoutr   r   )r   r   
isinstancelistappendgetreadyr   Zdrain_eventsvalue	enumeratepop)r   methodr%   r*   r   r&   pendingZprev_pmr#   kwargsir   r   r   r    V   s8    


zAbstractChannel.waitc           
      C   sH  | j r$|| jvr$tt|| j d S |r`| jr`t|dr`z|j	|j
|_W n ty^   Y n0 z| j| }W n  ty   td|Y n0 z| j| g}W n ty   g }Y n0 d }z| j|}W n ty   |sY d S Y n0 g }|jrt|j|d\}}|jr|| |D ]}	|	|  q|rD||g|R   d S )Ncontent_encodingzUnknown AMQP method    )r
   Z_ALLOWED_METHODS_WHEN_CLOSINGAMQP_LOGGERwarning#IGNORED_METHOD_DURING_CHANNEL_CLOSEr   r   hasattrbodydecoder8   	Exception_METHODSKeyErrorr   r   r   r2   r#   r   r$   r-   )
r   Z
method_sigpayloadr$   Zamqp_methodZ	listenersZone_shotr#   _Zlistenerr   r   r   dispatch_methodp   sT    


zAbstractChannel.dispatch_method)NNNNNF)NNF)__name__
__module____qualname____doc__r   	__slots__r   r   r(   r   r    rE   rA   r   r   r   r   r	      s   	  

3r	   )rI   loggingZviner   r   
exceptionsr   r   Zserializationr   r   __all__	getLoggerr:   r<   r	   r   r   r   r   <module>   s   
