diff options
Diffstat (limited to 'comm/mail/components/activity/ActivityManager.jsm')
-rw-r--r-- | comm/mail/components/activity/ActivityManager.jsm | 157 |
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"]), +}; |