]> www.infradead.org Git - users/dwmw2/ews-sync.git/commitdiff
Convert recurrence to GError
authorDavid Woodhouse <dwmw2@infradead.org>
Tue, 20 Jul 2010 23:56:32 +0000 (00:56 +0100)
committerDavid Woodhouse <dwmw2@infradead.org>
Tue, 20 Jul 2010 23:56:32 +0000 (00:56 +0100)
calitem_to_ical.c

index 4f4d0ba2ff3f0b1ef4d8d7b9d9d89eb713b5cd1b..6fd16a17f7ce398a1be504ac34c7e3b8f1f3348e 100644 (file)
@@ -24,12 +24,13 @@ GQuark ews_error_quark(void)
 {
        return g_quark_from_static_string("exchange-web-services");
 }
-int process_relativeyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error);
-int process_absoluteyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error);
-int process_relativemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error);
-int process_absolutemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error);
-int process_weeklyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error);
-int process_dailyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error);
+
+gboolean process_relativeyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error);
+gboolean process_absoluteyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error);
+gboolean process_relativemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error);
+gboolean process_absolutemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error);
+gboolean process_weeklyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error);
+gboolean process_dailyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error);
 
 gboolean process_organizer(icalcomponent *comp, xmlNode *xml_node, GError **error);
 gboolean process_required_attendees(icalcomponent *comp, xmlNode *xml_node, GError **error);
@@ -40,7 +41,7 @@ gboolean process_location(icalcomponent *comp, xmlNode *xml_node, GError **error
 gboolean process_sequence(icalcomponent *comp, xmlNode *xml_node, GError **error);
 gboolean process_body(icalcomponent *comp, xmlNode *xml_node, GError **error);
 gboolean process_subject(icalcomponent *comp, xmlNode *xml_node, GError **error);
-int process_recurrence(icalcomponent *comp, xmlNode *xml_node, icaltimezone *zone, GError **error);
+gboolean process_recurrence(icalcomponent *comp, xmlNode *xml_node, icaltimezone *zone, GError **error);
 gboolean process_deleted_occurrences(icalcomponent *comp, xmlNode *xml_node,
                                     icaltimetype **deletia, int *count, GError **error);
 gboolean process_itemid(icalcomponent *comp, xmlNode *xmlnode, GError **error);
@@ -105,9 +106,10 @@ icalcomponent *ews_calitem_to_ical(xmlNode *xml_node, GError **error)
                } else if (!strcmp((char *)xml_node->name, "Subject")) {
                        if (!process_subject(comp, xml_node, error))
                                goto err;
-               } else if (!strcmp((char *)xml_node->name, "Recurrence"))
-                       process_recurrence(comp, xml_node, icaltz, error);
-               else if (!strcmp((char *)xml_node->name, "DeletedOccurrences")) {
+               } else if (!strcmp((char *)xml_node->name, "Recurrence")) {
+                       if (!process_recurrence(comp, xml_node, icaltz, error))
+                               goto err;
+               } else if (!strcmp((char *)xml_node->name, "DeletedOccurrences")) {
                        if (!process_deleted_occurrences(comp, xml_node, &deletia, &deletia_count, error))
                                goto err;
                } else if (!strcmp((char *)xml_node->name, "ItemId")) {
@@ -441,7 +443,8 @@ static int month_to_number(const char *month, GError **error)
                        return monthnr + 1;
        }
 
-       fprintf(stderr, "Unrecognised month name '%s'\n", month);
+       g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                   "Unrecognised month name '%s'", month);
        return 0;
 }
 static int weekday_to_number(const char *day, int accept, GError **error)
@@ -457,10 +460,14 @@ static int weekday_to_number(const char *day, int accept, GError **error)
                        return daynr + 1;
        }
 
-       fprintf(stderr, "Unrecognised day name '%s'\n", day);
+       g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                   "Unrecognised day name '%s'", day);
        return 0;
 }
+
+#ifndef ARRAY_SIZE
 #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
+#endif
 
 static int weekindex_to_ical(const char *week, GError **error)
 {
@@ -480,7 +487,8 @@ static int weekindex_to_ical(const char *week, GError **error)
                if (!strcmp(week, table[i].exch))
                        return table[i].week;
        }
-       fprintf(stderr, "Unrecognised DayOfWeekIndex '%s'\n", week);
+       g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                   "Unrecognised DayOfWeekIndex '%s'", week);
        return 0;
 }      
 
@@ -522,7 +530,7 @@ gboolean process_deleted_occurrences(icalcomponent *comp, xmlNode *xml_node,
        return TRUE;
 }
 
-int process_recurrence(icalcomponent *comp, xmlNode *xml_node, icaltimezone *zone, GError **error)
+gboolean process_recurrence(icalcomponent *comp, xmlNode *xml_node, icaltimezone *zone, GError **error)
 {
        struct icalrecurrencetype ical_recur;
        char *end_date = NULL, *nr_occurrences = NULL;
@@ -531,29 +539,29 @@ int process_recurrence(icalcomponent *comp, xmlNode *xml_node, icaltimezone *zon
 
        ical_recur.freq = ICAL_NO_RECURRENCE;
        if (!zone)
-               fprintf(stderr, "Recurrence with no recognised TimeZone. Hope this is an all-day event\n");
+               g_warning("Recurrence with no recognised TimeZone. Hope this is an all-day event");
                
        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, "WeeklyRecurrence")) {
-                       if (process_weeklyrecurrence(xml_node, &ical_recur, error))
-                               return -1;
+                       if (!process_weeklyrecurrence(xml_node, &ical_recur, error))
+                               return FALSE;
                } else if (!strcmp((char *)xml_node->name, "DailyRecurrence")) {
-                       if (process_dailyrecurrence(xml_node, &ical_recur, error))
-                               return -1;
+                       if (!process_dailyrecurrence(xml_node, &ical_recur, error))
+                               return FALSE;
                } else if (!strcmp((char *)xml_node->name, "AbsoluteYearlyRecurrence")) {
-                       if (process_absoluteyearlyrecurrence(xml_node, &ical_recur, error))
-                               return -1;
+                       if (!process_absoluteyearlyrecurrence(xml_node, &ical_recur, error))
+                               return FALSE;
                } else if (!strcmp((char *)xml_node->name, "RelativeYearlyRecurrence")) {
-                       if (process_relativeyearlyrecurrence(xml_node, &ical_recur, error))
-                               return -1;
+                       if (!process_relativeyearlyrecurrence(xml_node, &ical_recur, error))
+                               return FALSE;
                } else if (!strcmp((char *)xml_node->name, "AbsoluteMonthlyRecurrence")) {
-                       if (process_absolutemonthlyrecurrence(xml_node, &ical_recur, error))
-                               return -1;
+                       if (!process_absolutemonthlyrecurrence(xml_node, &ical_recur, error))
+                               return FALSE;
                } else if (!strcmp((char *)xml_node->name, "RelativeMonthlyRecurrence")) {
-                       if (process_relativemonthlyrecurrence(xml_node, &ical_recur, error))
-                               return -1;
+                       if (!process_relativemonthlyrecurrence(xml_node, &ical_recur, error))
+                               return FALSE;
                } else if (!strcmp((char *)xml_node->name, "EndDateRecurrence")) {
                        for (xml_node2 = xml_node->children; xml_node2;
                             xml_node2 = xml_node2->next) {
@@ -573,16 +581,18 @@ int process_recurrence(icalcomponent *comp, xmlNode *xml_node, icaltimezone *zon
                }
        }
        if (ical_recur.freq == ICAL_NO_RECURRENCE) {
-               fprintf(stderr, "No recognised Recurrence type\n");
-               return -1;
+               g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                           "No recognised Recurrence type");
+               return FALSE;
        }
 
        if (end_date) {
                if (strlen(end_date) != 11 || end_date[4] != '-' ||
                    end_date[7] != '-' || end_date[10] != 'Z') {
-                       fprintf(stderr, "Failed to parse Recurrence EndDate '%s'\n",
-                               end_date);
-                       return -1;
+                       g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                                   "Failed to parse Recurrence EndDate '%s'",
+                                   end_date);
+                       return FALSE;
                }
                end_date = strdup(end_date);
                end_date[10] = 0;
@@ -592,7 +602,7 @@ int process_recurrence(icalcomponent *comp, xmlNode *xml_node, icaltimezone *zon
        }
        prop = icalproperty_new_rrule(ical_recur);
        icalcomponent_add_property(comp, prop);
-       return 0;
+       return TRUE;
 }
 
 gboolean process_itemid(icalcomponent *comp, xmlNode *xml_node, GError **error)
@@ -798,7 +808,7 @@ icaltimezone *get_timezone(xmlNode *xml_node, GError **error)
        return NULL;
 }
 
-int get_baseoffset(xmlNode *xml_node, int *retval, GError **error)
+gboolean get_baseoffset(xmlNode *xml_node, int *retval, GError **error)
 {
        const char *baseoffset;
        struct icaldurationtype ofs;
@@ -810,27 +820,30 @@ int get_baseoffset(xmlNode *xml_node, int *retval, GError **error)
                        break;
        }
        if (!xml_node) {
-               fprintf(stderr, "<MeetingTimeZone> has no <BaseOffset>\n");
-               return -1;
+               g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                           "<MeetingTimeZone> has no <BaseOffset>\n");
+               return FALSE;
        }
        baseoffset = (const char *)xmlNodeGetContent(xml_node);
        if (!baseoffset) {
-               fprintf(stderr, "<BaseOffset> is empty\n");
-               return -1;
+               g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                           "<BaseOffset> is empty\n");
+               return FALSE;
        }
        ofs = icaldurationtype_from_string(baseoffset);
        if (icaldurationtype_is_bad_duration(ofs)) {
-               fprintf(stderr, "Failed to parse <BaseOffset> '%s'\n", baseoffset);
-               return -1;
+               g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                           "Failed to parse <BaseOffset> '%s'\n", baseoffset);
+               return FALSE;
        }
        if (ofs.is_neg)
                *retval = ofs.minutes * 60;
        else
                *retval = -ofs.minutes * 60;
-       return 0;
+       return TRUE;
 }
 
-int process_relativeyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error)
+gboolean process_relativeyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error)
 {
        const char *week = NULL, *month = NULL, *weekday = NULL;
        int weeknr, monthnr, daynr;
@@ -847,21 +860,22 @@ int process_relativeyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetyp
                }
        }
        if (!week || !month || !weekday) {
-               fprintf(stderr, "RelativeYearlyRecurrence missing essential fields (%s,%s,%s)\n",
-                       week, month, weekday);
-               return -1;
+               g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                           "RelativeYearlyRecurrence missing essential fields (%s,%s,%s)",
+                           week, month, weekday);
+               return FALSE;
        }
        monthnr = month_to_number(month, error);
        if (!month)
-               return -1;
+               return FALSE;
 
        weeknr = weekindex_to_ical(week, error);
        if (!weeknr)
-               return -1;
+               return FALSE;
 
        daynr = weekday_to_number(weekday, 10, error);
        if (!daynr)
-               return -1;
+               return FALSE;
 
        icalrecurrencetype_clear(ical_recur);
        ical_recur->freq = ICAL_YEARLY_RECURRENCE;
@@ -888,9 +902,10 @@ int process_relativeyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetyp
                ical_recur->by_set_pos[0] = weeknr;
        }               
 
-       return 0;
+       return TRUE;
 }
-int process_absoluteyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error)
+
+gboolean process_absoluteyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error)
 {
        const char *day_of_month = NULL;
        const char *month = NULL;
@@ -906,27 +921,29 @@ int process_absoluteyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetyp
                        month = (char *)xmlNodeGetContent(xml_node);
        }
        if (!day_of_month || !month) {
-               fprintf(stderr, "AbsoluteYearlyRecurrence missing essential fields (%s,%s)\n",
-                       day_of_month, month);
-               return -1;
+               g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                           "AbsoluteYearlyRecurrence missing essential fields (%s,%s)",
+                           day_of_month, month);
+               return FALSE;
        }
        daynr = strtol(day_of_month, NULL, 10);
        if (!daynr) {
-               fprintf(stderr, "Failed to parse DayOfMonth '%s'\n", day_of_month);
-               return -1;
+               g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                           "Failed to parse DayOfMonth '%s'", day_of_month);
+               return FALSE;
        }
        monthnr = month_to_number(month, error);
        if (!month)
-               return -1;
+               return FALSE;
 
        icalrecurrencetype_clear(ical_recur);
        ical_recur->freq = ICAL_YEARLY_RECURRENCE;
        ical_recur->by_month[0] = monthnr;
        ical_recur->by_month_day[0] = daynr;
-       return 0;
+       return TRUE;
 }
 
-int process_relativemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error)
+gboolean process_relativemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error)
 {
        const char *week = NULL, *interval = NULL, *weekday = NULL;
        int weeknr, intervalnr, daynr;
@@ -943,22 +960,24 @@ int process_relativemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencety
                }
        }
        if (!week || !interval || !weekday) {
-               fprintf(stderr, "RelativeMonthlyRecurrence missing essential fields (%s,%s,%s)\n",
-                       week, interval, weekday);
-               return -1;
+               g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                           "RelativeMonthlyRecurrence missing essential fields (%s,%s,%s)",
+                           week, interval, weekday);
+               return FALSE;
        }
        intervalnr = strtol(interval, NULL, 10);
        if (!intervalnr) {
-               fprintf(stderr, "Failed to parse Interval '%s'\n", interval);
-               return -1;
+               g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                           "Failed to parse Interval '%s'", interval);
+               return FALSE;
        }
        weeknr = weekindex_to_ical(week, error);
        if (!weeknr)
-               return -1;
+               return FALSE;
 
        daynr = weekday_to_number(weekday, 10, error);
        if (!daynr)
-               return -1;
+               return FALSE;
 
        icalrecurrencetype_clear(ical_recur);
        ical_recur->freq = ICAL_MONTHLY_RECURRENCE;
@@ -981,11 +1000,12 @@ int process_relativemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencety
                ical_recur->by_day[0] = 1;
                ical_recur->by_day[1] = 7;
                ical_recur->by_set_pos[0] = weeknr;
-       }               
-                                
-       return 0;
+       }
+       return TRUE;
 }
-int process_absolutemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error)
+
+gboolean process_absolutemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur,
+                                          GError **error)
 {
        const char *interval = NULL, *monthday = NULL;
        int intervalnr, monthdaynr;
@@ -1000,29 +1020,32 @@ int process_absolutemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencety
                }
        }
        if (!interval || !monthday) {
-               fprintf(stderr, "AbsoluteMonthlyRecurrence missing essential fields (%s,%s)\n",
-                       interval, monthday);
-               return -1;
+               g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                           "AbsoluteMonthlyRecurrence missing essential fields (%s,%s)",
+                           interval, monthday);
+               return FALSE;
        }
        intervalnr = strtol(interval, NULL, 10);
        if (!intervalnr) {
-               fprintf(stderr, "Failed to parse Interval '%s'\n", interval);
-               return -1;
+               g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                           "Failed to parse Interval '%s'", interval);
+               return FALSE;
        }
        monthdaynr = strtol(monthday, NULL, 10);
        if (!monthday) {
-               fprintf(stderr, "Failed to parse DayOfMonth '%s'\n", monthday);
-               return -1;
+               g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                           "Failed to parse DayOfMonth '%s'", monthday);
+               return FALSE;
        }
 
        icalrecurrencetype_clear(ical_recur);
        ical_recur->freq = ICAL_MONTHLY_RECURRENCE;
        ical_recur->interval = intervalnr;
        ical_recur->by_month_day[0] = monthdaynr;
-       return 0;
+       return TRUE;
 }
 
-static int weekdays_to_recur_byday(const char *days, struct icalrecurrencetype *ical_recur, GError **error)
+gboolean weekdays_to_recur_byday(const char *days, struct icalrecurrencetype *ical_recur, GError **error)
 {
        const char *space;
        const char *day;
@@ -1038,11 +1061,12 @@ static int weekdays_to_recur_byday(const char *days, struct icalrecurrencetype *
 
                daynr = weekday_to_number(day, 7, error);
                if (!daynr)
-                       return -1;
+                       return FALSE;
 
                if (count == ICAL_BY_DAY_SIZE) {
-                       fprintf(stderr, "Too many days in DaysOfWeek list\n");
-                       return -1;
+                       g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                                   "Too many days in DaysOfWeek list");
+                       return FALSE;
                }
 
                ical_recur->by_day[count++] = daynr;
@@ -1051,12 +1075,10 @@ static int weekdays_to_recur_byday(const char *days, struct icalrecurrencetype *
                        days = space + 1;
                }
        } while (space);
-       return 0;
+       return TRUE;
 }
-       
-
 
-int process_weeklyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error)
+gboolean process_weeklyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error)
 {
        const char *interval = NULL, *weekday = NULL, *firstday = NULL;
        int intervalnr, firstdaynr;
@@ -1073,14 +1095,16 @@ int process_weeklyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_
                }
        }
        if (!interval || !weekday) {
-               fprintf(stderr, "WeeklyRecurrence missing essential fields (%s,%s)\n",
-                       interval, weekday);
-               return -1;
+               g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                           "WeeklyRecurrence missing essential fields (%s,%s)",
+                           interval, weekday);
+               return FALSE;
        }
        intervalnr = strtol(interval, NULL, 10);
        if (!intervalnr) {
-               fprintf(stderr, "Failed to parse Interval '%s'\n", interval);
-               return -1;
+               g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                           "Failed to parse Interval '%s'", interval);
+               return FALSE;
        }
        if (firstday)
                firstdaynr = weekday_to_number(firstday, 7, error);
@@ -1091,13 +1115,14 @@ int process_weeklyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_
        ical_recur->interval = intervalnr;
        ical_recur->week_start = firstdaynr;
 
-       if (weekdays_to_recur_byday(weekday, ical_recur, error))
-               return -1;
+       if (!weekdays_to_recur_byday(weekday, ical_recur, error))
+               return FALSE;
 
        ical_recur->freq = ICAL_WEEKLY_RECURRENCE;
-       return 0;
+       return TRUE;
 }
-int process_dailyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error)
+
+gboolean process_dailyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error)
 {
        const char *interval = NULL;
        int intervalnr;
@@ -1110,22 +1135,24 @@ int process_dailyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_r
                }
        }
        if (!interval) {
-               fprintf(stderr, "DailyRecurrence missing essential fields (%s)\n",
-                       interval);
-               return -1;
+               g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE, 
+                           "DailyRecurrence missing essential fields (%s)",
+                           interval);
+               return FALSE;
        }
        intervalnr = strtol(interval, NULL, 10);
        if (!intervalnr) {
-               fprintf(stderr, "Failed to parse Interval '%s'\n", interval);
-               return -1;
+               g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE,
+                           "Failed to parse Interval '%s'", interval);
+               return FALSE;
        }
 
        icalrecurrencetype_clear(ical_recur);
        ical_recur->freq = ICAL_DAILY_RECURRENCE;
        ical_recur->interval = intervalnr;
-
-       return 0;
+       return TRUE;
 }
+
 icalcomponent *process_timezone_rule(xmlNode *xml_node, icalcomponent_kind kind,
                                     int *offset, GError **error)
 {
@@ -1213,7 +1240,7 @@ icaltimezone *get_meeting_timezone(xmlNode *xml_node, GError **error)
        prop = icalproperty_new_tzid(tzname);
        icalcomponent_add_property(comp, prop);
 
-       if (get_baseoffset(xml_node, &std_offset, error))
+       if (!get_baseoffset(xml_node, &std_offset, error))
                return NULL;
        dst_offset = std_offset;