[libgdata/wip/rishi/drive: 9/9] documents: Add support for downloading and exporting using Drive v2



commit 47ce07317c25d54f593d4438866e01f0e9ff5c62
Author: Debarshi Ray <debarshir gnome org>
Date:   Thu Apr 16 20:43:03 2015 +0200

    documents: Add support for downloading and exporting using Drive v2
    
    TODO: complete the compatibility mapping.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=684920

 .../services/documents/gdata-documents-document.c  |   65 +++++++++++++++++++-
 1 files changed, 62 insertions(+), 3 deletions(-)
---
diff --git a/gdata/services/documents/gdata-documents-document.c 
b/gdata/services/documents/gdata-documents-document.c
index 10d199c..d8e4e8b 100644
--- a/gdata/services/documents/gdata-documents-document.c
+++ b/gdata/services/documents/gdata-documents-document.c
@@ -207,30 +207,50 @@
 #include "gdata-private.h"
 #include "gdata-service.h"
 
+static void gdata_documents_document_finalize (GObject *object);
 static gboolean parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, GError **error);
 
+struct _GDataDocumentsDocumentPrivate {
+       GHashTable *export_links;
+};
+
 G_DEFINE_TYPE (GDataDocumentsDocument, gdata_documents_document, GDATA_TYPE_DOCUMENTS_ENTRY)
 
 static void
 gdata_documents_document_class_init (GDataDocumentsDocumentClass *klass)
 {
+       GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
        GDataParsableClass *parsable_class = GDATA_PARSABLE_CLASS (klass);
        GDataEntryClass *entry_class = GDATA_ENTRY_CLASS (klass);
 
-       parsable_class->parse_json = parse_json;
+       g_type_class_add_private (klass, sizeof (GDataDocumentsDocumentPrivate));
 
+       gobject_class->finalize = gdata_documents_document_finalize;
+       parsable_class->parse_json = parse_json;
        entry_class->kind_term = "http://schemas.google.com/docs/2007#file";;
 }
 
 static void
 gdata_documents_document_init (GDataDocumentsDocument *self)
 {
-       /* Nothing to see here. */
+       self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GDATA_TYPE_DOCUMENTS_DOCUMENT, 
GDataDocumentsDocumentPrivate);
+       self->priv->export_links = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+}
+
+static void
+gdata_documents_document_finalize (GObject *object)
+{
+       GDataDocumentsDocumentPrivate *priv = GDATA_DOCUMENTS_DOCUMENT (object)->priv;
+
+       g_hash_table_unref (priv->export_links);
+
+       G_OBJECT_CLASS (gdata_documents_document_parent_class)->finalize (object);
 }
 
 static gboolean
 parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, GError **error)
 {
+       GDataDocumentsDocumentPrivate *priv = GDATA_DOCUMENTS_DOCUMENT (parsable)->priv;
        gboolean success;
        gchar *content_uri = NULL;
 
@@ -239,6 +259,36 @@ parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, GEr
                        gdata_entry_set_content_uri (GDATA_ENTRY (parsable), content_uri);
                g_free (content_uri);
                return success;
+       } else if (g_strcmp0 (json_reader_get_member_name (reader), "exportLinks") == 0) {
+               guint i, members;
+
+               if (json_reader_is_object (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 ‘exportLinks’ is not an object."));
+                       return FALSE;
+               }
+
+               for (i = 0, members = (guint) json_reader_count_members (reader); i < members; i++) {
+                       const gchar *format;
+                       gchar *uri = NULL;
+
+                       json_reader_read_element (reader, i);
+
+                       format = json_reader_get_member_name (reader);
+
+                       gdata_parser_string_from_json_member (reader, format, P_REQUIRED | P_NON_EMPTY, &uri, 
&success, NULL);
+                       if (success) {
+                               g_hash_table_insert (priv->export_links, g_strdup (format), uri);
+                               uri = NULL;
+                       }
+
+                       json_reader_end_element (reader);
+                       g_free (uri);
+               }
+
+               return TRUE;
        }
 
        return GDATA_PARSABLE_CLASS (gdata_documents_document_parent_class)->parse_json (parsable, reader, 
user_data, error);
@@ -350,10 +400,19 @@ gdata_documents_document_download (GDataDocumentsDocument *self, GDataDocumentsS
 gchar *
 gdata_documents_document_get_download_uri (GDataDocumentsDocument *self, const gchar *export_format)
 {
+       const gchar *format;
+
        g_return_val_if_fail (GDATA_IS_DOCUMENTS_DOCUMENT (self), NULL);
        g_return_val_if_fail (export_format != NULL && *export_format != '\0', NULL);
 
-       return _gdata_service_build_uri ("%p&exportFormat=%s", gdata_entry_get_content_uri (GDATA_ENTRY 
(self)), export_format);
+       if (g_strcmp0 (export_format, "pdf") == 0)
+               format = "application/pdf";
+       else if (g_strcmp0 (export_format, GDATA_DOCUMENTS_SPREADSHEET_ODS) == 0)
+               format = "application/x-vnd.oasis.opendocument.spreadsheet";
+       else
+               format = export_format;
+
+       return g_strdup (g_hash_table_lookup (self->priv->export_links, format));
 }
 
 /**


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