int process_body(icalcomponent *comp, xmlNode *xml_node);
int process_subject(icalcomponent *comp, xmlNode *xml_node);
int process_recurrence(icalcomponent *comp, xmlNode *xml_node, icaltimezone *zone);
+int process_deleted_occurrences(icalcomponent *comp, xmlNode *xml_node,
+ icaltimetype **deletia, int *count);
int process_itemid(icalcomponent *comp, xmlNode *xmlnode);
int process_reminder_mins(icalcomponent *comp, xmlNode *xmlnode);
icaltimezone *get_timezone(xmlNode *xmlnode);
icalcomponent *ews_calitem_to_ical(xmlNode *xml_node)
{
icaltimetype dtstart, dtend;
+ icaltimetype *deletia = NULL;
+ int i, deletia_count = 0;
icaltimezone *icaltz;
+ gboolean freetz = FALSE;
icalcomponent *comp, *calcomp;
icalproperty *prop;
gboolean allday = FALSE;
icalcomponent_add_property(calcomp, prop);
icaltz = get_meeting_timezone(xml_node);
- if (!icaltz)
+ if (icaltz)
+ freetz = TRUE;
+ else {
icaltz = get_timezone(xml_node);
- if (icaltz) {
- icalcomponent *comp = icaltimezone_get_component(icaltz);
- icalcomponent_add_component(calcomp, comp);
+ if (icaltz) {
+ icalcomponent *comp = icaltimezone_get_component(icaltz);
+ icalcomponent_add_component(calcomp, comp);
+ }
}
comp = icalcomponent_new(ICAL_VEVENT_COMPONENT);
process_subject(comp, xml_node);
else if (!strcmp((char *)xml_node->name, "Recurrence"))
process_recurrence(comp, xml_node, icaltz);
+ else if (!strcmp((char *)xml_node->name, "DeletedOccurrences"))
+ process_deleted_occurrences(comp, xml_node, &deletia, &deletia_count);
else if (!strcmp((char *)xml_node->name, "ItemId"))
process_itemid(comp, xml_node);
else if (!strcmp((char *)xml_node->name, "IsAllDayEvent"))
if (!icaltime_is_null_time(dtend))
icalcomponent_set_dtend(comp, dtend);
-
+ if (deletia) {
+ for (i = 0; i < deletia_count; i++) {
+ if (icaltz)
+ deletia[i] = icaltime_convert_to_zone(deletia[i], icaltz);
+ prop = icalproperty_new_exdate(deletia[i]);
+ icalcomponent_add_property(comp, prop);
+ }
+ free(deletia);
+ }
+ if (freetz)
+ icaltimezone_free(icaltz, 1);
icalcomponent_add_component(calcomp, comp);
return calcomp;
}
fprintf(stderr, "Unrecognised DayOfWeekIndex '%s'\n", week);
return 0;
}
-
+
+int process_deleted_occurrences(icalcomponent *comp, xmlNode *xml_node,
+ icaltimetype **deletia_ret, int *count_ret)
+{
+ icaltimetype *deletia = NULL;
+ int count = 0;
+ xmlNode *xml_node2;
+
+ for (xml_node = xml_node->children; xml_node; xml_node = xml_node->next) {
+ if (xml_node->type != XML_ELEMENT_NODE)
+ continue;
+ if (strcmp((char *)xml_node->name, "DeletedOccurrence")) {
+ fprintf(stderr, "Unknown element %s in <DeletedOccurrences>\n",
+ xml_node->name);
+ return -1;
+ }
+ for (xml_node2 = xml_node->children; xml_node2; xml_node2 = xml_node2->next) {
+ if (xml_node2->type == XML_ELEMENT_NODE &&
+ !strcmp((char *)xml_node2->name, "Start"))
+ break;
+ }
+ if (!xml_node2) {
+ fprintf(stderr, "DeletedOccurrence has no Start\n");
+ return -1;
+ }
+ count++;
+ deletia = realloc(deletia, sizeof(icaltimetype) * count);
+ if (process_time(comp, xml_node2, &deletia[count-1])) {
+ free(deletia);
+ return -1;
+ }
+ }
+ *deletia_ret = deletia;
+ *count_ret = count;
+ return 0;
+}
+
int process_recurrence(icalcomponent *comp, xmlNode *xml_node, icaltimezone *zone)
{
struct icalrecurrencetype ical_recur;