diff options
Diffstat (limited to 'comm/calendar/base/src/CalRelation.jsm')
-rw-r--r-- | comm/calendar/base/src/CalRelation.jsm | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/comm/calendar/base/src/CalRelation.jsm b/comm/calendar/base/src/CalRelation.jsm new file mode 100644 index 0000000000..78327d962c --- /dev/null +++ b/comm/calendar/base/src/CalRelation.jsm @@ -0,0 +1,125 @@ +/* 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 = ["CalRelation"]; + +var { cal } = ChromeUtils.import("resource:///modules/calendar/calUtils.jsm"); + +/** + * Constructor for `calIRelation` objects. + * + * @class + * @implements {calIRelation} + * @param {string} [icalString] - Optional iCal string for initializing existing relations. + */ +function CalRelation(icalString) { + this.wrappedJSObject = this; + this.mProperties = new Map(); + if (icalString) { + this.icalString = icalString; + } +} +CalRelation.prototype = { + QueryInterface: ChromeUtils.generateQI(["calIRelation"]), + classID: Components.ID("{76810fae-abad-4019-917a-08e95d5bbd68}"), + + mType: null, + mId: null, + + /** + * @see calIRelation + */ + + get relType() { + return this.mType; + }, + set relType(aType) { + this.mType = aType; + }, + + get relId() { + return this.mId; + }, + set relId(aRelId) { + this.mId = aRelId; + }, + + get icalProperty() { + let icalatt = cal.icsService.createIcalProperty("RELATED-TO"); + if (this.mId) { + icalatt.value = this.mId; + } + + if (this.mType) { + icalatt.setParameter("RELTYPE", this.mType); + } + + for (let [key, value] of this.mProperties.entries()) { + try { + icalatt.setParameter(key, value); + } catch (e) { + if (e.result == Cr.NS_ERROR_ILLEGAL_VALUE) { + // Illegal values should be ignored, but we could log them if + // the user has enabled logging. + cal.LOG("Warning: Invalid relation property value " + key + "=" + value); + } else { + throw e; + } + } + } + return icalatt; + }, + + set icalProperty(attProp) { + // Reset the property bag for the parameters, it will be re-initialized + // from the ical property. + this.mProperties = new Map(); + + if (attProp.value) { + this.mId = attProp.value; + } + for (let [name, value] of cal.iterate.icalParameter(attProp)) { + if (name == "RELTYPE") { + this.mType = value; + continue; + } + + this.setParameter(name, value); + } + }, + + get icalString() { + let comp = this.icalProperty; + return comp ? comp.icalString : ""; + }, + set icalString(val) { + let prop = cal.icsService.createIcalPropertyFromString(val); + if (prop.propertyName != "RELATED-TO") { + throw Components.Exception("", Cr.NS_ERROR_ILLEGAL_VALUE); + } + this.icalProperty = prop; + }, + + getParameter(aName) { + return this.mProperties.get(aName); + }, + + setParameter(aName, aValue) { + return this.mProperties.set(aName, aValue); + }, + + deleteParameter(aName) { + return this.mProperties.delete(aName); + }, + + clone() { + let newRelation = new CalRelation(); + newRelation.mId = this.mId; + newRelation.mType = this.mType; + for (let [name, value] of this.mProperties.entries()) { + newRelation.mProperties.set(name, value); + } + return newRelation; + }, +}; |