package Ġcom . fs ck . k 9 . mail . internet Ċ Ċ /** Ċ Ġ* ĠRead ĠMessage Ġidentifier ( s ). Ċ Ġ* Ċ Ġ* ĠUsed Ġin Ġthe Ġ` Message - ID `, Ġ` In - Reply - To `, Ġand Ġ` References ` Ġheader Ġfields . Ċ Ġ* ĠThis Ġdoes Ġnot Ġsupport Ġthe Ġobsolete Ġsyntax . Ċ Ġ* Ċ Ġ* ĠSee ĠRFC Ġ 5 3 2 2 Ċ Ġ* Ġ``` Ċ Ġ* Ġmsg - id ĠĠĠĠĠĠĠĠĠ Ġ= ĠĠ Ġ[ CF WS ] Ġ"< " Ġid - left Ġ"@ " Ġid - right Ġ" >" Ġ[ CF WS ] Ċ Ġ* Ġid - left ĠĠĠĠĠĠĠĠ Ġ= ĠĠ Ġdot - atom - text Ġ/ Ġobs - id - left Ċ Ġ* Ġid - right ĠĠĠĠĠĠĠ Ġ= ĠĠ Ġdot - atom - text Ġ/ Ġno - fold - literal Ġ/ Ġobs - id - right Ċ Ġ* Ċ Ġ* Ġdot - atom - text ĠĠ Ġ= ĠĠĠ 1 * at ext Ġ* (" ." Ġ 1 * at ext ) Ċ Ġ* Ġno - fold - literal Ġ= ĠĠ Ġ"[" Ġ* d text Ġ" ]" Ċ Ġ* ĠCF WS ĠĠĠĠĠĠĠĠĠĠĠ Ġ= ĠĠ Ġ( 1 * ([ F WS ] Ġcomment ) Ġ[ F WS ]) Ġ/ ĠF WS Ċ Ġ* ĠF WS ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= ĠĠ Ġ([ * W SP ĠCRL F ] Ġ 1 * W SP ) Ġ/ Ġobs - F WS Ġ; ĠFold ing Ġwhite Ġspace Ċ Ġ* Ġcomment ĠĠĠĠĠĠĠĠ Ġ= ĠĠ Ġ"(" Ġ* ([ F WS ] Ġc content ) Ġ[ F WS ] Ġ")" Ċ Ġ* Ġc content ĠĠĠĠĠĠĠ Ġ= ĠĠ Ġc text Ġ/ Ġquoted - pair Ġ/ Ġcomment Ċ Ġ* Ġquoted - pair ĠĠĠĠ Ġ= ĠĠ Ġ(" \" Ġ( V CHAR Ġ/ ĠW SP )) Ġ/ Ġobs - qp Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ class ĠMessage Id Parser Ġprivate Ġconstructor ( private Ġval Ġinput : ĠString ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġend Index Ġ= Ġinput . length ĊĠĠĠ Ġprivate Ġvar ĠcurrentIndex Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġparse (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠmessageId Ġ= Ġread MessageId () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! end Reached ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠMime Header Parser Exception (" Expected Ġend Ġof Ġinput ", ĠcurrentIndex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠmessageId ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse List (): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( input . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠMime Header Parser Exception (" Expected Ġmessage Ġidentifier ", Ġerror Index Ġ= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmessage Ids Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! end Reached ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ids . add ( read MessageId ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmessage Ids ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread MessageId (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġskip Cf ws () ĊĠĠĠĠĠĠĠ Ġexpect ('< ') ĊĠĠĠĠĠĠĠ Ġval Ġid Left Ġ= Ġread Id Left () ĊĠĠĠĠĠĠĠ Ġexpect ('@ ') ĊĠĠĠĠĠĠĠ Ġval Ġid Right Ġ= Ġread Id Right () ĊĠĠĠĠĠĠĠ Ġexpect (' >') ĊĠĠĠĠĠĠĠ Ġskip Cf ws () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ"< $ id Left @ $ id Right >" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Id Left (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġread Dot Atom () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Id Right (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( peek () Ġ== Ġ'[ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread D Text () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Dot Atom () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Dot Atom (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= ĠcurrentIndex ĊĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect (" at ext ") Ġ{ Ġit . is AT ext () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( peek () Ġ== Ġ'.') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ('.') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect (" at ext ") Ġ{ Ġit . is AT ext () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( peek (). is AT ext ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġinput . substring ( startIndex , ĠcurrentIndex ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread D Text (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= ĠcurrentIndex ĊĊĠĠĠĠĠĠĠ Ġexpect ('[ ') ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( peek (). is D Text ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect (' ]') ĊĊĠĠĠĠĠĠĠ Ġreturn Ġinput . substring ( startIndex , ĠcurrentIndex ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġskip Cf ws () Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Index Ġ= ĠcurrentIndex ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip F ws () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! end Reached () Ġ&& Ġpeek () Ġ== Ġ'(' ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Comment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( currentIndex Ġ!= Ġlast Index Ġ&& Ġ! end Reached ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġskip F ws () Ġ{ ĊĠĠĠĠĠĠĠ Ġskip W sp () ĊĠĠĠĠĠĠĠ Ġif Ġ(! end Reached () Ġ&& Ġpeek () Ġ== ĠCR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Cr () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Lf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect W sp () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip W sp () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpect Comment () Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect (' (' ) ĊĠĠĠĠĠĠĠ Ġvar Ġlevel Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip F ws () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar Ġ= Ġpeek () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ġ== Ġ'(' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect (' (' ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ġ== Ġ'\\ ' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Quoted Pair () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar . is CT ext () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect (' )') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( level Ġ> Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpect Quoted Pair () Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ('\\ ') ĊĠĠĠĠĠĠĠ Ġexpect (" V CHAR Ġor ĠW SP ") Ġ{ Ġit . is V Char () Ġ|| Ġit . is W sp () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpect Cr () Ġ= Ġexpect (" CR ", ĠCR ) ĊĊĠĠĠ Ġprivate Ġfun Ġexpect Lf () Ġ= Ġexpect (" LF ", ĠL F ) ĊĊĠĠĠ Ġprivate Ġfun Ġexpect W sp () Ġ= Ġexpect (" W SP ") Ġ{ Ġit . is W sp () Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġskip W sp () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! end Reached () Ġ&& Ġpeek (). is W sp ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġend Reached () Ġ= ĠcurrentIndex Ġ>= Ġend Index ĊĊĠĠĠ Ġprivate Ġfun Ġpeek (): ĠChar Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ>= Ġinput . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠMime Header Parser Exception (" End Ġof Ġinput Ġreached Ġunexpected ly ", ĠcurrentIndex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġinput [ currentIndex ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġskip () Ġ{ ĊĠĠĠĠĠĠĠ ĠcurrentIndex ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpect ( character : ĠChar ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ("' $ character '") Ġ{ Ġit Ġ== Ġcharacter Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpect ( display In Error : ĠString , Ġcharacter : ĠChar ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( display In Error ) Ġ{ Ġit Ġ== Ġcharacter Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġexpect ( display In Error : ĠString , Ġpredicate : Ġ( Char ) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! end Reached () Ġ&& Ġpredicate ( peek ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠMime Header Parser Exception (" Expected Ġ$ display In Error ", ĠcurrentIndex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġparse ( input : ĠString ): ĠString Ġ= ĠMessage Id Parser ( input ). parse () ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġparse List ( input : ĠString ): ĠList < String > Ġ= ĠMessage Id Parser ( input ). parse List () ĊĠĠĠ Ġ} Ċ } Ċ