[evolution] Adds the resend feature to GroupWise features.



commit 3b946037007857c3d2be0c39db0782f9dbaef461
Author: Chenthill Palanisamy <pchenthill novell com>
Date:   Thu May 21 14:10:36 2009 +0530

    Adds the resend feature to GroupWise features.
---
 calendar/gui/dialogs/comp-editor.c                 |    7 +-
 calendar/gui/e-calendar-view.c                     |   12 +-
 calendar/gui/e-calendar-view.h                     |    2 +
 plugins/groupwise-features/Makefile.am             |    2 +
 .../org-gnome-groupwise-features.eplug.xml         |    5 +
 .../org-gnome-shared-folder.error.xml              |   18 --
 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 2a15133..545fca4 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 a99149a..ffb08bb 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 1f18e67..eedef31 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 3b0a830..5746b72 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 7a707fd..226872b 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 ca63ad8..8ef0567 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 412502f..bc046c0 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);
+		}
+	}
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]