From 659e8fc47ee931b0fcde059ba8ad76e786725c72 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Wed, 21 Jul 2010 00:29:31 +0100 Subject: [PATCH] Convert organizer/attendees to GError --- calitem_to_ical.c | 85 ++++++++++++++++++++++++++++------------------- libews.h | 4 ++- 2 files changed, 53 insertions(+), 36 deletions(-) diff --git a/calitem_to_ical.c b/calitem_to_ical.c index 4ab1df4..6f3abbe 100644 --- a/calitem_to_ical.c +++ b/calitem_to_ical.c @@ -31,9 +31,9 @@ int process_absolutemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencety 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); +gboolean process_organizer(icalcomponent *comp, xmlNode *xml_node, GError **error); +gboolean process_required_attendees(icalcomponent *comp, xmlNode *xml_node, GError **error); +gboolean process_optional_attendees(icalcomponent *comp, xmlNode *xml_node, GError **error); gboolean process_time(icalcomponent *comp, xmlNode *xml_node, icaltimetype *ical_time, GError **error); gboolean process_truefalse(icalcomponent *comp, xmlNode *xml_node, gboolean *val, GError **error); gboolean process_location(icalcomponent *comp, xmlNode *xml_node, GError **error); @@ -81,13 +81,16 @@ icalcomponent *ews_calitem_to_ical(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) continue; - if (!strcmp((char *)xml_node->name, "Organizer")) - process_organizer(comp, xml_node, error); - else if (!strcmp((char *)xml_node->name, "RequiredAttendees")) - process_required_attendees(comp, xml_node, error); - else if (!strcmp((char *)xml_node->name, "OptionalAttendees")) - process_optional_attendees(comp, xml_node, error); - else if (!strcmp((char *)xml_node->name, "Start")) { + if (!strcmp((char *)xml_node->name, "Organizer")) { + if (!process_organizer(comp, xml_node, error)) + goto err; + } else if (!strcmp((char *)xml_node->name, "RequiredAttendees")) { + if (!process_required_attendees(comp, xml_node, error)) + goto err; + } else if (!strcmp((char *)xml_node->name, "OptionalAttendees")) { + if (!process_optional_attendees(comp, xml_node, error)) + goto err; + } else if (!strcmp((char *)xml_node->name, "Start")) { if (!process_time(comp, xml_node, &dtstart, error)) goto err; } else if (!strcmp((char *)xml_node->name, "End")) { @@ -208,7 +211,7 @@ icalcomponent *ews_calitem_to_ical(xmlNode *xml_node, GError **error) } -int process_mailbox(xmlNode *xml_node, const char **r_name, const char **r_email, GError **error) +gboolean process_mailbox(xmlNode *xml_node, const char **r_name, const char **r_email, GError **error) { const char *type = NULL, *name = NULL, *email = NULL; @@ -226,17 +229,18 @@ int process_mailbox(xmlNode *xml_node, const char **r_name, const char **r_email /* We seem to get EX routing for people who don't exist any more */ if (type && strcmp(type, "SMTP")) { - if (strcmp(type, "EX")) - fprintf(stderr, "Unknown RoutingType '%s' ('%s' '%s')\n", - type, name, email); - return -1; + g_set_error(error, EWS_ERROR, + strcmp(type, "EX")?EWS_ERROR_ROUTING_UNKNOWN:EWS_ERROR_ROUTING_EX, + "Unknown RoutingType '%s' for '%s' ('%s')", + type, email, name); + return FALSE; } *r_name = name; *r_email = email; - return 0; + return TRUE; } -int process_organizer(icalcomponent *comp, xmlNode *xml_node, GError **error) +gboolean process_organizer(icalcomponent *comp, xmlNode *xml_node, GError **error) { icalproperty *prop; icalparameter *param; @@ -247,22 +251,25 @@ int process_organizer(icalcomponent *comp, xmlNode *xml_node, GError **error) if (!strcmp((char *)xml_node->name, "Mailbox")) { const char *name = NULL, *email = NULL; char *mailtoname; - if (process_mailbox(xml_node, &name, &email, error)) - return -1; + if (!process_mailbox(xml_node, &name, &email, error)) + return FALSE; mailtoname = g_strdup_printf("mailto:%s", email); prop = icalproperty_new_organizer(mailtoname); - free(mailtoname); + g_free(mailtoname); param = icalparameter_new_cn(name); icalproperty_add_parameter(prop, param); icalcomponent_add_property(comp, prop); + return TRUE; } } - return 0; + g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE, + "No element in "); + return FALSE; } -int process_attendee(icalcomponent *comp, xmlNode *xml_node, icalparameter_role role, GError **error) +gboolean process_attendee(icalcomponent *comp, xmlNode *xml_node, icalparameter_role role, GError **error) { icalproperty *prop; icalparameter *param; @@ -271,51 +278,59 @@ int process_attendee(icalcomponent *comp, xmlNode *xml_node, icalparameter_role if (xml_node->type != XML_ELEMENT_NODE) continue; if (!strcmp((char *)xml_node->name, "Mailbox")) { + GError *local_error = NULL; const char *name = NULL, *email = NULL; char *mailtoname; - if (process_mailbox(xml_node, &name, &email, error)) - return -1; + if (!process_mailbox(xml_node, &name, &email, &local_error)) { + /* Warn, but don't fail */ + g_warning(local_error->message); + g_clear_error(&local_error); + return TRUE; + } mailtoname = g_strdup_printf("mailto:%s", email); prop = icalproperty_new_attendee(mailtoname); - free(mailtoname); + g_free(mailtoname); param = icalparameter_new_cn(name); icalproperty_add_parameter(prop, param); param = icalparameter_new_role(role); icalproperty_add_parameter(prop, param); icalcomponent_add_property(comp, prop); + return TRUE; } } - return 0; + g_set_error(error, EWS_ERROR, EWS_ERROR_PARSE, + "No element in "); + return FALSE; } -int process_required_attendees(icalcomponent *comp, xmlNode *xml_node, GError **error) +gboolean 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) continue; if (!strcmp((char *)xml_node->name, "Attendee")) { - if (process_attendee(comp, xml_node, - ICAL_ROLE_REQPARTICIPANT, error)) - { } + if (!process_attendee(comp, xml_node, + ICAL_ROLE_REQPARTICIPANT, error)) + return FALSE; } } - return 0; + return TRUE; } -int process_optional_attendees(icalcomponent *comp, xmlNode *xml_node, GError **error) +gboolean 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) continue; if (!strcmp((char *)xml_node->name, "Attendee")) { - if (process_attendee(comp, xml_node, + if (!process_attendee(comp, xml_node, ICAL_ROLE_OPTPARTICIPANT, error)) - { } + return FALSE; } } - return 0; + return TRUE; } gboolean process_time(icalcomponent *comp, xmlNode *xml_node, icaltimetype *ical_time, GError **error) diff --git a/libews.h b/libews.h index b5c7958..ee07c27 100644 --- a/libews.h +++ b/libews.h @@ -31,7 +31,9 @@ icalcomponent *ews_calitem_to_ical(xmlNode *xml_node, GError **error); #define EWS_ERROR (ews_error_quark()) typedef enum { - EWS_ERROR_PARSE + EWS_ERROR_PARSE, + EWS_ERROR_ROUTING_UNKNOWN, + EWS_ERROR_ROUTING_EX } EwsError; #endif -- 2.50.1