diff options
Diffstat (limited to 'calendar/cal-util/cal-component.c')
-rw-r--r-- | calendar/cal-util/cal-component.c | 579 |
1 files changed, 335 insertions, 244 deletions
diff --git a/calendar/cal-util/cal-component.c b/calendar/cal-util/cal-component.c index de28aab956..9c497c0429 100644 --- a/calendar/cal-util/cal-component.c +++ b/calendar/cal-util/cal-component.c @@ -40,10 +40,13 @@ typedef struct { }; GSList *categories_list; - struct description { + struct text { icalproperty *prop; icalparameter *altrep_param; }; + + GSList *comment_list; + GSList *description_list; struct datetime { @@ -275,18 +278,18 @@ scan_categories (CalComponent *comp, icalproperty *prop) priv->categories_list = g_slist_append (priv->categories_list, categ); } -/* Scans the description property */ +/* Scans a text (i.e. text + altrep) property */ static void -scan_description (CalComponent *comp, icalproperty *prop) +scan_text (CalComponent *comp, GSList **text_list, icalproperty *prop) { CalComponentPrivate *priv; - struct description *desc; + struct text *text; icalparameter *param; priv = comp->priv; - desc = g_new (struct description, 1); - desc->prop = prop; + text = g_new (struct text, 1); + text->prop = prop; for (param = icalproperty_get_first_parameter (prop, ICAL_ANY_PARAMETER); param; @@ -297,7 +300,7 @@ scan_description (CalComponent *comp, icalproperty *prop) switch (kind) { case ICAL_ALTREP_PARAMETER: - desc->altrep_param = param; + text->altrep_param = param; break; default: @@ -305,7 +308,7 @@ scan_description (CalComponent *comp, icalproperty *prop) } } - priv->description_list = g_slist_append (priv->description_list, desc); + *text_list = g_slist_append (*text_list, text); } /* Scans a date/time and timezone pair property */ @@ -382,8 +385,12 @@ scan_property (CalComponent *comp, icalproperty *prop) scan_categories (comp, prop); break; + case ICAL_COMMENT_PROPERTY: + scan_text (comp, &priv->comment_list, prop); + break; + case ICAL_DESCRIPTION_PROPERTY: - scan_description (comp, prop); + scan_text (comp, &priv->description_list, prop); break; case ICAL_DTEND_PROPERTY: @@ -653,6 +660,7 @@ cal_component_set_uid (CalComponent *comp, const char *uid) g_return_if_fail (uid != NULL); priv = comp->priv; + g_return_if_fail (priv->icalcomp != NULL); /* This MUST exist, since we ensured that it did */ g_assert (priv->uid_prop != NULL); @@ -661,45 +669,92 @@ cal_component_set_uid (CalComponent *comp, const char *uid) } /** - * cal_component_get_summary: + * cal_component_get_categories_list: * @comp: A calendar component object. - * @summary: Return value for the summary property and its parameters. + * @categ_list: Return value for the list of strings, where each string is a + * category. This should be freed using cal_component_free_categories_list(). * - * Queries the summary of a calendar component object. + * Queries the list of categories of a calendar component object. Each element + * in the returned categ_list is a string with the corresponding category. **/ void -cal_component_get_summary (CalComponent *comp, CalComponentPropSummary *summary) +cal_component_get_categories_list (CalComponent *comp, GSList **categ_list) { CalComponentPrivate *priv; + const char *categories; + const char *p; + const char *cat_start; + char *str; g_return_if_fail (comp != NULL); g_return_if_fail (IS_CAL_COMPONENT (comp)); - g_return_if_fail (summary != NULL); + g_return_if_fail (categ_list != NULL); priv = comp->priv; + g_return_if_fail (priv->icalcomp != NULL); - if (priv->summary.prop) - summary->value = icalproperty_get_summary (priv->summary.prop); - else - summary->value = NULL; + if (!priv->categories_list) { + *categ_list = NULL; + return; + } - if (priv->summary.altrep_param) - summary->altrep = icalparameter_get_altrep (priv->summary.altrep_param); - else - summary->altrep = NULL; + categories = icalproperty_get_categories (priv->categories_list); + g_assert (categories != NULL); + + cat_start = categories; + + *categ_list = NULL; + + for (p = categories; *p; p++) + if (*p == ',') { + str = g_strndup (cat_start, p - cat_start); + *categ_list = g_slist_prepend (*categ_list, str); + + cat_start = p + 1; + } + + str = g_strndup (cat_start, p - cat_start); + *categ_list = g_slist_prepend (*categ_list, str); + + *categ_list = g_slist_reverse (*categ_list); +} + +/* Creates a comma-delimited string of categories */ +static char * +stringify_categories (GSList *categ_list) +{ + GString *s; + GSList *l; + char *str; + + s = g_string_new (NULL); + + for (l = categ_list; l; l = l->next) { + g_string_append (s, l->data); + + if (l->next != NULL) + g_string_append (s, ","); + } + + str = s->str; + g_string_free (s, FALSE); + + return str; } /** - * cal_component_set_summary: + * cal_component_set_categories_list: * @comp: A calendar component object. - * @summary: Summary property and its parameters. + * @categ_list: List of strings, one for each category. * - * Sets the summary of a calendar component object. + * Sets the list of categories of a calendar component object. **/ void -cal_component_set_summary (CalComponent *comp, const CalComponentPropSummary *summary) +cal_component_set_categories_list (CalComponent *comp, GSList *categ_list) { CalComponentPrivate *priv; + struct categories *cat; + char *categories_str; g_return_if_fail (comp != NULL); g_return_if_fail (IS_CAL_COMPONENT (comp)); @@ -707,181 +762,270 @@ cal_component_set_summary (CalComponent *comp, const CalComponentPropSummary *su priv = comp->priv; g_return_if_fail (priv->icalcomp != NULL); - if (!summary) { - if (priv->summary.prop) { - icalcomponent_remove_property (priv->icalcomp, priv->summary.prop); - icalproperty_free (priv->summary.prop); + /* Free the old list */ - priv->summary.prop = NULL; - priv->summary.altrep_param = NULL; + if (!categ_list) { + if (priv->categories_list) { + GSList *l; + + for (l = priv->categories_list; l; l = l->next) { + struct categories *c; + + c = l->data; + icalcomponent_remove_property (priv->icalcomp, c->prop); + icalproperty_free (c->prop); + + g_free (c); + } + + g_slist_free (priv->categories_list); + priv->categories_list = NULL; } return; } - g_return_if_fail (summary->value != NULL); + /* Create a single string of categories */ - if (priv->summary.prop) - icalproperty_set_summary (priv->summary.prop, (char *) summary->value); - else { - priv->summary.prop = icalproperty_new_summary ((char *) summary->value); - icalcomponent_add_property (priv->icalcomp, priv->summary.prop); - } + categories_str = stringify_categories (categ_list); - if (summary->altrep) { - g_assert (priv->summary.prop != NULL); + /* Set the categories */ - if (priv->summary.altrep_param) - icalparameter_set_altrep (priv->summary.altrep_param, - (char *) summary->altrep); - else { - priv->summary.altrep_param = icalparameter_new_altrep ( - (char *) summary->altrep); - icalproperty_add_parameter (priv->summary.prop, - priv->summary.altrep_param); - } - } else if (priv->summary.altrep_param) { -#if 0 - /* FIXME: this fucking routine will assert(0) since it is not implemented */ - icalproperty_remove_parameter (priv->summary.prop, ICAL_ALTREP_PARAMETER); - icalparameter_free (priv->summary.altrep_param); -#endif - priv->summary.altrep_param = NULL; - } + cat = g_new (struct categories, 1); + cat->prop = icalproperty_new_categories (categories_str); + g_free (categories_str); + + icalcomponent_add_property (priv->icalcomp, cat->prop); } /** - * cal_component_get_description_list: - * @comp: A calendar component object. - * @desc_list: Return value for the description properties and their parameters, - * as a list of #CalComponentDescription structures. This should be freed using - * the cal_component_free_description_list() function. + * cal_component_free_categories_list: + * @categ_list: List of category strings. * - * Queries the description of a calendar component object. Journal components - * may have more than one description, and as such this function returns a list - * of #CalComponentDescription structures. All other types of components can - * have at most one description. + * Frees a list of category strings. **/ void -cal_component_get_description_list (CalComponent *comp, GSList **desc_list) +cal_component_free_categories_list (GSList *categ_list) { - CalComponentPrivate *priv; - GSList *list; GSList *l; - g_return_if_fail (comp != NULL); - g_return_if_fail (IS_CAL_COMPONENT (comp)); - g_return_if_fail (desc_list != NULL); + for (l = categ_list; l; l = l->next) + g_free (l->data); - priv = comp->priv; + g_slist_free (categ_list); +} + +/** + * cal_component_free_text_list: + * @text_list: List of #CalComponentText structures. + * + * Frees a list of #CalComponentText structures. This function should only be + * used to free lists of text values as returned by the other getter functions + * of #CalComponent. + **/ +void +cal_component_free_text_list (GSList *text_list) +{ + GSList *l; + + for (l = text_list; l; l = l->next) { + CalComponentText *text; + + text = l->data; + g_return_if_fail (text != NULL); + g_free (text); + } - list = NULL; + g_slist_free (text_list); +} - for (l = priv->description_list; l; l = l->next) { - struct description *desc; - CalComponentDescription *d; +/* Gets a text list value */ +static void +get_text_list (GSList *text_list, + char *(* get_prop_func) (icalproperty *prop), + GSList **tl) +{ + GSList *l; - desc = l->data; - g_assert (desc->prop != NULL); + if (!text_list) { + *tl = NULL; + return; + } - d = g_new (CalComponentDescription, 1); - d->value = icalproperty_get_description (desc->prop); + *tl = NULL; - if (desc->altrep_param) - d->altrep = icalparameter_get_altrep (desc->altrep_param); + for (l = text_list; l; l = l->next) { + struct text *text; + CalComponentText *t; + + text = l->data; + g_assert (text->prop != NULL); + + t = g_new (CalComponentText, 1); + t->value = (* get_prop_func) (text->prop); + + if (text->altrep_param) + t->altrep = icalparameter_get_altrep (text->altrep_param); else - d->altrep = NULL; + t->altrep = NULL; - list = g_slist_prepend (list, d); + *tl = g_slist_prepend (*tl, t); } - *desc_list = g_slist_reverse (list); + *tl = g_slist_reverse (*tl); +} + +/* Sets a text list value */ +static void +set_text_list (CalComponent *comp, + icalproperty *(* new_prop_func) (char *value), + GSList **text_list, + GSList *tl) +{ + CalComponentPrivate *priv; + GSList *l; + + priv = comp->priv; + + /* Remove old texts */ + + for (l = *text_list; l; l = l->next) { + struct text *text; + + text = l->data; + g_assert (text->prop != NULL); + + icalcomponent_remove_property (priv->icalcomp, text->prop); + g_free (text); + } + + g_slist_free (*text_list); + *text_list = NULL; + + /* Add in new texts */ + + for (l = tl; l; l = l->next) { + CalComponentText *t; + struct text *text; + + t = l->data; + g_return_if_fail (t->value != NULL); + + text = g_new (struct text, 1); + + text->prop = (* new_prop_func) ((char *) t->value); + icalcomponent_add_property (priv->icalcomp, text->prop); + + if (t->altrep) { + text->altrep_param = icalparameter_new_altrep ((char *) t->altrep); + icalproperty_add_parameter (text->prop, text->altrep_param); + } else + text->altrep_param = NULL; + + *text_list = g_slist_prepend (*text_list, text); + } + + *text_list = g_slist_reverse (*text_list); } /** - * cal_component_set_description_list: + * cal_component_get_comment_list: * @comp: A calendar component object. - * @desc_list: List of #CalComponentSummary structures. + * @text_list: Return value for the comment properties and their parameters, as + * a list of #CalComponentText structures. This should be freed using the + * cal_component_free_text_list() function. * - * Sets the description of a calendar component object. Journal components may - * have more than one description, and as such this function takes in a list of - * #CalComponentDescription structures. All other types of components can have - * at most one description. + * Queries the comment of a calendar component object. The comment property can + * appear several times inside a calendar component, and so a list of + * #CalComponentText is returned. **/ void -cal_component_set_description_list (CalComponent *comp, GSList *desc_list) +cal_component_get_comment_list (CalComponent *comp, GSList **text_list) { CalComponentPrivate *priv; - GSList *l; g_return_if_fail (comp != NULL); g_return_if_fail (IS_CAL_COMPONENT (comp)); + g_return_if_fail (text_list != NULL); priv = comp->priv; g_return_if_fail (priv->icalcomp != NULL); - - /* Remove old descriptions */ - - for (l = priv->description_list; l; l = l->next) { - struct description *desc; - - desc = l->data; - g_assert (desc->prop != NULL); - icalcomponent_remove_property (priv->icalcomp, desc->prop); - g_free (desc); - } - - g_slist_free (priv->description_list); - priv->description_list = NULL; + get_text_list (priv->comment_list, icalproperty_get_comment, text_list); +} - /* Add in new descriptions */ +/** + * cal_component_set_comment_list: + * @comp: A calendar component object. + * @text_list: List of #CalComponentText structures. + * + * Sets the comment of a calendar component object. The comment property can + * appear several times inside a calendar component, and so a list of + * #CalComponentText structures is used. + **/ +void +cal_component_set_comment_list (CalComponent *comp, GSList *text_list) +{ + CalComponentPrivate *priv; - for (l = desc_list; l; l = l->next) { - CalComponentDescription *d; - struct description *desc; + g_return_if_fail (comp != NULL); + g_return_if_fail (IS_CAL_COMPONENT (comp)); - d = l->data; - g_return_if_fail (d->value != NULL); + priv = comp->priv; + g_return_if_fail (priv->icalcomp != NULL); - desc = g_new (struct description, 1); + set_text_list (comp, icalproperty_new_comment, &priv->comment_list, text_list); +} - desc->prop = icalproperty_new_description ((char *) d->value); - icalcomponent_add_property (priv->icalcomp, desc->prop); +/** + * cal_component_get_description_list: + * @comp: A calendar component object. + * @text_list: Return value for the description properties and their parameters, + * as a list of #CalComponentText structures. This should be freed using the + * cal_component_free_text_list() function. + * + * Queries the description of a calendar component object. Journal components + * may have more than one description, and as such this function returns a list + * of #CalComponentText structures. All other types of components can have at + * most one description. + **/ +void +cal_component_get_description_list (CalComponent *comp, GSList **text_list) +{ + CalComponentPrivate *priv; - if (d->altrep) { - desc->altrep_param = icalparameter_new_altrep ((char *) d->altrep); - icalproperty_add_parameter (desc->prop, desc->altrep_param); - } else - desc->altrep_param = NULL; + g_return_if_fail (comp != NULL); + g_return_if_fail (IS_CAL_COMPONENT (comp)); + g_return_if_fail (text_list != NULL); - priv->description_list = g_slist_prepend (priv->description_list, desc); - } + priv = comp->priv; + g_return_if_fail (priv->icalcomp != NULL); - priv->description_list = g_slist_reverse (priv->description_list); + get_text_list (priv->description_list, icalproperty_get_description, text_list); } /** - * cal_component_free_description_list: - * @desc_list: List of #CalComponentDescription structures. + * cal_component_set_description_list: + * @comp: A calendar component object. + * @text_list: List of #CalComponentSummary structures. * - * Frees a list of #CalComponentDescription structures as was returned by the - * cal_component_get_description_list() function. + * Sets the description of a calendar component object. Journal components may + * have more than one description, and as such this function takes in a list of + * #CalComponentDescription structures. All other types of components can have + * at most one description. **/ void -cal_component_free_description_list (GSList *desc_list) +cal_component_set_description_list (CalComponent *comp, GSList *text_list) { - GSList *l; + CalComponentPrivate *priv; - for (l = desc_list; l; l = l->next) { - CalComponentDescription *desc; + g_return_if_fail (comp != NULL); + g_return_if_fail (IS_CAL_COMPONENT (comp)); - desc = l->data; - g_return_if_fail (desc != NULL); - g_free (desc); - } + priv = comp->priv; + g_return_if_fail (priv->icalcomp != NULL); - g_slist_free (desc_list); + set_text_list (comp, icalproperty_new_description, &priv->description_list, text_list); } /** @@ -935,6 +1079,7 @@ cal_component_get_dtstart (CalComponent *comp, CalComponentDateTime *dt) g_return_if_fail (dt != NULL); priv = comp->priv; + g_return_if_fail (priv->icalcomp != NULL); get_datetime (&priv->dtstart, icalproperty_get_dtstart, dt); } @@ -1032,6 +1177,7 @@ cal_component_get_dtend (CalComponent *comp, CalComponentDateTime *dt) g_return_if_fail (dt != NULL); priv = comp->priv; + g_return_if_fail (priv->icalcomp != NULL); get_datetime (&priv->dtend, icalproperty_get_dtend, dt); } @@ -1078,6 +1224,7 @@ cal_component_get_due (CalComponent *comp, CalComponentDateTime *dt) g_return_if_fail (dt != NULL); priv = comp->priv; + g_return_if_fail (priv->icalcomp != NULL); get_datetime (&priv->due, icalproperty_get_due, dt); } @@ -1107,92 +1254,46 @@ cal_component_set_due (CalComponent *comp, CalComponentDateTime *dt) } /** - * cal_component_get_categories_list: + * cal_component_get_summary: * @comp: A calendar component object. - * @categ_list: Return value for the list of strings, where each string is a - * category. This should be freed using cal_component_free_categories_list(). + * @summary: Return value for the summary property and its parameters. * - * Queries the list of categories of a calendar component object. Each element - * in the returned categ_list is a string with the corresponding category. + * Queries the summary of a calendar component object. **/ void -cal_component_get_categories_list (CalComponent *comp, GSList **categ_list) +cal_component_get_summary (CalComponent *comp, CalComponentPropSummary *summary) { CalComponentPrivate *priv; - const char *categories; - const char *p; - const char *cat_start; - char *str; g_return_if_fail (comp != NULL); g_return_if_fail (IS_CAL_COMPONENT (comp)); + g_return_if_fail (summary != NULL); priv = comp->priv; g_return_if_fail (priv->icalcomp != NULL); - g_return_if_fail (categ_list != NULL); - - if (!priv->categories_list) { - *categ_list = NULL; - return; - } - - categories = icalproperty_get_categories (priv->categories_list); - g_assert (categories != NULL); - - cat_start = categories; - - *categ_list = NULL; - - for (p = categories; *p; p++) - if (*p == ',') { - str = g_strndup (cat_start, p - cat_start); - *categ_list = g_slist_prepend (*categ_list, str); - - cat_start = p + 1; - } - - str = g_strndup (cat_start, p - cat_start); - *categ_list = g_slist_prepend (*categ_list, str); - - *categ_list = g_slist_reverse (*categ_list); -} - -/* Creates a comma-delimited string of categories */ -static char * -stringify_categories (GSList *categ_list) -{ - GString *s; - GSList *l; - char *str; - - s = g_string_new (NULL); - for (l = categ_list; l; l = l->next) { - g_string_append (s, l->data); - - if (l->next != NULL) - g_string_append (s, ","); - } - - str = s->str; - g_string_free (s, FALSE); + if (priv->summary.prop) + summary->value = icalproperty_get_summary (priv->summary.prop); + else + summary->value = NULL; - return str; + if (priv->summary.altrep_param) + summary->altrep = icalparameter_get_altrep (priv->summary.altrep_param); + else + summary->altrep = NULL; } /** - * cal_component_set_categories_list: + * cal_component_set_summary: * @comp: A calendar component object. - * @categ_list: List of strings, one for each category. + * @summary: Summary property and its parameters. * - * Sets the list of categories of a calendar component object. + * Sets the summary of a calendar component object. **/ void -cal_component_set_categories_list (CalComponent *comp, GSList *categ_list) +cal_component_set_summary (CalComponent *comp, const CalComponentPropSummary *summary) { CalComponentPrivate *priv; - struct categories *cat; - char *categories_str; g_return_if_fail (comp != NULL); g_return_if_fail (IS_CAL_COMPONENT (comp)); @@ -1200,55 +1301,45 @@ cal_component_set_categories_list (CalComponent *comp, GSList *categ_list) priv = comp->priv; g_return_if_fail (priv->icalcomp != NULL); - /* Free the old list */ - - if (!categ_list) { - if (priv->categories_list) { - GSList *l; - - for (l = priv->categories_list; l; l = l->next) { - struct categories *c; - - c = l->data; - icalcomponent_remove_property (priv->icalcomp, c->prop); - icalproperty_free (c->prop); - - g_free (c); - } + if (!summary) { + if (priv->summary.prop) { + icalcomponent_remove_property (priv->icalcomp, priv->summary.prop); + icalproperty_free (priv->summary.prop); - g_slist_free (priv->categories_list); - priv->categories_list = NULL; + priv->summary.prop = NULL; + priv->summary.altrep_param = NULL; } return; } - /* Create a single string of categories */ - - categories_str = stringify_categories (categ_list); - - /* Set the categories */ - - cat = g_new (struct categories, 1); - cat->prop = icalproperty_new_categories (categories_str); - g_free (categories_str); - - icalcomponent_add_property (priv->icalcomp, cat->prop); -} + g_return_if_fail (summary->value != NULL); -/** - * cal_component_free_categories_list: - * @categ_list: List of category strings. - * - * Frees a list of category strings. - **/ -void -cal_component_free_categories_list (GSList *categ_list) -{ - GSList *l; + if (priv->summary.prop) + icalproperty_set_summary (priv->summary.prop, (char *) summary->value); + else { + priv->summary.prop = icalproperty_new_summary ((char *) summary->value); + icalcomponent_add_property (priv->icalcomp, priv->summary.prop); + } - for (l = categ_list; l; l = l->next) - g_free (l->data); + if (summary->altrep) { + g_assert (priv->summary.prop != NULL); - g_slist_free (categ_list); + if (priv->summary.altrep_param) + icalparameter_set_altrep (priv->summary.altrep_param, + (char *) summary->altrep); + else { + priv->summary.altrep_param = icalparameter_new_altrep ( + (char *) summary->altrep); + icalproperty_add_parameter (priv->summary.prop, + priv->summary.altrep_param); + } + } else if (priv->summary.altrep_param) { +#if 0 + /* FIXME: this fucking routine will assert(0) since it is not implemented */ + icalproperty_remove_parameter (priv->summary.prop, ICAL_ALTREP_PARAMETER); + icalparameter_free (priv->summary.altrep_param); +#endif + priv->summary.altrep_param = NULL; + } } |