
    Rh?4                       d 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ddlZddlmZ 	 ddlZg dZej$                  j'                  d      Z G d d      Z G d d	e      Z G d
 de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d dej8                  j:                        Z G d de      Z G d de      Z G d de      Z  G d de      Z! G d  d!e      Z" G d" d#e      Z# G d$ d%      Z$ G d& d'e$      Z%d8d(Z&d) Z'd* Z(d+ Z)d, Z*d- Z+ G d. d/e,      Z- G d0 d1e-      Z. G d2 d3e-      Z/ G d4 d5e-      Z0 G d6 d7e-      Z1y# e$ r dZY Aw xY w)9zDRead/write support for Maildir, mbox, MH, Babyl, and MMDF mailboxes.    N)GenericAlias)MailboxMaildirmboxMHBabylMMDFMessageMaildirMessagemboxMessage	MHMessageBabylMessageMMDFMessageErrorNoSuchMailboxErrorNotEmptyErrorExternalClashErrorFormatErrorasciic                       e Zd ZdZd#dZd Zd Zd Zd Zd Z	d$d	Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd$dZd Zd$dZd Zd Zd Zd Z d  Z!d!Z"d%d"Z# e$e%      Z&y)&r   z*A group of messages in a particular place.Nc                     t         j                  j                  t         j                  j                  |            | _        || _        y)zInitialize a Mailbox instance.N)ospathabspath
expanduser_path_factoryselfr   factorycreates       /usr/lib/python3.12/mailbox.py__init__zMailbox.__init__%   s,    WW__RWW%7%7%=>
    c                     t        d      )$Add message and return assigned key.&Method must be implemented by subclassNotImplementedErrorr   messages     r"   addzMailbox.add*       !"JKKr$   c                     t        d      )=Remove the keyed message; raise KeyError if it doesn't exist.r'   r(   r   keys     r"   removezMailbox.remove.   r-   r$   c                 &    | j                  |       y N)r2   r0   s     r"   __delitem__zMailbox.__delitem__2   s    Cr$   c                 F    	 | j                  |       y# t        $ r Y yw xY wz'If the keyed message exists, remove it.N)r2   KeyErrorr0   s     r"   discardzMailbox.discard5   s%    	KK 		s    	  c                     t        d      )>Replace the keyed message; raise KeyError if it doesn't exist.r'   r(   r   r1   r+   s      r"   __setitem__zMailbox.__setitem__<   r-   r$   c                 H    	 | j                  |      S # t        $ r |cY S w xY w)z9Return the keyed message, or default if it doesn't exist.)__getitem__r8   )r   r1   defaults      r"   getzMailbox.get@   s,    	##C(( 	N	s    !!c                     | j                   s| j                  |      S t        j                  | j	                  |            5 }| j                  |      cddd       S # 1 sw Y   yxY w)z=Return the keyed message; raise KeyError if it doesn't exist.N)r   get_message
contextlibclosingget_file)r   r1   files      r"   r?   zMailbox.__getitem__G   sT    }}##C((##DMM#$67 +4}}T*+ + +s   AA&c                     t        d      )4Return a Message representation or raise a KeyError.r'   r(   r0   s     r"   rC   zMailbox.get_messageO   r-   r$   c                 f    t        j                  | j                  |            j                         S )zReturn a string representation or raise a KeyError.

        Uses email.message.Message to create a 7bit clean string
        representation of the message.emailmessage_from_bytes	get_bytes	as_stringr0   s     r"   
get_stringzMailbox.get_stringS   s'    
 ''s(;<FFHHr$   c                     t        d      )z8Return a byte string representation or raise a KeyError.r'   r(   r0   s     r"   rN   zMailbox.get_bytesZ   r-   r$   c                     t        d      )6Return a file-like representation or raise a KeyError.r'   r(   r0   s     r"   rF   zMailbox.get_file^   r-   r$   c                     t        d      )Return an iterator over keys.r'   r(   r   s    r"   iterkeyszMailbox.iterkeysb   r-   r$   c                 4    t        | j                               S )zReturn a list of keys.)listrW   rV   s    r"   keyszMailbox.keysf   s    DMMO$$r$   c              #   h   K   | j                         D ]  }	 | |   }|  y# t        $ r Y w xY ww)z%Return an iterator over all messages.NrW   r8   r   r1   values      r"   
itervalueszMailbox.itervaluesj   sC     ==? 	CS	 K	  s   2#2	/2/2c                 "    | j                         S r4   )r_   rV   s    r"   __iter__zMailbox.__iter__s   s      r$   c                 4    t        | j                               S )z,Return a list of messages. Memory intensive.)rY   r_   rV   s    r"   valueszMailbox.valuesv   s    DOO%&&r$   c              #   l   K   | j                         D ]  }	 | |   }||f  y# t        $ r Y w xY ww)z.Return an iterator over (key, message) tuples.Nr\   r]   s      r"   	iteritemszMailbox.iteritemsz   sH     ==? 	CS	 ,	  s   4%	4	1414c                 4    t        | j                               S )z9Return a list of (key, message) tuples. Memory intensive.)rY   re   rV   s    r"   itemszMailbox.items   s    DNN$%%r$   c                     t        d      )9Return True if the keyed message exists, False otherwise.r'   r(   r0   s     r"   __contains__zMailbox.__contains__   r-   r$   c                     t        d      )*Return a count of messages in the mailbox.r'   r(   rV   s    r"   __len__zMailbox.__len__   r-   r$   c                 P    | j                         D ]  }| j                  |        y)zDelete all messages.N)rZ   r9   r0   s     r"   clearzMailbox.clear   s#    99; 	CLL	r$   c                 V    	 | |   }| j                  |       |S # t         $ r |cY S w xY w)z3Delete the keyed message and return it, or default.)r8   r9   )r   r1   r@   results       r"   popzMailbox.pop   s9    	#YF 	S  	N	s    ((c                 j    | j                         D ]  }|| j                  |      fc S  t        d      )z6Delete an arbitrary (key, message) pair and return it.zNo messages in mailbox)rW   rr   r8   r0   s     r"   popitemzMailbox.popitem   s8    ==? 	5C#''	5 344r$   c                     t        |d      r|j                         }nt        |d      r|j                         }n|}d}|D ]  \  }}	 || |<    |rt        d      y# t        $ r d}Y )w xY w)z4Change the messages that correspond to certain keys.re   rg   FTzNo message with key(s)N)hasattrre   rg   r8   )r   argsourcebad_keyr1   r+   s         r"   updatezMailbox.update   s    3$]]_FS'"YY[FF" 	LC#S		
 344   s   AA+*A+c                     t        d      )&Write any pending changes to the disk.r'   r(   rV   s    r"   flushzMailbox.flush   r-   r$   c                     t        d      )Lock the mailbox.r'   r(   rV   s    r"   lockzMailbox.lock   r-   r$   c                     t        d      )#Unlock the mailbox if it is locked.r'   r(   rV   s    r"   unlockzMailbox.unlock   r-   r$   c                     t        d      )Flush and close the mailbox.r'   r(   rV   s    r"   closezMailbox.close   r-   r$   c                 V    	 |j                  d      S # t        $ r t        d      w xY w)Nr   z?String input must be ASCII-only; use bytes or a Message instead)encodeUnicodeError
ValueErrorr*   s     r"   _string_to_byteszMailbox._string_to_bytes   s7    	2>>'** 	2 1 2 2	2s    (Fc                    t        |t        j                  j                        rt	        j
                         }t        j                  j                  ||d      }|j                  |       |j                  d       |j                         }|j                  dt              }|j                  |       | j                  r,|j                  t              s|j                  t               y
y
y
t        |t         t"        t        j$                  f      rt        |t        j$                        r+t'        j(                  dt*        d       |j-                         }t        |t               r| j/                  |      }|r|j                  dd      }|j                  dt              }|j                  |       | j                  r,|j                  t              s|j                  t               y
y
y
t1        |d      rt1        |d      r't'        j(                  d	t*        d       |j2                  }d
}	 |j5                         }|j                  d      r	|d
d dz   }n|j                  d      r|d
d dz   }|snE|r|j7                  d      rd|dd
 z   }|j                  dt              }|j                  |       |}| j                  r/|r,|j                  t              s|j                  t               y
y
y
y
t9        dt;        |      z        )z%Dump message contents to target file.r      
8Use of StringIO input is deprecated, use BytesIO instead   s   
From s   
>From readbufferDUse of text mode files is deprecated, use a binary mode file insteadN   
      From s   >From    Invalid message type: %s)
isinstancerL   r+   r
   ioBytesIO	generatorBytesGeneratorflattenseekr   replacelinesepwrite_append_newlineendswithstrbytesStringIOwarningswarnDeprecationWarninggetvaluer   rv   r   readline
startswith	TypeErrortype)	r   r+   targetmangle_from_r   gendatalastlinelines	            r"   _dump_messagezMailbox._dump_message   sv    gu}}445ZZ\F//00qICKK KKN;;=D<<w/DLL##DMM',BW% -C# #ubkk!:;'2;;/ *+=qB!**,'3'//8!//*kBooeW5GLL!##G,<,<W,EW% -F# Wf%w) 56H!M!..H'')==)9u,D]]5)9u,DDOOH$=$tABx/D||E73T"  ##9J9J79SW% :T# 6gFGGr$   NTr4   F)'__name__
__module____qualname____doc__r#   r,   r2   r5   r9   r=   rA   r?   rC   rP   rN   rF   rW   rZ   r_   ra   rc   re   rg   rj   rm   ro   rr   rt   rz   r}   r   r   r   r   r   r   classmethodr   __class_getitem__ r$   r"   r   r   "   s    4 
LLL+LILLL%!'&LL
55"LLLL2 O4Hl $L1r$   r   c                       e Zd ZdZdZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdZd Zd Zd Zd Zy)r   zA qmail-style Maildir mailbox.:Nc                    t         j                  | |||       t        j                  j	                  | j
                  d      t        j                  j	                  | j
                  d      t        j                  j	                  | j
                  d      d| _        t        j                  j                  | j
                        sm|rVt        j                  | j
                  d       | j                  j                         D ]  }t        j                  |d        nt        | j
                        i | _        ddd| _        d| _        d| _        y	)
zInitialize a Maildir instance.tmpnewcur)r   r   r     r   )r   r   g?N)r   r#   r   r   joinr   _pathsexistsmkdirrc   r   _toc_toc_mtimes
_last_read_skewfactor)r   dirnamer    r!   r   s        r"   r#   zMaildir.__init__  s    w877<<

E277<<

E277<<

E2
 ww~~djj)U+ KK..0 *DHHT5)* )44	#$Q/r$   c                    | j                         }	 | j                  ||       t        |       t        |t              r?|j                         }| j                  |j                         z   }|| j                  k(  rd}nd}d}t        j                  j                  |j                        j                  | j                        d   }t        j                  j!                  | j"                  |||z         }t        |t              rWt	        j$                  |j                  t        j                  j'                  |j                        |j)                         f       	 	 t	        j*                  |j                  |       t	        j
                  |j                         |S # t        $ r1 |j                          t	        j
                  |j                          w xY w# t,        t.        f$ r$ t	        j0                  |j                  |       Y |S w xY w# t2        $ rP}t	        j
                  |j                         |j4                  t4        j6                  k(  rt9        d|z         d}~ww xY w)r&    r   r   z$Name clash with existing message: %sN)_create_tmpr   BaseExceptionr   r   r2   name_sync_closer   r   
get_subdircolonget_infor   basenamesplitr   r   utimegetatimeget_datelinkAttributeErrorPermissionErrorrenameOSErrorerrnoEEXISTr   )r   r+   tmp_filesubdirsuffixuniqdestes           r"   r,   zMaildir.add$  s   ##%	w1
 	Hg~.'')FZZ'"2"2"44F#FFww.44TZZ@Cww||DJJv>g~.HHX]]gg&&x}}5w7G7G7IJL
	)t, 		(--( G  	NNIIhmm$	0 #O4 /		(--. /  	IIhmm$ww%,,&()O+/*0 1 1 	sB   F  G >H :G/HH HH 	I+AI&&I+c                     t        j                  t         j                  j                  | j                  | j                  |                   yr/   N)r   r2   r   r   r   _lookupr0   s     r"   r2   zMaildir.removeN  s*    
		"'',,tzz4<<+<=>r$   c                 R    	 | j                  |       y# t        t        f$ r Y yw xY wr7   )r2   r8   FileNotFoundErrorr0   s     r"   r9   zMaildir.discardR  s+    	KK+, 		s    &&c                    | j                  |      }| j                  |      }| j                  |      }t        |t              r|}n|}t        j
                  j                  |      }| j                  |v r,| j                  |j                  | j                        d   z   }nd}| j                  |       t        j
                  j                  | j                  |      }	t        j
                  j                  | j                  |||z         }
t        |t              rCt	        j                  |	t        j
                  j                  |	      |j                         f       t	        j                  |	|
       y)r;   r   r   N)r   r,   r   r   r   r   r   r   r   r9   r   r   r   r   r   r   )r   r1   r+   old_subpathtemp_keytemp_subpathdominant_subpathr   r   tmp_pathnew_paths              r"   r=   zMaildir.__setitem__Z  s   ll3'88G$||H-g~.+  +!12::))ZZ"2"8"8"DR"HHFFS77<<

L977<<

FC&LAg~.HHXgg&&x0'2B2B2DEG
 			(H%r$   c                    | j                  |      }t        t        j                  j	                  | j
                  |      d      5 }| j                  r| j                  |      }nt        |      }ddd       t        j                  j                  |      \  }}j                  |       | j                  |v r-|j                  |j                  | j                        d          |j                  t        j                  j                  t        j                  j	                  | j
                  |                   |S # 1 sw Y   xY w)rI   rbNr   )r   openr   r   r   r   r   r   r   
set_subdirr   set_infoset_dategetmtime)r   r1   subpathfmsgr   r   s          r"   rC   zMaildir.get_messageu  s    ,,s#"'',,tzz73T: 	(a}}mmA&$Q'		(
 ww}}W-v::LLDJJ/34RWW%%bggll4::w&GHI
	( 	(s   *D>>Ec                     t        t        j                  j                  | j                  | j                  |            d      5 }|j                         j                  t        d      cddd       S # 1 sw Y   yxY w)2Return a bytes representation or raise a KeyError.r   r   N)	r   r   r   r   r   r   r   r   r   r   r1   r   s      r"   rN   zMaildir.get_bytes  sU    "'',,tzz4<<+<=tD 	4668##GU3	4 	4 	4s   $A22A;c                     t        t        j                  j                  | j                  | j                  |            d      }t        |      S )rS   r   )r   r   r   r   r   r   
_ProxyFiler  s      r"   rF   zMaildir.get_file  s4    djj$,,s*;<dC!}r$   c              #      K   | j                          | j                  D ]  }	 | j                  |       |  y# t        $ r Y 'w xY wwrU   N)_refreshr   r   r8   r0   s     r"   rW   zMaildir.iterkeys  sM     99 	CS! I	  s%    A
;A
	AA
AA
c                 >    | j                          || j                  v S ri   )r	  r   r0   s     r"   rj   zMaildir.__contains__  s    diir$   c                 L    | j                          t        | j                        S rl   )r	  lenr   rV   s    r"   rm   zMaildir.__len__  s    499~r$   c                      y)"Write any pending changes to disk.Nr   rV   s    r"   r}   zMaildir.flush  s     	r$   c                      y)r   Nr   rV   s    r"   r   zMaildir.lock      r$   c                      y)r   Nr   rV   s    r"   r   zMaildir.unlock  r  r$   c                      yr   Nr   rV   s    r"   r   zMaildir.close  r  r$   c                 :   g }t        j                  | j                        D ]v  }t        |      dkD  s|d   dk(  st         j                  j                  t         j                  j                  | j                  |            sc|j                  |dd        x |S )Return a list of folder names.   r   .N)r   listdirr   r  r   isdirr   appendr   rq   entrys      r"   list_folderszMaildir.list_folders  st    ZZ

+ 	)E5zA~%(c/ww}}RWW\\$**e<=eABi(	) r$   c                     t        t        j                  j                  | j                  d|z         | j
                  d      S )z/Return a Maildir instance for the named folder.r  Fr    r!   )r   r   r   r   r   r   r   folders     r"   
get_folderzMaildir.get_folder  s2    rww||DJJf=#}}#% 	%r$   c                    t         j                  j                  | j                  d|z         }t	        || j
                        }t         j                  j                  |d      }t         j                  j                  |      sIt        j                  t        j                  |t         j                  t         j                  z  d             |S )z>Create a folder and return a Maildir instance representing it.r  r    maildirfolder  )r   r   r   r   r   r   r   r   r   O_CREATO_WRONLY)r   r#  r   rq   maildirfolder_paths        r"   
add_folderzMaildir.add_folder  s    ww||DJJf5t}}5WW\\$@ww~~01HHRWW/bkk1I r$   c                    t         j                  j                  | j                  d|z         }t        j                  t         j                  j                  |d            t        j                  t         j                  j                  |d            z   D ]&  }t        |      dk  s	|d   dk7  st        d|z         t        j                  |      D ]b  }|dk7  s	|dk7  s|dk7  st         j                  j                  t         j                  j                  ||            sSt        d|d	|       t        j                  |d
      D ]z  \  }}}|D ]5  }t        j                  t         j                  j                  ||             7 |D ]5  }t        j                  t         j                  j                  ||             7 | t        j                  |       y)-Delete the named folder, which must be empty.r  r   r   r  r   zFolder contains message(s): %sr   zFolder contains subdirectory 'z': F)topdownN)r   r   r   r   r  r  r   r  walkr2   rmdir)r   r#  r   r  rootdirsfiless          r"   remove_folderzMaildir.remove_folder  st   ww||DJJf5ZZT5 9:ZZT5 9:; 	OE5zA~qS#$Dv$MNN	O ZZ% 	5E~%5.Ue^ww}}RWW\\$67#%+U%4 5 5	5
 "$u!= 	4D$ 5		"'',,tU345 4dE234	4
 	r$   c                 |   t        j                          }t        j                  t        j                  j	                  | j
                  d            D ]h  }t        j                  j	                  | j
                  d|      }|t        j                  j                  |      z
  dkD  sTt        j                  |       j y)zDelete old files in "tmp".r   i@ N)timer   r  r   r   r   r   r2   )r   nowr  r   s       r"   cleanzMaildir.clean  sy    iikZZTZZ ?@ 	 E77<<

E59DRWW%%d++f4		$	 r$   r  c           	      b   t        j                          }t        j                         }d|v r|j                  dd      }d|v r|j                  dd      }t	        |      dt	        |dz  dz        dt        j                         d	t        j                  d
|	}t
        j                  j                  | j                  d|      }	 t        j                  |       t!        d|z        # t        $ r9 t        xj                  dz  c_        	 t        |      cY S # t        $ r Y nw xY wY Ow xY w)z=Create a file in the tmp subdirectory and open and return it./z\057r   z\072z.Mr  g    .APQr  r   z&Name clash prevented file creation: %s)r7  socketgethostnamer   intr   getpidr   _countr   r   r   statr   _create_carefullyFileExistsErrorr   )r   r8  hostnamer   r   s        r"   r   zMaildir._create_tmp  s   iik%%'(?''W5H(?''W5H$'Hc#'C-.@"))+$+NNH>ww||DJJt4	GGDM !!I!%"& ' 	' ! 	NNaN(.." 	s6   	C, ,"D.
DD.	D(%D.'D((D.-D.c                    t        j                          | j                  z
  d| j                  z   kD  red}| j                  D ]Q  }t        j
                  j                  | j                  |         }|| j                  |   kD  rd}|| j                  |<   S |syi | _        | j                  D ]  }| j                  |   }t	        j                  |      D ]  }t        j
                  j                  ||      }t        j
                  j                  |      rC|j                  | j                        d   }t        j
                  j                  ||      | j                  |<     t        j                          | _        y)z!Update table of contents mapping.   FTNr   )r7  r   r   r   r   r   r   r   r   r  r   r  r   r   )r   refreshr   mtimer   r  pr   s           r"   r	  zMaildir._refresh  s8    99;(1t/?/?+??G** 1((V)<=4++F33"G+0  (	1
 	&& 	>F;;v&DD) >GGLLu-77==#{{4::.q1"$'',,vu"=		$>	> ))+r$   c                 b   	 t         j                  j                  t         j                  j                  | j                  | j
                  |               r| j
                  |   S 	 | j                          	 | j
                  |   S # t        $ r Y +w xY w# t        $ r t        d|z        dw xY w)z=Use TOC to return subpath for given key, or raise a KeyError.No message with key: %sN)r   r   r   r   r   r   r8   r	  r0   s     r"   r   zMaildir._lookup&  s    	ww~~bggll4::tyy~FGyy~% H 		F99S>!	  		
  	F4s:;E	Fs   A"B 7B 	BBB.c                     t        | d      s| j                         | _        	 	 | t        | j                           S # t        $ r Y yt
        $ r Y /w xY w)z0Return the next message in a one-time iteration._onetime_keysN)rv   rW   rO  nextStopIterationr8   rV   s    r"   rP  zMaildir.next4  sU    t_-!%DD!3!3455   s   < 	AAAr   )r   r   r   r   r   r#   r,   r2   r9   r=   rC   rN   rF   rW   rj   rm   r}   r   r   r   r  r$  r,  r5  r9  rB  r   r	  r   rP  r   r$   r"   r   r     s    (E((T?&64

 

%&  F'0"&HF
r$   r   c                   t    e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd ZddZd Zy)_singlefileMailboxzA single-file mailbox.Nc                    t         j                  | |||       	 t        | j                  d      }|| _
        d| _        d| _        d| _        d| _        d| _        d| _        y# t        $ r}|j
                  t
        j                  k(  r.|rt        | j                  d      }nYt        | j                        |j
                  t
        j                  t
        j                  fv rt        | j                  d      }n Y d}~d}~ww xY w)z!Initialize a single-file mailbox.rb+zwb+r   Nr   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   s         r"   r#   z_singlefileMailbox.__init__D  s    tWf5	TZZ'A 
	" !  		ww%,,&TZZ/A,TZZ88U\\5;;77T*		s   A" "	D+BC??Dc                     | j                          | j                  |      | j                  | j                  <   | xj                  dz  c_        d| _        | j                  dz
  S )r&   r  T)r   _append_messager   rZ  r\  r*   s     r"   r,   z_singlefileMailbox.add[  sO    $($8$8$A		$..!! "~~!!r$   c                 N    | j                  |       | j                  |= d| _        y)r/   TN)r   r   r[  r0   s     r"   r2   z_singlefileMailbox.removee  s     SIIcNr$   c                 p    | j                  |       | j                  |      | j                  |<   d| _        y)r;   TN)r   r`  r   r[  r<   s      r"   r=   z_singlefileMailbox.__setitem__k  s-    S--g6		#r$   c              #   t   K   | j                          | j                  j                         E d{    y7 wr  )r   r   rZ   rV   s    r"   rW   z_singlefileMailbox.iterkeysq  s#     99>>###s   .868c                 >    | j                          || j                  v S r  )r   r   r0   s     r"   rj   z_singlefileMailbox.__contains__v  s    diir$   c                 L    | j                          t        | j                        S r  )r   r  r   rV   s    r"   rm   z_singlefileMailbox.__len__{  s    499~r$   c                 V    | j                   st        | j                         d| _         yy)r   TN)r]  
_lock_filerY  rV   s    r"   r   z_singlefileMailbox.lock  s!    ||tzz"DL r$   c                 V    | j                   rt        | j                         d| _         yyr   FN)r]  _unlock_filerY  rV   s    r"   r   z_singlefileMailbox.unlock  s!    <<$ DL r$   c           	      2   | j                   s)| j                  rt        | j                         d| _        y| j                  J | j                  j                  dd       | j                  j                         }|| j                  k7  rt        d| j                  |fz        t        | j                        }	 i }| j                  |       t        | j                  j                               D ]  }| j                  |   \  }}| j                  j                  |       | j                  |       |j                         }	 | j                  j                  t!        d|| j                  j                         z
              }|sn|j#                  |       U||j                         f||<   | j%                  |        |j                         | _        t/        |       | j                  j'                          t)        j0                  | j                        }	t)        j2                  |j,                  |	j4                         	 t)        j6                  |j,                  |	j8                  |	j:                         	 t)        j@                  |j,                  | j                         tE        | j                  d      | _        || _        d| _         d| _        | jF                  rtI        | j                  d       yy#  |j'                          t)        j*                  |j,                          xY w# t<        t>        f$ r Y w xY w# tB        $ rL t)        j*                  | j                         t)        j@                  |j,                  | j                         Y w xY w)	r  FNr   rH  z4Size of mailbox file changed (expected %i, found %i)   rU  )dotlock)%r[  r\  _sync_flushrY  r   r   tellr^  r   _create_temporaryr   _pre_mailbox_hooksortedrZ   _pre_message_hookr   minr   _post_message_hookr   r   r2   r   r   rC  chmodst_modechownst_uidst_gidr   r   r   rE  r   r]  rg  )
r   cur_lennew_filenew_tocr1   startstop	new_startr   infos
             r"   r}   z_singlefileMailbox.flush  s   }}!! DJJ'%*"
 yy$$$ 	

1**//#d'''$ &?&*&7&7%A&B C C %TZZ0	G""8,diinn./ 2"iint

&&&x0$MMO	!ZZ__S15

8I1I.K LF!NN6*  !*8==?;''12 !)D
 	H

wwtzz"
-	HHX]]DKK=	1IIhmmTZZ0 $**e,
	"<<tzz51 /	NNIIhmm$ ( 		  	1IIdjj!IIhmmTZZ0	1s2   9DK7 5L, 8*M 72L),L>=L>ANNc                      y),Called before writing the mailbox to file f.Nr   r   r   s     r"   rq  z$_singlefileMailbox._pre_mailbox_hook  r  r$   c                      y)-Called before writing each message to file f.Nr   r  s     r"   rs  z$_singlefileMailbox._pre_message_hook  r  r$   c                      y,Called after writing each message to file f.Nr   r  s     r"   ru  z%_singlefileMailbox._post_message_hook  r  r$   c                    	 | j                          	 | j                  r| j                          | j                  j	                          y# | j                  j	                          w xY w# 	 | j                  r| j                          | j                  j	                          w # | j                  j	                          w xY wxY wr  )r}   r]  r   rY  r   rV   s    r"   r   z_singlefileMailbox.close  s|    	#JJL#<<KKM

  "

  "	#<<KKM

  "

  "s.   A) A
 
A&)C+B"C"B>>Cc                     | j                   | j                          |	 | j                   |   S y# t        $ r t        d|z        dw xY w)z'Return (start, stop) or raise KeyError.NrM  )r   _generate_tocr8   r0   s     r"   r   z_singlefileMailbox._lookup  s\    99 ?Jyy~%   J83>?TIJs	   0 A	c                 D   | j                   j                  dd       | j                   j                         }t        | j                        dk(  r'| j
                  s| j                  | j                          	 | j                  | j                          | j                  |      }| j                  | j                          | j                   j                          | j                   j                         | _        |S # t        $ r | j                   j                  |        w xY w)z;Append message to mailbox and return (start, stop) offsets.r   rH  )rY  r   ro  r  r   r[  rq  rs  _install_messageru  r   truncater}   r^  )r   r+   beforeoffsetss       r"   r`  z"_singlefileMailbox._append_message  s    

1"tyy>Qt}}
 ""4::.	""4::.++G4G##DJJ/ 	

 JJOO-  	JJ'	s   7AC9 9&Dr   r4   )r   r   r   r   r#   r,   r2   r=   rW   rj   rm   r   r   r}   rq  rs  ru  r   r   r`  r   r$   r"   rS  rS  A  sX     !."$
 

 !B2H	#Jr$   rS  c                   8    e Zd ZdZdZd Zd	dZd	dZd	dZd Z	y)
	_mboxMMDFzAn mbox or MMDF mailbox.Tc                    | j                  |      \  }}| j                  j                  |       | j                  j                         j	                  t
        d      j                  d      }| j                  j                  || j                  j                         z
        }| j                  |j	                  t
        d            }|j                  |       |j                  |dd        |S )rI   r$   r   r   r   N)r   rY  r   r   r   r   decoder   ro  _message_factoryset_unixfromset_from)r   r1   r~  r  	from_linestringr  s          r"   rC   z_mboxMMDF.get_message  s    ll3't

JJ'')11'3?FFwO	

(9!9:##FNN7E$BC#Yqr]#
r$   c                 l    t        j                  | j                  ||            j                  |      S )3Return a string representation or raise a KeyError.)unixfromrK   )r   r1   from_s      r"   rP   z_mboxMMDF.get_string  s0    ''NN3&((1	5	(A	Br$   c                 0   | j                  |      \  }}| j                  j                  |       |s| j                  j                          | j                  j	                  || j                  j                         z
        }|j                  t        d      S )r  r   )r   rY  r   r   r   ro  r   r   )r   r1   r  r~  r  r  s         r"   rN   z_mboxMMDF.get_bytes  sj    ll3't

JJ!

(9!9:~~gu--r$   c                     | j                  |      \  }}| j                  j                  |       |s| j                  j                          t	        | j                  | j                  j                         |      S )rS   )r   rY  r   r   _PartialFilero  )r   r1   r  r~  r  s        r"   rF   z_mboxMMDF.get_file&  sU    ll3't

JJ!DJJ

(94@@r$   c                 J   d}t        |t              r| j                  |      }t        |t              r:|j	                  d      r)|j                  d      }|dk7  r|d| }||dz   d }n|}d}n|t        |t              r%|j                         j                  d      }d|z   }nGt        |t        j                  j                        r#|j                         }||j                  d      }|8dt        j                  t        j                               j                         z   }| j                   j#                         }| j                   j%                  |t&        z          | j)                  || j                   | j*                         | j                   j#                         }||fS )	z1Format a message and blindly write to self._file.Nr   r   r   r  r$   r   s   From MAILER-DAEMON )r   r   r   r   r   find_mboxMMDFMessageget_fromr   rL   r+   r
   get_unixfromr7  asctimegmtimerY  ro  r   r   r   _mangle_from_)r   r+   r  newlineauthorr~  r  s          r"   r  z_mboxMMDF._install_message.  s^   	gs#++G4Ggu%'*<*<X*Fll5)G"}#HW-	!'A+,/#	!12%%'..w7F 6)I!6!67,,.I$%,,W5	.dkkm1L1S1S1UUI

!

W,-7DJJ0B0BCzz t}r$   Nr   )
r   r   r   r   r  rC   rP   rN   rF   r  r   r$   r"   r  r    s%    "M	B
.Ar$   r  c                   ,    e Zd ZdZdZdZddZd Zd Zy)r   zA classic mbox mailbox.TNc                 J    t         | _        t        j                  | |||       y)zInitialize an mbox mailbox.N)r   r  r  r#   r   s       r"   r#   zmbox.__init__T       +4w7r$   c                 .    |j                  t               yr  r   r   r  s     r"   ru  zmbox._post_message_hookY  s    	r$   c                    g g }}d}| j                   j                  d       	 | j                   j                         }| j                   j                         }|j	                  d      r`t        |      t        |      k  r5|r"|j                  |t        t              z
         n|j                  |       |j                  |       d}nF|s6|r"|j                  |t        t              z
         n|j                  |       n|t        k(  rd}nd}t        t        t        ||                  | _        t        | j                        | _        | j                   j                         | _        y)0Generate key-to-(start, stop) table of contents.Fr   Tr   N)rY  r   ro  r   r   r  r  r   dict	enumeratezipr   rZ  r^  )r   startsstopslast_was_emptyline_posr   s         r"   r  zmbox._generate_toc]  s   B

zz(H::&&(Dx(u:F+%XG%<=
 X.h'!&!LLCL!89LL*!%!&/ 0 3vu#567	TYY JJOO-r$   r   )	r   r   r   r   r  r   r#   ru  r  r   r$   r"   r   r   K  s     !M O8
.r$   r   c                   *    e Zd ZdZddZd Zd Zd Zy)r	   zAn MMDF mailbox.Nc                 J    t         | _        t        j                  | |||       y)zInitialize an MMDF mailbox.N)r   r  r  r#   r   s       r"   r#   zMMDF.__init__  r  r$   c                 4    |j                  dt        z          y)r     Nr  r  s     r"   rs  zMMDF._pre_message_hook  s    	#g-.r$   c                 B    |j                  t        dz   t        z          y)r  r  Nr  r  s     r"   ru  zMMDF._post_message_hook  s    	--78r$   c                    g g }}| j                   j                  d       d}	 |}| j                   j                         }| j                   j                         }|j	                  dt
        z         r|j                  |       	 |}| j                   j                         }| j                   j                         }|dt
        z   k(  r"|j                  |t        t
              z
         n|s|j                  |       ny|snt        t        t        ||                  | _        t        | j                        | _        | j                   j                  dd       | j                   j                         | _        y)r  r   r  rH  N)rY  r   r   ro  r   r   r  r  r  r  r  r   rZ  r^  )r   r  r  next_posr  r   s         r"   r  zMMDF._generate_toc  s*   B

H::&&(Dzz(H2W<=h''H::..0D#zz0H2W<<XG%<=!X.  # $ 3vu#567	TYY

1 JJOO-r$   r   )r   r   r   r   r#   rs  ru  r  r   r$   r"   r	   r	     s    8
/9.r$   r	   c                       e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)r   zAn MH mailbox.Nc                    t         j                  | |||       t        j                  j	                  | j
                        s|rt        j                  | j
                  d       t        j                  t        j                  t        j                  j                  | j
                  d      t        j                  t        j                  z  t        j                  z  d             d| _        yt        | j
                        d| _        y)zInitialize an MH instance.r   .mh_sequencesi  FN)r   r#   r   r   r   r   r   r   r   r   r)  O_EXCLr*  r   r]  r   s       r"   r#   zMH.__init__  s    tWf5ww~~djj)U+djj/!J!#bii!7"++!EuN O  )44r$   c                    | j                         }t        |      dk(  rd}nt        |      dz   }t        j                  j                  | j                  t        |            }t        |      }d}	 | j                  rt        |       	 	 | j                  ||       t!        |t"              r| j%                  ||       | j                  rt        |       	 |st        |       |S # t        $ r; | j                  rt        |       t        |       d}t        j                  |        w xY w# | j                  rt        |       w w xY w# |st        |       w w xY w)r&   r   r  FT)rZ   r  maxr   r   r   r   r   rD  r]  rg  r   r   rj  r   r2   r   r   _dump_sequences)r   r+   rZ   new_keyr   r   closeds          r"   r,   zMH.add  s   yy{t9>G$i!mG77<<

CL9h'	||1$	&&w2 gy1((':<< OA! % ||$QN!FIIh' << O   A s7   1E	 
C% "D, >E	 %AD))D, ,EE	 	Ec                 H   t         j                  j                  | j                  t	        |            }	 t        |d      }|j                          t        j                  |       y# t        $ r1}|j                  t        j                  k(  rt        d|z         d}~ww xY w)r/   rU  rM  N)r   r   r   r   r   r   r   r2   r   r   rV  r8   )r   r1   r   r   r   s        r"   r2   z	MH.remove  s{    ww||DJJC1		T5!A GGIIIdO  	ww%,,&83>??		s   A' '	B!0,BB!c                    t         j                  j                  | j                  t	        |            }	 t        |d      }	 | j                  rt        |       	 t        j                  t        j
                  |t         j                  t         j                  z               | j                  ||       t!        |t"              r| j%                  ||       | j                  rt'        |       	 t)        |       y# t        $ r1}|j                  t        j                  k(  rt        d|z         d}~ww xY w# | j                  rt'        |       w w xY w# t)        |       w xY w)r;   rU  rM  N)r   r   r   r   r   r   r   r   rV  r8   r]  rg  r   r*  O_TRUNCr   r   r   r  rj  r   )r   r1   r+   r   r   r   s         r"   r=   zMH.__setitem__  s    ww||DJJC1	T5!A	||1$r{{RZZ'?@A""7A.gy1((#6<< ON#  	ww%,,&83>??		 << O   Ns<   C: E A<D7 E :	D4,D//D47EE E!c                    	 | j                   r>t        t        j                  j	                  | j
                  t        |            d      }n=t        t        j                  j	                  | j
                  t        |            d      }|5  | j                   rt        |       	 t        |      }| j                   rt        |       	 ddd       | j                         j                         D ]  \  }}||v sj!                  |        S # t        $ r1}|j                  t        j                  k(  rt        d|z         d}~ww xY w# | j                   rt        |       w w xY w# 1 sw Y   xY w)rI   rU  r   rM  N)r]  r   r   r   r   r   r   r   r   rV  r8   rg  r   rj  get_sequencesrg   add_sequence)r   r1   r   r   r  r   key_lists          r"   rC   zMH.get_message  s'   		||djj#c(;UCdjj#c(;TB  	$||1$l<< O	$ #00288: 	'ND(h  &	' 
!  	ww%,,&83>??		 << O  	$ 	$s<   BD E'$E
/E'	E,EE
E$$E''E0c                    	 | j                   r>t        t        j                  j	                  | j
                  t        |            d      }n=t        t        j                  j	                  | j
                  t        |            d      }|5  | j                   rt        |       	 |j                         j                  t        d      | j                   rt        |       cddd       S # t        $ r1}|j                  t        j                  k(  rt        d|z         d}~ww xY w# | j                   rt        |       w w xY w# 1 sw Y   yxY w)r  rU  r   rM  Nr   )r]  r   r   r   r   r   r   r   r   rV  r8   rg  r   r   r   rj  r   r1   r   r   s       r"   rN   zMH.get_bytes  s    		||djj#c(;UCdjj#c(;TB  	$||1$vvx''7<< O	$ 	$  	ww%,,&83>??		 << O  	$ 	$s<   BC( E$#D%E(	D"1,DD"%D??EEc                    	 t        t        j                  j                  | j                  t        |            d      }t        |      S # t        $ r1}|j                  t        j                  k(  rt        d|z         d}~ww xY w)rS   r   rM  N)r   r   r   r   r   r   r   r   rV  r8   r  r  s       r"   rF   zMH.get_file1  sl    	RWW\\$**c#h7>A !}  	ww%,,&83>??		s   =A
 
	B,A??Bc                 r    t        t        d t        j                  | j                        D                    S )rU   c              3   R   K   | ]  }|j                         rt        |       ! y wr4   )isdigitr@  ).0r  s     r"   	<genexpr>zMH.iterkeys.<locals>.<genexpr>>  s$      :%). u: :s   %')iterrr  r   r  r   rV   s    r"   rW   zMH.iterkeys<  s/    F :2::djj3I : : ; 	;r$   c                     t         j                  j                  t         j                  j                  | j                  t        |                  S r  )r   r   r   r   r   r   r0   s     r"   rj   zMH.__contains__A  s,    ww~~bggll4::s3x@AAr$   c                 F    t        t        | j                                     S r  )r  rY   rW   rV   s    r"   rm   z
MH.__len__E  s    4())r$   c                     | j                   sVt        t        j                  j	                  | j
                  d      d      | _        t        | j                         d| _         yy)r   r  rU  TN)r]  r   r   r   r   r   rY  rg  rV   s    r"   r   zMH.lockI  sB    ||bggll4::GODJtzz"DL r$   c                     | j                   r4t        | j                         t        | j                         | `d| _         yyri  )r]  rj  rY  r   rV   s    r"   r   z	MH.unlockP  s2    <<$

#
 DL	 r$   c                      y)r|   Nr   rV   s    r"   r}   zMH.flushX  r  r$   c                 >    | j                   r| j                          yyr  )r]  r   rV   s    r"   r   zMH.close\  s    <<KKM r$   c                    g }t        j                  | j                        D ][  }t         j                  j	                  t         j                  j                  | j                  |            sK|j                  |       ] |S )r  )r   r  r   r   r  r   r  r  s      r"   r  zMH.list_foldersa  sY    ZZ

+ 	%Eww}}RWW\\$**e<=e$	% r$   c                     t        t        j                  j                  | j                  |      | j
                  d      S )z+Return an MH instance for the named folder.Fr!  r   r   r   r   r   r   r"  s     r"   r$  zMH.get_folderi  s-    "'',,tzz62--7 	7r$   c                     t        t        j                  j                  | j                  |      | j
                        S )z:Create a folder and return an MH instance representing it.r&  r  r"  s     r"   r,  zMH.add_foldern  s+    "'',,tzz62--) 	)r$   c                 \   t         j                  j                  | j                  |      }t        j                  |      }|dgk(  r4t        j
                  t         j                  j                  |d             n|g k(  rnt        d| j                  z        t        j                  |       y)r.  r  zFolder not empty: %sN)r   r   r   r   r  r2   r   r1  )r   r#  r   entriess       r"   r5  zMH.remove_folders  sx    ww||DJJ/**T"''IIbggll49:] 6 CDD
r$   c           
         i }t        t        j                  j                  | j                  d      dd      5 }t        | j                               }|D ]  }	 |j                  d      \  }}t               }|j                         D ]f  }|j                         r|j                  t        |             .d |j                  d      D        \  }	}
|j                  t        |	|
dz                h t        |      D cg c]  }||v r|
 c}||<   t        ||         d	k(  r||=  	 ddd       |S c c}w # t        $ r t!        d
|j#                         z        w xY w# 1 sw Y   |S xY w)z=Return a name-to-key-list dictionary to define each sequence.r  rASCIIencodingr   c              3   2   K   | ]  }t        |        y wr4   )r@  )r  xs     r"   r  z#MH.get_sequences.<locals>.<genexpr>  s     *Ka3q6*Ks   -r  r   z"Invalid sequence specification: %sN)r   r   r   r   r   setrZ   r   r  r,   r@  rz   rangerr  r  r   r   rstrip)r   resultsr   all_keysr   r   contentsrZ   specr~  r  r1   s               r"   r  zMH.get_sequences  sV   "'',,tzz?;S7S 	5WX499;'H 55%)ZZ_ND(5D ( 0 @<<> HHSY/*K4::c?*KKE4 KKeTAX(>?@ 5;4L %=S,/8O &) %=GDM74=)Q.#DM5	5& %= " 5%&J&*kkm'4 5 55!	5& s6   EB$D6=D1
D6$E1D66&EEE)c                    t        t        j                  j                  | j                  d      dd      }	 t        j
                  t        j                   |j                  t        j                  t        j                  z               |j                         D ]  \  }}t        |      dk(  r|j                  |dz          d}d}t        t        |            D ]Q  }|d	z
  |k(  r|sCd
}|j                  d       n/|rd}|j                  |d|       n|j                  d|z         |}S |r|j                  t        |      dz          |j                  d        	 t        |       y# t        |       w xY w)z:Set sequences using the given name-to-key-list dictionary.r  zr+r  r  r   r   NFr  Tr   z %s
)r   r   r   r   r   r   r   r*  r  rg   r  r   rr  r  r   r   )r   	sequencesr   r   rZ   prev
completingr1   s           r"   set_sequenceszMH.set_sequences  s,   djj/:D7S	HHRWWQVVR[[2::%=>?'oo/ "
dt9>s
#"
!#d), 
CQw$))-JGGCL#%*
4 56,D
 GGCI,-GGDM)", NKNs   D*E/ /E<c                 
   | j                         }d}g }| j                         D ]  }|dz
  |k7  r|j                  ||dz   f       	 t        j                  t        j
                  j                  | j                  t        |            t        j
                  j                  | j                  t        |dz                      t        j                  t        j
                  j                  | j                  t        |                   |dz  } |dz   | _        t        |      dk(  ry|j                         D ](  \  }}|D ]  \  }}||v s|||j!                  |      <     * | j#                  |       y# t        t        f$ r~ t        j                  t        j
                  j                  | j                  t        |            t        j
                  j                  | j                  t        |dz                      Y w xY w)z?Re-name messages to eliminate numbering gaps. Invalidates keys.r   r  N)r  rW   r  r   r   r   r   r   r   unlinkr   r   r   rZ  r  rg   indexr  )	r   r  r  changesr1   r   r  oldr   s	            r"   packzMH.pack  s   &&(	==? 	CQw$TAX/BGGBGGLLSX>GGLLS]CE IIbggll4::s3x@AAID	 w<1'oo/ 	8ND(# 8S(?47HX^^C018	8 	9% '8 GIIbggll4::s3x@ ggll4::s4!8}EGGs   A;E55B
HHc                    |j                         }| j                         }|j                         D ]2  \  }}||v r|j                  |       ||v s!||j                  |      = 4 |D ]  }||vs|g||<    | j	                  |       y)z;Inspect a new MHMessage and update sequences appropriately.N)r  rg   r  r  r  )r   r+   r1   pending_sequencesall_sequencesr   r  sequences           r"   r  zMH._dump_sequences  s    #113**,+113 	2ND((($X^^C01		2
 * 	0H},+.%h'	0 	=)r$   r   )r   r   r   r   r#   r,   r2   r=   rC   rN   rF   rW   rj   rm   r   r   r}   r   r  r$  r,  r5  r  r  r  r  r   r$   r"   r   r     su    
 D02$*	;
B* !
7
)

0:&4*r$   r   c                   t    e Zd ZdZ eh d      ZddZd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zy)r   zAn Rmail-style Babyl mailbox.>   filededitedresentunseendeletedanswered	forwardedNc                 B    t         j                  | |||       i | _        y)zInitialize a Babyl mailbox.N)rS  r#   _labelsr   s       r"   r#   zBabyl.__init__  s    ##D$@r$   c                     t         j                  | |      }t        |t              r|j	                         | j
                  |<   |S )r&   )rS  r,   r   r   
get_labelsr  )r   r+   r1   s      r"   r,   z	Babyl.add  s:     $$T73g|, ' 2 2 4DLL
r$   c                 h    t         j                  | |       || j                  v r| j                  |= yyr   )rS  r2   r  r0   s     r"   r2   zBabyl.remove  s/    !!$,$,,S! r$   c                     t         j                  | ||       t        |t              r|j	                         | j
                  |<   yy)r;   N)rS  r=   r   r   r  r  r<   s      r"   r=   zBabyl.__setitem__  s:    &&tS':g|, ' 2 2 4DLL -r$   c                    | j                  |      \  }}| j                  j                  |       | j                  j                          t	        j
                         }	 | j                  j                         }|dt        z   k(  s|sn&|j                  |j                  t        d             Ot	        j
                         }	 | j                  j                         }|t        k(  s|sn&|j                  |j                  t        d             L|| j                  j                         z
  }|dk\  sJ | j                  j                  |      }|j                  t        d      }t        |j                         |z         }	|	j                  |j                                || j                  v r|	j                  | j                  |          |	S )rI      *** EOOH ***r   r   )r   rY  r   r   r   r   r   r   r   ro  r   r   r   set_visibler  
set_labels)
r   r1   r~  r  original_headersr   visible_headersnbodyr  s
             r"   rC   zBabyl.get_message  si   ll3't



::<::&&(D00""4<<#?@	 
 **,::&&(Dwd!!$,,w">?	  4::??$$Avvzzq!||GU++446=>0023$,,NN4<<,-
r$   c                    | j                  |      \  }}| j                  j                  |       | j                  j                          t	        j
                         }	 | j                  j                         }|dt        z   k(  s|sn&|j                  |j                  t        d             O	 | j                  j                         }|t        k(  s|sn'|j                         }|| j                  j                         z
  }|dk\  sJ | j                  j                  |      }|j                  t        d      }||z   S )r  r  r   r   )r   rY  r   r   r   r   r   r   r   r   ro  r   )	r   r1   r~  r  r  r   headersr  r   s	            r"   rN   zBabyl.get_bytes  s	   ll3't



::<::&&(D00""4<<#?@	 
 ::&&(Dwd  #++-4::??$$Avvzzq!||GU+~r$   c                 r    t        j                  | j                  |      j                  dt                    S )rS   r   )r   r   rN   r   r   r0   s     r"   rF   zBabyl.get_file-  s'    zz$..-55eWEFFr$   c                     | j                          t               }| j                  j                         D ]  }|j	                  |        |j                  | j                         t        |      S )z4Return a list of user-defined labels in the mailbox.)r   r  r  rc   rz   difference_update_special_labelsrY   )r   labels
label_lists      r"   r  zBabyl.get_labels1  sX    ,,--/ 	&JMM*%	&  !5!56F|r$   c                 @   g g }}| j                   j                  d       d}g }	 |}| j                   j                         }| j                   j                         }|dt        z   k(  rt        |      t        |      k  r!|j                  |t        t              z
         |j                  |       | j                   j                         dd j                  d      D cg c]"  }|j                         r|j                         $ }}|j                  |       nn|dk(  s|dt        z   k(  r9t        |      t        |      k  rF|j                  |t        t              z
         n$|s"|j                  |t        t              z
         ndt        t        t        ||                  | _        t        t        |            | _        t        | j                        | _        | j                   j                  dd       | j                   j                         | _        yc c}w )r  r   s   r  N   ,   rH  )rY  r   r   ro  r   r  r  r   stripr  r  r  r   r  rZ  r^  )	r   r  r  r  label_listsr  r   labelr"  s	            r"   r  zBabyl._generate_toc:  s   B

H::&&(Dzz(H{W,,u:F+LLCL!89h'+/::+>+>+@+D+J+J4+P:E+0;;=  ++- : : ""6*DGg,=$=u:F+LLCL!89XG45# $ 3vu#567	Ik23TYY

1 JJOO-:s   'Hc                     dt         z   }|dt         z   z  }| j                         }d |D        }|ddj                  |      z   t         z   z  }|dz  }|j                  |       y)r  s   BABYL OPTIONS:s
   Version: 5c              3   <   K   | ]  }|j                           y wr4   )r   )r  r)  s     r"   r  z*Babyl._pre_mailbox_hook.<locals>.<genexpr>]  s     5U%,,.5s   s   Labels:r%  r&  N)r   r  r   r   )r   r   babylr"  s       r"   rq  zBabyl._pre_mailbox_hookX  sc    !G+(("5f5dii//'99	r$   c                 4    |j                  dt        z          y)r     Nr  r  s     r"   rs  zBabyl._pre_message_hookb  s    	'!"r$   c                 4    |j                  t        dz          y)r  r&  Nr  r  s     r"   ru  zBabyl._post_message_hookf  s    	'!"r$   c                    | j                   j                         }t        |t              r	g }g }|j	                         D ]3  }|| j
                  v r|j                  |       #|j                  |       5 | j                   j                  d       |D ].  }| j                   j                  d|j                         z          0 | j                   j                  d       |D ]1  }| j                   j                  d|j                         z   dz          3 | j                   j                  t               n"| j                   j                  dt        z          t        |t        j                  j                        rt        j                         }t        j                  j!                  |dd      }|j#                  |       |j%                  d       	 |j'                         }| j                   j                  |j)                  d
t                     |d
k(  s|snH| j                   j                  dt        z          t        |t              rt        j                         }	t        j                  j!                  |	dd      }
|
j#                  |j+                                	 |	j'                         }| j                   j                  |j)                  d
t                     |d
k(  s|sn[H|j%                  d       	 |j'                         }| j                   j                  |j)                  d
t                     |d
k(  s|snH	 |j-                  d      }|sn| j                   j                  |j)                  d
t                     Et        |t.        t0        t        j2                  f      rt        |t        j2                        r+t5        j6                  dt8        d       |j;                         }t        |t0              r| j=                  |      }|j?                  d      dz   }|dz
  dk7  r| j                   j                  |d| j)                  d
t                     | j                   j                  dt        z          | j                   j                  |d| j)                  d
t                     | j                   j                  ||d j)                  d
t                     n | j                   j                  dt        z   t        z          | j                   j                  |j)                  d
t                     ntA        |d      rtA        |d      r't5        j6                  dt8        d       |jB                  }|j                         }d	}	 |j'                         }|jE                  d      r	|dd d
z   }n|jE                  d      r|dd d
z   }| j                   j                  |j)                  d
t                     |d
k(  s|s9|r6d}| j                   j                  dt        z          |j%                  |       nn	 |j'                         }|sn|jE                  d      r|dd t        z   }n;|jE                  d      r|dd t        z   }n|jE                  d
      r|dd t        z   }| j                   j                  |       tG        dtI        |      z        | j                   j                         }||fS )z0Write message contents and return (start, stop).   1s   , s   ,,    r%  s   1,,Fr   Tr   r  rl  r   r   s   

rH  r   Nr   r   r   r   r   r   r   )%rY  ro  r   r   r  r!  r  r   r   r   rL   r+   r
   r   r   r   r   r   r   r   r   get_visibler   r   r   r   r   r   r   r   r   r  rv   r   r   r   r   )r   r+   r~  special_labelsr"  r)  orig_bufferorig_generatorr   
vis_buffervis_generatorr   
body_startoriginal_pos
first_passr  s                   r"   r  zBabyl._install_messagej  s   

!g|,NF ++- )D000"))%0MM%(	)
 JJT"' 9

  !789JJU# ?

  !6!=>?JJW%JJVg-.gu}}445**,K"__;;KPQRN""7+Q"++-

  eW!=>5=	 
 JJ_w67'<0ZZ\
 % > >z5RS T%%g&9&9&;<%..0DJJ$$T\\%%ABu}D	    #&//1DJJ$$T\\%%ABu}D	 
 $))$/

  w!?@	 
 %bkk!:;'2;;/ *+=qB!**,'3'//8 g.2JA~#

  *!5!=!=eW!MN

  7!:;

  *!5!=!=eW!MN

  !5!=!=eW!MN

  7!:W!DE

  !@AWj)w) 56H!M!.."<<>LJ'')==)9u,D]]5)9u,D

  eW!=>5=!%*


((7)BC\2  '')==)9w.D]]5)9w.D]]5)9w.D

  &  6gFGGzz t}r$   r   )r   r   r   r   	frozensetr!  r#   r,   r2   r=   rC   rN   rF   r  r  rq  rs  ru  r  r   r$   r"   r   r     sY    ' !B CO
"58,G.<##ir$   r   c                   $    e Zd ZdZddZd Zd Zy)r
   z0Message with mailbox-format-specific properties.Nc                    t        |t        j                  j                        rG| j	                  t        j                  |             t        |t              r|j                  |        yyt        |t              r%| j	                  t        j                  |             yt        |t              r%| j	                  t        j                  |             yt        |t        j                        r%| j	                  t        j                  |             yt        |d      r%| j	                  t        j                   |             y|*t        j                  j                  j#                  |        yt%        dt'        |      z        )zInitialize a Message instance.r   Nr   )r   rL   r+   r
   _become_messagecopydeepcopy_explain_tor   rM   r   message_from_stringr   TextIOWrappermessage_from_filerv   message_from_binary_filer#   r   r   r*   s     r"   r#   zMessage.__init__  s   gu}}445  w!78'7+##D) ,'  !9!9'!BC%  !:!:7!CD!1!12  !8!8!ABWf%  !?!?!HI_MM!!**406gFGGr$   c                     t        |dg       }|j                  D ]#  }||vs|j                  |   | j                  |<   % y)z0Assume the non-format-specific state of message._type_specific_attributesN)getattr__dict__)r   r+   type_specificr   s       r"   r?  zMessage._become_message  sG    )DbI$$ 	=D=(&-&6&6t&<d#	=r$   c                 :    t        |t              ryt        d      )z:Copy format-specific state to message insofar as possible.Nz Cannot convert to specified type)r   r
   r   r*   s     r"   rB  zMessage._explain_to  s    gw'>??r$   r4   )r   r   r   r   r#   r?  rB  r   r$   r"   r
   r
     s    :H&=@r$   r
   c                   b    e Zd ZdZg dZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zy)r   z)Message with Maildir-specific properties.)_subdir_info_dateNc                 ~    d| _         d| _        t        j                         | _        t        j                  | |       y)z%Initialize a MaildirMessage instance.r   r   N)rN  rO  r7  rP  r
   r#   r*   s     r"   r#   zMaildirMessage.__init__   s-    
YY[
w'r$   c                     | j                   S )zReturn 'new' or 'cur'.)rN  rV   s    r"   r   zMaildirMessage.get_subdir  s    ||r$   c                 B    |dk(  s|dk(  r|| _         yt        d|z        )zSet subdir to 'new' or 'cur'.r   r   z!subdir must be 'new' or 'cur': %sN)rN  r   )r   r   s     r"   r   zMaildirMessage.set_subdir  s'    U?fo!DL@6IJJr$   c                 X    | j                   j                  d      r| j                   dd S y)*Return as a string the flags that are set.2,rH  Nr   )rO  r   rV   s    r"   	get_flagszMaildirMessage.get_flags  s'    ::  &::ab>!r$   c                 H    ddj                  t        |            z   | _        y))Set the given flags and unset all others.rV  r   N)r   rr  rO  )r   flagss     r"   	set_flagszMaildirMessage.set_flags  s    BGGF5M22
r$   c                     | j                  dj                  t        | j                               t        |      z               yz.Set the given flag(s) without changing others.r   Nr[  r   r  rW  r   flags     r"   add_flagzMaildirMessage.add_flag  ,    rwws4>>#34s4y@ABr$   c                     | j                         rD| j                  dj                  t        | j                               t        |      z
               yy)7Unset the given string flag(s) without changing others.r   N)rW  r[  r   r  r_  s     r"   remove_flagzMaildirMessage.remove_flag!  s;    >>NN2773t~~'7#83t9#DEF r$   c                     | j                   S )z<Return delivery date of message, in seconds since the epoch.)rP  rV   s    r"   r   zMaildirMessage.get_date&      zzr$   c                 ^    	 t        |      | _        y# t        $ r t        d|z        dw xY w)z9Set delivery date of message, in seconds since the epoch.zcan't convert to float: %sN)floatrP  r   r   )r   dates     r"   r   zMaildirMessage.set_date*  s7    	KtDJ 	K84?@dJ	Ks    ,c                     | j                   S )z%Get the message's "info" as a string.)rO  rV   s    r"   r   zMaildirMessage.get_info1  rg  r$   c                 `    t        |t              r|| _        yt        dt	        |      z        )z Set the message's "info" string.zinfo must be a string: %sN)r   r   rO  r   r   )r   r  s     r"   r   zMaildirMessage.set_info5  s(    dC DJ7$t*DEEr$   c                    t        |t              r^|j                  | j                                |j	                  | j                                |j                  | j                                yt        |t              rt        | j                               }d|v r|j                  d       | j                         dk(  r|j                  d       d|v r|j                  d       d|v r|j                  d       d|v r|j                  d       |j                  d	t        j                  | j                                      yt        |t              rZt        | j                               }d|vr|j                  d
       d|v r|j                  d       d|v r|j                  d       yyt        |t               rot        | j                               }d|vr|j#                  d
       d|v r|j#                  d       d|v r|j#                  d       d|v r|j#                  d       yyt        |t$              ryt'        dt)        |      z        )z;Copy Maildir-specific state to message insofar as possible.SRr   OTDFAMAILER-DAEMONr
  repliedflaggedr  r  r<  r  $Cannot convert to specified type: %sN)r   r   r[  rW  r   r   r   r   r  r  ra  r  r7  r  r   r  r   	add_labelr
   r   r   )r   r+   rZ  s      r"   rB  zMaildirMessage._explain_to<  s   g~.dnn./t01T]]_-!12()Ee|  % E)  %e|  %e|  %e|  %_dkk$--/.JK+()E%$$X.e|$$Y/e|$$Y/ .()E%!!(+e|!!),e|!!*-e|!!+. )B M* + +r$   r4   )r   r   r   r   rH  r#   r   r   rW  r[  ra  re  r   r   r   r   rB  r   r$   r"   r   r     sL    3 =(K3CG
KF)+r$   r   c                   J    e Zd ZdZdgZddZd ZddZd Zd Z	d	 Z
d
 Zd Zy)r  z/Message with mbox- or MMDF-specific properties._fromNc                 
   | j                  dd       t        |t        j                  j                        r7|j                         }|%|j                  d      r| j                  |dd        t        j                  | |       y)z'Initialize an mboxMMDFMessage instance.ru  TNzFrom r   )r  r   rL   r+   r
   r  r   r#   )r   r+   r  s      r"   r#   z_mboxMMDFMessage.__init__m  sg    ot,gu}}445++-H#(;(;G(Dhqrl+w'r$   c                     | j                   S )z Return contents of "From " line.)r{  rV   s    r"   r  z_mboxMMDFMessage.get_fromv  rg  r$   c                 |    |3|du rt        j                         }|dt        j                  |      z   z  }|| _        y)z>Set "From " line, formatting and appending time_ if specified.NTr  )r7  r  r  r{  )r   r  time_s      r"   r  z_mboxMMDFMessage.set_fromz  s9    }S4<<...E
r$   c                 L    | j                  dd      | j                  dd      z   S )rU  Statusr   X-Status)rA   rV   s    r"   rW  z_mboxMMDFMessage.get_flags  s#    xx"%R(@@@r$   c                    t        |      }d\  }}dD ]  }||v s||z  }|j                  |        dD ]  }||v s||z  }|j                  |        |dj                  t        |            z  }	 | j	                  d|       	 | j	                  d|       y# t
        $ r | j                  d|       Y 1w xY w# t
        $ r | j                  d|       Y yw xY w)rY  )r   r   )ro  rp  )rr  rs  rt  r   r  r  N)r  r2   r   rr  replace_headerr8   
add_header)r   rZ  status_flagsxstatus_flagsr`  s        r"   r[  z_mboxMMDFMessage.set_flags  s    E
&,#m 	#Du}$T"	# $ 	#Du}%T"	# 	//	4,7	7
M:  	4OOHl3	4  	7OOJ6	7s$   3B B: B76B7:CCc                     | j                  dj                  t        | j                               t        |      z               yr]  r^  r_  s     r"   ra  z_mboxMMDFMessage.add_flag  rb  r$   c                     d| v sd| v rD| j                  dj                  t        | j                               t        |      z
               yy)rd  r  r  r   Nr^  r_  s     r"   re  z_mboxMMDFMessage.remove_flag  s@    tzT1NN2773t~~'7#83t9#DEF  2r$   c                    t        |t              rt        | j                               }d|v r|j	                  d       d|v r|j                  d       d|v r|j                  d       d|v r|j                  d       d|v r|j                  d       |d	= |d
= dj                  | j                         j                         dd       }	 |j                  t        j                  t        j                  |d                   yt        |t               r?|j#                  | j                                |j%                  | j                                yt        |t&              r_t        | j                               }d|vr|j)                  d       d|v r|j)                  d       d|v r|j)                  d       |d	= |d
= yt        |t*              r_t        | j                               }d|vr|j-                  d       d|v r|j-                  d       d|v r|j-                  d       |d	= |d
= yt        |t.              ryt1        dt3        |      z        # t        t        f$ r Y yw xY w)zACopy mbox- or MMDF-specific state to message insofar as possible.rp  r   rs  rt  ro  rn  rr  rq  statuszx-statusr  Nz%a %b %d %H:%M:%S %Yr
  rv  rw  r  r  rx  )r   r   r  rW  r   ra  r   r  r   r   calendartimegmr7  strptimer   OverflowErrorr  r[  r  r   r  r   ry  r
   r   r   )r   r+   rZ  
maybe_dates       r"   rB  z_mboxMMDFMessage._explain_to  s9   g~.()Ee|""5)e|  %e|  %e|  %e|  %!
#$--/"7"7"9"#">?J  z6L2N "O P !12dnn./T]]_-+()E%$$X.e|$$Y/e|$$Y/!
#.()E%!!(+e|!!),e|!!*-!
#)B M* + +9 . s   
8I I*)I*r4   )r   r   r   r   rH  r#   r  r  rW  r[  ra  re  rB  r   r$   r"   r  r  h  s8    9!(	(A7,CG
1+r$   r  c                       e Zd ZdZy)r   z&Message with mbox-specific properties.Nr   r   r   r   r   r$   r"   r   r         0r$   r   c                   <    e Zd ZdZdgZd
dZd Zd Zd Zd Z	d	 Z
y)r   z$Message with MH-specific properties.
_sequencesNc                 >    g | _         t        j                  | |       y)z!Initialize an MHMessage instance.N)r  r
   r#   r*   s     r"   r#   zMHMessage.__init__  s    w'r$   c                      | j                   dd S )z4Return a list of sequences that include the message.N)r  rV   s    r"   r  zMHMessage.get_sequences  s    q!!r$   c                 $    t        |      | _        y)z3Set the list of sequences that include the message.N)rY   r  )r   r  s     r"   r  zMHMessage.set_sequences  s    y/r$   c                     t        |t              r+|| j                  vr| j                  j                  |       yyt	        dt        |      z        )z8Add sequence to list of sequences including the message.zsequence type must be str: %sN)r   r   r  r  r   r   r   r  s     r"   r  zMHMessage.add_sequence  sF    h$t.&&x0 / ;d8nLMMr$   c                 Z    	 | j                   j                  |       y# t        $ r Y yw xY w)zARemove sequence from the list of sequences including the message.N)r  r2   r   r  s     r"   remove_sequencezMHMessage.remove_sequence  s+    	OO""8, 		    	**c                 |   t        |t              r}t        | j                               }d|v r|j	                  d       n"|j	                  d       |j                  d       d|v r|j                  d       d|v r|j                  d       yyt        |t              rlt        | j                               }d|vr|j                  d       n|j                  d	       d|v r|j                  d       d|v r|j                  d
       yyt        |t              r'| j                         D ]  }|j                  |        yt        |t              rEt        | j                               }d|v r|j                  d       d|v r|j                  d       yyt        |t              ryt        dt        |      z        )z6Copy MH-specific state to message insofar as possible.r
  r   rn  rw  rs  rv  ro  ROrp  rt  r  rx  N)r   r   r  r  r   ra  r  r   r  r   ry  r
   r   r   )r   r+   r  r  s       r"   rB  zMHMessage._explain_to  s   g~.D..01I9$""5)""5)  %I%  %I%  % &!12D..01Iy(  &  %I%  %I%  % &+ ..0 /$$X./.D..01I9$!!(+I%!!*- &)B M* + +r$   r4   )r   r   r   r   rH  r#   r  r  r  r  rB  r   r$   r"   r   r     s,    .!-(
"*N$+r$   r   c                   P    e Zd ZdZddgZddZd Zd Zd Zd	 Z	d
 Z
d Zd Zd Zy)r   z'Message with Babyl-specific properties.r  _visibleNc                 \    g | _         t               | _        t        j                  | |       y)z#Initialize a BabylMessage instance.N)r  r
   r  r#   r*   s     r"   r#   zBabylMessage.__init__*  s"    	w'r$   c                      | j                   dd S )z'Return a list of labels on the message.N)r  rV   s    r"   r  zBabylMessage.get_labels0  s    ||Ar$   c                 $    t        |      | _        y)z&Set the list of labels on the message.N)rY   r  )r   r"  s     r"   r  zBabylMessage.set_labels4  s    F|r$   c                     t        |t              r+|| j                  vr| j                  j                  |       yyt	        dt        |      z        )z+Add label to list of labels on the message.zlabel must be a string: %sN)r   r   r  r  r   r   r   r)  s     r"   ry  zBabylMessage.add_label8  sF    eS!DLL(##E* ) 84;FGGr$   c                 Z    	 | j                   j                  |       y# t        $ r Y yw xY w)z4Remove label from the list of labels on the message.N)r  r2   r   r  s     r"   remove_labelzBabylMessage.remove_label@  s+    	LL& 		r  c                 ,    t        | j                        S )z3Return a Message representation of visible headers.r
   r  rV   s    r"   r3  zBabylMessage.get_visibleG  s    t}}%%r$   c                 $    t        |      | _        y)z2Set the Message representation of visible headers.Nr  )r   visibles     r"   r  zBabylMessage.set_visibleK  s    (r$   c                     | j                   j                         D ]3  }|| v r | j                   j                  || |          '| j                   |= 5 dD ](  }|| v s|| j                   vs| |   | j                   |<   * y)z9Update and/or sensibly generate a set of visible headers.)DateFromzReply-ToToCCSubjectN)r  rZ   r  )r   headers     r"   update_visiblezBabylMessage.update_visibleO  s    mm((* 	*F~,,VT&\BMM&)		*
 J 	5F~&"=(,Vf%	5r$   c                    t        |t              rt        | j                               }d|v r|j	                  d       n"|j	                  d       |j                  d       d|v sd|v r|j                  d       d|v r|j                  d       d	|v r|j                  d
       yyt        |t              rlt        | j                               }d|vr|j                  d       n|j                  d       d	|v r|j                  d       d|v r|j                  d       yyt        |t              rEt        | j                               }d|v r|j                  d       d|v r|j                  d       yyt        |t              rF|j                  | j                                | j                         D ]  }|j                  |        yt        |t              ryt        dt        |      z        )z9Copy Babyl-specific state to message insofar as possible.r
  r   rn  r  r	  r<  r  ro  r  rq  r  rp  rr  rt  rv  rx  N)r   r   r  r  r   ra  r  r   r  r   r  r3  ry  r
   r   r   )r   r+   r"  r)  s       r"   rB  zBabylMessage._explain_toZ  s   g~.*+F6!""5)""5)  %f$F(:  %V#  %F"  % #!12*+Fv%  &  %F"  %V#  % $+*+F6!$$X.V#$$Y/ $. 0 0 23* )!!%())B M* + +r$   r4   )r   r   r   r   rH  r#   r  r  ry  r  r3  r  r  rB  r   r$   r"   r   r   %  s>    1!*J 7($H&)	5'+r$   r   c                       e Zd ZdZy)r   z&Message with MMDF-specific properties.Nr  r   r$   r"   r   r     r  r$   r   c                       e Zd ZdZddZddZddZddZddZd Z	d	 Z
dd
Zd Zd Zd Zd Zd Zd Zd Zd Zed        Z ee      Zy)r  zA read-only wrapper of a file.Nc                 P    || _         ||j                         | _        y|| _        y)zInitialize a _ProxyFile.N)rY  ro  _pos)r   r   poss      r"   r#   z_ProxyFile.__init__  s"    
;DIDIr$   c                 N    | j                  || j                  j                        S zRead bytes.)_readrY  r   r   sizes     r"   r   z_ProxyFile.read  s    zz$

00r$   c                 N    | j                  || j                  j                        S r  )r  rY  read1r  s     r"   r  z_ProxyFile.read1  s    zz$

 0 011r$   c                 N    | j                  || j                  j                        S )zRead a line.)r  rY  r   r  s     r"   r   z_ProxyFile.readline  s    zz$

 3 344r$   c                 l    g }| D ],  }|j                  |       ||t        |      z  }|dk  s+ |S  |S )zRead multiple lines.r   )r  r  )r   sizehintrq   r   s       r"   	readlinesz_ProxyFile.readlines  sL     	DMM$#CI%q=	 r$   c              #   `   K   | j                         x}r| | j                         x}ryyw)zIterate over lines.N)r   )r   r   s     r"   ra   z_ProxyFile.__iter__  s/     mmo%d%J mmo%d%s   )..c                     | j                   S )zReturn the position.)r  rV   s    r"   ro  z_ProxyFile.tell  s    yyr$   c                     |dk(  r%| j                   j                  | j                         | j                   j                  ||       | j                   j                         | _        y)zChange position.r  NrY  r   r  ro  r   offsetwhences      r"   r   z_ProxyFile.seek  sA    Q;JJOODII&

'JJOO%	r$   c                     t        | d      r4	 t        | j                  d      r| j                  j                          | `yy# | `w xY w)zClose the file.rY  r   N)rv   rY  r   rV   s    r"   r   z_ProxyFile.close  sB    4!4::w/JJ$$&J "
 Js   0A Ac                     |d}| j                   j                  | j                          ||      }| j                   j                         | _        |S )z"Read size bytes using read_method.r   r  )r   r  read_methodrq   s       r"   r  z_ProxyFile._read  sA    <D

		"T"JJOO%	r$   c                     | S )z$Context management protocol support.r   rV   s    r"   	__enter__z_ProxyFile.__enter__  s    r$   c                 $    | j                          y r4   )r   )r   excs     r"   __exit__z_ProxyFile.__exit__  s    

r$   c                 6    | j                   j                         S r4   )rY  readablerV   s    r"   r  z_ProxyFile.readable      zz""$$r$   c                 6    | j                   j                         S r4   )rY  writablerV   s    r"   r  z_ProxyFile.writable  r  r$   c                 6    | j                   j                         S r4   )rY  seekablerV   s    r"   r  z_ProxyFile.seekable  r  r$   c                 6    | j                   j                         S r4   )rY  r}   rV   s    r"   r}   z_ProxyFile.flush  s    zz!!r$   c                 v    t        | d      syt        | j                  d      sy| j                  j                  S )NrY  Tr  F)rv   rY  r  rV   s    r"   r  z_ProxyFile.closed  s0    tW%tzz8,zz   r$   r4   r   )r   r   r   r   r#   r   r  r   r  ra   ro  r   r   r  r  r  r  r  r  r}   propertyr  r   r   r   r   r$   r"   r  r    sv    (125	
&%%%" ! ! $L1r$   r  c                   2    e Zd ZdZddZd Zd	dZd Zd Zy)
r  z&A read-only wrapper of part of a file.Nc                 N    t         j                  | ||       || _        || _        y)zInitialize a _PartialFile.N)r  r#   _start_stop)r   r   r~  r  s       r"   r#   z_PartialFile.__init__  s"    D!U+
r$   c                 F    t         j                  |       | j                  z
  S )z*Return the position with respect to start.)r  ro  r  rV   s    r"   ro  z_PartialFile.tell  s    t$t{{22r$   c                     |dk(  r| j                   | _        d}n|dk(  r| j                  | _        d}t        j	                  | ||       y)z8Change position, possibly with respect to start or stop.r   r  rH  N)r  r  r  r  r   r  s      r"   r   z_PartialFile.seek  s@    Q;DIFq[

DIFff-r$   c                     | j                   | j                  z
  }|dk  ry|
|dk  s||kD  r|}t        j                  | ||      S )z;Read size bytes using read_method, honoring start and stop.r   r$   )r  r  r  r  )r   r  r  	remainings       r"   r  z_PartialFile._read  sJ    JJ*	><4!8ti'7DdK88r$   c                 "    t        | d      r| `y y )NrY  )rv   rY  rV   s    r"   r   z_PartialFile.close
  s     4!
 "r$   )NNr  )	r   r   r   r   r#   ro  r   r  r   r   r$   r"   r  r    s    03.9r$   r  c                    d}	 t         r6	 t        j                  | t         j                  t         j                  z         |r{	 t        | j                  dz         }|j                          	 	 t        j                  |j                  | j                  dz          d}t        j                  |j                         yyy# t        $ rY}|j
                  t
        j                  t
        j                  t
        j                  fv rt        d| j                  z         d}~ww xY w# t        $ r7}|j
                  t
        j                  t
        j                  fv rY d}~y d}~ww xY w# t         t"        f$ r2 t        j$                  |j                  | j                  dz          d}Y w xY w# t&        $ r8 t        j(                  |j                         t        d| j                  z        w xY w#  t         r$t        j                  | t         j*                         |r"t        j(                  | j                  dz           xY w)z(Lock file f using lockf and dot locking.Fzlockf: lock unavailable: %sN.lockTzdot lock unavailable: %s)fcntllockfLOCK_EXLOCK_NBr   r   EAGAINrW  rX  r   r   rp  r   r   r   r  r   r   r   rE  r2   LOCK_UN)r   rm  dotlock_doner   pre_locks        r"   rg  rg    s   L%Au}}u}}<= ,QVVg-=> 1-GGHMM166G+;<#'L
 IIhmm, !   77u||U\\5;;GG,-J-.VV.4 5 5   77u||U[[99	 '8 (IIhmmQVVg-=>#'L(
 # 1		(--(()C)**0 1 11KK5==)IIaffw&'s   G. 5B>  G. (D# -/E& F* >	D ADD  G. #	E#,,EG. EE##G. &>F'$F* &F''F* *AG++G. .AH?c                     t         r$t        j                  | t         j                         t        j                  j                  | j                  dz         r#t        j                  | j                  dz          yy)z*Unlock file f using lockf and dot locking.r  N)r  r  r  r   r   r   r   r2   r   s    r"   rj  rj  ;  sJ    Au}}%	ww~~affw&'
		!&&7"# (r$   c                    t        j                  | t         j                  t         j                  z  t         j                  z  d      }	 t        | d      t        j
                  |       S # t        j
                  |       w xY w)zCCreate a file if it doesn't exist and open for reading and writing.r(  rU  )r   r   r)  r  O_RDWRr   )r   fds     r"   rD  rD  B  sP    	rzzBII-		95	ABD% 
s   	A* *Bc           
          t        | dt        t        j                               dt        j                         dt        j                               S )zBCreate a temp file based on path and open for reading and writing.r  )rD  r@  r7  r>  r?  r   rA  )r   s    r"   rp  rp  J  s8    dC		4D.4.@.@.B.0iik; < <r$   c                     | j                          t        t        d      r$t        j                  | j	                                yy)z0Ensure changes to file f are physically on disk.fsyncN)r}   rv   r   r  filenor  s    r"   rn  rn  P  s,    GGIr7
 r$   c                 :    t        |        | j                          y)z:Close file f, ensuring all changes are physically on disk.N)rn  r   r  s    r"   r   r   V  s    NGGIr$   c                       e Zd ZdZy)r   z"Raised for module-specific errors.Nr  r   r$   r"   r   r   \  s    ,r$   r   c                       e Zd ZdZy)r   z:The specified mailbox does not exist and won't be created.Nr  r   r$   r"   r   r   _  s    Dr$   r   c                       e Zd ZdZy)r   z>The specified mailbox is not empty and deletion was requested.Nr  r   r$   r"   r   r   b  s    Hr$   r   c                       e Zd ZdZy)r   z)Another process caused an action to fail.Nr  r   r$   r"   r   r   e      3r$   r   c                       e Zd ZdZy)r   z)A file appears to have an invalid format.Nr  r   r$   r"   r   r   h  r  r$   r   )T)2r   r   r7  r  r>  r   r@  r   rL   email.messageemail.generatorr   rD   typesr   r  ImportError__all__r   r   r   r   rS  r  r   r	   r   r   r+   r
   r   r  r   r   r   r   r  r  rg  rj  rD  rp  rn  r   	Exceptionr   r   r   r   r   r   r$   r"   <module>r
     s   J 
          	  A
 **

G
$f2 f2Rsg sl	C CN@" @F1.9 1.h*.9 *.Zn* n*b	v vr"@emm## "@Jj+W j+Zn+w n+b1" 1E+ E+P\+7 \+~1" 1_2 _2D$: $N(T$<-I -E EIE I4 44% 4aB  Es   E5 5F ?F 