Dactyloidae/mailnews/base/prefs/content/amUtils.js

205 lines
7.6 KiB
JavaScript

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Components.utils.import("resource://gre/modules/Services.jsm");
Components.utils.import("resource:///modules/mailServices.js");
Components.utils.import("resource:///modules/MailUtils.js");
Components.utils.import("resource:///modules/iteratorUtils.jsm");
function BrowseForLocalFolders()
{
const nsIFilePicker = Components.interfaces.nsIFilePicker;
const nsIFile = Components.interfaces.nsIFile;
var currentFolderTextBox = document.getElementById("server.localPath");
var fp = Components.classes["@mozilla.org/filepicker;1"]
.createInstance(nsIFilePicker);
fp.init(window,
document.getElementById("browseForLocalFolder")
.getAttribute("filepickertitle"),
nsIFilePicker.modeGetFolder);
var currentFolder = Components.classes["@mozilla.org/file/local;1"]
.createInstance(nsIFile);
currentFolder.initWithPath(currentFolderTextBox.value);
fp.displayDirectory = currentFolder;
if (fp.show() != nsIFilePicker.returnOK)
return;
// Retrieve the selected folder.
let selectedFolder = fp.file;
// Check if the folder can be used for mail storage.
if (!top.checkDirectoryIsUsable(selectedFolder))
return;
currentFolderTextBox.value = selectedFolder.path;
}
/**
* Return server/folder name formatted with server name if needed.
*
* @param aTargetFolder nsIMsgFolder to format name for
* If target.isServer then only its name is returned.
* Otherwise return the name as "<foldername> on <servername>".
*/
function prettyFolderName(aTargetFolder)
{
if (aTargetFolder.isServer)
return aTargetFolder.prettyName;
return document.getElementById("bundle_messenger")
.getFormattedString("verboseFolderFormat",
[aTargetFolder.prettyName,
aTargetFolder.server.prettyName]);
}
/**
* Checks validity of junk target server name and folder.
*
* @param aTargetURI the URI specification to check
* @param aIsServer true if the URI specifies only a server (without folder)
*
* @return the value of aTargetURI if it is valid (usable), otherwise null
*/
function checkJunkTargetFolder(aTargetURI, aIsServer)
{
try {
// Does the target account exist?
let targetServer = MailUtils.getFolderForURI(aTargetURI + (aIsServer ? "/Junk" : ""),
!aIsServer).server;
// If the target server has deferred storage, Junk can't be stored into it.
if (targetServer.rootFolder != targetServer.rootMsgFolder)
return null;
} catch (e) {
return null;
}
return aTargetURI;
}
/**
* Finds a usable target for storing Junk mail.
* If the passed in server URI is not usable, choose Local Folders.
*
* @param aTargetURI the URI of a server or folder to try first
* @param aIsServer true if the URI specifies only a server (without folder)
*
* @return the server/folder URI of a usable target for storing Junk
*/
function chooseJunkTargetFolder(aTargetURI, aIsServer)
{
let server = null;
if (aTargetURI) {
server = MailUtils.getFolderForURI(aTargetURI, false).server;
if (!server.canCreateFoldersOnServer || !server.canSearchMessages ||
(server.rootFolder != server.rootMsgFolder))
server = null;
}
if (!server)
server = MailServices.accounts.localFoldersServer;
return server.serverURI + (!aIsServer ? "/Junk" : "");
}
/**
* Fixes junk target folders if they point to an invalid/unusable (e.g. deferred)
* folder/account. Only returns the new safe values. It is up to the caller
* to push them to the proper elements/prefs.
*
* @param aSpamActionTargetAccount The value of the server.*.spamActionTargetAccount pref value (URI).
* @param aSpamActionTargetFolder The value of the server.*.spamActionTargetFolder pref value (URI).
* @param aProposedTarget The URI of a new target to try.
* @param aMoveTargetModeValue The value of the server.*.moveTargetMode pref value (0/1).
* @param aServerSpamSettings The nsISpamSettings object of any server
* (used just for the MOVE_TARGET_MODE_* constants).
* @param aMoveOnSpam The server.*.moveOnSpam pref value (bool).
*
* @return an array containing:
* newTargetAccount new safe junk target account
* newTargetAccount new safe junk target folder
* newMoveOnSpam new moveOnSpam value
*/
function sanitizeJunkTargets(aSpamActionTargetAccount,
aSpamActionTargetFolder,
aProposedTarget,
aMoveTargetModeValue,
aServerSpamSettings,
aMoveOnSpam)
{
// Check if folder targets are valid.
aSpamActionTargetAccount = checkJunkTargetFolder(aSpamActionTargetAccount, true);
if (!aSpamActionTargetAccount) {
// If aSpamActionTargetAccount is not valid,
// reset to default behavior to NOT move junk messages...
if (aMoveTargetModeValue == aServerSpamSettings.MOVE_TARGET_MODE_ACCOUNT)
aMoveOnSpam = false;
// ... and find a good default target.
aSpamActionTargetAccount = chooseJunkTargetFolder(aProposedTarget, true);
}
aSpamActionTargetFolder = checkJunkTargetFolder(aSpamActionTargetFolder, false);
if (!aSpamActionTargetFolder) {
// If aSpamActionTargetFolder is not valid,
// reset to default behavior to NOT move junk messages...
if (aMoveTargetModeValue == aServerSpamSettings.MOVE_TARGET_MODE_FOLDER)
aMoveOnSpam = false;
// ... and find a good default target.
aSpamActionTargetFolder = chooseJunkTargetFolder(aProposedTarget, false);
}
return [ aSpamActionTargetAccount, aSpamActionTargetFolder, aMoveOnSpam ];
}
/**
* Opens Preferences (Options) dialog on the Advanced pane, General tab
* so that the user sees where the global receipts settings can be found.
*
* @param aTBPaneId Thunderbird pref paneID to open.
* @param aTBTabId Thunderbird tabID to open.
* @param aTBOtherArgs Other arguments to send to the pref tab.
* @param aSMPaneId Seamonkey pref pane to open.
*/
function openPrefsFromAccountManager(aTBPaneId, aTBTabId, aTBOtherArgs, aSMPaneId) {
let win = Services.wm.getMostRecentWindow("mail:3pane") ||
Services.wm.getMostRecentWindow("mail:messageWindow") ||
Services.wm.getMostRecentWindow("msgcompose");
if (!win)
return;
// If openOptionsDialog() exists, we are in Thunderbird.
if (typeof win.openOptionsDialog == "function")
win.openOptionsDialog(aTBPaneId, aTBTabId, aTBOtherArgs);
// If goPreferences() exists, we are in Seamonkey.
if (typeof win.goPreferences == "function")
win.goPreferences(aSMPaneId);
}
/**
* Check if the given account name already exists in any account.
*
* @param aAccountName The account name string to look for.
* @param aAccountKey Optional. The key of an account that is skipped when
* searching the name. If unset, do not skip any account.
*/
function accountNameExists(aAccountName, aAccountKey)
{
for (let account in fixIterator(MailServices.accounts.accounts,
Components.interfaces.nsIMsgAccount))
{
if (account.key != aAccountKey && account.incomingServer &&
aAccountName == account.incomingServer.prettyName) {
return true;
}
}
return false;
}