[libgdata] calendar: Set the self link for each GDataCalendarEvent



commit e24d9c4ceb2638d85e09fcdc6b9f39fc4c1579da
Author: Philip Withnall <philip tecnocode co uk>
Date:   Wed May 6 23:24:51 2015 +0100

    calendar: Set the self link for each GDataCalendarEvent
    
    Previously, this was partially solved in GDataCalendarService by
    constructing the link after each query or insertion. However, this could
    not work well for async operations. Instead, it appears to be possible
    to build the self link from within GDataCalendarEvent, as the calendar
    ID is apparently available as the organiser’s e-mail address.

 gdata/services/calendar/gdata-calendar-event.c   |   56 +++++++++++++++++++++-
 gdata/services/calendar/gdata-calendar-service.c |   39 ---------------
 2 files changed, 54 insertions(+), 41 deletions(-)
---
diff --git a/gdata/services/calendar/gdata-calendar-event.c b/gdata/services/calendar/gdata-calendar-event.c
index a6dfdc6..162a213 100644
--- a/gdata/services/calendar/gdata-calendar-event.c
+++ b/gdata/services/calendar/gdata-calendar-event.c
@@ -101,6 +101,7 @@ static void gdata_calendar_event_get_property (GObject *object, guint property_i
 static void gdata_calendar_event_set_property (GObject *object, guint property_id, const GValue *value, 
GParamSpec *pspec);
 static void get_json (GDataParsable *parsable, JsonBuilder *builder);
 static gboolean parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, GError **error);
+static gboolean post_parse_json (GDataParsable *parsable, gpointer user_data, GError **error);
 static const gchar *get_content_type (void);
 
 struct _GDataCalendarEventPrivate {
@@ -120,6 +121,7 @@ struct _GDataCalendarEventPrivate {
        gchar *recurrence;
        gchar *original_event_id;
        gchar *original_event_uri;
+       gchar *organiser_email;  /* owned */
 
        /* Parsing state. */
        struct {
@@ -166,6 +168,7 @@ gdata_calendar_event_class_init (GDataCalendarEventClass *klass)
        gobject_class->finalize = gdata_calendar_event_finalize;
 
        parsable_class->parse_json = parse_json;
+       parsable_class->post_parse_json = post_parse_json;
        parsable_class->get_json = get_json;
        parsable_class->get_content_type = get_content_type;
 
@@ -936,8 +939,27 @@ parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, GEr
 
                        json_reader_end_element (reader);
                }
-       } else if (g_strcmp0 (json_reader_get_member_name (reader), "creator") == 0 ||
-                  g_strcmp0 (json_reader_get_member_name (reader), "organizer") == 0) {
+       } else if (g_strcmp0 (json_reader_get_member_name (reader), "organizer") == 0) {
+               const GError *child_error = NULL;
+
+               /* This actually gives the parent calendar. */
+               json_reader_read_member (reader, "email");
+               child_error = json_reader_get_error (reader);
+               if (child_error != NULL) {
+                       gdata_parser_error_from_json_error (reader,
+                                                           child_error,
+                                                           error);
+                       json_reader_end_member (reader);
+                       return FALSE;
+               }
+
+               g_free (priv->organiser_email);
+               priv->organiser_email = g_strdup (json_reader_get_string_value (reader));
+
+               json_reader_end_member (reader);
+
+               return TRUE;
+       } else if (g_strcmp0 (json_reader_get_member_name (reader), "creator") == 0) {
                /* These are read-only and already handled as part of
                 * ‘attendees’, so ignore them. */
                return TRUE;
@@ -948,6 +970,36 @@ parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, GEr
        return TRUE;
 }
 
+static gboolean
+post_parse_json (GDataParsable *parsable, gpointer user_data, GError **error)
+{
+       GDataLink *_link = NULL;  /* owned */
+       const gchar *id, *calendar_id;
+       gchar *uri = NULL;  /* owned */
+       GDataCalendarEventPrivate *priv;
+
+       priv = GDATA_CALENDAR_EVENT (parsable)->priv;
+
+       /* Set the self link, which is needed for gdata_service_delete_entry().
+        * Unfortunately, it needs the event ID _and_ the calendar ID — which
+        * is perversely only available as the organiser e-mail address. */
+       id = gdata_entry_get_id (GDATA_ENTRY (parsable));
+       calendar_id = priv->organiser_email;
+
+       if (id == NULL || calendar_id == NULL) {
+               return TRUE;
+       }
+
+       uri = g_strconcat ("https://www.googleapis.com/calendar/v3/calendars/";,
+                          calendar_id, "/events/", id, NULL);
+       _link = gdata_link_new (uri, GDATA_LINK_SELF);
+       gdata_entry_add_link (GDATA_ENTRY (parsable), _link);
+       g_object_unref (_link);
+       g_free (uri);
+
+       return TRUE;
+}
+
 static void
 get_json (GDataParsable *parsable, JsonBuilder *builder)
 {
diff --git a/gdata/services/calendar/gdata-calendar-service.c 
b/gdata/services/calendar/gdata-calendar-service.c
index 924fc5b..f94ec7a 100644
--- a/gdata/services/calendar/gdata-calendar-service.c
+++ b/gdata/services/calendar/gdata-calendar-service.c
@@ -639,40 +639,6 @@ build_events_uri (GDataCalendarCalendar *calendar)
        return g_string_free (uri, FALSE);
 }
 
-static void
-set_event_id (GDataCalendarEvent *event,
-              GDataCalendarCalendar *calendar)
-{
-       GDataLink *_link = NULL;  /* owned */
-       const gchar *id, *calendar_id;
-       gchar *uri = NULL;  /* owned */
-
-       id = gdata_entry_get_id (GDATA_ENTRY (event));
-       calendar_id = gdata_entry_get_id (GDATA_ENTRY (calendar));
-
-       uri = g_strconcat ("https://www.googleapis.com/calendar/v3/calendars/";,
-                          calendar_id, "/events/", id, NULL);
-       _link = gdata_link_new (uri, GDATA_LINK_SELF);
-       gdata_entry_add_link (GDATA_ENTRY (event), _link);
-       g_object_unref (_link);
-       g_free (uri);
-}
-
-static void
-set_event_ids (GDataFeed *feed,
-               GDataCalendarCalendar *calendar)
-{
-       GList/*<unowned GDataEntry>*/ *entries, *i;  /* unowned */
-
-       /* Add a selfLink to each event, since they don’t contain one by
-        * default in the data returned by the server. */
-       entries = gdata_feed_get_entries (feed);
-
-       for (i = entries; i != NULL; i = i->next) {
-               set_event_id (GDATA_CALENDAR_EVENT (i->data), calendar);
-       }
-}
-
 /**
  * gdata_calendar_service_query_events:
  * @self: a #GDataCalendarService
@@ -720,9 +686,6 @@ gdata_calendar_service_query_events (GDataCalendarService *self, GDataCalendarCa
                                    error);
        g_free (request_uri);
 
-       /* Set the events’ IDs. */
-       set_event_ids (feed, calendar);
-
        return feed;
 }
 
@@ -864,8 +827,6 @@ gdata_calendar_service_insert_calendar_event (GDataCalendarService *self,
                                            cancellable, error);
        g_free (uri);
 
-       set_event_id (GDATA_CALENDAR_EVENT (entry), calendar);
-
        return GDATA_CALENDAR_EVENT (entry);
 }
 


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