o
    Df
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   sL  t | | }|d7 }|dkr?td| |\}|d7 }zt| |||  }W n ty6   | |||  }Y nw ||7 }||fS |dkr`td| |\}|d7 }t| |||  }||7 }||fS |dkrtd| |\}|d7 }| |||  }||7 }||fS |dkrtd| |\}|d7 }||fS |d	krtd
| |\}|d7 }||fS |dkrtd| |\}|d7 }||fS |dkrtd| |\}|d7 }||fS |dkrtd| |\}|d7 }||fS |dkrtd| |\}|d7 }||fS |dkrtd| |\}|d7 }||fS |dkrtd| |\}|d7 }||fS |dkr-td| |\}|d7 }||fS |dkrAtd| |\}|d7 }||fS |dkrjtd| |\}|d7 }td| |\}|d7 }t|td|  }||fS |dkrtd| |\}|d7 }|| }	i }||	k rtd| |\}
|d7 }t| |||
  }||
7 }t| |\||< }||	k s||fS |dkrtd| |\}|d7 }|| }	g }||	k rt| |\}}|| ||	k s||fS |d krtd| |\}t|}|d7 }||fS |d!krtd| |\}|d7 }t	|}||fS |d"krd }||fS t
d#|t|)$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offsetftypeslenvalblenr    ntlenlimitkeylenkeyalenv r>   K/home/ubuntu/webapp/venv/lib/python3.10/site-packages/amqp/serialization.pyr+       s   b\VRNJFB>
:
6
2
.
'


 







r+   c                 C   sN  d }}g }|j }t| } | D ]}|dkr8|s(t|||d  }|d7 }d}|d@ dk}|dL }|d8 }nf|dkrMd }}td||\}|d7 }nQ|dkrbd }}td||\}|d	7 }n<|d
krwd }}td||\}|d7 }n'|dkrd }}td||\}|d7 }n|dkrd }}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 }n|dkrtd||\}
|d7 }||||
  }||
7 }n|dkrLd }}td||\}|d7 }|| }i }||k rKtd||\}|d7 }t||||  }||7 }t||\||< }||k s$nR|dkr}d }}td||\}|d7 }|| }g }||k r|t||\}}| | ||k skn!|dkrd }}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,   pr5   r4   r6   r8   r9   r:   r;   r<   avalr>   r>   r?   loads   s   














rK   c                 C   s0   | r|t dt|  g| R   g | d d < dS )Nr   r   )r   len)rG   writer>   r>   r?   
_flushbits   s   rN   c           
   	   C   sV  d}g }t  }|j}t| } t|D ]\}}| | }|dkrA|r#dnd}|d }	|	dkr2|d |d  ||	> O  < |d7 }q|dkrRt||}|td| q|dkret||}|tdt| q|d	krvt||}|td
| q|dkrt||}|td| q|dkrt||}|td| q|dkr|pd}t||}t|t	r|
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rt||}t|pi || q|dkrt||}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    rA   rB   r   r   r#   r$   r&   )r   rM   r)   	enumerater,   rN   r   int
isinstancestrencoderL   _write_table_write_arraycalendartimegmutctimetuplegetvalue)
r/   rH   rF   rG   outrM   r   r5   rI   shiftr>   r>   r?   dumps   sl   

















r^   c              
   C   s   t  }|j}|  D ]6\}}t|tr|dd}|tdt| || zt||| W q
 t	y@   t
tt|||w | }|tdt| || d S )NrA   rB   r   r   )r   rM   itemsrS   rT   rU   r   rL   _write_item
ValueErrorr   ILLEGAL_TABLE_TYPE_WITH_KEYr/   r0   r[   )r    rM   rG   r\   twritekr=   
table_datar>   r>   r?   rV   E  s"   
rV   c              	   C   sn   t  }|j}| D ]}zt||| W q ty#   ttt||w | }|t	dt
| || d S )Nr   )r   rM   r`   ra   r   ILLEGAL_TABLE_TYPE_WITH_VALUEr/   r0   r[   r   rL   )list_rM   rG   r\   awriter=   
array_datar>   r>   r?   rW   W  s   rW   c              	   C   s  t | ttfr"t | tr| dd} |tddt|  ||  d S t | tr3|tddt|  d S t | trB|tdd|  d S t | trc| d	ksO| d
k rY|tdd|  d S |tdd|  d S t | t	r| 
 \}}}d} |D ]}| d | } qs|r|  } |tdd| |  d S t | tr|tddtt|   d S t | tr|d t| || d S t | ttfr|d t| || d S | d u r|d d S t )NrA   rB   z>cI   Sz>cB   tz>cd   dii  z>cq   Lz>ci   Ir   r"   z>cBi   Dz>cQ   T   F   A   V)rS   rT   bytesrU   r   rL   r-   rR   floatr   as_tupler   rX   rY   rZ   dictrV   listtuplerW   ra   )r=   rM   rG   signdigitsexponentr    r>   r>   r?   r`   e  sD   






r`   c                 C   s   i }t d| |\}|d7 }|d@ r,t d| |\}|d7 }t| |||  |d< ||7 }|d@ rKt d| |\}|d7 }t| |||  |d< ||7 }|d	@ r\td
| |\}}|\|d< |d@ rmt d| |\|d< |d7 }|d@ r~t d| |\|d< |d7 }|d@ rt d| |\}|d7 }t| |||  |d< ||7 }|d@ rt 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@ rLt d| |\}|d7 }t| |||  |d< ||7 }|d@ rlt d| |\}|d7 }t| |||  |d < ||7 }|d!@ rt d| |\}|d7 }t| |||  |d"< ||7 }||fS )#zDecode basic properties.r   r   i   r   r   content_typei @  content_encodingi    r#   application_headersi   delivery_modei   priorityi   correlation_idi   reply_to   
expiration   
message_id@   r   	timestampr       r0      user_idapp_idr   
cluster_id)r   r)   rK   )r1   r2   
propertiesflagsr4   _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   s,   |dkrt d|| jv r| j| S t |)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 ]5\}}||d}	|	durB|dkr,|| d}d}|d|> O }|dkrB|t| ||	 |d8 }q|| t }
|
j}|D ]	}|td| qT|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   rM   r   r^   joinr[   )r   r]   	flag_bitsr   sformatsvaluesr   r;   proptyper5   resultrM   r>   r>   r?   _serialize_properties  s0   




z$GenericContent._serialize_propertiesr   c                 C   s8   t d||\}| _|d7 }| ||| | jsd| _|S )Nz>HxxQ   T)r   r   r   r   )r   r1   r2   r   r>   r>   r?   inbound_header2  s   zGenericContent.inbound_headerc                 C   sl   | j }|  jt|7  _| j| jkr/|r'|| t || _g |d d < n|| _d| _d S || d S )NT)	r   r   rL   r   r,   rt   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   rX   r   decimalr   ior   structr   r   
exceptionsr   specr	   utilsr
   r)   r   rE   rb   rf   r+   rK   rN   r^   rV   rW   r`   r   r   r   r   r>   r>   r>   r?   <module>   s0    rcI&I