/// <summary> /// Parses an untagged LIST or LSUB response. /// </summary> /// <param name="engine">The IMAP engine.</param> /// <param name="ic">The IMAP command.</param> /// <param name="index">The index.</param> public static void ParseFolderList (ImapEngine engine, ImapCommand ic, int index) { var token = engine.ReadToken (ic.CancellationToken); var list = (List<ImapFolder>) ic.UserData; var attrs = FolderAttributes.None; string encodedName; ImapFolder folder; char delim; // parse the folder attributes list if (token.Type != ImapTokenType.OpenParen) throw ImapEngine.UnexpectedToken (token, false); token = engine.ReadToken (ic.CancellationToken); while (token.Type == ImapTokenType.Flag || token.Type == ImapTokenType.Atom) { string atom = (string) token.Value; switch (atom) { case "\\NoInferiors": attrs |= FolderAttributes.NoInferiors; break; case "\\Noselect": attrs |= FolderAttributes.NoSelect; break; case "\\Marked": attrs |= FolderAttributes.Marked; break; case "\\Unmarked": attrs |= FolderAttributes.Unmarked; break; case "\\NonExistent": attrs |= FolderAttributes.NonExistent; break; case "\\Subscribed": attrs |= FolderAttributes.Subscribed; break; case "\\Remote": attrs |= FolderAttributes.Remote; break; case "\\HasChildren": attrs |= FolderAttributes.HasChildren; break; case "\\HasNoChildren": attrs |= FolderAttributes.HasNoChildren; break; case "\\All": attrs |= FolderAttributes.All; break; case "\\Archive": attrs |= FolderAttributes.Archive; break; case "\\Drafts": attrs |= FolderAttributes.Drafts; break; case "\\Flagged": attrs |= FolderAttributes.Flagged; break; case "\\Junk": attrs |= FolderAttributes.Junk; break; case "\\Sent": attrs |= FolderAttributes.Sent; break; case "\\Trash": attrs |= FolderAttributes.Trash; break; // XLIST flags: case "\\AllMail": attrs |= FolderAttributes.All; break; case "\\Important": attrs |= FolderAttributes.Flagged; break; case "\\Inbox": attrs |= FolderAttributes.Inbox; break; case "\\Spam": attrs |= FolderAttributes.Junk; break; case "\\Starred": attrs |= FolderAttributes.Flagged; break; } token = engine.ReadToken (ic.CancellationToken); } if (token.Type != ImapTokenType.CloseParen) throw ImapEngine.UnexpectedToken (token, false); // parse the path delimeter token = engine.ReadToken (ic.CancellationToken); if (token.Type == ImapTokenType.QString) { var qstring = (string) token.Value; delim = qstring[0]; } else if (token.Type == ImapTokenType.Nil) { delim = '\0'; } else { throw ImapEngine.UnexpectedToken (token, false); } // parse the folder name token = engine.ReadToken (ImapStream.StringSpecials, ic.CancellationToken); switch (token.Type) { case ImapTokenType.Literal: encodedName = engine.ReadLiteral (ic.CancellationToken); break; case ImapTokenType.QString: case ImapTokenType.Atom: encodedName = (string) token.Value; break; default: throw ImapEngine.UnexpectedToken (token, false); } if (IsInbox (encodedName)) attrs |= FolderAttributes.Inbox; if (engine.GetCachedFolder (encodedName, out folder)) { attrs |= (folder.Attributes & ~(FolderAttributes.Marked | FolderAttributes.Unmarked)); folder.UpdateAttributes (attrs); } else { folder = engine.CreateImapFolder (encodedName, attrs, delim); engine.CacheFolder (folder); } list.Add (folder); }