diff options
Diffstat (limited to 'comm/mail/components/activity/modules/pop3Download.jsm')
-rw-r--r-- | comm/mail/components/activity/modules/pop3Download.jsm | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/comm/mail/components/activity/modules/pop3Download.jsm b/comm/mail/components/activity/modules/pop3Download.jsm new file mode 100644 index 0000000000..f203b33212 --- /dev/null +++ b/comm/mail/components/activity/modules/pop3Download.jsm @@ -0,0 +1,154 @@ +/* -*- Mode: JavaScript; 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/. */ + +const EXPORTED_SYMBOLS = ["pop3DownloadModule"]; + +var nsActEvent = Components.Constructor( + "@mozilla.org/activity-event;1", + "nsIActivityEvent", + "init" +); + +const { MailServices } = ChromeUtils.import( + "resource:///modules/MailServices.jsm" +); +const { PluralForm } = ChromeUtils.importESModule( + "resource://gre/modules/PluralForm.sys.mjs" +); + +// This module provides a link between the pop3 service code and the activity +// manager. +var pop3DownloadModule = { + // hash table of most recent download items per folder + _mostRecentActivityForFolder: new Map(), + // hash table of prev download items per folder, so we can + // coalesce consecutive no new message events. + _prevActivityForFolder: new Map(), + + get log() { + delete this.log; + return (this.log = console.createInstance({ + prefix: "mail.activity", + maxLogLevel: "Warn", + maxLogLevelPref: "mail.activity.loglevel", + })); + }, + + 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(stringName) { + try { + return this.bundle.GetStringFromName(stringName); + } catch (e) { + this.log.error("error trying to get a string called: " + stringName); + throw e; + } + }, + + onDownloadStarted(aFolder) { + this.log.info("in onDownloadStarted"); + + let displayText = this.bundle.formatStringFromName( + "pop3EventStartDisplayText2", + [ + aFolder.server.prettyName, // account name + aFolder.prettyName, + ] + ); // folder name + // remember the prev activity for this folder, if any. + this._prevActivityForFolder.set( + aFolder.URI, + this._mostRecentActivityForFolder.get(aFolder.URI) + ); + let statusText = aFolder.server.prettyName; + + // create an activity event + let event = new nsActEvent( + displayText, + aFolder, + statusText, + Date.now(), // start time + Date.now() + ); // completion time + + event.iconClass = "syncMail"; + + let downloadItem = {}; + downloadItem.eventID = this.activityMgr.addActivity(event); + this._mostRecentActivityForFolder.set(aFolder.URI, downloadItem); + }, + + onDownloadProgress(aFolder, aNumMsgsDownloaded, aTotalMsgs) { + this.log.info("in onDownloadProgress"); + }, + + onDownloadCompleted(aFolder, aNumMsgsDownloaded) { + this.log.info("in onDownloadCompleted"); + + // Remove activity if there was any. + // It can happen that download never started (e.g. couldn't connect to server), + // with onDownloadStarted, but we still get a onDownloadCompleted event + // when the connection is given up. + let recentActivity = this._mostRecentActivityForFolder.get(aFolder.URI); + if (recentActivity) { + this.activityMgr.removeActivity(recentActivity.eventID); + } + + let displayText; + if (aNumMsgsDownloaded > 0) { + displayText = PluralForm.get( + aNumMsgsDownloaded, + this.getString("pop3EventStatusText") + ); + displayText = displayText.replace("#1", aNumMsgsDownloaded); + } else { + displayText = this.getString("pop3EventStatusTextNoMsgs"); + } + + let statusText = aFolder.server.prettyName; + + // create an activity event + let event = new nsActEvent( + displayText, + aFolder, + statusText, + Date.now(), // start time + Date.now() + ); // completion time + + event.iconClass = "syncMail"; + + let downloadItem = { numMsgsDownloaded: aNumMsgsDownloaded }; + this._mostRecentActivityForFolder.set(aFolder.URI, downloadItem); + downloadItem.eventID = this.activityMgr.addActivity(event); + if (!aNumMsgsDownloaded) { + // If we didn't download any messages this time, and the prev event + // for this folder also didn't download any messages, remove the + // prev event from the activity manager. + let prevItem = this._prevActivityForFolder.get(aFolder.URI); + if (prevItem != undefined && !prevItem.numMsgsDownloaded) { + if (this.activityMgr.containsActivity(prevItem.eventID)) { + this.activityMgr.removeActivity(prevItem.eventID); + } + } + } + }, + init() { + // XXX when do we need to remove ourselves? + MailServices.pop3.addListener(this); + }, +}; |