U
    dM                     @   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   9/tmp/pip-unpacked-wheel-sfh45kzb/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 krtd|r*t||nd}z|	d| j||| W n tk
rb   tdY nX |rr|| |  |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   s   t |}| j}g }t|ts"|g}|D ]}||| |||< q&zN|js\| j	j
|d qF|jr|j\}
}|
dd  }
|r|
n
|
o|
d W S W 5 t|D ].\}	}||	 d k	r||	 ||< q||d  qX d S )N)timeoutr   r   )r   r   
isinstancelistappendget	enumeratepopreadyr   Zdrain_eventsvalue)r   methodr%   r*   r   r&   pendingZprev_pmir#   kwargsr   r   r   r    V   s&    


zAbstractChannel.waitc           
      C   sN  | j r$|| jkr$tt|| j d S |rb| jrbt|drbz|j	|j
|_W n tk
r`   Y nX z| j| }W n" tk
r   td|Y nX z| j| g}W n tk
r   g }Y nX d }z| j|}W n tk
r   |sY d S Y nX g }|jrt|j|d\}}|jr"|| |D ]}	|	|  q&|rJ||f|  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   r0   r#   r   r$   r-   )
r   Z
method_sigpayloadr$   Zamqp_methodZ	listenersZone_shotr#   _Zlistenerr   r   r   dispatch_methodp   sV     


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   
