diff options
-rw-r--r-- | calendar/ChangeLog | 17 | ||||
-rw-r--r-- | calendar/pcs/cal-backend-file.c | 144 | ||||
-rw-r--r-- | calendar/pcs/cal-backend.c | 167 | ||||
-rw-r--r-- | calendar/pcs/cal-backend.h | 12 |
4 files changed, 191 insertions, 149 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index 45e41cf30d..2725ccc788 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,5 +1,22 @@ 2001-02-08 JP Rosevear <jpr@ximian.com> + * pcs/cal-backend-file.c: Move the get_change code here + + * pcs/cal-backend.c: Remove get_changes related stuff and + implement by calling the virtual method instead + + * pcs/cal-backend.h: New virtual method. + + * pcs/cal-backend-file.c (compute_alarm_range): Use + icaldurationtype_as_int (replace _as_timet) + (add_alarm_occurrences_cb): ditto + +2001-02-08 JP Rosevear <jpr@ximian.com> + + * pcs/cal-backend-file.c (compute_alarm_range): Use + icaldurationtype_as_int (replace _as_timet) + (add_alarm_occurrences_cb): ditto + * gui/e-week-view.c (e_week_view_on_schedule_meet): new routine to throw up the meeting schedule dialog (e_week_view_show_popup_menu): add schedule meeting to the diff --git a/calendar/pcs/cal-backend-file.c b/calendar/pcs/cal-backend-file.c index 87d8ec3891..b3b3196324 100644 --- a/calendar/pcs/cal-backend-file.c +++ b/calendar/pcs/cal-backend-file.c @@ -22,6 +22,7 @@ #include <config.h> #include <gtk/gtksignal.h> +#include "e-util/e-dbhash.h" #include "cal-util/cal-recur.h" #include "cal-backend-file.h" @@ -75,6 +76,8 @@ static CalObjType cal_backend_file_get_type_by_uid (CalBackend *backend, const c static GList *cal_backend_file_get_uids (CalBackend *backend, CalObjType type); static GList *cal_backend_file_get_objects_in_range (CalBackend *backend, CalObjType type, time_t start, time_t end); +static GNOME_Evolution_Calendar_CalObjChangeSeq *cal_backend_file_get_changes ( + CalBackend *backend, CalObjType type, const char *change_id); static GNOME_Evolution_Calendar_CalComponentAlarmsSeq *cal_backend_file_get_alarms_in_range ( CalBackend *backend, time_t start, time_t end); @@ -145,6 +148,7 @@ cal_backend_file_class_init (CalBackendFileClass *class) backend_class->get_type_by_uid = cal_backend_file_get_type_by_uid; backend_class->get_uids = cal_backend_file_get_uids; backend_class->get_objects_in_range = cal_backend_file_get_objects_in_range; + backend_class->get_changes = cal_backend_file_get_changes; 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; @@ -947,6 +951,142 @@ cal_backend_file_get_objects_in_range (CalBackend *backend, CalObjType type, return event_list; } + +typedef struct +{ + CalBackend *backend; + GList *changes; + GList *change_ids; +} CalBackendFileComputeChangesData; + +static void +cal_backend_file_compute_changes_foreach_key (const char *key, gpointer data) +{ + CalBackendFileComputeChangesData *be_data = data; + char *calobj = cal_backend_get_object (be_data->backend, key); + + if (calobj == NULL) { + CalComponent *comp; + GNOME_Evolution_Calendar_CalObjChange *coc; + + comp = cal_component_new (); + cal_component_set_new_vtype (comp, CAL_COMPONENT_TODO); + cal_component_set_uid (comp, key); + + coc = GNOME_Evolution_Calendar_CalObjChange__alloc (); + coc->calobj = CORBA_string_dup (cal_component_get_as_string (comp)); + coc->type = GNOME_Evolution_Calendar_DELETED; + be_data->changes = g_list_prepend (be_data->changes, coc); + be_data->change_ids = g_list_prepend (be_data->change_ids, (gpointer) key); + } +} + +static GNOME_Evolution_Calendar_CalObjChangeSeq * +cal_backend_file_compute_changes (CalBackend *backend, CalObjType type, const char *change_id) +{ + char *filename; + EDbHash *ehash; + CalBackendFileComputeChangesData be_data; + GNOME_Evolution_Calendar_CalObjChangeSeq *seq; + GList *uids, *changes = NULL, *change_ids = NULL; + GList *i, *j; + int n; + + /* Find the changed ids - FIX ME, path should not be hard coded */ + if (type == GNOME_Evolution_Calendar_TYPE_TODO) + filename = g_strdup_printf ("%s/evolution/local/Tasks/%s.db", g_get_home_dir (), change_id); + else + filename = g_strdup_printf ("%s/evolution/local/Calendar/%s.db", g_get_home_dir (), change_id); + ehash = e_dbhash_new (filename); + g_free (filename); + + uids = cal_backend_get_uids (backend, type); + + /* Calculate adds and modifies */ + for (i = uids; i != NULL; i = i->next) { + GNOME_Evolution_Calendar_CalObjChange *coc; + char *uid = i->data; + char *calobj = cal_backend_get_object (backend, uid); + + g_assert (calobj != NULL); + + /* check what type of change has occurred, if any */ + switch (e_dbhash_compare (ehash, uid, calobj)) { + case E_DBHASH_STATUS_SAME: + break; + case E_DBHASH_STATUS_NOT_FOUND: + coc = GNOME_Evolution_Calendar_CalObjChange__alloc (); + coc->calobj = CORBA_string_dup (calobj); + coc->type = GNOME_Evolution_Calendar_ADDED; + changes = g_list_prepend (changes, coc); + change_ids = g_list_prepend (change_ids, uid); + break; + case E_DBHASH_STATUS_DIFFERENT: + coc = GNOME_Evolution_Calendar_CalObjChange__alloc (); + coc->calobj = CORBA_string_dup (calobj); + coc->type = GNOME_Evolution_Calendar_ADDED; + changes = g_list_append (changes, coc); + change_ids = g_list_prepend (change_ids, uid); + break; + } + } + + /* Calculate deletions */ + be_data.backend = backend; + be_data.changes = changes; + be_data.change_ids = change_ids; + e_dbhash_foreach_key (ehash, (EDbHashFunc)cal_backend_file_compute_changes_foreach_key, &be_data); + changes = be_data.changes; + change_ids = be_data.change_ids; + + /* Build the sequence and update the hash */ + n = g_list_length (changes); + + seq = GNOME_Evolution_Calendar_CalObjChangeSeq__alloc (); + seq->_length = n; + seq->_buffer = CORBA_sequence_GNOME_Evolution_Calendar_CalObjChange_allocbuf (n); + CORBA_sequence_set_release (seq, TRUE); + + for (i = changes, j = change_ids, n = 0; i != NULL; i = i->next, j = j->next, n++) { + GNOME_Evolution_Calendar_CalObjChange *coc = i->data; + GNOME_Evolution_Calendar_CalObjChange *seq_coc; + char *uid = j->data; + + /* sequence building */ + seq_coc = &seq->_buffer[n]; + seq_coc->calobj = CORBA_string_dup (coc->calobj); + seq_coc->type = coc->type; + + /* hash updating */ + if (coc->type == GNOME_Evolution_Calendar_ADDED + || coc->type == GNOME_Evolution_Calendar_MODIFIED) { + e_dbhash_add (ehash, uid, coc->calobj); + } else { + e_dbhash_remove (ehash, uid); + } + + CORBA_free (coc); + } + e_dbhash_write (ehash); + e_dbhash_destroy (ehash); + + cal_obj_uid_list_free (uids); + g_list_free (change_ids); + g_list_free (changes); + + return seq; +} + +/* Get_changes handler for the file backend */ +static GNOME_Evolution_Calendar_CalObjChangeSeq * +cal_backend_file_get_changes (CalBackend *backend, CalObjType type, const char *change_id) +{ + g_return_val_if_fail (backend != NULL, NULL); + g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL); + + return cal_backend_file_compute_changes (backend, type, change_id); +} + /* Computes the range of time in which recurrences should be generated for a * component in order to compute alarm trigger times. */ @@ -981,7 +1121,7 @@ compute_alarm_range (CalComponent *comp, GList *alarm_uids, time_t start, time_t case CAL_ALARM_TRIGGER_RELATIVE_START: case CAL_ALARM_TRIGGER_RELATIVE_END: dur = &trigger.u.rel_duration; -/* dur_time = icaldurationtype_as_timet (*dur); */ + dur_time = icaldurationtype_as_int (*dur); if (dur->is_neg) *alarm_end = MAX (*alarm_end, end + dur_time); @@ -1042,7 +1182,7 @@ add_alarm_occurrences_cb (CalComponent *comp, time_t start, time_t end, gpointer continue; dur = &trigger.u.rel_duration; -/* dur_time = icaldurationtype_as_timet (*dur); */ + dur_time = icaldurationtype_as_int (*dur); if (trigger.type == CAL_ALARM_TRIGGER_RELATIVE_START) occur_time = start; diff --git a/calendar/pcs/cal-backend.c b/calendar/pcs/cal-backend.c index b51452c793..a8c6aa9776 100644 --- a/calendar/pcs/cal-backend.c +++ b/calendar/pcs/cal-backend.c @@ -28,7 +28,6 @@ #include <gnome-xml/parserInternals.h> #include <gnome-xml/xmlmemory.h> -#include "e-util/e-dbhash.h" #include "cal-backend.h" #include "libversit/vcc.h" @@ -230,150 +229,6 @@ cal_backend_get_uids (CalBackend *backend, CalObjType type) return (* CLASS (backend)->get_uids) (backend, type); } -typedef struct -{ - CalBackend *backend; - GList *changes; - GList *change_ids; -} CalBackendComputeChangesData; - -static void -cal_backend_compute_changes_foreach_key (const char *key, gpointer data) -{ - CalBackendComputeChangesData *be_data = data; - char *calobj = cal_backend_get_object (be_data->backend, key); - - if (calobj == NULL) { - CalComponent *comp; - GNOME_Evolution_Calendar_CalObjChange *coc; - - comp = cal_component_new (); - cal_component_set_new_vtype (comp, CAL_COMPONENT_TODO); - cal_component_set_uid (comp, key); - - coc = GNOME_Evolution_Calendar_CalObjChange__alloc (); - coc->calobj = CORBA_string_dup (cal_component_get_as_string (comp)); - coc->type = GNOME_Evolution_Calendar_DELETED; - be_data->changes = g_list_prepend (be_data->changes, coc); - be_data->change_ids = g_list_prepend (be_data->change_ids, (gpointer) key); - } -} - -static GNOME_Evolution_Calendar_CalObjChangeSeq * -cal_backend_compute_changes (CalBackend *backend, CalObjType type, const char *change_id) -{ - char *filename; - EDbHash *ehash; - CalBackendComputeChangesData be_data; - GNOME_Evolution_Calendar_CalObjChangeSeq *seq; - GList *uids, *changes = NULL, *change_ids = NULL; - GList *i, *j; - int n; - - /* Find the changed ids - FIX ME, path should not be hard coded */ - if (type == GNOME_Evolution_Calendar_TYPE_TODO) - filename = g_strdup_printf ("%s/evolution/local/Tasks/%s.db", g_get_home_dir (), change_id); - else - filename = g_strdup_printf ("%s/evolution/local/Calendar/%s.db", g_get_home_dir (), change_id); - ehash = e_dbhash_new (filename); - g_free (filename); - - uids = cal_backend_get_uids (backend, type); - - /* Calculate adds and modifies */ - for (i = uids; i != NULL; i = i->next) { - GNOME_Evolution_Calendar_CalObjChange *coc; - char *uid = i->data; - char *calobj = cal_backend_get_object (backend, uid); - - g_assert (calobj != NULL); - - /* check what type of change has occurred, if any */ - switch (e_dbhash_compare (ehash, uid, calobj)) { - case E_DBHASH_STATUS_SAME: - break; - case E_DBHASH_STATUS_NOT_FOUND: - coc = GNOME_Evolution_Calendar_CalObjChange__alloc (); - coc->calobj = CORBA_string_dup (calobj); - coc->type = GNOME_Evolution_Calendar_ADDED; - changes = g_list_prepend (changes, coc); - change_ids = g_list_prepend (change_ids, uid); - break; - case E_DBHASH_STATUS_DIFFERENT: - coc = GNOME_Evolution_Calendar_CalObjChange__alloc (); - coc->calobj = CORBA_string_dup (calobj); - coc->type = GNOME_Evolution_Calendar_ADDED; - changes = g_list_append (changes, coc); - change_ids = g_list_prepend (change_ids, uid); - break; - } - } - - /* Calculate deletions */ - be_data.backend = backend; - be_data.changes = changes; - be_data.change_ids = change_ids; - e_dbhash_foreach_key (ehash, (EDbHashFunc)cal_backend_compute_changes_foreach_key, &be_data); - changes = be_data.changes; - change_ids = be_data.change_ids; - - /* Build the sequence and update the hash */ - n = g_list_length (changes); - - seq = GNOME_Evolution_Calendar_CalObjChangeSeq__alloc (); - seq->_length = n; - seq->_buffer = CORBA_sequence_GNOME_Evolution_Calendar_CalObjChange_allocbuf (n); - CORBA_sequence_set_release (seq, TRUE); - - for (i = changes, j = change_ids, n = 0; i != NULL; i = i->next, j = j->next, n++) { - GNOME_Evolution_Calendar_CalObjChange *coc = i->data; - GNOME_Evolution_Calendar_CalObjChange *seq_coc; - char *uid = j->data; - - /* sequence building */ - seq_coc = &seq->_buffer[n]; - seq_coc->calobj = CORBA_string_dup (coc->calobj); - seq_coc->type = coc->type; - - /* hash updating */ - if (coc->type == GNOME_Evolution_Calendar_ADDED - || coc->type == GNOME_Evolution_Calendar_MODIFIED) { - e_dbhash_add (ehash, uid, coc->calobj); - } else { - e_dbhash_remove (ehash, uid); - } - - CORBA_free (coc); - } - e_dbhash_write (ehash); - e_dbhash_destroy (ehash); - - cal_obj_uid_list_free (uids); - g_list_free (change_ids); - g_list_free (changes); - - return seq; -} - -/** - * cal_backend_get_changes: - * @backend: - * @type: - * @change_id: - * - * - * - * Return value: - **/ -GNOME_Evolution_Calendar_CalObjChangeSeq * -cal_backend_get_changes (CalBackend *backend, CalObjType type, const char *change_id) -{ - g_return_val_if_fail (backend != NULL, NULL); - g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL); - - return cal_backend_compute_changes (backend, type, change_id); -} - /** * cal_backend_get_objects_in_range: @@ -402,6 +257,28 @@ cal_backend_get_objects_in_range (CalBackend *backend, CalObjType type, } /** + * cal_backend_get_changes: + * @backend: A calendar backend + * @type: Bitmask with types of objects to return. + * @change_id: A unique uid for the callers change list + * + * Builds a sequence of objects and the type of change that occurred on them since + * the last time the give change_id was seen + * + * Return value: A list of the objects that changed and the type of change + **/ +GNOME_Evolution_Calendar_CalObjChangeSeq * +cal_backend_get_changes (CalBackend *backend, CalObjType type, const char *change_id) +{ + g_return_val_if_fail (backend != NULL, NULL); + g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL); + g_return_val_if_fail (change_id != NULL, NULL); + + g_assert (CLASS (backend)->get_changes != NULL); + return (* CLASS (backend)->get_changes) (backend, type, change_id); +} + +/** * cal_backend_get_alarms_in_range: * @backend: A calendar backend. * @start: Start time for query. diff --git a/calendar/pcs/cal-backend.h b/calendar/pcs/cal-backend.h index efb7068165..3784601ddf 100644 --- a/calendar/pcs/cal-backend.h +++ b/calendar/pcs/cal-backend.h @@ -74,6 +74,7 @@ struct _CalBackendClass { CalBackendOpenStatus (* open) (CalBackend *backend, GnomeVFSURI *uri, gboolean only_if_exists); + /* General object acquirement and information related virtual methods */ int (* get_n_objects) (CalBackend *backend, CalObjType type); char *(* get_object) (CalBackend *backend, const char *uid); CalObjType(* get_type_by_uid) (CalBackend *backend, const char *uid); @@ -82,12 +83,18 @@ struct _CalBackendClass { GList *(* get_objects_in_range) (CalBackend *backend, CalObjType type, time_t start, time_t end); + /* Change related virtual methods */ + GNOME_Evolution_Calendar_CalObjChangeSeq * (* get_changes) ( + CalBackend *backend, CalObjType type, const char *change_id); + + /* Alarm related virtual methods */ GNOME_Evolution_Calendar_CalComponentAlarmsSeq *(* get_alarms_in_range) ( CalBackend *backend, time_t start, time_t end); GNOME_Evolution_Calendar_CalComponentAlarms *(* get_alarms_for_object) ( CalBackend *backend, const char *uid, time_t start, time_t end, gboolean *object_found); + /* Object manipulation virtual methods */ gboolean (* update_object) (CalBackend *backend, const char *uid, const char *calobj); gboolean (* remove_object) (CalBackend *backend, const char *uid); }; @@ -107,11 +114,12 @@ char *cal_backend_get_object (CalBackend *backend, const char *uid); GList *cal_backend_get_uids (CalBackend *backend, CalObjType type); -GNOME_Evolution_Calendar_CalObjChangeSeq * cal_backend_get_changes (CalBackend *backend, CalObjType type, const char *change_id); - GList *cal_backend_get_objects_in_range (CalBackend *backend, CalObjType type, time_t start, time_t end); +GNOME_Evolution_Calendar_CalObjChangeSeq * cal_backend_get_changes ( + CalBackend *backend, CalObjType type, const char *change_id); + GNOME_Evolution_Calendar_CalComponentAlarmsSeq *cal_backend_get_alarms_in_range ( CalBackend *backend, time_t start, time_t end, gboolean *valid_range); |