diff options
-rw-r--r-- | calendar/gui/dialogs/comp-editor.c | 7 | ||||
-rw-r--r-- | calendar/gui/e-calendar-view.c | 12 | ||||
-rw-r--r-- | calendar/gui/e-calendar-view.h | 2 | ||||
-rw-r--r-- | plugins/groupwise-features/Makefile.am | 2 | ||||
-rw-r--r-- | plugins/groupwise-features/org-gnome-groupwise-features.eplug.xml | 5 | ||||
-rw-r--r-- | plugins/groupwise-features/org-gnome-shared-folder.error.xml | 18 | ||||
-rw-r--r-- | plugins/groupwise-features/process-meeting.c | 264 |
7 files changed, 281 insertions, 29 deletions
diff --git a/calendar/gui/dialogs/comp-editor.c b/calendar/gui/dialogs/comp-editor.c index 2a1513327e..545fca4448 100644 --- a/calendar/gui/dialogs/comp-editor.c +++ b/calendar/gui/dialogs/comp-editor.c @@ -1848,7 +1848,7 @@ comp_editor_set_summary (CompEditor *editor, !editor->priv->warned && !(editor->priv->flags & COMP_EDITOR_DELEGATE) && editor->priv->existing_org && - !editor->priv->user_org; + !editor->priv->user_org && !(editor->priv->flags & COMP_EDITOR_NEW_ITEM); if (show_warning) { e_notice ( @@ -1896,7 +1896,8 @@ comp_editor_set_changed (CompEditor *editor, show_warning = changed && !editor->priv->warned && !(editor->priv->flags & COMP_EDITOR_DELEGATE) && - editor->priv->existing_org && !editor->priv->user_org; + editor->priv->existing_org && !editor->priv->user_org + && !(editor->priv->flags & COMP_EDITOR_NEW_ITEM); if (show_warning) { e_notice ( @@ -2701,7 +2702,7 @@ page_dates_changed_cb (CompEditor *editor, if (page != (CompEditorPage *) l->data) comp_editor_page_set_dates (l->data, dates); - if (!priv->warned && priv->existing_org && !priv->user_org) { + if (!priv->warned && priv->existing_org && !priv->user_org && !(editor->priv->flags & COMP_EDITOR_NEW_ITEM)) { e_notice (priv->notebook, GTK_MESSAGE_INFO, _("Changes made to this item may be discarded if an update arrives")); priv->warned = TRUE; diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c index a99149ae2e..ffb08bbee0 100644 --- a/calendar/gui/e-calendar-view.c +++ b/calendar/gui/e-calendar-view.c @@ -78,7 +78,6 @@ struct _ECalendarViewPrivate { static void e_calendar_view_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec); static void e_calendar_view_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec); static void e_calendar_view_destroy (GtkObject *object); -static void open_event_with_flags (ECalendarView *cal_view, ECal *client, icalcomponent *icalcomp, guint32 flags); extern ECompEditorRegistry *comp_editor_registry; @@ -1602,7 +1601,7 @@ on_delegate (EPopup *ep, EPopupItem *pitem, void *data) flags |= COMP_EDITOR_MEETING | COMP_EDITOR_DELEGATE; - open_event_with_flags (cal_view, event->comp_data->client, clone, flags); + e_calendar_view_open_event_with_flags (cal_view, event->comp_data->client, clone, flags); icalcomponent_free (clone); g_list_free (selected); @@ -2013,7 +2012,7 @@ e_calendar_view_new_appointment_for (ECalendarView *cal_view, flags |= COMP_EDITOR_USER_ORG; } - open_event_with_flags (cal_view, default_client, + e_calendar_view_open_event_with_flags (cal_view, default_client, icalcomp, flags); g_object_unref (comp); @@ -2102,8 +2101,8 @@ object_created_cb (CompEditor *ce, ECalendarView *cal_view) gnome_calendar_emit_user_created_signal (cal_view, e_calendar_view_get_calendar (cal_view), comp_editor_get_client (ce)); } -static void -open_event_with_flags (ECalendarView *cal_view, ECal *client, icalcomponent *icalcomp, guint32 flags) +CompEditor * +e_calendar_view_open_event_with_flags (ECalendarView *cal_view, ECal *client, icalcomponent *icalcomp, guint32 flags) { CompEditor *ce; const char *uid; @@ -2131,6 +2130,7 @@ open_event_with_flags (ECalendarView *cal_view, ECal *client, icalcomponent *ica gtk_window_present (GTK_WINDOW (ce)); + return ce; } /** @@ -2165,7 +2165,7 @@ e_calendar_view_edit_appointment (ECalendarView *cal_view, } - open_event_with_flags (cal_view, client, icalcomp, flags); + e_calendar_view_open_event_with_flags (cal_view, client, icalcomp, flags); } void diff --git a/calendar/gui/e-calendar-view.h b/calendar/gui/e-calendar-view.h index 1f18e67241..eedef31856 100644 --- a/calendar/gui/e-calendar-view.h +++ b/calendar/gui/e-calendar-view.h @@ -28,6 +28,7 @@ #include "e-cal-model.h" #include "gnome-cal.h" #include "e-activity-handler.h" +#include "dialogs/comp-editor.h" G_BEGIN_DECLS @@ -144,6 +145,7 @@ void e_calendar_view_paste_clipboard (ECalendarView *cal_view); void e_calendar_view_delete_selected_event (ECalendarView *cal_view); void e_calendar_view_delete_selected_events (ECalendarView *cal_view); void e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view); +CompEditor* e_calendar_view_open_event_with_flags (ECalendarView *cal_view, ECal *client, icalcomponent *icalcomp, guint32 flags); GtkMenu *e_calendar_view_create_popup_menu (ECalendarView *cal_view); diff --git a/plugins/groupwise-features/Makefile.am b/plugins/groupwise-features/Makefile.am index 3b0a83021d..5746b72a40 100644 --- a/plugins/groupwise-features/Makefile.am +++ b/plugins/groupwise-features/Makefile.am @@ -64,6 +64,7 @@ glade_DATA = \ error_DATA = \ org-gnome-shared-folder.error \ + org-gnome-process-meeting.error \ org-gnome-proxy.error \ org-gnome-proxy-login.error \ org-gnome-mail-retract.error @@ -77,6 +78,7 @@ EXTRA_DIST = \ org-gnome-compose-send-options.xml \ org-gnome-groupwise-features.eplug.xml \ org-gnome-shared-folder.error.xml \ + org-gnome-process-meeting.error.xml \ org-gnome-proxy.error.xml \ org-gnome-proxy-login.error.xml \ org-gnome-mail-retract.error.xml diff --git a/plugins/groupwise-features/org-gnome-groupwise-features.eplug.xml b/plugins/groupwise-features/org-gnome-groupwise-features.eplug.xml index 7a707fdcc9..226872b6a8 100644 --- a/plugins/groupwise-features/org-gnome-groupwise-features.eplug.xml +++ b/plugins/groupwise-features/org-gnome-groupwise-features.eplug.xml @@ -92,6 +92,11 @@ </menu> </hook> + <hook class="org.gnome.evolution.calendar.popup:1.0"> + <menu id="org.gnome.evolution.calendar.view.popup" target="select" factory = "org_gnome_retract_resend"> + </menu> + </hook> + <hook class="org.gnome.evolution.mail.popup:1.0"> <menu id="org.gnome.evolution.mail.folderview.popup" target="select" factory = "org_gnome_retract_message"> diff --git a/plugins/groupwise-features/org-gnome-shared-folder.error.xml b/plugins/groupwise-features/org-gnome-shared-folder.error.xml index ca63ad80aa..8ef056728b 100644 --- a/plugins/groupwise-features/org-gnome-shared-folder.error.xml +++ b/plugins/groupwise-features/org-gnome-shared-folder.error.xml @@ -15,23 +15,5 @@ You cannot share this folder with the specified user "{0}" </_secondary> </error> -<error id="recurrence-accept" type="question" default="GTK_RESPONSE_YES"> -<_primary>This is a recurring meeting</_primary> -<!--Translators: "it" is a "recurring meeting" (string refers to "This is a recurring meeting") --> -<_secondary>Would you like to accept it?</_secondary> - <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/> - <button label="This instance" response="GTK_RESPONSE_NO"/> - <button label="All instances" response="GTK_RESPONSE_YES"/> -</error> - -<error id="recurrence-decline" type="question" default="GTK_RESPONSE_YES"> -<_primary>This is a recurring meeting</_primary> -<!--Translators: "it" is a "recurring meeting" (string refers to "This is a recurring meeting") --> -<_secondary>Would you like to decline it?</_secondary> - <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/> - <button label="This instance" response="GTK_RESPONSE_NO"/> - <button label="All instances" response="GTK_RESPONSE_YES"/> -</error> - </error-list> diff --git a/plugins/groupwise-features/process-meeting.c b/plugins/groupwise-features/process-meeting.c index 412502f0b3..bc046c0a05 100644 --- a/plugins/groupwise-features/process-meeting.c +++ b/plugins/groupwise-features/process-meeting.c @@ -43,9 +43,11 @@ typedef struct { ECalendarView *c_view; void org_gnome_accept(EPlugin *ep, ECalPopupTargetSelect *target); +void org_gnome_retract_resend (EPlugin *ep, ECalPopupTargetSelect *target); static void on_accept_meeting (EPopup *ep, EPopupItem *pitem, void *data); static void on_accept_meeting_tentative (EPopup *ep, EPopupItem *pitem, void *data); static void on_decline_meeting (EPopup *ep, EPopupItem *pitem, void *data); +static void on_resend_meeting (EPopup *ep, EPopupItem *pitem, void *data); static EPopupItem popup_items[] = { { E_POPUP_ITEM, "41.accept", N_("Accept"), on_accept_meeting, NULL, GTK_STOCK_APPLY, 0, E_CAL_POPUP_SELECT_NOTEDITING | E_CAL_POPUP_SELECT_MEETING | E_CAL_POPUP_SELECT_ACCEPTABLE}, @@ -227,9 +229,9 @@ process_meeting (ECalendarView *cal_view, icalparameter_partstat status) const char *msg; if (status == ICAL_PARTSTAT_ACCEPTED || status == ICAL_PARTSTAT_TENTATIVE) - msg = "org.gnome.evolution.mail_shared_folder:recurrence-accept"; + msg = "org.gnome.evolution.process_meeting:recurrence-accept"; else - msg = "org.gnome.evolution.mail_shared_folder:recurrence-decline"; + msg = "org.gnome.evolution.process_meeting:recurrence-decline"; response = e_error_run (NULL, msg, NULL); if (response == GTK_RESPONSE_YES) { @@ -282,3 +284,261 @@ on_decline_meeting (EPopup *ep, EPopupItem *pitem, void *data) process_meeting (cal_view, ICAL_PARTSTAT_DECLINED); } + +static gboolean +is_meeting_owner (ECalComponent *comp, ECal *client) +{ + ECalComponentOrganizer org; + char *email = NULL; + const char *strip = NULL; + gboolean ret_val = FALSE; + + if (!(e_cal_component_has_attendees (comp) && + e_cal_get_save_schedules (client))) + return ret_val; + + e_cal_component_get_organizer (comp, &org); + strip = itip_strip_mailto (org.value); + + if (e_cal_get_cal_address (client, &email, NULL) && !g_ascii_strcasecmp (email, strip)) { + ret_val = TRUE; + } + + if (!ret_val) + ret_val = e_account_list_find(itip_addresses_get(), E_ACCOUNT_FIND_ID_ADDRESS, strip) != NULL; + + g_free (email); + return ret_val; +} + + +typedef struct { + ECal *client; + ECalComponent *comp; + CalObjModType mod; +} ThreadData; + +static EPopupItem retract_popup_items[] = { +{ E_POPUP_ITEM, "49.resend", N_("Rese_nd Meeting..."), on_resend_meeting, NULL, GTK_STOCK_EDIT, 0, E_CAL_POPUP_SELECT_NOTEDITING | E_CAL_POPUP_SELECT_MEETING} +}; + +void +org_gnome_retract_resend (EPlugin *ep, ECalPopupTargetSelect *target) +{ + GSList *menus = NULL; + GList *selected; + int i = 0; + static int first = 0; + const char *uri = NULL; + ECalendarView *cal_view = E_CALENDAR_VIEW (target->target.widget); + ECalComponent *comp = NULL; + ECalendarViewEvent *event = NULL; + + c_view = cal_view; + selected = e_calendar_view_get_selected_events (cal_view); + if (selected) { + event = (ECalendarViewEvent *) selected->data; + + uri = e_cal_get_uri (event->comp_data->client); + } else + return; + + if (!uri) + return; + + if (! g_strrstr (uri, "groupwise://")) + return ; + + comp = e_cal_component_new (); + e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); + + if (!is_meeting_owner (comp, event->comp_data->client)) { + g_object_unref (comp); + return; + } + + /* for translation*/ + if (!first) { + retract_popup_items[0].label = _(retract_popup_items[0].label); + } + + first++; + + for (i = 0; i < sizeof (retract_popup_items) / sizeof (retract_popup_items[0]); i++) + menus = g_slist_prepend (menus, &retract_popup_items[i]); + + e_popup_add_items (target->target.popup, menus, NULL, popup_free, NULL); + + g_object_unref (comp); +} + +static void +add_retract_data (ECalComponent *comp, const char *retract_comment, CalObjModType mod) +{ + icalcomponent *icalcomp = NULL; + icalproperty *icalprop = NULL; + + icalcomp = e_cal_component_get_icalcomponent (comp); + if (retract_comment && *retract_comment) + icalprop = icalproperty_new_x (retract_comment); + else + icalprop = icalproperty_new_x ("0"); + icalproperty_set_x_name (icalprop, "X-EVOLUTION-RETRACT-COMMENT"); + icalcomponent_add_property (icalcomp, icalprop); + + if (mod == CALOBJ_MOD_ALL) + icalprop = icalproperty_new_x ("All"); + else + icalprop = icalproperty_new_x ("This"); + icalproperty_set_x_name (icalprop, "X-EVOLUTION-RECUR-MOD"); + icalcomponent_add_property (icalcomp, icalprop); +} + +static void +free_thread_data (ThreadData *data) +{ + if (data == NULL) + return; + + if (data->client) + g_object_unref (data->client); + + if (data->comp) + g_object_unref (data->comp); + + g_free (data); +} + +static gpointer +retract_object (gpointer val) +{ + ThreadData *data = val; + icalcomponent *icalcomp = NULL, *mod_comp = NULL; + GList *users = NULL; + char *rid = NULL; + const char *uid; + GError *error = NULL; + + add_retract_data (data->comp, NULL, data->mod); + + icalcomp = e_cal_component_get_icalcomponent (data->comp); + icalcomponent_set_method (icalcomp, ICAL_METHOD_CANCEL); + + if (!e_cal_send_objects (data->client, icalcomp, &users, + &mod_comp, &error)) { + /* FIXME report error */ + g_warning ("Unable to retract the meeting \n"); + g_clear_error (&error); + return GINT_TO_POINTER (1); + } + + if (mod_comp) + icalcomponent_free (mod_comp); + + if (users) { + g_list_foreach (users, (GFunc) g_free, NULL); + g_list_free (users); + } + + rid = e_cal_component_get_recurid_as_string (data->comp); + e_cal_component_get_uid (data->comp, &uid); + + if (!e_cal_remove_object_with_mod (data->client, uid, + rid, data->mod, &error)) { + g_warning ("Unable to remove the item \n"); + g_clear_error (&error); + return GINT_TO_POINTER (1); + } + g_free (rid); + + free_thread_data (data) ; + return GINT_TO_POINTER (0); +} + +static void +object_created_cb (CompEditor *ce, gpointer data) +{ + GThread *thread = NULL; + int response; + GError *error = NULL; + + gtk_widget_hide (GTK_WIDGET (ce)); + + response = e_error_run (NULL, "org.gnome.evolution.process_meeting:resend-retract", NULL); + if (response == GTK_RESPONSE_NO) { + free_thread_data (data) ; + return; + } + + thread = g_thread_create ((GThreadFunc) retract_object, data , FALSE, &error); + if (!thread) { + g_warning (G_STRLOC ": %s", error->message); + g_error_free (error); + } +} + +static void +on_resend_meeting (EPopup *ep, EPopupItem *pitem, void *data) +{ + ECalendarView *cal_view = c_view; + GList *selected; + + selected = e_calendar_view_get_selected_events (cal_view); + if (selected) { + ECalendarViewEvent *event = (ECalendarViewEvent *) selected->data; + ECalComponent *comp = e_cal_component_new (); + ECalComponent *new_comp = NULL; + gboolean recurring = FALSE; + CalObjModType mod = CALOBJ_MOD_THIS; + ThreadData *data = NULL; + gint response; + const char *msg; + /* inserting the boolean to share the code between resend and retract */ + gboolean resend = TRUE; + + e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); + if (e_cal_component_has_recurrences (comp) || e_cal_component_is_instance (comp)) + recurring = TRUE; + + if (recurring == TRUE) + msg = "org.gnome.evolution.process_meeting:resend-recurrence"; + else + msg = "org.gnome.evolution.process_meeting:resend"; + + response = e_error_run (NULL, msg, NULL); + if (response == GTK_RESPONSE_YES) { + mod = CALOBJ_MOD_ALL; + } else if (response == GTK_RESPONSE_CANCEL) { + g_object_unref (comp); + return; + } + + data = g_new0 (ThreadData, 1); + data->client = g_object_ref (event->comp_data->client); + data->comp = comp; + data->mod = mod; + + if (resend) + { + guint flags = 0; + char *new_uid = NULL; + CompEditor *ce; + icalcomponent *icalcomp; + + flags |= COMP_EDITOR_NEW_ITEM; + flags |= COMP_EDITOR_MEETING; + flags |= COMP_EDITOR_USER_ORG; + + new_comp = e_cal_component_clone (comp); + new_uid = e_cal_component_gen_uid (); + e_cal_component_set_recurid (new_comp, NULL); + e_cal_component_set_uid (new_comp, new_uid); + icalcomp = icalcomponent_new_clone (e_cal_component_get_icalcomponent (new_comp)); + ce = e_calendar_view_open_event_with_flags (cal_view, data->client, icalcomp, flags); + + g_signal_connect (ce, "object_created", G_CALLBACK (object_created_cb), data); + g_object_unref (new_comp); + g_free (new_uid); + } + } +} |