diff options
author | Philip Withnall <philip@tecnocode.co.uk> | 2009-04-16 15:40:53 +0100 |
---|---|---|
committer | Philip Withnall <philip@tecnocode.co.uk> | 2009-04-16 15:40:53 +0100 |
commit | 008e022c0307be0b1e1833266a8a5480c2f979d1 (patch) | |
tree | 274466a293056e3ac553f1db48ac9352294cd345 /gdata/gdata-feed.c | |
parent | 290b92c174680472ca75eb07f7fb84902b3248fd (diff) | |
download | libgdata-008e022c0307be0b1e1833266a8a5480c2f979d1.tar.gz |
Bug 578661 – ETag support
Add support for ETags, to allow for versioning when querying, updating and deleting entries. This involved adding new API to GDataQuery to allow the
required ETag to be set for queries, as well as new properties in GDataEntry and GDataFeed for the ETags.
Diffstat (limited to 'gdata/gdata-feed.c')
-rw-r--r-- | gdata/gdata-feed.c | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/gdata/gdata-feed.c b/gdata/gdata-feed.c index 575abe3e..d7a6b073 100644 --- a/gdata/gdata-feed.c +++ b/gdata/gdata-feed.c @@ -53,6 +53,7 @@ struct _GDataFeedPrivate { gchar *title; gchar *subtitle; gchar *id; + gchar *etag; GTimeVal updated; GList *categories; gchar *logo; @@ -67,6 +68,7 @@ struct _GDataFeedPrivate { enum { PROP_ID = 1, + PROP_ETAG, PROP_UPDATED, PROP_TITLE, PROP_SUBTITLE, @@ -131,6 +133,20 @@ gdata_feed_class_init (GDataFeedClass *klass) G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** + * GDataFeed:etag: + * + * The unique ETag for this version of the feed. See the + * <ulink type="http" url="http://code.google.com/apis/gdata/docs/2.0/reference.html#ResourceVersioning">online documentation</ulink> for + * more information. + **/ + g_object_class_install_property (gobject_class, PROP_ETAG, + g_param_spec_string ("etag", + "ETag", "The unique ETag for this version of the feed.", + NULL, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + + /** * GDataFeed:updated: * * The time the feed was last updated. @@ -235,6 +251,7 @@ gdata_feed_finalize (GObject *object) g_free (priv->title); g_free (priv->subtitle); g_free (priv->id); + g_free (priv->etag); g_list_foreach (priv->categories, (GFunc) gdata_category_free, NULL); g_list_free (priv->categories); g_free (priv->logo); @@ -265,6 +282,9 @@ gdata_feed_get_property (GObject *object, guint property_id, GValue *value, GPar case PROP_ID: g_value_set_string (value, priv->id); break; + case PROP_ETAG: + g_value_set_string (value, priv->etag); + break; case PROP_UPDATED: g_value_set_boxed (value, &(priv->updated)); break; @@ -306,6 +326,9 @@ gdata_feed_set_property (GObject *object, guint property_id, const GValue *value case PROP_ID: priv->id = g_value_dup_string (value); break; + case PROP_ETAG: + priv->etag = g_value_dup_string (value); + break; case PROP_UPDATED: timeval = g_value_get_boxed (value); priv->updated = *timeval; @@ -356,7 +379,7 @@ _gdata_feed_new_from_xml (const gchar *xml, gint length, GType entry_type, GDataFeed *feed = NULL; xmlDoc *doc; xmlNode *node; - xmlChar *title = NULL, *subtitle = NULL, *id = NULL, *logo = NULL; + xmlChar *title = NULL, *subtitle = NULL, *id = NULL, *logo = NULL, *etag = NULL; GTimeVal updated = { 0, }; GDataGenerator *generator = NULL; guint entry_i = 0, total_results = 0, start_index = 0, items_per_page = 0; @@ -396,6 +419,9 @@ _gdata_feed_new_from_xml (const gchar *xml, gint length, GType entry_type, return NULL; } + /* Get the ETag first */ + etag = xmlGetProp (node, (xmlChar*) "etag"); + extra_xml = g_string_new (""); node = node->xmlChildrenNode; while (node != NULL) { @@ -663,6 +689,7 @@ _gdata_feed_new_from_xml (const gchar *xml, gint length, GType entry_type, "title", (gchar*) title, "subtitle", (gchar*) subtitle, "id", (gchar*) id, + "etag", (gchar*) etag, "updated", &updated, "logo", (gchar*) logo, "generator", generator, @@ -684,6 +711,7 @@ error: xmlFree (title); xmlFree (subtitle); xmlFree (id); + xmlFree (etag); xmlFree (logo); gdata_generator_free (generator); g_list_foreach (entries, (GFunc) g_object_unref, NULL); @@ -867,6 +895,21 @@ gdata_feed_get_id (GDataFeed *self) } /** + * gdata_feed_get_etag: + * @self: a #GDataFeed + * + * Returns the feed's unique ETag for this version. + * + * Return value: the feed's ETag + **/ +const gchar * +gdata_feed_get_etag (GDataFeed *self) +{ + g_return_val_if_fail (GDATA_IS_FEED (self), NULL); + return self->priv->etag; +} + +/** * gdata_feed_get_updated: * @self: a #GDataFeed * @updated: a #GTimeVal |