From 6e0b75b8f1aa680253785679f21feca3771142de Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Wed, 21 Jul 2010 00:04:50 +0100 Subject: [PATCH] Start converting to use GError --- calitem_to_ical.c | 144 +++++++++++++++++++++++++--------------------- ews2ical.c | 11 +++- ews_syncfolder.c | 11 ++-- libews.h | 10 +++- 4 files changed, 104 insertions(+), 72 deletions(-) diff --git a/calitem_to_ical.c b/calitem_to_ical.c index 0e1555b..776538f 100644 --- a/calitem_to_ical.c +++ b/calitem_to_ical.c @@ -16,36 +16,40 @@ #include #include +#include -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); - -int process_organizer(icalcomponent *comp, xmlNode *xml_node, GError *error); -int process_required_attendees(icalcomponent *comp, xmlNode *xml_node, GError *error); -int process_optional_attendees(icalcomponent *comp, xmlNode *xml_node, GError *error); -int process_time(icalcomponent *comp, xmlNode *xml_node, icaltimetype *ical_time, GError *error); -int process_truefalse(icalcomponent *comp, xmlNode *xml_node, gboolean *val, GError *error); -int process_location(icalcomponent *comp, xmlNode *xml_node, GError *error); -int process_sequence(icalcomponent *comp, xmlNode *xml_node, GError *error); -int process_body(icalcomponent *comp, xmlNode *xml_node, GError *error); -int process_subject(icalcomponent *comp, xmlNode *xml_node, GError *error); -int process_recurrence(icalcomponent *comp, xmlNode *xml_node, icaltimezone *zone, GError *error); -int process_deleted_occurrences(icalcomponent *comp, xmlNode *xml_node, - icaltimetype **deletia, int *count, GError *error); -int process_itemid(icalcomponent *comp, xmlNode *xmlnode, GError *error); -int process_reminder_mins(icalcomponent *comp, xmlNode *xmlnode, GError *error); -icaltimezone *get_timezone(xmlNode *xmlnode, GError *error); -icaltimezone *get_meeting_timezone(xmlNode *xml_node, GError *error); +#include "libews.h" -icalcomponent *ews_calitem_to_ical(xmlNode *xml_node); +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); + +int process_organizer(icalcomponent *comp, xmlNode *xml_node, GError **error); +int process_required_attendees(icalcomponent *comp, xmlNode *xml_node, GError **error); +int process_optional_attendees(icalcomponent *comp, xmlNode *xml_node, GError **error); +int process_time(icalcomponent *comp, xmlNode *xml_node, icaltimetype *ical_time, GError **error); +gboolean process_truefalse(icalcomponent *comp, xmlNode *xml_node, gboolean *val, GError **error); +int process_location(icalcomponent *comp, xmlNode *xml_node, GError **error); +int process_sequence(icalcomponent *comp, xmlNode *xml_node, GError **error); +int process_body(icalcomponent *comp, xmlNode *xml_node, GError **error); +int process_subject(icalcomponent *comp, xmlNode *xml_node, GError **error); +int process_recurrence(icalcomponent *comp, xmlNode *xml_node, icaltimezone *zone, GError **error); +int process_deleted_occurrences(icalcomponent *comp, xmlNode *xml_node, + icaltimetype **deletia, int *count, GError **error); +int process_itemid(icalcomponent *comp, xmlNode *xmlnode, GError **error); +int process_reminder_mins(icalcomponent *comp, xmlNode *xmlnode, GError **error); +icaltimezone *get_timezone(xmlNode *xmlnode, GError **error); +icaltimezone *get_meeting_timezone(xmlNode *xml_node, GError **error); -icalcomponent *ews_calitem_to_ical(xmlNode *xml_node) +icalcomponent *ews_calitem_to_ical(xmlNode *xml_node, GError **error) { - GError *error = NULL; icaltimetype dtstart, dtend; icaltimetype *deletia = NULL; int i, deletia_count = 0; @@ -99,9 +103,10 @@ icalcomponent *ews_calitem_to_ical(xmlNode *xml_node) process_deleted_occurrences(comp, xml_node, &deletia, &deletia_count, error); else if (!strcmp((char *)xml_node->name, "ItemId")) process_itemid(comp, xml_node, error); - else if (!strcmp((char *)xml_node->name, "IsAllDayEvent")) - process_truefalse(comp, xml_node, &allday, error); - else if (!strcmp((char *)xml_node->name, "ReminderMinutesBeforeStart")) + else if (!strcmp((char *)xml_node->name, "IsAllDayEvent")) { + if (!process_truefalse(comp, xml_node, &allday, error)) + goto err; + } else if (!strcmp((char *)xml_node->name, "ReminderMinutesBeforeStart")) process_reminder_mins(comp, xml_node, error); else if (!strcmp((char *)xml_node->name, "AppointmentSequenceNumber")) process_sequence(comp, xml_node, error); @@ -188,9 +193,16 @@ icalcomponent *ews_calitem_to_ical(xmlNode *xml_node) icaltimezone_free(icaltz, 1); icalcomponent_add_component(calcomp, comp); return calcomp; + + err: + icalcomponent_free(calcomp); + if (deletia) + free(deletia); + return NULL; + } -int process_mailbox(xmlNode *xml_node, const char **r_name, const char **r_email, GError *error) +int process_mailbox(xmlNode *xml_node, const char **r_name, const char **r_email, GError **error) { const char *type = NULL, *name = NULL, *email = NULL; @@ -218,7 +230,7 @@ int process_mailbox(xmlNode *xml_node, const char **r_name, const char **r_email return 0; } -int process_organizer(icalcomponent *comp, xmlNode *xml_node, GError *error) +int process_organizer(icalcomponent *comp, xmlNode *xml_node, GError **error) { icalproperty *prop; icalparameter *param; @@ -244,7 +256,7 @@ int process_organizer(icalcomponent *comp, xmlNode *xml_node, GError *error) return 0; } -int process_attendee(icalcomponent *comp, xmlNode *xml_node, icalparameter_role role, GError *error) +int process_attendee(icalcomponent *comp, xmlNode *xml_node, icalparameter_role role, GError **error) { icalproperty *prop; icalparameter *param; @@ -272,7 +284,7 @@ int process_attendee(icalcomponent *comp, xmlNode *xml_node, icalparameter_role return 0; } -int process_required_attendees(icalcomponent *comp, xmlNode *xml_node, GError *error) +int process_required_attendees(icalcomponent *comp, xmlNode *xml_node, GError **error) { for (xml_node = xml_node->children; xml_node; xml_node = xml_node->next) { if (xml_node->type != XML_ELEMENT_NODE) @@ -286,7 +298,7 @@ int process_required_attendees(icalcomponent *comp, xmlNode *xml_node, GError *e return 0; } -int process_optional_attendees(icalcomponent *comp, xmlNode *xml_node, GError *error) +int process_optional_attendees(icalcomponent *comp, xmlNode *xml_node, GError **error) { for (xml_node = xml_node->children; xml_node; xml_node = xml_node->next) { if (xml_node->type != XML_ELEMENT_NODE) @@ -300,7 +312,7 @@ int process_optional_attendees(icalcomponent *comp, xmlNode *xml_node, GError *e return 0; } -int process_time(icalcomponent *comp, xmlNode *xml_node, icaltimetype *ical_time, GError *error) +int process_time(icalcomponent *comp, xmlNode *xml_node, icaltimetype *ical_time, GError **error) { char *ews_time = (char *)xmlNodeGetContent(xml_node); @@ -310,25 +322,29 @@ int process_time(icalcomponent *comp, xmlNode *xml_node, icaltimetype *ical_time return 0; } -int process_truefalse(icalcomponent *comp, xmlNode *xml_node, gboolean *val, GError *error) +gboolean process_truefalse(icalcomponent *comp, xmlNode *xml_node, gboolean *val, GError **error) { char *truth = (char *)xmlNodeGetContent(xml_node); - if (!truth) - return -1; + if (!truth) { + g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE, + "<%s> node is empty", xml_node->name); + return FALSE; + } if (!strcmp(truth, "true")) *val = TRUE; else if (!strcmp(truth, "false")) *val = FALSE; else { - fprintf(stderr, "Unrecognised truth value '%s' in %s node\n", - truth, xml_node->name); - return -1; + g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE, + "Unrecognised truth value '%s' in <%s> node", + truth, xml_node->name); + return FALSE; } - return 0; + return TRUE; } -int process_location (icalcomponent *comp, xmlNode *xml_node, GError *error) +int process_location (icalcomponent *comp, xmlNode *xml_node, GError **error) { const char *loc = (char *)xmlNodeGetContent(xml_node); @@ -338,7 +354,7 @@ int process_location (icalcomponent *comp, xmlNode *xml_node, GError *error) return 0; } -int process_sequence (icalcomponent *comp, xmlNode *xml_node, GError *error) +int process_sequence (icalcomponent *comp, xmlNode *xml_node, GError **error) { const char *seq = (char *)xmlNodeGetContent(xml_node); @@ -348,7 +364,7 @@ int process_sequence (icalcomponent *comp, xmlNode *xml_node, GError *error) return 0; } -int process_body(icalcomponent *comp, xmlNode *xml_node, GError *error) +int process_body(icalcomponent *comp, xmlNode *xml_node, GError **error) { const char *body = (char *)xmlNodeGetContent(xml_node); @@ -377,7 +393,7 @@ int process_body(icalcomponent *comp, xmlNode *xml_node, GError *error) return 0; } -int process_subject(icalcomponent *comp, xmlNode *xml_node, GError *error) +int process_subject(icalcomponent *comp, xmlNode *xml_node, GError **error) { const char *subject = (char *)xmlNodeGetContent(xml_node); @@ -389,7 +405,7 @@ int process_subject(icalcomponent *comp, xmlNode *xml_node, GError *error) } -static int month_to_number(const char *month, GError *error) +static int month_to_number(const char *month, GError **error) { static char *months[] = { "January", "February", "March", "April", "May", "June", "July", @@ -404,7 +420,7 @@ static int month_to_number(const char *month, GError *error) fprintf(stderr, "Unrecognised month name '%s'\n", month); return 0; } -static int weekday_to_number(const char *day, int accept, GError *error) +static int weekday_to_number(const char *day, int accept, GError **error) { static char *days[] = { "Sunday", "Monday", "Tuesday", "Wednesday", @@ -422,7 +438,7 @@ static int weekday_to_number(const char *day, int accept, GError *error) } #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) -static int weekindex_to_ical(const char *week, GError *error) +static int weekindex_to_ical(const char *week, GError **error) { static struct { char *exch; @@ -445,7 +461,7 @@ static int weekindex_to_ical(const char *week, GError *error) } int process_deleted_occurrences(icalcomponent *comp, xmlNode *xml_node, - icaltimetype **deletia_ret, int *count_ret, GError *error) + icaltimetype **deletia_ret, int *count_ret, GError **error) { icaltimetype *deletia = NULL; int count = 0; @@ -480,7 +496,7 @@ int process_deleted_occurrences(icalcomponent *comp, xmlNode *xml_node, return 0; } -int process_recurrence(icalcomponent *comp, xmlNode *xml_node, icaltimezone *zone, GError *error) +int process_recurrence(icalcomponent *comp, xmlNode *xml_node, icaltimezone *zone, GError **error) { struct icalrecurrencetype ical_recur; char *end_date = NULL, *nr_occurrences = NULL; @@ -553,7 +569,7 @@ int process_recurrence(icalcomponent *comp, xmlNode *xml_node, icaltimezone *zon return 0; } -int process_itemid(icalcomponent *comp, xmlNode *xml_node, GError *error) +int process_itemid(icalcomponent *comp, xmlNode *xml_node, GError **error) { const char *id = (char *)xmlGetProp(xml_node, (unsigned char *)"Id"); if (!id) @@ -562,7 +578,7 @@ int process_itemid(icalcomponent *comp, xmlNode *xml_node, GError *error) icalcomponent_set_uid(comp, id); return 0; } -int process_reminder_mins(icalcomponent *calcomp, xmlNode *xml_node, GError *error) +int process_reminder_mins(icalcomponent *calcomp, xmlNode *xml_node, GError **error) { const char *minutes; int minutesnr; @@ -714,7 +730,7 @@ static const char *ews_tz_to_ical(const char *ewstz) } -icaltimezone *get_timezone(xmlNode *xml_node, GError *error) +icaltimezone *get_timezone(xmlNode *xml_node, GError **error) { icaltimezone *zone = NULL; const char *ews_tzname = NULL; @@ -749,7 +765,7 @@ icaltimezone *get_timezone(xmlNode *xml_node, GError *error) return NULL; } -int get_baseoffset(xmlNode *xml_node, int *retval, GError *error) +int get_baseoffset(xmlNode *xml_node, int *retval, GError **error) { const char *baseoffset; struct icaldurationtype ofs; @@ -781,7 +797,7 @@ int get_baseoffset(xmlNode *xml_node, int *retval, GError *error) return 0; } -int process_relativeyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError *error) +int process_relativeyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error) { const char *week = NULL, *month = NULL, *weekday = NULL; int weeknr, monthnr, daynr; @@ -841,7 +857,7 @@ int process_relativeyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetyp return 0; } -int process_absoluteyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError *error) +int process_absoluteyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error) { const char *day_of_month = NULL; const char *month = NULL; @@ -877,7 +893,7 @@ int process_absoluteyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetyp return 0; } -int process_relativemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError *error) +int process_relativemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error) { const char *week = NULL, *interval = NULL, *weekday = NULL; int weeknr, intervalnr, daynr; @@ -936,7 +952,7 @@ int process_relativemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencety return 0; } -int process_absolutemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError *error) +int process_absolutemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error) { const char *interval = NULL, *monthday = NULL; int intervalnr, monthdaynr; @@ -973,7 +989,7 @@ int process_absolutemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencety return 0; } -static int weekdays_to_recur_byday(const char *days, struct icalrecurrencetype *ical_recur, GError *error) +static int weekdays_to_recur_byday(const char *days, struct icalrecurrencetype *ical_recur, GError **error) { const char *space; const char *day; @@ -1007,7 +1023,7 @@ static int weekdays_to_recur_byday(const char *days, struct icalrecurrencetype * -int process_weeklyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError *error) +int process_weeklyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error) { const char *interval = NULL, *weekday = NULL, *firstday = NULL; int intervalnr, firstdaynr; @@ -1048,7 +1064,7 @@ int process_weeklyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_ ical_recur->freq = ICAL_WEEKLY_RECURRENCE; return 0; } -int process_dailyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError *error) +int process_dailyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur, GError **error) { const char *interval = NULL; int intervalnr; @@ -1078,7 +1094,7 @@ int process_dailyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_r return 0; } icalcomponent *process_timezone_rule(xmlNode *xml_node, icalcomponent_kind kind, - int *offset, GError *error) + int *offset, GError **error) { icalcomponent *comp = icalcomponent_new(kind); char *tzname; @@ -1140,7 +1156,7 @@ icalcomponent *process_timezone_rule(xmlNode *xml_node, icalcomponent_kind kind, return comp; } -icaltimezone *get_meeting_timezone(xmlNode *xml_node, GError *error) +icaltimezone *get_meeting_timezone(xmlNode *xml_node, GError **error) { icalcomponent *comp = NULL, *dst_zone = NULL, *std_zone = NULL; icalproperty *prop; diff --git a/ews2ical.c b/ews2ical.c index a7d3e3e..c6dcd90 100644 --- a/ews2ical.c +++ b/ews2ical.c @@ -16,15 +16,15 @@ #include #include +#include #include "libews.h" FILE *calfile; -extern icalcomponent *ews_calitem_to_ical(xmlNode *xml_node); - int main(int argc, char **argv) { + GError *error = NULL; icalcomponent *calcomp; xmlDocPtr xml_doc; xmlNode *xml_node; @@ -129,8 +129,13 @@ int main(int argc, char **argv) return -1; } - calcomp = ews_calitem_to_ical(xml_node); + calcomp = ews_calitem_to_ical(xml_node, &error); + if (!calcomp) { + fprintf(stderr, "Failed to convert: %s\n", error->message); + g_clear_error(&error); + return 1; + } outbuf =icalcomponent_as_ical_string_r(calcomp); fprintf(calfile, "%s", outbuf); free(outbuf); diff --git a/ews_syncfolder.c b/ews_syncfolder.c index d0e6fb5..7e99d31 100644 --- a/ews_syncfolder.c +++ b/ews_syncfolder.c @@ -13,8 +13,6 @@ #define ITEM_DELETE 2 #define ITEM_UPDATE 3 -extern icalcomponent *ews_calitem_to_ical(xmlNode *xml_node); - struct item_change { struct item_change *next; int type; @@ -249,6 +247,7 @@ int main(int argc, char **argv) int fetch_xml_item(SoupSession *sess, char *url, const char *itemid, const char *xml_filename, const char *ics_filename) { + GError *error = NULL; SoupMessage *msg; xmlDoc *doc; xmlNode *node, *child; @@ -389,8 +388,12 @@ int fetch_xml_item(SoupSession *sess, char *url, const char *itemid, exit (1); } - calcomp = ews_calitem_to_ical(node); - + calcomp = ews_calitem_to_ical(node, &error); + if (!calcomp) { + printf("Failed to parse calendar: %s\n", error->message); + g_clear_error(&error); + return -1; + } outbuf = icalcomponent_as_ical_string_r(calcomp); g_file_set_contents(ics_filename, outbuf, strlen(outbuf), NULL); diff --git a/libews.h b/libews.h index 97e4349..b5c7958 100644 --- a/libews.h +++ b/libews.h @@ -23,7 +23,15 @@ #define __LIBEWS_H__ #include +#include +#include -icalcomponent *ews_calitem_to_ical(xmlNode *xml_node); +icalcomponent *ews_calitem_to_ical(xmlNode *xml_node, GError **error); + +#define EWS_ERROR (ews_error_quark()) + +typedef enum { + EWS_ERROR_PARSE +} EwsError; #endif -- 2.50.1