]> www.infradead.org Git - users/dwmw2/ews-sync.git/commitdiff
Handle DeletedOccurrences, free custom TZ on completion
authorDavid Woodhouse <dwmw2@infradead.org>
Tue, 20 Jul 2010 13:05:01 +0000 (14:05 +0100)
committerDavid Woodhouse <dwmw2@infradead.org>
Tue, 20 Jul 2010 13:05:01 +0000 (14:05 +0100)
calitem_to_ical.c

index 203e9da1c43d87190b9a8d42962eab1bcf086c37..a890d451350997c4ba4eb3958de0910730298bf1 100644 (file)
@@ -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 <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;