From 2be7cd3b2ab50047820da4a1e873785b53f41acd Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Mon, 19 Jan 2009 13:56:42 +0000 Subject: ** Fix for bug #225712 2009-01-19 Milan Crha ** Fix for bug #225712 * calendar/gui/dialogs/comp-editor.h: (CompEditorClass::send_comp), (comp_editor_send_comp): Changed function prototypes. * calendar/gui/dialogs/comp-editor.c: (real_send_comp), (save_comp_with_send), (comp_editor_send_comp): Strip alarms based on user's choice. * calendar/gui/dialogs/send-comp.h: (send_component_dialog): * calendar/gui/dialogs/send-comp.c: (have_nonprocedural_alarm), (send_component_dialog): Show option "Send my alarms with this event" when prompting to send event or not, but only if have any non-procedure alarms and if it the caller want to know user's opinion. Default is to strip all alarms. Procedure alarms are always strip out. * calendar/gui/dialogs/event-editor.c: (event_editor_send_comp): * calendar/gui/dialogs/task-editor.c: (task_editor_send_comp): Honor function prototype changes and use new parameter strip_alarms. * calendar/gui/itip-utils.h: (itip_send_comp): * calendar/gui/itip-utils.c: (comp_compliant), (itip_send_comp), (reply_to_calendar_comp): New parameter to strip all alarms or only procedure alarms. * calendar/gui/tasks-control.c: (tasks_control_forward_cmd): * calendar/gui/e-itip-control.c: (send_item), (send_freebusy), (ok_clicked_cb): * calendar/gui/e-calendar-table.c: (e_calendar_table_on_forward): * calendar/gui/e-memo-table.c: (e_memo_table_on_forward): * calendar/gui/e-calendar-view.c: (e_calendar_view_cut_clipboard), (delete_event), (e_calendar_view_delete_selected_occurrence), (on_forward): Always strip alarms when sending component. * calendar/gui/e-calendar-view.c: (e_calendar_view_add_event), (e_calendar_view_modify_and_send): * calendar/gui/e-cal-model-calendar.c: (ecmc_set_value_at): Strip alarms based on user's choice. * plugins/itip-formatter/itip-view.h: * plugins/itip-formatter/itip-view.c: (itip_view_set_show_keep_alarm_check), (itip_view_get_keep_alarm_check_state), (itip_view_set_show_inherit_alarm_check), (itip_view_get_inherit_alarm_check_state): New functions to new options to either inherit reminder from the incoming event or to preserve users reminders in already existing event in the calendar. * plugins/itip-formatter/itip-view.c: (struct _ItipViewPrivate), (alarm_check_toggled_cb), (itip_view_init): Properly initialize new option's members. * plugins/itip-formatter/itip-formatter.c: (find_cal_opened_cb), (update_item), (send_comp_to_attendee), (update_attendee_status), (send_item), (extract_itip_data), (view_response_cb), (format_itip_object): Setup new options based on the actual data. svn path=/trunk/; revision=37097 --- calendar/ChangeLog | 34 +++++++++++++++++++ calendar/gui/dialogs/comp-editor.c | 23 +++++++------ calendar/gui/dialogs/comp-editor.h | 5 +-- calendar/gui/dialogs/event-editor.c | 8 ++--- calendar/gui/dialogs/send-comp.c | 68 ++++++++++++++++++++++++++++++++++--- calendar/gui/dialogs/send-comp.h | 2 +- calendar/gui/dialogs/task-editor.c | 8 ++--- calendar/gui/e-cal-model-calendar.c | 6 ++-- calendar/gui/e-calendar-table.c | 2 +- calendar/gui/e-calendar-view.c | 20 ++++++----- calendar/gui/e-itip-control.c | 6 ++-- calendar/gui/e-memo-table.c | 2 +- calendar/gui/itip-utils.c | 35 +++++++++++++++---- calendar/gui/itip-utils.h | 2 +- calendar/gui/tasks-control.c | 2 +- 15 files changed, 173 insertions(+), 50 deletions(-) (limited to 'calendar') diff --git a/calendar/ChangeLog b/calendar/ChangeLog index 1341a52830..2368ba969c 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,37 @@ +2009-01-19 Milan Crha + + ** Fix for bug #225712 + + * gui/dialogs/comp-editor.h: (CompEditorClass::send_comp), + (comp_editor_send_comp): Changed function prototypes. + * gui/dialogs/comp-editor.c: (real_send_comp), (save_comp_with_send), + (comp_editor_send_comp): Strip alarms based on user's choice. + * gui/dialogs/send-comp.h: (send_component_dialog): + * gui/dialogs/send-comp.c: (have_nonprocedural_alarm), + (send_component_dialog): Show option "Send my alarms with this event" + when prompting to send event or not, but only if have any non-procedure + alarms and if it the caller want to know user's opinion. Default is + to strip all alarms. Procedure alarms are always strip out. + * gui/dialogs/event-editor.c: (event_editor_send_comp): + * gui/dialogs/task-editor.c: (task_editor_send_comp): + Honor function prototype changes and use new parameter strip_alarms. + * gui/itip-utils.h: (itip_send_comp): + * gui/itip-utils.c: (comp_compliant), (itip_send_comp), + (reply_to_calendar_comp): + New parameter to strip all alarms or only procedure alarms. + * gui/tasks-control.c: (tasks_control_forward_cmd): + * gui/e-itip-control.c: (send_item), (send_freebusy), (ok_clicked_cb): + * gui/e-calendar-table.c: (e_calendar_table_on_forward): + * gui/e-memo-table.c: (e_memo_table_on_forward): + * gui/e-calendar-view.c: (e_calendar_view_cut_clipboard), + (delete_event), (e_calendar_view_delete_selected_occurrence), + (on_forward): + Always strip alarms when sending component. + * gui/e-calendar-view.c: (e_calendar_view_add_event), + (e_calendar_view_modify_and_send): + * gui/e-cal-model-calendar.c: (ecmc_set_value_at): + Strip alarms based on user's choice. + 2009-01-19 Milan Crha ** Fix for bug #200254 diff --git a/calendar/gui/dialogs/comp-editor.c b/calendar/gui/dialogs/comp-editor.c index c3e0e38fed..4799895b84 100644 --- a/calendar/gui/dialogs/comp-editor.c +++ b/calendar/gui/dialogs/comp-editor.c @@ -172,7 +172,7 @@ static void comp_editor_show_help (CompEditor *editor); static void setup_widgets (CompEditor *editor); static void real_edit_comp (CompEditor *editor, ECalComponent *comp); -static gboolean real_send_comp (CompEditor *editor, ECalComponentItipMethod method); +static gboolean real_send_comp (CompEditor *editor, ECalComponentItipMethod method, gboolean strip_alarms); static gboolean prompt_and_save_changes (CompEditor *editor, gboolean send); static void close_dialog (CompEditor *editor); @@ -888,6 +888,7 @@ save_comp_with_send (CompEditor *editor) CompEditorFlags flags; gboolean send; gboolean delegate; + gboolean strip_alarms = TRUE; priv = editor->priv; @@ -907,18 +908,18 @@ save_comp_with_send (CompEditor *editor) if (!save_comp (editor)) return FALSE; - if ((delegate && !e_cal_get_save_schedules (priv->client)) || (send && send_component_dialog ((GtkWindow *) editor, priv->client, priv->comp, !priv->existing_org))) { + if ((delegate && !e_cal_get_save_schedules (priv->client)) || (send && send_component_dialog ((GtkWindow *) editor, priv->client, priv->comp, !priv->existing_org, &strip_alarms))) { if ((itip_organizer_is_user (priv->comp, priv->client) || itip_sentby_is_user (priv->comp))) { if (e_cal_component_get_vtype (priv->comp) == E_CAL_COMPONENT_JOURNAL) - return comp_editor_send_comp (editor, E_CAL_COMPONENT_METHOD_PUBLISH); + return comp_editor_send_comp (editor, E_CAL_COMPONENT_METHOD_PUBLISH, strip_alarms); else - return comp_editor_send_comp (editor, E_CAL_COMPONENT_METHOD_REQUEST); + return comp_editor_send_comp (editor, E_CAL_COMPONENT_METHOD_REQUEST, strip_alarms); } else { - if (!comp_editor_send_comp (editor, E_CAL_COMPONENT_METHOD_REQUEST)) + if (!comp_editor_send_comp (editor, E_CAL_COMPONENT_METHOD_REQUEST, strip_alarms)) return FALSE; if (delegate) - return comp_editor_send_comp (editor, E_CAL_COMPONENT_METHOD_REPLY); + return comp_editor_send_comp (editor, E_CAL_COMPONENT_METHOD_REPLY, strip_alarms); } } @@ -3045,7 +3046,7 @@ get_users_from_memo_comp (ECalComponent *comp, GList **users) } static gboolean -real_send_comp (CompEditor *editor, ECalComponentItipMethod method) +real_send_comp (CompEditor *editor, ECalComponentItipMethod method, gboolean strip_alarms) { CompEditorPrivate *priv; CompEditorFlags flags; @@ -3091,7 +3092,7 @@ real_send_comp (CompEditor *editor, ECalComponentItipMethod method) if (!e_cal_component_has_attachments (priv->comp) || e_cal_get_static_capability (priv->client, CAL_STATIC_CAPABILITY_CREATE_MESSAGES)) { if (itip_send_comp (method, send_comp, priv->client, - NULL, NULL, users)) { + NULL, NULL, users, strip_alarms)) { g_object_unref (send_comp); return TRUE; } @@ -3112,7 +3113,7 @@ real_send_comp (CompEditor *editor, ECalComponentItipMethod method) /* mime_attach_list is freed by itip_send_comp */ mime_attach_list = comp_editor_get_mime_attach_list (editor); if (itip_send_comp (method, send_comp, priv->client, - NULL, mime_attach_list, users)) { + NULL, mime_attach_list, users, strip_alarms)) { save_comp (editor); g_object_unref (send_comp); return TRUE; @@ -3234,7 +3235,7 @@ comp_editor_delete_comp (CompEditor *editor) * **/ gboolean -comp_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method) +comp_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method, gboolean strip_alarms) { CompEditorClass *class; @@ -3243,7 +3244,7 @@ comp_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method) class = COMP_EDITOR_GET_CLASS (editor); if (class->send_comp) - return class->send_comp (editor, method); + return class->send_comp (editor, method, strip_alarms); return FALSE; } diff --git a/calendar/gui/dialogs/comp-editor.h b/calendar/gui/dialogs/comp-editor.h index 9289b9ced7..ab277febf7 100644 --- a/calendar/gui/dialogs/comp-editor.h +++ b/calendar/gui/dialogs/comp-editor.h @@ -67,7 +67,7 @@ struct _CompEditorClass { /* Virtual functions */ void (*edit_comp) (CompEditor *page, ECalComponent *comp); void (*object_created) (CompEditor *page); - gboolean (*send_comp) (CompEditor *page, ECalComponentItipMethod method); + gboolean (*send_comp) (CompEditor *page, ECalComponentItipMethod method, gboolean strip_alarms); void (*show_categories) (CompEditor *editor, gboolean visible); void (*show_role) (CompEditor *editor, gboolean visible); @@ -129,7 +129,8 @@ gboolean comp_editor_save_comp (CompEditor *editor, gboolean send); void comp_editor_delete_comp (CompEditor *editor); gboolean comp_editor_send_comp (CompEditor *editor, - ECalComponentItipMethod method); + ECalComponentItipMethod method, + gboolean strip_alarms); GSList * comp_editor_get_mime_attach_list(CompEditor *editor); gboolean comp_editor_close (CompEditor *editor); diff --git a/calendar/gui/dialogs/event-editor.c b/calendar/gui/dialogs/event-editor.c index 161ed598b7..e3d3448f6c 100644 --- a/calendar/gui/dialogs/event-editor.c +++ b/calendar/gui/dialogs/event-editor.c @@ -99,7 +99,7 @@ static const gchar *ui = ""; static void event_editor_edit_comp (CompEditor *editor, ECalComponent *comp); -static gboolean event_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method); +static gboolean event_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method, gboolean strip_alarms); G_DEFINE_TYPE (EventEditor, event_editor, TYPE_COMP_EDITOR) @@ -620,7 +620,7 @@ event_editor_edit_comp (CompEditor *editor, ECalComponent *comp) } static gboolean -event_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method) +event_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method, gboolean strip_alarms) { EventEditorPrivate *priv; ECalComponent *comp = NULL; @@ -639,7 +639,7 @@ event_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method) client = e_meeting_store_get_e_cal (priv->model); result = itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp, - client, NULL, NULL, NULL); + client, NULL, NULL, NULL, strip_alarms); g_object_unref (comp); return result; @@ -647,7 +647,7 @@ event_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method) parent: if (COMP_EDITOR_CLASS (event_editor_parent_class)->send_comp) - return COMP_EDITOR_CLASS (event_editor_parent_class)->send_comp (editor, method); + return COMP_EDITOR_CLASS (event_editor_parent_class)->send_comp (editor, method, strip_alarms); return FALSE; } diff --git a/calendar/gui/dialogs/send-comp.c b/calendar/gui/dialogs/send-comp.c index 11d6e74757..a7d87c47f4 100644 --- a/calendar/gui/dialogs/send-comp.c +++ b/calendar/gui/dialogs/send-comp.c @@ -26,11 +26,44 @@ #include #endif +#include #include "e-util/e-error.h" #include "send-comp.h" +static gboolean +have_nonprocedural_alarm (ECalComponent *comp) +{ + GList *uids, *l; + + g_return_val_if_fail (comp != NULL, FALSE); + + uids = e_cal_component_get_alarm_uids (comp); + + for (l = uids; l; l = l->next) { + ECalComponentAlarm *alarm; + ECalComponentAlarmAction action = E_CAL_COMPONENT_ALARM_UNKNOWN; + + alarm = e_cal_component_get_alarm (comp, (const char *)l->data); + if (alarm) { + e_cal_component_alarm_get_action (alarm, &action); + e_cal_component_alarm_free (alarm); + + if (action != E_CAL_COMPONENT_ALARM_NONE && + action != E_CAL_COMPONENT_ALARM_PROCEDURE && + action != E_CAL_COMPONENT_ALARM_UNKNOWN) { + cal_obj_uid_list_free (uids); + return TRUE; + } + } + } + + cal_obj_uid_list_free (uids); + + return FALSE; +} + /** * send_component_dialog: * @@ -40,11 +73,14 @@ * Return value: TRUE if the user clicked Yes, FALSE otherwise. **/ gboolean -send_component_dialog (GtkWindow *parent, ECal *client, ECalComponent *comp, gboolean new) +send_component_dialog (GtkWindow *parent, ECal *client, ECalComponent *comp, gboolean new, gboolean *strip_alarms) { ECalComponentVType vtype; const char *id; + if (strip_alarms) + *strip_alarms = TRUE; + if (e_cal_get_save_schedules (client)) return FALSE; @@ -72,10 +108,32 @@ send_component_dialog (GtkWindow *parent, ECal *client, ECalComponent *comp, gbo return FALSE; } - if (e_error_run (parent, id, NULL) == GTK_RESPONSE_YES) - return TRUE; - else - return FALSE; + if (strip_alarms && have_nonprocedural_alarm (comp)) { + GtkWidget *dialog, *checkbox, *align; + gboolean res; + + dialog = e_error_new (parent, id, NULL); + checkbox = gtk_check_button_new_with_label (_("Send my alarms with this event")); + align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); + gtk_container_add (GTK_CONTAINER (align), checkbox); + gtk_widget_show (checkbox); + gtk_box_pack_end (GTK_BOX (GTK_DIALOG (dialog)->vbox), align, TRUE, TRUE, 6); + gtk_widget_show (align); + + res = gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_YES; + + if (res) + *strip_alarms = !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbox)); + + gtk_widget_destroy (GTK_WIDGET (dialog)); + + return res; + } else { + if (e_error_run (parent, id, NULL) == GTK_RESPONSE_YES) + return TRUE; + else + return FALSE; + } } gboolean diff --git a/calendar/gui/dialogs/send-comp.h b/calendar/gui/dialogs/send-comp.h index 4a1a6c55ab..21b310947a 100644 --- a/calendar/gui/dialogs/send-comp.h +++ b/calendar/gui/dialogs/send-comp.h @@ -28,7 +28,7 @@ #include #include -gboolean send_component_dialog (GtkWindow *parent, ECal *client, ECalComponent *comp, gboolean new); +gboolean send_component_dialog (GtkWindow *parent, ECal *client, ECalComponent *comp, gboolean new, gboolean *strip_alarms); gboolean send_component_prompt_subject (GtkWindow *parent, ECal *client, ECalComponent *comp); #endif diff --git a/calendar/gui/dialogs/task-editor.c b/calendar/gui/dialogs/task-editor.c index ca6959640b..4b8f8698b9 100644 --- a/calendar/gui/dialogs/task-editor.c +++ b/calendar/gui/dialogs/task-editor.c @@ -88,7 +88,7 @@ static const gchar *ui = ""; static void task_editor_edit_comp (CompEditor *editor, ECalComponent *comp); -static gboolean task_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method); +static gboolean task_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method, gboolean strip_alarms); G_DEFINE_TYPE (TaskEditor, task_editor, TYPE_COMP_EDITOR) @@ -446,7 +446,7 @@ task_editor_edit_comp (CompEditor *editor, ECalComponent *comp) } static gboolean -task_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method) +task_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method, gboolean strip_alarms) { TaskEditorPrivate *priv; ECalComponent *comp = NULL; @@ -465,7 +465,7 @@ task_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method) client = e_meeting_store_get_e_cal (priv->model); result = itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp, - client, NULL, NULL, NULL); + client, NULL, NULL, NULL, strip_alarms); g_object_unref (comp); if (!result) @@ -474,7 +474,7 @@ task_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method) parent: if (COMP_EDITOR_CLASS (task_editor_parent_class)->send_comp) - return COMP_EDITOR_CLASS (task_editor_parent_class)->send_comp (editor, method); + return COMP_EDITOR_CLASS (task_editor_parent_class)->send_comp (editor, method, strip_alarms); return FALSE; } diff --git a/calendar/gui/e-cal-model-calendar.c b/calendar/gui/e-cal-model-calendar.c index 27c73dd12c..7f5d7b55c6 100644 --- a/calendar/gui/e-cal-model-calendar.c +++ b/calendar/gui/e-cal-model-calendar.c @@ -382,8 +382,10 @@ ecmc_set_value_at (ETableModel *etm, int col, int row, const void *value) } if (e_cal_modify_object (comp_data->client, comp_data->icalcomp, mod, NULL)) { + gboolean strip_alarms = TRUE; + if (itip_organizer_is_user (comp, comp_data->client) && - send_component_dialog (NULL, comp_data->client, comp, FALSE)) { + send_component_dialog (NULL, comp_data->client, comp, FALSE, &strip_alarms)) { ECalComponent *send_comp = NULL; if (mod == CALOBJ_MOD_ALL && e_cal_component_is_instance (comp)) { @@ -403,7 +405,7 @@ ecmc_set_value_at (ETableModel *etm, int col, int row, const void *value) } itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, send_comp ? send_comp : comp, - comp_data->client, NULL, NULL, NULL); + comp_data->client, NULL, NULL, NULL, strip_alarms); if (send_comp) g_object_unref (send_comp); diff --git a/calendar/gui/e-calendar-table.c b/calendar/gui/e-calendar-table.c index 450408d228..a534e8ed3f 100644 --- a/calendar/gui/e-calendar-table.c +++ b/calendar/gui/e-calendar-table.c @@ -1438,7 +1438,7 @@ e_calendar_table_on_forward (EPopup *ep, EPopupItem *pitem, void *data) comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp)); - itip_send_comp (E_CAL_COMPONENT_METHOD_PUBLISH, comp, comp_data->client, NULL, NULL, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_PUBLISH, comp, comp_data->client, NULL, NULL, NULL, TRUE); g_object_unref (comp); } diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c index a2d6c7f14d..e315ad5218 100644 --- a/calendar/gui/e-calendar-view.c +++ b/calendar/gui/e-calendar-view.c @@ -376,6 +376,8 @@ e_calendar_view_add_event (ECalendarView *cal_view, ECal *client, time_t dtstart /* FIXME Error handling */ uid = NULL; if (e_cal_create_object (client, e_cal_component_get_icalcomponent (comp), &uid, NULL)) { + gboolean strip_alarms = TRUE; + if (uid) { e_cal_component_set_uid (comp, uid); g_free (uid); @@ -383,9 +385,9 @@ e_calendar_view_add_event (ECalendarView *cal_view, ECal *client, time_t dtstart if ((itip_organizer_is_user (comp, client) || itip_sentby_is_user (comp)) && send_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)), - client, comp, TRUE)) { + client, comp, TRUE, &strip_alarms)) { itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, - client, NULL, NULL, NULL); + client, NULL, NULL, NULL, strip_alarms); } } else { g_message (G_STRLOC ": Could not create the object!"); @@ -685,7 +687,7 @@ e_calendar_view_cut_clipboard (ECalendarView *cal_view) && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)), event->comp_data->client, comp, TRUE)) itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp, - event->comp_data->client, NULL, NULL, NULL); + event->comp_data->client, NULL, NULL, NULL, TRUE); e_cal_component_get_uid (comp, &uid); if (e_cal_component_is_instance (comp)) { @@ -1029,7 +1031,7 @@ delete_event (ECalendarView *cal_view, ECalendarViewEvent *event) event->comp_data->client, comp, TRUE)) itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp, - event->comp_data->client, NULL, NULL, NULL); + event->comp_data->client, NULL, NULL, NULL, TRUE); e_cal_component_get_uid (comp, &uid); if (!uid || !*uid) { @@ -1178,7 +1180,7 @@ e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view) e_cal_component_free_datetime (&range.datetime); } - itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp, event->comp_data->client, NULL, NULL, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp, event->comp_data->client, NULL, NULL, NULL, TRUE); } if (is_instance) @@ -1582,7 +1584,7 @@ on_forward (EPopup *ep, EPopupItem *pitem, void *data) comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); - itip_send_comp (E_CAL_COMPONENT_METHOD_PUBLISH, comp, event->comp_data->client, NULL, NULL, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_PUBLISH, comp, event->comp_data->client, NULL, NULL, NULL, TRUE); g_list_free (selected); g_object_unref (comp); @@ -2136,8 +2138,10 @@ e_calendar_view_modify_and_send (ECalComponent *comp, gboolean new) { if (e_cal_modify_object (client, e_cal_component_get_icalcomponent (comp), mod, NULL)) { + gboolean strip_alarms = TRUE; + if ((itip_organizer_is_user (comp, client) || itip_sentby_is_user (comp)) && - send_component_dialog (toplevel, client, comp, new)) { + send_component_dialog (toplevel, client, comp, new, &strip_alarms)) { ECalComponent *send_comp = NULL; if (mod == CALOBJ_MOD_ALL && e_cal_component_is_instance (comp)) { @@ -2156,7 +2160,7 @@ e_calendar_view_modify_and_send (ECalComponent *comp, } } - itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, send_comp ? send_comp : comp, client, NULL, NULL, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, send_comp ? send_comp : comp, client, NULL, NULL, NULL, strip_alarms); if (send_comp) g_object_unref (send_comp); diff --git a/calendar/gui/e-itip-control.c b/calendar/gui/e-itip-control.c index bf8ceec3be..ff6aeb92ba 100644 --- a/calendar/gui/e-itip-control.c +++ b/calendar/gui/e-itip-control.c @@ -2097,7 +2097,7 @@ send_item (EItipControl *itip) comp = get_real_item (itip); if (comp != NULL) { - itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, priv->current_ecal, NULL, NULL, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, priv->current_ecal, NULL, NULL, NULL, TRUE); g_object_unref (comp); dialog = gtk_message_dialog_new ( NULL, 0, @@ -2152,7 +2152,7 @@ send_freebusy (EItipControl *itip) for (l = comp_list; l; l = l->next) { ECalComponent *comp = E_CAL_COMPONENT (l->data); - itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, priv->current_ecal, NULL, NULL, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, priv->current_ecal, NULL, NULL, NULL, TRUE); g_object_unref (comp); } @@ -2598,7 +2598,7 @@ ok_clicked_cb (GtkWidget *widget, gpointer data) g_slist_free (list); e_cal_component_rescan (comp); - itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, priv->current_ecal, priv->top_level, NULL, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, priv->current_ecal, priv->top_level, NULL, NULL, TRUE); g_object_unref (comp); } diff --git a/calendar/gui/e-memo-table.c b/calendar/gui/e-memo-table.c index f7a0e52606..c5f39c9ed9 100644 --- a/calendar/gui/e-memo-table.c +++ b/calendar/gui/e-memo-table.c @@ -884,7 +884,7 @@ e_memo_table_on_forward (EPopup *ep, EPopupItem *pitem, void *data) comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp)); - itip_send_comp (E_CAL_COMPONENT_METHOD_PUBLISH, comp, comp_data->client, NULL, NULL, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_PUBLISH, comp, comp_data->client, NULL, NULL, NULL, TRUE); g_object_unref (comp); } diff --git a/calendar/gui/itip-utils.c b/calendar/gui/itip-utils.c index 3de75cf3d3..58df85a9d2 100644 --- a/calendar/gui/itip-utils.c +++ b/calendar/gui/itip-utils.c @@ -1024,7 +1024,7 @@ comp_minimal (ECalComponent *comp, gboolean attendee) } static ECalComponent * -comp_compliant (ECalComponentItipMethod method, ECalComponent *comp, ECal *client, icalcomponent *zones) +comp_compliant (ECalComponentItipMethod method, ECalComponent *comp, ECal *client, icalcomponent *zones, gboolean strip_alarms) { ECalComponent *clone, *temp_clone; struct icaltimetype itt; @@ -1081,8 +1081,31 @@ comp_compliant (ECalComponentItipMethod method, ECalComponent *comp, ECal *clien e_cal_component_free_recur_list (rrule_list); } - /* We delete incoming alarms anyhow, and this helps with outlook */ - e_cal_component_remove_all_alarms (clone); + /* We delete incoming alarms if requested, even this helps with outlook */ + if (strip_alarms) { + e_cal_component_remove_all_alarms (clone); + } else { + /* Always strip procedure alarms, because of security */ + GList *uids, *l; + + uids = e_cal_component_get_alarm_uids (clone); + + for (l = uids; l; l = l->next) { + ECalComponentAlarm *alarm; + ECalComponentAlarmAction action = E_CAL_COMPONENT_ALARM_UNKNOWN; + + alarm = e_cal_component_get_alarm (clone, (const char *)l->data); + if (alarm) { + e_cal_component_alarm_get_action (alarm, &action); + e_cal_component_alarm_free (alarm); + + if (action == E_CAL_COMPONENT_ALARM_PROCEDURE) + e_cal_component_remove_alarm (clone, (const char *)l->data); + } + } + + cal_obj_uid_list_free (uids); + } /* Strip X-LIC-ERROR stuff */ e_cal_component_strip_errors (clone); @@ -1165,7 +1188,7 @@ append_cal_attachments (EMsgComposer *composer, gboolean itip_send_comp (ECalComponentItipMethod method, ECalComponent *send_comp, - ECal *client, icalcomponent *zones, GSList *attachments_list, GList *users) + ECal *client, icalcomponent *zones, GSList *attachments_list, GList *users, gboolean strip_alarms) { EMsgComposer *composer; EComposerHeaderTable *table; @@ -1198,7 +1221,7 @@ itip_send_comp (ECalComponentItipMethod method, ECalComponent *send_comp, } /* Tidy up the comp */ - comp = comp_compliant (method, send_comp, client, zones); + comp = comp_compliant (method, send_comp, client, zones, strip_alarms); if (comp == NULL) goto cleanup; @@ -1314,7 +1337,7 @@ reply_to_calendar_comp (ECalComponentItipMethod method, gboolean retval = FALSE; /* Tidy up the comp */ - comp = comp_compliant (method, send_comp, client, zones); + comp = comp_compliant (method, send_comp, client, zones, TRUE); if (comp == NULL) goto cleanup; diff --git a/calendar/gui/itip-utils.h b/calendar/gui/itip-utils.h index c41171cfe4..3c84af929f 100644 --- a/calendar/gui/itip-utils.h +++ b/calendar/gui/itip-utils.h @@ -58,7 +58,7 @@ const gchar *itip_strip_mailto (const gchar *address); char *itip_get_comp_attendee (ECalComponent *comp, ECal *client); gboolean itip_send_comp (ECalComponentItipMethod method, ECalComponent *comp, - ECal *client, icalcomponent *zones, GSList *attachments_list, GList *users); + ECal *client, icalcomponent *zones, GSList *attachments_list, GList *users, gboolean strip_alarms); gboolean itip_publish_comp (ECal *client, gchar* uri, gchar* username, gchar* password, ECalComponent **pub_comp); diff --git a/calendar/gui/tasks-control.c b/calendar/gui/tasks-control.c index 58d30ec05e..5788b010b9 100644 --- a/calendar/gui/tasks-control.c +++ b/calendar/gui/tasks-control.c @@ -531,7 +531,7 @@ tasks_control_forward_cmd (BonoboUIComponent *uic, ECalComponent *comp; comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp)); - itip_send_comp (E_CAL_COMPONENT_METHOD_PUBLISH, comp, comp_data->client, NULL, NULL, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_PUBLISH, comp, comp_data->client, NULL, NULL, NULL, TRUE); g_object_unref (comp); } } -- cgit