summaryrefslogtreecommitdiff
path: root/calendar
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2015-07-16 13:00:57 +0200
committerMilan Crha <mcrha@redhat.com>2015-07-16 13:00:57 +0200
commit4aeaafe6cf0dc05185aadb12f3c29128568b93b5 (patch)
treed6c733241ae595b2f40404434c4216173fab9bf1 /calendar
parent1440e58ddb0353aab08fc5fc6fcfc883b5a3b4c9 (diff)
downloadevolution-data-server-4aeaafe6cf0dc05185aadb12f3c29128568b93b5.tar.gz
Bug 752373 - Monthly events do not recur correctly
Diffstat (limited to 'calendar')
-rw-r--r--calendar/libecal/e-cal-recur.c50
1 files changed, 30 insertions, 20 deletions
diff --git a/calendar/libecal/e-cal-recur.c b/calendar/libecal/e-cal-recur.c
index 645cdf5a0..b8857d229 100644
--- a/calendar/libecal/e-cal-recur.c
+++ b/calendar/libecal/e-cal-recur.c
@@ -321,7 +321,8 @@ static GArray * cal_obj_generate_set_default (RecurData *recur_data,
ECalRecurVTable *vtable,
CalObjTime *occ);
-static ECalRecurVTable * cal_obj_get_vtable (icalrecurrencetype_frequency recur_type);
+static ECalRecurVTable cal_obj_get_vtable (ECalRecurrence *recur,
+ gboolean *vtable_valid);
static void cal_obj_initialize_recur_data (RecurData *recur_data,
ECalRecurrence *recur,
CalObjTime *event_start);
@@ -1526,11 +1527,12 @@ cal_obj_expand_recurrence (CalObjTime *event_start,
CalObjTime *interval_end,
gboolean *finished)
{
- ECalRecurVTable *vtable;
+ ECalRecurVTable vtable;
CalObjTime *event_end = NULL, event_end_cotime;
RecurData recur_data;
CalObjTime occ, *cotime;
GArray *all_occs, *occs;
+ gboolean vtable_valid = FALSE;
gint len;
/* This is the resulting array of CalObjTime elements. */
@@ -1538,8 +1540,8 @@ cal_obj_expand_recurrence (CalObjTime *event_start,
*finished = TRUE;
- vtable = cal_obj_get_vtable (recur->freq);
- if (!vtable)
+ vtable = cal_obj_get_vtable (recur, &vtable_valid);
+ if (!vtable_valid)
return all_occs;
/* Calculate some useful data such as some fast lookup tables. */
@@ -1565,7 +1567,7 @@ cal_obj_expand_recurrence (CalObjTime *event_start,
/* Get the first period based on the frequency and the interval that
* intersects the interval between start and end. */
- if ((*vtable->find_start_position) (event_start, event_end,
+ if ((*vtable.find_start_position) (event_start, event_end,
&recur_data,
interval_start, interval_end,
&occ))
@@ -1579,17 +1581,17 @@ cal_obj_expand_recurrence (CalObjTime *event_start,
case ICAL_YEARLY_RECURRENCE:
occs = cal_obj_generate_set_yearly (
&recur_data,
- vtable, &occ);
+ &vtable, &occ);
break;
case ICAL_MONTHLY_RECURRENCE:
occs = cal_obj_generate_set_monthly (
&recur_data,
- vtable, &occ);
+ &vtable, &occ);
break;
default:
occs = cal_obj_generate_set_default (
&recur_data,
- vtable, &occ);
+ &vtable, &occ);
break;
}
@@ -1620,7 +1622,7 @@ cal_obj_expand_recurrence (CalObjTime *event_start,
g_array_free (occs, TRUE);
/* Skip to the next period, or exit the loop if finished. */
- if ((*vtable->find_next_position) (&occ, event_end,
+ if ((*vtable.find_next_position) (&occ, event_end,
&recur_data, interval_end))
break;
}
@@ -1842,35 +1844,43 @@ cal_obj_generate_set_default (RecurData *recur_data,
}
/* Returns the function table corresponding to the recurrence frequency. */
-static ECalRecurVTable * cal_obj_get_vtable (icalrecurrencetype_frequency recur_type)
+static ECalRecurVTable
+cal_obj_get_vtable (ECalRecurrence *recur,
+ gboolean *vtable_valid)
{
- ECalRecurVTable * vtable;
+ ECalRecurVTable vtable;
- switch (recur_type) {
+ *vtable_valid = TRUE;
+
+ switch (recur->freq) {
case ICAL_YEARLY_RECURRENCE:
- vtable = &cal_obj_yearly_vtable;
+ vtable = cal_obj_yearly_vtable;
break;
case ICAL_MONTHLY_RECURRENCE:
- vtable = &cal_obj_monthly_vtable;
+ vtable = cal_obj_monthly_vtable;
+ if (recur->bymonthday && recur->byday)
+ vtable.bymonthday_filter = cal_obj_bymonthday_filter;
+ else
+ vtable.bymonthday_filter = cal_obj_bymonthday_expand;
break;
case ICAL_WEEKLY_RECURRENCE:
- vtable = &cal_obj_weekly_vtable;
+ vtable = cal_obj_weekly_vtable;
break;
case ICAL_DAILY_RECURRENCE:
- vtable = &cal_obj_daily_vtable;
+ vtable = cal_obj_daily_vtable;
break;
case ICAL_HOURLY_RECURRENCE:
- vtable = &cal_obj_hourly_vtable;
+ vtable = cal_obj_hourly_vtable;
break;
case ICAL_MINUTELY_RECURRENCE:
- vtable = &cal_obj_minutely_vtable;
+ vtable = cal_obj_minutely_vtable;
break;
case ICAL_SECONDLY_RECURRENCE:
- vtable = &cal_obj_secondly_vtable;
+ vtable = cal_obj_secondly_vtable;
break;
default:
g_warning ("Unknown recurrence frequency");
- vtable = NULL;
+ *vtable_valid = FALSE;
}
return vtable;