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);