aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--calendar/gui/dialogs/comp-editor.c7
-rw-r--r--calendar/gui/e-calendar-view.c12
-rw-r--r--calendar/gui/e-calendar-view.h2
-rw-r--r--plugins/groupwise-features/Makefile.am2
-rw-r--r--plugins/groupwise-features/org-gnome-groupwise-features.eplug.xml5
-rw-r--r--plugins/groupwise-features/org-gnome-shared-folder.error.xml18
-rw-r--r--plugins/groupwise-features/process-meeting.c264
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 &quot;{0}&quot;
</_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);
+ }
+ }
+}