|
Packit |
4b6dd7 |
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
|
|
Packit |
4b6dd7 |
/*
|
|
Packit |
4b6dd7 |
* GData Client
|
|
Packit |
4b6dd7 |
* Copyright (C) Philip Withnall 2010 <philip@tecnocode.co.uk>
|
|
Packit |
4b6dd7 |
* Copyright (C) Red Hat, Inc. 2015
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* GData Client is free software; you can redistribute it and/or
|
|
Packit |
4b6dd7 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
4b6dd7 |
* License as published by the Free Software Foundation; either
|
|
Packit |
4b6dd7 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* GData Client is distributed in the hope that it will be useful,
|
|
Packit |
4b6dd7 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
4b6dd7 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
4b6dd7 |
* Lesser General Public License for more details.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
4b6dd7 |
* License along with GData Client. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* SECTION:gdata-documents-document
|
|
Packit |
4b6dd7 |
* @short_description: GData documents document object
|
|
Packit |
4b6dd7 |
* @stability: Stable
|
|
Packit |
4b6dd7 |
* @include: gdata/services/documents/gdata-documents-document.h
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* #GDataDocumentsDocument is a subclass of #GDataDocumentsEntry to represent an arbitrary Google Drive document (i.e. an arbitrary file which
|
|
Packit |
4b6dd7 |
* isn't a Google Documents presentation, text document, PDF, drawing or spreadsheet). It is subclassed by #GDataDocumentsPresentation, #GDataDocumentsText,
|
|
Packit |
4b6dd7 |
* #GDataDocumentsPdf, #GDataDocumentsDrawing and #GDataDocumentsSpreadsheet, which represent those specific types of Google Document, respectively.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* #GDataDocumentsDocument used to be abstract, but was made instantiable in version 0.13.0 to allow for arbitrary file uploads. This can be achieved
|
|
Packit |
4b6dd7 |
* by setting #GDataDocumentsUploadQuery:convert to %FALSE when making an upload using gdata_documents_service_upload_document_resumable(). See the
|
|
Packit |
4b6dd7 |
* documentation for #GDataDocumentsUploadQuery for an example.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* It should be noted that #GDataDocumentsDocument should only be used to represent arbitrary files; its subclasses should be used any time a standard
|
|
Packit |
4b6dd7 |
* Google Document (spreadsheet, text document, presentation, etc.) is to be represented.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more details of Google Drive’s GData API, see the
|
|
Packit |
4b6dd7 |
* <ulink type="http" url="https://developers.google.com/drive/v2/web/about-sdk">online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* <example>
|
|
Packit |
4b6dd7 |
* <title>Downloading a Document</title>
|
|
Packit |
4b6dd7 |
* <programlisting>
|
|
Packit |
4b6dd7 |
* GDataDocumentsService *service;
|
|
Packit |
4b6dd7 |
* GDataDocumentsDocument *document;
|
|
Packit |
4b6dd7 |
* GFile *destination_file;
|
|
Packit |
4b6dd7 |
* const gchar *download_format;
|
|
Packit |
4b6dd7 |
* GDataDownloadStream *download_stream;
|
|
Packit |
4b6dd7 |
* GFileOutputStream *output_stream;
|
|
Packit |
4b6dd7 |
* GError *error = NULL;
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Create a service and retrieve the document to download and the file and format to save the download in */
|
|
Packit |
4b6dd7 |
* service = create_youtube_service ();
|
|
Packit |
4b6dd7 |
* document = get_document_to_download (service);
|
|
Packit |
4b6dd7 |
* destination_file = query_user_for_destination_file (document);
|
|
Packit |
4b6dd7 |
* download_format = query_user_for_download_format (document);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Create the download stream */
|
|
Packit |
4b6dd7 |
* download_stream = gdata_documents_document_download (document, service, download_format, NULL, &error);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (document);
|
|
Packit |
4b6dd7 |
* g_object_unref (service);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* if (error != NULL) {
|
|
Packit |
4b6dd7 |
* g_error ("Error creating download stream: %s", error->message);
|
|
Packit |
4b6dd7 |
* g_error_free (error);
|
|
Packit |
4b6dd7 |
* g_object_unref (destination_file);
|
|
Packit |
4b6dd7 |
* return;
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Create the file output stream */
|
|
Packit |
4b6dd7 |
* output_stream = g_file_replace (destination_file, NULL, FALSE, G_FILE_CREATE_REPLACE_DESTINATION, NULL, &error);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (destination_file);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* if (error != NULL) {
|
|
Packit |
4b6dd7 |
* g_error ("Error creating destination file: %s", error->message);
|
|
Packit |
4b6dd7 |
* g_error_free (error);
|
|
Packit |
4b6dd7 |
* g_object_unref (download_stream);
|
|
Packit |
4b6dd7 |
* return;
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Download the document. This should almost always be done asynchronously. */
|
|
Packit |
4b6dd7 |
* g_output_stream_splice (G_OUTPUT_STREAM (output_stream), G_INPUT_STREAM (download_stream),
|
|
Packit |
4b6dd7 |
* G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE | G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET, NULL, &error);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (output_stream);
|
|
Packit |
4b6dd7 |
* g_object_unref (download_stream);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* if (error != NULL) {
|
|
Packit |
4b6dd7 |
* g_error ("Error downloading document: %s", error->message);
|
|
Packit |
4b6dd7 |
* g_error_free (error);
|
|
Packit |
4b6dd7 |
* return;
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
* </programlisting>
|
|
Packit |
4b6dd7 |
* </example>
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Each document accessible through the service has an access control list (ACL) which defines the level of access to the document to each user, and
|
|
Packit |
4b6dd7 |
* which users the document is shared with. For more information about ACLs for documents, see the
|
|
Packit |
4b6dd7 |
* url="https://developers.google.com/google-apps/documents-list/#managing_sharing_permissions_of_resources_via_access_control_lists_acls">online
|
|
Packit |
4b6dd7 |
* documentation on sharing documents</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* <example>
|
|
Packit |
4b6dd7 |
* <title>Retrieving the Access Control List for a Document</title>
|
|
Packit |
4b6dd7 |
* <programlisting>
|
|
Packit |
4b6dd7 |
* GDataDocumentsService *service;
|
|
Packit |
4b6dd7 |
* GDataDocumentsDocument *document;
|
|
Packit |
4b6dd7 |
* GDataFeed *acl_feed;
|
|
Packit |
4b6dd7 |
* GDataAccessRule *rule, *new_rule;
|
|
Packit |
4b6dd7 |
* GDataLink *acl_link;
|
|
Packit |
4b6dd7 |
* GList *i;
|
|
Packit |
4b6dd7 |
* GError *error = NULL;
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Create a service and retrieve a document to work on */
|
|
Packit |
4b6dd7 |
* service = create_documents_service ();
|
|
Packit |
4b6dd7 |
* document = get_document (service);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Query the service for the ACL for the given document */
|
|
Packit |
4b6dd7 |
* acl_feed = gdata_access_handler_get_rules (GDATA_ACCESS_HANDLER (document), GDATA_SERVICE (service), NULL, NULL, NULL, &error);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* if (error != NULL) {
|
|
Packit |
4b6dd7 |
* g_error ("Error getting ACL feed for document: %s", error->message);
|
|
Packit |
4b6dd7 |
* g_error_free (error);
|
|
Packit |
4b6dd7 |
* g_object_unref (document);
|
|
Packit |
4b6dd7 |
* g_object_unref (service);
|
|
Packit |
4b6dd7 |
* return;
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Iterate through the ACL */
|
|
Packit |
4b6dd7 |
* for (i = gdata_feed_get_entries (acl_feed); i != NULL; i = i->next) {
|
|
Packit |
4b6dd7 |
* const gchar *scope_value;
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* rule = GDATA_ACCESS_RULE (i->data);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Do something with the access rule here. As an example, we update the rule applying to test@gmail.com and delete all
|
|
Packit |
4b6dd7 |
* * the other rules. We then insert another rule for example@gmail.com below. */
|
|
Packit |
4b6dd7 |
* gdata_access_rule_get_scope (rule, NULL, &scope_value);
|
|
Packit |
4b6dd7 |
* if (scope_value != NULL && strcmp (scope_value, "test@gmail.com") == 0) {
|
|
Packit |
4b6dd7 |
* GDataAccessRule *updated_rule;
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Update the rule to make test@gmail.com a writer (full read/write access to the document, but they can't change
|
|
Packit |
4b6dd7 |
* * the ACL or delete the document). */
|
|
Packit |
4b6dd7 |
* gdata_access_rule_set_role (rule, GDATA_DOCUMENTS_ACCESS_ROLE_WRITER);
|
|
Packit |
4b6dd7 |
* updated_rule = GDATA_ACCESS_RULE (gdata_service_update_entry (GDATA_SERVICE (service), GDATA_ENTRY (rule), NULL, &error));
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* if (error != NULL) {
|
|
Packit |
4b6dd7 |
* g_error ("Error updating access rule for %s: %s", scope_value, error->message);
|
|
Packit |
4b6dd7 |
* g_error_free (error);
|
|
Packit |
4b6dd7 |
* g_object_unref (acl_feed);
|
|
Packit |
4b6dd7 |
* g_object_unref (document);
|
|
Packit |
4b6dd7 |
* g_object_unref (service);
|
|
Packit |
4b6dd7 |
* return;
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (updated_rule);
|
|
Packit |
4b6dd7 |
* } else {
|
|
Packit |
4b6dd7 |
* /* Delete any rule which doesn't apply to test@gmail.com */
|
|
Packit |
4b6dd7 |
* gdata_service_delete_entry (GDATA_SERVICE (service), GDATA_ENTRY (rule), NULL, &error);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* if (error != NULL) {
|
|
Packit |
4b6dd7 |
* g_error ("Error deleting access rule for %s: %s", scope_value, error->message);
|
|
Packit |
4b6dd7 |
* g_error_free (error);
|
|
Packit |
4b6dd7 |
* g_object_unref (acl_feed);
|
|
Packit |
4b6dd7 |
* g_object_unref (document);
|
|
Packit |
4b6dd7 |
* g_object_unref (service);
|
|
Packit |
4b6dd7 |
* return;
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (acl_feed);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Create and insert a new access rule for example@gmail.com which allows them read-only access to the document. */
|
|
Packit |
4b6dd7 |
* rule = gdata_access_rule_new (NULL);
|
|
Packit |
4b6dd7 |
* gdata_access_rule_set_role (rule, GDATA_DOCUMENTS_ACCESS_ROLE_READER);
|
|
Packit |
4b6dd7 |
* gdata_access_rule_set_scope (rule, GDATA_ACCESS_SCOPE_USER, "example@gmail.com");
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* acl_link = gdata_entry_look_up_link (GDATA_ENTRY (document), GDATA_LINK_ACCESS_CONTROL_LIST);
|
|
Packit |
4b6dd7 |
* new_rule = GDATA_ACCESS_RULE (gdata_service_insert_entry (GDATA_SERVICE (service), gdata_link_get_uri (acl_link), GDATA_ENTRY (rule),
|
|
Packit |
4b6dd7 |
* NULL, &error));
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (rule);
|
|
Packit |
4b6dd7 |
* g_object_unref (document);
|
|
Packit |
4b6dd7 |
* g_object_unref (service);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* if (error != NULL) {
|
|
Packit |
4b6dd7 |
* g_error ("Error inserting access rule: %s", error->message);
|
|
Packit |
4b6dd7 |
* g_error_free (error);
|
|
Packit |
4b6dd7 |
* return;
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (acl_link);
|
|
Packit |
4b6dd7 |
* </programlisting>
|
|
Packit |
4b6dd7 |
* </example>
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.7.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
#include <config.h>
|
|
Packit |
4b6dd7 |
#include <glib.h>
|
|
Packit |
4b6dd7 |
#include <glib/gi18n-lib.h>
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
#include "gdata-documents-document.h"
|
|
Packit |
4b6dd7 |
#include "gdata-documents-drawing.h"
|
|
Packit |
4b6dd7 |
#include "gdata-documents-entry.h"
|
|
Packit |
4b6dd7 |
#include "gdata-documents-presentation.h"
|
|
Packit |
4b6dd7 |
#include "gdata-documents-spreadsheet.h"
|
|
Packit |
4b6dd7 |
#include "gdata-documents-text.h"
|
|
Packit |
4b6dd7 |
#include "gdata-documents-utils.h"
|
|
Packit |
4b6dd7 |
#include "gdata-download-stream.h"
|
|
Packit |
4b6dd7 |
#include "gdata-private.h"
|
|
Packit |
4b6dd7 |
#include "gdata-service.h"
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void gdata_documents_document_finalize (GObject *object);
|
|
Packit |
4b6dd7 |
static gboolean parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, GError **error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
struct _GDataDocumentsDocumentPrivate {
|
|
Packit |
4b6dd7 |
GHashTable *export_links; /* owned string → owned string */
|
|
Packit |
4b6dd7 |
};
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
G_DEFINE_TYPE (GDataDocumentsDocument, gdata_documents_document, GDATA_TYPE_DOCUMENTS_ENTRY)
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_documents_document_class_init (GDataDocumentsDocumentClass *klass)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
|
Packit |
4b6dd7 |
GDataParsableClass *parsable_class = GDATA_PARSABLE_CLASS (klass);
|
|
Packit |
4b6dd7 |
GDataEntryClass *entry_class = GDATA_ENTRY_CLASS (klass);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_type_class_add_private (klass, sizeof (GDataDocumentsDocumentPrivate));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
gobject_class->finalize = gdata_documents_document_finalize;
|
|
Packit |
4b6dd7 |
parsable_class->parse_json = parse_json;
|
|
Packit |
4b6dd7 |
entry_class->kind_term = "http://schemas.google.com/docs/2007#file";
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_documents_document_init (GDataDocumentsDocument *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GDATA_TYPE_DOCUMENTS_DOCUMENT, GDataDocumentsDocumentPrivate);
|
|
Packit |
4b6dd7 |
self->priv->export_links = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_documents_document_finalize (GObject *object)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataDocumentsDocumentPrivate *priv = GDATA_DOCUMENTS_DOCUMENT (object)->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_hash_table_unref (priv->export_links);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
G_OBJECT_CLASS (gdata_documents_document_parent_class)->finalize (object);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static gboolean
|
|
Packit |
4b6dd7 |
parse_json (GDataParsable *parsable, JsonReader *reader, gpointer user_data, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataDocumentsDocumentPrivate *priv = GDATA_DOCUMENTS_DOCUMENT (parsable)->priv;
|
|
Packit |
4b6dd7 |
gboolean success;
|
|
Packit |
4b6dd7 |
gchar *content_uri = NULL;
|
|
Packit |
4b6dd7 |
gchar *thumbnail_uri = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* JSON format: https://developers.google.com/drive/v2/reference/files */
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (gdata_parser_string_from_json_member (reader, "downloadUrl", P_DEFAULT, &content_uri, &success, error) == TRUE) {
|
|
Packit |
4b6dd7 |
if (success && content_uri != NULL && content_uri[0] != '\0')
|
|
Packit |
4b6dd7 |
gdata_entry_set_content_uri (GDATA_ENTRY (parsable), content_uri);
|
|
Packit |
4b6dd7 |
g_free (content_uri);
|
|
Packit |
4b6dd7 |
return success;
|
|
Packit |
4b6dd7 |
} else if (gdata_parser_string_from_json_member (reader, "thumbnailLink", P_DEFAULT, &thumbnail_uri, &success, error) == TRUE) {
|
|
Packit |
4b6dd7 |
if (success && thumbnail_uri != NULL && thumbnail_uri[0] != '\0') {
|
|
Packit |
4b6dd7 |
GDataLink *_link;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
_link = gdata_link_new (thumbnail_uri, "http://schemas.google.com/docs/2007/thumbnail");
|
|
Packit |
4b6dd7 |
gdata_entry_add_link (GDATA_ENTRY (parsable), _link);
|
|
Packit |
4b6dd7 |
g_object_unref (_link);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (thumbnail_uri);
|
|
Packit |
4b6dd7 |
return success;
|
|
Packit |
4b6dd7 |
} else if (g_strcmp0 (json_reader_get_member_name (reader), "exportLinks") == 0) {
|
|
Packit |
4b6dd7 |
guint i, members;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (json_reader_is_object (reader) == FALSE) {
|
|
Packit |
4b6dd7 |
g_set_error (error, GDATA_PARSER_ERROR, GDATA_PARSER_ERROR_PARSING_STRING,
|
|
Packit |
4b6dd7 |
/* Translators: the parameter is an error message */
|
|
Packit |
4b6dd7 |
_("Error parsing JSON: %s"),
|
|
Packit |
4b6dd7 |
"JSON node ‘exportLinks’ is not an object.");
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
for (i = 0, members = (guint) json_reader_count_members (reader); i < members; i++) {
|
|
Packit |
4b6dd7 |
const gchar *format;
|
|
Packit |
4b6dd7 |
gchar *uri = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_read_element (reader, i);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
format = json_reader_get_member_name (reader);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_assert (gdata_parser_string_from_json_member (reader, format, P_REQUIRED | P_NON_EMPTY, &uri, &success, NULL));
|
|
Packit |
4b6dd7 |
if (success) {
|
|
Packit |
4b6dd7 |
g_hash_table_insert (priv->export_links, g_strdup (format), uri);
|
|
Packit |
4b6dd7 |
uri = NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
json_reader_end_element (reader);
|
|
Packit |
4b6dd7 |
g_free (uri);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return GDATA_PARSABLE_CLASS (gdata_documents_document_parent_class)->parse_json (parsable, reader, user_data, error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_document_new:
|
|
Packit |
4b6dd7 |
* @id: (allow-none): the entry's ID (not the document ID), or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Creates a new #GDataDocumentsDocument with the given entry ID (#GDataEntry:id).
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): a new #GDataDocumentsDocument, or %NULL; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.13.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataDocumentsDocument *
|
|
Packit |
4b6dd7 |
gdata_documents_document_new (const gchar *id)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
return GDATA_DOCUMENTS_DOCUMENT (g_object_new (GDATA_TYPE_DOCUMENTS_DOCUMENT, "id", id, NULL));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_document_download:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsDocument
|
|
Packit |
4b6dd7 |
* @service: a #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @export_format: the format in which the document should be exported
|
|
Packit |
4b6dd7 |
* @cancellable: (allow-none): a #GCancellable for the entire download stream, or %NULL
|
|
Packit |
4b6dd7 |
* @error: a #GError, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Downloads and returns the document file represented by the #GDataDocumentsDocument. If the document doesn't exist, %NULL is returned, but no error
|
|
Packit |
4b6dd7 |
* is set in @error.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* @export_format should be the file extension of the desired output format for the document, from the list accepted by Google Documents. For example:
|
|
Packit |
4b6dd7 |
* %GDATA_DOCUMENTS_PRESENTATION_PDF, %GDATA_DOCUMENTS_SPREADSHEET_ODS or %GDATA_DOCUMENTS_TEXT_ODT.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* If @self is a #GDataDocumentsSpreadsheet, only the first grid, or sheet, in the spreadsheet will be downloaded for some export formats. To download
|
|
Packit |
4b6dd7 |
* a specific a specific grid, use gdata_documents_spreadsheet_get_download_uri() with #GDataDownloadStream to download the grid manually. See the
|
|
Packit |
4b6dd7 |
* <ulink type="http" url="https://developers.google.com/google-apps/documents-list/#downloading_spreadsheets">GData protocol
|
|
Packit |
4b6dd7 |
* specification</ulink> for more information.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* To get the content type of the downloaded file, gdata_download_stream_get_content_type() can be called on the returned #GDataDownloadStream.
|
|
Packit |
4b6dd7 |
* Calling gdata_download_stream_get_content_length() on the stream will not return a meaningful result, however, as the stream is encoded in chunks,
|
|
Packit |
4b6dd7 |
* rather than by content length.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* In order to cancel the download, a #GCancellable passed in to @cancellable must be cancelled using g_cancellable_cancel(). Cancelling the individual
|
|
Packit |
4b6dd7 |
* #GInputStream operations on the #GDataDownloadStream will not cancel the entire download; merely the read or close operation in question. See the
|
|
Packit |
4b6dd7 |
* #GDataDownloadStream:cancellable for more details.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* If the given @export_format is unrecognised or not supported for this document, %GDATA_SERVICE_ERROR_NOT_FOUND will be returned.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* If @service isn't authenticated, a %GDATA_SERVICE_ERROR_AUTHENTICATION_REQUIRED will be returned.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* If there is an error getting the document, a %GDATA_SERVICE_ERROR_PROTOCOL_ERROR error will be returned.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): a #GDataDownloadStream to download the document with, or %NULL; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.8.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataDownloadStream *
|
|
Packit |
4b6dd7 |
gdata_documents_document_download (GDataDocumentsDocument *self, GDataDocumentsService *service, const gchar *export_format, GCancellable *cancellable,
|
|
Packit |
4b6dd7 |
GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
gchar *download_uri;
|
|
Packit |
4b6dd7 |
GDataAuthorizationDomain *domain;
|
|
Packit |
4b6dd7 |
GDataDownloadStream *download_stream;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_DOCUMENT (self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_SERVICE (service), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (export_format != NULL && *export_format != '\0', NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* If we're downloading a spreadsheet we have to use a different authorization domain. */
|
|
Packit |
4b6dd7 |
if (GDATA_IS_DOCUMENTS_SPREADSHEET (self)) {
|
|
Packit |
4b6dd7 |
domain = gdata_documents_service_get_spreadsheet_authorization_domain ();
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
domain = gdata_documents_service_get_primary_authorization_domain ();
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Ensure we're authenticated first */
|
|
Packit |
4b6dd7 |
if (gdata_authorizer_is_authorized_for_domain (gdata_service_get_authorizer (GDATA_SERVICE (service)), domain) == FALSE) {
|
|
Packit |
4b6dd7 |
g_set_error_literal (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_AUTHENTICATION_REQUIRED,
|
|
Packit |
4b6dd7 |
_("You must be authenticated to download documents."));
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Get the download URI and create a stream for it */
|
|
Packit |
4b6dd7 |
download_uri = gdata_documents_document_get_download_uri (self, export_format);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (download_uri == NULL) {
|
|
Packit |
4b6dd7 |
g_set_error (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_NOT_FOUND,
|
|
Packit |
4b6dd7 |
_("Unknown or unsupported document export format ‘%s’."), export_format);
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
download_stream = GDATA_DOWNLOAD_STREAM (gdata_download_stream_new (GDATA_SERVICE (service), domain, download_uri, cancellable));
|
|
Packit |
4b6dd7 |
g_free (download_uri);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return download_stream;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_document_get_download_uri:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsDocument
|
|
Packit |
4b6dd7 |
* @export_format: the format in which the document should be exported when downloaded
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Builds and returns the download URI for the given #GDataDocumentsDocument in the desired format. Note that directly downloading the document using
|
|
Packit |
4b6dd7 |
* this URI isn't possible, as authentication is required. You should instead use gdata_download_stream_new() with the URI, and use the resulting
|
|
Packit |
4b6dd7 |
* #GInputStream.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* @export_format should be the file extension of the desired output format for the document, from the list accepted by Google Documents. For example:
|
|
Packit |
4b6dd7 |
* %GDATA_DOCUMENTS_PRESENTATION_PDF, %GDATA_DOCUMENTS_SPREADSHEET_ODS or %GDATA_DOCUMENTS_TEXT_ODT.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* If the @export_format is not recognised or not supported for this document, %NULL is returned.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (nullable): the download URI, or %NULL; free with g_free()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.7.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
gchar *
|
|
Packit |
4b6dd7 |
gdata_documents_document_get_download_uri (GDataDocumentsDocument *self, const gchar *export_format)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
const gchar *format;
|
|
Packit |
4b6dd7 |
const gchar *mime_type;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_DOCUMENT (self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (export_format != NULL && *export_format != '\0', NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (export_format, "html") == 0)
|
|
Packit |
4b6dd7 |
format = "text/html";
|
|
Packit |
4b6dd7 |
else if (g_strcmp0 (export_format, "jpeg") == 0)
|
|
Packit |
4b6dd7 |
format = "image/jpeg";
|
|
Packit |
4b6dd7 |
else if (g_strcmp0 (export_format, "pdf") == 0)
|
|
Packit |
4b6dd7 |
format = "application/pdf";
|
|
Packit |
4b6dd7 |
else if (g_strcmp0 (export_format, "png") == 0)
|
|
Packit |
4b6dd7 |
format = "image/png";
|
|
Packit |
4b6dd7 |
else if (g_strcmp0 (export_format, "txt") == 0)
|
|
Packit |
4b6dd7 |
format = "text/plain";
|
|
Packit |
4b6dd7 |
else if (g_strcmp0 (export_format, GDATA_DOCUMENTS_DRAWING_SVG) == 0)
|
|
Packit |
4b6dd7 |
format = "image/svg+xml";
|
|
Packit |
4b6dd7 |
else if (g_strcmp0 (export_format, GDATA_DOCUMENTS_PRESENTATION_PPT) == 0)
|
|
Packit |
4b6dd7 |
format = "application/vnd.openxmlformats-officedocument.presentationml.presentation";
|
|
Packit |
4b6dd7 |
else if (g_strcmp0 (export_format, GDATA_DOCUMENTS_SPREADSHEET_CSV) == 0)
|
|
Packit |
4b6dd7 |
format = "text/csv";
|
|
Packit |
4b6dd7 |
else if (g_strcmp0 (export_format, GDATA_DOCUMENTS_SPREADSHEET_ODS) == 0)
|
|
Packit |
4b6dd7 |
format = "application/x-vnd.oasis.opendocument.spreadsheet";
|
|
Packit |
4b6dd7 |
else if (g_strcmp0 (export_format, GDATA_DOCUMENTS_SPREADSHEET_XLS) == 0)
|
|
Packit |
4b6dd7 |
format = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
|
|
Packit |
4b6dd7 |
else if (g_strcmp0 (export_format, GDATA_DOCUMENTS_TEXT_ODT) == 0)
|
|
Packit |
4b6dd7 |
format = "application/vnd.oasis.opendocument.text";
|
|
Packit |
4b6dd7 |
else if (g_strcmp0 (export_format, GDATA_DOCUMENTS_TEXT_RTF) == 0)
|
|
Packit |
4b6dd7 |
format = "application/rtf";
|
|
Packit |
4b6dd7 |
else
|
|
Packit |
4b6dd7 |
format = export_format;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* We use the exportLinks JSON member to do the format conversion during download. Unfortunately, there
|
|
Packit |
4b6dd7 |
* won't be any hits if the export format matches the original MIME type. We resort to downloadUrl in
|
|
Packit |
4b6dd7 |
* those cases.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
mime_type = gdata_documents_utils_get_content_type (GDATA_DOCUMENTS_ENTRY (self));
|
|
Packit |
4b6dd7 |
if (g_content_type_equals (mime_type, format))
|
|
Packit |
4b6dd7 |
return g_strdup (gdata_entry_get_content_uri (GDATA_ENTRY (self)));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return g_strdup (g_hash_table_lookup (self->priv->export_links, format));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_document_get_thumbnail_uri:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsDocument
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the URI of the thumbnail for the #GDataDocumentsDocument. If no thumbnail exists for the document, %NULL will be returned.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The thumbnail may then be downloaded using a #GDataDownloadStream.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* <example>
|
|
Packit |
4b6dd7 |
* <title>Downloading a Document Thumbnail</title>
|
|
Packit |
4b6dd7 |
* <programlisting>
|
|
Packit |
4b6dd7 |
* GDataDocumentsService *service;
|
|
Packit |
4b6dd7 |
* const gchar *thumbnail_uri;
|
|
Packit |
4b6dd7 |
* GCancellable *cancellable;
|
|
Packit |
4b6dd7 |
* GdkPixbuf *pixbuf;
|
|
Packit |
4b6dd7 |
* GError *error = NULL;
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* service = get_my_documents_service ();
|
|
Packit |
4b6dd7 |
* thumbnail_uri = gdata_documents_document_get_thumbnail_uri (my_document);
|
|
Packit |
4b6dd7 |
* cancellable = g_cancellable_new ();
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Prepare a download stream */
|
|
Packit |
4b6dd7 |
* download_stream = GDATA_DOWNLOAD_STREAM (gdata_download_stream_new (GDATA_SERVICE (service), NULL, thumbnail_uri, cancellable));
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Download into a new GdkPixbuf. This can be cancelled using 'cancellable'. */
|
|
Packit |
4b6dd7 |
* pixbuf = gdk_pixbuf_new_from_stream (G_INPUT_STREAM (download_stream), NULL, &error);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* if (error != NULL) {
|
|
Packit |
4b6dd7 |
* /* Handle the error. */
|
|
Packit |
4b6dd7 |
* g_error_free (error);
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (download_stream);
|
|
Packit |
4b6dd7 |
* g_object_unref (cancellable);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Do something with the GdkPixbuf. */
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (pixbuf);
|
|
Packit |
4b6dd7 |
* </programlisting>
|
|
Packit |
4b6dd7 |
* </example>
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (allow-none): the URI of the document's thumbnail, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.13.1
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
const gchar *
|
|
Packit |
4b6dd7 |
gdata_documents_document_get_thumbnail_uri (GDataDocumentsDocument *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataLink *thumbnail_link;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_DOCUMENT (self), NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Get the thumbnail URI (if it exists). */
|
|
Packit |
4b6dd7 |
thumbnail_link = gdata_entry_look_up_link (GDATA_ENTRY (self), "http://schemas.google.com/docs/2007/thumbnail");
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (thumbnail_link == NULL) {
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return gdata_link_get_uri (thumbnail_link);
|
|
Packit |
4b6dd7 |
}
|