Index: evolution-data-server-2.29.3/calendar/libecal/e-cal-component.c =================================================================== --- evolution-data-server-2.29.3.orig/calendar/libecal/e-cal-component.c +++ evolution-data-server-2.29.3/calendar/libecal/e-cal-component.c @@ -161,6 +161,8 @@ struct _ECalComponentPrivate { * object over the wire. */ guint need_sequence_inc : 1; + + GSList *x_list; /* list of X icalproperty objects */ }; /* Private structure for alarms */ @@ -372,6 +374,9 @@ free_icalcomponent (ECalComponent *comp, /* Free the subcomponents */ g_hash_table_foreach_remove (priv->alarm_uid_hash, free_alarm_cb, NULL); + + g_slist_free (priv->x_list); + priv->x_list = NULL; /* Clean up */ @@ -527,6 +532,13 @@ e_cal_component_clone (ECalComponent *co return new_comp; } +static void +scan_x_prop (GSList **list, icalproperty *prop) +{ + *list = g_slist_append (*list, prop); +} + + /* Scans an attachment property */ static void scan_attachment (GSList **attachment_list, icalproperty *prop) @@ -789,7 +801,8 @@ scan_property (ECalComponent *comp, ical case ICAL_LOCATION_PROPERTY : priv->location = prop; break; - + case ICAL_X_PROPERTY: + scan_x_prop (&priv->x_list ,prop); default: break; } @@ -945,6 +958,9 @@ scan_icalcomponent (ECalComponent *comp) g_assert (priv->icalcomp != NULL); + if (e_cal_component_get_vtype (comp) == E_CAL_COMPONENT_VCALENDAR) + return; + /* Scan properties */ for (prop = icalcomponent_get_first_property (priv->icalcomp, ICAL_ANY_PROPERTY); @@ -1043,7 +1059,9 @@ e_cal_component_set_new_vtype (ECalCompo case E_CAL_COMPONENT_TIMEZONE: kind = ICAL_VTIMEZONE_COMPONENT; break; - + case E_CAL_COMPONENT_VCALENDAR: + kind = ICAL_VCALENDAR_COMPONENT; + break; default: g_assert_not_reached (); kind = ICAL_NO_COMPONENT; @@ -1061,8 +1079,8 @@ e_cal_component_set_new_vtype (ECalCompo scan_icalcomponent (comp); /* Add missing stuff */ - - ensure_mandatory_properties (comp); + if (type != E_CAL_COMPONENT_VCALENDAR && type != E_CAL_COMPONENT_TIMEZONE && type != E_CAL_COMPONENT_FREEBUSY); + ensure_mandatory_properties (comp); } /** @@ -1085,6 +1103,7 @@ e_cal_component_set_icalcomponent (ECalC { ECalComponentPrivate *priv; icalcomponent_kind kind; + ECalComponentVType vtype; g_return_val_if_fail (comp != NULL, FALSE); g_return_val_if_fail (E_IS_CAL_COMPONENT (comp), FALSE); @@ -1107,13 +1126,17 @@ e_cal_component_set_icalcomponent (ECalC || kind == ICAL_VTODO_COMPONENT || kind == ICAL_VJOURNAL_COMPONENT || kind == ICAL_VFREEBUSY_COMPONENT - || kind == ICAL_VTIMEZONE_COMPONENT)) + || kind == ICAL_VTIMEZONE_COMPONENT + || kind == ICAL_VCALENDAR_COMPONENT)) return FALSE; priv->icalcomp = icalcomp; scan_icalcomponent (comp); - ensure_mandatory_properties (comp); + + vtype = e_cal_component_get_vtype (comp); + if (vtype != E_CAL_COMPONENT_VCALENDAR && vtype != E_CAL_COMPONENT_TIMEZONE && vtype != E_CAL_COMPONENT_FREEBUSY); + ensure_mandatory_properties (comp); return TRUE; } @@ -1152,6 +1175,7 @@ void e_cal_component_rescan (ECalComponent *comp) { ECalComponentPrivate *priv; + ECalComponentVType vtype; g_return_if_fail (comp != NULL); g_return_if_fail (E_IS_CAL_COMPONENT (comp)); @@ -1163,7 +1187,10 @@ e_cal_component_rescan (ECalComponent *c /* Rescan */ scan_icalcomponent (comp); - ensure_mandatory_properties (comp); + + vtype = e_cal_component_get_vtype (comp); + if (vtype != E_CAL_COMPONENT_VCALENDAR && vtype != E_CAL_COMPONENT_TIMEZONE && vtype != E_CAL_COMPONENT_FREEBUSY); + ensure_mandatory_properties (comp); } /** @@ -1224,6 +1251,9 @@ e_cal_component_get_vtype (ECalComponent case ICAL_VTIMEZONE_COMPONENT: return E_CAL_COMPONENT_TIMEZONE; + case ICAL_VCALENDAR_COMPONENT: + return E_CAL_COMPONENT_VCALENDAR; + default: /* We should have been loaded with a supported type! */ g_assert_not_reached (); @@ -2616,6 +2646,27 @@ e_cal_component_set_dtstart (ECalCompone priv->need_sequence_inc = TRUE; } +gboolean +e_cal_component_is_allday (ECalComponent *comp) +{ + ECalComponentPrivate *priv; + ECalComponentDateTime dtstart, dtend; + gboolean ret = FALSE; + + priv = comp->priv; + + e_cal_component_get_dtstart (comp, &dtstart); + e_cal_component_get_dtend (comp, &dtend); + + if (dtstart.value->is_date && dtend.value->is_date) + ret = TRUE; + + e_cal_component_free_datetime (&dtstart); + e_cal_component_free_datetime (&dtend); + + return ret; +} + /** * e_cal_component_get_due: * @comp: A calendar component object. @@ -4060,6 +4111,24 @@ e_cal_component_get_sequence (ECalCompon **sequence = icalproperty_get_sequence (priv->sequence); } +int +e_cal_component_get_sequence_as_int (ECalComponent *comp) +{ + ECalComponentPrivate *priv; + + g_return_val_if_fail ((comp != NULL), -1); + g_return_val_if_fail (E_IS_CAL_COMPONENT (comp), -1); + + priv = comp->priv; + g_return_val_if_fail ((priv->icalcomp != NULL), -1); + + if (!priv->sequence) { + return 0; + } + + return icalproperty_get_sequence (priv->sequence); +} + /** * e_cal_component_set_sequence: * @comp: A calendar component object. @@ -6038,3 +6107,77 @@ e_cal_component_event_dates_match (ECalC return retval; } +void +e_cal_component_set_x_prop (ECalComponent *comp, const char *x_name, const char *x_value) +{ + GSList *l; + ECalComponentPrivate *priv; + icalproperty *prop; + + priv = comp->priv; + + for (l = priv->x_list; l != NULL; l = g_slist_next (l)) + { + prop = l->data; + const char *name = icalproperty_get_x_name (prop); + + if (!strcmp (x_name, name)) { + break; + } + prop = NULL; + } + + if (prop) { + icalcomponent_remove_property (priv->icalcomp, prop); + priv->x_list = g_slist_remove (priv->x_list, prop); + icalproperty_free (prop); + prop = NULL; + } + + if (!x_value || !*x_value) + return; + + prop = icalproperty_new_x (x_value); + icalproperty_set_x_name (prop, x_name); + icalcomponent_add_property (priv->icalcomp, prop); + + priv->x_list = g_slist_prepend (priv->x_list, prop); +} + +char * +e_cal_component_get_x_prop (ECalComponent *comp, const char *x_name) +{ + GSList *l; + ECalComponentPrivate *priv; + + priv = comp->priv; + + for (l = priv->x_list; l != NULL; l = g_slist_next (l)) + { + icalproperty *prop = l->data; + const char *name = icalproperty_get_x_name (prop); + + if (!strcmp (x_name, name)) { + const char *val = icalproperty_get_x (prop); + + return g_strdup (val); + } + } + + return NULL; +} + +int +e_cal_component_get_x_prop_as_int (ECalComponent *comp, const char *x_name) +{ + char *x_val = e_cal_component_get_x_prop (comp, x_name); + + if (x_val) { + int val = atoi (x_val); + g_free (x_val); + + return val; + } + + return -1; +} Index: evolution-data-server-2.29.3/calendar/libecal/e-cal-component.h =================================================================== --- evolution-data-server-2.29.3.orig/calendar/libecal/e-cal-component.h +++ evolution-data-server-2.29.3/calendar/libecal/e-cal-component.h @@ -51,7 +51,8 @@ typedef enum { E_CAL_COMPONENT_TODO, E_CAL_COMPONENT_JOURNAL, E_CAL_COMPONENT_FREEBUSY, - E_CAL_COMPONENT_TIMEZONE + E_CAL_COMPONENT_TIMEZONE, + E_CAL_COMPONENT_VCALENDAR } ECalComponentVType; /* Field identifiers for a calendar component; these are used by the data model @@ -256,6 +257,7 @@ void e_cal_component_set_dtend (ECalComp void e_cal_component_get_dtstamp (ECalComponent *comp, struct icaltimetype *t); void e_cal_component_set_dtstamp (ECalComponent *comp, struct icaltimetype *t); +gboolean e_cal_component_is_allday (ECalComponent *comp); void e_cal_component_get_dtstart (ECalComponent *comp, ECalComponentDateTime *dt); void e_cal_component_set_dtstart (ECalComponent *comp, ECalComponentDateTime *dt); @@ -312,6 +314,8 @@ gboolean e_cal_component_is_instance (EC void e_cal_component_get_sequence (ECalComponent *comp, gint **sequence); void e_cal_component_set_sequence (ECalComponent *comp, gint *sequence); +int e_cal_component_get_sequence_as_int (ECalComponent *comp); + void e_cal_component_get_status (ECalComponent *comp, icalproperty_status *status); void e_cal_component_set_status (ECalComponent *comp, icalproperty_status status); @@ -457,6 +461,10 @@ gboolean e_cal_component_alarm_has_atten icalcomponent *e_cal_component_alarm_get_icalcomponent (ECalComponentAlarm *alarm); +char *e_cal_component_get_x_prop (ECalComponent *comp, const char *x_name); +int e_cal_component_get_x_prop_as_int (ECalComponent *comp, const char *x_name); +void e_cal_component_set_x_prop (ECalComponent *comp, const char *x_name, const char *x_value); + G_END_DECLS