diff options
Diffstat (limited to 'comm/calendar/base/src/CalFreeBusyService.jsm')
-rw-r--r-- | comm/calendar/base/src/CalFreeBusyService.jsm | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/comm/calendar/base/src/CalFreeBusyService.jsm b/comm/calendar/base/src/CalFreeBusyService.jsm new file mode 100644 index 0000000000..822f37acda --- /dev/null +++ b/comm/calendar/base/src/CalFreeBusyService.jsm @@ -0,0 +1,89 @@ +/* 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 = ["CalFreeBusyService"]; + +var { cal } = ChromeUtils.import("resource:///modules/calendar/calUtils.jsm"); + +function CalFreeBusyListener(numOperations, finalListener) { + this.mFinalListener = finalListener; + this.mNumOperations = numOperations; + + this.opGroup = new cal.data.OperationGroup(() => { + this.notifyResult(null); + }); +} +CalFreeBusyListener.prototype = { + QueryInterface: ChromeUtils.generateQI(["calIGenericOperationListener"]), + + mFinalListener: null, + mNumOperations: 0, + opGroup: null, + + notifyResult(result) { + let listener = this.mFinalListener; + if (listener) { + if (!this.opGroup.isPending) { + this.mFinalListener = null; + } + listener.onResult(this.opGroup, result); + } + }, + + // calIGenericOperationListener: + onResult(aOperation, aResult) { + if (this.mFinalListener) { + if (!aOperation || !aOperation.isPending) { + --this.mNumOperations; + if (this.mNumOperations <= 0) { + this.opGroup.notifyCompleted(); + } + } + let opStatus = aOperation ? aOperation.status : Cr.NS_OK; + if (Components.isSuccessCode(opStatus) && aResult && Array.isArray(aResult)) { + this.notifyResult(aResult); + } else { + this.notifyResult([]); + } + } + }, +}; + +function CalFreeBusyService() { + this.wrappedJSObject = this; + this.mProviders = new Set(); +} +CalFreeBusyService.prototype = { + QueryInterface: ChromeUtils.generateQI(["calIFreeBusyProvider", "calIFreeBusyService"]), + classID: Components.ID("{29c56cd5-d36e-453a-acde-0083bd4fe6d3}"), + + mProviders: null, + + // calIFreeBusyProvider: + getFreeBusyIntervals(aCalId, aRangeStart, aRangeEnd, aBusyTypes, aListener) { + let groupListener = new CalFreeBusyListener(this.mProviders.size, aListener); + if (this.mProviders.size == 0) { + groupListener.onResult(null, []); + } + for (let provider of this.mProviders.values()) { + let operation = provider.getFreeBusyIntervals( + aCalId, + aRangeStart, + aRangeEnd, + aBusyTypes, + groupListener + ); + groupListener.opGroup.add(operation); + } + return groupListener.opGroup; + }, + + // calIFreeBusyService: + addProvider(aProvider) { + this.mProviders.add(aProvider.QueryInterface(Ci.calIFreeBusyProvider)); + }, + removeProvider(aProvider) { + this.mProviders.delete(aProvider.QueryInterface(Ci.calIFreeBusyProvider)); + }, +}; |