summaryrefslogtreecommitdiff
path: root/gdata/gdata-feed.c
diff options
context:
space:
mode:
authorPhilip Withnall <philip@tecnocode.co.uk>2009-04-16 15:40:53 +0100
committerPhilip Withnall <philip@tecnocode.co.uk>2009-04-16 15:40:53 +0100
commit008e022c0307be0b1e1833266a8a5480c2f979d1 (patch)
tree274466a293056e3ac553f1db48ac9352294cd345 /gdata/gdata-feed.c
parent290b92c174680472ca75eb07f7fb84902b3248fd (diff)
downloadlibgdata-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.c45
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