Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:pchenthill
evolution-data-server
bnc-158107-no-notification-canceled-mtgs.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
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);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor