summaryrefslogtreecommitdiff
path: root/calendar/lightning/components/lightningTextCalendarConverter.js
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/lightning/components/lightningTextCalendarConverter.js')
-rw-r--r--calendar/lightning/components/lightningTextCalendarConverter.js92
1 files changed, 92 insertions, 0 deletions
diff --git a/calendar/lightning/components/lightningTextCalendarConverter.js b/calendar/lightning/components/lightningTextCalendarConverter.js
new file mode 100644
index 000000000..cf33ea6da
--- /dev/null
+++ b/calendar/lightning/components/lightningTextCalendarConverter.js
@@ -0,0 +1,92 @@
+/* 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/. */
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+Components.utils.import("resource://gre/modules/Services.jsm");
+Components.utils.import("resource://calendar/modules/calUtils.jsm");
+Components.utils.import("resource://calendar/modules/calXMLUtils.jsm");
+Components.utils.import("resource://calendar/modules/calRecurrenceUtils.jsm");
+Components.utils.import("resource://calendar/modules/ltnInvitationUtils.jsm");
+
+function ltnMimeConverter() {
+ this.wrappedJSObject = this;
+}
+
+var ltnMimeConverterClassID = Components.ID("{c70acb08-464e-4e55-899d-b2c84c5409fa}");
+var ltnMimeConverterInterfaces = [Components.interfaces.nsISimpleMimeConverter];
+ltnMimeConverter.prototype = {
+ classID: ltnMimeConverterClassID,
+ QueryInterface: XPCOMUtils.generateQI(ltnMimeConverterInterfaces),
+
+ classInfo: XPCOMUtils.generateCI({
+ classID: ltnMimeConverterClassID,
+ contractID: "@mozilla.org/lightning/mime-converter;1",
+ classDescription: "Lightning text/calendar handler",
+ interfaces: ltnMimeConverterInterfaces
+ }),
+
+ uri: null,
+
+ convertToHTML: function(contentType, data) {
+ let parser = Components.classes["@mozilla.org/calendar/ics-parser;1"]
+ .createInstance(Components.interfaces.calIIcsParser);
+ parser.parseString(data);
+ let event = null;
+ for (let item of parser.getItems({})) {
+ if (cal.isEvent(item)) {
+ if (item.hasProperty("X-MOZ-FAKED-MASTER")) {
+ // if it's a faked master, take any overridden item to get a real occurrence:
+ let exc = item.recurrenceInfo.getExceptionFor(item.startDate);
+ cal.ASSERT(exc, "unexpected!");
+ if (exc) {
+ item = exc;
+ }
+ }
+ event = item;
+ break;
+ }
+ }
+ if (!event) {
+ return "";
+ }
+
+ let itipItem = null;
+ let msgOverlay = "";
+ let msgWindow = null;
+
+ itipItem = Components.classes["@mozilla.org/calendar/itip-item;1"]
+ .createInstance(Components.interfaces.calIItipItem);
+ itipItem.init(data);
+
+ // this.uri is the message URL that we are processing.
+ // We use it to get the nsMsgHeaderSink to store the calItipItem.
+ if (this.uri) {
+ try {
+ let msgUrl = this.uri.QueryInterface(Components.interfaces.nsIMsgMailNewsUrl);
+ msgWindow = msgUrl.msgWindow;
+ itipItem.sender = msgUrl.mimeHeaders.extractHeader("From", false);
+ } catch (exc) {
+ // msgWindow is optional in some scenarios
+ // (e.g. gloda in action, throws NS_ERROR_INVALID_POINTER then)
+ }
+ }
+
+ // msgOverlay needs to be defined irrespectively of the existance of msgWindow to not break
+ // printing of invitation emails
+ let dom = ltn.invitation.createInvitationOverlay(event, itipItem);
+ msgOverlay = cal.xml.serializeDOM(dom);
+
+ if (msgWindow) {
+ let sinkProps = msgWindow.msgHeaderSink.properties;
+ sinkProps.setPropertyAsInterface("itipItem", itipItem);
+ sinkProps.setPropertyAsAUTF8String("msgOverlay", msgOverlay);
+
+ // Notify the observer that the itipItem is available
+ Services.obs.notifyObservers(null, "onItipItemCreation", 0);
+ }
+ return msgOverlay;
+ }
+};
+
+this.NSGetFactory = XPCOMUtils.generateNSGetFactory([ltnMimeConverter]);