summaryrefslogtreecommitdiffstats
path: root/comm/mail/components/activity/ActivityManager.jsm
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/components/activity/ActivityManager.jsm')
-rw-r--r--comm/mail/components/activity/ActivityManager.jsm157
1 files changed, 157 insertions, 0 deletions
diff --git a/comm/mail/components/activity/ActivityManager.jsm b/comm/mail/components/activity/ActivityManager.jsm
new file mode 100644
index 0000000000..c808cb3354
--- /dev/null
+++ b/comm/mail/components/activity/ActivityManager.jsm
@@ -0,0 +1,157 @@
+/* -*- 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/. */
+
+var EXPORTED_SYMBOLS = ["ActivityManager"];
+
+function ActivityManager() {}
+
+ActivityManager.prototype = {
+ log: console.createInstance({
+ prefix: "mail.activity",
+ maxLogLevel: "Warn",
+ maxLogLevelPref: "mail.activity.loglevel",
+ }),
+ _listeners: [],
+ _processCount: 0,
+ _db: null,
+ _idCounter: 1,
+ _activities: new Map(),
+
+ get processCount() {
+ let count = 0;
+ for (let value of this._activities.values()) {
+ if (value instanceof Ci.nsIActivityProcess) {
+ count++;
+ }
+ }
+
+ return count;
+ },
+
+ getProcessesByContext(aContextType, aContextObj) {
+ let list = [];
+ for (let activity of this._activities.values()) {
+ if (
+ activity instanceof Ci.nsIActivityProcess &&
+ activity.contextType == aContextType &&
+ activity.contextObj == aContextObj
+ ) {
+ list.push(activity);
+ }
+ }
+ return list;
+ },
+
+ get db() {
+ return null;
+ },
+
+ get nextId() {
+ return this._idCounter++;
+ },
+
+ addActivity(aActivity) {
+ try {
+ this.log.info("adding Activity");
+ // get the next valid id for this activity
+ let id = this.nextId;
+ aActivity.id = id;
+
+ // add activity into the activities table
+ this._activities.set(id, aActivity);
+ // notify all the listeners
+ for (let value of this._listeners) {
+ try {
+ value.onAddedActivity(id, aActivity);
+ } catch (e) {
+ this.log.error("Exception calling onAddedActivity" + e);
+ }
+ }
+ return id;
+ } catch (e) {
+ // for some reason exceptions don't end up on the console if we don't
+ // explicitly log them.
+ this.log.error("Exception: " + e);
+ throw e;
+ }
+ },
+
+ removeActivity(aID) {
+ let activity = this.getActivity(aID);
+ if (!activity) {
+ return; // Nothing to remove.
+ }
+
+ // make sure that the activity is not in-progress state
+ if (
+ activity instanceof Ci.nsIActivityProcess &&
+ activity.state == Ci.nsIActivityProcess.STATE_INPROGRESS
+ ) {
+ throw Components.Exception(`Activity in progress`, Cr.NS_ERROR_FAILURE);
+ }
+
+ // remove the activity
+ this._activities.delete(aID);
+
+ // notify all the listeners
+ for (let value of this._listeners) {
+ try {
+ value.onRemovedActivity(aID);
+ } catch (e) {
+ // ignore the exception
+ }
+ }
+ },
+
+ cleanUp() {
+ // Get the list of aIDs.
+ this.log.info("cleanUp\n");
+ for (let [id, activity] of this._activities) {
+ if (activity instanceof Ci.nsIActivityProcess) {
+ // Note: The .state property will return undefined if you aren't in
+ // this if-instanceof block.
+ let state = activity.state;
+ if (
+ state != Ci.nsIActivityProcess.STATE_INPROGRESS &&
+ state != Ci.nsIActivityProcess.STATE_PAUSED &&
+ state != Ci.nsIActivityProcess.STATE_WAITINGFORINPUT &&
+ state != Ci.nsIActivityProcess.STATE_WAITINGFORRETRY
+ ) {
+ this.removeActivity(id);
+ }
+ } else {
+ this.removeActivity(id);
+ }
+ }
+ },
+
+ getActivity(aID) {
+ return this._activities.get(aID);
+ },
+
+ containsActivity(aID) {
+ return this._activities.has(aID);
+ },
+
+ getActivities() {
+ return [...this._activities.values()];
+ },
+
+ addListener(aListener) {
+ this.log.info("addListener\n");
+ this._listeners.push(aListener);
+ },
+
+ removeListener(aListener) {
+ this.log.info("removeListener\n");
+ for (let i = 0; i < this._listeners.length; i++) {
+ if (this._listeners[i] == aListener) {
+ this._listeners.splice(i, 1);
+ }
+ }
+ },
+
+ QueryInterface: ChromeUtils.generateQI(["nsIActivityManager"]),
+};