more search and filter porting

This commit is contained in:
bienvenu%netscape.com 1999-05-10 23:25:37 +00:00
Родитель b635b9a210
Коммит 7df9731d68
9 изменённых файлов: 103 добавлений и 107 удалений

Просмотреть файл

@ -19,15 +19,15 @@
#ifndef _nsIMsgFilterService_H_ #ifndef _nsIMsgFilterService_H_
#define _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" #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 nsIMsgFilterList;
class nsIMsgFilterService : public nsISupports class nsIMsgFilterService : public nsISupports

Просмотреть файл

@ -24,16 +24,13 @@
class nsIMsgFolder; class nsIMsgFolder;
#include "nsMsgBaseCID.h"
/* a819050a-0302-11d3-a50a-0060b0fc04b7 */ /* a819050a-0302-11d3-a50a-0060b0fc04b7 */
#define NS_IMSGSEARCHSESSION_IID \ #define NS_IMSGSEARCHSESSION_IID \
{ 0xa819050a, 0x0302, 0x11d3, \ { 0xa819050a, 0x0302, 0x11d3, \
{ 0xa5, 0x0a, 0x0, 0x60, 0xb0, 0xfc, 0x04, 0xb7 } } { 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 // The Msg Search Session is an interface designed to make constructing searches
// easier. Clients typically build up search terms, and then run the search // easier. Clients typically build up search terms, and then run the search

Просмотреть файл

@ -20,7 +20,7 @@ IGNORE_MANIFEST=1
include <$(DEPTH)\config\config.mak> include <$(DEPTH)\config\config.mak>
LIBRARY_NAME=search LIBRARY_NAME=msgsearch
MODULE= mailnews MODULE= mailnews
REQUIRES= REQUIRES=
@ -37,7 +37,7 @@ CPP_OBJS= .\$(OBJDIR)\nsMsgFilterService.obj \
$(NULL) $(NULL)
EXPORTS= \ EXPORTS= nsMsgFilterService.h\
$(NULL) $(NULL)

Просмотреть файл

@ -27,7 +27,7 @@ nsMsgFilter::nsMsgFilter()
m_filterList = nsnull; m_filterList = nsnull;
} }
nsMsgFilter::SetFilterList(nsMsgFilterList *filterList) void nsMsgFilter::SetFilterList(nsMsgFilterList *filterList)
{ {
m_filterList = filterList; m_filterList = filterList;
} }
@ -35,7 +35,7 @@ nsMsgFilter::SetFilterList(nsMsgFilterList *filterList)
nsresult nsMsgFilter::ConvertMoveToFolderValue(nsString2 &relativePath) nsresult nsMsgFilter::ConvertMoveToFolderValue(nsString2 &relativePath)
{ {
m_action.m_value.m_folderName = relativePath; m_action.m_folderName = relativePath;
return NS_OK; return NS_OK;
// set m_action.m_value.m_folderName // set m_action.m_value.m_folderName
} }

Просмотреть файл

@ -27,11 +27,9 @@
typedef struct nsMsgRuleAction typedef struct nsMsgRuleAction
{ {
nsMsgRuleActionType m_type; nsMsgRuleActionType m_type;
union // this used to be a union - why bother?
{
nsMsgPriority m_priority; /* priority to set rule to */ nsMsgPriority m_priority; /* priority to set rule to */
nsString2 m_folderName; /* Or some folder identifier, if such a thing is invented */ nsString2 m_folderName; /* Or some folder identifier, if such a thing is invented */
} m_value;
char *m_originalServerPath; char *m_originalServerPath;
} nsMsgRuleAction; } nsMsgRuleAction;
@ -94,7 +92,7 @@ public:
PRInt16 GetVersion() {return (m_filterList) ? m_filterList->GetVersion() : 0;} PRInt16 GetVersion() {return (m_filterList) ? m_filterList->GetVersion() : 0;}
nsMsgFilterList *GetFilterList() {return m_filterList;} nsMsgFilterList *GetFilterList() {return m_filterList;}
void SetDontFileMe(PRBool bDontFileMe) {m_dontFileMe = bDontFileMe;} 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 #ifdef DEBUG
void Dump(); void Dump();
#endif #endif

Просмотреть файл

@ -23,6 +23,7 @@
#include "nsMsgFilter.h" #include "nsMsgFilter.h"
#include "nsFileStream.h" #include "nsFileStream.h"
#include "nsMsgUtils.h"
const int16 kFileVersion = 6; const int16 kFileVersion = 6;
const int16 kFileVersionOldMoveTarget = 5; const int16 kFileVersionOldMoveTarget = 5;
@ -37,10 +38,8 @@ nsMsgFilterList::nsMsgFilterList(nsIOFileStream *fileStream)
m_fileStream = fileStream; m_fileStream = fileStream;
// I don't know how we're going to report this error if we failed to create the isupports array... // 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)); nsresult rv = NS_NewISupportsArray(getter_AddRefs(m_filters));
} m_loggingEnabled = PR_FALSE;
m_curFilter = nsnull;
nsMsgFilterList::~nsMsgFilterList()
{
} }
#if 0 #if 0
@ -350,7 +349,17 @@ nsresult nsMsgFilterList::LoadTextFilters()
if (m_curFilter->m_action.m_type == nsMsgFilterActionMoveToFolder) if (m_curFilter->m_action.m_type == nsMsgFilterActionMoveToFolder)
err = m_curFilter->ConvertMoveToFolderValue(value); err = m_curFilter->ConvertMoveToFolderValue(value);
else if (m_curFilter->m_action.m_type == nsMsgFilterActionChangePriority) 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; break;
case nsMsgFilterAttribCondition: case nsMsgFilterAttribCondition:
err = ParseCondition(value); err = ParseCondition(value);
@ -401,7 +410,7 @@ nsresult nsMsgFilterList::ParseCondition(nsString2 &value)
int termLen = curPtr - openParen - 1; int termLen = curPtr - openParen - 1;
termDup = (char *) PR_Malloc(termLen + 1); termDup = (char *) PR_Malloc(termLen + 1);
if (termDup) if (termDup)
PL_strcnpy(termDup, openParen + 1, termLen + 1); PL_strncpy(termDup, openParen + 1, termLen + 1);
else else
{ {
err = NS_ERROR_OUT_OF_MEMORY; err = NS_ERROR_OUT_OF_MEMORY;
@ -417,7 +426,7 @@ nsresult nsMsgFilterList::ParseCondition(nsString2 &value)
if (newTerm) if (newTerm)
newTerm->m_booleanOp = ANDTerm ? nsMsgSearchBooleanAND : nsMsgSearchBooleanOR; newTerm->m_booleanOp = ANDTerm ? nsMsgSearchBooleanAND : nsMsgSearchBooleanOR;
if (newTerm->DeStreamNew(termDup, PL_strlen(termDup)) == NS_OK) if (newTerm->DeStreamNew(termDup, PL_strlen(termDup)) == NS_OK)
m_curFilter->GetTermList().Add(newTerm); m_curFilter->GetTermList()->AppendElement(newTerm);
PR_FREEIF(termDup); PR_FREEIF(termDup);
} }
else else
@ -431,16 +440,16 @@ nsresult nsMsgFilterList::WriteIntAttr(nsMsgFilterFileAttrib attrib, int value)
const char *attribStr = GetStringForAttrib(attrib); const char *attribStr = GetStringForAttrib(attrib);
if (attribStr) if (attribStr)
{ {
m_fileStream >> attribStr; *m_fileStream << attribStr;
m_fileStream >> "=\""; *m_fileStream << "=\"";
m_fileStream >> value; *m_fileStream << value;
m_fileStream >> "\"" LINEBREAK; *m_fileStream << "\"" LINEBREAK;
} }
// XP_FilePrintf(fid, "%s=\"%d\"%s", attribStr, value, LINEBREAK); // XP_FilePrintf(fid, "%s=\"%d\"%s", attribStr, value, LINEBREAK);
return NS_OK; 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. 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); const char *attribStr = GetStringForAttrib(attrib);
if (attribStr) if (attribStr)
{ {
m_fileStream >> attribStr; *m_fileStream << attribStr;
m_fileStream >> "=\""; *m_fileStream << "=\"";
m_fileStream >> (escapedStr) ? escapedStr : str; *m_fileStream << ((escapedStr) ? escapedStr : str);
m_fileStream >> "\"" LINEBREAK; *m_fileStream << "\"" LINEBREAK;
// XP_FilePrintf(fid, "%s=\"%s\"%s", attribStr, (escapedStr) ? escapedStr : str, LINEBREAK); // XP_FilePrintf(fid, "%s=\"%s\"%s", attribStr, (escapedStr) ? escapedStr : str, LINEBREAK);
} }
PR_FREEIF(escapedStr); PR_FREEIF(escapedStr);
@ -462,7 +471,7 @@ nsresult nsMsgFilterList::WriteStrAttr(nsMsgFilterAttrib attrib, const char *str
return NS_OK; return NS_OK;
} }
nsresult nsMsgFilterList::WriteBoolAttr(nsMsgFilterAttrib attrib, PRBool boolVal) nsresult nsMsgFilterList::WriteBoolAttr(nsMsgFilterFileAttrib attrib, PRBool boolVal)
{ {
return WriteStrAttr(attrib, (boolVal) ? "yes" : "no"); return WriteStrAttr(attrib, (boolVal) ? "yes" : "no");
} }
@ -479,10 +488,10 @@ nsresult nsMsgFilterList::SaveTextFilters()
for (int i = 0; i < filterCount; i ++) for (int i = 0; i < filterCount; i ++)
{ {
nsMsgFilter *filter; nsMsgFilter *filter;
if (GetFilterAt(i, &filter) == NS_OK && filter != nsnull) if (GetMsgFilterAt(i, &filter) == NS_OK && filter != nsnull)
{ {
filter->SetFilterList(this); filter->SetFilterList(this);
if ((err = filter->SaveToTextFile(fid)) != NS_OK) if ((err = filter->SaveToTextFile(m_fileStream)) != NS_OK)
break; break;
} }
else else
@ -491,61 +500,16 @@ nsresult nsMsgFilterList::SaveTextFilters()
return err; return err;
} }
nsMsgFilterList::nsMsgFilterList()
{
m_loggingEnabled = PR_FALSE;
m_curFilter = nsnull;
}
nsMsgFilterList::~nsMsgFilterList() 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) if (GetFilterAt(i, &filter) == NS_OK)
delete filter; 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() nsresult nsMsgFilterList::Close()
{ {
#ifdef HAVE_PORT #ifdef HAVE_PORT
@ -590,33 +554,43 @@ nsresult nsMsgFilterList::GetFilterCount(PRInt32 *pCount)
return NS_OK; 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) if (filter == nsnull)
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
*filter = (nsIMsgFilter *) m_filters->GetAt(filterIndex); *filter = (nsMsgFilter *) m_filters->ElementAt(filterIndex);
return NS_OK; 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) nsresult nsMsgFilterList::SetFilterAt(PRUint32 filterIndex, nsIMsgFilter *filter)
{ {
m_filters->SetElementAtGrow(filterIndex, filter); m_filters->ReplaceElementAt(filter, filterIndex);
return NS_OK; return NS_OK;
} }
nsresult nsMsgFilterList::RemoveFilterAt(PRUint32 filterIndex) nsresult nsMsgFilterList::RemoveFilterAt(PRUint32 filterIndex)
{ {
m_filters->RemoveAt(filterIndex, 1); m_filters->RemoveElementAt(filterIndex);
return NS_OK; return NS_OK;
} }
nsresult nsMsgFilterList::InsertFilterAt(PRUint32 filterIndex, nsIMsgFilter *filter) nsresult nsMsgFilterList::InsertFilterAt(PRUint32 filterIndex, nsIMsgFilter *filter)
{ {
m_filters->InsertAt(filterIndex, filter); m_filters->InsertElementAt(filter, filterIndex);
return NS_OK; return NS_OK;
} }
@ -628,27 +602,27 @@ nsresult nsMsgFilterList::MoveFilterAt(PRUint32 filterIndex,
{ {
nsIMsgFilter *tempFilter; nsIMsgFilter *tempFilter;
if (!m_filters->IsValidIndex(filterIndex)) if (! (m_filters->Count() >= filterIndex))
return FilterError_InvalidIndex; return NS_ERROR_INVALID_ARG;
tempFilter = (nsIMsgFilter *) m_filters->GetAt(filterIndex); tempFilter = (nsIMsgFilter *) m_filters->ElementAt(filterIndex);
if (motion == filterUp) if (motion == nsMsgFilterUp)
{ {
if (filterIndex == 0) if (filterIndex == 0)
return NS_OK; return NS_OK;
m_filters->SetElementAt(filterIndex, m_filters->GetAt(filterIndex - 1)); m_filters->ReplaceElementAt(m_filters->ElementAt(filterIndex - 1), filterIndex);
m_filters->SetElementAt(filterIndex - 1, tempFilter); m_filters->ReplaceElementAt(tempFilter, filterIndex - 1);
} }
else if (motion == filterDown) else if (motion == nsMsgFilterDown)
{ {
if (filterIndex + 1 > (PRUint32) (m_filters->Count() - 1)) if (filterIndex + 1 > (PRUint32) (m_filters->Count() - 1))
return NS_OK; return NS_OK;
m_filters->SetElementAt(filterIndex, m_filters->GetAt(filterIndex + 1)); m_filters->ReplaceElementAt(m_filters->ElementAt(filterIndex + 1), filterIndex);
m_filters->SetElementAt(filterIndex + 1, tempFilter); m_filters->ReplaceElementAt(tempFilter, filterIndex + 1);
} }
else else
{ {
return FilterError_InvalidMotion; return NS_ERROR_INVALID_ARG;
} }
return NS_OK; return NS_OK;
} }
@ -660,8 +634,8 @@ void nsMsgFilterList::Dump()
for (int32 i = 0; i < m_filters->Count(); i++) for (int32 i = 0; i < m_filters->Count(); i++)
{ {
nsIMsgFilter *filter; nsMsgFilter *filter;
if (GetFilterAt(i, &filter) == NS_OK) if (GetMsgFilterAt(i, &filter) == NS_OK)
filter->Dump(); filter->Dump();
} }

Просмотреть файл

@ -75,10 +75,13 @@ public:
NS_IMETHOD CreateFilter(char *name, nsIMsgFilter **result); NS_IMETHOD CreateFilter(char *name, nsIMsgFilter **result);
nsresult Close();
nsresult LoadTextFilters(); nsresult LoadTextFilters();
PRInt16 GetVersion() {return m_fileVersion;} PRInt16 GetVersion() {return m_fileVersion;}
protected: protected:
// type-safe accessor when you really have to have an nsMsgFilter
nsresult GetMsgFilterAt(PRUint32 filterIndex, nsMsgFilter **filter);
nsresult WriteIntAttr( nsMsgFilterFileAttrib attrib, int value); nsresult WriteIntAttr( nsMsgFilterFileAttrib attrib, int value);
nsresult WriteStrAttr(nsMsgFilterFileAttrib attrib, const char *str); nsresult WriteStrAttr(nsMsgFilterFileAttrib attrib, const char *str);
nsresult WriteBoolAttr(nsMsgFilterFileAttrib attrib, XP_Bool boolVal); nsresult WriteBoolAttr(nsMsgFilterFileAttrib attrib, XP_Bool boolVal);

Просмотреть файл

@ -26,6 +26,18 @@
NS_IMPL_ADDREF(nsMsgFilterService) NS_IMPL_ADDREF(nsMsgFilterService)
NS_IMPL_RELEASE(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) NS_IMETHODIMP nsMsgFilterService::QueryInterface(REFNSIID aIID, void** aResult)
{ {
if (aResult == NULL) if (aResult == NULL)

Просмотреть файл

@ -21,6 +21,18 @@
#include "nsIMsgFilterService.h" #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. // The filter service is used to acquire and manipulate filter lists.
class nsMsgFilterService : public nsIMsgFilterService class nsMsgFilterService : public nsIMsgFilterService