private void DoGMailQuery (string query, int maxhits, IQueryResult result) { Log.Debug ("GMailSearchDriver: Searching for [{0}]", query); MessageSet results = imap_client.Search (query, false); if (results == null) { return; } Log.Debug ("Recvd {0} messages", results.Messages.Count); // Get the messages in reverse order; latest first ArrayList matched_ids = new ArrayList (results.Messages); matched_ids.Reverse (); const int MAX_QUEUED_HITS = 25; int left = Math.Min (maxhits, matched_ids.Count); ArrayList result_batch = new ArrayList (MAX_QUEUED_HITS); MailCollection emails; GMime.StreamMem stream; GMime.Parser parser; GMime.Message message; Hit hit; foreach (string id in matched_ids) { if (left -- == 0) break; Log.Debug ("Fetching headers for message id {0}", id); emails = imap_client.FetchMessages (id, id, false,true,false); if (emails == null || emails.Count == 0) { Log.Error ("IMAP error: {0}", imap_client.LastError); continue; } foreach (Mail m in emails) { hit = null; using (stream = new GMime.StreamMem (m.Header)) using (parser = new GMime.Parser (stream)) using (message = parser.ConstructMessage ()) hit = MessageToHit (message); if (hit == null) { Log.Error ("Bad IMAP email {0}: no msg-id", id); continue; } else { result_batch.Add (hit); } } if (result_batch.Count >= MAX_QUEUED_HITS) { result.Add (result_batch); result_batch.Clear (); } } result.Add (result_batch, matched_ids.Count); }
private void DoGMailQuery(string query, int maxhits, IQueryResult result) { Log.Debug("GMailSearchDriver: Searching for [{0}]", query); MessageSet results = imap_client.Search(query, false); if (results == null) { return; } Log.Debug("Recvd {0} messages", results.Messages.Count); // Get the messages in reverse order; latest first ArrayList matched_ids = new ArrayList(results.Messages); matched_ids.Reverse(); const int MAX_QUEUED_HITS = 25; int left = Math.Min(maxhits, matched_ids.Count); ArrayList result_batch = new ArrayList(MAX_QUEUED_HITS); MailCollection emails; GMime.StreamMem stream; GMime.Parser parser; GMime.Message message; Hit hit; foreach (string id in matched_ids) { if (left-- == 0) { break; } Log.Debug("Fetching headers for message id {0}", id); emails = imap_client.FetchMessages(id, id, false, true, false); if (emails == null || emails.Count == 0) { Log.Error("IMAP error: {0}", imap_client.LastError); continue; } foreach (Mail m in emails) { hit = null; using (stream = new GMime.StreamMem(m.Header)) using (parser = new GMime.Parser(stream)) using (message = parser.ConstructMessage()) hit = MessageToHit(message); if (hit == null) { Log.Error("Bad IMAP email {0}: no msg-id", id); continue; } else { result_batch.Add(hit); } } if (result_batch.Count >= MAX_QUEUED_HITS) { result.Add(result_batch); result_batch.Clear(); } } result.Add(result_batch, matched_ids.Count); }