static void ESearchMatches (ImapEngine engine, ImapCommand ic, int index) { var token = engine.ReadToken (ic.CancellationToken); var results = new SearchResults (); UniqueIdSet uids = null; //bool uid = false; uint min, max; ulong modseq; string atom; string tag; int count; if (token.Type == ImapTokenType.OpenParen) { // optional search correlator do { token = engine.ReadToken (ic.CancellationToken); if (token.Type == ImapTokenType.CloseParen) break; if (token.Type != ImapTokenType.Atom) throw ImapEngine.UnexpectedToken (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); atom = (string) token.Value; if (atom == "TAG") { token = engine.ReadToken (ic.CancellationToken); if (token.Type != ImapTokenType.Atom && token.Type != ImapTokenType.QString) throw ImapEngine.UnexpectedToken (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); tag = (string) token.Value; if (tag != ic.Tag) throw new ImapProtocolException ("Unexpected TAG value in untagged ESEARCH response: " + tag); } } while (true); token = engine.ReadToken (ic.CancellationToken); } if (token.Type == ImapTokenType.Atom && ((string) token.Value) == "UID") { token = engine.ReadToken (ic.CancellationToken); //uid = true; } do { if (token.Type == ImapTokenType.Eoln) { // unget the eoln token engine.Stream.UngetToken (token); break; } if (token.Type != ImapTokenType.Atom) throw ImapEngine.UnexpectedToken (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); atom = (string) token.Value; token = engine.ReadToken (ic.CancellationToken); if (token.Type != ImapTokenType.Atom) throw ImapEngine.UnexpectedToken (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); switch (atom) { case "MODSEQ": if (!ulong.TryParse ((string) token.Value, out modseq)) throw ImapEngine.UnexpectedToken (ImapEngine.GenericItemSyntaxErrorFormat, atom, token); results.ModSeq = modseq; break; case "COUNT": if (!int.TryParse ((string) token.Value, out count)) throw ImapEngine.UnexpectedToken (ImapEngine.GenericItemSyntaxErrorFormat, atom, token); results.Count = count; break; case "MIN": if (!uint.TryParse ((string) token.Value, out min)) throw ImapEngine.UnexpectedToken (ImapEngine.GenericItemSyntaxErrorFormat, atom, token); results.Min = new UniqueId (ic.Folder.UidValidity, min); break; case "MAX": if (!uint.TryParse ((string) token.Value, out max)) throw ImapEngine.UnexpectedToken (ImapEngine.GenericItemSyntaxErrorFormat, atom, token); results.Max = new UniqueId (ic.Folder.UidValidity, max); break; case "ALL": if (!UniqueIdSet.TryParse ((string) token.Value, ic.Folder.UidValidity, out uids)) throw ImapEngine.UnexpectedToken (ImapEngine.GenericItemSyntaxErrorFormat, atom, token); results.Count = uids.Count; break; default: throw ImapEngine.UnexpectedToken (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "ESEARCH", token); } token = engine.ReadToken (ic.CancellationToken); } while (true); results.UniqueIds = uids ?? new UniqueIdSet (); ic.UserData = results; }
static void SearchMatches (ImapEngine engine, ImapCommand ic, int index) { var results = new SearchResults (); var uids = new List<UniqueId> (); ImapToken token; ulong modseq; uint uid; do { token = engine.PeekToken (ic.CancellationToken); // keep reading UIDs until we get to the end of the line or until we get a "(MODSEQ ####)" if (token.Type == ImapTokenType.Eoln || token.Type == ImapTokenType.OpenParen) break; token = engine.ReadToken (ic.CancellationToken); if (token.Type != ImapTokenType.Atom || !uint.TryParse ((string) token.Value, out uid) || uid == 0) throw ImapEngine.UnexpectedToken (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "SEARCH", token); uids.Add (new UniqueId (ic.Folder.UidValidity, uid)); } while (true); if (token.Type == ImapTokenType.OpenParen) { engine.ReadToken (ic.CancellationToken); do { token = engine.ReadToken (ic.CancellationToken); if (token.Type == ImapTokenType.CloseParen) break; if (token.Type != ImapTokenType.Atom) throw ImapEngine.UnexpectedToken (ImapEngine.GenericUntaggedResponseSyntaxErrorFormat, "SEARCH", token); var atom = (string) token.Value; switch (atom) { case "MODSEQ": token = engine.ReadToken (ic.CancellationToken); if (token.Type != ImapTokenType.Atom || !ulong.TryParse ((string) token.Value, out modseq)) { Debug.WriteLine ("Expected 64-bit nz-number as the MODSEQ value, but got: {0}", token); throw ImapEngine.UnexpectedToken (ImapEngine.GenericItemSyntaxErrorFormat, atom, token); } break; } token = engine.PeekToken (ic.CancellationToken); } while (token.Type != ImapTokenType.Eoln); } results.UniqueIds = uids; ic.UserData = results; }