Skip to content

Commit d4d6d09

Browse files
committed
Provide returnFormat option to onBeforeSend listener
1 parent 6212d38 commit d4d6d09

File tree

2 files changed

+65
-34
lines changed

2 files changed

+65
-34
lines changed

calendar/experiments/calendar/parent/ext-calendar-provider.js

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -131,42 +131,17 @@ class ExtCalendarProvider extends cal.provider.BaseClass {
131131
scheme = "mailto";
132132

133133
async sendItems(aRecipients, aItipItem) {
134-
let responseMethod = aItipItem.responseMethod;
135134
let transport = super.getProperty("itip.transport").wrappedJSObject;
136135
let { subject, body } = transport._prepareItems(aItipItem);
137-
let serializer = Cc["@mozilla.org/calendar/ics-serializer;1"].createInstance(Ci.calIIcsSerializer);
138-
let itemList = aItipItem.getItemList();
139-
serializer.addItems(itemList, itemList.length);
140-
let methodProp = cal.getIcsService().createIcalProperty("METHOD");
141-
methodProp.value = responseMethod;
142-
serializer.addProperty(methodProp);
143-
let icsText = serializer.serializeToString();
144-
let boundary = Array.from({ length: 24 }, () => Math.floor(Math.random() * 16).toString(16)).join("");
145-
let headers = new Map();
146-
headers.set("Date", [new Date()]);
147-
headers.set("Subject", [subject]);
148-
headers.set("To", aRecipients.map(attendee => ({ name: attendee.commonName, email: attendee.id.replace(/^mailto:/, "")})));
149-
headers.set("Content-Type", ["multipart/mixed; boundary=\"" + boundary + "\""]);
150-
let mimeContent = jsmime.headeremitter.emitStructuredHeaders(headers, { hardMargin: 800 }) + "\r\n";
151-
mimeContent += "--" + boundary + "\r\n";
152-
mimeContent += "Content-Type: text/plain; charset=UTF-8\r\n\r\n";
153-
mimeContent += body + "\r\n";
154-
mimeContent += "--" + boundary + "\r\n";
155-
mimeContent += "Content-Type: text/calendar; method=" + responseMethod + "; charset=UTF-8\r\nContent-Transfer-Encoding: 8BIT\r\n\r\n";
156-
mimeContent += icsText;
157-
mimeContent += "--" + boundary + "\r\n";
158-
mimeContent += "Content-Type: application/ics; name=\"invite.ics\"\r\nContent-Disposition: attachment; filename=\"invite.ics\"\r\nContent-Transfer-Encoding: 8BIT\r\n\r\n";
159-
mimeContent += icsText;
160-
mimeContent += "--" + boundary + "--\r\n";
161-
let recipients = aRecipients.map(attendee => attendee.id.replace(/^mailto:/, ""));
162-
let responses = await this.extension.emit("calendar.provider.onBeforeSend", this, { responseMethod, recipients, subject, body, icsText, mimeContent });
136+
let recipients = aRecipients.map(attendee => ({ name: attendee.commonName, email: attendee.id.replace(/^mailto:/, "")}));
137+
let responses = await this.extension.emit("calendar.provider.onBeforeSend", this, aItipItem, { recipients, subject, body });
163138
for (let response of responses) {
164139
if (response === true) {
165140
return;
166141
}
167142
if (Array.isArray(response?.recipients)) {
168143
for (let recipient of response.recipients) {
169-
aRecipients = aRecipients.filter(attendee => attendee.id.replace(/^mailto:/, "") != recipient);
144+
aRecipients = aRecipients.filter(attendee => attendee.id.replace(/^mailto:/, "") != recipient.email);
170145
}
171146
}
172147
}
@@ -509,8 +484,41 @@ this.calendar_provider = class extends ExtensionAPI {
509484
onBeforeSend: new EventManager({
510485
context,
511486
name: "calendar.provider.onBeforeSend",
512-
register: fire => {
513-
let listener = (event, calendar, content) => {
487+
register: (fire, options) => {
488+
let listener = (event, calendar, itipItem, content) => {
489+
content.responseMethod = itipItem.responseMethod;
490+
if (["ics", "mime"].includes(options?.returnFormat)) {
491+
let serializer = Cc["@mozilla.org/calendar/ics-serializer;1"].createInstance(Ci.calIIcsSerializer);
492+
serializer.addItems(itipItem.getItemList());
493+
let methodProp = cal.getIcsService().createIcalProperty("METHOD");
494+
methodProp.value = content.responseMethod;
495+
serializer.addProperty(methodProp);
496+
let icsText = serializer.serializeToString();
497+
if (options.returnFormat == "mime") {
498+
let boundary = Array.from({ length: 24 }, () => Math.floor(Math.random() * 16).toString(16)).join("");
499+
let headers = new Map();
500+
headers.set("Date", [new Date()]);
501+
headers.set("Subject", [content.subject]);
502+
headers.set("To", content.recipients);
503+
headers.set("Content-Type", ["multipart/mixed; boundary=\"" + boundary + "\""]);
504+
let mimeContent = jsmime.headeremitter.emitStructuredHeaders(headers, { hardMargin: 800 }) + "\r\n";
505+
mimeContent += "--" + boundary + "\r\n";
506+
mimeContent += "Content-Type: text/plain; charset=UTF-8\r\n\r\n";
507+
mimeContent += content.body + "\r\n";
508+
mimeContent += "--" + boundary + "\r\n";
509+
mimeContent += "Content-Type: text/calendar; method=" + content.responseMethod + "; charset=UTF-8\r\nContent-Transfer-Encoding: 8BIT\r\n\r\n";
510+
mimeContent += icsText;
511+
mimeContent += "--" + boundary + "\r\n";
512+
mimeContent += "Content-Type: application/ics; name=\"invite.ics\"\r\nContent-Disposition: attachment; filename=\"invite.ics\"\r\nContent-Transfer-Encoding: 8BIT\r\n\r\n";
513+
mimeContent += icsText;
514+
mimeContent += "--" + boundary + "--\r\n";
515+
content.mimeContent = mimeContent;
516+
} else {
517+
content.icsText = icsText;
518+
}
519+
} else {
520+
content.items = itipItem.getItemList().map(item => convertItem(item, options, context.extension));
521+
}
514522
return fire.async(convertCalendar(context.extension, calendar), content);
515523
};
516524

calendar/experiments/calendar/schema/calendar-provider.json

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,15 +93,38 @@
9393
"parameters": [
9494
{ "name": "calendar", "$ref": "calendar.calendars.Calendar" },
9595
{
96-
"name": "mimeContent",
96+
"name": "content",
9797
"type": "object",
9898
"properties": {
9999
"responseMethod": { "type": "string" },
100-
"recipients": { "type": "array", "items": { "type": "string" } },
100+
"recipients": {
101+
"type": "array",
102+
"items": {
103+
"type": "object",
104+
"properties": {
105+
"name": { "type": "string" },
106+
"email": { "type": "string" }
107+
}
108+
}
109+
},
101110
"subject": { "type": "string" },
102111
"body": { "type": "string" },
103-
"icsText": { "type": "string" },
104-
"mimeContent": { "type": "string" }
112+
"items": { "type": "array", "items": { "$ref": "calendar.items.CalendarItem" }, "optional": true },
113+
"icsText": { "type": "string", "optional": true },
114+
"mimeContent": { "type": "string", "optional": true }
115+
}
116+
}
117+
],
118+
"extraParameters": [
119+
{
120+
"type": "object",
121+
"optional": true,
122+
"properties": {
123+
"returnFormat": {
124+
"optional": true,
125+
"type": "string",
126+
"enum": ["ical", "jcal", "ics", "mime"]
127+
}
105128
}
106129
}
107130
]

0 commit comments

Comments
 (0)