aboutsummaryrefslogtreecommitdiffstats
path: root/calendar
diff options
context:
space:
mode:
authorDamon Chaplin <damon@helixcode.com>2000-12-12 07:43:42 +0800
committerDamon Chaplin <damon@src.gnome.org>2000-12-12 07:43:42 +0800
commit0fb5f2db0fa2d1eab01965ec9383410cab140348 (patch)
tree12579107cab19be0e2b5d464b1d38a082ecf6b16 /calendar
parent8997c57f5c1451e366a374a6e0bb74aa2f37e832 (diff)
downloadgsoc2013-evolution-0fb5f2db0fa2d1eab01965ec9383410cab140348.tar
gsoc2013-evolution-0fb5f2db0fa2d1eab01965ec9383410cab140348.tar.gz
gsoc2013-evolution-0fb5f2db0fa2d1eab01965ec9383410cab140348.tar.bz2
gsoc2013-evolution-0fb5f2db0fa2d1eab01965ec9383410cab140348.tar.lz
gsoc2013-evolution-0fb5f2db0fa2d1eab01965ec9383410cab140348.tar.xz
gsoc2013-evolution-0fb5f2db0fa2d1eab01965ec9383410cab140348.tar.zst
gsoc2013-evolution-0fb5f2db0fa2d1eab01965ec9383410cab140348.zip
updated the tests on the start & end time just before calling the
2000-12-11 Damon Chaplin <damon@helixcode.com> * cal-util/cal-recur.c (generate_instances_for_chunk): updated the tests on the start & end time just before calling the callback. It was skipping occurrences that started before the required interval's start time, which was wrong. We want all occurrences that intersect the interval. (cal_obj_time_weekday): removed the CalRecurrence* argument, since it isn't needed. svn path=/trunk/; revision=6925
Diffstat (limited to 'calendar')
-rw-r--r--calendar/ChangeLog10
-rw-r--r--calendar/cal-util/cal-recur.c81
-rw-r--r--calendar/cal-util/test-recur.c11
3 files changed, 67 insertions, 35 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index aa0d96f03a..ab05db166c 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,5 +1,15 @@
2000-12-11 Damon Chaplin <damon@helixcode.com>
+ * cal-util/cal-recur.c (generate_instances_for_chunk): updated the
+ tests on the start & end time just before calling the callback. It
+ was skipping occurrences that started before the required interval's
+ start time, which was wrong. We want all occurrences that intersect
+ the interval.
+ (cal_obj_time_weekday): removed the CalRecurrence* argument, since it
+ isn't needed.
+
+2000-12-11 Damon Chaplin <damon@helixcode.com>
+
* gui/event-editor.c: added changed flags and added calls to a new
function event_editor_set_changed() to set & reset this flag.
Added prompt_to_save_changed() which is called when the user
diff --git a/calendar/cal-util/cal-recur.c b/calendar/cal-util/cal-recur.c
index c2d1516f28..043afddb3b 100644
--- a/calendar/cal-util/cal-recur.c
+++ b/calendar/cal-util/cal-recur.c
@@ -431,8 +431,7 @@ static void cal_obj_time_add_seconds (CalObjTime *cotime,
static gint cal_obj_time_compare (CalObjTime *cotime1,
CalObjTime *cotime2,
CalObjTimeComparison type);
-static gint cal_obj_time_weekday (CalObjTime *cotime,
- CalRecurrence *recur);
+static gint cal_obj_time_weekday (CalObjTime *cotime);
static gint cal_obj_time_weekday_offset (CalObjTime *cotime,
CalRecurrence *recur);
static gint cal_obj_time_day_of_year (CalObjTime *cotime);
@@ -461,8 +460,7 @@ static void cal_recur_set_rule_end_date (icalproperty *prop,
#ifdef CAL_OBJ_DEBUG
-static char* cal_obj_time_to_string (CalObjTime *cotime,
- RecurData *recur_data);
+static char* cal_obj_time_to_string (CalObjTime *cotime);
#endif
@@ -932,6 +930,15 @@ cal_recur_free (CalRecurrence *r)
/* Generates one year's worth of recurrence instances. Returns TRUE if all the
* callback invocations returned TRUE, or FALSE when any one of them returns
* FALSE, i.e. meaning that the instance generation should be stopped.
+ *
+ * This should only output instances whose start time is between chunk_start
+ * and chunk_end (inclusive), or we may generate duplicates when we do the next
+ * chunk. (This applies mainly to weekly recurrences, since weeks can span 2
+ * years.)
+ *
+ * It should also only output instances that are on or after the event's
+ * DTSTART property and that intersect the required interval, between
+ * interval_start and interval_end.
*/
static gboolean
generate_instances_for_chunk (CalComponent *comp,
@@ -1096,7 +1103,10 @@ generate_instances_for_chunk (CalComponent *comp,
/* Convert each CalObjTime into a start & end time_t, and
check it is within the bounds of the event & interval. */
occ = &g_array_index (occs, CalObjTime, i);
-
+#if 0
+ g_print ("Checking occurrence: %s\n",
+ cal_obj_time_to_string (occ));
+#endif
start_tm.tm_year = occ->year - 1900;
start_tm.tm_mon = occ->month;
start_tm.tm_mday = occ->day;
@@ -1113,14 +1123,18 @@ generate_instances_for_chunk (CalComponent *comp,
}
/* Check to ensure that the start time is at or after the
- events DTSTART time, that it is not after the end of the
- interval we are generating instances for, and that it is
- inside the chunk that we are currently working on. */
+ event's DTSTART time, and that it is inside the chunk that
+ we are currently working on. (Note that the chunk_end time
+ is never after the interval end time, so this also tests
+ that we don't go past the end of the required interval). */
if (start_time < comp_dtstart
- || start_time < interval_start
|| cal_obj_time_compare_func (occ, chunk_start) < 0
- || cal_obj_time_compare_func (occ, chunk_end) > 0)
+ || cal_obj_time_compare_func (occ, chunk_end) > 0) {
+#if 0
+ g_print (" start time invalid\n");
+#endif
continue;
+ }
if (occ->is_rdate) {
if (!cal_object_get_rdate_end (occ, rdate_periods)) {
@@ -1148,10 +1162,14 @@ generate_instances_for_chunk (CalComponent *comp,
break;
}
- /* Check that the occurrence ends after the start of the
- current chunk. */
- if (cal_obj_time_compare_func (occ, chunk_start) <= 0)
+ /* Check that the end time is after the interval start, so we
+ know that it intersects the required interval. */
+ if (end_time <= interval_start) {
+#if 0
+ g_print (" end time invalid\n");
+#endif
continue;
+ }
cb_status = (*cb) (comp, start_time, end_time, cb_data);
if (!cb_status)
@@ -2064,10 +2082,8 @@ cal_obj_weekly_find_next_position (CalObjTime *cotime,
cal_obj_time_add_days (&week_start, -recur_data->weekday_offset);
#ifdef CAL_OBJ_DEBUG
- g_print ("Next day: %s\n",
- cal_obj_time_to_string (cotime, recur_data));
- g_print ("Week Start: %s\n",
- cal_obj_time_to_string (&week_start, recur_data));
+ g_print ("Next day: %s\n", cal_obj_time_to_string (cotime));
+ g_print ("Week Start: %s\n", cal_obj_time_to_string (&week_start));
#endif
if (event_end && cal_obj_time_compare (&week_start, event_end,
@@ -2077,7 +2093,7 @@ cal_obj_weekly_find_next_position (CalObjTime *cotime,
CALOBJ_DAY) > 0) {
#ifdef CAL_OBJ_DEBUG
g_print ("Interval end reached: %s\n",
- cal_obj_time_to_string (interval_end, recur_data));
+ cal_obj_time_to_string (interval_end));
#endif
return TRUE;
}
@@ -2743,7 +2759,7 @@ cal_obj_byday_expand_yearly (RecurData *recur_data,
/* Expand to every Mon/Tue/etc. in the year. */
occ->month = 0;
occ->day = 1;
- first_weekday = cal_obj_time_weekday (occ, recur_data->recur);
+ first_weekday = cal_obj_time_weekday (occ);
offset = (weekday + 7 - first_weekday) % 7;
cal_obj_time_add_days (occ, offset);
@@ -2756,7 +2772,7 @@ cal_obj_byday_expand_yearly (RecurData *recur_data,
/* Add the nth Mon/Tue/etc. in the year. */
occ->month = 0;
occ->day = 1;
- first_weekday = cal_obj_time_weekday (occ, recur_data->recur);
+ first_weekday = cal_obj_time_weekday (occ);
offset = (weekday + 7 - first_weekday) % 7;
offset += (week_num - 1) * 7;
cal_obj_time_add_days (occ, offset);
@@ -2767,7 +2783,7 @@ cal_obj_byday_expand_yearly (RecurData *recur_data,
/* Add the -nth Mon/Tue/etc. in the year. */
occ->month = 11;
occ->day = 31;
- last_weekday = cal_obj_time_weekday (occ, recur_data->recur);
+ last_weekday = cal_obj_time_weekday (occ);
offset = (last_weekday + 7 - weekday) % 7;
offset += (week_num - 1) * 7;
cal_obj_time_add_days (occ, -offset);
@@ -2821,7 +2837,7 @@ cal_obj_byday_expand_monthly (RecurData *recur_data,
if (week_num == 0) {
/* Expand to every Mon/Tue/etc. in the month.*/
occ->day = 1;
- first_weekday = cal_obj_time_weekday (occ, recur_data->recur);
+ first_weekday = cal_obj_time_weekday (occ);
offset = (weekday + 7 - first_weekday) % 7;
cal_obj_time_add_days (occ, offset);
@@ -2834,7 +2850,7 @@ cal_obj_byday_expand_monthly (RecurData *recur_data,
} else if (week_num > 0) {
/* Add the nth Mon/Tue/etc. in the month. */
occ->day = 1;
- first_weekday = cal_obj_time_weekday (occ, recur_data->recur);
+ first_weekday = cal_obj_time_weekday (occ);
offset = (weekday + 7 - first_weekday) % 7;
offset += (week_num - 1) * 7;
cal_obj_time_add_days (occ, offset);
@@ -2845,7 +2861,7 @@ cal_obj_byday_expand_monthly (RecurData *recur_data,
/* Add the -nth Mon/Tue/etc. in the month. */
occ->day = time_days_in_month (occ->year,
occ->month);
- last_weekday = cal_obj_time_weekday (occ, recur_data->recur);
+ last_weekday = cal_obj_time_weekday (occ);
offset = (last_weekday + 7 - weekday) % 7;
offset += (week_num - 1) * 7;
cal_obj_time_add_days (occ, -offset);
@@ -2931,7 +2947,7 @@ cal_obj_byday_filter (RecurData *recur_data,
len = occs->len;
for (i = 0; i < len; i++) {
occ = &g_array_index (occs, CalObjTime, i);
- weekday = cal_obj_time_weekday (occ, recur_data->recur);
+ weekday = cal_obj_time_weekday (occ);
/* See if the weekday on its own is set. */
if (recur_data->weekdays[weekday])
@@ -3401,8 +3417,8 @@ cal_obj_time_compare_func (const void *arg1,
retval = 0;
#if 0
- g_print ("%s - ", cal_obj_time_to_string (cotime1, NULL));
- g_print ("%s : %i\n", cal_obj_time_to_string (cotime2, NULL), retval);
+ g_print ("%s - ", cal_obj_time_to_string (cotime1));
+ g_print ("%s : %i\n", cal_obj_time_to_string (cotime2), retval);
#endif
return retval;
@@ -3437,8 +3453,7 @@ cal_obj_date_only_compare_func (const void *arg1,
/* Returns the weekday of the given CalObjTime, from 0 (Mon) - 6 (Sun). */
static gint
-cal_obj_time_weekday (CalObjTime *cotime,
- CalRecurrence *recur)
+cal_obj_time_weekday (CalObjTime *cotime)
{
GDate date;
gint weekday;
@@ -3555,16 +3570,14 @@ cal_object_time_from_time (CalObjTime *cotime,
buffer so beware. */
#ifdef CAL_OBJ_DEBUG
static char*
-cal_obj_time_to_string (CalObjTime *cotime,
- RecurData *recur_data)
+cal_obj_time_to_string (CalObjTime *cotime)
{
static char buffer[20];
char *weekdays[] = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun",
" " };
- gint weekday = 7;
+ gint weekday;
- if (recur_data)
- weekday = cal_obj_time_weekday (cotime, recur_data->recur);
+ weekday = cal_obj_time_weekday (cotime);
sprintf (buffer, "%s %02i/%02i/%04i %02i:%02i:%02i",
weekdays[weekday],
diff --git a/calendar/cal-util/test-recur.c b/calendar/cal-util/test-recur.c
index 2f1320ca86..a049ea955b 100644
--- a/calendar/cal-util/test-recur.c
+++ b/calendar/cal-util/test-recur.c
@@ -147,17 +147,26 @@ generate_occurrences (icalcomponent *icalcomp)
g_print ("#############################################################################\n");
g_print ("%s\n\n", icalcomponent_as_ical_string (tmp_icalcomp));
+ g_print ("Instances:\n");
occurrences = 0;
+ /* I use specific times when I am trying to pin down a bug seen
+ in one of the calendar views. */
#if 0
- cal_recur_generate_instances (comp, 972950400, 976492800,
+ cal_recur_generate_instances (comp, 982022400, 982108800,
occurrence_cb, &occurrences);
#else
cal_recur_generate_instances (comp, -1, -1,
occurrence_cb, &occurrences);
#endif
+ /* Print the component again so we can see the
+ X-EVOLUTION-ENDDATE parameter (only set if COUNT is used).
+ */
+ g_print ("#############################################################################\n");
+#if 0
g_print ("%s\n\n", icalcomponent_as_ical_string (tmp_icalcomp));
+#endif
}
}