+
+ /* Non-VTIMEZONE components each get written as individual messages.
+ * But we also need to attach the relevant VTIMEZONE components to them.
+ */
+ if ( (icalcomponent_isa(c) != ICAL_VTIMEZONE_COMPONENT)
+ && (encaps = icalcomponent_new_vcalendar()) ) {
+ icalcomponent_add_property(encaps, icalproperty_new_prodid(PRODID));
+ icalcomponent_add_property(encaps, icalproperty_new_version("2.0"));
+ icalcomponent_set_method(encaps, ICAL_METHOD_PUBLISH);
+
+ /* Attach any needed timezones here */
+ tzidlist = NewHash(1, NULL);
+ if (tzidlist) {
+ icalcomponent_foreach_tzid(c, ical_putics_grabtzids, tzidlist);
+ }
+ HashPos = GetNewHashPos(tzidlist, 0);
+
+ while (GetNextHashPos(tzidlist, HashPos, &len, &Key, &Value)) {
+ syslog(LOG_DEBUG, "calendar: attaching timezone '%s'", (char*) Value);
+ icaltimezone *t = NULL;
+
+ /* First look for a timezone attached to the original calendar */
+ t = icalcomponent_get_timezone(cal, Value);
+
+ /* Try built-in tzdata if the right one wasn't attached */
+ if (!t) {
+ t = icaltimezone_get_builtin_timezone(Value);
+ }
+
+ /* I've got a valid timezone to attach. */
+ if (t) {
+ icalcomponent_add_component(encaps,
+ icalcomponent_new_clone(
+ icaltimezone_get_component(t)
+ )
+ );
+ }
+
+ }
+ DeleteHashPos(&HashPos);
+ DeleteHash(&tzidlist);
+
+ /* Now attach the component itself (usually a VEVENT or VTODO) */
+ icalcomponent_add_component(encaps, icalcomponent_new_clone(c));
+
+ /* Write it to the message store */
+ ical_write_to_cal(NULL, encaps);
+ icalcomponent_free(encaps);
+ }