[evolution-data-server] Bug #704618 - Missing detached instances in get_object() response



commit 8719e59be3a9dc64b1c84265a95f97d31041f8a5
Author: Milan Crha <mcrha redhat com>
Date:   Mon Jul 22 18:03:00 2013 +0200

    Bug #704618 - Missing detached instances in get_object() response

 calendar/backends/http/e-cal-backend-http.c |   20 +++++++----
 calendar/libedata-cal/e-cal-backend-store.c |   52 +++++++++++++++++++++++++++
 calendar/libedata-cal/e-cal-backend-store.h |    3 ++
 3 files changed, 68 insertions(+), 7 deletions(-)
---
diff --git a/calendar/backends/http/e-cal-backend-http.c b/calendar/backends/http/e-cal-backend-http.c
index 1765dc2..a9675d9 100644
--- a/calendar/backends/http/e-cal-backend-http.c
+++ b/calendar/backends/http/e-cal-backend-http.c
@@ -1026,14 +1026,20 @@ e_cal_backend_http_get_object (ECalBackendSync *backend,
                return;
        }
 
-       comp = e_cal_backend_store_get_component (priv->store, uid, rid);
-       if (!comp) {
-               g_propagate_error (error, EDC_ERROR (ObjectNotFound));
-               return;
-       }
+       if (rid && *rid) {
+               comp = e_cal_backend_store_get_component (priv->store, uid, rid);
+               if (!comp) {
+                       g_propagate_error (error, EDC_ERROR (ObjectNotFound));
+                       return;
+               }
 
-       *object = e_cal_component_get_as_string (comp);
-       g_object_unref (comp);
+               *object = e_cal_component_get_as_string (comp);
+               g_object_unref (comp);
+       } else {
+               *object = e_cal_backend_store_get_components_by_uid_as_ical_string (priv->store, uid);
+               if (!*object)
+                       g_propagate_error (error, EDC_ERROR (ObjectNotFound));
+       }
 }
 
 /* Add_timezone handler for the file backend */
diff --git a/calendar/libedata-cal/e-cal-backend-store.c b/calendar/libedata-cal/e-cal-backend-store.c
index 1fa1120..c343ab7 100644
--- a/calendar/libedata-cal/e-cal-backend-store.c
+++ b/calendar/libedata-cal/e-cal-backend-store.c
@@ -1313,6 +1313,58 @@ e_cal_backend_store_get_components_by_uid (ECalBackendStore *store,
 }
 
 /**
+ * e_cal_backend_store_get_components_by_uid_as_ical_string:
+ * @store: an #ECalBackendStore
+ * @uid: a component UID
+ *
+ * Returns: Newly allocated ical string containing all
+ *   instances with given @uid. Free returned pointer with g_free(),
+ *   when no longer needed.
+ *
+ * Since: 3.10
+ **/
+gchar *
+e_cal_backend_store_get_components_by_uid_as_ical_string (ECalBackendStore *store,
+                                                         const gchar *uid)
+{
+       GSList *comps;
+       gchar *ical_string = NULL;
+
+       g_return_val_if_fail (E_IS_CAL_BACKEND_STORE (store), NULL);
+       g_return_val_if_fail (uid != NULL, NULL);
+
+       comps = e_cal_backend_store_get_components_by_uid (store, uid);
+       if (!comps)
+               return NULL;
+
+       if (!comps->next) {
+               ical_string = e_cal_component_get_as_string (comps->data);
+       } else {
+               GSList *citer;
+               icalcomponent *icalcomp;
+
+               /* if we have detached recurrences, return a VCALENDAR */
+               icalcomp = e_cal_util_new_top_level ();
+
+               for (citer = comps; citer; citer = g_slist_next (citer)) {
+                       ECalComponent *comp = citer->data;
+
+                       icalcomponent_add_component (
+                               icalcomp,
+                               icalcomponent_new_clone (e_cal_component_get_icalcomponent (comp)));
+               }
+
+               ical_string = icalcomponent_as_ical_string_r (icalcomp);
+
+               icalcomponent_free (icalcomp);
+       }
+
+       g_slist_free_full (comps, g_object_unref);
+
+       return ical_string;
+}
+
+/**
  * e_cal_backend_store_get_components:
  *
  * Since: 2.28
diff --git a/calendar/libedata-cal/e-cal-backend-store.h b/calendar/libedata-cal/e-cal-backend-store.h
index 7816cfd..79152fd 100644
--- a/calendar/libedata-cal/e-cal-backend-store.h
+++ b/calendar/libedata-cal/e-cal-backend-store.h
@@ -138,6 +138,9 @@ gboolean    e_cal_backend_store_set_default_timezone
 GSList *       e_cal_backend_store_get_components_by_uid
                                                (ECalBackendStore *store,
                                                 const gchar *uid);
+gchar *                e_cal_backend_store_get_components_by_uid_as_ical_string
+                                               (ECalBackendStore *store,
+                                                const gchar *uid);
 GSList *       e_cal_backend_store_get_components
                                                (ECalBackendStore *store);
 GSList *       e_cal_backend_store_get_components_occuring_in_range


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