diff options
-rw-r--r-- | calendar/ChangeLog | 7 | ||||
-rw-r--r-- | calendar/conduits/calendar/calendar-conduit.c | 76 | ||||
-rw-r--r-- | calendar/gui/e-meeting-model.c | 124 |
3 files changed, 123 insertions, 84 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index af77afeebc..1bd6d5f607 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,10 @@ +2001-10-30 JP Rosevear <jpr@ximian.com> + + * gui/e-meeting-model.c (process_section): process an individual + section here + (select_names_ok_cb): call above + (get_select_name_dialog): listen for ok:dialog signal + 2001-10-29 Damon Chaplin <damon@ximian.com> * importers/Makefile.am (evolution_calendar_importer_LDADD): diff --git a/calendar/conduits/calendar/calendar-conduit.c b/calendar/conduits/calendar/calendar-conduit.c index fcd976355d..c845fc4516 100644 --- a/calendar/conduits/calendar/calendar-conduit.c +++ b/calendar/conduits/calendar/calendar-conduit.c @@ -367,6 +367,7 @@ process_multi_day (ECalConduitContext *ctxt, CalClientChange *ccc, GList **multi icaltimezone *tz_start, *tz_end; time_t event_start, event_end, day_end; struct icaltimetype *old_start_value, *old_end_value; + const char *uid; gboolean last = FALSE; gboolean ret = TRUE; @@ -375,27 +376,34 @@ process_multi_day (ECalConduitContext *ctxt, CalClientChange *ccc, GList **multi if (ccc->type == CAL_CLIENT_CHANGE_DELETED) return FALSE; - + + /* Start time */ cal_component_get_dtstart (ccc->comp, &dt_start); - tz_start = get_timezone (ctxt->client, dt_start.tzid); + if (dt_start.value->is_date) + tz_start = ctxt->timezone; + else + tz_start = get_timezone (ctxt->client, dt_start.tzid); event_start = icaltime_as_timet_with_zone (*dt_start.value, tz_start); + cal_component_get_dtend (ccc->comp, &dt_end); - tz_end = get_timezone (ctxt->client, dt_end.tzid); + if (dt_end.value->is_date) { + icaltime_adjust (dt_end.value, 1, 0, 0, 0); + tz_end = ctxt->timezone; + } else { + tz_end = get_timezone (ctxt->client, dt_end.tzid); + } event_end = icaltime_as_timet_with_zone (*dt_end.value, tz_end); - day_end = time_day_end_with_zone (event_start, ctxt->timezone); - - if (day_end < event_end) { - const char *uid; - - cal_component_get_uid (ccc->comp, &uid); - cal_client_remove_object (ctxt->client, uid); - ccc->type = CAL_CLIENT_CHANGE_DELETED; - } else { + day_end = time_day_end_with_zone (event_start, ctxt->timezone); + if (day_end >= event_end) { ret = FALSE; goto cleanup; + } else if (cal_component_has_recurrences (ccc->comp)) { + ret = TRUE; + goto cleanup; } + INFO ("Split info: %lu, %lu, %lu", event_start, event_end, day_end); old_start_value = dt_start.value; old_end_value = dt_end.value; while (!last) { @@ -408,14 +416,15 @@ process_multi_day (ECalConduitContext *ctxt, CalClientChange *ccc, GList **multi day_end = event_end; last = TRUE; } - + cal_component_set_uid (clone, new_uid); - + start_value = icaltime_from_timet_with_zone (event_start, FALSE, tz_start); dt_start.value = &start_value; + cal_component_set_dtstart (clone, &dt_start); + end_value = icaltime_from_timet_with_zone (day_end, FALSE, tz_end); dt_end.value = &end_value; - cal_component_set_dtstart (clone, &dt_start); cal_component_set_dtend (clone, &dt_end); cal_client_update_object (ctxt->client, clone); @@ -431,6 +440,10 @@ process_multi_day (ECalConduitContext *ctxt, CalClientChange *ccc, GList **multi } dt_start.value = old_start_value; dt_end.value = old_end_value; + + cal_component_get_uid (ccc->comp, &uid); + cal_client_remove_object (ctxt->client, uid); + ccc->type = CAL_CLIENT_CHANGE_DELETED; cleanup: cal_component_free_datetime (&dt_start); @@ -951,7 +964,7 @@ pre_sync (GnomePilotConduit *conduit, ECalConduitContext *ctxt) { GnomePilotConduitSyncAbs *abs_conduit; - GList *l; + GList *removed = NULL, *added = NULL, *l; int len; unsigned char *buf; char *filename, *change_id; @@ -964,7 +977,9 @@ pre_sync (GnomePilotConduit *conduit, ctxt->dbi = dbi; ctxt->client = NULL; - + + gnome_pilot_conduit_warning (conduit, "Random warning"); + if (start_calendar_server (ctxt) != 0) { WARN(_("Could not start wombat server")); gnome_pilot_conduit_error (conduit, _("Could not start wombat")); @@ -995,24 +1010,33 @@ pre_sync (GnomePilotConduit *conduit, ctxt->changed_hash = g_hash_table_new (g_str_hash, g_str_equal); g_free (change_id); + /* See if we need to split up any events */ for (l = ctxt->changed; l != NULL; l = l->next) { CalClientChange *ccc = l->data; GList *multi_uid = NULL, *multi_ccc = NULL; - /* Handle Multi-day events */ if (process_multi_day (ctxt, ccc, &multi_uid, &multi_ccc)) { - const char *uid; ctxt->uids = g_list_concat (ctxt->uids, multi_uid); - ctxt->changed = g_list_concat (ctxt->changed, multi_ccc); + + added = g_list_concat (added, multi_ccc); + removed = g_list_prepend (removed, ccc); + } + } - cal_component_get_uid (ccc->comp, &uid); - if (e_pilot_map_lookup_pid (ctxt->map, uid, FALSE) == 0) { - ctxt->changed = g_list_remove (ctxt->changed, ccc); - gtk_object_unref (GTK_OBJECT (ccc->comp)); - g_free (ccc); - } + /* Remove the events that were split up */ + g_list_concat (ctxt->changed, added); + for (l = removed; l != NULL; l = l->next) { + CalClientChange *ccc = l->data; + const char *uid; + + cal_component_get_uid (ccc->comp, &uid); + if (e_pilot_map_lookup_pid (ctxt->map, uid, FALSE) == 0) { + ctxt->changed = g_list_remove (ctxt->changed, ccc); + gtk_object_unref (GTK_OBJECT (ccc->comp)); + g_free (ccc); } } + g_list_free (removed); for (l = ctxt->changed; l != NULL; l = l->next) { CalClientChange *ccc = l->data; diff --git a/calendar/gui/e-meeting-model.c b/calendar/gui/e-meeting-model.c index c9555a6f9b..d57da3b78a 100644 --- a/calendar/gui/e-meeting-model.c +++ b/calendar/gui/e-meeting-model.c @@ -89,6 +89,17 @@ struct _EMeetingModelPrivate #define BUF_SIZE 1024 +static char *sections[] = {N_("Chair Persons"), + N_("Required Participants"), + N_("Optional Participants"), + N_("Non-Participants"), + NULL}; +static icalparameter_role roles[] = {ICAL_ROLE_CHAIR, + ICAL_ROLE_REQPARTICIPANT, + ICAL_ROLE_OPTPARTICIPANT, + ICAL_ROLE_NONPARTICIPANT, + ICAL_ROLE_NONE}; + typedef struct _EMeetingModelAttendeeRefreshData EMeetingModelAttendeeRefreshData; struct _EMeetingModelAttendeeRefreshData { char buffer[BUF_SIZE]; @@ -110,11 +121,11 @@ static void init (EMeetingModel *model); static void destroy (GtkObject *obj); static void attendee_changed_cb (EMeetingAttendee *ia, gpointer data); -static void invite_entry_changed_cb (BonoboListener *listener, - char *event_name, - CORBA_any *arg, - CORBA_Environment *ev, - gpointer data); +static void select_names_ok_cb (BonoboListener *listener, + char *event_name, + CORBA_any *arg, + CORBA_Environment *ev, + gpointer data); static void table_destroy_cb (ETableScrolled *etable, gpointer data); @@ -1326,18 +1337,16 @@ e_meeting_model_etable_from_model (EMeetingModel *im, const gchar *spec_file, co } static void -add_section (GNOME_Evolution_Addressbook_SelectNames corba_select_names, const char *name, int limit) +add_section (GNOME_Evolution_Addressbook_SelectNames corba_select_names, const char *name) { CORBA_Environment ev; CORBA_exception_init (&ev); - if (limit != 0) - GNOME_Evolution_Addressbook_SelectNames_addSectionWithLimit (corba_select_names, - name, name, limit, &ev); - else - GNOME_Evolution_Addressbook_SelectNames_addSection (corba_select_names, - name, name, &ev); + GNOME_Evolution_Addressbook_SelectNames_addSection (corba_select_names, + name, + gettext (name), + &ev); CORBA_exception_free (&ev); } @@ -1346,11 +1355,8 @@ static gboolean get_select_name_dialog (EMeetingModel *im) { EMeetingModelPrivate *priv; - const char *sections[] = {_("Chair Persons"), - _("Required Participants"), - _("Optional Participants"), - _("Non-Participants")}; CORBA_Environment ev; + int i; priv = im->priv; @@ -1360,8 +1366,9 @@ get_select_name_dialog (EMeetingModel *im) int i; CORBA_exception_init (&ev); - for (i = 0; i < 4; i++) { - corba_control = GNOME_Evolution_Addressbook_SelectNames_getEntryBySection (priv->corba_select_names, sections[i], &ev); + for (i = 0; sections[i] != NULL; i++) { + corba_control = GNOME_Evolution_Addressbook_SelectNames_getEntryBySection + (priv->corba_select_names, sections[i], &ev); if (BONOBO_EX (&ev)) { CORBA_exception_free (&ev); return FALSE; @@ -1380,14 +1387,12 @@ get_select_name_dialog (EMeetingModel *im) priv->corba_select_names = oaf_activate_from_id (SELECT_NAMES_OAFID, 0, NULL, &ev); - add_section (priv->corba_select_names, sections[0], 0); - add_section (priv->corba_select_names, sections[1], 0); - add_section (priv->corba_select_names, sections[2], 0); - add_section (priv->corba_select_names, sections[3], 0); + for (i = 0; sections[i] != NULL; i++) + add_section (priv->corba_select_names, sections[i]); bonobo_event_source_client_add_listener (priv->corba_select_names, - invite_entry_changed_cb, - "GNOME/Evolution:changed:model", + select_names_ok_cb, + "GNOME/Evolution:ok:dialog", NULL, im); if (BONOBO_EX (&ev)) { @@ -1420,34 +1425,10 @@ e_meeting_model_invite_others_dialog (EMeetingModel *im) } static void -invite_entry_changed_cb (BonoboListener *listener, - char *event_name, - CORBA_any *arg, - CORBA_Environment *ev, - gpointer data) +process_section (EMeetingModel *im, EDestination **destv, icalparameter_role role) { - EMeetingModel *im = data; - EMeetingModelPrivate *priv; - Bonobo_Control corba_control; - GtkWidget *control_widget; - EDestination **destv; - char *string = NULL, *section; int i; - priv = im->priv; - - section = BONOBO_ARG_GET_STRING (arg); - - g_message ("event: \"%s\", section \"%s\"", event_name, section); - - corba_control = GNOME_Evolution_Addressbook_SelectNames_getEntryBySection (priv->corba_select_names, section, ev); - control_widget = bonobo_widget_new_control_from_objref (corba_control, CORBA_OBJECT_NIL); - - bonobo_widget_get_property (BONOBO_WIDGET (control_widget), "destinations", &string, NULL); - destv = e_destination_importv (string); - if (destv == NULL) - return; - for (i = 0; destv[i] != NULL; i++) { EMeetingAttendee *ia; const char *name, *address; @@ -1455,22 +1436,49 @@ invite_entry_changed_cb (BonoboListener *listener, name = e_destination_get_name (destv[i]); address = e_destination_get_email (destv[i]); + if (address == NULL || *address == '\0') + continue; + if (e_meeting_model_find_attendee (im, address, NULL) == NULL) { ia = e_meeting_model_add_attendee_with_defaults (im); e_meeting_attendee_set_address (ia, g_strdup_printf ("MAILTO:%s", address)); - if (!strcmp (section, _("Chair Persons"))) - e_meeting_attendee_set_role (ia, ICAL_ROLE_CHAIR); - else if (!strcmp (section, _("Required Participants"))) - e_meeting_attendee_set_role (ia, ICAL_ROLE_REQPARTICIPANT); - else if (!strcmp (section, _("Optional Participants"))) - e_meeting_attendee_set_role (ia, ICAL_ROLE_OPTPARTICIPANT); - else if (!strcmp (section, _("Non-Participants"))) - e_meeting_attendee_set_role (ia, ICAL_ROLE_NONPARTICIPANT); + e_meeting_attendee_set_role (ia, role); e_meeting_attendee_set_cn (ia, g_strdup (name)); } } - e_destination_freev (destv); +} + +static void +select_names_ok_cb (BonoboListener *listener, + char *event_name, + CORBA_any *arg, + CORBA_Environment *ev, + gpointer data) +{ + EMeetingModel *im = data; + EMeetingModelPrivate *priv; + Bonobo_Control corba_control; + GtkWidget *control_widget; + EDestination **destv; + char *string = NULL; + int i; + + priv = im->priv; + + for (i = 0; sections[i] != NULL; i++) { + corba_control = GNOME_Evolution_Addressbook_SelectNames_getEntryBySection + (priv->corba_select_names, sections[i], ev); + control_widget = bonobo_widget_new_control_from_objref + (corba_control, CORBA_OBJECT_NIL); + + bonobo_widget_get_property (BONOBO_WIDGET (control_widget), "destinations", &string, NULL); + destv = e_destination_importv (string); + if (destv != NULL) { + process_section (im, destv, roles[i]); + e_destination_freev (destv); + } + } } static void |