1
From 15f05d0f14864e567a59d1e32beff9e7187d6753 Mon Sep 17 00:00:00 2001
2
From: Milan Crha <mcrha@redhat.com>
3
Date: Thu, 16 Jul 2015 13:00:57 +0200
4
Subject: [PATCH] Bug 752373 - Monthly events do not recur correctly
7
calendar/libecal/e-cal-recur.c | 50 +++++++++++++++++++++++++-----------------
8
1 file changed, 30 insertions(+), 20 deletions(-)
10
diff --git a/calendar/libecal/e-cal-recur.c b/calendar/libecal/e-cal-recur.c
11
index 645cdf5..b8857d2 100644
12
--- a/calendar/libecal/e-cal-recur.c
13
+++ b/calendar/libecal/e-cal-recur.c
14
@@ -321,7 +321,8 @@ static GArray * cal_obj_generate_set_default (RecurData *recur_data,
15
ECalRecurVTable *vtable,
18
-static ECalRecurVTable * cal_obj_get_vtable (icalrecurrencetype_frequency recur_type);
19
+static ECalRecurVTable cal_obj_get_vtable (ECalRecurrence *recur,
20
+ gboolean *vtable_valid);
21
static void cal_obj_initialize_recur_data (RecurData *recur_data,
22
ECalRecurrence *recur,
23
CalObjTime *event_start);
24
@@ -1526,11 +1527,12 @@ cal_obj_expand_recurrence (CalObjTime *event_start,
25
CalObjTime *interval_end,
28
- ECalRecurVTable *vtable;
29
+ ECalRecurVTable vtable;
30
CalObjTime *event_end = NULL, event_end_cotime;
32
CalObjTime occ, *cotime;
33
GArray *all_occs, *occs;
34
+ gboolean vtable_valid = FALSE;
37
/* This is the resulting array of CalObjTime elements. */
38
@@ -1538,8 +1540,8 @@ cal_obj_expand_recurrence (CalObjTime *event_start,
42
- vtable = cal_obj_get_vtable (recur->freq);
44
+ vtable = cal_obj_get_vtable (recur, &vtable_valid);
48
/* Calculate some useful data such as some fast lookup tables. */
49
@@ -1565,7 +1567,7 @@ cal_obj_expand_recurrence (CalObjTime *event_start,
51
/* Get the first period based on the frequency and the interval that
52
* intersects the interval between start and end. */
53
- if ((*vtable->find_start_position) (event_start, event_end,
54
+ if ((*vtable.find_start_position) (event_start, event_end,
56
interval_start, interval_end,
58
@@ -1579,17 +1581,17 @@ cal_obj_expand_recurrence (CalObjTime *event_start,
59
case ICAL_YEARLY_RECURRENCE:
60
occs = cal_obj_generate_set_yearly (
65
case ICAL_MONTHLY_RECURRENCE:
66
occs = cal_obj_generate_set_monthly (
72
occs = cal_obj_generate_set_default (
79
@@ -1620,7 +1622,7 @@ cal_obj_expand_recurrence (CalObjTime *event_start,
80
g_array_free (occs, TRUE);
82
/* Skip to the next period, or exit the loop if finished. */
83
- if ((*vtable->find_next_position) (&occ, event_end,
84
+ if ((*vtable.find_next_position) (&occ, event_end,
85
&recur_data, interval_end))
88
@@ -1842,35 +1844,43 @@ cal_obj_generate_set_default (RecurData *recur_data,
91
/* Returns the function table corresponding to the recurrence frequency. */
92
-static ECalRecurVTable * cal_obj_get_vtable (icalrecurrencetype_frequency recur_type)
93
+static ECalRecurVTable
94
+cal_obj_get_vtable (ECalRecurrence *recur,
95
+ gboolean *vtable_valid)
97
- ECalRecurVTable * vtable;
98
+ ECalRecurVTable vtable;
100
- switch (recur_type) {
101
+ *vtable_valid = TRUE;
103
+ switch (recur->freq) {
104
case ICAL_YEARLY_RECURRENCE:
105
- vtable = &cal_obj_yearly_vtable;
106
+ vtable = cal_obj_yearly_vtable;
108
case ICAL_MONTHLY_RECURRENCE:
109
- vtable = &cal_obj_monthly_vtable;
110
+ vtable = cal_obj_monthly_vtable;
111
+ if (recur->bymonthday && recur->byday)
112
+ vtable.bymonthday_filter = cal_obj_bymonthday_filter;
114
+ vtable.bymonthday_filter = cal_obj_bymonthday_expand;
116
case ICAL_WEEKLY_RECURRENCE:
117
- vtable = &cal_obj_weekly_vtable;
118
+ vtable = cal_obj_weekly_vtable;
120
case ICAL_DAILY_RECURRENCE:
121
- vtable = &cal_obj_daily_vtable;
122
+ vtable = cal_obj_daily_vtable;
124
case ICAL_HOURLY_RECURRENCE:
125
- vtable = &cal_obj_hourly_vtable;
126
+ vtable = cal_obj_hourly_vtable;
128
case ICAL_MINUTELY_RECURRENCE:
129
- vtable = &cal_obj_minutely_vtable;
130
+ vtable = cal_obj_minutely_vtable;
132
case ICAL_SECONDLY_RECURRENCE:
133
- vtable = &cal_obj_secondly_vtable;
134
+ vtable = cal_obj_secondly_vtable;
137
g_warning ("Unknown recurrence frequency");
139
+ *vtable_valid = FALSE;