B
    0*™\P  ã               @   sÈ   d ddgZ ddlZddlZddlZddlZddlmZ ddlmZm	Z	 ddl
mZ dZd	Ze d
¡Ze dej¡ZG dd „ d ƒZG dd„ deƒZdZG dd„ deƒZeeejd ƒƒZde ZejZdS )Ú	GeneratorÚDecodedGeneratorÚBytesGeneratoré    N)Údeepcopy)ÚStringIOÚBytesIO)Ú_has_surrogatesÚ_Ú
z
\r\n|\r|\nz^From c               @   s¬   e Zd Zd&ddœdd„Zdd„ Zd'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eZdd„ Zdd„ Zdd„ Zd d!„ Zed(d"d#„ƒZed$d%„ ƒZdS ))r   N)Úpolicyc            C   s6   |d kr|d krdn|j }|| _|| _|| _|| _d S )NT)Úmangle_from_Ú_fpÚ_mangle_from_Úmaxheaderlenr   )ÚselfÚoutfpr   r   r   © r   ú:C:\ALexclude\prg\programme\Python37\Lib\email\generator.pyÚ__init__$   s    zGenerator.__init__c             C   s   | j  |¡ d S )N)r   Úwrite)r   Úsr   r   r   r   D   s    zGenerator.writeFc             C   sØ   | j d kr|j n| j }|d k	r*|j|d}| jd k	rB|j| jd}|j| _|  | j¡| _d| _|  | j¡| _| j }|j }zL|| _ ||_ |r¸| 	¡ }|s¨dt
 t
 
¡ ¡ }|  || j ¡ |  |¡ W d || _ ||_ X d S )N)Úlinesep)Úmax_line_lengthÚ zFrom nobody )r   Úcloner   r   Ú_NLÚ_encodeÚ_encoded_NLZ_EMPTYÚ_encoded_EMPTYZget_unixfromÚtimeZctimer   Ú_write)r   ÚmsgÚunixfromr   r   Zold_gen_policyZold_msg_policyZufromr   r   r   ÚflattenH   s,    
zGenerator.flattenc             C   s   | j || jd | jdS )N)r   )Ú	__class__r   r   )r   Úfpr   r   r   r   y   s    zGenerator.clonec             C   s   t ƒ S )N)r   )r   r   r   r   Ú_new_buffer   s    zGenerator._new_bufferc             C   s   |S )Nr   )r   r   r   r   r   r   ‘   s    zGenerator._encodec             C   sX   |sd S t  |¡}x*|d d… D ]}|  |¡ |  | j¡ q W |d rT|  |d ¡ d S )Néÿÿÿÿ)ÚNLCREÚsplitr   r   )r   ÚlinesÚliner   r   r   Ú_write_lines•   s    

zGenerator._write_linesc             C   s¤   | j }z"d | _|  ¡  | _ }|  |¡ W d || _ | j}| `X |rht|ƒ}| d|d ¡ | d|d ¡ t|dd ƒ}|d krˆ|  |¡ n|| ƒ | j  | 	¡ ¡ d S )Nzcontent-transfer-encodingr   zcontent-typeé   Ú_write_headers)
r   Ú
_munge_cter&   Ú	_dispatchr   Zreplace_headerÚgetattrr.   r   Úgetvalue)r   r!   ZoldfpZsfpZ	munge_cteÚmethr   r   r   r    ¥   s"    zGenerator._writec             C   st   |  ¡ }| ¡ }t ||f¡ dd¡}t| d| d ƒ}|d krh| dd¡}t| d| d ƒ}|d krh| j}||ƒ d S )Nú-r	   Z_handle_)Úget_content_maintypeÚget_content_subtypeÚ
UNDERSCOREÚjoinÚreplacer1   Ú
_writeBody)r   r!   ÚmainÚsubZspecificr3   Zgenericr   r   r   r0   È   s    zGenerator._dispatchc             C   s:   x(|  ¡ D ]\}}|  | j ||¡¡ q
W |  | j¡ d S )N)Ú	raw_itemsr   r   Zfoldr   )r   r!   ÚhÚvr   r   r   r.   Ü   s    zGenerator._write_headersc             C   sž   |  ¡ }|d krd S t|tƒs.tdt|ƒ ƒ‚t|jƒr~| d¡}|d k	r~t|ƒ}|d= | 	||¡ |  ¡ }|d |d f| _
| jrt d|¡}|  |¡ d S )Nzstring payload expected: %sÚcharsetzcontent-transfer-encodingzcontent-typez>From )Úget_payloadÚ
isinstanceÚstrÚ	TypeErrorÚtyper   Ú_payloadZ	get_paramr   Zset_payloadr/   r   Úfcrer<   r,   )r   r!   Úpayloadr@   r   r   r   Ú_handle_textæ   s"    


zGenerator._handle_textc             C   s¢  g }|  ¡ }|d krg }n(t|tƒr2|  |¡ d S t|tƒsB|g}x>|D ]6}|  ¡ }|  |¡}|j|d| jd | 	| 
¡ ¡ qHW | ¡ }|s®| j |¡}|  |¡}| |¡ |jd k	rê| jrÎt d|j¡}	n|j}	|  |	¡ |  | j¡ |  d| | j ¡ |r| j | d¡¡ x4|D ],}
|  | jd | | j ¡ | j |
¡ qW |  | jd | d | j ¡ |jd k	rž| jrŽt d|j¡}n|j}|  |¡ d S )NF)r"   r   z>From z--r   )rA   rB   rC   r   Úlistr&   r   r#   r   Úappendr2   Zget_boundaryr   r8   Ú_make_boundaryZset_boundaryÚpreambler   rG   r<   r,   r   ÚpopÚepilogue)r   r!   ZmsgtextsZsubpartsÚpartr   ÚgÚboundaryZalltextrM   Z	body_partrO   r   r   r   Ú_handle_multipartþ   sJ    









zGenerator._handle_multipartc             C   s0   | j }|jdd| _ z|  |¡ W d || _ X d S )Nr   )r   )r   r   rS   )r   r!   Úpr   r   r   Ú_handle_multipart_signed8  s
    z"Generator._handle_multipart_signedc             C   sž   g }x€|  ¡ D ]t}|  ¡ }|  |¡}|j|d| jd | ¡ }| | j¡}|rx|d | jkrx| 	| j 
|d d… ¡¡ q| 	|¡ qW | j | j 
|¡¡ d S )NF)r"   r   r'   )rA   r&   r   r#   r   r2   r)   r   r   rK   r8   r   r   )r   r!   ZblocksrP   r   rQ   Útextr*   r   r   r   Ú_handle_message_delivery_statusC  s    
z)Generator._handle_message_delivery_statusc             C   s^   |   ¡ }|  |¡}|j}t|tƒrD|j| d¡d| jd | ¡ }n
|  	|¡}| j
 |¡ d S )Nr   F)r"   r   )r&   r   rF   rB   rJ   r#   rA   r   r2   r   r   r   )r   r!   r   rQ   rH   r   r   r   Ú_handle_messageX  s    




zGenerator._handle_messagec             C   sz   t  tj¡}dt|  d }|d kr(|S |}d}xD|  dt |¡ d tj¡}| 	|¡sZP |d t
|ƒ }|d7 }q2W |S )Nz===============z==r   z^--z(--)?$Ú.r-   )ÚrandomZ	randrangeÚsysÚmaxsizeÚ_fmtÚ_compile_reÚreÚescapeÚ	MULTILINEÚsearchrC   )ÚclsrV   ÚtokenrR   ÚbZcounterZcrer   r   r   rL   q  s    
zGenerator._make_boundaryc             C   s   t  ||¡S )N)r_   Úcompile)rc   r   Úflagsr   r   r   r^   ƒ  s    zGenerator._compile_re)NN)FN)N)Ú__name__Ú
__module__Ú__qualname__r   r   r#   r   r&   r   r,   r    r0   r.   rI   r:   rS   rU   rW   rX   ÚclassmethodrL   r^   r   r   r   r   r      s(   

1#
:c                   sL   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Z‡ fd	d
„ZeZe	dd„ ƒZ
‡  ZS )r   c             C   s   | j  | dd¡¡ d S )NÚasciiÚsurrogateescape)r   r   Úencode)r   r   r   r   r   r   •  s    zBytesGenerator.writec             C   s   t ƒ S )N)r   )r   r   r   r   r&   ˜  s    zBytesGenerator._new_bufferc             C   s
   |  d¡S )Nrl   )rn   )r   r   r   r   r   r   ›  s    zBytesGenerator._encodec             C   s<   x*|  ¡ D ]\}}| j | j ||¡¡ q
W |  | j¡ d S )N)r=   r   r   r   Zfold_binaryr   )r   r!   r>   r?   r   r   r   r.   ž  s    zBytesGenerator._write_headersc                s\   |j d krd S t|j ƒrH| jjdksH| jr:t d|j ¡|_ |  |j ¡ ntt	| ƒ 
|¡ d S )NZ7bitz>From )rF   r   r   Zcte_typer   rG   r<   r,   Úsuperr   rI   )r   r!   )r$   r   r   rI   ¦  s    
zBytesGenerator._handle_textc             C   s   t  | d¡|¡S )Nrl   )r_   rf   rn   )rc   r   rg   r   r   r   r^   µ  s    zBytesGenerator._compile_re)rh   ri   rj   r   r&   r   r.   rI   r:   rk   r^   Ú__classcell__r   r   )r$   r   r   ˆ  s   zD[Non-text (%(type)s) part of message omitted, filename %(filename)s]c               @   s$   e Zd Zdddœdd„Zdd„ ZdS )r   N)r   c            C   s.   t j| ||||d |d kr$t| _n|| _d S )N)r   )r   r   Ú_FMTr]   )r   r   r   r   Zfmtr   r   r   r   r   Ã  s
    zDecodedGenerator.__init__c             C   sˆ   x‚|  ¡ D ]v}| ¡ }|dkr4t|jdd| d q
|dkr>q
t| j| ¡ | ¡ | ¡ | d¡| dd¡| d	d
¡dœ | d q
W d S )NrV   F)Údecode)ÚfileZ	multipartz[no filename]zContent-Descriptionz[no description]zContent-Transfer-Encodingz[no encoding])rE   ÚmaintypeZsubtypeÚfilenameÚdescriptionÚencoding)	Úwalkr5   ÚprintrA   r]   Zget_content_typer6   Úget_filenameÚget)r   r!   rP   rt   r   r   r   r0   á  s     
zDecodedGenerator._dispatch)NNN)rh   ri   rj   r   r0   r   r   r   r   r   ½  s   r-   z%%0%dd)Ú__all__r_   r[   r   rZ   Úcopyr   Úior   r   Zemail.utilsr   r7   ÚNLrf   r(   ra   rG   r   r   rq   r   ÚlenÚreprr\   Ú_widthr]   rL   r   r   r   r   Ú<module>   s(   

  p3;