From 895463f32f76d30a1a2dc465c5d3c3c752c5e10d Mon Sep 17 00:00:00 2001 From: "bienvenu%netscape.com" Date: Mon, 10 May 1999 23:25:37 +0000 Subject: [PATCH] more search and filter porting git-svn-id: svn://10.0.0.236/trunk@31040 18797224-902f-48f8-a5cc-f745e15eee43 --- .../base/search/public/nsIMsgFilterService.h | 12 +- .../base/search/public/nsIMsgSearchSession.h | 7 +- mozilla/mailnews/base/search/src/makefile.win | 4 +- .../mailnews/base/search/src/nsMsgFilter.cpp | 4 +- .../mailnews/base/search/src/nsMsgFilter.h | 10 +- .../base/search/src/nsMsgFilterList.cpp | 144 +++++++----------- .../base/search/src/nsMsgFilterList.h | 5 +- .../base/search/src/nsMsgFilterService.cpp | 12 ++ .../base/search/src/nsMsgFilterService.h | 12 ++ 9 files changed, 103 insertions(+), 107 deletions(-) diff --git a/mozilla/mailnews/base/search/public/nsIMsgFilterService.h b/mozilla/mailnews/base/search/public/nsIMsgFilterService.h index ae0c3dfd835..fa79b904b16 100644 --- a/mozilla/mailnews/base/search/public/nsIMsgFilterService.h +++ b/mozilla/mailnews/base/search/public/nsIMsgFilterService.h @@ -19,15 +19,15 @@ #ifndef _nsIMsgFilterService_H_ #define _nsIMsgFilterService_H_ -// The filter service is used to acquire and manipulate filter lists. -#define NS_IMSGFILTERSERVICE_IID \ -{ 0x5cbb0700, 0x04bc, 0x11d3, \ - { 0xa5, 0x0a, 0x0, 0x60, 0xb0, 0xfc, 0x04, 0xb7 } } - -// 5cbb0700-04bc-11d3-a50a-0060b0fc04b7 #include "nsISupports.h" +//6673cad0-072e-11d3-8d70-00805f8a6617 +#define NS_IMSGFILTERSERVICE_IID \ +{ 0x6673cad0, 0x072e, 0x11d3, \ + { 0x8d, 0x70, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x17 } } + + class nsIMsgFilterList; class nsIMsgFilterService : public nsISupports diff --git a/mozilla/mailnews/base/search/public/nsIMsgSearchSession.h b/mozilla/mailnews/base/search/public/nsIMsgSearchSession.h index 0c0eff207a4..8ae157187c0 100644 --- a/mozilla/mailnews/base/search/public/nsIMsgSearchSession.h +++ b/mozilla/mailnews/base/search/public/nsIMsgSearchSession.h @@ -24,16 +24,13 @@ class nsIMsgFolder; +#include "nsMsgBaseCID.h" + /* a819050a-0302-11d3-a50a-0060b0fc04b7 */ #define NS_IMSGSEARCHSESSION_IID \ { 0xa819050a, 0x0302, 0x11d3, \ { 0xa5, 0x0a, 0x0, 0x60, 0xb0, 0xfc, 0x04, 0xb7 } } -/* e9a7cd70-0303-11d3-a50a-0060b0fc04b7 */ -#define NS_IMSGSEARCHSESSION_CID \ -{ 0xe9a7cd70, 0x0303, 0x11d3, \ - { 0xa5, 0x0a, 0x0, 0x60, 0xb0, 0xfc, 0x04, 0xb7 } } - //////////////////////////////////////////////////////////////////////////////////////// // The Msg Search Session is an interface designed to make constructing searches // easier. Clients typically build up search terms, and then run the search diff --git a/mozilla/mailnews/base/search/src/makefile.win b/mozilla/mailnews/base/search/src/makefile.win index 49afe1e8fd7..befcb2701ec 100644 --- a/mozilla/mailnews/base/search/src/makefile.win +++ b/mozilla/mailnews/base/search/src/makefile.win @@ -20,7 +20,7 @@ IGNORE_MANIFEST=1 include <$(DEPTH)\config\config.mak> -LIBRARY_NAME=search +LIBRARY_NAME=msgsearch MODULE= mailnews REQUIRES= @@ -37,7 +37,7 @@ CPP_OBJS= .\$(OBJDIR)\nsMsgFilterService.obj \ $(NULL) -EXPORTS= \ +EXPORTS= nsMsgFilterService.h\ $(NULL) diff --git a/mozilla/mailnews/base/search/src/nsMsgFilter.cpp b/mozilla/mailnews/base/search/src/nsMsgFilter.cpp index 71aaf416952..d7d937a5d83 100644 --- a/mozilla/mailnews/base/search/src/nsMsgFilter.cpp +++ b/mozilla/mailnews/base/search/src/nsMsgFilter.cpp @@ -27,7 +27,7 @@ nsMsgFilter::nsMsgFilter() m_filterList = nsnull; } -nsMsgFilter::SetFilterList(nsMsgFilterList *filterList) +void nsMsgFilter::SetFilterList(nsMsgFilterList *filterList) { m_filterList = filterList; } @@ -35,7 +35,7 @@ nsMsgFilter::SetFilterList(nsMsgFilterList *filterList) nsresult nsMsgFilter::ConvertMoveToFolderValue(nsString2 &relativePath) { - m_action.m_value.m_folderName = relativePath; + m_action.m_folderName = relativePath; return NS_OK; // set m_action.m_value.m_folderName } diff --git a/mozilla/mailnews/base/search/src/nsMsgFilter.h b/mozilla/mailnews/base/search/src/nsMsgFilter.h index 0e3c3fabfa9..c6187fb608d 100644 --- a/mozilla/mailnews/base/search/src/nsMsgFilter.h +++ b/mozilla/mailnews/base/search/src/nsMsgFilter.h @@ -27,11 +27,9 @@ typedef struct nsMsgRuleAction { nsMsgRuleActionType m_type; - union - { - nsMsgPriority m_priority; /* priority to set rule to */ - nsString2 m_folderName; /* Or some folder identifier, if such a thing is invented */ - } m_value; + // this used to be a union - why bother? + nsMsgPriority m_priority; /* priority to set rule to */ + nsString2 m_folderName; /* Or some folder identifier, if such a thing is invented */ char *m_originalServerPath; } nsMsgRuleAction; @@ -94,7 +92,7 @@ public: PRInt16 GetVersion() {return (m_filterList) ? m_filterList->GetVersion() : 0;} nsMsgFilterList *GetFilterList() {return m_filterList;} void SetDontFileMe(PRBool bDontFileMe) {m_dontFileMe = bDontFileMe;} - nsMsgSearchTermArray GetTermList() {return m_termList;} /* linked list of criteria terms */ + nsMsgSearchTermArray* GetTermList() {return &m_termList;} /* linked list of criteria terms */ #ifdef DEBUG void Dump(); #endif diff --git a/mozilla/mailnews/base/search/src/nsMsgFilterList.cpp b/mozilla/mailnews/base/search/src/nsMsgFilterList.cpp index 9bb0e6a5454..6daac0d8b86 100644 --- a/mozilla/mailnews/base/search/src/nsMsgFilterList.cpp +++ b/mozilla/mailnews/base/search/src/nsMsgFilterList.cpp @@ -23,6 +23,7 @@ #include "nsMsgFilter.h" #include "nsFileStream.h" +#include "nsMsgUtils.h" const int16 kFileVersion = 6; const int16 kFileVersionOldMoveTarget = 5; @@ -37,10 +38,8 @@ nsMsgFilterList::nsMsgFilterList(nsIOFileStream *fileStream) m_fileStream = fileStream; // I don't know how we're going to report this error if we failed to create the isupports array... nsresult rv = NS_NewISupportsArray(getter_AddRefs(m_filters)); -} - -nsMsgFilterList::~nsMsgFilterList() -{ + m_loggingEnabled = PR_FALSE; + m_curFilter = nsnull; } #if 0 @@ -350,7 +349,17 @@ nsresult nsMsgFilterList::LoadTextFilters() if (m_curFilter->m_action.m_type == nsMsgFilterActionMoveToFolder) err = m_curFilter->ConvertMoveToFolderValue(value); else if (m_curFilter->m_action.m_type == nsMsgFilterActionChangePriority) - m_curFilter->SetAction(m_curFilter->m_action.m_type, (void *) (int32) MSG_GetPriorityFromString(value)); + { + nsMsgPriority outPriority; + nsresult res = NS_MsgGetPriorityFromString(value.GetBuffer(), &outPriority); + if (NS_SUCCEEDED(res)) + { + m_curFilter->SetAction(m_curFilter->m_action.m_type, (void *) (int32) outPriority); + } + else + NS_ASSERTION(PR_FALSE, "invalid priority in filter file"); + + } break; case nsMsgFilterAttribCondition: err = ParseCondition(value); @@ -401,7 +410,7 @@ nsresult nsMsgFilterList::ParseCondition(nsString2 &value) int termLen = curPtr - openParen - 1; termDup = (char *) PR_Malloc(termLen + 1); if (termDup) - PL_strcnpy(termDup, openParen + 1, termLen + 1); + PL_strncpy(termDup, openParen + 1, termLen + 1); else { err = NS_ERROR_OUT_OF_MEMORY; @@ -417,7 +426,7 @@ nsresult nsMsgFilterList::ParseCondition(nsString2 &value) if (newTerm) newTerm->m_booleanOp = ANDTerm ? nsMsgSearchBooleanAND : nsMsgSearchBooleanOR; if (newTerm->DeStreamNew(termDup, PL_strlen(termDup)) == NS_OK) - m_curFilter->GetTermList().Add(newTerm); + m_curFilter->GetTermList()->AppendElement(newTerm); PR_FREEIF(termDup); } else @@ -431,16 +440,16 @@ nsresult nsMsgFilterList::WriteIntAttr(nsMsgFilterFileAttrib attrib, int value) const char *attribStr = GetStringForAttrib(attrib); if (attribStr) { - m_fileStream >> attribStr; - m_fileStream >> "=\""; - m_fileStream >> value; - m_fileStream >> "\"" LINEBREAK; + *m_fileStream << attribStr; + *m_fileStream << "=\""; + *m_fileStream << value; + *m_fileStream << "\"" LINEBREAK; } // XP_FilePrintf(fid, "%s=\"%d\"%s", attribStr, value, LINEBREAK); return NS_OK; } -nsresult nsMsgFilterList::WriteStrAttr(nsMsgFilterAttrib attrib, const char *str) +nsresult nsMsgFilterList::WriteStrAttr(nsMsgFilterFileAttrib attrib, const char *str) { if (str && m_fileStream) // only proceed if we actually have a string to write out. { @@ -451,10 +460,10 @@ nsresult nsMsgFilterList::WriteStrAttr(nsMsgFilterAttrib attrib, const char *str const char *attribStr = GetStringForAttrib(attrib); if (attribStr) { - m_fileStream >> attribStr; - m_fileStream >> "=\""; - m_fileStream >> (escapedStr) ? escapedStr : str; - m_fileStream >> "\"" LINEBREAK; + *m_fileStream << attribStr; + *m_fileStream << "=\""; + *m_fileStream << ((escapedStr) ? escapedStr : str); + *m_fileStream << "\"" LINEBREAK; // XP_FilePrintf(fid, "%s=\"%s\"%s", attribStr, (escapedStr) ? escapedStr : str, LINEBREAK); } PR_FREEIF(escapedStr); @@ -462,7 +471,7 @@ nsresult nsMsgFilterList::WriteStrAttr(nsMsgFilterAttrib attrib, const char *str return NS_OK; } -nsresult nsMsgFilterList::WriteBoolAttr(nsMsgFilterAttrib attrib, PRBool boolVal) +nsresult nsMsgFilterList::WriteBoolAttr(nsMsgFilterFileAttrib attrib, PRBool boolVal) { return WriteStrAttr(attrib, (boolVal) ? "yes" : "no"); } @@ -479,10 +488,10 @@ nsresult nsMsgFilterList::SaveTextFilters() for (int i = 0; i < filterCount; i ++) { nsMsgFilter *filter; - if (GetFilterAt(i, &filter) == NS_OK && filter != nsnull) + if (GetMsgFilterAt(i, &filter) == NS_OK && filter != nsnull) { filter->SetFilterList(this); - if ((err = filter->SaveToTextFile(fid)) != NS_OK) + if ((err = filter->SaveToTextFile(m_fileStream)) != NS_OK) break; } else @@ -491,61 +500,16 @@ nsresult nsMsgFilterList::SaveTextFilters() return err; } -nsMsgFilterList::nsMsgFilterList() -{ - m_loggingEnabled = PR_FALSE; - m_curFilter = nsnull; -} - nsMsgFilterList::~nsMsgFilterList() { - for (int32 i = 0; i < m_filters->Count(); i++) + for (PRUint32 i = 0; i < m_filters->Count(); i++) { - nsMsgFilter *filter; + nsIMsgFilter *filter; if (GetFilterAt(i, &filter) == NS_OK) delete filter; } } -uint32 nsMsgFilterList::GetExpectedMagic () -{ - return m_expectedMagic; -} - -// What should we do about file errors here? If we blow away the -// filter list even when we have an error, we can't let the user -// correct the problem. But if we don't blow it away, we'll have -// memory leaks. -nsresult MSG_CloseFilterList(nsMsgFilterList *filterList) -{ - nsresult err; - - if (filterList == nsnull) - return NS_ERROR_NULL_POINTER; - - err = filterList->Close(); - if (err == NS_OK) - delete filterList; - return err; -} - -nsresult MSG_CancelFilterList(nsMsgFilterList *filterList) -{ - if (filterList == nsnull) - return NS_ERROR_NULL_POINTER; - - delete filterList; - return NS_OK; -} - -nsresult MSG_SaveFilterList(nsMsgFilterList *filterList) -{ - if (filterList == nsnull) - return NS_ERROR_NULL_POINTER; - - return filterList->Close(); -} - nsresult nsMsgFilterList::Close() { #ifdef HAVE_PORT @@ -590,33 +554,43 @@ nsresult nsMsgFilterList::GetFilterCount(PRInt32 *pCount) return NS_OK; } -nsresult nsMsgFilterList::GetFilterAt(PRUint32 filterIndex, nsIMsgFilter **filter) +nsresult nsMsgFilterList::GetMsgFilterAt(PRUint32 filterIndex, nsMsgFilter **filter) { - if (!m_filters->IsValidIndex(filterIndex)) - return FilterError_InvalidIndex; + + if (! (m_filters->Count() >= filterIndex)) + return NS_ERROR_INVALID_ARG; if (filter == nsnull) return NS_ERROR_NULL_POINTER; - *filter = (nsIMsgFilter *) m_filters->GetAt(filterIndex); + *filter = (nsMsgFilter *) m_filters->ElementAt(filterIndex); return NS_OK; } +nsresult nsMsgFilterList::GetFilterAt(PRUint32 filterIndex, nsIMsgFilter **filter) +{ + if (! (m_filters->Count() >= filterIndex)) + return NS_ERROR_INVALID_ARG; + if (filter == nsnull) + return NS_ERROR_NULL_POINTER; + *filter = (nsIMsgFilter *) m_filters->ElementAt(filterIndex); + return NS_OK; +} nsresult nsMsgFilterList::SetFilterAt(PRUint32 filterIndex, nsIMsgFilter *filter) { - m_filters->SetElementAtGrow(filterIndex, filter); + m_filters->ReplaceElementAt(filter, filterIndex); return NS_OK; } nsresult nsMsgFilterList::RemoveFilterAt(PRUint32 filterIndex) { - m_filters->RemoveAt(filterIndex, 1); + m_filters->RemoveElementAt(filterIndex); return NS_OK; } nsresult nsMsgFilterList::InsertFilterAt(PRUint32 filterIndex, nsIMsgFilter *filter) { - m_filters->InsertAt(filterIndex, filter); + m_filters->InsertElementAt(filter, filterIndex); return NS_OK; } @@ -628,27 +602,27 @@ nsresult nsMsgFilterList::MoveFilterAt(PRUint32 filterIndex, { nsIMsgFilter *tempFilter; - if (!m_filters->IsValidIndex(filterIndex)) - return FilterError_InvalidIndex; + if (! (m_filters->Count() >= filterIndex)) + return NS_ERROR_INVALID_ARG; - tempFilter = (nsIMsgFilter *) m_filters->GetAt(filterIndex); - if (motion == filterUp) + tempFilter = (nsIMsgFilter *) m_filters->ElementAt(filterIndex); + if (motion == nsMsgFilterUp) { if (filterIndex == 0) return NS_OK; - m_filters->SetElementAt(filterIndex, m_filters->GetAt(filterIndex - 1)); - m_filters->SetElementAt(filterIndex - 1, tempFilter); + m_filters->ReplaceElementAt(m_filters->ElementAt(filterIndex - 1), filterIndex); + m_filters->ReplaceElementAt(tempFilter, filterIndex - 1); } - else if (motion == filterDown) + else if (motion == nsMsgFilterDown) { if (filterIndex + 1 > (PRUint32) (m_filters->Count() - 1)) return NS_OK; - m_filters->SetElementAt(filterIndex, m_filters->GetAt(filterIndex + 1)); - m_filters->SetElementAt(filterIndex + 1, tempFilter); + m_filters->ReplaceElementAt(m_filters->ElementAt(filterIndex + 1), filterIndex); + m_filters->ReplaceElementAt(tempFilter, filterIndex + 1); } else { - return FilterError_InvalidMotion; + return NS_ERROR_INVALID_ARG; } return NS_OK; } @@ -660,8 +634,8 @@ void nsMsgFilterList::Dump() for (int32 i = 0; i < m_filters->Count(); i++) { - nsIMsgFilter *filter; - if (GetFilterAt(i, &filter) == NS_OK) + nsMsgFilter *filter; + if (GetMsgFilterAt(i, &filter) == NS_OK) filter->Dump(); } diff --git a/mozilla/mailnews/base/search/src/nsMsgFilterList.h b/mozilla/mailnews/base/search/src/nsMsgFilterList.h index a783ee69541..7ba18743aad 100644 --- a/mozilla/mailnews/base/search/src/nsMsgFilterList.h +++ b/mozilla/mailnews/base/search/src/nsMsgFilterList.h @@ -75,11 +75,14 @@ public: NS_IMETHOD CreateFilter(char *name, nsIMsgFilter **result); + nsresult Close(); nsresult LoadTextFilters(); PRInt16 GetVersion() {return m_fileVersion;} protected: - nsresult WriteIntAttr( nsMsgFilterFileAttrib attrib, int value); + // type-safe accessor when you really have to have an nsMsgFilter + nsresult GetMsgFilterAt(PRUint32 filterIndex, nsMsgFilter **filter); + nsresult WriteIntAttr( nsMsgFilterFileAttrib attrib, int value); nsresult WriteStrAttr(nsMsgFilterFileAttrib attrib, const char *str); nsresult WriteBoolAttr(nsMsgFilterFileAttrib attrib, XP_Bool boolVal); #ifdef DEBUG diff --git a/mozilla/mailnews/base/search/src/nsMsgFilterService.cpp b/mozilla/mailnews/base/search/src/nsMsgFilterService.cpp index 67cef9f7885..2111ed8cd04 100644 --- a/mozilla/mailnews/base/search/src/nsMsgFilterService.cpp +++ b/mozilla/mailnews/base/search/src/nsMsgFilterService.cpp @@ -26,6 +26,18 @@ NS_IMPL_ADDREF(nsMsgFilterService) NS_IMPL_RELEASE(nsMsgFilterService) +NS_BEGIN_EXTERN_C + +nsresult +NS_NewMsgFilterService(const nsIID& iid, void **result) +{ + nsMsgFilterService *ids = new nsMsgFilterService(); + return ids->QueryInterface(iid, result); +} + +NS_END_EXTERN_C + + NS_IMETHODIMP nsMsgFilterService::QueryInterface(REFNSIID aIID, void** aResult) { if (aResult == NULL) diff --git a/mozilla/mailnews/base/search/src/nsMsgFilterService.h b/mozilla/mailnews/base/search/src/nsMsgFilterService.h index a77c473bd9c..9b2e246411c 100644 --- a/mozilla/mailnews/base/search/src/nsMsgFilterService.h +++ b/mozilla/mailnews/base/search/src/nsMsgFilterService.h @@ -21,6 +21,18 @@ #include "nsIMsgFilterService.h" +//f5aacb00-072d-11d3-8d70-00805f8a6617 +#define NS_MSGFILTERSERVICE_CID \ +{ 0xf5aacb00, 0x072d, 0x11d3, \ + { 0x8d, 0x70, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x17 } } + +NS_BEGIN_EXTERN_C + +nsresult +NS_NewMsgFilterService(const nsIID& iid, void **result); + +NS_END_EXTERN_C + // The filter service is used to acquire and manipulate filter lists. class nsMsgFilterService : public nsIMsgFilterService