
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3

  \ 3 ã               @   sN  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Zd dl
Z
d dlZyd dlZW n ek
r„   dZY nX dddddddd	d
ddddddddgZe jjdƒZG dd„ dƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ dejjƒZG dd	„ d	eƒZG d d!„ d!eƒZG d"d
„ d
eƒZG d#d„ deƒZG d$d„ deƒZG d%d„ deƒZ G d&d'„ d'ƒZ!G d(d)„ d)e!ƒZ"d<d+d,„Z#d-d.„ Z$d/d0„ Z%d1d2„ Z&d3d4„ Z'd5d6„ Z(G d7d„ de)ƒZ*G d8d„ de*ƒZ+G d9d„ de*ƒZ,G d:d„ de*ƒZ-G d;d„ de*ƒZ.dS )=é    NÚMailboxÚMaildirÚmboxÚMHÚBabylÚMMDFÚMessageÚMaildirMessageÚmboxMessageÚ	MHMessageÚBabylMessageÚMMDFMessageÚErrorÚNoSuchMailboxErrorÚNotEmptyErrorÚExternalClashErrorÚFormatErrorÚasciic               @   s  e Zd ZdBdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ ZdCd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!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ ZdDd/d0„Zd1d2„ ZdEd3d4„Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Zd=d>„ Z d?Z!dFd@dA„Z"dS )Gr   NTc             C   s    t jjt jj|ƒƒ| _|| _d S )N)ÚosÚpathÚabspathÚ
expanduserÚ_pathÚ_factory)Úselfr   ÚfactoryÚcreate© r   ú/usr/lib64/python3.6/mailbox.pyÚ__init__$   s    zMailbox.__init__c             C   s   t dƒ‚d S )Nz&Method must be implemented by subclass)ÚNotImplementedError)r   Úmessager   r   r   Úadd)   s    zMailbox.addc             C   s   t dƒ‚d S )Nz&Method must be implemented by subclass)r    )r   Úkeyr   r   r   Úremove-   s    zMailbox.removec             C   s   | j |ƒ d S )N)r$   )r   r#   r   r   r   Ú__delitem__1   s    zMailbox.__delitem__c             C   s(   y| j |ƒ W n tk
r"   Y nX d S )N)r$   ÚKeyError)r   r#   r   r   r   Údiscard4   s    zMailbox.discardc             C   s   t dƒ‚d S )Nz&Method must be implemented by subclass)r    )r   r#   r!   r   r   r   Ú__setitem__;   s    zMailbox.__setitem__c             C   s$   y
| j |ƒS  tk
r   |S X d S )N)Ú__getitem__r&   )r   r#   Údefaultr   r   r   Úget?   s    
zMailbox.getc          	   C   s6   | j s| j|ƒS tj| j|ƒƒ�}| j |ƒS Q R X d S )N)r   Úget_messageÚ
contextlibÚclosingÚget_file)r   r#   Úfiler   r   r   r)   F   s    
zMailbox.__getitem__c             C   s   t dƒ‚d S )Nz&Method must be implemented by subclass)r    )r   r#   r   r   r   r,   N   s    zMailbox.get_messagec             C   s   t j| j|ƒƒjƒ S )N)ÚemailÚmessage_from_bytesÚ	get_bytesÚ	as_string)r   r#   r   r   r   Ú
get_stringR   s    zMailbox.get_stringc             C   s   t dƒ‚d S )Nz&Method must be implemented by subclass)r    )r   r#   r   r   r   r3   Y   s    zMailbox.get_bytesc             C   s   t dƒ‚d S )Nz&Method must be implemented by subclass)r    )r   r#   r   r   r   r/   ]   s    zMailbox.get_filec             C   s   t dƒ‚d S )Nz&Method must be implemented by subclass)r    )r   r   r   r   Úiterkeysa   s    zMailbox.iterkeysc             C   s   t | jƒ ƒS )N)Úlistr6   )r   r   r   r   Úkeyse   s    zMailbox.keysc             c   s@   x:| j ƒ D ].}y| | }W n tk
r0   w
Y nX |V  q
W d S )N)r6   r&   )r   r#   Úvaluer   r   r   Ú
itervaluesi   s    zMailbox.itervaluesc             C   s   | j ƒ S )N)r:   )r   r   r   r   Ú__iter__r   s    zMailbox.__iter__c             C   s   t | jƒ ƒS )N)r7   r:   )r   r   r   r   Úvaluesu   s    zMailbox.valuesc             c   sD   x>| j ƒ D ]2}y| | }W n tk
r0   w
Y nX ||fV  q
W d S )N)r6   r&   )r   r#   r9   r   r   r   Ú	iteritemsy   s    zMailbox.iteritemsc             C   s   t | jƒ ƒS )N)r7   r=   )r   r   r   r   Úitems‚   s    zMailbox.itemsc             C   s   t dƒ‚d S )Nz&Method must be implemented by subclass)r    )r   r#   r   r   r   Ú__contains__†   s    zMailbox.__contains__c             C   s   t dƒ‚d S )Nz&Method must be implemented by subclass)r    )r   r   r   r   Ú__len__Š   s    zMailbox.__len__c             C   s    x| j ƒ D ]}| j|ƒ q
W d S )N)r8   r'   )r   r#   r   r   r   ÚclearŽ   s    zMailbox.clearc             C   s0   y| | }W n t k
r    |S X | j|ƒ |S )N)r&   r'   )r   r#   r*   Úresultr   r   r   Úpop“   s    
zMailbox.popc             C   s*   x$| j ƒ D ]}|| j|ƒfS W tdƒ‚d S )NzNo messages in mailbox)r6   rC   r&   )r   r#   r   r   r   Úpopitemœ   s    zMailbox.popitemc             C   sx   t |dƒr|jƒ }nt |dƒr(|jƒ }n|}d}x6|D ].\}}y|| |< W q6 tk
rb   d}Y q6X q6W |rttdƒ‚d S )Nr=   r>   FTzNo message with key(s))Úhasattrr=   r>   r&   )r   ÚargÚsourceZbad_keyr#   r!   r   r   r   Úupdate£   s    



zMailbox.updatec             C   s   t dƒ‚d S )Nz&Method must be implemented by subclass)r    )r   r   r   r   Úflush´   s    zMailbox.flushc             C   s   t dƒ‚d S )Nz&Method must be implemented by subclass)r    )r   r   r   r   Úlock¸   s    zMailbox.lockc             C   s   t dƒ‚d S )Nz&Method must be implemented by subclass)r    )r   r   r   r   Úunlock¼   s    zMailbox.unlockc             C   s   t dƒ‚d S )Nz&Method must be implemented by subclass)r    )r   r   r   r   ÚcloseÀ   s    zMailbox.closec             C   s,   y
|j dƒS  tk
r&   tdƒ‚Y nX d S )Nr   z?String input must be ASCII-only; use bytes or a Message instead)ÚencodeÚUnicodeErrorÚ
ValueError)r   r!   r   r   r   Ú_string_to_bytesÄ   s    
zMailbox._string_to_bytesFc       	      C   s  t |tjjƒrxtjƒ }tjj||dƒ}|j|ƒ |j	dƒ |j
ƒ }|jdtƒ}|j|ƒ | jrt|jtƒ rt|jtƒ �n†t |tttjfƒ�rt |tjƒr®tjdtdƒ |jƒ }t |tƒrÂ| j|ƒ}|rÒ|jddƒ}|jdtƒ}|j|ƒ | joø|jtƒ �rþ|jtƒ nöt|dƒ�rît|dƒ�r4tjd	tdƒ |j}d }xŒ|jƒ }|jd
ƒ�r`|d d… d }n|jdƒ�r||d d… d }|�s„P |�r¦|jdƒ�r¦d|dd …  }|jdtƒ}|j|ƒ |}�q:W | j�rþ|�rþ|jtƒ �rþ|jtƒ ntdt|ƒ ƒ‚d S )Nr   ó   
z8Use of StringIO input is deprecated, use BytesIO insteadé   s   
From s   
>From ÚreadÚbufferzDUse of text mode files is deprecated, use a binary mode file insteads   
é   ó   é   s   From s   >From é   zInvalid message type: %séþÿÿÿéÿÿÿÿ)Ú
isinstancer1   r!   r   ÚioÚBytesIOÚ	generatorÚBytesGeneratorÚflattenÚseekrS   ÚreplaceÚlinesepÚwriteÚ_append_newlineÚendswithÚstrÚbytesÚStringIOÚwarningsÚwarnÚDeprecationWarningÚgetvaluerP   rE   rT   ÚreadlineÚ
startswithÚ	TypeErrorÚtype)	r   r!   ÚtargetZmangle_from_rT   ÚgenÚdataZlastlineÚliner   r   r   Ú_dump_messageÑ   sZ    







zMailbox._dump_message)NT)N)N)N)F)#Ú__name__Ú
__module__Ú__qualname__r   r"   r$   r%   r'   r(   r+   r)   r,   r5   r3   r/   r6   r8   r:   r;   r<   r=   r>   r?   r@   rA   rC   rD   rH   rI   rJ   rK   rL   rP   re   rv   r   r   r   r   r   !   s@   

		
	
c               @   sÖ   e Zd ZdZd5d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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(d)„ Zd*d+„ Zd,Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ ZdS )6r   ú:NTc             C   s°   t j| |||ƒ tjj| jdƒtjj| jdƒtjj| jdƒdœ| _tjj| jƒsŽ|r„tj| jdƒ x*| jj	ƒ D ]}tj|dƒ qnW n
t
| jƒ‚i | _dddœ| _d| _d| _d S )	NÚtmpÚnewÚcur)r{   r|   r}   iÀ  r   )r}   r|   gš™™™™™¹?)r   r   r   r   Újoinr   Ú_pathsÚexistsÚmkdirr<   r   Ú_tocÚ_toc_mtimesÚ
_last_readÚ_skewfactor)r   Údirnamer   r   r   r   r   r   r     s    
zMaildir.__init__c             C   s~  | j ƒ }y| j||ƒ W n* tk
rB   |jƒ  tj|jƒ ‚ Y nX t|ƒ t|t	ƒr||j
ƒ }| j|jƒ  }|| jkr„d}nd}d}tjj|jƒj| jƒd }tjj| j||| ƒ}t|t	ƒrÞtj|jtjj|jƒ|jƒ fƒ yLytj|j|ƒ W n( ttfk
�r   tj|j|ƒ Y nX tj|jƒ W nN tk
�rx } z0tj|jƒ |jtjk�rftd| ƒ‚n‚ W Y d d }~X nX |S )NÚ r|   r   z$Name clash with existing message: %s)Ú_create_tmprv   ÚBaseExceptionrL   r   r$   ÚnameÚ_sync_closer[   r	   Ú
get_subdirÚcolonÚget_infor   ÚbasenameÚsplitr~   r   ÚutimeÚgetatimeÚget_dateÚlinkÚAttributeErrorÚPermissionErrorÚrenameÚOSErrorÚerrnoZEEXISTr   )r   r!   Ztmp_fileÚsubdirÚsuffixÚuniqÚdestÚer   r   r   r"   !  sB    



zMaildir.addc             C   s    t jt jj| j| j|ƒƒƒ d S )N)r   r$   r   r~   r   Ú_lookup)r   r#   r   r   r   r$   K  s    zMaildir.removec             C   s,   y| j |ƒ W n ttfk
r&   Y nX d S )N)r$   r&   ÚFileNotFoundError)r   r#   r   r   r   r'   O  s    zMaildir.discardc             C   sÊ   | j |ƒ}| j|ƒ}| j |ƒ}t|tƒr.|}n|}tjj|ƒ}| j|kr`| j|j| jƒd  }nd}| j	|ƒ tjj
| j|ƒ}	tjj
| j||| ƒ}
t|tƒrºtj|	tjj|	ƒ|jƒ fƒ tj|	|
ƒ d S )NrW   r‡   rZ   )rŸ   r"   r[   r	   r   r   r†   r�   r�   r'   r~   r   r‘   r’   r“   r—   )r   r#   r!   Zold_subpathZtemp_keyZtemp_subpathZdominant_subpathrš   r›   Ztmp_pathÚnew_pathr   r   r   r(   W  s"    






zMaildir.__setitem__c             C   s¢   | j |ƒ}ttjj| j|ƒdƒ� }| jr4| j|ƒ}nt|ƒ}W d Q R X tjj|ƒ\}}|j	|ƒ | j
|kr€|j|j| j
ƒd ƒ |jtjjtjj| j|ƒƒƒ |S )NÚrbrW   rZ   )rŸ   Úopenr   r   r~   r   r   r	   r�   Ú
set_subdirr�   Úset_infoÚset_dateÚgetmtime)r   r#   ZsubpathÚfÚmsgrš   rŠ   r   r   r   r,   r  s    


zMaildir.get_messagec          
   C   s8   t tjj| j| j|ƒƒdƒ�}|jƒ jtdƒS Q R X d S )Nr¢   rQ   )	r£   r   r   r~   r   rŸ   rS   rb   rc   )r   r#   r¨   r   r   r   r3   �  s    zMaildir.get_bytesc             C   s$   t tjj| j| j|ƒƒdƒ}t|ƒS )Nr¢   )r£   r   r   r~   r   rŸ   Ú
_ProxyFile)r   r#   r¨   r   r   r   r/   †  s    zMaildir.get_filec             c   sH   | j ƒ  x:| jD ]0}y| j|ƒ W n tk
r8   wY nX |V  qW d S )N)Ú_refreshr‚   rŸ   r&   )r   r#   r   r   r   r6   ‹  s    zMaildir.iterkeysc             C   s   | j ƒ  || jkS )N)r«   r‚   )r   r#   r   r   r   r?   •  s    zMaildir.__contains__c             C   s   | j ƒ  t| jƒS )N)r«   Úlenr‚   )r   r   r   r   r@   š  s    zMaildir.__len__c             C   s   d S )Nr   )r   r   r   r   rI   Ÿ  s    zMaildir.flushc             C   s   d S )Nr   )r   r   r   r   rJ   ¥  s    zMaildir.lockc             C   s   d S )Nr   )r   r   r   r   rK   ©  s    zMaildir.unlockc             C   s   d S )Nr   )r   r   r   r   rL   ­  s    zMaildir.closec             C   s`   g }xVt j| jƒD ]F}t|ƒdkr|d dkrt jjt jj| j|ƒƒr|j|dd … ƒ qW |S )NrW   r   Ú.)r   Úlistdirr   r¬   r   Úisdirr~   Úappend)r   rB   Úentryr   r   r   Úlist_folders±  s    zMaildir.list_foldersc             C   s    t tjj| jd| ƒ| jdd�S )Nr­   F)r   r   )r   r   r   r~   r   r   )r   Úfolderr   r   r   Ú
get_folderº  s    zMaildir.get_folderc             C   s\   t jj| jd| ƒ}t|| jd�}t jj|dƒ}t jj|ƒsXt jt j|t j	t j
B dƒƒ |S )Nr­   )r   Zmaildirfolderi¶  )r   r   r~   r   r   r   r€   rL   r£   ÚO_CREATÚO_WRONLY)r   r³   r   rB   Zmaildirfolder_pathr   r   r   Ú
add_folderÀ  s    zMaildir.add_folderc             C   s,  t jj| jd| ƒ}xTt jt jj|dƒƒt jt jj|dƒƒ D ](}t|ƒdk sZ|d dkr>td| ƒ‚q>W xPt j|ƒD ]B}|dkrv|dkrv|dkrvt jjt jj||ƒƒrvtd||f ƒ‚qvW x`t j|d	d
�D ]N\}}}x |D ]}t j	t jj||ƒƒ qÜW x |D ]}t j
t jj||ƒƒ qþW qÌW t j
|ƒ d S )Nr­   r|   r}   rW   r   zFolder contains message(s): %sr{   z%Folder contains subdirectory '%s': %sF)Útopdown)r   r   r~   r   r®   r¬   r   r¯   Úwalkr$   Úrmdir)r   r³   r   r±   ÚrootÚdirsÚfilesr   r   r   Úremove_folderÊ  s     

zMaildir.remove_folderc             C   s\   t j ƒ }xNtjtjj| jdƒƒD ]4}tjj| jd|ƒ}|tjj|ƒ dkr tj|ƒ q W d S )Nr{   i@ú )Útimer   r®   r   r~   r   r’   r$   )r   Únowr±   r   r   r   r   ÚcleanÝ  s
    zMaildir.cleanrW   c             C   sÒ   t j ƒ }tjƒ }d|kr$|jddƒ}d|kr8|jddƒ}dt|ƒt|d d ƒtjƒ tj|f }tj	j
| jd|ƒ}ytj|ƒ W n@ tk
rÀ   t jd7  _yt|ƒS  tk
rº   Y nX Y nX td	| ƒ‚d S )
Nú/z\057rz   z\072z%s.M%sP%sQ%s.%srW   g    €„.Ar{   z&Name clash prevented file creation: %s)r¿   ÚsocketÚgethostnamerb   Úintr   Úgetpidr   Ú_countr   r~   r   Ústatr    Ú_create_carefullyÚFileExistsErrorr   )r   rÀ   Zhostnamerœ   r   r   r   r   rˆ   ç  s&    zMaildir._create_tmpc             C   sä   t j ƒ | j d| j krbd}x<| jD ]2}tjj| j| ƒ}|| j| krLd}|| j|< q$W |sbd S i | _xl| jD ]b}| j| }xRtj	|ƒD ]D}tjj
||ƒ}tjj|ƒrªqŠ|j| jƒd }tjj
||ƒ| j|< qŠW qpW t j ƒ | _d S )NrU   FTr   )r¿   r„   r…   rƒ   r   r   r§   r   r‚   r®   r~   r¯   r�   r�   )r   Zrefreshrš   Úmtimer   r±   Úprœ   r   r   r   r«   ÿ  s&    
zMaildir._refreshc             C   sz   y,t jjt jj| j| j| ƒƒr*| j| S W n tk
r@   Y nX | jƒ  y
| j| S  tk
rt   td| ƒ‚Y nX d S )NzNo message with key: %s)r   r   r€   r~   r   r‚   r&   r«   )r   r#   r   r   r   rŸ   #  s    
zMaildir._lookupc             C   sV   t | dƒs| jƒ | _x<y| t| jƒ S  tk
r8   d S  tk
rL   wY qX qW d S )NÚ_onetime_keys)rE   r6   rÍ   ÚnextÚStopIterationr&   )r   r   r   r   rÎ   1  s    

zMaildir.next)NT)rw   rx   ry   r�   r   r"   r$   r'   r(   r,   r3   r/   r6   r?   r@   rI   rJ   rK   rL   r²   r´   r·   r¾   rÁ   rÇ   rˆ   r«   rŸ   rÎ   r   r   r   r   r     s4   
*
	
$c               @   s�   e Z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dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd$dd „Zd!d"„ ZdS )%Ú_singlefileMailboxNTc             C   s¾   t j| |||ƒ yt| jdƒ}W nn tk
rŽ } zR|jtjkr\|rPt| jdƒ}q~t| jƒ‚n"|jtjtj	fkr|t| jdƒ}n‚ W Y d d }~X nX || _
d | _d| _d| _d| _d| _d | _d S )Nzrb+zwb+r¢   r   F)r   r   r£   r   r˜   r™   ÚENOENTr   ÚEACCESÚEROFSÚ_filer‚   Ú	_next_keyÚ_pendingÚ_pending_syncÚ_lockedÚ_file_length)r   r   r   r   r¨   rž   r   r   r   r   A  s$    z_singlefileMailbox.__init__c             C   s8   | j ƒ  | j|ƒ| j| j< |  jd7  _d| _| jd S )NrW   T)rŸ   Ú_append_messager‚   rÕ   r×   )r   r!   r   r   r   r"   X  s
    z_singlefileMailbox.addc             C   s   | j |ƒ | j|= d| _d S )NT)rŸ   r‚   rÖ   )r   r#   r   r   r   r$   b  s    
z_singlefileMailbox.removec             C   s$   | j |ƒ | j|ƒ| j|< d| _d S )NT)rŸ   rÚ   r‚   rÖ   )r   r#   r!   r   r   r   r(   h  s    
z_singlefileMailbox.__setitem__c             c   s   | j ƒ  | jjƒ E d H  d S )N)rŸ   r‚   r8   )r   r   r   r   r6   n  s    z_singlefileMailbox.iterkeysc             C   s   | j ƒ  || jkS )N)rŸ   r‚   )r   r#   r   r   r   r?   s  s    z_singlefileMailbox.__contains__c             C   s   | j ƒ  t| jƒS )N)rŸ   r¬   r‚   )r   r   r   r   r@   x  s    z_singlefileMailbox.__len__c             C   s   | j st| jƒ d| _ d S )NT)rØ   Ú
_lock_filerÔ   )r   r   r   r   rJ   }  s    
z_singlefileMailbox.lockc             C   s   | j rt| jƒ d| _ d S )NF)rØ   Ú_unlock_filerÔ   )r   r   r   r   rK   ƒ  s    
z_singlefileMailbox.unlockc       
      C   sÞ  | j s | jrt| jƒ d| _d S | jjddƒ | jjƒ }|| jkrTtd| j|f ƒ‚t| j	ƒ}y¬i }| j
|ƒ xŽt| jjƒ ƒD ]|}| j| \}}| jj|ƒ | j|ƒ |jƒ }x0| jjtd|| jjƒ  ƒƒ}|sÒP |j|ƒ q°W ||jƒ f||< | j|ƒ q~W |jƒ | _W n"   |jƒ  tj|jƒ ‚ Y nX t|ƒ | jjƒ  tj| j	ƒj}	tj|j|	ƒ ytj|j| j	ƒ W n2 tk
�r¢   tj| j	ƒ tj|j| j	ƒ Y nX t| j	dƒ| _|| _d| _ d| _| j�rÚt| jdd� d S )NFr   rU   z4Size of mailbox file changed (expected %i, found %i)i   zrb+)Údotlock) rÖ   r×   Ú_sync_flushrÔ   ra   ÚtellrÙ   r   Ú_create_temporaryr   Ú_pre_mailbox_hookÚsortedr‚   r8   Ú_pre_message_hookrS   Úminrd   Ú_post_message_hookrL   r   r$   rŠ   r‹   rÈ   Úst_modeÚchmodr—   rÊ   r£   rØ   rÛ   )
r   Zcur_lenZnew_fileZnew_tocr#   ÚstartÚstopZ	new_startrT   Úmoder   r   r   rI   ‰  s^    
	






z_singlefileMailbox.flushc             C   s   d S )Nr   )r   r¨   r   r   r   rá   É  s    z$_singlefileMailbox._pre_mailbox_hookc             C   s   d S )Nr   )r   r¨   r   r   r   rã   Í  s    z$_singlefileMailbox._pre_message_hookc             C   s   d S )Nr   )r   r¨   r   r   r   rå   Ñ  s    z%_singlefileMailbox._post_message_hookc             C   s4   z| j ƒ  W d z| jr| jƒ  W d | jjƒ  X X d S )N)rI   rØ   rK   rÔ   rL   )r   r   r   r   rL   Õ  s    z_singlefileMailbox.closec             C   sJ   | j d kr| jƒ  |d k	rFy
| j | S  tk
rD   td| ƒ‚Y nX d S )NzNo message with key: %s)r‚   Ú_generate_tocr&   )r   r#   r   r   r   rŸ   à  s    

z_singlefileMailbox._lookupc             C   sž   | j jddƒ | j jƒ }t| jƒdkr:| j r:| j| j ƒ y&| j| j ƒ | j|ƒ}| j	| j ƒ W n" t
k
r‚   | j j|ƒ ‚ Y nX | j jƒ  | j jƒ | _|S )Nr   rU   )rÔ   ra   rß   r¬   r‚   rÖ   rá   rã   Ú_install_messagerå   r‰   ÚtruncaterI   rÙ   )r   r!   ZbeforeZoffsetsr   r   r   rÚ   ê  s    


z"_singlefileMailbox._append_message)NT)N)rw   rx   ry   r   r"   r$   r(   r6   r?   r@   rJ   rK   rI   rá   rã   rå   rL   rŸ   rÚ   r   r   r   r   rÐ   >  s    

@

rÐ   c               @   s>   e Zd ZdZdd„ Zddd„Zddd„Zdd	d
„Zdd„ ZdS )Ú	_mboxMMDFTc             C   sp   | j |ƒ\}}| jj|ƒ | jjƒ jtdƒ}| jj|| jjƒ  ƒ}| j|jtdƒƒ}|j	|dd … j
dƒƒ |S )Nó    rQ   rX   r   )rŸ   rÔ   ra   rn   rb   rc   rS   rß   Ú_message_factoryÚset_fromÚdecode)r   r#   rè   ré   Ú	from_lineÚstringr©   r   r   r   r,     s    z_mboxMMDF.get_messageFc             C   s   t j| j|ƒƒj|d�S )N)Úunixfrom)r1   r2   r3   r4   )r   r#   Úfrom_r   r   r   r5     s    z_mboxMMDF.get_stringc             C   sJ   | j |ƒ\}}| jj|ƒ |s(| jjƒ  | jj|| jjƒ  ƒ}|jtdƒS )NrQ   )rŸ   rÔ   ra   rn   rS   rß   rb   rc   )r   r#   rö   rè   ré   rô   r   r   r   r3     s    
z_mboxMMDF.get_bytesc             C   s<   | j |ƒ\}}| jj|ƒ |s(| jjƒ  t| j| jjƒ |ƒS )N)rŸ   rÔ   ra   rn   Ú_PartialFilerß   )r   r#   rö   rè   ré   r   r   r   r/     s
    
z_mboxMMDF.get_filec             C   s  d }t |tƒr| j|ƒ}t |tƒrf|jdƒrf|jdƒ}|dkr\|d |… }||d d … }q°|}d}nJt |tƒrˆ|jƒ jdƒ}d| }n(t |t	j
jƒr°|jƒ }|d k	r°|jdƒ}|d krÎdtjtjƒ ƒjƒ  }| jjƒ }| jj|t ƒ | j|| j| jƒ | jjƒ }||fS )Ns   From rQ   rW   rï   r   s   From MAILER-DAEMON rZ   )r[   rg   rP   rh   ro   ÚfindÚ_mboxMMDFMessageÚget_fromrM   r1   r!   r   Úget_unixfromr¿   ÚasctimeÚgmtimerÔ   rß   rd   rc   rv   Ú_mangle_from_)r   r!   ró   ÚnewlineZauthorrè   ré   r   r   r   rì   &  s0    







z_mboxMMDF._install_messageN)F)F)F)	rw   rx   ry   rþ   r,   r5   r3   r/   rì   r   r   r   r   rî     s   


	
rî   c               @   s.   e Zd ZdZdZd	dd„Zdd„ Zdd„ ZdS )
r   TNc             C   s   t | _tj| |||ƒ d S )N)r
   rð   rî   r   )r   r   r   r   r   r   r   r   L  s    zmbox.__init__c             C   s   |j tƒ d S )N)rd   rc   )r   r¨   r   r   r   rå   Q  s    zmbox._post_message_hookc             C   sì   g g  }}d}| j jdƒ x | j jƒ }| j jƒ }|jdƒr|t|ƒt|ƒk rl|rb|j|ttƒ ƒ n
|j|ƒ |j|ƒ d}q|s¦|r˜|j|ttƒ ƒ n
|j|ƒ P q|tkr´d}qd}qW tt	t
||ƒƒƒ| _t| jƒ| _| j jƒ | _d S )NFr   s   From T)rÔ   ra   rß   rn   ro   r¬   r°   rc   ÚdictÚ	enumerateÚzipr‚   rÕ   rÙ   )r   ÚstartsÚstopsZlast_was_emptyÚline_posru   r   r   r   rë   U  s0    






zmbox._generate_toc)NT)rw   rx   ry   rþ   re   r   rå   rë   r   r   r   r   r   C  s
   
c               @   s.   e Zd Zddd„Zdd„ Zdd„ Zd	d
„ ZdS )r   NTc             C   s   t | _tj| |||ƒ d S )N)r   rð   rî   r   )r   r   r   r   r   r   r   r   z  s    zMMDF.__init__c             C   s   |j dt ƒ d S )Ns   )rd   rc   )r   r¨   r   r   r   rã     s    zMMDF._pre_message_hookc             C   s   |j td t ƒ d S )Ns   )rd   rc   )r   r¨   r   r   r   rå   ƒ  s    zMMDF._post_message_hookc             C   sæ   g g  }}| j jdƒ d}xŒ|}| j jƒ }| j jƒ }|jdt ƒrž|j|ƒ xV|}| j jƒ }| j jƒ }|dt krˆ|j|ttƒ ƒ P qN|sN|j|ƒ P qNW q|sP qW tt	t
||ƒƒƒ| _t| jƒ| _| j jddƒ | j jƒ | _d S )Nr   s   rU   )rÔ   ra   rn   rß   ro   rc   r°   r¬   r   r  r  r‚   rÕ   rÙ   )r   r  r  Únext_posr  ru   r   r   r   rë   ‡  s2    






zMMDF._generate_toc)NT)rw   rx   ry   r   rã   rå   rë   r   r   r   r   r   w  s   
c               @   s¾   e Z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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'd(„ Zd)d*„ Zd+d,„ Zd-d.„ ZdS )0r   NTc             C   st   t j| |||ƒ tjj| jƒsj|r`tj| jdƒ tjtjtjj	| jdƒtj
tjB tjB dƒƒ n
t| jƒ‚d| _d S )NiÀ  z.mh_sequencesi€  F)r   r   r   r   r€   r   r�   rL   r£   r~   rµ   ÚO_EXCLr¶   r   rØ   )r   r   r   r   r   r   r   r   §  s    
zMH.__init__c             C   sä   | j ƒ }t|ƒdkrd}nt|ƒd }tjj| jt|ƒƒ}t|ƒ}d}zŠ| j	rVt
|ƒ zfy| j||ƒ W n: tk
r¢   | j	r†t|ƒ t|ƒ d}tj|ƒ ‚ Y nX t|tƒrº| j||ƒ W d | j	rÌt|ƒ X W d |sÞt|ƒ X |S )Nr   rW   FT)r8   r¬   Úmaxr   r   r~   r   rg   rÉ   rØ   rÛ   rv   r‰   rÜ   r‹   r$   r[   r   Ú_dump_sequences)r   r!   r8   Znew_keyr¡   r¨   Úclosedr   r   r   r"   ³  s6    


zMH.addc             C   sx   t jj| jt|ƒƒ}yt|dƒ}W n> tk
r` } z"|jtjkrNt	d| ƒ‚n‚ W Y d d }~X nX |j
ƒ  t j|ƒ d S )Nzrb+zNo message with key: %s)r   r   r~   r   rg   r£   r˜   r™   rÑ   r&   rL   r$   )r   r#   r   r¨   rž   r   r   r   r$   Õ  s    z	MH.removec             C   sÖ   t jj| jt|ƒƒ}yt|dƒ}W n> tk
r` } z"|jtjkrNt	d| ƒ‚n‚ W Y d d }~X nX zd| j
rrt|ƒ z@t jt j|t jt jB ƒƒ | j||ƒ t|tƒr°| j||ƒ W d | j
rÂt|ƒ X W d t|ƒ X d S )Nzrb+zNo message with key: %s)r   r   r~   r   rg   r£   r˜   r™   rÑ   r&   rØ   rÛ   rL   r¶   ÚO_TRUNCrv   r[   r   r	  rÜ   r‹   )r   r#   r!   r   r¨   rž   r   r   r   r(   ã  s$    
zMH.__setitem__c              C   sì   y@| j r$ttjj| jt|ƒƒdƒ}nttjj| jt|ƒƒdƒ}W n> tk
r~ } z"|jtj	krlt
d| ƒ‚n‚ W Y d d }~X nX |�2 | j r”t|ƒ zt|ƒ}W d | j r°t|ƒ X W d Q R X x*| jƒ jƒ D ]\}}||krÊ|j|ƒ qÊW |S )Nzrb+r¢   zNo message with key: %s)rØ   r£   r   r   r~   r   rg   r˜   r™   rÑ   r&   rÛ   r   rÜ   Úget_sequencesr>   Úadd_sequence)r   r#   r¨   rž   r©   rŠ   Úkey_listr   r   r   r,   û  s&    zMH.get_messagec              C   sÄ   y@| j r$ttjj| jt|ƒƒdƒ}nttjj| jt|ƒƒdƒ}W n> tk
r~ } z"|jtj	krlt
d| ƒ‚n‚ W Y d d }~X nX |�6 | j r”t|ƒ z|jƒ jtdƒS | j r´t|ƒ X W d Q R X d S )Nzrb+r¢   zNo message with key: %srQ   )rØ   r£   r   r   r~   r   rg   r˜   r™   rÑ   r&   rÛ   rS   rb   rc   rÜ   )r   r#   r¨   rž   r   r   r   r3     s    zMH.get_bytesc             C   sf   yt tjj| jt|ƒƒdƒ}W n> tk
r\ } z"|jtjkrJt	d| ƒ‚n‚ W Y d d }~X nX t
|ƒS )Nr¢   zNo message with key: %s)r£   r   r   r~   r   rg   r˜   r™   rÑ   r&   rª   )r   r#   r¨   rž   r   r   r   r/   )  s    zMH.get_filec             C   s   t tdd„ tj| jƒD ƒƒƒS )Nc             s   s   | ]}|j ƒ rt|ƒV  qd S )N)ÚisdigitrÅ   )Ú.0r±   r   r   r   ú	<genexpr>6  s    zMH.iterkeys.<locals>.<genexpr>)Úiterrâ   r   r®   r   )r   r   r   r   r6   4  s    zMH.iterkeysc             C   s   t jjt jj| jt|ƒƒƒS )N)r   r   r€   r~   r   rg   )r   r#   r   r   r   r?   9  s    zMH.__contains__c             C   s   t t| jƒ ƒƒS )N)r¬   r7   r6   )r   r   r   r   r@   =  s    z
MH.__len__c             C   s2   | j s.ttjj| jdƒdƒ| _t| jƒ d| _ d S )Nz.mh_sequenceszrb+T)rØ   r£   r   r   r~   r   rÔ   rÛ   )r   r   r   r   rJ   A  s    
zMH.lockc             C   s(   | j r$t| jƒ t| jƒ | `d| _ d S )NF)rØ   rÜ   rÔ   r‹   )r   r   r   r   rK   H  s
    

z	MH.unlockc             C   s   d S )Nr   )r   r   r   r   rI   P  s    zMH.flushc             C   s   | j r| jƒ  d S )N)rØ   rK   )r   r   r   r   rL   T  s    zMH.closec             C   s@   g }x6t j| jƒD ]&}t jjt jj| j|ƒƒr|j|ƒ qW |S )N)r   r®   r   r   r¯   r~   r°   )r   rB   r±   r   r   r   r²   Y  s
    zMH.list_foldersc             C   s   t tjj| j|ƒ| jdd�S )NF)r   r   )r   r   r   r~   r   r   )r   r³   r   r   r   r´   a  s    zMH.get_folderc             C   s   t tjj| j|ƒ| jd�S )N)r   )r   r   r   r~   r   r   )r   r³   r   r   r   r·   f  s    zMH.add_folderc             C   s`   t jj| j|ƒ}t j|ƒ}|dgkr:t jt jj|dƒƒ n|g krDntd| j ƒ‚t j|ƒ d S )Nz.mh_sequenceszFolder not empty: %s)r   r   r~   r   r®   r$   r   rº   )r   r³   r   Zentriesr   r   r   r¾   k  s    

zMH.remove_folderc       
         s  i }t tjj| jdƒddd��ä}t| jƒ ƒ‰ xÐ|D ]È}yž|jdƒ\}}tƒ }xT|jƒ D ]H}|jƒ rr|j	t
|ƒƒ qVdd„ |jdƒD ƒ\}}	|jt||	d	 ƒƒ qVW ‡ fd
d„t|ƒD ƒ||< t|| ƒdkrÒ||= W q2 tk
rø   td|jƒ  ƒ‚Y q2X q2W W d Q R X |S )Nz.mh_sequencesÚrÚASCII)Úencodingrz   c             s   s   | ]}t |ƒV  qd S )N)rÅ   )r  Úxr   r   r   r  „  s    z#MH.get_sequences.<locals>.<genexpr>ú-rW   c                s   g | ]}|ˆ kr|‘qS r   r   )r  r#   )Úall_keysr   r   ú
<listcomp>†  s    z$MH.get_sequences.<locals>.<listcomp>r   z"Invalid sequence specification: %s)r£   r   r   r~   r   Úsetr8   r�   r  r"   rÅ   rH   Úrangerâ   r¬   rO   r   Úrstrip)
r   Zresultsr¨   ru   rŠ   Úcontentsr8   Úspecrè   ré   r   )r  r   r  w  s&    

 zMH.get_sequencesc             C   s
  t tjj| jdƒddd�}zàtjtj |jtjtjB ƒƒ x¾|j	ƒ D ]²\}}t
|ƒdkrXqB|j|d ƒ d }d}xbtt|ƒƒD ]R}|d |kr |sÊd	}|jd
ƒ n*|r¼d}|jd||f ƒ n|jd| ƒ |}q|W |rê|jt|ƒd ƒ qB|jdƒ qBW W d t|ƒ X d S )Nz.mh_sequenceszr+r  )r  r   rz   FrW   Tr  z%s %sz %sÚ
)r£   r   r   r~   r   rL   rŠ   r¶   r  r>   r¬   rd   râ   r  rg   r‹   )r   Ú	sequencesr¨   rŠ   r8   ÚprevZ
completingr#   r   r   r   Úset_sequences�  s.    zMH.set_sequencesc       	      C   sL  | j ƒ }d}g }xÎ| jƒ D ]Â}|d |krÔ|j||d fƒ y4tjtjj| jt|ƒƒtjj| jt|d ƒƒƒ W nH t	t
fk
r¸   tjtjj| jt|ƒƒtjj| jt|d ƒƒƒ Y nX tjtjj| jt|ƒƒƒ |d7 }qW |d | _t|ƒdkrúd S xB|jƒ D ]6\}}x*|D ]"\}}||k�r|||j|ƒ< �qW �qW | j|ƒ d S )Nr   rW   )r  r6   r°   r   r”   r   r~   r   rg   r•   r–   r—   ÚunlinkrÕ   r¬   r>   Úindexr"  )	r   r   r!  Zchangesr#   rŠ   r  Úoldr|   r   r   r   Úpack¬  s,     

zMH.packc             C   s|   |j ƒ }| j ƒ }x<|jƒ D ]0\}}||kr6|j|ƒ q||kr||j|ƒ= qW x|D ]}||krT|g||< qTW | j|ƒ d S )N)r  r>   r°   r$  r"  )r   r!   r#   Zpending_sequencesZall_sequencesrŠ   r  Úsequencer   r   r   r	  Æ  s    
zMH._dump_sequences)NT)rw   rx   ry   r   r"   r$   r(   r,   r3   r/   r6   r?   r@   rJ   rK   rI   rL   r²   r´   r·   r¾   r  r"  r&  r	  r   r   r   r   r   ¤  s,   
"c               @   sŒ   e Zd Zedddddddhƒ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dd„ Zdd„ Zd d!„ Zd"d#„ ZdS )%r   ÚunseenÚdeletedZfiledÚansweredÚ	forwardedZeditedÚresentNTc             C   s   t j| |||ƒ i | _d S )N)rÐ   r   Ú_labels)r   r   r   r   r   r   r   r   Û  s    zBabyl.__init__c             C   s(   t j| |ƒ}t|tƒr$|jƒ | j|< |S )N)rÐ   r"   r[   r   Ú
get_labelsr-  )r   r!   r#   r   r   r   r"   à  s    
z	Babyl.addc             C   s"   t j| |ƒ || jkr| j|= d S )N)rÐ   r$   r-  )r   r#   r   r   r   r$   ç  s    
zBabyl.removec             C   s*   t j| ||ƒ t|tƒr&|jƒ | j|< d S )N)rÐ   r(   r[   r   r.  r-  )r   r#   r!   r   r   r   r(   í  s    
zBabyl.__setitem__c       
      C   sþ   | j |ƒ\}}| jj|ƒ | jjƒ  tjƒ }x4| jjƒ }|dt ksJ| rLP |j|jtdƒƒ q.W tjƒ }x0| jjƒ }|tks„| r†P |j|jtdƒƒ qlW || jj	ƒ  }| jj
|ƒ}|jtdƒ}t|jƒ | ƒ}	|	j|jƒ ƒ || jkrú|	j| j| ƒ |	S )Ns   *** EOOH ***rQ   )rŸ   rÔ   ra   rn   r\   r]   rc   rd   rb   rß   rS   r   rm   Úset_visibler-  Ú
set_labels)
r   r#   rè   ré   Úoriginal_headersru   Zvisible_headersÚnZbodyr©   r   r   r   r,   ó  s.    



zBabyl.get_messagec       	      C   s¸   | j |ƒ\}}| jj|ƒ | jjƒ  tjƒ }x4| jjƒ }|dt ksJ| rLP |j|jtdƒƒ q.W x| jjƒ }|tks|| rdP qdW |j	ƒ }|| jj
ƒ  }| jj|ƒ}|jtdƒ}|| S )Ns   *** EOOH ***rQ   )rŸ   rÔ   ra   rn   r\   r]   rc   rd   rb   rm   rß   rS   )	r   r#   rè   ré   r1  ru   Zheadersr2  rt   r   r   r   r3     s$    


zBabyl.get_bytesc             C   s   t j| j|ƒjdtƒƒS )NrQ   )r\   r]   r3   rb   rc   )r   r#   r   r   r   r/   %  s    zBabyl.get_filec             C   s@   | j ƒ  tƒ }x| jjƒ D ]}|j|ƒ qW |j| jƒ t|ƒS )N)rŸ   r  r-  r<   rH   Údifference_updateÚ_special_labelsr7   )r   ÚlabelsZ
label_listr   r   r   r.  )  s    zBabyl.get_labelsc             C   s>  g g  }}| j jdƒ d}g }xÒ|}| j jƒ }| j jƒ }|dt kržt|ƒt|ƒk rf|j|ttƒ ƒ |j|ƒ dd„ | j jƒ dd … jdƒD ƒ}|j|ƒ q |dks²|dt krÖt|ƒt|ƒk rî|j|ttƒ ƒ q |s |j|ttƒ ƒ P q W tt	t
||ƒƒƒ| _tt	|ƒƒ| _t| jƒ| _| j jddƒ | j jƒ | _d S )	Nr   s   c             S   s   g | ]}|j ƒ r|j ƒ ‘qS r   )Ústrip)r  Úlabelr   r   r   r  @  s    z'Babyl._generate_toc.<locals>.<listcomp>rW   ó   ,ó   rU   )rÔ   ra   rn   rß   rc   r¬   r°   r�   r   r  r  r‚   r-  rÕ   rÙ   )r   r  r  r  Zlabel_listsr  ru   r5  r   r   r   rë   2  s4    



zBabyl._generate_tocc             C   sV   dt  }|dt  7 }| jƒ }dd„ |D ƒ}|ddj|ƒ t  7 }|d7 }|j|ƒ d S )Ns   BABYL OPTIONS:s
   Version: 5c             s   s   | ]}|j ƒ V  qd S )N)rM   )r  r7  r   r   r   r  U  s    z*Babyl._pre_mailbox_hook.<locals>.<genexpr>s   Labels:r8  r9  )rc   r.  r~   rd   )r   r¨   Zbabylr5  r   r   r   rá   P  s    zBabyl._pre_mailbox_hookc             C   s   |j dt ƒ d S )Nó   )rd   rc   )r   r¨   r   r   r   rã   Z  s    zBabyl._pre_message_hookc             C   s   |j td ƒ d S )Nr9  )rd   rc   )r   r¨   r   r   r   rå   ^  s    zBabyl._post_message_hookc             C   sœ  | j jƒ }t|tƒr¼g }g }x0|jƒ D ]$}|| jkr@|j|ƒ q&|j|ƒ q&W | j jdƒ x |D ]}| j jd|jƒ  ƒ q`W | j jdƒ x$|D ]}| j jd|jƒ  d ƒ qŽW | j jt	ƒ n| j jdt	 ƒ t|t
jjƒ�r0tjƒ }t
jj|ddƒ}|j|ƒ |jdƒ x6|jƒ }| j j|jd	t	ƒƒ |d	k�s8| �r
P �q
W | j jd
t	 ƒ t|tƒ�r¼tjƒ }	t
jj|	ddƒ}
|
j|jƒ ƒ xz|	jƒ }| j j|jd	t	ƒƒ |d	k�s²| �r„P �q„W nB|jdƒ x6|jƒ }| j j|jd	t	ƒƒ |d	k�sö| �rÈP �qÈW x,|jdƒ}|�sP | j j|jd	t	ƒƒ �q W �nZt|tttjfƒ�r,t|tjƒ�rhtjdtdƒ |jƒ }t|tƒ�r~| j|ƒ}|jdƒd }|d dk�r | j j|d |… jd	t	ƒƒ | j jd
t	 ƒ | j j|d |… jd	t	ƒƒ | j j||d … jd	t	ƒƒ n(| j jd
t	 t	 ƒ | j j|jd	t	ƒƒ �n^t |dƒ�rzt |dƒ�rXtjdtdƒ |j!}|jƒ }d}x–|jƒ }|j"dƒ�rŒ|d d… d	 }n|j"dƒ�r¨|d d… d	 }| j j|jd	t	ƒƒ |d	k�sÎ| �rf|�rôd}| j jd
t	 ƒ |j|ƒ nP �qfW xŒ|jƒ }|�sP |j"dƒ�r,|d d… t	 }n:|j"dƒ�rJ|d d… t	 }n|j"d	ƒ�rf|d d… t	 }| j j|ƒ �qþW nt#dt$|ƒ ƒ‚| j jƒ }||fS )Nó   1s   , s   ,,ó    r8  s   1,,Fr   rQ   s   *** EOOH ***i   z8Use of StringIO input is deprecated, use BytesIO insteadrR   s   

rU   rW   rn   rT   zDUse of text mode files is deprecated, use a binary mode file insteadTs   
rV   zInvalid message type: %srZ   rY   rZ   rY   rZ   rZ   )%rÔ   rß   r[   r   r.  r4  r°   rd   rM   rc   r1   r!   r   r\   r]   r^   r_   r`   ra   rn   rb   Úget_visiblerS   rh   rg   ri   rj   rk   rl   rm   rP   rø   rE   rT   rf   rp   rq   )r   r!   rè   Zspecial_labelsr5  r7  Zorig_bufferZorig_generatorru   Z
vis_bufferZvis_generatorrT   Z
body_startZoriginal_posZ
first_passré   r   r   r   rì   b  sÀ    











zBabyl._install_message)NT)rw   rx   ry   Ú	frozensetr4  r   r"   r$   r(   r,   r3   r/   r.  rë   rá   rã   rå   rì   r   r   r   r   r   Õ  s   

	
c               @   s&   e Zd Zddd„Zdd„ Zdd„ ZdS )	r   Nc             C   sÒ   t |tjjƒr4| jtj|ƒƒ t |tƒrÎ|j| ƒ nšt |tƒrP| jtj	|ƒƒ n~t |t
ƒrl| jtj|ƒƒ nbt |tjƒrŠ| jtj|ƒƒ nDt|dƒr¦| jtj|ƒƒ n(|d kr¾tjjj| ƒ ntdt|ƒ ƒ‚d S )NrS   zInvalid message type: %s)r[   r1   r!   r   Ú_become_messageÚcopyÚdeepcopyÚ_explain_torh   r2   rg   Zmessage_from_stringr\   ÚTextIOWrapperZmessage_from_filerE   Zmessage_from_binary_filer   rp   rq   )r   r!   r   r   r   r   Ñ  s    



zMessage.__init__c             C   s8   t |dg ƒ}x&|jD ]}||kr|j| | j|< qW d S )NÚ_type_specific_attributes)ÚgetattrÚ__dict__)r   r!   Ztype_specificrŠ   r   r   r   r?  ä  s    zMessage._become_messagec             C   s   t |tƒrd S tdƒ‚d S )Nz Cannot convert to specified type)r[   r   rp   )r   r!   r   r   r   rB  ë  s    
zMessage._explain_to)N)rw   rx   ry   r   r?  rB  r   r   r   r   r   Î  s   
c               @   sx   e Zd Zdddg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dd„ Zdd„ Zdd„ ZdS )r	   Ú_subdirÚ_infoÚ_dateNc             C   s&   d| _ d| _tjƒ | _tj| |ƒ d S )Nr|   r‡   )rG  rH  r¿   rI  r   r   )r   r!   r   r   r   r   ø  s    
zMaildirMessage.__init__c             C   s   | j S )N)rG  )r   r   r   r   rŒ   ÿ  s    zMaildirMessage.get_subdirc             C   s(   |dks|dkr|| _ ntd| ƒ‚d S )Nr|   r}   z!subdir must be 'new' or 'cur': %s)rG  rO   )r   rš   r   r   r   r¤     s    zMaildirMessage.set_subdirc             C   s"   | j jdƒr| j dd … S dS d S )Nz2,rU   r‡   )rH  ro   )r   r   r   r   Ú	get_flags
  s    zMaildirMessage.get_flagsc             C   s   ddj t|ƒƒ | _d S )Nz2,r‡   )r~   râ   rH  )r   Úflagsr   r   r   Ú	set_flags  s    zMaildirMessage.set_flagsc             C   s$   | j djt| jƒ ƒt|ƒB ƒƒ d S )Nr‡   )rL  r~   r  rJ  )r   Úflagr   r   r   Úadd_flag  s    zMaildirMessage.add_flagc             C   s,   | j ƒ r(| jdjt| j ƒ ƒt|ƒ ƒƒ d S )Nr‡   )rJ  rL  r~   r  )r   rM  r   r   r   Úremove_flag  s    zMaildirMessage.remove_flagc             C   s   | j S )N)rI  )r   r   r   r   r“     s    zMaildirMessage.get_datec             C   s4   yt |ƒ| _W n  tk
r.   td| ƒ‚Y nX d S )Nzcan't convert to float: %s)ÚfloatrI  rO   rp   )r   Zdater   r   r   r¦   "  s    zMaildirMessage.set_datec             C   s   | j S )N)rH  )r   r   r   r   rŽ   )  s    zMaildirMessage.get_infoc             C   s&   t |tƒr|| _ntdt|ƒ ƒ‚d S )Nzinfo must be a string: %s)r[   rg   rH  rp   rq   )r   Úinfor   r   r   r¥   -  s    
zMaildirMessage.set_infoc             C   s¤  t |tƒr8|j| jƒ ƒ |j| jƒ ƒ |j| jƒ ƒ �nht |tƒrÄt	| jƒ ƒ}d|kr`|j
dƒ | jƒ dkrv|j
dƒ d|krˆ|j
dƒ d|krš|j
dƒ d|kr¬|j
dƒ |jd	tj| jƒ ƒƒ nÜt |tƒ�rt	| jƒ ƒ}d|krî|jd
ƒ d|k�r|jdƒ d|k�r |jdƒ nˆt |tƒ�r‚t	| jƒ ƒ}d|k�rD|jd
ƒ d|k�rX|jdƒ d|k�rl|jdƒ d|k�r |jdƒ nt |tƒ�r�ntdt|ƒ ƒ‚d S )NÚSÚRr}   ÚOÚTÚDÚFÚAzMAILER-DAEMONr(  ÚrepliedÚflaggedr)  r*  ÚPr+  z$Cannot convert to specified type: %s)r[   r	   rL  rJ  r¤   rŒ   r¦   r“   rù   r  rN  rñ   r¿   rý   r   r  r   Ú	add_labelr   rp   rq   )r   r!   rK  r   r   r   rB  4  sN    

















zMaildirMessage._explain_to)N)rw   rx   ry   rD  r   rŒ   r¤   rJ  rL  rN  rO  r“   r¦   rŽ   r¥   rB  r   r   r   r   r	   ó  s   

c               @   sV   e Zd ZdgZ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S )rù   Ú_fromNc             C   sV   | j ddƒ t|tjjƒrF|jƒ }|d k	rF|jdƒrF| j |dd … ƒ tj| |ƒ d S )NzMAILER-DAEMONTzFrom rX   )rñ   r[   r1   r!   r   rû   ro   r   )r   r!   rõ   r   r   r   r   e  s    z_mboxMMDFMessage.__init__c             C   s   | j S )N)r]  )r   r   r   r   rú   n  s    z_mboxMMDFMessage.get_fromc             C   s4   |d k	r*|dkrt jƒ }|dt j|ƒ 7 }|| _d S )NTú )r¿   rý   rü   r]  )r   rö   Ztime_r   r   r   rñ   r  s
    z_mboxMMDFMessage.set_fromc             C   s   | j ddƒ| j ddƒ S )NÚStatusr‡   zX-Status)r+   )r   r   r   r   rJ  z  s    z_mboxMMDFMessage.get_flagsc             C   sÚ   t |ƒ}d	\}}x&d
D ]}||kr||7 }|j|ƒ qW x&dD ]}||kr>||7 }|j|ƒ q>W |djt|ƒƒ7 }y| jd|ƒ W n  tk
r¢   | jd|ƒ Y nX y| jd|ƒ W n  tk
rÔ   | jd|ƒ Y nX d S )Nr‡   rS  rT  rV  rW  rX  r_  zX-Status)r‡   r‡   )rS  rT  )rV  rW  rX  )r  r$   r~   râ   Úreplace_headerr&   Z
add_header)r   rK  Zstatus_flagsZxstatus_flagsrM  r   r   r   rL  ~  s&    

z_mboxMMDFMessage.set_flagsc             C   s$   | j djt| jƒ ƒt|ƒB ƒƒ d S )Nr‡   )rL  r~   r  rJ  )r   rM  r   r   r   rN  ”  s    z_mboxMMDFMessage.add_flagc             C   s4   d| ksd| kr0| j djt| jƒ ƒt|ƒ ƒƒ d S )Nr_  zX-Statusr‡   )rL  r~   r  rJ  )r   rM  r   r   r   rO  ˜  s    z_mboxMMDFMessage.remove_flagc             C   sÞ  t |tƒrÐt| jƒ ƒ}d|kr(|jdƒ d|kr:|jdƒ d|krL|jdƒ d|kr^|jdƒ d|krp|jdƒ |d	= |d
= dj| jƒ jƒ dd … ƒ}y|j	t
jtj|dƒƒƒ W n ttfk
rÊ   Y nX �n
t |tƒrø|j| jƒ ƒ |j| jƒ ƒ nât |tƒ�rZt| jƒ ƒ}d|k�r$|jdƒ d|k�r8|jdƒ d|k�rL|jdƒ |d	= |d
= n€t |tƒ�r¼t| jƒ ƒ}d|k�r†|jdƒ d|k�rš|jdƒ d|k�r®|jdƒ |d	= |d
= nt |tƒ�rÊntdt|ƒ ƒ‚d S )NrT  r}   rW  rX  rS  rR  rV  rU  Zstatuszx-statusr^  rX   z%a %b %d %H:%M:%S %Yr(  rY  rZ  r)  r*  z$Cannot convert to specified type: %séûÿÿÿ)r[   r	   r  rJ  r¤   rN  r~   rú   r�   r¦   ÚcalendarZtimegmr¿   ZstrptimerO   ÚOverflowErrorrù   rL  rñ   r   r  r   r\  r   rp   rq   )r   r!   rK  Z
maybe_dater   r   r   rB  �  s^    



















z_mboxMMDFMessage._explain_to)N)N)rw   rx   ry   rD  r   rú   rñ   rJ  rL  rN  rO  rB  r   r   r   r   rù   `  s   
	
rù   c               @   s   e Zd ZdS )r
   N)rw   rx   ry   r   r   r   r   r
   Ñ  s   c               @   sD   e Zd ZdgZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )r   Ú
_sequencesNc             C   s   g | _ tj| |ƒ d S )N)rd  r   r   )r   r!   r   r   r   r   Ú  s    zMHMessage.__init__c             C   s   | j d d … S )N)rd  )r   r   r   r   r  ß  s    zMHMessage.get_sequencesc             C   s   t |ƒ| _d S )N)r7   rd  )r   r   r   r   r   r"  ã  s    zMHMessage.set_sequencesc             C   s6   t |tƒr"|| jkr2| jj|ƒ ntdt|ƒ ƒ‚d S )Nzsequence type must be str: %s)r[   rg   rd  r°   rp   rq   )r   r'  r   r   r   r  ç  s    

zMHMessage.add_sequencec             C   s*   y| j j|ƒ W n tk
r$   Y nX d S )N)rd  r$   rO   )r   r'  r   r   r   Úremove_sequenceï  s    zMHMessage.remove_sequencec             C   sJ  t |tƒrdt| jƒ ƒ}d|kr*|jdƒ n|jdƒ |jdƒ d|krP|jdƒ d|krb|jdƒ nât |tƒr¾t| jƒ ƒ}d|krŽ|jdƒ n
|jd	ƒ d|krª|jdƒ d|kr¼|jd
ƒ nˆt |tƒræx|| jƒ D ]}|j|ƒ qÒW n`t |t	ƒ�r(t| jƒ ƒ}d|k�r|j
dƒ d|k�rF|j
dƒ nt |tƒ�r6ntdt|ƒ ƒ‚d S )Nr(  r}   rR  rZ  rW  rY  rS  ÚROrT  rX  r*  z$Cannot convert to specified type: %s)r[   r	   r  r  r¤   rN  rù   r   r  r   r\  r   rp   rq   )r   r!   r   r'  r   r   r   rB  ö  s@    










zMHMessage._explain_to)N)
rw   rx   ry   rD  r   r  r"  r  re  rB  r   r   r   r   r   Õ  s   
c               @   s^   e Zd Zddg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dS )r   r-  Ú_visibleNc             C   s   g | _ tƒ | _tj| |ƒ d S )N)r-  r   rg  r   )r   r!   r   r   r   r   "  s    zBabylMessage.__init__c             C   s   | j d d … S )N)r-  )r   r   r   r   r.  (  s    zBabylMessage.get_labelsc             C   s   t |ƒ| _d S )N)r7   r-  )r   r5  r   r   r   r0  ,  s    zBabylMessage.set_labelsc             C   s6   t |tƒr"|| jkr2| jj|ƒ ntdt|ƒ ƒ‚d S )Nzlabel must be a string: %s)r[   rg   r-  r°   rp   rq   )r   r7  r   r   r   r\  0  s    

zBabylMessage.add_labelc             C   s*   y| j j|ƒ W n tk
r$   Y nX d S )N)r-  r$   rO   )r   r7  r   r   r   Úremove_label8  s    zBabylMessage.remove_labelc             C   s
   t | jƒS )N)r   rg  )r   r   r   r   r=  ?  s    zBabylMessage.get_visiblec             C   s   t |ƒ| _d S )N)r   rg  )r   Zvisibler   r   r   r/  C  s    zBabylMessage.set_visiblec             C   sj   x6| j jƒ D ](}|| kr,| j j|| | ƒ q| j |= qW x,dD ]$}|| kr>|| j kr>| | | j |< q>W d S )NÚDateÚFromúReply-ToÚToÚCCÚSubject)ri  rj  rk  rl  rm  rn  )rg  r8   r`  )r   Úheaderr   r   r   Úupdate_visibleG  s    
zBabylMessage.update_visiblec             C   sv  t |tƒr~t| jƒ ƒ}d|kr*|jdƒ n|jdƒ |jdƒ d|ksNd|krX|jdƒ d|krj|jdƒ d	|kr||jd
ƒ nôt |tƒrØt| jƒ ƒ}d|kr¨|jdƒ n
|jdƒ d	|krÄ|jdƒ d|krÖ|jdƒ nšt |tƒ�rt| jƒ ƒ}d|k�r|jdƒ d|k�rr|jdƒ nXt |t	ƒ�rT|j
| jƒ ƒ x<| jƒ D ]}|j|ƒ �q>W nt |tƒ�rbntdt|ƒ ƒ‚d S )Nr(  r}   rR  r+  r,  r[  r*  rS  r)  rU  rf  rT  rV  rX  rY  z$Cannot convert to specified type: %s)r[   r	   r  r.  r¤   rN  rù   r   r  r   r/  r=  r\  r   rp   rq   )r   r!   r5  r7  r   r   r   rB  R  sF    










zBabylMessage._explain_to)N)rw   rx   ry   rD  r   r.  r0  r\  rh  r=  r/  rp  rB  r   r   r   r   r     s   
c               @   s   e Zd ZdS )r   N)rw   rx   ry   r   r   r   r   r   |  s   c               @   s¤   e Zd Zd%dd„Zd&dd„Zd'dd„Zd(dd	„Zd)d
d„Z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d#d$„ ƒZdS )+rª   Nc             C   s$   || _ |d kr|jƒ | _n|| _d S )N)rÔ   rß   Ú_pos)r   r¨   Úposr   r   r   r   ƒ  s    z_ProxyFile.__init__c             C   s   | j || jjƒS )N)Ú_readrÔ   rS   )r   Úsizer   r   r   rS   ‹  s    z_ProxyFile.readc             C   s   | j || jjƒS )N)rs  rÔ   Úread1)r   rt  r   r   r   ru  �  s    z_ProxyFile.read1c             C   s   | j || jjƒS )N)rs  rÔ   rn   )r   rt  r   r   r   rn   “  s    z_ProxyFile.readlinec             C   s>   g }x4| D ],}|j |ƒ |d k	r
|t|ƒ8 }|dkr
P q
W |S )Nr   )r°   r¬   )r   ÚsizehintrB   ru   r   r   r   Ú	readlines—  s    

z_ProxyFile.readlinesc             c   s    x| j ƒ }|sd S |V  qW d S )N)rn   )r   ru   r   r   r   r;   ¢  s
    z_ProxyFile.__iter__c             C   s   | j S )N)rq  )r   r   r   r   rß   ª  s    z_ProxyFile.tellr   c             C   s4   |dkr| j j| jƒ | j j||ƒ | j jƒ | _d S )NrW   )rÔ   ra   rq  rß   )r   ÚoffsetÚwhencer   r   r   ra   ®  s    z_ProxyFile.seekc          
   C   s0   t | dƒr,zt | jdƒr"| jjƒ  W d | `X d S )NrÔ   rL   )rE   rÔ   rL   )r   r   r   r   rL   µ  s
    
z_ProxyFile.closec             C   s2   |d krd}| j j| jƒ ||ƒ}| j jƒ | _|S )NrW   rZ   )rÔ   ra   rq  rß   )r   rt  Úread_methodrB   r   r   r   rs  ¾  s    z_ProxyFile._readc             C   s   | S )Nr   )r   r   r   r   Ú	__enter__Ç  s    z_ProxyFile.__enter__c             G   s   | j ƒ  d S )N)rL   )r   Úexcr   r   r   Ú__exit__Ë  s    z_ProxyFile.__exit__c             C   s
   | j jƒ S )N)rÔ   Úreadable)r   r   r   r   r~  Î  s    z_ProxyFile.readablec             C   s
   | j jƒ S )N)rÔ   Úwritable)r   r   r   r   r  Ñ  s    z_ProxyFile.writablec             C   s
   | j jƒ S )N)rÔ   Úseekable)r   r   r   r   r€  Ô  s    z_ProxyFile.seekablec             C   s
   | j jƒ S )N)rÔ   rI   )r   r   r   r   rI   ×  s    z_ProxyFile.flushc             C   s&   t | dƒsdS t | jdƒsdS | jjS )NrÔ   Tr
  F)rE   rÔ   r
  )r   r   r   r   r
  Ú  s
    
z_ProxyFile.closed)N)N)N)N)N)r   )rw   rx   ry   r   rS   ru  rn   rw  r;   rß   ra   rL   rs  r{  r}  r~  r  r€  rI   Úpropertyr
  r   r   r   r   rª   €  s"   





		rª   c               @   s8   e Zd Zddd„Zdd„ Zddd„Zd	d
„ Zdd„ ZdS )r÷   Nc             C   s   t j| ||ƒ || _|| _d S )N)rª   r   Ú_startÚ_stop)r   r¨   rè   ré   r   r   r   r   æ  s    z_PartialFile.__init__c             C   s   t j| ƒ| j S )N)rª   rß   r‚  )r   r   r   r   rß   ì  s    z_PartialFile.tellr   c             C   s<   |dkr| j | _d}n|dkr*| j| _d}tj| ||ƒ d S )Nr   rW   rU   )r‚  rq  rƒ  rª   ra   )r   rx  ry  r   r   r   ra   ð  s    z_PartialFile.seekc             C   sB   | j | j }|dkrdS |d ks0|dk s0||kr4|}tj| ||ƒS )Nr   rï   )rƒ  rq  rª   rs  )r   rt  rz  Z	remainingr   r   r   rs  ú  s    z_PartialFile._readc             C   s   t | dƒr| `d S )NrÔ   )rE   rÔ   )r   r   r   r   rL     s    
z_PartialFile.close)NN)r   )rw   rx   ry   r   rß   ra   rs  rL   r   r   r   r   r÷   ã  s
   


	r÷   Tc          4   C   sž  d}�yZt rpyt j| t jt jB ƒ W nJ tk
rn } z.|jtjtjtjfkr\t	d| j
 ƒ‚n‚ W Y d d }~X nX |�r^yt| j
d ƒ}|jƒ  W n: tk
rÊ } z|jtjtjfkr¸d S ‚ W Y d d }~X nX y`ytj|j
| j
d ƒ d}W n2 ttfk
�r   tj|j
| j
d ƒ d}Y nX tj|j
ƒ W n0 tk
�r\   tj|j
ƒ t	d| j
 ƒ‚Y nX W n8   t �r|t j| t jƒ |�r’tj| j
d ƒ ‚ Y nX d S )NFzlockf: lock unavailable: %sz.lockTzdot lock unavailable: %s)ÚfcntlÚlockfZLOCK_EXZLOCK_NBr˜   r™   ZEAGAINrÒ   rÓ   r   rŠ   rà   rL   r   r”   r•   r–   r—   r#  rÊ   r$   ÚLOCK_UN)r¨   rÝ   Zdotlock_donerž   Zpre_lockr   r   r   rÛ   
  sH    
rÛ   c             C   s8   t rt j| t jƒ tjj| jd ƒr4tj| jd ƒ d S )Nz.lock)r„  r…  r†  r   r   r€   rŠ   r$   )r¨   r   r   r   rÜ   4  s    rÜ   c             C   s8   t j| t jt jB t jB dƒ}z
t| dƒS t j|ƒ X d S )Ni¶  zrb+)r   r£   rµ   r  ÚO_RDWRrL   )r   Úfdr   r   r   rÉ   ;  s    
rÉ   c             C   s$   t d| ttjƒ ƒtjƒ tjƒ f ƒS )Nz%s.%s.%s.%s)rÉ   rÅ   r¿   rÃ   rÄ   r   rÆ   )r   r   r   r   rà   C  s    rà   c             C   s$   | j ƒ  ttdƒr tj| jƒ ƒ d S )NÚfsync)rI   rE   r   r‰  Úfileno)r¨   r   r   r   rÞ   I  s    
rÞ   c             C   s   t | ƒ | jƒ  d S )N)rÞ   rL   )r¨   r   r   r   r‹   O  s    r‹   c               @   s   e Zd ZdS )r   N)rw   rx   ry   r   r   r   r   r   U  s   c               @   s   e Zd ZdS )r   N)rw   rx   ry   r   r   r   r   r   X  s   c               @   s   e Zd ZdS )r   N)rw   rx   ry   r   r   r   r   r   [  s   c               @   s   e Zd ZdS )r   N)rw   rx   ry   r   r   r   r   r   ^  s   c               @   s   e Zd ZdS )r   N)rw   rx   ry   r   r   r   r   r   a  s   )T)/r   r¿   rb  rÃ   r™   r@  rj   r1   Zemail.messageZemail.generatorr\   r-   r„  ÚImportErrorÚ__all__rc   rM   r   r   rÐ   rî   r   r   r   r   r!   r   r	   rù   r
   r   r   r   rª   r÷   rÛ   rÜ   rÉ   rà   rÞ   r‹   Ú	Exceptionr   r   r   r   r   r   r   r   r   Ú<module>	   sn   

 h  8 DB4-  3 z%mqH_c'
*