File bnc-158107-no-notification-canceled-mtgs.patch of Package evolution-data-server

Index: calendar/backends/groupwise/e-cal-backend-groupwise.c
===================================================================
RCS file: /cvs/gnome/evolution-data-server/calendar/backends/groupwise/e-cal-backend-groupwise.c,v
retrieving revision 1.173
diff -u -p -r1.173 e-cal-backend-groupwise.c
--- calendar/backends/groupwise/e-cal-backend-groupwise.c	23 Jan 2006 11:09:58 -0000	1.173
+++ calendar/backends/groupwise/e-cal-backend-groupwise.c	24 Mar 2006 14:42:22 -0000
@@ -79,6 +79,8 @@ static void e_cal_backend_groupwise_fina
 static void sanitize_component (ECalBackendSync *backend, ECalComponent *comp, char *server_uid);
 static ECalBackendSyncStatus
 e_cal_backend_groupwise_add_timezone (ECalBackendSync *backend, EDataCal *cal, const char *tzobj);
+static const char * get_gw_item_id (icalcomponent *icalcomp);
+static void get_retract_data (ECalComponent *comp, const char **retract_comment, gboolean *all_instances);
 
 #define PARENT_TYPE E_TYPE_CAL_BACKEND_SYNC
 static ECalBackendClass *parent_class = NULL;
@@ -219,6 +221,7 @@ populate_cache (ECalBackendGroupwise *cb
 
 	return E_GW_CONNECTION_STATUS_OK;
 }
+
 static gboolean
 compare_prefix (gconstpointer a, gconstpointer b)
 {
@@ -467,7 +470,6 @@ get_deltas (gpointer handle)
 			needs_to_get = TRUE;
 		} else  {
 			cache_keys = g_slist_delete_link (cache_keys, remove);
-			g_message ("******** found \n");
 		}
 	
 		g_free (real_key);
@@ -476,7 +478,6 @@ get_deltas (gpointer handle)
 	for (l = cache_keys; l ; l = g_slist_next (l)) {
 		/* assumes rid is null - which works for now */
 		ECalComponent *comp = NULL;
-		GSList *comp_list = NULL;
 		ECalComponentVType vtype;
 
 		comp = e_cal_backend_cache_get_component (cache, (const char *) l->data, NULL);	
@@ -1632,10 +1633,9 @@ e_cal_backend_groupwise_internal_get_tim
 	icaltimezone *zone;
 
 	zone = icaltimezone_get_builtin_timezone_from_tzid (tzid);
-
 	if (!zone)
 		return icaltimezone_get_utc_timezone();
-
+		
 	return zone;
 }
 
@@ -1791,6 +1791,44 @@ e_cal_backend_groupwise_create_object (E
 	return GNOME_Evolution_Calendar_Success;
 }
 
+static void 
+get_retract_data (ECalComponent *comp, const char **retract_comment, gboolean *all_instances)
+{
+	icalcomponent *icalcomp = NULL;
+	icalproperty *icalprop = NULL;
+	gboolean is_instance = FALSE;
+	const char *x_ret = NULL, *x_recur = NULL;
+
+	is_instance = e_cal_component_is_instance (comp);
+	icalcomp = e_cal_component_get_icalcomponent (comp);
+	icalprop = icalcomponent_get_first_property (icalcomp, ICAL_X_PROPERTY);
+	while (icalprop) {
+		const char *x_name;
+
+		x_name = icalproperty_get_x_name (icalprop);
+		/* This property will be set only if the user is an organizer */
+		if (!strcmp (x_name, "X-EVOLUTION-RETRACT-COMMENT")) {
+			x_ret = icalproperty_get_x (icalprop);
+			if (!strcmp (x_ret, "0")) {
+				*retract_comment = NULL;
+			} else
+				*retract_comment = x_ret;
+		}
+
+		if (is_instance && !strcmp (x_name, "X-EVOLUTION-RECUR-MOD")) {
+			x_recur = icalproperty_get_x (icalprop);
+			if (!strcmp (x_recur, "All"))
+				*all_instances = TRUE;
+			else
+				*all_instances = FALSE;
+		}
+
+		if (x_ret && (!is_instance || x_recur))
+			break;
+		icalprop = icalcomponent_get_next_property (icalcomp, ICAL_X_PROPERTY);
+	}
+}
+
 static ECalBackendSyncStatus
 e_cal_backend_groupwise_modify_object (ECalBackendSync *backend, EDataCal *cal, const char *calobj, 
 				       CalObjModType mod, char **old_object, char **new_object)
@@ -1838,7 +1876,7 @@ e_cal_backend_groupwise_modify_object (E
 		if (e_cal_component_has_attendees (comp) && 
 				e_cal_backend_groupwise_utils_check_delegate (comp, e_gw_connection_get_user_email (priv->cnc))) {
 			const char *id = NULL, *recur_key = NULL;
-			
+
 			item = e_gw_item_new_for_delegate_from_cal (cbgw, comp);
 
 			if (mod == CALOBJ_MOD_ALL && e_cal_component_is_instance (comp)) {
@@ -1848,21 +1886,19 @@ e_cal_backend_groupwise_modify_object (E
 			}
 
 			status = e_gw_connection_delegate_request (priv->cnc, item, id, NULL, NULL, recur_key); 
-		
+
 			if (status == E_GW_CONNECTION_STATUS_INVALID_CONNECTION)
-					status = e_gw_connection_delegate_request (priv->cnc, item, id, NULL, NULL, recur_key);
-				
-				if (status != E_GW_CONNECTION_STATUS_OK) {
-					g_object_unref (comp);
-					g_object_unref (cache_comp);
-					return GNOME_Evolution_Calendar_OtherError;
-				}
-			
-			
+				status = e_gw_connection_delegate_request (priv->cnc, item, id, NULL, NULL, recur_key);
+			if (status != E_GW_CONNECTION_STATUS_OK) {
+				g_object_unref (comp);
+				g_object_unref (cache_comp);
+				return GNOME_Evolution_Calendar_OtherError;
+			}
+
 			e_cal_backend_cache_put_component (priv->cache, comp);
 			*new_object = e_cal_component_get_as_string (comp);
 			break;
-		}
+		} 
 
 		item = e_gw_item_new_from_cal_component (priv->container_id, cbgw, comp);
 		cache_item =  e_gw_item_new_from_cal_component (priv->container_id, cbgw, cache_comp);
@@ -2359,40 +2395,91 @@ e_cal_backend_groupwise_receive_objects 
 static ECalBackendSyncStatus
 send_object (ECalBackendGroupwise *cbgw, EDataCal *cal, icalcomponent *icalcomp, icalproperty_method method)
 {
-	ECalComponent *comp, *found_comp;
+	ECalComponent *comp, *found_comp = NULL;
 	ECalBackendGroupwisePrivate *priv;
-	ECalBackendSyncStatus status = GNOME_Evolution_Calendar_Success;
-	char *uid, *comp_str;
+	ECalBackendSyncStatus status = GNOME_Evolution_Calendar_OtherError;
+	const char *uid = NULL, *rid = NULL;
 
 	priv = cbgw->priv;
 
 	comp = e_cal_component_new ();
 	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (icalcomp));
+	rid = e_cal_component_get_recurid_as_string (comp);
 
 	e_cal_component_get_uid (comp, (const char **) &uid);
-	found_comp = e_cal_backend_cache_get_component (priv->cache, uid, NULL);
+	found_comp = e_cal_backend_cache_get_component (priv->cache, uid, rid);
+
+	if (!found_comp) {
+		g_object_unref (comp);
+		return GNOME_Evolution_Calendar_ObjectNotFound;
+	}
+		
 
 	switch (priv->mode) {
 	case CAL_MODE_ANY :
 	case CAL_MODE_REMOTE :
-		if (found_comp) {
-			char *comp_str;
-			status = e_cal_backend_groupwise_modify_object (E_CAL_BACKEND_SYNC (cbgw), cal, comp_str,
-									CALOBJ_MOD_THIS, &comp_str, NULL);
-			g_free (comp_str);
-		} else
-			status = e_cal_backend_groupwise_create_object (E_CAL_BACKEND_SYNC (cbgw), cal, &comp_str, NULL);
+		if (method == ICAL_METHOD_CANCEL) {
+			const char *retract_comment = NULL;	
+			gboolean all_instances = FALSE;
+			const char *id = NULL;
+
+			get_retract_data (comp, &retract_comment, &all_instances);
+			id = get_gw_item_id (icalcomp);
+			status = e_gw_connection_retract_request (priv->cnc, id, retract_comment,
+					all_instances, FALSE);
+
+			if (status == E_GW_CONNECTION_STATUS_INVALID_CONNECTION)
+				status = e_gw_connection_retract_request (priv->cnc, id, retract_comment,
+						all_instances, FALSE);
+			if (status == E_GW_CONNECTION_STATUS_OK) {
+				ECalComponentId *id = NULL;
+
+				if (all_instances) {
+					char *old_object = NULL;
+					GSList *l, *comp_list = e_cal_backend_cache_get_components_by_uid (priv->cache, uid);
+					for (l = comp_list; l; l = l->next) {
+						ECalComponent *comp = E_CAL_COMPONENT (l->data);
+						ECalComponentId *id = e_cal_component_get_id (comp);
+						char *object = e_cal_component_get_as_string (comp);
+
+						if (e_cal_backend_cache_remove_component (priv->cache, id->uid, 
+								id->rid))
+						e_cal_backend_notify_object_removed (E_CAL_BACKEND (cbgw), id, object, NULL);
+						
+						e_cal_component_free_id (id);
+						g_free (object);
+						g_object_unref (comp);
+					}
+
+					g_slist_free (comp_list);
+					g_free (old_object);
+				} else {
+					id = e_cal_component_get_id (comp);
+					icalcomp = e_cal_component_get_icalcomponent (comp);
+					char * object = e_cal_component_get_as_string (comp);
+				
+					if (e_cal_backend_cache_remove_component (priv->cache, id->uid, 
+								id->rid)) {
+						e_cal_backend_notify_object_removed (E_CAL_BACKEND (cbgw), id, 
+							object, NULL);
+					}
 
+					g_free (object);
+					e_cal_component_free_id (id);
+				}
+			}
+		}
 		break;
 	case CAL_MODE_LOCAL :
 		/* in offline mode, we just update the cache */
-		e_cal_backend_cache_put_component (priv->cache, comp);
+		status = GNOME_Evolution_Calendar_RepositoryOffline;
 		break;
 	default:
 		break;	
 	}
 
 	g_object_unref (comp);
+	g_object_unref (found_comp);
 
 	return status;
 }
@@ -2446,12 +2533,16 @@ e_cal_backend_groupwise_send_objects (EC
 
 		comp = e_cal_component_new ();
 		
-		if (e_cal_component_set_icalcomponent (comp, icalcomp)) {
+		if (e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (icalcomp))) {
 			GSList *attendee_list = NULL, *tmp;
 			e_cal_component_get_attendee_list (comp, &attendee_list);
 			/* convert this into GList */
-			for (tmp = attendee_list; tmp; tmp = g_slist_next (tmp))
-				*users = g_list_append (*users, tmp);
+			for (tmp = attendee_list; tmp; tmp = g_slist_next (tmp)) {
+				const char *attendee = tmp->data;
+	
+				if (attendee)
+					*users = g_list_append (*users, g_strdup (attendee));
+			}
 			
 			g_object_unref (comp);	
 		}
Index: servers/groupwise/e-gw-connection.c
===================================================================
RCS file: /cvs/gnome/evolution-data-server/servers/groupwise/e-gw-connection.c,v
retrieving revision 1.141
diff -u -p -r1.141 e-gw-connection.c
--- servers/groupwise/e-gw-connection.c	23 Mar 2006 10:08:37 -0000	1.141
+++ servers/groupwise/e-gw-connection.c	3 Apr 2006 08:41:02 -0000
@@ -1463,7 +1463,16 @@ e_gw_connection_retract_request (EGwConn
 	soup_soap_message_start_element (msg, "items", NULL, NULL);
 	e_gw_message_write_string_parameter (msg, "item", NULL, id);
 	soup_soap_message_end_element (msg);
-	/* comment, FALSE, FALSE to be filled in later. */
+
+	if (retract_all)
+		e_gw_message_write_string_parameter (msg, "retractingAllInstances", NULL, "1");
+	
+	if (comment)
+		e_gw_message_write_string_parameter (msg, "comment", NULL, comment);
+	
+	if (resend)
+		e_gw_message_write_string_parameter (msg, "retractCausedByResend", NULL, "1");
+			
 	e_gw_message_write_footer (msg);
 
 	response = e_gw_connection_send_message (cnc, msg);
openSUSE Build Service is sponsored by