[libgdata/wip/rishi/drive: 1/2] documents: Add support for parsing Drive v2 file lists
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgdata/wip/rishi/drive: 1/2] documents: Add support for parsing Drive v2 file lists
- Date: Mon, 30 Mar 2015 18:04:01 +0000 (UTC)
commit 910f32bef622addb40feadcef7cd91e15d7eae17
Author: Debarshi Ray <debarshir gnome org>
Date: Mon Mar 30 18:39:47 2015 +0200
documents: Add support for parsing Drive v2 file lists
gdata/services/documents/gdata-documents-feed.c | 92 ++++++++++++++++++++++-
1 files changed, 90 insertions(+), 2 deletions(-)
---
diff --git a/gdata/services/documents/gdata-documents-feed.c b/gdata/services/documents/gdata-documents-feed.c
index d2c67c2..e600d9f 100644
--- a/gdata/services/documents/gdata-documents-feed.c
+++ b/gdata/services/documents/gdata-documents-feed.c
@@ -3,6 +3,7 @@
* GData Client
* Copyright (C) Thibault Saunier 2009 <saunierthibault gmail com>
* Copyright (C) Philip Withnall 2010 <philip tecnocode co uk>
+ * Copyright (C) Red Hat, Inc. 2015
*
* GData Client is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -51,6 +52,7 @@
#include "gdata-private.h"
#include "gdata-service.h"
+static gboolean parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, GError **error);
static gboolean parse_xml (GDataParsable *parsable, xmlDoc *doc, xmlNode *root_node, gpointer user_data,
GError **error);
G_DEFINE_TYPE (GDataDocumentsFeed, gdata_documents_feed, GDATA_TYPE_FEED)
@@ -59,6 +61,8 @@ static void
gdata_documents_feed_class_init (GDataDocumentsFeedClass *klass)
{
GDataParsableClass *parsable_class = GDATA_PARSABLE_CLASS (klass);
+
+ parsable_class->parse_json = parse_json;
parsable_class->parse_xml = parse_xml;
}
@@ -68,10 +72,33 @@ gdata_documents_feed_init (GDataDocumentsFeed *self)
/* Why am I writing it? */
}
+static gchar *
+get_kind_from_json (JsonReader *reader)
+{
+ GError *error = NULL;
+ gboolean success;
+ gchar *retval = NULL;
+ gint i, members;
+
+ for (i = 0, members = json_reader_count_members (reader); i < members; i++) {
+ json_reader_read_element (reader, i);
+
+ gdata_parser_string_from_json_member (reader, "kind", P_NO_DUPES | P_REQUIRED | P_NON_EMPTY,
&retval, &success, &error);
+ if (!success && error != NULL) {
+ g_warning ("Error parsing JSON: Trying to find ‘kind’: %s", error->message);
+ g_clear_error (&error);
+ }
+
+ json_reader_end_element (reader);
+ }
+
+ return retval;
+}
+
/* NOTE: Cast from (xmlChar*) to (gchar*) (and corresponding change in memory management functions) is safe
because we've changed
* libxml's memory functions. */
static gchar *
-get_kind (xmlDoc *doc, xmlNode *node)
+get_kind_from_xml (xmlDoc *doc, xmlNode *node)
{
xmlNode *entry_node;
@@ -91,6 +118,67 @@ get_kind (xmlDoc *doc, xmlNode *node)
}
static gboolean
+parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, GError **error)
+{
+ GDataDocumentsFeed *self = GDATA_DOCUMENTS_FEED (parsable);
+
+ if (g_strcmp0 (json_reader_get_member_name (reader), "items") == 0) {
+ gint i, elements;
+
+ if (json_reader_is_array (reader) == FALSE) {
+ g_set_error (error, GDATA_PARSER_ERROR, GDATA_PARSER_ERROR_PARSING_STRING,
+ /* Translators: the parameter is an error message */
+ _("Error parsing JSON: %s"),
+ _("JSON node ‘items’ is not an array."));
+ return FALSE;
+ }
+
+ /* Loop through the elements array. */
+ for (i = 0, elements = json_reader_count_elements (reader); i < elements; i++) {
+ GDataEntry *entry = NULL;
+ GType entry_type = G_TYPE_INVALID;
+ gchar *kind = NULL;
+
+ json_reader_read_element (reader, i);
+
+ if (json_reader_is_object (reader) == FALSE) {
+ g_warning ("Error parsing JSON: JSON node inside ‘items’ is not an object");
+ goto continuation;
+ }
+
+ kind = get_kind_from_json (reader);
+ if (kind == NULL) {
+ g_warning ("Error parsing JSON: Failed to find ‘kind’");
+ goto continuation;
+ }
+
+ if (g_strcmp0 (kind, "drive#file") == 0) {
+ entry_type = GDATA_TYPE_DOCUMENTS_DOCUMENT;
+ } else {
+ g_message ("%s files are not handled yet", kind);
+ }
+
+ if (entry_type == G_TYPE_INVALID)
+ goto continuation;
+
+ entry = GDATA_ENTRY (_gdata_parsable_new_from_json_node (entry_type, reader, NULL,
error));
+ /* Call the progress callback in the main thread */
+ _gdata_feed_call_progress_callback (GDATA_FEED (self), user_data, entry);
+ _gdata_feed_add_entry (GDATA_FEED (self), entry);
+
+ continuation:
+ g_clear_object (&entry);
+ g_free (kind);
+ json_reader_end_element (reader);
+ }
+ } else {
+ return GDATA_PARSABLE_CLASS (gdata_documents_feed_parent_class)->parse_json (parsable,
reader, user_data, error);
+ }
+
+ return TRUE;
+}
+
+static gboolean
parse_xml (GDataParsable *parsable, xmlDoc *doc, xmlNode *node, gpointer user_data, GError **error)
{
GDataDocumentsFeed *self = GDATA_DOCUMENTS_FEED (parsable);
@@ -99,7 +187,7 @@ parse_xml (GDataParsable *parsable, xmlDoc *doc, xmlNode *node, gpointer user_da
xmlStrcmp (node->name, (xmlChar*) "entry") == 0) {
GDataEntry *entry = NULL;
GType entry_type = G_TYPE_INVALID;
- gchar *kind = get_kind (doc, node);
+ gchar *kind = get_kind_from_xml (doc, node);
if (g_strcmp0 (kind, "http://schemas.google.com/docs/2007#spreadsheet") == 0) {
entry_type = GDATA_TYPE_DOCUMENTS_SPREADSHEET;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]