diff options
author | Patrick Ohly <patrick.ohly@intel.com> | 2011-05-12 14:04:37 +0200 |
---|---|---|
committer | Patrick Ohly <patrick.ohly@intel.com> | 2011-05-17 10:45:41 +0200 |
commit | ccaa11856590745aea28532cce67a66af06daa18 (patch) | |
tree | 593f5db303fc390ee6634d7ec7c1174cd2c1734a | |
parent | 55d171be74d6d18e566b22bdbf8a585d58fb9bcb (diff) | |
download | evolution-data-server-ccaa11856590745aea28532cce67a66af06daa18.tar.gz |
calendar file backend: support remove with CALOBJ_MOD_ONLY_THIS
Support for this capability is easy:
- report removal of the detached recurrence
- report error when not found
- avoid modifying the parent (= full_object)
-rw-r--r-- | calendar/backends/file/e-cal-backend-file.c | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/calendar/backends/file/e-cal-backend-file.c b/calendar/backends/file/e-cal-backend-file.c index 54fff576a..a9facd5a0 100644 --- a/calendar/backends/file/e-cal-backend-file.c +++ b/calendar/backends/file/e-cal-backend-file.c @@ -446,6 +446,7 @@ e_cal_backend_file_get_static_capabilities (ECalBackendSync *backend, EDataCal * *capabilities = g_strdup (CAL_STATIC_CAPABILITY_NO_EMAIL_ALARMS "," CAL_STATIC_CAPABILITY_NO_THISANDFUTURE "," CAL_STATIC_CAPABILITY_DELEGATE_SUPPORTED "," + CAL_STATIC_CAPABILITY_REMOVE_ONLY_THIS "," CAL_STATIC_CAPABILITY_NO_THISANDPRIOR); } @@ -2675,12 +2676,16 @@ remove_instance (ECalBackendFile *cbfile, ECalBackendFileObject *obj_data, /* remove recurrence */ if (g_hash_table_lookup_extended (obj_data->recurrences, rid, (gpointer *)&hash_rid, (gpointer *)&comp)) { - /* Removing without parent? Report as removal. */ - if (old_object && !obj_data->full_object) + /* Removing without parent or not modifying parent? + Report removal to caller. */ + if (old_object && + (!obj_data->full_object || mod == CALOBJ_MOD_ONLY_THIS)) *old_object = e_cal_component_get_as_string (comp); - /* Removing with parent? Report directly instead of going via caller. */ - if (obj_data->full_object) { + /* Reporting parent modification to caller? + Report directly instead of going via caller. */ + if (obj_data->full_object && + mod != CALOBJ_MOD_ONLY_THIS) { /* old object string not provided, instead rely on the view detecting whether it contains the id */ @@ -2696,6 +2701,10 @@ remove_instance (ECalBackendFile *cbfile, ECalBackendFileObject *obj_data, cbfile->priv->comp = g_list_remove (cbfile->priv->comp, comp); obj_data->recurrences_list = g_list_remove (obj_data->recurrences_list, comp); g_hash_table_remove (obj_data->recurrences, rid); + } else if (mod == CALOBJ_MOD_ONLY_THIS) { + if (error) + g_propagate_error (error, EDC_ERROR (ObjectNotFound)); + return obj_data; } else { /* not an error, only add EXDATE */ } @@ -2709,6 +2718,11 @@ remove_instance (ECalBackendFile *cbfile, ECalBackendFileObject *obj_data, return obj_data; } } + + /* avoid modifying parent? */ + if (mod == CALOBJ_MOD_ONLY_THIS) + return obj_data; + /* remove the main component from our data before modifying it */ icalcomponent_remove_component (cbfile->priv->icalcomp, e_cal_component_get_icalcomponent (obj_data->full_object)); @@ -2736,6 +2750,15 @@ remove_instance (ECalBackendFile *cbfile, ECalBackendFileObject *obj_data, e_cal_component_get_icalcomponent (obj_data->full_object)); cbfile->priv->comp = g_list_prepend (cbfile->priv->comp, obj_data->full_object); } else { + if (!obj_data->full_object) { + /* Nothing to do, parent doesn't exist. Tell + caller about this? Not an error with + CALOBJ_MOD_THIS. */ + if (mod == CALOBJ_MOD_ONLY_THIS && error) + g_propagate_error (error, EDC_ERROR (ObjectNotFound)); + return obj_data; + } + /* remove the main component from our data before deleting it */ if (!remove_component_from_intervaltree (cbfile, obj_data->full_object)) { /* return without changing anything */ @@ -2810,6 +2833,7 @@ e_cal_backend_file_remove_object (ECalBackendSync *backend, EDataCal *cal, case CALOBJ_MOD_THIS: case CALOBJ_MOD_THISANDPRIOR: case CALOBJ_MOD_THISANDFUTURE: + case CALOBJ_MOD_ONLY_THIS: case CALOBJ_MOD_ALL: break; default: @@ -2839,8 +2863,6 @@ e_cal_backend_file_remove_object (ECalBackendSync *backend, EDataCal *cal, *object = NULL; break; case CALOBJ_MOD_ONLY_THIS: - /* not reached, keep compiler happy */ - break; case CALOBJ_MOD_THIS : obj_data = remove_instance (cbfile, obj_data, uid, recur_id, mod, old_object, object, error); break; |