From: David Woodhouse Date: Tue, 20 Jul 2010 13:05:01 +0000 (+0100) Subject: Handle DeletedOccurrences, free custom TZ on completion X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=36ec0e288970db1c11903f60b6a8aa4e8735db6c;p=users%2Fdwmw2%2Fews-sync.git Handle DeletedOccurrences, free custom TZ on completion --- diff --git a/calitem_to_ical.c b/calitem_to_ical.c index 203e9da..a890d45 100644 --- a/calitem_to_ical.c +++ b/calitem_to_ical.c @@ -36,6 +36,8 @@ int process_sequence(icalcomponent *comp, xmlNode *xml_node); 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); @@ -46,7 +48,10 @@ icalcomponent *ews_calitem_to_ical(xmlNode *xml_node); 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; @@ -59,11 +64,14 @@ icalcomponent *ews_calitem_to_ical(xmlNode *xml_node) 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); @@ -88,6 +96,8 @@ icalcomponent *ews_calitem_to_ical(xmlNode *xml_node) 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")) @@ -166,7 +176,17 @@ icalcomponent *ews_calitem_to_ical(xmlNode *xml_node) 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; } @@ -424,7 +444,43 @@ static int weekindex_to_ical(const char *week) 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 \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;