summaryrefslogtreecommitdiffstats
path: root/comm/calendar/base/src/CalIcsSerializer.jsm
blob: ebdf84f9e795331773372eb84545a486d2f70b28 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/* 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 = ["CalIcsSerializer"];

var { cal } = ChromeUtils.import("resource:///modules/calendar/calUtils.jsm");

function CalIcsSerializer() {
  this.wrappedJSObject = this;
  this.mItems = [];
  this.mProperties = [];
  this.mComponents = [];
}
CalIcsSerializer.prototype = {
  QueryInterface: ChromeUtils.generateQI(["calIIcsSerializer"]),
  classID: Components.ID("{207a6682-8ff1-4203-9160-729ec28c8766}"),

  addItems(aItems) {
    if (aItems.length > 0) {
      this.mItems = this.mItems.concat(aItems);
    }
  },

  addProperty(aProperty) {
    this.mProperties.push(aProperty);
  },

  addComponent(aComponent) {
    this.mComponents.push(aComponent);
  },

  serializeToString() {
    let calComp = this.getIcalComponent();
    return calComp.serializeToICS();
  },

  serializeToInputStream(aStream) {
    let calComp = this.getIcalComponent();
    return calComp.serializeToICSStream();
  },

  serializeToStream(aStream) {
    let str = this.serializeToString();

    // Convert the javascript string to an array of bytes, using the
    // UTF8 encoder
    let convStream = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(
      Ci.nsIConverterOutputStream
    );
    convStream.init(aStream, "UTF-8");

    convStream.writeString(str);
    convStream.close();
  },

  getIcalComponent() {
    let calComp = cal.icsService.createIcalComponent("VCALENDAR");
    cal.item.setStaticProps(calComp);

    // xxx todo: think about that the below code doesn't clone the properties/components,
    //           thus ownership is moved to returned VCALENDAR...

    for (let prop of this.mProperties) {
      calComp.addProperty(prop);
    }
    for (let comp of this.mComponents) {
      calComp.addSubcomponent(comp);
    }

    for (let item of cal.iterate.items(this.mItems)) {
      calComp.addSubcomponent(item.icalComponent);
    }

    return calComp;
  },
};