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);
		}
Esempio n. 2
0
        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);
        }