From cbf9b89773cdffbe783d3c73021fa6ea8fd14b75 Mon Sep 17 00:00:00 2001 From: "bienvenu%netscape.com" Date: Sat, 23 Nov 2002 18:50:00 +0000 Subject: [PATCH] make local msg body search not lock up ui, remove unused code, r=naving, sr=sspitzer 127398 git-svn-id: svn://10.0.0.236/trunk@134369 18797224-902f-48f8-a5cc-f745e15eee43 --- .../base/search/src/nsMsgLocalSearch.cpp | 296 +++++------------- .../base/search/src/nsMsgLocalSearch.h | 12 - 2 files changed, 73 insertions(+), 235 deletions(-) diff --git a/mozilla/mailnews/base/search/src/nsMsgLocalSearch.cpp b/mozilla/mailnews/base/search/src/nsMsgLocalSearch.cpp index 875b0e9ea8c..10dd06a6e5a 100644 --- a/mozilla/mailnews/base/search/src/nsMsgLocalSearch.cpp +++ b/mozilla/mailnews/base/search/src/nsMsgLocalSearch.cpp @@ -261,59 +261,6 @@ void nsMsgSearchBoolExpression::GenerateEncodeStr(nsCString * buffer) } - -//---------------- Adapter class for searching offline IMAP folders ----------- -//----------------------------------------------------------------------------- - -nsMsgSearchIMAPOfflineMail::nsMsgSearchIMAPOfflineMail (nsIMsgSearchScopeTerm *scope, nsISupportsArray *termList) : nsMsgSearchOfflineMail(scope, termList) -{ -} - - -nsMsgSearchIMAPOfflineMail::~nsMsgSearchIMAPOfflineMail() -{ - -} - -nsresult nsMsgSearchIMAPOfflineMail::ValidateTerms () -{ - // most of this was copied from MSG_SearchOffline::ValidateTerms()....Difference: When using IMAP offline, we do not - // have a mail folder to validate. - - nsresult err = NS_OK; -#ifdef HAVE_SEARCH_PORT - err = nsMsgSearchOfflineMail::ValidateTerms (); - if (NS_OK == err) - { - // Mail folder must exist. Don't worry about the summary file now since we may - // have to regenerate the index later -// XP_StatStruct fileStatus; -// if (!XP_Stat (m_scope->GetMailPath(), &fileStatus, xpMailFolder)) -// { - // Make sure the terms themselves are valid - nsCOMPtr validityManager = - do_GetService(NS_MSGSEARCHVALIDITYMANAGER_CONTRACTID, &err); - - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr table; - err = validityManager->GetTable (nsMsgSearchValidityManager::offlineMail, - getter_AddRefs(table)); - if (NS_OK == err) - { - NS_ASSERTION (table, "found validity table"); - err = table->ValidateTerms (m_searchTerms); - } -// } -// else -// NS_ASSERTION(0); - } -#endif - return err; -} - - - //----------------------------------------------------------------------------- //---------------- Adapter class for searching offline folders ---------------- //----------------------------------------------------------------------------- @@ -339,33 +286,6 @@ nsresult nsMsgSearchOfflineMail::ValidateTerms () { nsresult err = NS_OK; err = nsMsgSearchAdapter::ValidateTerms (); -#ifdef HAVE_SEARCH_PORT - if (NS_OK == err) - { - // Mail folder must exist. Don't worry about the summary file now since we may - // have to regenerate the index later - XP_StatStruct fileStatus; - if (!XP_Stat (m_scope->GetMailPath(), &fileStatus, xpMailFolder)) - { - // Make sure the terms themselves are valid - nsCOMPtr validityManager = - do_GetService(NS_MSGSEARCHVALIDITYMANAGER_CONTRACTID, &err); - - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr table; - err = validityManager->GetTable(nsMsgSearchValidityManager::offlineMail, - getter_AddRefs(table)); - if (NS_OK == err) - { - NS_ASSERTION (table, "didn't get validity table"); - err = table->ValidateTerms (m_searchTerms); - } - } - else - NS_ASSERTION(PR_FALSE, "local folder doesn't exist"); - } -#endif // HAVE_SEARCH_PORT return err; } @@ -426,80 +346,6 @@ nsresult nsMsgSearchOfflineMail::OpenSummaryFile () } -nsresult nsMsgSearchOfflineMail::BuildSummaryFile () -{ - // State machine for rebuilding the summary file asynchronously in the - // middle of the already-asynchronous search. - - // ### This would be much better done with a url queue or at least chained urls. - // I'm not sure if that's possible, however. - nsresult err = NS_OK; -#ifdef HAVE_SEARCH_PORT - int mkErr = 0; - switch (m_parserState) - { - case kOpenFolderState: - mkErr = m_mailboxParser->BeginOpenFolderSock (m_scope->GetMailPath(), nsnull, 0, nsnull); - if (mkErr == MK_WAITING_FOR_CONNECTION) - m_parserState++; - else - err = SummaryFileError(); - break; - case kParseMoreState: - mkErr = m_mailboxParser->ParseMoreFolderSock (m_scope->GetMailPath(), nsnull, 0, nsnull); - if (mkErr == MK_CONNECTED) - m_parserState++; - else - if (mkErr != MK_WAITING_FOR_CONNECTION) - err = SummaryFileError(); - break; - case kCloseFolderState: - m_mailboxParser->CloseFolderSock (nsnull, nsnull, 0, nsnull); - if (!m_mailboxParser->GetIsRealMailFolder()) - { - // mailbox parser has already closed the db (right?) - NS_ASSERTION(m_mailboxParser->GetDB() == 0, "parser hasn't closed DB"); - m_db = nsnull; - err = SearchError_ScopeDone; - } - delete m_mailboxParser; - m_mailboxParser = nsnull; - // Put our regular "searching Inbox..." status text back up - m_scope->m_frame->UpdateStatusBar(MK_nsMsgSearch_STATUS); - break; - } -#endif // HAVE_SEARCH_PORT - return err; -} - - -nsresult nsMsgSearchOfflineMail::SummaryFileError () -{ -#ifdef HAVE_SEARCH_PORT - char *errTemplate = XP_GetString(MK_MSG_CANT_SEARCH_IF_NO_SUMMARY); - if (errTemplate) - { - char *prompt = PR_smprintf (errTemplate, m_scope->m_folder->GetName()); - if (prompt) - { - FE_Alert (m_scope->m_frame->GetContext(), prompt); - XP_FREE(prompt); - } - } - - // If we got a summary file error while parsing, clean up all the parser state - if (m_mailboxParser) - { - m_mailboxParser->CloseFolderSock (nsnull, nsnull, 0, nsnull); - delete m_mailboxParser; - m_mailboxParser = nsnull; - m_db = nsnull; - } - -#endif // HAVE_SEARCH_PORT - return NS_OK;// SearchError_ScopeDone; -} - nsresult nsMsgSearchOfflineMail::MatchTermsForFilter(nsIMsgDBHdr *msgToMatch, nsISupportsArray *termList, @@ -801,8 +647,7 @@ nsresult nsMsgSearchOfflineMail::Search (PRBool *aDone) nsresult dbErr = NS_OK; nsCOMPtr msgDBHdr; - const PRInt32 kNumHdrsInSlice = 500; - + const PRUint32 kTimeSliceInMS = 200; *aDone = PR_FALSE; // Try to open the DB lazily. This will set up a parser if one is required @@ -818,7 +663,8 @@ nsresult nsMsgSearchOfflineMail::Search (PRBool *aDone) dbErr = m_db->EnumerateMessages (getter_AddRefs(m_listContext)); if (NS_SUCCEEDED(dbErr) && m_listContext) { - for (PRInt32 hdrIndex = 0; !*aDone && hdrIndex < kNumHdrsInSlice; hdrIndex++) + PRIntervalTime startTime = PR_IntervalNow(); + while (!*aDone) // we'll break out of the loop after kTimeSliceInMS milliseconds { nsCOMPtr currentItem; @@ -842,7 +688,11 @@ nsresult nsMsgSearchOfflineMail::Search (PRBool *aDone) { AddResultElement (msgDBHdr); } - // m_scope->m_frame->IncrementOfflineProgress(); + PRIntervalTime elapsedTime; + LL_SUB(elapsedTime, PR_IntervalNow(), startTime); + // check if more than kTimeSliceInMS milliseconds have elapsed in this time slice started + if (PR_IntervalToMilliseconds(elapsedTime) > kTimeSliceInMS) + break; } } } @@ -953,72 +803,72 @@ nsresult nsMsgSearchOfflineNews::ValidateTerms () //----------------------------------------------------------------------------- nsresult nsMsgSearchValidityManager::InitLocalNewsTable() { - NS_ASSERTION (nsnull == m_localNewsTable, "already have local news validty table"); - nsresult err = NewTable (getter_AddRefs(m_localNewsTable)); - - if (NS_SUCCEEDED(err)) - { - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Sender, nsMsgSearchOp::Contains, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Sender, nsMsgSearchOp::Contains, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Sender, nsMsgSearchOp::Is, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Sender, nsMsgSearchOp::Is, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Sender, nsMsgSearchOp::BeginsWith, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Sender, nsMsgSearchOp::BeginsWith, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Sender, nsMsgSearchOp::EndsWith, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Sender, nsMsgSearchOp::EndsWith, 1); - - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Subject, nsMsgSearchOp::Contains, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Subject, nsMsgSearchOp::Contains, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Subject, nsMsgSearchOp::Is, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Subject, nsMsgSearchOp::Is, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Subject, nsMsgSearchOp::BeginsWith, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Subject, nsMsgSearchOp::BeginsWith, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Subject, nsMsgSearchOp::EndsWith, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Subject, nsMsgSearchOp::EndsWith, 1); - - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Body, nsMsgSearchOp::Contains, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Body, nsMsgSearchOp::Contains, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Body, nsMsgSearchOp::DoesntContain, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Body, nsMsgSearchOp::DoesntContain, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Body, nsMsgSearchOp::Is, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Body, nsMsgSearchOp::Is, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Body, nsMsgSearchOp::Isnt, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Body, nsMsgSearchOp::Isnt, 1); - - - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Date, nsMsgSearchOp::IsBefore, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Date, nsMsgSearchOp::IsAfter, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Date, nsMsgSearchOp::IsAfter, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Date, nsMsgSearchOp::Is, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Date, nsMsgSearchOp::Is, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Date, nsMsgSearchOp::Isnt, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Date, nsMsgSearchOp::Isnt, 1); - - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::AgeInDays, nsMsgSearchOp::IsGreaterThan, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::AgeInDays, nsMsgSearchOp::IsGreaterThan, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::AgeInDays, nsMsgSearchOp::IsLessThan, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::AgeInDays, nsMsgSearchOp::IsLessThan, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::AgeInDays, nsMsgSearchOp::Is, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::AgeInDays, nsMsgSearchOp::Is, 1); - - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::MsgStatus, nsMsgSearchOp::Is, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::MsgStatus, nsMsgSearchOp::Is, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::MsgStatus, nsMsgSearchOp::Isnt, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::MsgStatus, nsMsgSearchOp::Isnt, 1); - + NS_ASSERTION (nsnull == m_localNewsTable, "already have local news validty table"); + nsresult err = NewTable (getter_AddRefs(m_localNewsTable)); + + if (NS_SUCCEEDED(err)) + { + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Sender, nsMsgSearchOp::Contains, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Sender, nsMsgSearchOp::Contains, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Sender, nsMsgSearchOp::Is, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Sender, nsMsgSearchOp::Is, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Sender, nsMsgSearchOp::BeginsWith, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Sender, nsMsgSearchOp::BeginsWith, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Sender, nsMsgSearchOp::EndsWith, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Sender, nsMsgSearchOp::EndsWith, 1); + + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Subject, nsMsgSearchOp::Contains, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Subject, nsMsgSearchOp::Contains, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Subject, nsMsgSearchOp::Is, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Subject, nsMsgSearchOp::Is, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Subject, nsMsgSearchOp::BeginsWith, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Subject, nsMsgSearchOp::BeginsWith, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Subject, nsMsgSearchOp::EndsWith, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Subject, nsMsgSearchOp::EndsWith, 1); + + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Body, nsMsgSearchOp::Contains, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Body, nsMsgSearchOp::Contains, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Body, nsMsgSearchOp::DoesntContain, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Body, nsMsgSearchOp::DoesntContain, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Body, nsMsgSearchOp::Is, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Body, nsMsgSearchOp::Is, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Body, nsMsgSearchOp::Isnt, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Body, nsMsgSearchOp::Isnt, 1); + + + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Date, nsMsgSearchOp::IsBefore, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Date, nsMsgSearchOp::IsAfter, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Date, nsMsgSearchOp::IsAfter, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Date, nsMsgSearchOp::Is, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Date, nsMsgSearchOp::Is, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::Date, nsMsgSearchOp::Isnt, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::Date, nsMsgSearchOp::Isnt, 1); + + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::AgeInDays, nsMsgSearchOp::IsGreaterThan, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::AgeInDays, nsMsgSearchOp::IsGreaterThan, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::AgeInDays, nsMsgSearchOp::IsLessThan, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::AgeInDays, nsMsgSearchOp::IsLessThan, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::AgeInDays, nsMsgSearchOp::Is, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::AgeInDays, nsMsgSearchOp::Is, 1); + + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::MsgStatus, nsMsgSearchOp::Is, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::MsgStatus, nsMsgSearchOp::Is, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::MsgStatus, nsMsgSearchOp::Isnt, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::MsgStatus, nsMsgSearchOp::Isnt, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::OtherHeader, nsMsgSearchOp::Contains, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::OtherHeader, nsMsgSearchOp::Contains, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::OtherHeader, nsMsgSearchOp::Is, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::OtherHeader, nsMsgSearchOp::Is, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::OtherHeader, nsMsgSearchOp::BeginsWith, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::OtherHeader, nsMsgSearchOp::BeginsWith, 1); - m_localNewsTable->SetAvailable (nsMsgSearchAttrib::OtherHeader, nsMsgSearchOp::EndsWith, 1); - m_localNewsTable->SetEnabled (nsMsgSearchAttrib::OtherHeader, nsMsgSearchOp::EndsWith, 1); - - - } - - return err; + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::OtherHeader, nsMsgSearchOp::Contains, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::OtherHeader, nsMsgSearchOp::Is, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::OtherHeader, nsMsgSearchOp::Is, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::OtherHeader, nsMsgSearchOp::BeginsWith, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::OtherHeader, nsMsgSearchOp::BeginsWith, 1); + m_localNewsTable->SetAvailable (nsMsgSearchAttrib::OtherHeader, nsMsgSearchOp::EndsWith, 1); + m_localNewsTable->SetEnabled (nsMsgSearchAttrib::OtherHeader, nsMsgSearchOp::EndsWith, 1); + + + } + + return err; } diff --git a/mozilla/mailnews/base/search/src/nsMsgLocalSearch.h b/mozilla/mailnews/base/search/src/nsMsgLocalSearch.h index 015c7d97308..8d920474775 100644 --- a/mozilla/mailnews/base/search/src/nsMsgLocalSearch.h +++ b/mozilla/mailnews/base/search/src/nsMsgLocalSearch.h @@ -81,9 +81,7 @@ public: nsIMsgSearchScopeTerm *scope, nsIMsgDatabase *db, PRBool *pResult); - virtual nsresult BuildSummaryFile (); virtual nsresult OpenSummaryFile (); - nsresult SummaryFileError(); protected: static nsresult MatchTerms(nsIMsgDBHdr *msgToMatch, @@ -122,16 +120,6 @@ protected: void CleanUpScope(); }; -class nsMsgSearchIMAPOfflineMail : public nsMsgSearchOfflineMail -{ -public: - nsMsgSearchIMAPOfflineMail (nsIMsgSearchScopeTerm*, nsISupportsArray *); - virtual ~nsMsgSearchIMAPOfflineMail (); - - NS_IMETHOD ValidateTerms (); -}; - - class nsMsgSearchOfflineNews : public nsMsgSearchOfflineMail {