[libgdata/wip/rishi/drive: 1/2] documents: Add support for parsing Drive v2 file lists



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]