diff options
author | Federico Mena Quintero <federico@helixcode.com> | 2000-08-09 06:39:13 +0800 |
---|---|---|
committer | Federico Mena Quintero <federico@src.gnome.org> | 2000-08-09 06:39:13 +0800 |
commit | 14e163207e7bea5a383f8b538041156dc2cb1c84 (patch) | |
tree | ce88eb76dbadd9a4093e8a6ad544ffe715b19d9c /calendar/pcs/cal-backend-file.c | |
parent | 9734f4252d8d24fede29bef124b9b5104cf8f0c6 (diff) | |
download | gsoc2013-evolution-14e163207e7bea5a383f8b538041156dc2cb1c84.tar.gz gsoc2013-evolution-14e163207e7bea5a383f8b538041156dc2cb1c84.tar.zst gsoc2013-evolution-14e163207e7bea5a383f8b538041156dc2cb1c84.zip |
Added a get_objects_in_range() method. Takes in a time range and the type
2000-08-08 Federico Mena Quintero <federico@helixcode.com>
* idl/evolution-calendar.idl (Cal): Added a get_objects_in_range()
method. Takes in a time range and the type of component we are
interested in; returns a list of UIDs. The idea is that
ocurrences get computed in the client; we can have multiple
recurrences in iCalendar and we cannot identify them trivially
across the wire.
(Cal): Removed the get_events_in_range() method.
* pcs/cal-backend.c (cal_backend_free_uid_list): New function.
(cal_backend_get_objects_in_range): New function.
(cal_backend_get_events_in_range): Removed.
* pcs/cal-backend-file.c (cal_backend_file_get_objects_in_range):
Implemented new method.
(cal_backend_file_get_events_in_range): Removed.
* pcs/cal.c (Cal_get_events_in_range): Removed.
(uncorba_obj_type): New function.
(Cal_get_uids): Use uncorba_obj_type().
(Cal_get_n_objects): Likewise.
(Cal_get_objects_in_range): Implemented new method.
* cal-client/cal-client.c (cal_client_get_events_in_range): Removed.
(cal_client_get_objects_in_range): Implemented.
(corba_obj_type): New function.
(cal_client_get_n_objects): Use corba_obj_type().
(cal_client_get_uids): Likewise.
svn path=/trunk/; revision=4613
Diffstat (limited to 'calendar/pcs/cal-backend-file.c')
-rw-r--r-- | calendar/pcs/cal-backend-file.c | 102 |
1 files changed, 59 insertions, 43 deletions
diff --git a/calendar/pcs/cal-backend-file.c b/calendar/pcs/cal-backend-file.c index f23024cec6..5e74689095 100644 --- a/calendar/pcs/cal-backend-file.c +++ b/calendar/pcs/cal-backend-file.c @@ -71,7 +71,8 @@ static void cal_backend_file_create (CalBackend *backend, GnomeVFSURI *uri); static int cal_backend_file_get_n_objects (CalBackend *backend, CalObjType type); static char *cal_backend_file_get_object (CalBackend *backend, const char *uid); static GList *cal_backend_file_get_uids (CalBackend *backend, CalObjType type); -static GList *cal_backend_file_get_events_in_range (CalBackend *backend, time_t start, time_t end); +static GList *cal_backend_file_get_objects_in_range (CalBackend *backend, CalObjType type, + time_t start, time_t end); static GList *cal_backend_file_get_alarms_in_range (CalBackend *backend, time_t start, time_t end); static gboolean cal_backend_file_get_alarms_for_object (CalBackend *backend, const char *uid, time_t start, time_t end, @@ -143,7 +144,7 @@ cal_backend_file_class_init (CalBackendFileClass *class) backend_class->get_n_objects = cal_backend_file_get_n_objects; backend_class->get_object = cal_backend_file_get_object; backend_class->get_uids = cal_backend_file_get_uids; - backend_class->get_events_in_range = cal_backend_file_get_events_in_range; + backend_class->get_objects_in_range = cal_backend_file_get_objects_in_range; backend_class->get_alarms_in_range = cal_backend_file_get_alarms_in_range; backend_class->get_alarms_for_object = cal_backend_file_get_alarms_for_object; backend_class->update_object = cal_backend_file_update_object; @@ -740,64 +741,74 @@ cal_backend_file_get_uids (CalBackend *backend, CalObjType type) return list; } -/* Allocates and fills in a new CalComponentInstance structure */ -static CalObjInstance * -build_cal_obj_instance (CalComponent *comp, time_t start, time_t end) +/* Callback used from cal_recur_generate_instances(); adds the component's UID + * to our hash table. + */ +static gboolean +add_instance (CalComponent *comp, time_t start, time_t end, gpointer data) { - CalObjInstance *icoi; + GHashTable *uid_hash; const char *uid; + const char *old_uid; + + uid_hash = data; + + /* We only care that the component's UID is listed in the hash table; + * that's why we only allow generation of one instance (i.e. return + * FALSE every time). + */ cal_component_get_uid (comp, &uid); - icoi = g_new (CalObjInstance, 1); - icoi->uid = g_strdup (uid); - icoi->start = start; - icoi->end = end; + old_uid = g_hash_table_lookup (uid_hash, uid); + if (old_uid) + return FALSE; - return icoi; + g_hash_table_insert (uid_hash, (char *) uid, NULL); + return FALSE; } -/* Builds a list of event component instances. Used as a callback from - * cal_recur_generate_instances(). +/* Populates a hash table with the UIDs of the components that occur or recur + * within a specific time range. */ -static gboolean -build_event_list (CalComponent *comp, time_t start, time_t end, gpointer data) +static void +get_instances_in_range (GHashTable *uid_hash, GList *components, time_t start, time_t end) { - CalObjInstance *icoi; - GList **l; - - l = data; + GList *l; - icoi = build_cal_obj_instance (comp, start, end); - *l = g_list_prepend (*l, icoi); + for (l = components; l; l = l->next) { + CalComponent *comp; - return TRUE; + comp = CAL_COMPONENT (l->data); + cal_recur_generate_instances (comp, start, end, add_instance, uid_hash); + } } -/* Compares two CalObjInstance structures by their start times. Called from - * g_list_sort(). - */ -static gint -compare_instance_func (gconstpointer a, gconstpointer b) +/* Used from g_hash_table_foreach(), adds a UID from the hash table to our list */ +static void +add_uid_to_list (gpointer key, gpointer value, gpointer data) { - const CalObjInstance *ca, *cb; - time_t diff; + GList **list; + const char *uid; + char *uid_copy; - ca = a; - cb = b; + list = data; - diff = ca->start - cb->start; - return (diff < 0) ? -1 : (diff > 0) ? 1 : 0; + uid = key; + uid_copy = g_strdup (uid); + + *list = g_list_prepend (*list, uid_copy); } -/* Get_events_in_range handler for the file backend */ +/* Get_objects_in_range handler for the file backend */ static GList * -cal_backend_file_get_events_in_range (CalBackend *backend, time_t start, time_t end) +cal_backend_file_get_objects_in_range (CalBackend *backend, CalObjType type, + time_t start, time_t end) { CalBackendFile *cbfile; CalBackendFilePrivate *priv; - GList *l; GList *event_list; + GHashTable *uid_hash; cbfile = CAL_BACKEND_FILE (backend); priv = cbfile->priv; @@ -807,16 +818,21 @@ cal_backend_file_get_events_in_range (CalBackend *backend, time_t start, time_t g_return_val_if_fail (start != -1 && end != -1, NULL); g_return_val_if_fail (start <= end, NULL); - event_list = NULL; + uid_hash = g_hash_table_new (g_str_hash, g_str_equal); - for (l = priv->events; l; l = l->next) { - CalComponent *comp; + if (type & CALOBJ_TYPE_EVENT) + get_instances_in_range (uid_hash, priv->events, start, end); - comp = l->data; - cal_recur_generate_instances (comp, start, end, build_event_list, &event_list); - } + if (type & CALOBJ_TYPE_TODO) + get_instances_in_range (uid_hash, priv->todos, start, end); + + if (type & CALOBJ_TYPE_JOURNAL) + get_instances_in_range (uid_hash, priv->journals, start, end); + + event_list = NULL; + g_hash_table_foreach (uid_hash, add_uid_to_list, &event_list); + g_hash_table_destroy (uid_hash); - event_list = g_list_sort (event_list, compare_instance_func); return event_list; } |