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

index 4ab1df4dce1104209486e787597cacb08772c55f..6f3abbe954a1900cd782a52cef309188e0bfa466 100644 (file)
@@ -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 <Mailbox> element in <Organizer>");
+       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 <Mailbox> element in <Attendee>");
+       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)
index b5c79582954b241f5253d962f7af8cf2b9e495bd..ee07c270df267a038b84251e5a961026a8c87c83 100644 (file)
--- 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