## e-cal-recur

e-cal-recur — Functions to expand recurrences for recurrent appointments.

## Synopsis

    gboolean            (*ECalRecurInstanceFn)              (ECalComponent *comp,
                                                             time_t instance_start,
                                                             time_t instance_end,
                                                             gpointer data);
    icaltimezone *      (*ECalRecurResolveTimezoneFn)       (const gchar *tzid,
                                                             gpointer data);
    void                e_cal_recur_generate_instances      (ECalComponent *comp,
                                                             time_t start,
                                                             time_t end,
                                                             ECalRecurInstanceFn cb,
                                                             gpointer cb_data,
                                                             ECalRecurResolveTimezoneFn tz_cb,
                                                             gpointer tz_cb_data,
                                                             icaltimezone *default_timezone);
    time_t              e_cal_recur_obtain_enddate          (struct icalrecurrencetype *ir,
                                                             icalproperty *prop,
                                                             icaltimezone *zone,
                                                             gboolean convert_end_date);
    gboolean            e_cal_recur_ensure_end_dates        (ECalComponent *comp,
                                                             gboolean refresh,
                                                             ECalRecurResolveTimezoneFn tz_cb,
                                                             gpointer tz_cb_data);
    const gchar **      e_cal_get_recur_nth                 (void);
    #define             e_cal_recur_nth

## Description

## Details

### ECalRecurInstanceFn ()

    gboolean            (*ECalRecurInstanceFn)              (ECalComponent *comp,
                                                             time_t instance_start,
                                                             time_t instance_end,
                                                             gpointer data);

### ECalRecurResolveTimezoneFn ()

    icaltimezone *      (*ECalRecurResolveTimezoneFn)       (const gchar *tzid,
                                                             gpointer data);

### e_cal_recur_generate_instances ()

    void                e_cal_recur_generate_instances      (ECalComponent *comp,
                                                             time_t start,
                                                             time_t end,
                                                             ECalRecurInstanceFn cb,
                                                             gpointer cb_data,
                                                             ECalRecurResolveTimezoneFn tz_cb,
                                                             gpointer tz_cb_data,
                                                             icaltimezone *default_timezone);

Calls the given callback function for each occurrence of the event that intersects the range between the given `start` and `end` times (the end time is not included). Note that the occurrences may start before the given start time.

If the callback routine returns FALSE the occurrence generation stops.

Both start and end can be -1, in which case we start at the events first instance and continue until it ends, or forever if it has no enddate.

The tz_cb is used to resolve references to timezones. It is passed a TZID and should return the icaltimezone* corresponding to that TZID. We need to do this as we access timezones in different ways on the client & server.

The default_timezone argument is used for DTSTART or DTEND properties that are DATE values or do not have a TZID (i.e. floating times).

`comp` : | A calendar component object.
`start` : | Range start time.
`end` : | Range end time.
`cb` : | Callback function.
`cb_data` : | Closure data for the callback function.
`tz_cb` : | Callback for retrieving timezones.
`tz_cb_data` : | Closure data for the timezone callback.
`default_timezone` : | Default timezone to use when a timezone cannot be found.

### e_cal_recur_obtain_enddate ()

    time_t              e_cal_recur_obtain_enddate          (struct icalrecurrencetype *ir,
                                                             icalproperty *prop,
                                                             icaltimezone *zone,
                                                             gboolean convert_end_date);

### e_cal_recur_ensure_end_dates ()

    gboolean            e_cal_recur_ensure_end_dates        (ECalComponent *comp,
                                                             gboolean refresh,
                                                             ECalRecurResolveTimezoneFn tz_cb,
                                                             gpointer tz_cb_data);

This recalculates the end dates for recurrence & exception rules which use the COUNT property. If `refresh` is `TRUE` it will recalculate all enddates for rules which use COUNT. If `refresh` is `FALSE`, it will only calculate the enddate if it hasn't already been set. It returns `TRUE` if the component was changed, i.e. if the component should be saved at some point. We store the enddate in the "X-EVOLUTION-ENDDATE" parameter of the RRULE or EXRULE.

Since 2.32

### e_cal_get_recur_nth ()

    const gchar **      e_cal_get_recur_nth                 (void);

Returns an array of 31 translated strings for each day of the month (i.e. "1st", "2nd", and so on).

Returns : | a pointer to an array of strings. This array is static, do not free it.

### e_cal_recur_nth

    #define e_cal_recur_nth (e_cal_get_recur_nth ())

An array of 31 translated strings for each day of the month (i.e. "1st", "2nd", and so on).