diff options
author | Matthew Barnes <mbarnes@src.gnome.org> | 2009-01-21 10:52:05 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@src.gnome.org> | 2009-01-21 10:52:05 +0800 |
commit | ab00f5b08adb1d74a0c70d935a32ffd982e86f34 (patch) | |
tree | 45bfaa44682bc3eee5a2ad8a64112b248767af5b /plugins/itip-formatter/itip-formatter.c | |
parent | 5a1c48696363e3f3c7ffe11bdffdcad6557f811a (diff) | |
download | gsoc2013-evolution-ab00f5b08adb1d74a0c70d935a32ffd982e86f34.tar gsoc2013-evolution-ab00f5b08adb1d74a0c70d935a32ffd982e86f34.tar.gz gsoc2013-evolution-ab00f5b08adb1d74a0c70d935a32ffd982e86f34.tar.bz2 gsoc2013-evolution-ab00f5b08adb1d74a0c70d935a32ffd982e86f34.tar.lz gsoc2013-evolution-ab00f5b08adb1d74a0c70d935a32ffd982e86f34.tar.xz gsoc2013-evolution-ab00f5b08adb1d74a0c70d935a32ffd982e86f34.tar.zst gsoc2013-evolution-ab00f5b08adb1d74a0c70d935a32ffd982e86f34.zip |
Merge revisions 37075:37107 from trunk.
svn path=/branches/kill-bonobo/; revision=37112
Diffstat (limited to 'plugins/itip-formatter/itip-formatter.c')
-rw-r--r-- | plugins/itip-formatter/itip-formatter.c | 84 |
1 files changed, 75 insertions, 9 deletions
diff --git a/plugins/itip-formatter/itip-formatter.c b/plugins/itip-formatter/itip-formatter.c index 61d2234bd8..83ea0036fb 100644 --- a/plugins/itip-formatter/itip-formatter.c +++ b/plugins/itip-formatter/itip-formatter.c @@ -630,6 +630,16 @@ find_cal_opened_cb (ECal *ecal, ECalendarStatus status, gpointer data) if (!pitip->current_ecal && e_cal_get_object (ecal, fd->uid, fd->rid, &icalcomp, NULL)) { + if ((pitip->method == ICAL_METHOD_PUBLISH || pitip->method == ICAL_METHOD_REQUEST) && + (icalcomponent_get_first_component (icalcomp, ICAL_VALARM_COMPONENT) || + icalcomponent_get_first_component (icalcomp, ICAL_XAUDIOALARM_COMPONENT) || + icalcomponent_get_first_component (icalcomp, ICAL_XDISPLAYALARM_COMPONENT) || + icalcomponent_get_first_component (icalcomp, ICAL_XPROCEDUREALARM_COMPONENT) || + icalcomponent_get_first_component (icalcomp, ICAL_XEMAILALARM_COMPONENT))) + itip_view_set_show_keep_alarm_check (ITIP_VIEW (pitip->view), TRUE); + else + itip_view_set_show_keep_alarm_check (ITIP_VIEW (pitip->view), FALSE); + icalcomponent_free (icalcomp); pitip->current_ecal = ecal; @@ -652,7 +662,8 @@ find_cal_opened_cb (ECal *ecal, ECalendarStatus status, gpointer data) _("Found the appointment in the calendar '%s'"), e_source_peek_name (source)); set_buttons_sensitive (pitip); - } + } else if (!pitip->current_ecal) + itip_view_set_show_keep_alarm_check (ITIP_VIEW (pitip->view), FALSE); if (pitip->current_ecal) { if (e_cal_get_static_capability (pitip->current_ecal, CAL_STATIC_CAPABILITY_RECURRENCES_NO_MASTER)) { @@ -991,6 +1002,19 @@ update_item (struct _itip_puri *pitip, ItipViewResponse response) icalcomponent_add_component (pitip->top_level, clone); icalcomponent_set_method (pitip->top_level, pitip->method); + if (!itip_view_get_inherit_alarm_check_state (ITIP_VIEW (pitip->view))) { + icalcomponent *alarm_comp; + icalcompiter alarm_iter; + + alarm_iter = icalcomponent_begin_component (clone, ICAL_VALARM_COMPONENT); + while ((alarm_comp = icalcompiter_deref (&alarm_iter)) != NULL) { + icalcompiter_next (&alarm_iter); + + icalcomponent_remove_component (clone, alarm_comp); + icalcomponent_free (alarm_comp); + } + } + clone_comp = e_cal_component_new (); if (!e_cal_component_set_icalcomponent (clone_comp, clone)) { itip_view_add_lower_info_item (ITIP_VIEW (pitip->view), ITIP_VIEW_INFO_ITEM_TYPE_ERROR, _("Unable to parse item")); @@ -999,6 +1023,35 @@ update_item (struct _itip_puri *pitip, ItipViewResponse response) } source = e_cal_get_source (pitip->current_ecal); + if (itip_view_get_keep_alarm_check_state (ITIP_VIEW (pitip->view))) { + ECalComponent *real_comp; + GList *alarms, *l; + ECalComponentAlarm *alarm; + + real_comp = get_real_item (pitip); + if (real_comp != NULL) { + alarms = e_cal_component_get_alarm_uids (real_comp); + + for (l = alarms; l; l = l->next) { + alarm = e_cal_component_get_alarm (real_comp, (const char *)l->data); + + if (alarm) { + ECalComponentAlarm *aclone = e_cal_component_alarm_clone (alarm); + + if (aclone) { + e_cal_component_add_alarm (clone_comp, aclone); + e_cal_component_alarm_free (aclone); + } + + e_cal_component_alarm_free (alarm); + } + } + + cal_obj_uid_list_free (alarms); + g_object_unref (real_comp); + } + } + if ((response != ITIP_VIEW_RESPONSE_CANCEL) && (response != ITIP_VIEW_RESPONSE_DECLINE)){ GSList *attachments = NULL, *new_attachments = NULL, *l; @@ -1160,7 +1213,7 @@ send_comp_to_attendee (ECalComponentItipMethod method, ECalComponent *comp, cons } /* FIXME send the attachments in the request */ - status = itip_send_comp (method, send_comp, client, NULL, NULL, NULL); + status = itip_send_comp (method, send_comp, client, NULL, NULL, NULL, TRUE); g_object_unref (send_comp); @@ -1310,7 +1363,7 @@ update_attendee_status (struct _itip_puri *pitip) if (itip_view_get_update (ITIP_VIEW (pitip->view))) { e_cal_component_commit_sequence (comp); - itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, pitip->current_ecal, NULL, NULL, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, pitip->current_ecal, NULL, NULL, NULL, TRUE); } if (!e_cal_modify_object (pitip->current_ecal, icalcomp, rid ? CALOBJ_MOD_THIS : CALOBJ_MOD_ALL, &error)) { @@ -1340,7 +1393,7 @@ send_item (struct _itip_puri *pitip) comp = get_real_item (pitip); if (comp != NULL) { - itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, pitip->current_ecal, NULL, NULL, NULL); + itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, pitip->current_ecal, NULL, NULL, NULL, TRUE); g_object_unref (comp); switch (pitip->type) { @@ -1421,7 +1474,7 @@ set_itip_error (struct _itip_puri *pitip, GtkContainer *container, const char *p } static gboolean -extract_itip_data (struct _itip_puri *pitip, GtkContainer *container) +extract_itip_data (struct _itip_puri *pitip, GtkContainer *container, gboolean *have_alarms) { icalproperty *prop; icalcomponent_kind kind = ICAL_NO_COMPONENT; @@ -1581,14 +1634,24 @@ extract_itip_data (struct _itip_puri *pitip, GtkContainer *container) prop = icalcomponent_get_next_property (pitip->ical_comp, ICAL_X_PROPERTY); } - /* Strip out alarms for security purposes */ + /* Strip out procedural alarms for security purposes */ alarm_iter = icalcomponent_begin_component (pitip->ical_comp, ICAL_VALARM_COMPONENT); while ((alarm_comp = icalcompiter_deref (&alarm_iter)) != NULL) { + icalproperty *p; + icalcompiter_next (&alarm_iter); - icalcomponent_remove_component (pitip->ical_comp, alarm_comp); + p = icalcomponent_get_first_property (alarm_comp, ICAL_ACTION_PROPERTY); + if (icalproperty_get_action (p) == ICAL_ACTION_PROCEDURE) + icalcomponent_remove_component (pitip->ical_comp, alarm_comp); + icalcomponent_free (alarm_comp); } + + if (have_alarms) { + alarm_iter = icalcomponent_begin_component (pitip->ical_comp, ICAL_VALARM_COMPONENT); + *have_alarms = icalcompiter_deref (&alarm_iter) != NULL; + } } pitip->comp = e_cal_component_new (); @@ -1911,7 +1974,7 @@ view_response_cb (GtkWidget *widget, ItipViewResponse response, gpointer data) } e_cal_component_rescan (comp); - if (itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, pitip->current_ecal, pitip->top_level, NULL, NULL)) { + if (itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, pitip->current_ecal, pitip->top_level, NULL, NULL, TRUE)) { camel_folder_set_message_flags (pitip->folder, pitip->uid, CAMEL_MESSAGE_ANSWERED, CAMEL_MESSAGE_ANSWERED); } @@ -1974,6 +2037,7 @@ format_itip_object (EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObject const char *string, *org; int i; gboolean response_enabled; + gboolean have_alarms = FALSE; info = (struct _itip_puri *) em_format_find_puri((EMFormat *)efh, pobject->classid); @@ -1991,7 +2055,7 @@ format_itip_object (EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObject } /* FIXME Handle multiple VEVENTS with the same UID, ie detached instances */ - if (!extract_itip_data (info, GTK_CONTAINER (eb))) + if (!extract_itip_data (info, GTK_CONTAINER (eb), &have_alarms)) return TRUE; info->view = itip_view_new (); @@ -2003,6 +2067,8 @@ format_itip_object (EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObject if (!response_enabled) { itip_view_set_mode (ITIP_VIEW (info->view), ITIP_VIEW_MODE_HIDE_ALL); } else { + itip_view_set_show_inherit_alarm_check (ITIP_VIEW (info->view), have_alarms && (info->method == ICAL_METHOD_PUBLISH || info->method == ICAL_METHOD_REQUEST)); + switch (info->method) { case ICAL_METHOD_PUBLISH: case ICAL_METHOD_REQUEST: |