static void e_cal_backend_http_start_view (ECalBackend *backend, EDataCalView *query) { ECalBackendHttp *cbhttp; ECalBackendHttpPrivate *priv; GSList *components, *l; GSList *objects = NULL; ECalBackendSExp *cbsexp; ETimezoneCache *timezone_cache; time_t occur_start = -1, occur_end = -1; gboolean prunning_by_time; cbhttp = E_CAL_BACKEND_HTTP (backend); priv = cbhttp->priv; timezone_cache = E_TIMEZONE_CACHE (backend); cbsexp = e_data_cal_view_get_sexp (query); d (g_message (G_STRLOC ": Starting query (%s)", e_cal_backend_sexp_text (cbsexp))); if (!priv->store) { GError *error = EDC_ERROR (NoSuchCal); e_data_cal_view_notify_complete (query, error); g_error_free (error); return; } /* process all components in the cache */ objects = NULL; prunning_by_time = e_cal_backend_sexp_evaluate_occur_times ( cbsexp, &occur_start, &occur_end); components = prunning_by_time ? e_cal_backend_store_get_components_occuring_in_range (priv->store, occur_start, occur_end) : e_cal_backend_store_get_components (priv->store); for (l = components; l != NULL; l = g_slist_next (l)) { ECalComponent *comp = l->data; if (e_cal_backend_sexp_match_comp (cbsexp, comp, timezone_cache)) { objects = g_slist_append (objects, comp); } } e_data_cal_view_notify_components_added (query, objects); g_slist_free_full (components, g_object_unref); g_slist_free (objects); e_data_cal_view_notify_complete (query, NULL /* Success */); }
/* Get_objects_in_range handler for the file backend */ static void e_cal_backend_http_get_object_list (ECalBackendSync *backend, EDataCal *cal, GCancellable *cancellable, const gchar *sexp, GSList **objects, GError **perror) { ECalBackendHttp *cbhttp; ECalBackendHttpPrivate *priv; GSList *components, *l; ECalBackendSExp *cbsexp; ETimezoneCache *timezone_cache; time_t occur_start = -1, occur_end = -1; gboolean prunning_by_time; cbhttp = E_CAL_BACKEND_HTTP (backend); priv = cbhttp->priv; timezone_cache = E_TIMEZONE_CACHE (backend); if (!priv->store) { g_propagate_error (perror, EDC_ERROR (NoSuchCal)); return; } /* process all components in the cache */ cbsexp = e_cal_backend_sexp_new (sexp); *objects = NULL; prunning_by_time = e_cal_backend_sexp_evaluate_occur_times ( cbsexp, &occur_start, &occur_end); components = prunning_by_time ? e_cal_backend_store_get_components_occuring_in_range (priv->store, occur_start, occur_end) : e_cal_backend_store_get_components (priv->store); for (l = components; l != NULL; l = g_slist_next (l)) { if (e_cal_backend_sexp_match_comp (cbsexp, E_CAL_COMPONENT (l->data), timezone_cache)) { *objects = g_slist_append (*objects, e_cal_component_get_as_string (l->data)); } } g_slist_foreach (components, (GFunc) g_object_unref, NULL); g_slist_free (components); g_object_unref (cbsexp); }
/** * e_cal_backend_sexp_match_object: * @sexp: An #ESExp object. * @object: An iCalendar string. * @backend: A backend. * * Match an iCalendar expression against the expression. * * Returns: TRUE if the object matches the expression, FALSE if not. */ gboolean e_cal_backend_sexp_match_object (ECalBackendSExp *sexp, const gchar *object, ECalBackend *backend) { ECalComponent *comp; icalcomponent *icalcomp; gboolean retval; icalcomp = icalcomponent_new_from_string ((gchar *) object); if (!icalcomp) return FALSE; comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomp); retval = e_cal_backend_sexp_match_comp (sexp, comp, backend); g_object_unref (comp); return retval; }
static icalcomponent * create_user_free_busy (ECalBackendHttp *cbhttp, const gchar *address, const gchar *cn, time_t start, time_t end) { GSList *slist = NULL, *l; icalcomponent *vfb; icaltimezone *utc_zone; ECalBackendSExp *obj_sexp; ECalBackendHttpPrivate *priv; ECalBackendStore *store; gchar *query, *iso_start, *iso_end; priv = cbhttp->priv; store = priv->store; /* create the (unique) VFREEBUSY object that we'll return */ vfb = icalcomponent_new_vfreebusy (); if (address != NULL) { icalproperty *prop; icalparameter *param; prop = icalproperty_new_organizer (address); if (prop != NULL && cn != NULL) { param = icalparameter_new_cn (cn); icalproperty_add_parameter (prop, param); } if (prop != NULL) icalcomponent_add_property (vfb, prop); } utc_zone = icaltimezone_get_utc_timezone (); icalcomponent_set_dtstart (vfb, icaltime_from_timet_with_zone (start, FALSE, utc_zone)); icalcomponent_set_dtend (vfb, icaltime_from_timet_with_zone (end, FALSE, utc_zone)); /* add all objects in the given interval */ iso_start = isodate_from_time_t (start); iso_end = isodate_from_time_t (end); query = g_strdup_printf ( "occur-in-time-range? (make-time \"%s\") (make-time \"%s\")", iso_start, iso_end); obj_sexp = e_cal_backend_sexp_new (query); g_free (query); g_free (iso_start); g_free (iso_end); if (!obj_sexp) return vfb; slist = e_cal_backend_store_get_components (store); for (l = slist; l; l = g_slist_next (l)) { ECalComponent *comp = l->data; icalcomponent *icalcomp, *vcalendar_comp; icalproperty *prop; icalcomp = e_cal_component_get_icalcomponent (comp); if (!icalcomp) continue; /* If the event is TRANSPARENT, skip it. */ prop = icalcomponent_get_first_property ( icalcomp, ICAL_TRANSP_PROPERTY); if (prop) { icalproperty_transp transp_val = icalproperty_get_transp (prop); if (transp_val == ICAL_TRANSP_TRANSPARENT || transp_val == ICAL_TRANSP_TRANSPARENTNOCONFLICT) continue; } if (!e_cal_backend_sexp_match_comp ( obj_sexp, l->data, E_TIMEZONE_CACHE (cbhttp))) continue; vcalendar_comp = icalcomponent_get_parent (icalcomp); if (!vcalendar_comp) vcalendar_comp = icalcomp; e_cal_recur_generate_instances ( comp, start, end, free_busy_instance, vfb, resolve_tzid, vcalendar_comp, icaltimezone_get_utc_timezone ()); } g_object_unref (obj_sexp); return vfb; }