diff options
Diffstat (limited to 'calendar/cal-util/cal-component.c')
-rw-r--r-- | calendar/cal-util/cal-component.c | 376 |
1 files changed, 293 insertions, 83 deletions
diff --git a/calendar/cal-util/cal-component.c b/calendar/cal-util/cal-component.c index ec2523a261..f457d85d6d 100644 --- a/calendar/cal-util/cal-component.c +++ b/calendar/cal-util/cal-component.c @@ -21,6 +21,7 @@ #include <config.h> #include <string.h> +#include <stdlib.h> #include <unistd.h> #include "cal-component.h" #include "timeutil.h" @@ -28,7 +29,7 @@ /* Private part of the CalComponent structure */ -typedef struct { +struct _CalComponentPrivate { /* The icalcomponent we wrap */ icalcomponent *icalcomp; @@ -68,6 +69,14 @@ typedef struct { struct datetime due; icalproperty *last_modified; + + struct period { + icalproperty *prop; + icalparameter *value_param; + }; + + GSList *rdate_list; + icalproperty *sequence; struct { @@ -82,7 +91,7 @@ typedef struct { * object over the wire. */ guint need_sequence_inc : 1; -} CalComponentPrivate; +}; /* Private structure for alarms */ struct _CalComponentAlarm { @@ -223,6 +232,9 @@ free_icalcomponent (CalComponent *comp) priv->due.tzid_param = NULL; priv->last_modified = NULL; + + priv->rdate_list = free_slist (priv->rdate_list); + priv->sequence = NULL; priv->summary.prop = NULL; @@ -331,31 +343,11 @@ scan_categories (CalComponent *comp, icalproperty *prop) static void scan_text (CalComponent *comp, GSList **text_list, icalproperty *prop) { - CalComponentPrivate *priv; struct text *text; - icalparameter *param; - - priv = comp->priv; text = g_new (struct text, 1); text->prop = prop; - - for (param = icalproperty_get_first_parameter (prop, ICAL_ANY_PARAMETER); - param; - param = icalproperty_get_next_parameter (prop, ICAL_ANY_PARAMETER)) { - icalparameter_kind kind; - - kind = icalparameter_isa (param); - - switch (kind) { - case ICAL_ALTREP_PARAMETER: - text->altrep_param = param; - break; - - default: - break; - } - } + text->altrep_param = icalproperty_get_first_parameter (prop, ICAL_ALTREP_PARAMETER); *text_list = g_slist_append (*text_list, text); } @@ -365,28 +357,23 @@ static void scan_datetime (CalComponent *comp, struct datetime *datetime, icalproperty *prop) { CalComponentPrivate *priv; - icalparameter *param; priv = comp->priv; datetime->prop = prop; + datetime->tzid_param = icalproperty_get_first_parameter (prop, ICAL_TZID_PARAMETER); +} - for (param = icalproperty_get_first_parameter (prop, ICAL_ANY_PARAMETER); - param; - param = icalproperty_get_next_parameter (prop, ICAL_ANY_PARAMETER)) { - icalparameter_kind kind; - - kind = icalparameter_isa (param); +static void +scan_period (CalComponent *comp, GSList **list, icalproperty *prop) +{ + struct period *period; - switch (kind) { - case ICAL_TZID_PARAMETER: - datetime->tzid_param = param; - break; + period = g_new (struct period, 1); + period->prop = prop; + period->value_param = icalproperty_get_first_parameter (prop, ICAL_VALUE_PARAMETER); - default: - break; - } - } + *list = g_slist_append (*list, period); } /* Scans the summary property */ @@ -394,28 +381,11 @@ static void scan_summary (CalComponent *comp, icalproperty *prop) { CalComponentPrivate *priv; - icalparameter *param; priv = comp->priv; priv->summary.prop = prop; - - for (param = icalproperty_get_first_parameter (prop, ICAL_ANY_PARAMETER); - param; - param = icalproperty_get_next_parameter (prop, ICAL_ANY_PARAMETER)) { - icalparameter_kind kind; - - kind = icalparameter_isa (param); - - switch (kind) { - case ICAL_ALTREP_PARAMETER: - priv->summary.altrep_param = param; - break; - - default: - break; - } - } + priv->summary.altrep_param = icalproperty_get_first_parameter (prop, ICAL_ALTREP_PARAMETER); } /* Scans an icalproperty and adds its mapping to the component */ @@ -474,6 +444,10 @@ scan_property (CalComponent *comp, icalproperty *prop) priv->last_modified = prop; break; + case ICAL_RDATE_PROPERTY: + scan_period (comp, &priv->rdate_list, prop); + break; + case ICAL_SEQUENCE_PROPERTY: priv->sequence = prop; break; @@ -726,6 +700,40 @@ cal_component_get_vtype (CalComponent *comp) } /** + * cal_component_get_as_string: + * @comp: A calendar component. + * + * Gets the iCalendar string representation of a calendar component. + * + * Return value: String representation of the calendar component according to + * RFC 2445. + **/ +char * +cal_component_get_as_string (CalComponent *comp) +{ + CalComponentPrivate *priv; + char *str, *buf; + + g_return_val_if_fail (comp != NULL, NULL); + g_return_val_if_fail (IS_CAL_COMPONENT (comp), NULL); + + priv = comp->priv; + g_return_val_if_fail (priv->icalcomp != NULL, NULL); + + /* Sigh, we dup and dup and dup and dup because of g_malloc() versus malloc()... */ + + str = icalcomponent_as_ical_string (priv->icalcomp); + + if (str) { + buf = g_strdup (str); + free (str); + } else + buf = NULL; + + return buf; +} + +/** * cal_component_get_uid: * @comp: A calendar component object. * @uid: Return value for the UID string. @@ -1034,6 +1042,8 @@ cal_component_free_text_list (GSList *text_list) for (l = text_list; l; l = l->next) { CalComponentText *text; + g_assert (l->data != NULL); + text = l->data; g_return_if_fail (text != NULL); g_free (text); @@ -1050,13 +1060,11 @@ get_text_list (GSList *text_list, { GSList *l; - if (!text_list) { - *tl = NULL; - return; - } - *tl = NULL; + if (!text_list) + return; + for (l = text_list; l; l = l->next) { struct text *text; CalComponentText *t; @@ -1244,7 +1252,7 @@ set_icaltimetype (CalComponent *comp, icalproperty **prop, * @comp: A calendar component object. * @t: Return value for the completion date. This should be freed using the * cal_component_free_icaltimetype() function. - * + * * Queries the date at which a calendar compoment object was completed. **/ void @@ -1266,7 +1274,7 @@ cal_component_get_completed (CalComponent *comp, struct icaltimetype **t) * cal_component_set_completed: * @comp: A calendar component object. * @t: Value for the completion date. - * + * * Sets the date at which a calendar component object was completed. **/ void @@ -1525,7 +1533,7 @@ cal_component_set_dtend (CalComponent *comp, CalComponentDateTime *dt) * cal_component_get_dtstamp: * @comp: A calendar component object. * @t: Return value for the date/timestamp. - * + * * Queries the date/timestamp property of a calendar component object, which is * the last time at which the object was modified by a calendar user agent. **/ @@ -1551,7 +1559,7 @@ cal_component_get_dtstamp (CalComponent *comp, struct icaltimetype *t) * cal_component_set_dtstamp: * @comp: A calendar component object. * @t: Date/timestamp value. - * + * * Sets the date/timestamp of a calendar component object. This should be * called whenever a calendar user agent makes a change to a component's * properties. @@ -1676,7 +1684,7 @@ cal_component_set_due (CalComponent *comp, CalComponentDateTime *dt) * cal_component_get_last_modified: * @comp: A calendar component object. * @t: Return value for the last modified time value. - * + * * Queries the time at which a calendar component object was last modified in * the calendar store. **/ @@ -1699,7 +1707,7 @@ cal_component_get_last_modified (CalComponent *comp, struct icaltimetype **t) * cal_component_set_last_modified: * @comp: A calendar component object. * @t: Value for the last time modified. - * + * * Sets the time at which a calendar component object was last stored in the * calendar store. This should not be called by plain calendar user agents. **/ @@ -1721,11 +1729,213 @@ cal_component_set_last_modified (CalComponent *comp, struct icaltimetype *t) } /** + * cal_component_free_period_list: + * @period_list: List of #CalComponentPeriod structures. + * + * Frees a list of #CalComponentPeriod structures. + **/ +void +cal_component_free_period_list (GSList *period_list) +{ + GSList *l; + + for (l = period_list; l; l = l->next) { + CalComponentPeriod *period; + + g_assert (l->data != NULL); + + period = l->data; + g_free (period); + } + + g_slist_free (period_list); +} + +/* Builds a list of CalComponentPeriod structures based on a list of icalproperties */ +static void +get_period_list (GSList *period_list, + struct icalperiodtype (* get_prop_func) (icalproperty *prop), + GSList **list) +{ + GSList *l; + + *list = NULL; + + if (!period_list) + return; + + for (l = period_list; l; l = l->next) { + struct period *period; + CalComponentPeriod *p; + struct icalperiodtype ip; + + period = l->data; + g_assert (period->prop != NULL); + + p = g_new (CalComponentPeriod, 1); + + /* Get value parameter */ + + if (period->value_param) { + icalparameter_value value_type; + + value_type = icalparameter_get_value (period->value_param); + + if (value_type == ICAL_VALUE_DATE || value_type == ICAL_VALUE_DATETIME) + p->type = CAL_COMPONENT_PERIOD_DATETIME; + else if (value_type == ICAL_VALUE_DURATION) + p->type = CAL_COMPONENT_PERIOD_DURATION; + else { + g_message ("get_period_list(): Unknown value for period %d; " + "using DATETIME", value_type); + p->type = CAL_COMPONENT_PERIOD_DATETIME; + } + } else + p->type = CAL_COMPONENT_PERIOD_DATETIME; + + /* Get start and end/duration */ + + ip = (* get_prop_func) (period->prop); + + p->start = ip.start; + + if (p->type == CAL_COMPONENT_PERIOD_DATETIME) + p->u.end = ip.end; + else if (p->type == CAL_COMPONENT_PERIOD_DURATION) + p->u.duration = ip.duration; + else + g_assert_not_reached (); + + /* Put in list */ + + *list = g_slist_prepend (*list, p); + } + + *list = g_slist_reverse (*list); +} + +/** + * cal_component_get_rdate_list: + * @comp: A calendar component object. + * @period_list: Return value for the list of recurrence dates, as a list of + * #CalComponentPeriod structures. This should be freed using the + * cal_component_free_period_list() function. + * + * Queries the list of recurrence date properties in a calendar component + * object. + **/ +void +cal_component_get_rdate_list (CalComponent *comp, GSList **period_list) +{ + CalComponentPrivate *priv; + + g_return_if_fail (comp != NULL); + g_return_if_fail (IS_CAL_COMPONENT (comp)); + g_return_if_fail (period_list != NULL); + + priv = comp->priv; + g_return_if_fail (priv->icalcomp != NULL); + + get_period_list (priv->rdate_list, icalproperty_get_rdate, period_list); +} + +/* Sets a period list value */ +static void +set_period_list (CalComponent *comp, + icalproperty *(* new_prop_func) (struct icalperiodtype period), + GSList **period_list, + GSList *pl) +{ + CalComponentPrivate *priv; + GSList *l; + + priv = comp->priv; + + /* Remove old periods */ + + for (l = *period_list; l; l = l->next) { + struct period *period; + + period = l->data; + g_assert (period->prop != NULL); + + icalcomponent_remove_property (priv->icalcomp, period->prop); + g_free (period); + } + + g_slist_free (*period_list); + *period_list = NULL; + + /* Add in new periods */ + + for (l = pl; l; l = l->next) { + CalComponentPeriod *p; + struct period *period; + struct icalperiodtype ip; + icalparameter_value value_type; + + g_assert (l->data != NULL); + p = l->data; + + /* Create libical value */ + + ip.start = p->start; + + if (p->type == CAL_COMPONENT_PERIOD_DATETIME) { + value_type = ICAL_VALUE_DATETIME; + ip.end = p->u.end; + } else if (p->type == CAL_COMPONENT_PERIOD_DURATION) { + value_type = ICAL_VALUE_DURATION; + ip.duration = p->u.duration; + } else { + g_assert_not_reached (); + return; + } + + /* Create property */ + + period = g_new (struct period, 1); + + period->prop = (* new_prop_func) (ip); + period->value_param = icalparameter_new_value (value_type); + icalproperty_add_parameter (period->prop, period->value_param); + + /* Add to list */ + + *period_list = g_slist_prepend (*period_list, period); + } + + *period_list = g_slist_reverse (*period_list); +} + +/** + * cal_component_set_rdate_list: + * @comp: A calendar component object. + * @period_list: List of #CalComponentPeriod structures. + * + * Sets the list of recurrence dates in a calendar component object. + **/ +void +cal_component_set_rdate_list (CalComponent *comp, GSList *period_list) +{ + CalComponentPrivate *priv; + + g_return_if_fail (comp != NULL); + g_return_if_fail (IS_CAL_COMPONENT (comp)); + g_return_if_fail (period_list != NULL); + + priv = comp->priv; + g_return_if_fail (priv->icalcomp != NULL); + + set_period_list (comp, icalproperty_new_rdate, &priv->rdate_list, period_list); +} + +/** * cal_component_get_sequence: * @comp: A calendar component object. * @sequence: Return value for the sequence number. This should be freed using * cal_component_free_sequence(). - * + * * Queries the sequence number of a calendar component object. **/ void @@ -1753,7 +1963,7 @@ cal_component_get_sequence (CalComponent *comp, int **sequence) * cal_component_set_sequence: * @comp: A calendar component object. * @sequence: Sequence number value. - * + * * Sets the sequence number of a calendar component object. Normally this * function should not be called, since the sequence number is incremented * automatically at the proper times. @@ -1792,7 +2002,7 @@ cal_component_set_sequence (CalComponent *comp, int *sequence) /** * cal_component_free_sequence: * @sequence: Sequence number value. - * + * * Frees a sequence number value. **/ void @@ -1898,7 +2108,7 @@ cal_component_set_summary (CalComponent *comp, CalComponentText *summary) * cal_component_get_transparency: * @comp: A calendar component object. * @transp: Return value for the time transparency. - * + * * Queries the time transparency of a calendar component object. **/ void @@ -1933,7 +2143,7 @@ cal_component_get_transparency (CalComponent *comp, CalComponentTransparency *tr * cal_component_set_transparency: * @comp: A calendar component object. * @transp: Time transparency value. - * + * * Sets the time transparency of a calendar component object. **/ void @@ -1948,7 +2158,7 @@ cal_component_set_transparency (CalComponent *comp, CalComponentTransparency tra priv = comp->priv; g_return_if_fail (priv->icalcomp != NULL); - + if (transp == CAL_COMPONENT_TRANSP_NONE) { if (priv->transparency) { @@ -1986,7 +2196,7 @@ cal_component_set_transparency (CalComponent *comp, CalComponentTransparency tra * cal_component_get_url: * @comp: A calendar component object. * @url: Return value for the URL. - * + * * Queries the uniform resource locator property of a calendar component object. **/ void @@ -2011,7 +2221,7 @@ cal_component_get_url (CalComponent *comp, const char **url) * cal_component_set_url: * @comp: A calendar component object. * @url: URL value. - * + * * Sets the uniform resource locator property of a calendar component object. **/ void @@ -2092,10 +2302,10 @@ make_alarm (CalComponent *comp, icalcomponent *subcomp) /** * cal_component_get_first_alarm: * @comp: A calendar component object. - * + * * Starts an iterator for the alarms in a calendar component object. Subsequent * alarms can be obtained with the cal_component_get_next_alarm() function. - * + * * Return value: The first alarm in the component, or NULL if the component has * no alarms. This should be freed using the cal_component_alarm_free() * function. @@ -2122,7 +2332,7 @@ cal_component_get_first_alarm (CalComponent *comp) /** * cal_component_alarm_free: * @alarm: A calendar alarm. - * + * * Frees an alarm structure. **/ void @@ -2147,7 +2357,7 @@ cal_component_alarm_free (CalComponentAlarm *alarm) * cal_component_alarm_get_action: * @alarm: An alarm. * @action: Return value for the alarm's action type. - * + * * Queries the action type of an alarm. **/ void @@ -2183,7 +2393,7 @@ cal_component_alarm_get_action (CalComponentAlarm *alarm, CalComponentAlarmActio * cal_component_alarm_set_action: * @alarm: An alarm. * @action: Action type. - * + * * Sets the action type for an alarm. **/ void @@ -2232,7 +2442,7 @@ cal_component_alarm_set_action (CalComponentAlarm *alarm, CalComponentAlarmActio * @alarm: An alarm. * @trigger: Return value for the trigger time. This should be freed using the * cal_component_alarm_free_trigger() function. - * + * * Queries the trigger time for an alarm. **/ void @@ -2327,7 +2537,7 @@ cal_component_alarm_get_trigger (CalComponentAlarm *alarm, CalComponentAlarmTrig * cal_component_alarm_set_trigger: * @alarm: An alarm. * @trigger: Trigger time structure. - * + * * Sets the trigger time of an alarm. **/ void @@ -2417,7 +2627,7 @@ cal_component_alarm_set_trigger (CalComponentAlarm *alarm, CalComponentAlarmTrig /** * cal_component_alarm_free_trigger: * @trigger: A #CalComponentAlarmTrigger structure. - * + * * Frees a #CalComponentAlarmTrigger structure. **/ void |