U
    W+dN                     @   s   d Z ddlmZ ddlmZmZmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ d	ZeejjejjejjgZd
ZeefddZG dd dZeeeeeeefddZdS )z5Convert between frames and higher-level AMQP methods.    defaultdict)pack	pack_intounpack_from   )spec)Message)UnexpectedFrame)str_to_bytes)frame_handlerframe_writer(   c                    s*   t dd i  fdd}|S )z!Create closure that reads frames.c                   S   s   dS )Nr    r   r   r   7/tmp/pip-unpacked-wheel-xhcdc304/amqp/method_framing.py<lambda>       zframe_handler.<locals>.<lambda>c                    s<  | \}}} j d7  _ || dfkr>td|| n|dkrd|d}|krvt||d|< d|< dS  |||d  n|dkrڈ| }|| |jsd	|< dS d|< |d   ||j|j| n^|d	kr*| }|	| |jsdS d|< |d   ||j|j| n|dkr8dS d
S )Nr      z*Received frame {} while expecting type: {}>HHr   )frame_method
frame_args   F   T)
Z
bytes_recvr
   formatr	   Zinbound_headerreadypopr   r   Zinbound_body)frameZ
frame_typechannelbuf
method_sigmsgcallback
connectioncontent_methodsZexpected_typesZpartial_messagesr   r   r   on_frame"   sN    
  




zframe_handler.<locals>.on_framer   )r#   r"   r   r$   r%   r   r!   r   r      s    1r   c                   @   s.   e Zd Zdd Zedd Zejdd ZdS )Bufferc                 C   s
   || _ d S N)r   selfr   r   r   r   __init__W   s    zBuffer.__init__c                 C   s   | j S r'   )_buf)r)   r   r   r   r   Z   s    z
Buffer.bufc                 C   s   || _ t|| _d S r'   )r+   
memoryviewviewr(   r   r   r   r   ^   s    N)__name__
__module____qualname__r*   propertyr   setterr   r   r   r   r&   V   s
   
r&   c	           
         s6   |j ttjd   fdd}	|	S )z"Create closure that writes frames.r   c              	      s  j d }d}d }|}|r|j}t|trF|jdd}	||	}| }|}
|p`d}|| |
 t }||k}n
d\}}
}|rf| dkrd	d| |gnd}|}d	| | |||d
 |r~d	d|d d||g}|}d	| d|||d
 d|
|D ]8}||||  }|}d	| d|||d
 q(n| j
krt| _
 j
}| dkrd	d| |gnd}|}d	| ||| |||d
 |d| 7 }|d k	rld	d|d d||g}|}d	| ||d|||d
 |d| 7 }|}
|
dkrl|
}d	| ||d|||d
 |d| 7 } jd |   jd7  _d S )Nr   r   content_encodingzutf-8)Nr   r   r   r   r   z>BHI%dsB   z>HHQr   r   )r   )r   )	frame_maxbody
isinstancestr
properties
setdefaultencodeZ_serialize_propertiesFRAME_OVERHEADjoinr   	bytearrayr-   Z
bytes_sent)type_r   r   argscontent
chunk_sizeoffsetr9   r6   encodingZbodylenZproperties_lenZframelenZbigbodyr   ir   Zbuffer_storer#   lenr   r   ranger   writer   r   write_frameo   s    

 



    
    
   
    
    
    z!frame_writer.<locals>.write_frame)rI   r&   r>   r5   )
r#   	transportr   r   rH   rG   bytesr   Ztext_trJ   r   rF   r   r   g   s    Nr   N)__doc__collectionsr   structr   r   r    r   Zbasic_messager	   
exceptionsr
   utilsr   __all__	frozensetZBasicZReturnZDeliverZGetOkZ_CONTENT_METHODSr<   r   r&   rH   rG   rL   r8   r   r   r   r   r   <module>   s2   
 
:     