diff --git a/mailnews/base/public/nsISpamSettings.idl b/mailnews/base/public/nsISpamSettings.idl index f563a01550eb..6851ff6827ad 100644 --- a/mailnews/base/public/nsISpamSettings.idl +++ b/mailnews/base/public/nsISpamSettings.idl @@ -13,7 +13,17 @@ interface nsISpamSettings: nsISupports { attribute long level; attribute boolean moveOnSpam; + /** + * 0 for actionTargetAccount, 1 for actionTargetFolder + * most consumers will just use spamFolderURI + */ + attribute long moveTargetMode; + attribute string actionTargetAccount; attribute string actionTargetFolder; + /** + * built from moveTargetMode, actionTargetAccount, actionTargetFolder + */ + readonly attribute string spamFolderURI; attribute boolean purge; /** diff --git a/mailnews/base/resources/content/junkMail.js b/mailnews/base/resources/content/junkMail.js index 82b74bdfb639..515bd3371ba0 100644 --- a/mailnews/base/resources/content/junkMail.js +++ b/mailnews/base/resources/content/junkMail.js @@ -61,15 +61,24 @@ function setupForAccountFromFolder(aURI) serverList.selectedItem = menuitems[0]; // set up the UI for this server + // set up the level radio group document.getElementById("level").selectedItem = document.getElementById("level" + obj.settings.level); + // set up the junk mail folder picker document.getElementById("moveOnSpam").checked = obj.settings.moveOnSpam; + document.getElementById("moveTargetMode").selectedItem = document.getElementById("moveTargetMode" + obj.settings.moveTargetMode); + + // if there is a target account, use it. else use the current account + SetFolderPicker(obj.settings.actionTargetAccount ? obj.settings.actionTargetAccount : obj.server.serverURI, "actionTargetAccount"); + if (obj.settings.actionTargetFolder) SetFolderPicker(obj.settings.actionTargetFolder, "actionTargetFolder"); + // set up the purge UI document.getElementById("purge").checked = obj.settings.purge; document.getElementById("purgeInterval").value = obj.settings.purgeInterval; + // set up the whitelist UI document.getElementById("useWhiteList").checked = obj.settings.useWhiteList; var abList = document.getElementById("whiteListAbURI"); menuitems = abList.getElementsByAttribute("id", obj.settings.whiteListAbURI); @@ -98,6 +107,8 @@ function storeSettings(aSettings) aSettings.level = document.getElementById("level").selectedItem.getAttribute("value"); aSettings.moveOnSpam = document.getElementById("moveOnSpam").checked; + aSettings.moveTargetMode = document.getElementById("moveTargetMode").selectedItem.getAttribute("value"); + aSettings.actionTargetAccount = document.getElementById("actionTargetAccount").getAttribute("uri"); aSettings.actionTargetFolder = document.getElementById("actionTargetFolder").getAttribute("uri"); aSettings.purge = document.getElementById("purge").checked; @@ -109,4 +120,6 @@ function storeSettings(aSettings) function doHelpButton() { + // until we have help, I use this for testing + dump("XXX " + gSpamSettings[gCurrentServer.key].settings.spamFolderURI + "\n"); } \ No newline at end of file diff --git a/mailnews/base/resources/content/junkMail.xul b/mailnews/base/resources/content/junkMail.xul index 4da0a03d7821..141f05d115e5 100644 --- a/mailnews/base/resources/content/junkMail.xul +++ b/mailnews/base/resources/content/junkMail.xul @@ -1,6 +1,6 @@ - + @@ -71,10 +71,32 @@ - - - - + + diff --git a/mailnews/base/resources/content/msgFolderPickerOverlay.xul b/mailnews/base/resources/content/msgFolderPickerOverlay.xul index de8c45eca793..79342ffc89bf 100644 --- a/mailnews/base/resources/content/msgFolderPickerOverlay.xul +++ b/mailnews/base/resources/content/msgFolderPickerOverlay.xul @@ -319,6 +319,28 @@ Rights Reserved. + + + + + - + @@ -17,10 +17,12 @@ - - + + + + - \ No newline at end of file + diff --git a/mailnews/base/resources/locale/en-US/messenger.properties b/mailnews/base/resources/locale/en-US/messenger.properties index 6108b8df3b56..4850b516828a 100644 --- a/mailnews/base/resources/locale/en-US/messenger.properties +++ b/mailnews/base/resources/locale/en-US/messenger.properties @@ -123,6 +123,7 @@ sentFolderName=Sent draftsFolderName=Drafts templatesFolderName=Templates unsentFolderName=Unsent Messages +junkFolderName=Junk # Error message for special folder deletion on imap accounts # LOCALIZATION NOTES (specialFolderDeletionErr): Do not translate "IMAP" in the line below diff --git a/mailnews/base/src/nsSpamSettings.cpp b/mailnews/base/src/nsSpamSettings.cpp index 26ae881b9829..5fdbce148388 100644 --- a/mailnews/base/src/nsSpamSettings.cpp +++ b/mailnews/base/src/nsSpamSettings.cpp @@ -5,14 +5,18 @@ #include "prmem.h" #include "nsIFileStreams.h" +#define MOVE_TARGET_MODE_JUNK_ON_ACCOUNT 0 +#define MOVE_TARGET_MODE_FOLDER 1 + nsSpamSettings::nsSpamSettings() { NS_INIT_ISUPPORTS(); mLevel = 0; mMoveOnSpam = PR_FALSE; + mMoveTargetMode = MOVE_TARGET_MODE_JUNK_ON_ACCOUNT; mPurge = PR_FALSE; - mPurgeInterval = 15; // 15 days + mPurgeInterval = 14; // 14 days mUseWhiteList = PR_FALSE; mLoggingEnabled = PR_FALSE; } @@ -38,6 +42,21 @@ NS_IMETHODIMP nsSpamSettings::SetLevel(PRInt32 aLevel) return NS_OK; } +NS_IMETHODIMP +nsSpamSettings::GetMoveTargetMode(PRInt32 *aMoveTargetMode) +{ + NS_ENSURE_ARG_POINTER(aMoveTargetMode); + *aMoveTargetMode = mMoveTargetMode; + return NS_OK; +} + +NS_IMETHODIMP nsSpamSettings::SetMoveTargetMode(PRInt32 aMoveTargetMode) +{ + NS_ASSERTION((aMoveTargetMode == 0 || aMoveTargetMode == 1), "bad mode"); + mMoveTargetMode = aMoveTargetMode; + return NS_OK; +} + NS_IMPL_GETSET(nsSpamSettings, LoggingEnabled, PRBool, mLoggingEnabled); NS_IMPL_GETSET(nsSpamSettings, MoveOnSpam, PRBool, mMoveOnSpam); NS_IMPL_GETSET(nsSpamSettings, Purge, PRBool, mPurge); @@ -56,6 +75,19 @@ NS_IMETHODIMP nsSpamSettings::SetWhiteListAbURI(const char * aWhiteListAbURI) return NS_OK; } +NS_IMETHODIMP nsSpamSettings::GetActionTargetAccount(char * *aActionTargetAccount) +{ + NS_ENSURE_ARG_POINTER(aActionTargetAccount); + *aActionTargetAccount = ToNewCString(mActionTargetAccount); + return NS_OK; +} + +NS_IMETHODIMP nsSpamSettings::SetActionTargetAccount(const char * aActionTargetAccount) +{ + mActionTargetAccount = aActionTargetAccount; + return NS_OK; +} + NS_IMETHODIMP nsSpamSettings::GetActionTargetFolder(char * *aActionTargetFolder) { NS_ENSURE_ARG_POINTER(aActionTargetFolder); @@ -263,6 +295,14 @@ NS_IMETHODIMP nsSpamSettings::Clone(nsISpamSettings *aSpamSettings) rv = aSpamSettings->GetLevel(&mLevel); NS_ENSURE_SUCCESS(rv,rv); + rv = aSpamSettings->GetMoveTargetMode(&mMoveTargetMode); + NS_ENSURE_SUCCESS(rv,rv); + + nsXPIDLCString actionTargetAccount; + rv = aSpamSettings->GetActionTargetAccount(getter_Copies(actionTargetAccount)); + NS_ENSURE_SUCCESS(rv,rv); + mActionTargetAccount = actionTargetAccount; + nsXPIDLCString actionTargetFolder; rv = aSpamSettings->GetActionTargetFolder(getter_Copies(actionTargetFolder)); NS_ENSURE_SUCCESS(rv,rv); @@ -275,3 +315,29 @@ NS_IMETHODIMP nsSpamSettings::Clone(nsISpamSettings *aSpamSettings) return rv; } + +NS_IMETHODIMP nsSpamSettings::GetSpamFolderURI(char **aSpamFolderURI) +{ + NS_ENSURE_ARG_POINTER(aSpamFolderURI); + nsresult rv; + + if (mMoveTargetMode == MOVE_TARGET_MODE_FOLDER) + return GetActionTargetFolder(aSpamFolderURI); + + NS_ASSERTION(mMoveTargetMode == MOVE_TARGET_MODE_JUNK_ON_ACCOUNT, "bad mode"); + + // if the mode is MOVE_TARGET_MODE_JUNK_ON_ACCOUNT + // the spam folder URI = account uri + "/Junk" + nsXPIDLCString folderURI; + rv = GetActionTargetAccount(getter_Copies(folderURI)); + NS_ENSURE_SUCCESS(rv,rv); + + // see nsMsgFolder::SetPrettyName() for where the pretty name is set. + folderURI.Append("/Junk"); + *aSpamFolderURI = ToNewCString(folderURI); + if (!*aSpamFolderURI) + return NS_ERROR_OUT_OF_MEMORY; + else + return rv; +} + diff --git a/mailnews/base/src/nsSpamSettings.h b/mailnews/base/src/nsSpamSettings.h index 24e8571bf892..000376d596aa 100644 --- a/mailnews/base/src/nsSpamSettings.h +++ b/mailnews/base/src/nsSpamSettings.h @@ -22,6 +22,8 @@ private: PRInt32 mLevel; PRBool mMoveOnSpam; + PRInt32 mMoveTargetMode; + nsCString mActionTargetAccount; nsCString mActionTargetFolder; PRBool mPurge; diff --git a/mailnews/base/util/nsMsgFolder.cpp b/mailnews/base/util/nsMsgFolder.cpp index f12aad26a952..81a89cdc3399 100644 --- a/mailnews/base/util/nsMsgFolder.cpp +++ b/mailnews/base/util/nsMsgFolder.cpp @@ -95,6 +95,7 @@ PRUnichar *nsMsgFolder::kLocalizedSentName; PRUnichar *nsMsgFolder::kLocalizedDraftsName; PRUnichar *nsMsgFolder::kLocalizedTemplatesName; PRUnichar *nsMsgFolder::kLocalizedUnsentName; +PRUnichar *nsMsgFolder::kLocalizedJunkName; nsIAtom * nsMsgFolder::kTotalMessagesAtom = nsnull; nsIAtom * nsMsgFolder::kBiffStateAtom = nsnull; @@ -200,6 +201,7 @@ nsMsgFolder::~nsMsgFolder(void) CRTFREEIF(kLocalizedDraftsName); CRTFREEIF(kLocalizedTemplatesName); CRTFREEIF(kLocalizedUnsentName); + CRTFREEIF(kLocalizedJunkName); #ifdef MSG_FASTER_URI_PARSING mParsingURL = nsnull; #endif @@ -234,6 +236,8 @@ nsMsgFolder::initializeStrings() &kLocalizedDraftsName); bundle->GetStringFromName(NS_LITERAL_STRING("templatesFolderName").get(), &kLocalizedTemplatesName); + bundle->GetStringFromName(NS_LITERAL_STRING("junkFolderName").get(), + &kLocalizedJunkName); bundle->GetStringFromName(NS_LITERAL_STRING("unsentFolderName").get(), &kLocalizedUnsentName); return NS_OK; @@ -877,27 +881,22 @@ NS_IMETHODIMP nsMsgFolder::SetPrettyName(const PRUnichar *name) nsAutoString unicodeName(name); //Set pretty name only if special flag is set and if it the default folder name - if (mFlags & MSG_FOLDER_FLAG_INBOX && unicodeName.Equals(NS_LITERAL_STRING("Inbox"), nsCaseInsensitiveStringComparator())) rv = SetName(kLocalizedInboxName); - else if (mFlags & MSG_FOLDER_FLAG_SENTMAIL && unicodeName.Equals(NS_LITERAL_STRING("Sent"), nsCaseInsensitiveStringComparator())) rv = SetName(kLocalizedSentName); - //netscape webmail uses "Draft" instead of "Drafts" else if (mFlags & MSG_FOLDER_FLAG_DRAFTS && (unicodeName.Equals(NS_LITERAL_STRING("Drafts"), nsCaseInsensitiveStringComparator()) || unicodeName.Equals(NS_LITERAL_STRING("Draft"), nsCaseInsensitiveStringComparator()))) rv = SetName(kLocalizedDraftsName); - else if (mFlags & MSG_FOLDER_FLAG_TEMPLATES && unicodeName.Equals(NS_LITERAL_STRING("Templates"), nsCaseInsensitiveStringComparator())) rv = SetName(kLocalizedTemplatesName); - else if (mFlags & MSG_FOLDER_FLAG_TRASH && unicodeName.Equals(NS_LITERAL_STRING("Trash"), nsCaseInsensitiveStringComparator())) rv = SetName(kLocalizedTrashName); - else if (mFlags & MSG_FOLDER_FLAG_QUEUE && unicodeName.Equals(NS_LITERAL_STRING("Unsent Messages"), nsCaseInsensitiveStringComparator())) rv = SetName(kLocalizedUnsentName); - + else if (mFlags & MSG_FOLDER_FLAG_JUNK && unicodeName.Equals(NS_LITERAL_STRING("Junk"), nsCaseInsensitiveStringComparator())) + rv = SetName(kLocalizedJunkName); else rv = SetName(name); diff --git a/mailnews/base/util/nsMsgFolder.h b/mailnews/base/util/nsMsgFolder.h index a37e9585e62f..ec3f4a3b5a04 100644 --- a/mailnews/base/util/nsMsgFolder.h +++ b/mailnews/base/util/nsMsgFolder.h @@ -320,6 +320,7 @@ protected: static PRUnichar *kLocalizedDraftsName; static PRUnichar *kLocalizedTemplatesName; static PRUnichar *kLocalizedUnsentName; + static PRUnichar *kLocalizedJunkName; static nsIAtom* kTotalUnreadMessagesAtom; static nsIAtom* kBiffStateAtom; diff --git a/mailnews/base/util/nsMsgIncomingServer.cpp b/mailnews/base/util/nsMsgIncomingServer.cpp index a70e87ea3857..e1d5a94e7325 100644 --- a/mailnews/base/util/nsMsgIncomingServer.cpp +++ b/mailnews/base/util/nsMsgIncomingServer.cpp @@ -1823,7 +1823,19 @@ nsMsgIncomingServer::SetSpamSettings(nsISpamSettings *aSpamSettings) NS_ENSURE_SUCCESS(rv,rv); rv = SetBoolValue("moveOnSpam", moveOnSpam); NS_ENSURE_SUCCESS(rv,rv); - + + PRInt32 moveTargetMode; + rv = mSpamSettings->GetMoveTargetMode(&moveTargetMode); + NS_ENSURE_SUCCESS(rv,rv); + rv = SetIntValue("moveTargetMode", moveTargetMode); + NS_ENSURE_SUCCESS(rv,rv); + + nsXPIDLCString spamActionTargetAccount; + rv = mSpamSettings->GetActionTargetAccount(getter_Copies(spamActionTargetAccount)); + NS_ENSURE_SUCCESS(rv,rv); + rv = SetCharValue("spamActionTargetAccount", spamActionTargetAccount.get()); + NS_ENSURE_SUCCESS(rv,rv); + nsXPIDLCString spamActionTargetFolder; rv = mSpamSettings->GetActionTargetFolder(getter_Copies(spamActionTargetFolder)); NS_ENSURE_SUCCESS(rv,rv); @@ -1883,6 +1895,18 @@ nsMsgIncomingServer::GetSpamSettings(nsISpamSettings **aSpamSettings) rv = mSpamSettings->SetMoveOnSpam(moveOnSpam); NS_ENSURE_SUCCESS(rv,rv); + PRInt32 moveTargetMode; + rv = GetIntValue("moveTargetMode", &moveTargetMode); + NS_ENSURE_SUCCESS(rv,rv); + rv = mSpamSettings->SetMoveTargetMode(moveTargetMode); + NS_ENSURE_SUCCESS(rv,rv); + + nsXPIDLCString spamActionTargetAccount; + rv = GetCharValue("spamActionTargetAccount", getter_Copies(spamActionTargetAccount)); + NS_ENSURE_SUCCESS(rv,rv); + rv = mSpamSettings->SetActionTargetAccount(spamActionTargetAccount); + NS_ENSURE_SUCCESS(rv,rv); + nsXPIDLCString spamActionTargetFolder; rv = GetCharValue("spamActionTargetFolder", getter_Copies(spamActionTargetFolder)); NS_ENSURE_SUCCESS(rv,rv); diff --git a/mailnews/mailnews.js b/mailnews/mailnews.js index ecf4b2b94a3e..5ea66b7f2edd 100644 --- a/mailnews/mailnews.js +++ b/mailnews/mailnews.js @@ -334,7 +334,9 @@ pref("mail.server.default.canFileMessages", true); // for spam pref("mail.server.default.spamLevel",60); // 0 - 100, 0 off, 20, lowest, 40 low, 60 medium, 80 high, 100 highest pref("mail.server.default.moveOnSpam",false); -pref("mail.server.default.spamActionTargetFolder","mailbox://nobody@Local%20Folders/Junk%20Mail"); +pref("mail.server.default.moveTargetMode",0); // 0 == "Junk" on server, 1 == specific folder +pref("mail.server.default.spamActionTargetAccount",""); +pref("mail.server.default.spamActionTargetFolder",""); pref("mail.server.default.useWhiteList",true); pref("mail.server.default.whiteListAbURI","moz-abmdbdirectory://abook.mab"); // the Personal addressbook. pref("mail.server.default.purgeSpam",false); diff --git a/modules/libpref/src/init/mailnews.js b/modules/libpref/src/init/mailnews.js index ecf4b2b94a3e..5ea66b7f2edd 100644 --- a/modules/libpref/src/init/mailnews.js +++ b/modules/libpref/src/init/mailnews.js @@ -334,7 +334,9 @@ pref("mail.server.default.canFileMessages", true); // for spam pref("mail.server.default.spamLevel",60); // 0 - 100, 0 off, 20, lowest, 40 low, 60 medium, 80 high, 100 highest pref("mail.server.default.moveOnSpam",false); -pref("mail.server.default.spamActionTargetFolder","mailbox://nobody@Local%20Folders/Junk%20Mail"); +pref("mail.server.default.moveTargetMode",0); // 0 == "Junk" on server, 1 == specific folder +pref("mail.server.default.spamActionTargetAccount",""); +pref("mail.server.default.spamActionTargetFolder",""); pref("mail.server.default.useWhiteList",true); pref("mail.server.default.whiteListAbURI","moz-abmdbdirectory://abook.mab"); // the Personal addressbook. pref("mail.server.default.purgeSpam",false);