[libgdata/wip/rishi/drive: 9/9] documents: Add support for downloading and exporting using Drive v2
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgdata/wip/rishi/drive: 9/9] documents: Add support for downloading and exporting using Drive v2
- Date: Fri, 17 Apr 2015 08:57:30 +0000 (UTC)
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]