U
    W+d
C                     @   s   d Z ddlZddlmZ ddlmZ ddlmZ ddl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dZdZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZejeiZG dd  d ZdS )!zeConvert between bytestreams and higher-level AMQP types.

2007-11-05 Barry Pederson <bp@barryp.org>

    N)datetime)Decimal)BytesIO)packunpack_from   )FrameSyntaxError)Basic)bytes_to_str)str_to_bytesz*    Table type {0!r} not handled by amqp.
zCTable type {0!r} for key {1!r} not handled by amqp. [value: {2!r}]
z9    Table type {0!r} not handled by amqp. [value: {1!r}]
c                 C   s   t | | }|d7 }|dkr|td| |\}|d7 }zt| |||  }W n$ tk
rn   | |||  }Y nX ||7 }n||dkrtd| |\}|d7 }t| |||  }||7 }n>|dkrtd| |\}|d7 }| |||  }||7 }n|dkrtd| |\}|d7 }n|d	kr<td
| |\}|d7 }n|dkr`td| |\}|d7 }n|dkrtd| |\}|d7 }nt|dkrtd| |\}|d7 }nP|dkrtd| |\}|d7 }n,|dkrtd| |\}|d7 }n|dkrtd| |\}|d7 }n|dkr8td| |\}|d7 }n|dkr\td| |\}|d7 }n|dkrtd| |\}|d7 }td| |\}|d7 }t|td|  }nN|dkr*td| |\}|d7 }|| }	i }||	k rtd| |\}
|d7 }t| |||
  }||
7 }t| |\||< }qn|dkr~td| |\}|d7 }|| }	g }||	k rt| |\}}|| qVnz|d krtd| |\}t|}|d7 }nP|d!krtd| |\}|d7 }t	|}n$|d"krd }nt
d#|t|||fS )$Nr   S>I   s>BxbBz>bUz>h   u>HIz>iiLz>q   l>Qf>fdz>dD
   FAtTVz#Unknown value in table: {!r} ({!r}))chrr   pstr_tUnicodeDecodeErrorr   
_read_itemappendboolr   utcfromtimestampr   formattype)bufoffsetZftypeslenvalblenr    ntlenlimitkeylenkeyalenv r=   6/tmp/pip-unpacked-wheel-xhcdc304/amqp/serialization.pyr+       s    


















 r+   c                 C   sR  d }}g }|j }t| } | D ](}|dkrp|sPt|||d  }|d7 }d}|d@ dk}|dL }|d8 }n|dkrd }}td||\}|d7 }n|dkrd }}td||\}|d	7 }n||d
krd }}td||\}|d7 }nR|dkrd }}td||\}|d7 }n&|dkrFd }}td||\}|d7 }n|dkrd }}td||\}	|d7 }||||	  dd}||	7 }n|dkrd }}td||\}	|d7 }||||	  dd}||	7 }nb|dkrtd||\}
|d7 }||||
  }||
7 }n&|dkrd }}td||\}|d7 }|| }i }||k r@td||\}|d7 }t||||  }||7 }t||\||< }qNn|dkrd }}td||\}|d7 }|| }g }||k r@t||\}}| | qnB|dkr2d }}td||\}|d7 }t|}ntt	
||| q||fS )zDeserialize amqp format.

    bit = b
    octet = o
    short = B
    long = l
    long long = L
    float = f
    shortstr = s
    longstr = S
    table = F
    array = A
    timestamp = T
    r   r   r   r   or   r   r   r   r   r   r   r   r   r   r   r   utf-8surrogatepassr   r   r#   r$   r&   )r,   r)   ordr   decoder+   r   r.   r   ILLEGAL_TABLE_TYPEr/   )r/   r1   r2   bitcountbitsvaluesr,   pr4   r3   r5   r7   r8   r9   r:   r;   Zavalr=   r=   r>   loads   s    











rI   c                 C   s.   | r*|t dt|  f|   g | d d < dS )Nr   r   )r   len)rF   writer=   r=   r>   
_flushbits   s    rL   c           
   	   C   sj  d}g }t  }|j}t| } t|D ]0\}}| | }|dkr|rFdnd}|d }	|	dkrd|d |d  ||	> O  < |d7 }q$|dkrt||}|td| q$|dkrt||}|tdt| q$|d	krt||}|td
| q$|dkrt||}|td| q$|dkr4t||}|td| q$|dkr|pFd}t||}t|t	rj|
dd}|tdt| || q$|dks|dkr|pd}t||}t|t	r|
dd}|td
t| || q$|dkr
t||}t|p i || q$|dkr2t||}t|p(g || q$|dkr$|tdtt|  q$t|| | S )zSerialize AMQP arguments.

    Notes:
        bit = b
        octet = o
        short = B
        long = l
        long long = L
        shortstr = s
        longstr = S
        byte array = x
        table = F
        array = A
    r   r   r   r   r?   r   r   r   r   r   r   r   r   r    r@   rA   r   r   r#   r$   r&   )r   rK   r)   	enumerater,   rL   r   int
isinstancestrencoderJ   _write_table_write_arraycalendartimegmutctimetuplegetvalue)
r/   rG   rE   rF   outrK   r   r4   rH   shiftr=   r=   r>   dumps   sj    




















r\   c              
   C   s   t  }|j}|  D ]t\}}t|tr2|dd}|tdt| || zt||| W q t	k
r   t
tt|||Y qX q| }|tdt| || d S )Nr@   rA   r   r   )r   rK   itemsrQ   rR   rS   r   rJ   _write_item
ValueErrorr   ILLEGAL_TABLE_TYPE_WITH_KEYr/   r0   rY   )r    rK   rF   rZ   Ztwritekr<   Z
table_datar=   r=   r>   rT   E  s     
rT   c              	   C   sv   t  }|j}| D ]>}zt||| W q tk
rL   ttt||Y qX q| }|t	dt
| || d S )Nr   )r   rK   r^   r_   r   ILLEGAL_TABLE_TYPE_WITH_VALUEr/   r0   rY   r   rJ   )list_rK   rF   rZ   Zawriter<   Z
array_datar=   r=   r>   rU   W  s    rU   c              	   C   s  t | ttfrDt | tr$| dd} |tddt|  ||  nbt | trf|tddt|  n@t | tr|tdd|  n"t | tr| d	ks| d
k r|tdd|  n|tdd|  nt | t	r| 
 \}}}d} |D ]}| d | } q|r|  } |tdd| |  nt | trD|tddtt|   nbt | trf|d t| || n@t | ttfr|d t| || n| d kr|d nt d S )Nr@   rA   z>cI   Sz>cB   tz>cd   dii  z>cq   Lz>ci   Ir   r"   z>cBi   Dz>cQ   T   F   A   V)rQ   rR   bytesrS   r   rJ   r-   rP   floatr   as_tupler   rV   rW   rX   dictrT   listtuplerU   r_   )r<   rK   rF   signdigitsexponentr    r=   r=   r>   r^   e  sD    





r^   c                 C   s(  i }t d| |\}|d7 }|d@ rXt d| |\}|d7 }t| |||  |d< ||7 }|d@ rt d| |\}|d7 }t| |||  |d< ||7 }|d	@ rtd
| |\}}|\|d< |d@ rt d| |\|d< |d7 }|d@ rt d| |\|d< |d7 }|d@ r<t d| |\}|d7 }t| |||  |d< ||7 }|d@ r|t d| |\}|d7 }t| |||  |d< ||7 }|d@ rt d| |\}|d7 }t| |||  |d< ||7 }|d@ rt d| |\}|d7 }t| |||  |d< ||7 }|d@ r t d| |\|d< |d7 }|d@ r`t d| |\}|d7 }t| |||  |d< ||7 }|d@ rt d| |\}|d7 }t| |||  |d< ||7 }|d@ rt d| |\}|d7 }t| |||  |d < ||7 }|d!@ r t d| |\}|d7 }t| |||  |d"< ||7 }||fS )#zDecode basic properties.r   r   i   r   r   content_typei @  content_encodingi    r#   Zapplication_headersi   Zdelivery_modei   priorityi   Zcorrelation_idi   Zreply_to   Z
expiration   Z
message_id@   r   	timestampr       r0      Zuser_idZapp_idr   Z
cluster_id)r   r)   rI   )r1   r2   
propertiesflagsr3   _fr=   r=   r>   decode_properties_basic  s    









r   c                   @   sR   e Zd ZdZdZdgZdddZdZdd Zd	d
 Z	dd Z
dddZdd ZdS )GenericContentzdAbstract base class for AMQP content.

    Subclasses should override the PROPERTIES attribute.
    N)dummyr   c                 K   s.   || _ || _|| _g | _d| _d| _d| _d S )Nr   F)frame_method
frame_argsr   _pending_chunksbody_received	body_sizeready)selfr   r   propsr=   r=   r>   __init__  s    zGenericContent.__init__)	r   r   r   r   r   r   r   __dict____weakref__c                 C   s0   |dkrt d|| jkr$| j| S t |d S )N__setstate__)AttributeErrorr   )r   namer=   r=   r>   __getattr__  s
    

zGenericContent.__getattr__c                 C   s   t | ||\}}|| _|S )zLoad AMQP properties.

        Given the raw bytes containing the property-flags and property-list
        from a content-frame-header, parse and insert into a dictionary
        stored in this object as an attribute named 'properties'.
        )PROPERTY_CLASSESr   )r   class_idr1   r2   r   r=   r=   r>   _load_properties  s    zGenericContent._load_propertiesc                 C   s   d}d}g }g g  }}| j }| jD ]j\}}||d}	|	dk	r|dkrX|| d}d}|d|> O }|dkr|t| ||	 |d8 }q"|| t }
|
j}|D ]}|td| q|td	|| |

 S )zSerialize AMQP properties.

        Serialize the 'properties' attribute (a dictionary) into
        the raw bytes making up a set of property flags and a
        property list, suitable for putting into a content frame header.
           r   Nr   bitr       )r   
PROPERTIESgetr,   r   r   rK   r   r\   joinrY   )r   r[   	flag_bitsr   ZsformatZsvaluesr   r:   Zproptyper4   resultrK   r=   r=   r>   _serialize_properties  s0    




z$GenericContent._serialize_propertiesr   c                 C   s8   t d||\}| _|d7 }| ||| | js4d| _|S )Nz>HxxQ   T)r   r   r   r   )r   r1   r2   r   r=   r=   r>   inbound_header2  s    zGenericContent.inbound_headerc                 C   sj   | j }|  jt|7  _| j| jkr\|rN|| t || _g |d d < n|| _d| _n
|| d S )NT)	r   r   rJ   r   r,   rn   r   bodyr   )r   r1   chunksr=   r=   r>   inbound_body:  s    
zGenericContent.inbound_body)NN)r   )__name__
__module____qualname____doc__CLASS_IDr   r   	__slots__r   r   r   r   r   r=   r=   r=   r>   r     s   

#
r   ) r   rV   r   decimalr   ior   structr   r   
exceptionsr   specr	   utilsr
   r)   r   rD   r`   rb   r+   rI   rL   r\   rT   rU   r^   r   r   r   r   r=   r=   r=   r>   <module>   s0   rcI&I 