Files
binoc-central-mirror/mail/components/activity/modules/moveCopy.js
T
2020-05-10 13:52:36 -04:00

378 lines
13 KiB
JavaScript

/* -*- Mode: Java; tab-width: 2; 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/. */
this.EXPORTED_SYMBOLS = ['moveCopyModule'];
var Cc = Components.classes;
var Ci = Components.interfaces;
var Cr = Components.results;
var nsActProcess = Components.Constructor("@mozilla.org/activity-process;1",
"nsIActivityProcess", "init");
var nsActEvent = Components.Constructor("@mozilla.org/activity-event;1",
"nsIActivityEvent", "init");
var nsActWarning = Components.Constructor("@mozilla.org/activity-warning;1",
"nsIActivityWarning", "init");
var nsMsgFolderFlags = Ci.nsMsgFolderFlags;
Components.utils.import("resource://gre/modules/Services.jsm");
Components.utils.import("resource:///modules/mailServices.js");
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
Components.utils.import("resource://gre/modules/PluralForm.jsm");
Components.utils.import("resource:///modules/gloda/log4moz.js");
// This module provides a link between the move/copy code and the activity
// manager.
var moveCopyModule =
{
lastMessage: {},
lastFolder: {},
get log() {
delete this.log;
return this.log = Log4Moz.getConfiguredLogger("moveCopyModule");
},
get activityMgr() {
delete this.activityMgr;
return this.activityMgr = Cc["@mozilla.org/activity-manager;1"]
.getService(Ci.nsIActivityManager);
},
get bundle() {
delete this.bundle;
return this.bundle = Services.strings
.createBundle("chrome://messenger/locale/activity.properties");
},
getString: function(stringName) {
try {
return this.bundle.GetStringFromName(stringName)
} catch (e) {
this.log.error("error trying to get a string called: " + stringName);
throw(e);
}
},
msgAdded : function(aMsg) {
},
msgsDeleted : function(aMsgList) {
this.log.info("in msgsDeleted");
let count = aMsgList.length;
if (count <= 0)
return;
let displayCount = count;
// get the folder of the deleted messages
let folder = aMsgList.queryElementAt(0, Components.interfaces.nsIMsgDBHdr).folder;
let activities = this.activityMgr.getActivities({})
if (activities.length > 0 &&
activities[activities.length-1].id == this.lastMessage.id &&
this.lastMessage.type == "deleteMail" &&
this.lastMessage.folder == folder.prettiestName)
{
displayCount += this.lastMessage.count;
this.activityMgr.removeActivity(this.lastMessage.id);
}
this.lastMessage = {};
let displayText = PluralForm.get(displayCount, this.getString("deletedMessages2"));
displayText = displayText.replace("#1", displayCount)
this.lastMessage.count = displayCount;
displayText = displayText.replace("#2", folder.prettiestName)
this.lastMessage.folder = folder.prettiestName;
let statusText = folder.server.prettyName;
// create an activity event
let event = new nsActEvent(displayText,
folder,
statusText,
Date.now(), // start time
Date.now()); // completion time
event.iconClass = "deleteMail";
this.lastMessage.type = event.iconClass;
for (let i = 0; i < count; i++)
{
let msgHdr = aMsgList.queryElementAt(i, Components.interfaces.nsIMsgDBHdr);
event.addSubject(msgHdr.messageId);
}
this.lastMessage.id = this.activityMgr.addActivity(event);
},
msgsMoveCopyCompleted : function(aMove, aSrcMsgList, aDestFolder) {
try {
this.log.info("in msgsMoveCopyCompleted");
let count = aSrcMsgList.length;
if (count <= 0)
return;
// get the folder of the moved/copied messages
let folder = aSrcMsgList.queryElementAt(0, Components.interfaces.nsIMsgDBHdr).folder;
this.log.info("got folder");
let displayCount = count;
let activities = this.activityMgr.getActivities({});
if (activities.length > 0 &&
activities[activities.length-1].id == this.lastMessage.id &&
this.lastMessage.type == (aMove ? "moveMail" : "copyMail") &&
this.lastMessage.sourceFolder == folder.prettiestName &&
this.lastMessage.destFolder == aDestFolder.prettiestName)
{
displayCount += this.lastMessage.count;
this.activityMgr.removeActivity(this.lastMessage.id);
}
let statusText = '';
if (folder.server != aDestFolder.server)
{
statusText = this.getString("fromServerToServer");
statusText = statusText.replace("#1", folder.server.prettyName);
statusText = statusText.replace("#2", aDestFolder.server.prettyName);
}
else
{
statusText = folder.server.prettyName;
}
this.lastMessage = {};
let displayText;
if (aMove)
displayText = PluralForm.get(displayCount,
this.getString("movedMessages"));
else
displayText = PluralForm.get(displayCount,
this.getString("copiedMessages"));
displayText = displayText.replace("#1", displayCount)
this.lastMessage.count = displayCount;
displayText = displayText.replace("#2", folder.prettiestName)
this.lastMessage.sourceFolder = folder.prettiestName;
displayText = displayText.replace("#3", aDestFolder.prettiestName)
this.lastMessage.destFolder = aDestFolder.prettiestName;
// create an activity event
let event = new nsActEvent(displayText,
folder,
statusText,
Date.now(), // start time
Date.now()); // completion time
event.iconClass = aMove ? "moveMail" : "copyMail";
this.lastMessage.type = event.iconClass;
for (let i = 0; i < count; i++)
{
let msgHdr = aSrcMsgList.queryElementAt(i, Components.interfaces.nsIMsgDBHdr);
event.addSubject(msgHdr.messageId);
}
this.lastMessage.id = this.activityMgr.addActivity(event);
} catch (e) {
this.log.error("Exception: " + e)
}
},
folderAdded: function(aFolder) {
},
folderDeleted : function(aFolder) {
let server;
try {
// When a new account is created we get this notification with an empty named
// folder that can't return its server. Ignore it.
// TODO: find out what it is.
server = aFolder.server;
// If the account has been removed, we're going to ignore this notification.
MailServices.accounts.FindServer(server.username, server.hostName, server.type);
}
catch(ex) {return;}
let displayText;
let statusText = server.prettyName;
// Display a different message depending on whether we emptied the trash
// or actually deleted a folder
if (aFolder.isSpecialFolder(nsMsgFolderFlags.Trash, false))
displayText = this.getString("emptiedTrash");
else
displayText = this.getString("deletedFolder").replace("#1", aFolder.prettiestName);
// create an activity event
let event = new nsActEvent(displayText,
server,
statusText,
Date.now(), // start time
Date.now()); // completion time
event.addSubject(aFolder);
event.iconClass = "deleteMail";
// When we rename, we get a delete event as well as a rename, so store
// the last folder we deleted
this.lastFolder = {};
this.lastFolder.URI = aFolder.URI;
this.lastFolder.event = this.activityMgr.addActivity(event);
},
folderMoveCopyCompleted: function(aMove, aSrcFolder, aDestFolder) {
this.log.info("in folderMoveCopyCompleted, aMove = " + aMove);
let displayText;
if (aMove)
displayText = this.getString("movedFolder");
else
displayText = this.getString("copiedFolder");
displayText = displayText.replace('#1', aSrcFolder.prettiestName);
displayText = displayText.replace('#2', aDestFolder.prettiestName);
let statusText = '';
if (aSrcFolder.server != aDestFolder.server)
{
statusText = this.getString("fromServerToServer");
statusText = statusText.replace("#1", aSrcFolder.server.prettyName);
statusText = statusText.replace("#2", aDestFolder.server.prettyName);
}
else
{
statusText = aSrcFolder.server.prettyName;
}
// create an activity event
let event = new nsActEvent(displayText,
aSrcFolder.server,
statusText,
Date.now(), // start time
Date.now()); // completion time
event.addSubject(aSrcFolder);
event.addSubject(aDestFolder);
event.iconClass = aMove ? "moveMail" : "copyMail";
this.activityMgr.addActivity(event);
},
folderRenamed: function(aOrigFolder, aNewFolder) {
this.log.info("in folderRenamed, aOrigFolder = "+ aOrigFolder.prettiestName+", aNewFolder = "+
aNewFolder.prettiestName);
let displayText;
let statusText = aNewFolder.server.prettyName;
// Display a different message depending on whether we moved the folder
// to the trash or actually renamed the folder.
if (aNewFolder.isSpecialFolder(nsMsgFolderFlags.Trash, true))
{
displayText = this.getString("movedFolderToTrash");
displayText = displayText.replace("#1", aOrigFolder.prettiestName);
}
else
{
displayText = this.getString("renamedFolder");
displayText = displayText.replace("#1", aOrigFolder.prettiestName);
displayText = displayText.replace("#2", aNewFolder.prettiestName);
}
// When renaming a folder, a delete event is always fired first
if (this.lastFolder.URI == aOrigFolder.URI)
this.activityMgr.removeActivity(this.lastFolder.event);
// create an activity event
let event = new nsActEvent(displayText,
aOrigFolder.server,
statusText,
Date.now(), // start time
Date.now()); // completion time
event.addSubject(aOrigFolder);
event.addSubject(aNewFolder);
this.activityMgr.addActivity(event);
},
itemEvent: function(aItem, aEvent, aData) {
if (aEvent == "UnincorporatedMessageMoved") {
let srcFolder = aItem.QueryInterface(Components.interfaces.nsIMsgFolder);
let msgHdr = aData.QueryInterface(Components.interfaces.nsIMsgDBHdr);
try {
this.log.info("in UnincorporatedMessageMoved");
// get the folder of the moved/copied messages
let destFolder = msgHdr.folder;
this.log.info("got folder");
let displayCount = 1;
let activities = this.activityMgr.getActivities({});
if (activities.length > 0 &&
activities[activities.length-1].id == this.lastMessage.id &&
this.lastMessage.type == "moveMail" &&
this.lastMessage.sourceFolder == srcFolder.prettiestName &&
this.lastMessage.destFolder == destFolder.prettiestName)
{
displayCount += this.lastMessage.count;
this.activityMgr.removeActivity(this.lastMessage.id);
}
let statusText = '';
if (srcFolder.server != destFolder.server)
{
statusText = this.getString("fromServerToServer");
statusText = statusText.replace("#1", srcFolder.server.prettyName);
statusText = statusText.replace("#2", destFolder.server.prettyName);
}
else
{
statusText = srcFolder.server.prettyName;
}
this.lastMessage = {};
let displayText;
displayText = PluralForm.get(displayCount,
this.getString("movedMessages"));
displayText = displayText.replace("#1", displayCount)
this.lastMessage.count = displayCount;
displayText = displayText.replace("#2", srcFolder.prettiestName)
this.lastMessage.sourceFolder = srcFolder.prettiestName;
displayText = displayText.replace("#3", destFolder.prettiestName)
this.lastMessage.destFolder = destFolder.prettiestName;
// create an activity event
let event = new nsActEvent(displayText,
srcFolder,
statusText,
Date.now(), // start time
Date.now()); // completion time
event.iconClass = "moveMail";
this.lastMessage.type = event.iconClass;
event.addSubject(msgHdr.messageId);
this.lastMessage.id = this.activityMgr.addActivity(event);
} catch (e) {
this.log.error("Exception: " + e)
}
}
},
init: function() {
// XXX when do we need to remove ourselves?
MailServices.mfn.addListener(this,
MailServices.mfn.msgsDeleted |
MailServices.mfn.msgsMoveCopyCompleted |
MailServices.mfn.folderDeleted |
MailServices.mfn.folderMoveCopyCompleted |
MailServices.mfn.folderRenamed |
MailServices.mfn.itemEvent);
}
}