B
    u9a>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 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 t j |¡¡| _|| _d S )N)ÚosÚpathÚabspathÚ
expanduserÚ_pathÚ_factory)Úselfr   ÚfactoryÚcreate© r   ú/usr/lib/python3.7/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   |   |¡ d S )N)r$   )r   r#   r   r   r   Ú__delitem__1   s    zMailbox.__delitem__c             C   s(   y|   |¡ 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
|   |¡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|  |¡S t |  |¡¡}|   |¡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  |  |¡¡ ¡ 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 |  ¡ ƒS )N)Úlistr6   )r   r   r   r   Úkeyse   s    zMailbox.keysc          	   c   s@   x:|   ¡ 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   |   ¡ S )N)r:   )r   r   r   r   Ú__iter__r   s    zMailbox.__iter__c             C   s   t |  ¡ ƒS )N)r7   r:   )r   r   r   r   Úvaluesu   s    zMailbox.valuesc          	   c   sD   x>|   ¡ 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 |  ¡ ƒ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|   ¡ D ]}|  |¡ 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 |  |¡ |S )N)r&   r'   )r   r#   r*   Úresultr   r   r   Úpop“   s    
zMailbox.popc             C   s*   x$|   ¡ D ]}||  |¡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| ¡ }nt |dƒr(| ¡ }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
|  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ƒrvt ¡ }tj ||d¡}| |¡ | 	d¡ | 
¡ }| dt¡}| |¡ | jrr| t¡sr| t¡ n„t |tttjfƒrt |tjƒr¬t dtd¡ | ¡ }t |tƒrÀ|  |¡}|rÐ| dd¡}| dt¡}| |¡ | jrú| t¡sú| t¡ nôt|dƒrêt|dƒr2t d	td¡ |j}d }xŒ| ¡ }| d
¡r^|d d… d }n| d¡rz|d d… d }|s‚P |r¤| d¡r¤d|dd …  }| dt¡}| |¡ |}q8W | jrú|rú| t¡sú| 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   rc   rt   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  | |||¡ tj | jd¡tj | jd¡tj | jd¡dœ| _tj | j¡sŽ|r„t | jd¡ x*| j 	¡ D ]}t |d¡ qnW n
t
| jƒ‚i | _dddœ| _d| _d| _d S )	NÚtmpÚnewÚcur)ry   rz   r{   iÀ  r   )r{   rz   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~  |   ¡ }y|  ||¡ W n* tk
rB   | ¡  t |j¡ ‚ Y nX t|ƒ t|t	ƒr|| 
¡ }| j| ¡  }|| jkr„d}nd}d}tj |j¡ | j¡d }tj | j||| ¡}t|t	ƒrÞt |jtj |j¡| ¡ f¡ yLyt |j|¡ W n( ttfk
r   t |j|¡ Y nX t |j¡ W nN tk
rx } z.t |j¡ |jtjkrftd| ƒ‚n‚ W d d }~X Y nX |S )NÚ rz   r   z$Name clash with existing message: %s)Ú_create_tmprt   ÚBaseExceptionrL   r   r$   ÚnameÚ_sync_closerY   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  t 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|   |¡ 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Ê   |   |¡}|  |¡}|   |¡}t|tƒr.|}n|}tj |¡}| j|kr`| j| | j¡d  }nd}|  	|¡ tj 
| j|¡}	tj 
| j||| ¡}
t|tƒrºt |	tj |	¡| ¡ f¡ t |	|
¡ d S )NrW   r…   )r   r"   rY   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¢   |   |¡}ttj | j|¡dƒ }| jr4|  |¡}nt|ƒ}W d Q R X tj |¡\}}| 	|¡ | j
|kr€| | | j
¡d ¡ | tj tj | j|¡¡¡ |S )NÚrbrW   )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|  |¡¡dƒ}| ¡  td¡S Q R X d S )Nr    rQ   )	r¡   r   r   r|   r   r   rS   r`   ra   )r   r#   r¦   r   r   r   r3     s    zMaildir.get_bytesc             C   s$   t t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   |   ¡  x:| jD ]0}y|  |¡ 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kS )N)r©   r€   )r   r#   r   r   r   r?   •  s    zMaildir.__contains__c             C   s   |   ¡  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¡D ]F}t|ƒdkr|d dkrt j t j | j|¡¡r| |dd … ¡ qW |S )Né   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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d| ¡}t|| jd}t j |d¡}t j |¡sXt  t  |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d| ¡}xTt  t j |d¡¡t  t j |d¡¡ D ](}t|ƒdk sZ|d dkr>td| ƒ‚q>W xPt  |¡D ]B}|dkrv|dkrv|dkrvt j t j ||¡¡rvtd||f ƒ‚qvW x`t j|d	d
D ]N\}}}x |D ]}t  	t j ||¡¡ qÜW x |D ]}t  
t j ||¡¡ qþW qÌW t  
|¡ d S )Nr¬   rz   r{   r«   r   zFolder contains message(s): %sry   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   ¡ }xNt tj | jd¡¡D ]4}tj | jd|¡}|tj |¡ dkr t |¡ q W d S )Nry   i@ú )Útimer   r­   r   r|   r   r   r$   )r   Únowr°   r   r   r   r   ÚcleanÝ  s
    zMaildir.cleanr«   c             C   sÒ   t   ¡ }t ¡ }d|kr$| dd¡}d|kr8| dd¡}dt|ƒt|d d ƒt ¡ tj|f }tj	 
| jd|¡}yt |¡ 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\057rx   z\072z%s.M%sP%sQ%s.%sr«   g    €„.Ary   z&Name clash prevented file creation: %s)r¾   ÚsocketÚgethostnamer`   Ú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 d| j krbd}x<| jD ]2}tj | j| ¡}|| j| krLd}|| j|< q$W |sbd S i | _xl| jD ]b}| j| }xRt 	|¡D ]D}tj 
||¡}tj |¡rªqŠ| | j¡d }tj 
||¡| j|< qŠW qpW t   ¡ | _d S )Né   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   s|   y,t j t j | j| j| ¡¡r*| j| S W n tk
r@   Y nX |  ¡  y
| j| S  tk
rv   td| ƒ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|  ¡ | _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)ru   rv   rw   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  | |||¡ yt| jdƒ}W nn tk
rŽ } zP|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 d d }~X Y 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d7  _d| _| jd S )Nr«   T)r   Ú_append_messager€   rÕ   r×   )r   r!   r   r   r   r"   X  s
    z_singlefileMailbox.addc             C   s   |   |¡ | j|= d| _d S )NT)r   r€   rÖ   )r   r#   r   r   r   r$   b  s    
z_singlefileMailbox.removec             C   s$   |   |¡ |  |¡| 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 ¡ E d H  d S )N)r   r€   r8   )r   r   r   r   r6   n  s    z_singlefileMailbox.iterkeysc             C   s   |   ¡  || jkS )N)r   r€   )r   r#   r   r   r   r?   s  s    z_singlefileMailbox.__contains__c             C   s   |   ¡  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 dd¡ | j ¡ }|| jkrTtd| j|f ƒ‚t| j	ƒ}y¬i }|  
|¡ xŽt| j ¡ ƒD ]|}| j| \}}| j |¡ |  |¡ | ¡ }x0| j td|| j ¡  ƒ¡}|sÒP | |¡ q°W || ¡ f||< |  |¡ q~W | ¡ | _W n"   | ¡  t |j¡ ‚ Y nX t|ƒ | j ¡  t | j	¡j}	t |j|	¡ yt |j| j	¡ W n2 tk
r¢   t | j	¡ t |j| j	¡ Y nX t| j	dƒ| _|| _d| _ d| _| jrÚt| jdd d S )NFr   rÊ   z4Size of mailbox file changed (expected %i, found %i)i   zrb+)Údotlock) rÖ   r×   Ú_sync_flushrÔ   r_   ÚtellrÙ   r   Ú_create_temporaryr   Ú_pre_mailbox_hookÚsortedr€   r8   Ú_pre_message_hookrS   Úminrb   Ú_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|   ¡  W d z| jr|  ¡  W d | j ¡  X X d S )N)rI   rØ   rK   rÔ   rL   )r   r   r   r   rL   Õ  s    z_singlefileMailbox.closec             C   sL   | j d kr|  ¡  |d k	rHy
| j | S  tk
rF   td| ƒ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  dd¡ | j  ¡ }t| jƒdkr8| js8|  | j ¡ y&|  | j ¡ |  |¡}|  	| j ¡ W n" t
k
r€   | j  |¡ ‚ Y nX | j  ¡  | j  ¡ | _|S )Nr   rÊ   )rÔ   r_   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)ru   rv   rw   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 ¡  td¡}| j || j ¡  ¡}|  | td¡¡}| 	|dd …  
d¡¡ |S )Nó    rQ   rX   r   )r   rÔ   r_   rl   r`   ra   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|dS )N)Úunixfrom)r1   r2   r3   r4   )r   r#   Úfrom_r   r   r   r5     s    z_mboxMMDF.get_stringc             C   sJ   |   |¡\}}| j |¡ |s(| j ¡  | j || j ¡  ¡}| td¡S )NrQ   )r   rÔ   r_   rl   rS   rß   r`   ra   )r   r#   rö   rè   ré   rô   r   r   r   r3     s    
z_mboxMMDF.get_bytesc             C   s<   |   |¡\}}| j |¡ |s(| j ¡  t| j| j ¡ |ƒS )N)r   rÔ   r_   rl   Ú_PartialFilerß   )r   r#   rö   rè   ré   r   r   r   r/     s
    
z_mboxMMDF.get_filec             C   s  d }t |tƒr|  |¡}t |tƒrf| d¡rf| d¡}|dkr\|d |… }||d d … }q°|}d}nJt |tƒrˆ| ¡  d¡}d| }n(t |t	j
jƒr°| ¡ }|d k	r°| d¡}|d krÎdt t ¡ ¡ ¡  }| j ¡ }| j |t ¡ |  || j| j¡ | j ¡ }||fS )Ns   From rQ   rW   r«   rï   r   s   From MAILER-DAEMON )rY   re   rP   rf   rm   ÚfindÚ_mboxMMDFMessageÚget_fromrM   r1   r!   r   Úget_unixfromr¾   ÚasctimeÚgmtimerÔ   rß   rb   ra   rt   Ú_mangle_from_)r   r!   ró   ÚnewlineZauthorrè   ré   r   r   r   rì   &  s0    







z_mboxMMDF._install_messageN)F)F)F)	ru   rv   rw   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 | |||¡ d S )N)r
   rð   rî   r   )r   r   r   r   r   r   r   r   L  s    zmbox.__init__c             C   s   |  t¡ d S )N)rb   ra   )r   r¦   r   r   r   rå   Q  s    zmbox._post_message_hookc             C   sì   g g  }}d}| j  d¡ x | j  ¡ }| j  ¡ }| d¡r|t|ƒt|ƒk rl|rb| |ttƒ ¡ n
| |¡ | |¡ d}q|s¦|r˜| |ttƒ ¡ n
| |¡ P q|tkr´d}qd}qW tt	t
||ƒƒƒ| _t| jƒ| _| j  ¡ | _d S )NFr   s   From T)rÔ   r_   rß   rl   rm   rª   r¯   ra   ÚdictÚ	enumerateÚzipr€   rÕ   rÙ   )r   ÚstartsÚstopsZlast_was_emptyÚline_posrs   r   r   r   rë   U  s0    






zmbox._generate_toc)NT)ru   rv   rw   rþ   rc   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 | |||¡ d S )N)r   rð   rî   r   )r   r   r   r   r   r   r   r   z  s    zMMDF.__init__c             C   s   |  dt ¡ d S )Ns   )rb   ra   )r   r¦   r   r   r   rã     s    zMMDF._pre_message_hookc             C   s   |  td t ¡ d S )Ns   )rb   ra   )r   r¦   r   r   r   rå   ƒ  s    zMMDF._post_message_hookc             C   sæ   g g  }}| j  d¡ d}xŒ|}| j  ¡ }| j  ¡ }| dt ¡rž| |¡ xV|}| j  ¡ }| j  ¡ }|dt krˆ| |ttƒ ¡ P qN|sN| |¡ P qNW q|sP qW tt	t
||ƒƒƒ| _t| jƒ| _| j  dd¡ | j  ¡ | _d S )Nr   s   rÊ   )rÔ   r_   rl   rß   rm   ra   r¯   rª   r   r  r  r€   rÕ   rÙ   )r   r  r  Únext_posr  rs   r   r   r   rë   ‡  s2    






zMMDF._generate_toc)NT)ru   rv   rw   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  | |||¡ tj | j¡sj|r`t | jd¡ t t t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ä   |   ¡ }t|ƒdkrd}nt|ƒd }tj | jt|ƒ¡}t|ƒ}d}zŠ| j	rVt
|ƒ zfy|  ||¡ W n: tk
r¢   | j	r†t|ƒ t|ƒ d}t |¡ ‚ Y nX t|tƒrº|  ||¡ W d | j	rÌt|ƒ X W d |sÞt|ƒ X |S )Nr   r«   FT)r8   rª   Úmaxr   r   r|   r   re   rÈ   rØ   rÛ   rt   r‡   rÜ   r‰   r$   rY   r   Ú_dump_sequences)r   r!   r8   Znew_keyrŸ   r¦   Úclosedr   r   r   r"   ³  s6    


zMH.addc          
   C   sx   t j | jt|ƒ¡}yt|dƒ}W n> tk
r` } z |jtjkrNt	d| ƒ‚n‚ W d d }~X Y nX | 
¡  t  |¡ d S )Nzrb+zNo message with key: %s)r   r   r|   r   re   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t|ƒ¡}yt|dƒ}W n> tk
r` } z |jtjkrNt	d| ƒ‚n‚ W d d }~X Y nX zd| j
rrt|ƒ z@t  t  |t jt jB ¡¡ |  ||¡ t|tƒr°|  ||¡ W d | j
rÂt|ƒ X W d t|ƒ X d S )Nzrb+zNo message with key: %s)r   r   r|   r   re   r¡   r–   r—   rÑ   r&   rØ   rÛ   rL   rµ   ÚO_TRUNCrt   rY   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t|ƒ¡dƒ}nttj | jt|ƒ¡dƒ}W n> tk
r~ } z |jtj	krlt
d| ƒ‚n‚ W d d }~X Y nX |2 | j r”t|ƒ zt|ƒ}W d | j r°t|ƒ X W d Q R X x*|  ¡  ¡ D ]\}}||krÊ| |¡ qÊW |S )Nzrb+r    zNo message with key: %s)rØ   r¡   r   r   r|   r   re   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t|ƒ¡dƒ}nttj | jt|ƒ¡dƒ}W n> tk
r~ } z |jtj	krlt
d| ƒ‚n‚ W d d }~X Y nX |6 | j r”t|ƒ z| ¡  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   re   r–   r—   rÑ   r&   rÛ   rS   r`   ra   rÜ   )r   r#   r¦   rœ   r   r   r   r3     s    zMH.get_bytesc          
   C   sf   yt tj | jt|ƒ¡dƒ}W n> tk
r\ } z |jtjkrJt	d| ƒ‚n‚ W d d }~X Y nX t
|ƒS )Nr    zNo message with key: %s)r¡   r   r   r|   r   re   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¡D ƒƒƒS )Nc             s   s   | ]}|  ¡ 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 t j | jt|ƒ¡¡S )N)r   r   r~   r|   r   re   )r   r#   r   r   r   r?   9  s    zMH.__contains__c             C   s   t t|  ¡ ƒƒS )N)rª   r7   r6   )r   r   r   r   r@   =  s    z
MH.__len__c             C   s2   | j s.tt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|  ¡  d S )N)rØ   rK   )r   r   r   r   rL   T  s    zMH.closec             C   s@   g }x6t  | j¡D ]&}t j t j | j|¡¡r| |¡ 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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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|¡}t  |¡}|dgkr:t  t j |d¡¡ n|g krDntd| j ƒ‚t  |¡ d S )Nz.mh_sequenceszFolder not empty: %s)r   r   r|   r   r­   r$   r   r¹   )r   r²   r   Úentriesr   r   r   r½   k  s    

zMH.remove_folderc       
   
      s  i }t tj | jd¡dddä}t|  ¡ ƒ‰ xÐ|D ]È}yž| d¡\}}tƒ }xT| ¡ D ]H}| ¡ rr| 	t
|ƒ¡ qVdd„ | d¡D ƒ\}}	| t||	d	 ƒ¡ qVW ‡ fd
d„t|ƒD ƒ||< t|| ƒdkrÒ||= W q2 tk
rø   td| ¡  ƒ‚Y q2X q2W W d Q R X |S )Nz.mh_sequencesÚrÚASCII)Úencodingrx   c             s   s   | ]}t |ƒV  qd S )N)rÄ   )r  Úxr   r   r   r  „  s    z#MH.get_sequences.<locals>.<genexpr>ú-r«   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   Úresultsr¦   rs   rˆ   Úcontentsr8   Úspecrè   ré   r   )r  r   r  w  s&    

 zMH.get_sequencesc             C   s
  t tj | jd¡ddd}zàt t  |jtjtjB ¡¡ x¾| 	¡ D ]²\}}t
|ƒdkrXqB| |d ¡ d }d}xbtt|ƒƒD ]R}|d |kr |sÊd	}| d
¡ n*|r¼d}| d||f ¡ n| d| ¡ |}q|W |rê| t|ƒd ¡ qB| d¡ qBW W d t|ƒ X d S )Nz.mh_sequenceszr+r  )r  r   rx   Fr«   Tr  z%s %sz %sÚ
)r¡   r   r   r|   r   rL   rˆ   rµ   r  r>   rª   rb   râ   r  re   r‰   )r   Ú	sequencesr¦   rˆ   r8   ÚprevZ
completingr#   r   r   r   Úset_sequences  s.    zMH.set_sequencesc       	      C   sL  |   ¡ }d}g }xÎ|  ¡ D ]Â}|d |krÔ| ||d f¡ y4t tj | jt|ƒ¡tj | jt|d ƒ¡¡ W nH t	t
fk
r¸   t tj | jt|ƒ¡tj | jt|d ƒ¡¡ Y nX t tj | jt|ƒ¡¡ |d7 }qW |d | _t|ƒdkrúd S xB| ¡ D ]6\}}x*|D ]"\}}||kr||| |¡< qW qW |  |¡ d S )Nr   r«   )r  r6   r¯   r   r’   r   r|   r   re   r“   r”   r•   ÚunlinkrÕ   rª   r>   Úindexr$  )	r   r"  r#  Zchangesr#   rˆ   r  Úoldrz   r   r   r   Úpack¬  s,     

zMH.packc             C   s|   |  ¡ }|   ¡ }x<| ¡ D ]0\}}||kr6| |¡ q||kr|| |¡= qW x|D ]}||krT|g||< qTW |  |¡ 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)ru   rv   rw   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  | |||¡ i | _d S )N)rÐ   r   Ú_labels)r   r   r   r   r   r   r   r   Û  s    zBabyl.__init__c             C   s(   t  | |¡}t|tƒr$| ¡ | j|< |S )N)rÐ   r"   rY   r   Ú
get_labelsr/  )r   r!   r#   r   r   r   r"   à  s    
z	Babyl.addc             C   s"   t  | |¡ || jkr| j|= d S )N)rÐ   r$   r/  )r   r#   r   r   r   r$   ç  s    
zBabyl.removec             C   s*   t  | ||¡ t|tƒr&| ¡ | j|< d S )N)rÐ   r(   rY   r   r0  r/  )r   r#   r!   r   r   r   r(   í  s    
zBabyl.__setitem__c       
      C   sú   |   |¡\}}| j |¡ | j ¡  t ¡ }x2| j ¡ }|dt ksH|sJP | | td¡¡ q.W t ¡ }x.| j ¡ }|tks€|s‚P | | td¡¡ qjW || j 	¡  }| j 
|¡}| td¡}t| ¡ | ƒ}	|	 | ¡ ¡ || jkrö|	 | j| ¡ |	S )Ns   *** EOOH ***rQ   )r   rÔ   r_   rl   rZ   r[   ra   rb   r`   rß   rS   r   rk   Úset_visibler/  Ú
set_labels)
r   r#   rè   ré   Úoriginal_headersrs   Zvisible_headersÚnZbodyr§   r   r   r   r,   ó  s.    



zBabyl.get_messagec       	      C   s´   |   |¡\}}| j |¡ | j ¡  t ¡ }x2| j ¡ }|dt ksH|sJP | | td¡¡ q.W x| j ¡ }|tksx|sbP qbW | 	¡ }|| j 
¡  }| j |¡}| td¡}|| S )Ns   *** EOOH ***rQ   )r   rÔ   r_   rl   rZ   r[   ra   rb   r`   rk   rß   rS   )	r   r#   rè   ré   r3  rs   Zheadersr4  rr   r   r   r   r3     s$    


zBabyl.get_bytesc             C   s   t  |  |¡ dt¡¡S )NrQ   )rZ   r[   r3   r`   ra   )r   r#   r   r   r   r/   %  s    zBabyl.get_filec             C   s@   |   ¡  tƒ }x| j ¡ D ]}| |¡ qW | | j¡ t|ƒS )N)r   r  r/  r<   rH   Údifference_updateÚ_special_labelsr7   )r   ÚlabelsZ
label_listr   r   r   r0  )  s    zBabyl.get_labelsc             C   s>  g g  }}| j  d¡ d}g }xÒ|}| j  ¡ }| j  ¡ }|dt kržt|ƒt|ƒk rf| |ttƒ ¡ | |¡ dd„ | j  ¡ dd …  d¡D ƒ}| |¡ q |dks²|dt krÖt|ƒt|ƒk rî| |ttƒ ¡ q |s | |ttƒ ¡ P q W tt	t
||ƒƒƒ| _tt	|ƒƒ| _t| jƒ| _| j  dd¡ | j  ¡ | _d S )	Nr   s   c             S   s   g | ]}|  ¡ r|  ¡ ‘qS r   )Ústrip)r  Úlabelr   r   r   r  @  s    z'Babyl._generate_toc.<locals>.<listcomp>r«   ó   ,ó   rÊ   )rÔ   r_   rl   rß   ra   rª   r¯   rŽ   r   r  r  r€   r/  rÕ   rÙ   )r   r  r  r  Zlabel_listsr  rs   r7  r   r   r   rë   2  s4    



zBabyl._generate_tocc             C   sV   dt  }|dt  7 }|  ¡ }dd„ |D ƒ}|dd |¡ t  7 }|d7 }| |¡ d S )Ns   BABYL OPTIONS:s
   Version: 5c             s   s   | ]}|  ¡ V  qd S )N)rM   )r  r9  r   r   r   r  U  s    z*Babyl._pre_mailbox_hook.<locals>.<genexpr>s   Labels:r:  r;  )ra   r0  r|   rb   )r   r¦   Zbabylr7  r   r   r   rá   P  s    zBabyl._pre_mailbox_hookc             C   s   |  dt ¡ d S )Nó   )rb   ra   )r   r¦   r   r   r   rã   Z  s    zBabyl._pre_message_hookc             C   s   |  td ¡ d S )Nr;  )rb   ra   )r   r¦   r   r   r   rå   ^  s    zBabyl._post_message_hookc             C   s”  | j  ¡ }t|tƒr¼g }g }x0| ¡ D ]$}|| jkr@| |¡ q&| |¡ q&W | j  d¡ x |D ]}| j  d| ¡  ¡ q`W | j  d¡ x$|D ]}| j  d| ¡  d ¡ qŽW | j  t	¡ n| j  dt	 ¡ t|t
jjƒr*t ¡ }t
j |dd¡}| |¡ | d¡ x4| ¡ }| j  | d	t	¡¡ |d	ks6|s
P q
W | j  d
t	 ¡ t|tƒr¸t ¡ }	t
j |	dd¡}
|
 | ¡ ¡ xv|	 ¡ }| j  | d	t	¡¡ |d	ks®|s‚P q‚W n@| d¡ x4| ¡ }| j  | d	t	¡¡ |d	ksð|sÄP qÄW x,| d¡}|sP | j  | d	t	¡¡ qúW nXt|tttjfƒr&t|tjƒrbt dtd¡ | ¡ }t|tƒrx|  |¡}| d¡d }|d dkrú| j  |d |…  d	t	¡¡ | j  d
t	 ¡ | j  |d |…  d	t	¡¡ | j  ||d …  d	t	¡¡ n(| j  d
t	 t	 ¡ | j  | d	t	¡¡ n\t |dƒrrt |dƒrRt dtd¡ |j!}| ¡ }d}x”| ¡ }| "d¡r†|d d… d	 }n| "d¡r¢|d d… d	 }| j  | d	t	¡¡ |d	ksÆ|s`|rìd}| j  d
t	 ¡ | |¡ nP q`W xŒ| ¡ }|sP | "d¡r$|d d… t	 }n:| "d¡rB|d d… t	 }n| "d	¡r^|d d… t	 }| j  |¡ qöW nt#dt$|ƒ ƒ‚| j  ¡ }||fS )Nó   1s   , s   ,,ó    r:  s   1,,Fr   rQ   s   *** EOOH ***i   z8Use of StringIO input is deprecated, use BytesIO insteadrR   s   

rÊ   rW   rl   rT   zDUse of text mode files is deprecated, use a binary mode file insteadTs   
rU   rV   zInvalid message type: %s)%rÔ   rß   rY   r   r0  r6  r¯   rb   rM   ra   r1   r!   r   rZ   r[   r\   r]   r^   r_   rl   r`   Úget_visiblerS   rf   re   rg   rh   ri   rj   rk   rP   rø   rE   rT   rd   rn   ro   )r   r!   rè   Zspecial_labelsr7  r9  Zorig_bufferZorig_generatorrs   Z
vis_bufferZvis_generatorrT   Z
body_startZoriginal_posZ
first_passré   r   r   r   rì   b  sÀ    











zBabyl._install_message)NT)ru   rv   rw   Ú	frozensetr6  r   r"   r$   r(   r,   r3   r/   r0  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|  t |¡¡ t |tƒrÎ| | ¡ nšt |tƒrP|  t 	|¡¡ n~t |t
ƒrl|  t |¡¡ nbt |tjƒrŠ|  t |¡¡ nDt|dƒr¦|  t |¡¡ n(|d kr¾tjj | ¡ ntdt|ƒ ƒ‚d S )NrS   zInvalid message type: %s)rY   r1   r!   r   Ú_become_messageÚcopyZdeepcopyÚ_explain_torf   r2   re   Zmessage_from_stringrZ   ÚTextIOWrapperZmessage_from_filerE   Zmessage_from_binary_filer   rn   ro   )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   rA  ä  s    zMessage._become_messagec             C   s   t |tƒrd S tdƒ‚d S )Nz Cannot convert to specified type)rY   r   rn   )r   r!   r   r   r   rC  ë  s    
zMessage._explain_to)N)ru   rv   rw   r   rA  rC  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 ¡ | _t | |¡ d S )Nrz   r…   )rH  rI  r¾   rJ  r   r   )r   r!   r   r   r   r   ø  s    
zMaildirMessage.__init__c             C   s   | j S )N)rH  )r   r   r   r   rŠ   ÿ  s    zMaildirMessage.get_subdirc             C   s(   |dks|dkr|| _ ntd| ƒ‚d S )Nrz   r{   z!subdir must be 'new' or 'cur': %s)rH  rO   )r   r˜   r   r   r   r¢     s    zMaildirMessage.set_subdirc             C   s"   | j  d¡r| j dd … S dS d S )Nz2,rÊ   r…   )rI  rm   )r   r   r   r   Ú	get_flags
  s    zMaildirMessage.get_flagsc             C   s   dd  t|ƒ¡ | _d S )Nz2,r…   )r|   râ   rI  )r   Úflagsr   r   r   Ú	set_flags  s    zMaildirMessage.set_flagsc             C   s$   |   d t|  ¡ ƒt|ƒB ¡¡ d S )Nr…   )rM  r|   r  rK  )r   Úflagr   r   r   Úadd_flag  s    zMaildirMessage.add_flagc             C   s,   |   ¡ r(|  d t|   ¡ ƒt|ƒ ¡¡ d S )Nr…   )rK  rM  r|   r  )r   rN  r   r   r   Úremove_flag  s    zMaildirMessage.remove_flagc             C   s   | j S )N)rJ  )r   r   r   r   r‘     s    zMaildirMessage.get_datec             C   s6   yt |ƒ| _W n" tk
r0   td| ƒd ‚Y nX d S )Nzcan't convert to float: %s)ÚfloatrJ  rO   rn   )r   Zdater   r   r   r¤   "  s    zMaildirMessage.set_datec             C   s   | j S )N)rI  )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)rY   re   rI  rn   ro   )r   Úinfor   r   r   r£   -  s    
zMaildirMessage.set_infoc             C   s¤  t |tƒr8| |  ¡ ¡ | |  ¡ ¡ | |  ¡ ¡ nht |tƒrÄt	|  ¡ ƒ}d|kr`| 
d¡ |  ¡ dkrv| 
d¡ d|krˆ| 
d¡ d|krš| 
d¡ d|kr¬| 
d¡ | d	t |  ¡ ¡¡ nÜt |tƒrt	|  ¡ ƒ}d|krî| d
¡ d|kr| d¡ d|kr | d¡ nˆt |tƒr‚t	|  ¡ ƒ}d|krD| d
¡ d|krX| d¡ d|krl| d¡ d|kr | d¡ nt |tƒrn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)rY   r	   rM  rK  r¢   rŠ   r¤   r‘   rù   r  rO  rñ   r¾   rý   r   r  r   Ú	add_labelr   rn   ro   )r   r!   rL  r   r   r   rC  4  sN    

















zMaildirMessage._explain_to)N)ru   rv   rw   rE  r   rŠ   r¢   rK  rM  rO  rP  r‘   r¤   rŒ   r£   rC  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   |   dd¡ t|tjjƒrF| ¡ }|d k	rF| d¡rF|   |dd … ¡ t | |¡ d S )NzMAILER-DAEMONTzFrom rX   )rñ   rY   r1   r!   r   rû   rm   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  ¡ }|dt  |¡ 7 }|| _d S )NTú )r¾   rý   rü   r^  )r   rö   Ztime_r   r   r   rñ   r  s
    z_mboxMMDFMessage.set_fromc             C   s   |   dd¡|   dd¡ S )NÚStatusr…   zX-Status)r+   )r   r   r   r   rK  z  s    z_mboxMMDFMessage.get_flagsc             C   sÚ   t |ƒ}d\}}x&dD ]}||kr||7 }| |¡ qW x&dD ]}||kr>||7 }| |¡ q>W |d t|ƒ¡7 }y|  d|¡ W n  tk
r¢   |  d|¡ Y nX y|  d|¡ W n  tk
rÔ   |  d|¡ Y nX d S )N)r…   r…   )rT  rU  )rW  rX  rY  r…   r`  zX-Status)r  r$   r|   râ   Úreplace_headerr&   Z
add_header)r   rL  Zstatus_flagsZxstatus_flagsrN  r   r   r   rM  ~  s&    

z_mboxMMDFMessage.set_flagsc             C   s$   |   d t|  ¡ ƒt|ƒB ¡¡ d S )Nr…   )rM  r|   r  rK  )r   rN  r   r   r   rO  ”  s    z_mboxMMDFMessage.add_flagc             C   s4   d| ksd| kr0|   d t|  ¡ ƒt|ƒ ¡¡ d S )Nr`  zX-Statusr…   )rM  r|   r  rK  )r   rN  r   r   r   rP  ˜  s    z_mboxMMDFMessage.remove_flagc          	   C   sÞ  t |tƒrÐt|  ¡ ƒ}d|kr(| d¡ d|kr:| d¡ d|krL| d¡ d|kr^| d¡ d|krp| d¡ |d	= |d
= d |  ¡  ¡ dd … ¡}y| 	t
 t |d¡¡¡ W n ttfk
rÊ   Y nX n
t |tƒrø| |  ¡ ¡ | |  ¡ ¡ nât |tƒrZt|  ¡ ƒ}d|kr$| d¡ d|kr8| d¡ d|krL| d¡ |d	= |d
= n€t |tƒr¼t|  ¡ ƒ}d|kr†| d¡ d|krš| d¡ d|kr®| d¡ |d	= |d
= nt |tƒrÊntdt|ƒ ƒ‚d S )NrU  r{   rX  rY  rT  rS  rW  rV  Ústatuszx-statusr_  éûÿÿÿz%a %b %d %H:%M:%S %Yr*  rZ  r[  r+  r,  z$Cannot convert to specified type: %s)rY   r	   r  rK  r¢   rO  r|   rú   rŽ   r¤   ÚcalendarZtimegmr¾   ZstrptimerO   ÚOverflowErrorrù   rM  rñ   r   r  r   r]  r   rn   ro   )r   r!   rL  Z
maybe_dater   r   r   rC    s^    



















z_mboxMMDFMessage._explain_to)N)N)ru   rv   rw   rE  r   rú   rñ   rK  rM  rO  rP  rC  r   r   r   r   rù   `  s   
	
rù   c               @   s   e Zd ZdS )r
   N)ru   rv   rw   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 | |¡ d S )N)rf  r   r   )r   r!   r   r   r   r   Ú  s    zMHMessage.__init__c             C   s   | j d d … S )N)rf  )r   r   r   r   r  ß  s    zMHMessage.get_sequencesc             C   s   t |ƒ| _d S )N)r7   rf  )r   r"  r   r   r   r$  ã  s    zMHMessage.set_sequencesc             C   s6   t |tƒr"|| jkr2| j |¡ ntdt|ƒ ƒ‚d S )Nzsequence type must be str: %s)rY   re   rf  r¯   rn   ro   )r   r)  r   r   r   r  ç  s    

zMHMessage.add_sequencec             C   s*   y| j  |¡ W n tk
r$   Y nX d S )N)rf  r$   rO   )r   r)  r   r   r   Úremove_sequenceï  s    zMHMessage.remove_sequencec             C   sJ  t |tƒrdt|  ¡ ƒ}d|kr*| d¡ n| d¡ | d¡ d|krP| d¡ d|krb| d¡ nât |tƒr¾t|  ¡ ƒ}d|krŽ| d¡ n
| d	¡ d|krª| d¡ d|kr¼| d
¡ nˆt |tƒræx||  ¡ D ]}| |¡ qÒW n`t |t	ƒr(t|  ¡ ƒ}d|kr| 
d¡ d|krF| 
d¡ nt |tƒr6ntdt|ƒ ƒ‚d S )Nr*  r{   rS  r[  rX  rZ  rT  ÚROrU  rY  r,  z$Cannot convert to specified type: %s)rY   r	   r  r  r¢   rO  rù   r   r  r   r]  r   rn   ro   )r   r!   r"  r)  r   r   r   rC  ö  s@    










zMHMessage._explain_to)N)
ru   rv   rw   rE  r   r  r$  r  rg  rC  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 | |¡ d S )N)r/  r   ri  r   )r   r!   r   r   r   r   "  s    zBabylMessage.__init__c             C   s   | j d d … S )N)r/  )r   r   r   r   r0  (  s    zBabylMessage.get_labelsc             C   s   t |ƒ| _d S )N)r7   r/  )r   r7  r   r   r   r2  ,  s    zBabylMessage.set_labelsc             C   s6   t |tƒr"|| jkr2| j |¡ ntdt|ƒ ƒ‚d S )Nzlabel must be a string: %s)rY   re   r/  r¯   rn   ro   )r   r9  r   r   r   r]  0  s    

zBabylMessage.add_labelc             C   s*   y| j  |¡ W n tk
r$   Y nX d S )N)r/  r$   rO   )r   r9  r   r   r   Úremove_label8  s    zBabylMessage.remove_labelc             C   s
   t | jƒS )N)r   ri  )r   r   r   r   r?  ?  s    zBabylMessage.get_visiblec             C   s   t |ƒ| _d S )N)r   ri  )r   Zvisibler   r   r   r1  C  s    zBabylMessage.set_visiblec             C   sj   x6| j  ¡ D ](}|| kr,| j  || | ¡ q| j |= qW x,dD ]$}|| kr>|| j kr>| | | j |< q>W d S )N)ZDateZFromzReply-ToZToZCCZSubject)ri  r8   ra  )r   Úheaderr   r   r   Úupdate_visibleG  s    
zBabylMessage.update_visiblec             C   sv  t |tƒr~t|  ¡ ƒ}d|kr*| d¡ n| d¡ | d¡ d|ksNd|krX| d¡ d|krj| d¡ d	|kr|| d
¡ nôt |tƒrØt|  ¡ ƒ}d|kr¨| d¡ n
| d¡ d	|krÄ| d¡ d|krÖ| d¡ nšt |tƒrt|  ¡ ƒ}d|kr| d¡ d|krr| d¡ nXt |t	ƒrT| 
|  ¡ ¡ x<|  ¡ D ]}| |¡ q>W nt |tƒrbntdt|ƒ ƒ‚d S )Nr*  r{   rS  r-  r.  r\  r,  rT  r+  rV  rh  rU  rW  rY  rZ  z$Cannot convert to specified type: %s)rY   r	   r  r0  r¢   rO  rù   r   r  r   r1  r?  r]  r   rn   ro   )r   r!   r7  r9  r   r   r   rC  R  sF    










zBabylMessage._explain_to)N)ru   rv   rw   rE  r   r0  r2  r]  rj  r?  r1  rl  rC  r   r   r   r   r     s   
c               @   s   e Zd ZdS )r   N)ru   rv   rw   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| ¡ | _n|| _d S )N)rÔ   rß   Ú_pos)r   r¦   Úposr   r   r   r   ƒ  s    z_ProxyFile.__init__c             C   s   |   || jj¡S )N)Ú_readrÔ   rS   )r   Úsizer   r   r   rS   ‹  s    z_ProxyFile.readc             C   s   |   || jj¡S )N)ro  rÔ   Úread1)r   rp  r   r   r   rq    s    z_ProxyFile.read1c             C   s   |   || jj¡S )N)ro  rÔ   rl   )r   rp  r   r   r   rl   “  s    z_ProxyFile.readlinec             C   s>   g }x4| D ],}|  |¡ |d k	r
|t|ƒ8 }|dkr
P q
W |S )Nr   )r¯   rª   )r   ÚsizehintrB   rs   r   r   r   Ú	readlines—  s    

z_ProxyFile.readlinesc             c   s    x|   ¡ }|sd S |V  qW d S )N)rl   )r   rs   r   r   r   r;   ¢  s
    z_ProxyFile.__iter__c             C   s   | j S )N)rm  )r   r   r   r   rß   ª  s    z_ProxyFile.tellr   c             C   s4   |dkr| j  | j¡ | j  ||¡ | j  ¡ | _d S )Nr«   )rÔ   r_   rm  rß   )r   ÚoffsetÚwhencer   r   r   r_   ®  s    z_ProxyFile.seekc             C   s0   t | dƒr,zt | jdƒr"| 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  ¡ | _|S )NrW   )rÔ   r_   rm  rß   )r   rp  Úread_methodrB   r   r   r   ro  ¾  s    z_ProxyFile._readc             C   s   | S )Nr   )r   r   r   r   Ú	__enter__Ç  s    z_ProxyFile.__enter__c             G   s   |   ¡  d S )N)rL   )r   Úexcr   r   r   Ú__exit__Ë  s    z_ProxyFile.__exit__c             C   s
   | j  ¡ S )N)rÔ   Úreadable)r   r   r   r   rz  Î  s    z_ProxyFile.readablec             C   s
   | j  ¡ S )N)rÔ   Úwritable)r   r   r   r   r{  Ñ  s    z_ProxyFile.writablec             C   s
   | j  ¡ S )N)rÔ   Úseekable)r   r   r   r   r|  Ô  s    z_ProxyFile.seekablec             C   s
   | 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   )ru   rv   rw   r   rS   rq  rl   rs  r;   rß   r_   rL   ro  rw  ry  rz  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  | ||¡ || _|| _d S )N)r¨   r   Ú_startÚ_stop)r   r¦   rè   ré   r   r   r   r   æ  s    z_PartialFile.__init__c             C   s   t  | ¡| 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 | ||¡ d S )Nr   r«   rÊ   )r~  rm  r  r¨   r_   )r   rt  ru  r   r   r   r_   ð  s    z_PartialFile.seekc             C   sB   | j | j }|dkrdS |d ks0|dk s0||kr4|}t | ||¡S )Nr   rï   )r  rm  r¨   ro  )r   rp  rv  Z	remainingr   r   r   ro  ú  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   )ru   rv   rw   r   rß   r_   ro  rL   r   r   r   r   r÷   ã  s
   


	r÷   Tc          
   C   sž  d}yZt rpyt  | 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 d d }~X Y nX |r^yt| j
d ƒ}| ¡  W n: tk
rÊ } z|jtjtjfkr¸d S ‚ W d d }~X Y nX y`yt |j
| j
d ¡ d}W n2 ttfk
r   t |j
| j
d ¡ d}Y nX t |j
¡ W n0 tk
r\   t |j
¡ t	d| j
 ƒ‚Y nX W n8   t r|t  | t j¡ |r’t | 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  | t j¡ tj | jd ¡r4t | 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  | t jt jB t jB d¡}z
t| dƒS t  |¡ 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 ¡ ƒt ¡ t ¡ 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$   |   ¡  ttdƒr t |  ¡ ¡ d S )NÚfsync)rI   rE   r   r…  Úfileno)r¦   r   r   r   rÞ   I  s    
rÞ   c             C   s   t | ƒ |  ¡  d S )N)rÞ   rL   )r¦   r   r   r   r‰   O  s    r‰   c               @   s   e Zd ZdS )r   N)ru   rv   rw   r   r   r   r   r   U  s   c               @   s   e Zd ZdS )r   N)ru   rv   rw   r   r   r   r   r   X  s   c               @   s   e Zd ZdS )r   N)ru   rv   rw   r   r   r   r   r   [  s   c               @   s   e Zd ZdS )r   N)ru   rv   rw   r   r   r   r   r   ^  s   c               @   s   e Zd ZdS )r   N)ru   rv   rw   r   r   r   r   r   a  s   )T)/r   r¾   rd  rÂ   r—   rB  rh   r1   Zemail.messageZemail.generatorrZ   r-   r€  ÚImportErrorÚ__all__ra   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'
*