3
ñ\ð]“  ã               @   sP   d dl Z d dlZd dlZd\ZZZZZZ	Z
dd	d
ddddgZG dd„ deƒZdS )é    Né   é   é   é   é   é   ÚCONNECTÚ
DISCONNECTÚEVENTÚACKÚERRORÚBINARY_EVENTÚ
BINARY_ACKc               @   sj   e Zd ZdZeZedddddfd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dS )ÚPacketzSocket.IO packet.Nc             C   s|   || _ || _|| _|| _|s0|d kr\| j| jƒr\| j tkrBt| _ n| j tkrTt| _ nt	dƒ‚d| _
g | _|rx| j|ƒ| _
d S )Nz'Packet does not support binary payload.r   )Úpacket_typeÚdataÚ	namespaceÚidÚ_data_is_binaryr
   r   r   r   Ú
ValueErrorÚattachment_countÚattachmentsÚdecode)Úselfr   r   r   r   ÚbinaryÚencoded_packet© r   ú:/tmp/pip-build-mqc4i71p/python-socketio/socketio/packet.pyÚ__init__   s    

zPacket.__init__c             C   sà   t j| jƒ}| jtks | jtkrH| j| jƒ\}}|t jt|ƒƒd 7 }n
| j}d}d}| jdk	rx| jdkrx|| j7 }d}| j	dk	r¢|r’|d7 }d}|t j| j	ƒ7 }|dk	rÊ|r¶|d7 }|| j
j|d	d�7 }|dk	rÜ|g| }|S )
a  Encode the packet for transmission.

        If the packet contains binary elements, this function returns a list
        of packets where the first is the original packet with placeholders for
        the binary components and the remaining ones the binary attachments.
        ú-NFú/Tú,ú:)Ú
separators)r!   r"   )ÚsixÚ	text_typer   r   r   Ú_deconstruct_binaryr   Úlenr   r   ÚjsonÚdumps)r   r   r   r   Zneeds_commar   r   r   Úencode-   s,    


zPacket.encodec             C   s‚  |}yt |dd… ƒ| _W n tk
r8   || _d}Y nX d| _d| _|dd… }|jdƒ}d}|dkr˜|d|… jƒ r˜t |d|… ƒ}||d d… }|oª|dd… dk�r|jdƒ}|d
krÌ|| _d}n|d|… | _||d d… }| jjdƒ}|dk�r| jd|… | _|�rj|d jƒ �rjd| _x>|�rh|d jƒ �rh| jd	 t |d ƒ | _|dd… }�q,W |�r~| jj	|ƒ| _|S )zŸDecode a transmitted package.

        The return value indicates how many binary attachment packets are
        necessary to fully decode the packet.
        r   r   Ú Nr   r    r!   ú?é
   éÿÿÿÿr.   )
Úintr   Ú	TypeErrorr   r   ÚfindÚisdigitr   r(   Úloads)r   r   ÚepZdashr   ÚsepÚqr   r   r   r   L   s@    



zPacket.decodec             C   sH   | j t| jƒkrtdƒ‚| jj|ƒ | j t| jƒkrD| j| jƒ dS dS )NzUnexpected binary attachmentTF)r   r'   r   r   ÚappendÚreconstruct_binary)r   Ú
attachmentr   r   r   Úadd_attachmentt   s    zPacket.add_attachmentc             C   s   | j | j| jƒ| _dS )zYReconstruct a decoded packet using the given list of binary
        attachments.
        N)Ú_reconstruct_binary_internalr   r   )r   r   r   r   r   r8   }   s    zPacket.reconstruct_binaryc                sj   t |tƒr‡ ‡fdd„|D ƒS t |tƒrb|jdƒrFd|krFˆ |d  S ‡ ‡fdd„tj|ƒD ƒS n|S d S )Nc                s   g | ]}ˆj |ˆ ƒ‘qS r   )r;   )Ú.0Úitem)r   r   r   r   ú
<listcomp>†   s   z7Packet._reconstruct_binary_internal.<locals>.<listcomp>Ú_placeholderÚnumc                s   i | ]\}}ˆj |ˆ ƒ|“qS r   )r;   )r<   ÚkeyÚvalue)r   r   r   r   ú
<dictcomp>Œ   s   z7Packet._reconstruct_binary_internal.<locals>.<dictcomp>)Ú
isinstanceÚlistÚdictÚgetr$   Ú	iteritems)r   r   r   r   )r   r   r   r;   „   s    

z#Packet._reconstruct_binary_internalc             C   s   g }| j ||ƒ}||fS )z(Extract binary components in the packet.)Ú_deconstruct_binary_internal)r   r   r   r   r   r   r&   ’   s    zPacket._deconstruct_binaryc                sr   t |tjƒr(ˆ j|ƒ dtˆ ƒd dœS t |tƒrF‡ ‡fdd„|D ƒS t |tƒrj‡ ‡fdd„tj|ƒD ƒS |S d S )NTr   )r?   r@   c                s   g | ]}ˆj |ˆ ƒ‘qS r   )rI   )r<   r=   )r   r   r   r   r>   �   s   z7Packet._deconstruct_binary_internal.<locals>.<listcomp>c                s   i | ]\}}ˆj |ˆ ƒ|“qS r   )rI   )r<   rA   rB   )r   r   r   r   rC       s   z7Packet._deconstruct_binary_internal.<locals>.<dictcomp>)rD   r$   Úbinary_typer7   r'   rE   rF   rH   )r   r   r   r   )r   r   r   rI   ˜   s    


z#Packet._deconstruct_binary_internalc                sr   t |tjƒrdS t |tƒr:tjdd„ ‡ fdd„|D ƒdƒS t |tƒrjtjdd„ ‡ fdd„tj|ƒD ƒdƒS dS d	S )
z-Check if the data contains binary components.Tc             S   s   | p|S )Nr   )ÚaÚbr   r   r   Ú<lambda>«   s    z(Packet._data_is_binary.<locals>.<lambda>c                s   g | ]}ˆ j |ƒ‘qS r   )r   )r<   r=   )r   r   r   r>   «   s   z*Packet._data_is_binary.<locals>.<listcomp>Fc             S   s   | p|S )Nr   )rK   rL   r   r   r   rM   ¯   s    c                s   g | ]}ˆ j |ƒ‘qS r   )r   )r<   r=   )r   r   r   r>   ¯   s   N)rD   r$   rJ   rE   Ú	functoolsÚreducerF   Ú
itervalues)r   r   r   )r   r   r   ¥   s    

zPacket._data_is_binary)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú_jsonr(   r
   r   r*   r   r:   r8   r;   r&   rI   r   r   r   r   r   r      s   (	r   )r   r   r   r   r   r   r   )rN   r(   rU   r$   r   r	   r
   r   r   r   r   Zpacket_namesÚobjectr   r   r   r   r   Ú<module>   s   
