#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;
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);
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;
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;
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;
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)
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)
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);
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);
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);
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);
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);
}
-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",
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",
}
#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;
}
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;
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;
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)
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;
}
-icaltimezone *get_timezone(xmlNode *xml_node, GError *error)
+icaltimezone *get_timezone(xmlNode *xml_node, GError **error)
{
icaltimezone *zone = NULL;
const char *ews_tzname = NULL;
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;
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;
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;
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;
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;
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;
-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;
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;
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;
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;