]> www.infradead.org Git - users/dwmw2/ews-sync.git/commitdiff
Start converting to use GError
authorDavid Woodhouse <dwmw2@infradead.org>
Tue, 20 Jul 2010 23:04:50 +0000 (00:04 +0100)
committerDavid Woodhouse <dwmw2@infradead.org>
Tue, 20 Jul 2010 23:04:50 +0000 (00:04 +0100)
calitem_to_ical.c
ews2ical.c
ews_syncfolder.c
libews.h

index 0e1555b0aff85b2e7f6f5e344a0b727d786857c6..776538fbbaca56b2e451c740663b93683cb3aa2c 100644 (file)
 
 #include <glib.h>
 #include <glib/gprintf.h>
+#include <glib/gquark.h>
 
-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;
index a7d3e3ea4514f5cbc5d8ffbe7682aec90bd1976d..c6dcd9083519dba87ddcca122f07099b6703d485 100644 (file)
 
 #include <glib.h>
 #include <glib/gprintf.h>
+#include <glib/gerror.h>
 
 #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);
index d0e6fb533625faca0a3baff49d8995a4d4e33bc4..7e99d3179dea67f089f51c263182162cb863dd5e 100644 (file)
@@ -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);
index 97e43496baf0156f56ef2b4d0a5813c437494791..b5c79582954b241f5253d962f7af8cf2b9e495bd 100644 (file)
--- a/libews.h
+++ b/libews.h
 #define __LIBEWS_H__
 
 #include <libical/icalcomponent.h>
+#include <glib/gerror.h>
+#include <glib/gquark.h>
 
-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