From 35dcce26ded7fabe3204f81d9766214596b03898 Mon Sep 17 00:00:00 2001 From: "sspitzer%netscape.com" Date: Wed, 11 Sep 2002 05:03:36 +0000 Subject: [PATCH] fix for #161002. implement filter logging. add some UI for applying filters after the fact. code cleanup. r=mscott, sr=bienvenu --- mailnews/base/public/nsIMsgAccountManager.idl | 5 +- mailnews/base/public/nsIMsgIncomingServer.idl | 3 + .../content/msgFolderPickerOverlay.js | 56 ++++---- .../content/msgFolderPickerOverlay.xul | 58 +++++++++ mailnews/base/search/public/nsIMsgFilter.idl | 2 +- .../base/search/public/nsIMsgFilterList.idl | 11 +- .../resources/content/FilterListDialog.js | 113 +++++++++++++--- .../resources/content/FilterListDialog.xul | 25 +++- .../locale/en-US/FilterListDialog.dtd | 8 ++ mailnews/base/search/src/nsMsgFilter.cpp | 121 ++++++++++-------- mailnews/base/search/src/nsMsgFilterList.cpp | 118 ++++++++++++++--- mailnews/base/search/src/nsMsgFilterList.h | 56 ++++---- mailnews/base/src/nsMsgAccountManager.cpp | 43 +++++-- mailnews/base/src/nsMsgAccountManager.h | 3 +- mailnews/base/util/nsMsgIncomingServer.cpp | 20 ++- mailnews/imap/src/nsImapIncomingServer.cpp | 28 ++-- mailnews/imap/src/nsImapMailFolder.cpp | 22 +++- mailnews/local/src/nsLocalMailFolder.cpp | 4 +- mailnews/local/src/nsParseMailbox.cpp | 41 +----- mailnews/local/src/nsParseMailbox.h | 1 - mailnews/local/src/nsPop3IncomingServer.cpp | 1 + 21 files changed, 512 insertions(+), 227 deletions(-) diff --git a/mailnews/base/public/nsIMsgAccountManager.idl b/mailnews/base/public/nsIMsgAccountManager.idl index 793c591b93bb..78e5221e67df 100644 --- a/mailnews/base/public/nsIMsgAccountManager.idl +++ b/mailnews/base/public/nsIMsgAccountManager.idl @@ -162,12 +162,15 @@ interface nsIMsgAccountManager : nsISupports { void LoadAccounts(); void SetSpecialFoldersForIdentities(); + /* unload accounts frees all the account manager data structures */ void UnloadAccounts(); void WriteToFolderCache(in nsIMsgFolderCache folderCache); - void CloseCachedConnections(); + void closeCachedConnections(); + void shutdownServers(); + void CleanupOnExit(); void SetFolderDoingEmptyTrash(in nsIMsgFolder folder); boolean GetEmptyTrashInProgress(); diff --git a/mailnews/base/public/nsIMsgIncomingServer.idl b/mailnews/base/public/nsIMsgIncomingServer.idl index d46999bb7632..5ab76cb327b7 100644 --- a/mailnews/base/public/nsIMsgIncomingServer.idl +++ b/mailnews/base/public/nsIMsgIncomingServer.idl @@ -198,6 +198,9 @@ interface nsIMsgIncomingServer : nsISupports { /* close any server connections */ void CloseCachedConnections(); + + /* ... */ + void shutdown(); /* access to generic attributes */ boolean getBoolValue(in string attr); diff --git a/mailnews/base/resources/content/msgFolderPickerOverlay.js b/mailnews/base/resources/content/msgFolderPickerOverlay.js index a5bf2a342895..8a31902036cf 100644 --- a/mailnews/base/resources/content/msgFolderPickerOverlay.js +++ b/mailnews/base/resources/content/msgFolderPickerOverlay.js @@ -21,6 +21,7 @@ * * Contributor(s): * Alec Flett + * Seth Spitzer * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -80,38 +81,41 @@ function MsgFolderPickerOnLoad(pickerID) function PickedMsgFolder(selection,pickerID) { - var selectedUri = selection.getAttribute('id'); - SetFolderPicker(selectedUri,pickerID); + var selectedUri = selection.getAttribute('id'); + SetFolderPicker(selectedUri,pickerID); } function SetFolderPicker(uri,pickerID) { - if (!gMessengerBundle) - gMessengerBundle = document.getElementById("bundle_messenger"); + var picker = document.getElementById(pickerID); + var msgfolder = GetMsgFolderFromUri(uri, true); - var picker = document.getElementById(pickerID); - var msgfolder = GetMsgFolderFromUri(uri, true); + if (!msgfolder) + return; - if (!msgfolder) return; + var selectedValue = null; + var serverName; - var selectedValue = null; - var serverName; + if (msgfolder.isServer) + selectedValue = msgfolder.name; + else { + if (msgfolder.server) + serverName = msgfolder.server.prettyName; + else { + dump("Can't find server for " + uri + "\n"); + serverName = "???"; + } + + if (pickerID == "runFiltersFolder") + selectedValue = msgfolder.name; + else { + if (!gMessengerBundle) + gMessengerBundle = document.getElementById("bundle_messenger"); + selectedValue = gMessengerBundle.getFormattedString("verboseFolderFormat", + [msgfolder.name, serverName]); + } + } - if (msgfolder.isServer) - selectedValue = msgfolder.name; - else { - if (msgfolder.server) - serverName = msgfolder.server.prettyName; - else { - dump("Cant' find server for " + uri + "\n"); - serverName = "???"; - } - - selectedValue = gMessengerBundle.getFormattedString("verboseFolderFormat", - [msgfolder.name, - serverName]); - } - - picker.setAttribute("label",selectedValue); - picker.setAttribute("uri",uri); + picker.setAttribute("label",selectedValue); + picker.setAttribute("uri",uri); } diff --git a/mailnews/base/resources/content/msgFolderPickerOverlay.xul b/mailnews/base/resources/content/msgFolderPickerOverlay.xul index 38c37ec58ef6..79dee960358e 100644 --- a/mailnews/base/resources/content/msgFolderPickerOverlay.xul +++ b/mailnews/base/resources/content/msgFolderPickerOverlay.xul @@ -425,6 +425,7 @@ Rights Reserved. + + + + + + diff --git a/mailnews/base/search/public/nsIMsgFilter.idl b/mailnews/base/search/public/nsIMsgFilter.idl index 14b4b2fd8b55..7ae5bc50f1c0 100644 --- a/mailnews/base/search/public/nsIMsgFilter.idl +++ b/mailnews/base/search/public/nsIMsgFilter.idl @@ -101,7 +101,7 @@ interface nsIMsgFilter : nsISupports { // [array, size_is(headerSize)] in string headers, in unsigned long headerSize, out boolean result); - void LogRuleHit(in nsOutputStream stream, in nsIMsgDBHdr header); + void logRuleHit(in nsIMsgDBHdr header); }; diff --git a/mailnews/base/search/public/nsIMsgFilterList.idl b/mailnews/base/search/public/nsIMsgFilterList.idl index 518bb21f204a..f1e8d8093aa5 100644 --- a/mailnews/base/search/public/nsIMsgFilterList.idl +++ b/mailnews/base/search/public/nsIMsgFilterList.idl @@ -20,6 +20,7 @@ * the Initial Developer. All Rights Reserved. * * Contributor(s): + * Seth Spitzer * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -41,6 +42,7 @@ #include "nsIMsgFilterHitNotify.idl" interface nsIOFileStream; +interface nsIOutputStream; /////////////////////////////////////////////////////////////////////////////// // The Msg Filter List is an interface designed to make accessing filter lists @@ -68,7 +70,7 @@ interface nsIMsgFilterList : nsISupports { attribute nsIMsgFolder folder; readonly attribute short version; - readonly attribute string arbitraryHeaders; + readonly attribute string arbitraryHeaders; readonly attribute boolean shouldDownloadAllHeaders; readonly attribute unsigned long filterCount; nsIMsgFilter getFilterAt(in unsigned long filterIndex); @@ -111,14 +113,15 @@ interface nsIMsgFilterList : nsISupports { in nsIMsgFilterHitNotify listener, in nsIMsgWindow msgWindow); - // IO routines, used by filter object filing code. - + // IO routines, used by filter object filing code. void writeIntAttr(in nsMsgFilterFileAttribValue attrib, in long value, in nsIOFileStream stream); void writeStrAttr(in nsMsgFilterFileAttribValue attrib, in string value, in nsIOFileStream stream); void writeWstrAttr(in nsMsgFilterFileAttribValue attrib, in wstring value, in nsIOFileStream stream); void writeBoolAttr(in nsMsgFilterFileAttribValue attrib, in boolean value, in nsIOFileStream stream); boolean matchOrChangeFilterTarget(in string oldUri, in string newUri, in boolean caseInsensitive); - + + attribute nsIOutputStream logStream; + readonly attribute string logURL; }; diff --git a/mailnews/base/search/resources/content/FilterListDialog.js b/mailnews/base/search/resources/content/FilterListDialog.js index b349046abb28..3daea9106ae2 100644 --- a/mailnews/base/search/resources/content/FilterListDialog.js +++ b/mailnews/base/search/resources/content/FilterListDialog.js @@ -24,6 +24,9 @@ var editButton; var deleteButton; var reorderUpButton; var reorderDownButton; +var runFiltersButton; +var runFiltersFolderPickerLabel; +var runFiltersFolderPicker; const nsMsgFilterMotion = Components.interfaces.nsMsgFilterMotion; @@ -51,11 +54,12 @@ function onLoad() deleteButton = document.getElementById("deleteButton"); reorderUpButton = document.getElementById("reorderUpButton"); reorderDownButton = document.getElementById("reorderDownButton"); + runFiltersButton = document.getElementById("runFiltersButton"); + runFiltersFolderPickerLabel = document.getElementById("onLabel"); + runFiltersFolderPicker = document.getElementById("runFiltersFolder"); updateButtons(); - moveToAlertPosition(); - // get the selected server if it can have filters. var firstItem = getSelectedServerForFilters(); @@ -111,16 +115,14 @@ function onCancel() function onServerClick(event) { var item = event.target; - - // don't check this in. - setTimeout("setServer(\"" + item.id + "\");", 0); + setServer(item.id, true); } // roots the tree at the specified server -function setServer(uri) +function setServer(uri, rebuild) { var resource = rdf.GetResource(uri); - var msgFolder = resource.QueryInterface(Components.interfaces.nsIMsgFolder); + var msgFolder = resource.QueryInterface(Components.interfaces.nsIMsgFolder); //Calling getFilterList will detect any errors in rules.dat, backup the file, and alert the user //we need to do this because gFilterTree.setAttribute will cause rdf to call getFilterList and there is @@ -129,8 +131,32 @@ function setServer(uri) if (msgFolder) msgFolder.getFilterList(gFilterListMsgWindow); - gFilterTree.setAttribute("ref", uri); - updateButtons(); + gFilterTree.setAttribute("ref", uri); + + // root the folder picker to this server + runFiltersFolderPicker.setAttribute("ref", uri); + // select the first folder., for POP3 and IMAP, the INBOX + runFiltersFolderPicker.selectedIndex = 0; + SetFolderPicker(runFiltersFolderPicker.selectedItem.getAttribute("id"),"runFiltersFolder"); + + // rebuild tree, since we changed the uri, and clear selection + if (rebuild) { + gFilterTree.view.selection.clearSelection(); + gFilterTree.builder.rebuild(); + } + + var logFilters = document.getElementById("logFilters"); + var curFilterList = currentFilterList(); + logFilters.checked = curFilterList.loggingEnabled; + + updateButtons(); +} + +function toggleLogFilters() +{ + var logFilters = document.getElementById("logFilters"); + var curFilterList = currentFilterList(); + curFilterList.loggingEnabled = logFilters.checked; } function toggleFilter(aFilterURI) @@ -149,19 +175,28 @@ function selectServer(uri) var serverMenu = document.getElementById("serverMenu"); var menuitems = serverMenu.getElementsByAttribute("id", uri); serverMenu.selectedItem = menuitems[0]; - setServer(uri); + setServer(uri, false); +} + +function getFilter(index) +{ + var filter = gFilterTree.builderView.getResourceAtIndex(index); + filter = filter.GetDelegate("filter", Components.interfaces.nsIMsgFilter); + return filter; } function currentFilter() { - if (gFilterTree.currentIndex == -1) - return null; + var currentIndex = gFilterTree.currentIndex; + if (currentIndex == -1) + return null; var filter; + try { - filter = gFilterTree.builderView.getResourceAtIndex(gFilterTree.currentIndex); - filter = filter.GetDelegate("filter", Components.interfaces.nsIMsgFilter); + filter = getFilter(currentIndex); } catch (ex) { + filter = null; } return filter; } @@ -225,6 +260,30 @@ function onDown(event) moveCurrentFilter(nsMsgFilterMotion.down); } +function viewLog() +{ + var uri = gFilterTree.getAttribute("ref"); + var server = rdf.GetResource(uri).QueryInterface(Components.interfaces.nsIMsgFolder).server; + + var filterList = currentFilterList(); + openTopWin(filterList.logURL); +} + +function runSelectedFilters() +{ + var folderURI = runFiltersFolderPicker.getAttribute("uri"); + + var sel = gFilterTree.view.selection; + for (var i = 0; i < sel.getRangeCount(); i++) { + var start = {}, end = {}; + sel.getRangeAt(i, start, end); + for (var j = start.value; j <= end.value; j++) { + var filter = getFilter(j); + alert("run filter " + filter.filterName + " on " + folderURI); + } + } +} + function moveCurrentFilter(motion) { var filterList = currentFilterList(); @@ -244,7 +303,7 @@ function refreshFilterList() // store the selected resource before we rebuild the tree var selectedRes = gFilterTree.currentIndex >= 0 ? gFilterTree.builderView.getResourceAtIndex(gFilterTree.currentIndex) : null; - // rebuild the tree + // rebuild the tree gFilterTree.view.selection.clearSelection(); gFilterTree.builder.rebuild(); @@ -261,11 +320,23 @@ function refreshFilterList() function updateButtons() { - var filterSelected = gFilterTree.view.selection.count > 0; - editButton.disabled = !filterSelected; - deleteButton.disabled = !filterSelected; - reorderUpButton.disabled = !(filterSelected && gFilterTree.currentIndex > 0); - reorderDownButton.disabled = !(filterSelected && gFilterTree.currentIndex < gFilterTree.view.rowCount-1); + var numFiltersSelected = gFilterTree.view.selection.count; + var oneFilterSelected = (numFiltersSelected == 1); + + // "edit" and "delete" only enabled when one filter selected + editButton.disabled = !oneFilterSelected; + deleteButton.disabled = !oneFilterSelected; + + // we can run multiple filters on a folder + // so only disable this UI if no filters are selected + runFiltersButton.disabled = !numFiltersSelected; + runFiltersFolderPickerLabel.disabled = !numFiltersSelected; + runFiltersFolderPicker.disabled = !numFiltersSelected; + + // "up" enabled only if one filter selected, and it's not the first + reorderUpButton.disabled = !(oneFilterSelected && gFilterTree.currentIndex > 0); + // "down" enabled only if one filter selected, and it's not the last + reorderDownButton.disabled = !(oneFilterSelected && gFilterTree.currentIndex < gFilterTree.view.rowCount-1); } /** @@ -390,4 +461,4 @@ function doHelpButton() openHelp("mail-filters"); } - \ No newline at end of file + diff --git a/mailnews/base/search/resources/content/FilterListDialog.xul b/mailnews/base/search/resources/content/FilterListDialog.xul index ad2b61d4c0ec..49d09396b77a 100644 --- a/mailnews/base/search/resources/content/FilterListDialog.xul +++ b/mailnews/base/search/resources/content/FilterListDialog.xul @@ -19,13 +19,15 @@ Communications Corporation. Portions created by Netscape are Rights Reserved. Contributor(s): Hkan Waara - + Seth Spitzer --> - + + +