[evolution-patches] patch for dealing with recurrences in ECalBackendSexp
- From: Rodrigo Moya <rodrigo ximian com>
- To: evolution-patches lists ximian com
- Subject: [evolution-patches] patch for dealing with recurrences in ECalBackendSexp
- Date: Mon, 15 Mar 2004 19:36:10 +0100
This patch makes ECalBackendSexp deal with recurrences, so all the
events happening in the given time range (including their recurrences)
are returned on queries started by clients.
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution-data-server/calendar/ChangeLog,v
retrieving revision 1.205
diff -u -p -r1.205 ChangeLog
--- ChangeLog 15 Mar 2004 17:33:18 -0000 1.205
+++ ChangeLog 15 Mar 2004 18:29:30 -0000
@@ -1,3 +1,22 @@
+2004-03-15 Rodrigo Moya <rodrigo ximian com>
+
+ * libedata-cal/e-cal-backend-sexp.c (func_occur_in_time_range): expand
+ recurrences for the given time range to be sure that we return the correct
+ events.
+ (check_instance_time_range_cb): callback to check the expanded recurrences.
+
2004-03-15 Rodney Dawes <dobey ximian com>
* libecal/libecal-1.0.pc.in:
Index: libedata-cal/e-cal-backend-sexp.c
===================================================================
RCS file: /cvs/gnome/evolution-data-server/calendar/libedata-cal/e-cal-backend-sexp.c,v
retrieving revision 1.12
diff -u -p -r1.12 e-cal-backend-sexp.c
--- libedata-cal/e-cal-backend-sexp.c 2 Mar 2004 22:48:55 -0000 1.12
+++ libedata-cal/e-cal-backend-sexp.c 15 Mar 2004 18:29:31 -0000
@@ -38,6 +38,7 @@ struct _ECalBackendSExpPrivate {
struct _SearchContext {
ECalComponent *comp;
ECalBackend *backend;
+ gboolean occurs;
};
ESExpResult *
@@ -259,6 +260,30 @@ func_uid (ESExp *esexp, int argc, ESExpR
return result;
}
+static gboolean
+check_instance_time_range_cb (ECalComponent *comp, time_t instance_start, time_t instance_end, gpointer data)
+{
+ SearchContext *ctx = data;
+
+ /* if we get called, the event has an occurrence in the given time range */
+ ctx->occurs = TRUE;
+
+ return TRUE;
+}
+
+static icaltimezone *
+resolve_tzid_cb (const char *tzid, gpointer user_data)
+{
+ SearchContext *ctx = user_data;
+
+ if (!tzid || !tzid[0])
+ return NULL;
+ else if (!strcmp (tzid, "UTC"))
+ return icaltimezone_get_utc_timezone ();
+
+ return e_cal_backend_internal_get_timezone (ctx->backend, tzid);
+}
+
/* (occur-in-time-range? START END)
*
* START - time_t, start of the time range
@@ -272,9 +297,8 @@ func_occur_in_time_range (ESExp *esexp,
{
SearchContext *ctx = data;
time_t start, end, tt;
- gboolean occurs;
- ESExpResult *result;
ECalComponentDateTime dt;
+ ESExpResult *result;
/* Check argument types */
@@ -301,39 +325,47 @@ func_occur_in_time_range (ESExp *esexp,
end = argv[1]->value.time;
/* See if the object occurs in the specified time range */
- occurs = FALSE;
-
- e_cal_component_get_dtstart (ctx->comp, &dt);
- if (dt.value) {
- icaltimezone *zone;
-
- if (dt.tzid)
- zone = e_cal_backend_internal_get_timezone (ctx->backend, dt.tzid);
- else
- zone = e_cal_backend_internal_get_default_timezone (ctx->backend);
+ ctx->occurs = FALSE;
+
+ if (e_cal_component_has_recurrences (ctx->comp)) {
+ e_cal_recur_generate_instances (ctx->comp, start, end,
+ (ECalRecurInstanceFn) check_instance_time_range_cb,
+ ctx, resolve_tzid_cb, ctx,
+ e_cal_backend_internal_get_default_timezone (ctx->backend));
+ } else {
+ e_cal_component_get_dtstart (ctx->comp, &dt);
+ if (dt.value) {
+ icaltimezone *zone;
+
+ if (dt.tzid)
+ zone = e_cal_backend_internal_get_timezone (ctx->backend, dt.tzid);
+ else
+ zone = e_cal_backend_internal_get_default_timezone (ctx->backend);
- tt = icaltime_as_timet_with_zone (*dt.value, zone);
- e_cal_component_free_datetime (&dt);
- if (tt >= start && tt <= end)
- occurs = TRUE;
- else {
- e_cal_component_get_dtend (ctx->comp, &dt);
- if (dt.value) {
- if (dt.tzid)
- zone = e_cal_backend_internal_get_timezone (ctx->backend, dt.tzid);
- else
- zone = e_cal_backend_internal_get_default_timezone (ctx->backend);
-
- tt = icaltime_as_timet_with_zone (*dt.value, zone);
- if (tt >= start && tt <= end)
- occurs = TRUE;
- e_cal_component_free_datetime (&dt);
+ tt = icaltime_as_timet_with_zone (*dt.value, zone);
+ e_cal_component_free_datetime (&dt);
+ if (tt >= start && tt <= end)
+ ctx->occurs = TRUE;
+ else {
+ e_cal_component_get_dtend (ctx->comp, &dt);
+ if (dt.value) {
+ if (dt.tzid)
+ zone = e_cal_backend_internal_get_timezone (ctx->backend, dt.tzid);
+ else
+ zone = e_cal_backend_internal_get_default_timezone (ctx->backend);
+
+ tt = icaltime_as_timet_with_zone (*dt.value, zone);
+ if (tt >= start && tt <= end)
+ ctx->occurs = TRUE;
+ e_cal_component_free_datetime (&dt);
+ }
}
}
+
}
result = e_sexp_result_new (esexp, ESEXP_RES_BOOL);
- result->value.bool = occurs;
+ result->value.bool = ctx->occurs;
return result;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]