|
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) Thibault Saunier 2009 <saunierthibault@gmail.com>
|
|
Packit |
4b6dd7 |
* Copyright (C) Philip Withnall 2010, 2014 <philip@tecnocode.co.uk>
|
|
Packit |
4b6dd7 |
* Copyright (C) Red Hat, Inc. 2015, 2016
|
|
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-service
|
|
Packit |
4b6dd7 |
* @short_description: GData Documents service object
|
|
Packit |
4b6dd7 |
* @stability: Stable
|
|
Packit |
4b6dd7 |
* @include: gdata/services/documents/gdata-documents-service.h
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* #GDataDocumentsService is a subclass of #GDataService for communicating with the GData API of Google Drive. It supports querying
|
|
Packit |
4b6dd7 |
* for, inserting, editing and deleting documents, as well as a folder hierarchy.
|
|
Packit |
4b6dd7 |
* The API is named ‘documents’ rather than ‘drive’ as it used to use the Google
|
|
Packit |
4b6dd7 |
* Documents API, which has since been deprecated.
|
|
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">
|
|
Packit |
4b6dd7 |
* online documentation</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Fore more details about the spreadsheet downloads handling, see the
|
|
Packit |
4b6dd7 |
* <ulink type="http" url="http://groups.google.com/group/Google-Docs-Data-APIs/browse_thread/thread/bfc50e94e303a29a?pli=1">
|
|
Packit |
4b6dd7 |
* online explanation about the problem</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* <example>
|
|
Packit |
4b6dd7 |
* <title>Uploading a Document from Disk</title>
|
|
Packit |
4b6dd7 |
* <programlisting>
|
|
Packit |
4b6dd7 |
* GDataDocumentsService *service;
|
|
Packit |
4b6dd7 |
* GDataDocumentsDocument *document, *uploaded_document;
|
|
Packit |
4b6dd7 |
* GFile *document_file;
|
|
Packit |
4b6dd7 |
* GDataDocumentsFolder *destination_folder;
|
|
Packit |
4b6dd7 |
* GFileInfo *file_info;
|
|
Packit |
4b6dd7 |
* const gchar *slug, *content_type;
|
|
Packit |
4b6dd7 |
* GFileInputStream *file_stream;
|
|
Packit |
4b6dd7 |
* GDataUploadStream *upload_stream;
|
|
Packit |
4b6dd7 |
* GError *error = NULL;
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Create a service */
|
|
Packit |
4b6dd7 |
* service = create_documents_service ();
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Get the document file to upload and the folder to upload it into */
|
|
Packit |
4b6dd7 |
* document_file = g_file_new_for_path ("document.odt");
|
|
Packit |
4b6dd7 |
* destination_folder = query_user_for_destination_folder (service);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Get the file's display name and content type */
|
|
Packit |
4b6dd7 |
* file_info = g_file_query_info (document_file, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME "," G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
|
|
Packit |
4b6dd7 |
* G_FILE_QUERY_INFO_NONE, NULL, &error);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* if (error != NULL) {
|
|
Packit |
4b6dd7 |
* g_error ("Error getting document file information: %s", error->message);
|
|
Packit |
4b6dd7 |
* g_error_free (error);
|
|
Packit |
4b6dd7 |
* g_object_unref (destination_folder);
|
|
Packit |
4b6dd7 |
* g_object_unref (document_file);
|
|
Packit |
4b6dd7 |
* g_object_unref (service);
|
|
Packit |
4b6dd7 |
* return;
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* slug = g_file_info_get_display_name (file_info);
|
|
Packit |
4b6dd7 |
* content_type = g_file_info_get_content_type (file_info);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Get an input stream for the file */
|
|
Packit |
4b6dd7 |
* file_stream = g_file_read (document_file, NULL, &error);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (document_file);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* if (error != NULL) {
|
|
Packit |
4b6dd7 |
* g_error ("Error getting document file stream: %s", error->message);
|
|
Packit |
4b6dd7 |
* g_error_free (error);
|
|
Packit |
4b6dd7 |
* g_object_unref (file_info);
|
|
Packit |
4b6dd7 |
* g_object_unref (destination_folder);
|
|
Packit |
4b6dd7 |
* g_object_unref (service);
|
|
Packit |
4b6dd7 |
* return;
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Create the document metadata to upload */
|
|
Packit |
4b6dd7 |
* document = gdata_documents_text_new (NULL);
|
|
Packit |
4b6dd7 |
* gdata_entry_set_title (GDATA_ENTRY (document), "Document Title");
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Get an upload stream for the document */
|
|
Packit |
4b6dd7 |
* upload_stream = gdata_documents_service_upload_document (service, document, slug, content_type, destination_folder, NULL, &error);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (document);
|
|
Packit |
4b6dd7 |
* g_object_unref (file_info);
|
|
Packit |
4b6dd7 |
* g_object_unref (destination_folder);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* if (error != NULL) {
|
|
Packit |
4b6dd7 |
* g_error ("Error getting upload stream: %s", error->message);
|
|
Packit |
4b6dd7 |
* g_error_free (error);
|
|
Packit |
4b6dd7 |
* g_object_unref (file_stream);
|
|
Packit |
4b6dd7 |
* g_object_unref (service);
|
|
Packit |
4b6dd7 |
* return;
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Upload the document. This is a blocking operation, and should normally be done asynchronously. */
|
|
Packit |
4b6dd7 |
* g_output_stream_splice (G_OUTPUT_STREAM (upload_stream), G_INPUT_STREAM (file_stream),
|
|
Packit |
4b6dd7 |
* G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE | G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET, NULL, &error);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (file_stream);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* if (error != NULL) {
|
|
Packit |
4b6dd7 |
* g_error ("Error splicing streams: %s", error->message);
|
|
Packit |
4b6dd7 |
* g_error_free (error);
|
|
Packit |
4b6dd7 |
* g_object_unref (upload_stream);
|
|
Packit |
4b6dd7 |
* g_object_unref (service);
|
|
Packit |
4b6dd7 |
* return;
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Finish off the upload by parsing the returned updated document metadata entry */
|
|
Packit |
4b6dd7 |
* uploaded_document = gdata_documents_service_finish_upload (service, upload_stream, &error);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (upload_stream);
|
|
Packit |
4b6dd7 |
* g_object_unref (service);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* if (error != NULL) {
|
|
Packit |
4b6dd7 |
* g_error ("Error uploading document: %s", error->message);
|
|
Packit |
4b6dd7 |
* g_error_free (error);
|
|
Packit |
4b6dd7 |
* return;
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Do something with the uploaded document */
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (uploaded_document);
|
|
Packit |
4b6dd7 |
* </programlisting>
|
|
Packit |
4b6dd7 |
* </example>
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The Drive service can be manipulated using batch operations, too. See the
|
|
Packit |
4b6dd7 |
* <ulink type="http" url="https://developers.google.com/google-apps/documents-list/#batching_acl_requests">online documentation on batch
|
|
Packit |
4b6dd7 |
* operations</ulink> for more information.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* <example>
|
|
Packit |
4b6dd7 |
* <title>Performing a Batch Operation on Documents</title>
|
|
Packit |
4b6dd7 |
* <programlisting>
|
|
Packit |
4b6dd7 |
* GDataDocumentsService *service;
|
|
Packit |
4b6dd7 |
* GDataBatchOperation *operation;
|
|
Packit |
4b6dd7 |
* GDataFeed *feed;
|
|
Packit |
4b6dd7 |
* GDataLink *batch_link;
|
|
Packit |
4b6dd7 |
* GList *i;
|
|
Packit |
4b6dd7 |
* GError *error = NULL;
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Create a service */
|
|
Packit |
4b6dd7 |
* service = create_documents_service ();
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Create the batch operation; this requires that we have done a query first so that we can get the batch link */
|
|
Packit |
4b6dd7 |
* feed = do_some_query (service);
|
|
Packit |
4b6dd7 |
* batch_link = gdata_feed_look_up_link (feed, GDATA_LINK_BATCH);
|
|
Packit |
4b6dd7 |
* operation = gdata_batchable_create_operation (GDATA_BATCHABLE (service), gdata_link_get_uri (batch_link));
|
|
Packit |
4b6dd7 |
* g_object_unref (feed);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* gdata_batch_operation_add_query (operation, presentation_entry_id_to_query, GDATA_TYPE_DOCUMENTS_PRESENTATION,
|
|
Packit |
4b6dd7 |
* (GDataBatchOperationCallback) batch_query_cb, user_data);
|
|
Packit |
4b6dd7 |
* gdata_batch_operation_add_insertion (operation, new_entry, (GDataBatchOperationCallback) batch_insertion_cb, user_data);
|
|
Packit |
4b6dd7 |
* gdata_batch_operation_add_update (operation, old_entry, (GDataBatchOperationCallback) batch_update_cb, user_data);
|
|
Packit |
4b6dd7 |
* gdata_batch_operation_add_deletion (operation, entry_to_delete, (GDataBatchOperationCallback) batch_deletion_cb, user_data);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Run the batch operation and handle the results in the various callbacks */
|
|
Packit |
4b6dd7 |
* gdata_test_batch_operation_run (operation, NULL, &error);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (operation);
|
|
Packit |
4b6dd7 |
* g_object_unref (service);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* if (error != NULL) {
|
|
Packit |
4b6dd7 |
* g_error ("Error running batch operation: %s", error->message);
|
|
Packit |
4b6dd7 |
* g_error_free (error);
|
|
Packit |
4b6dd7 |
* return;
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* static void
|
|
Packit |
4b6dd7 |
* batch_query_cb (guint operation_id, GDataBatchOperationType operation_type, GDataEntry *entry, GError *error, gpointer user_data)
|
|
Packit |
4b6dd7 |
* {
|
|
Packit |
4b6dd7 |
* /* operation_type == GDATA_BATCH_OPERATION_QUERY */
|
|
Packit |
4b6dd7 |
* /* Reference and do something with the returned entry. */
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* static void
|
|
Packit |
4b6dd7 |
* batch_insertion_cb (guint operation_id, GDataBatchOperationType operation_type, GDataEntry *entry, GError *error, gpointer user_data)
|
|
Packit |
4b6dd7 |
* {
|
|
Packit |
4b6dd7 |
* /* operation_type == GDATA_BATCH_OPERATION_INSERTION */
|
|
Packit |
4b6dd7 |
* /* Reference and do something with the returned entry. */
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* static void
|
|
Packit |
4b6dd7 |
* batch_update_cb (guint operation_id, GDataBatchOperationType operation_type, GDataEntry *entry, GError *error, gpointer user_data)
|
|
Packit |
4b6dd7 |
* {
|
|
Packit |
4b6dd7 |
* /* operation_type == GDATA_BATCH_OPERATION_UPDATE */
|
|
Packit |
4b6dd7 |
* /* Reference and do something with the returned entry. */
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* static void
|
|
Packit |
4b6dd7 |
* batch_deletion_cb (guint operation_id, GDataBatchOperationType operation_type, GDataEntry *entry, GError *error, gpointer user_data)
|
|
Packit |
4b6dd7 |
* {
|
|
Packit |
4b6dd7 |
* /* operation_type == GDATA_BATCH_OPERATION_DELETION, entry == NULL */
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
* </programlisting>
|
|
Packit |
4b6dd7 |
* </example>
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Starred documents are denoted by being in the %GDATA_CATEGORY_SCHEMA_LABELS_STARRED category of the %GDATA_CATEGORY_SCHEMA_LABELS schema. Documents
|
|
Packit |
4b6dd7 |
* can be starred or unstarred simply by adding or removing this category from them and updating the document:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* <example>
|
|
Packit |
4b6dd7 |
* <title>Starring a Document</title>
|
|
Packit |
4b6dd7 |
* <programlisting>
|
|
Packit |
4b6dd7 |
* GDataDocumentsService *service;
|
|
Packit |
4b6dd7 |
* GDataDocumentsEntry *document, *updated_document;
|
|
Packit |
4b6dd7 |
* GDataCategory *starred_category;
|
|
Packit |
4b6dd7 |
* GError *error = NULL;
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Create a service and retrieve the document to be starred */
|
|
Packit |
4b6dd7 |
* service = create_documents_service ();
|
|
Packit |
4b6dd7 |
* document = get_document_to_be_starred (service);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Add the “starred” category to the document */
|
|
Packit |
4b6dd7 |
* starred_category = gdata_category_new (GDATA_CATEGORY_SCHEMA_LABELS_STARRED, GDATA_CATEGORY_SCHEMA_LABELS, "starred");
|
|
Packit |
4b6dd7 |
* gdata_entry_add_category (GDATA_ENTRY (document), starred_category);
|
|
Packit |
4b6dd7 |
* g_object_unref (starred_category);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Propagate the updated document to the server */
|
|
Packit |
4b6dd7 |
* updated_document = GDATA_DOCUMENTS_ENTRY (gdata_service_update_entry (GDATA_SERVICE (service),
|
|
Packit |
4b6dd7 |
* gdata_documents_service_get_primary_authorization_domain (),
|
|
Packit |
4b6dd7 |
* GDATA_ENTRY (document), 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 starring document: %s", error->message);
|
|
Packit |
4b6dd7 |
* g_error_free (error);
|
|
Packit |
4b6dd7 |
* return;
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Do something with the newly-starred document, like update it in the UI */
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (updated_document);
|
|
Packit |
4b6dd7 |
* </programlisting>
|
|
Packit |
4b6dd7 |
* </example>
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
#include <config.h>
|
|
Packit |
4b6dd7 |
#include <glib.h>
|
|
Packit |
4b6dd7 |
#include <glib/gi18n-lib.h>
|
|
Packit |
4b6dd7 |
#include <libsoup/soup.h>
|
|
Packit |
4b6dd7 |
#include <string.h>
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
#include "gdata-documents-service.h"
|
|
Packit |
4b6dd7 |
#include "gdata-documents-utils.h"
|
|
Packit |
4b6dd7 |
#include "gdata-batchable.h"
|
|
Packit |
4b6dd7 |
#include "gdata-service.h"
|
|
Packit |
4b6dd7 |
#include "gdata-private.h"
|
|
Packit |
4b6dd7 |
#include "gdata-upload-stream.h"
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
GQuark
|
|
Packit |
4b6dd7 |
gdata_documents_service_error_quark (void)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
return g_quark_from_static_string ("gdata-documents-service-error-quark");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void append_query_headers (GDataService *self, GDataAuthorizationDomain *domain, SoupMessage *message);
|
|
Packit |
4b6dd7 |
static GList *get_authorization_domains (void);
|
|
Packit |
4b6dd7 |
static gchar *_get_upload_uri_for_query_and_folder (GDataDocumentsUploadQuery *query,
|
|
Packit |
4b6dd7 |
GDataDocumentsFolder *folder) G_GNUC_WARN_UNUSED_RESULT G_GNUC_MALLOC;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
_GDATA_DEFINE_AUTHORIZATION_DOMAIN (documents, "writely", "https://www.googleapis.com/auth/drive")
|
|
Packit |
4b6dd7 |
_GDATA_DEFINE_AUTHORIZATION_DOMAIN (spreadsheets, "wise", "https://spreadsheets.google.com/feeds/")
|
|
Packit |
4b6dd7 |
G_DEFINE_TYPE_WITH_CODE (GDataDocumentsService, gdata_documents_service, GDATA_TYPE_SERVICE, G_IMPLEMENT_INTERFACE (GDATA_TYPE_BATCHABLE, NULL))
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_documents_service_class_init (GDataDocumentsServiceClass *klass)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataServiceClass *service_class = GDATA_SERVICE_CLASS (klass);
|
|
Packit |
4b6dd7 |
service_class->feed_type = GDATA_TYPE_DOCUMENTS_FEED;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
service_class->append_query_headers = append_query_headers;
|
|
Packit |
4b6dd7 |
service_class->get_authorization_domains = get_authorization_domains;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
service_class->api_version = "3";
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_documents_service_init (GDataDocumentsService *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
/* Nothing to see here */
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
append_query_headers (GDataService *self, GDataAuthorizationDomain *domain, SoupMessage *message)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_assert (message != NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (message->method == SOUP_METHOD_POST && soup_message_headers_get_one (message->request_headers, "X-Upload-Content-Length") == NULL) {
|
|
Packit |
4b6dd7 |
gchar *upload_uri;
|
|
Packit |
4b6dd7 |
const gchar *v3_pos;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
upload_uri = soup_uri_to_string (soup_message_get_uri (message), FALSE);
|
|
Packit |
4b6dd7 |
v3_pos = strstr (upload_uri, "://docs.google.com/feeds/upload/create-session/default/private/full");
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (v3_pos != NULL) {
|
|
Packit |
4b6dd7 |
gchar *v2_upload_uri;
|
|
Packit |
4b6dd7 |
SoupURI *_v2_upload_uri;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Content length header for resumable uploads. Only set it if this looks like the initial request of a resumable upload, and
|
|
Packit |
4b6dd7 |
* if no content length has been set previously.
|
|
Packit |
4b6dd7 |
* This allows methods like gdata_service_insert_entry() (which aren't resumable-upload-aware) to continue working for creating
|
|
Packit |
4b6dd7 |
* documents with metadata only, by simulating the initial request of a resumable upload as described here:
|
|
Packit |
4b6dd7 |
* https://developers.google.com/google-apps/documents-list/#creating_a_new_document_or_file_with_metadata_only */
|
|
Packit |
4b6dd7 |
soup_message_headers_replace (message->request_headers, "X-Upload-Content-Length", "0");
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Also set the encoding to be content length encoding. */
|
|
Packit |
4b6dd7 |
soup_message_headers_set_encoding (message->request_headers, SOUP_ENCODING_CONTENT_LENGTH);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* HACK: Work around http://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=3033 by changing the upload URI
|
|
Packit |
4b6dd7 |
* to the v2 API's upload URI. Grrr. */
|
|
Packit |
4b6dd7 |
v2_upload_uri = g_strconcat (_gdata_service_get_scheme (), "://docs.google.com/feeds/default/private/full",
|
|
Packit |
4b6dd7 |
v3_pos + strlen ("://docs.google.com/feeds/upload/create-session/default/private/full"), NULL);
|
|
Packit |
4b6dd7 |
_v2_upload_uri = soup_uri_new (v2_upload_uri);
|
|
Packit |
4b6dd7 |
soup_message_set_uri (message, _v2_upload_uri);
|
|
Packit |
4b6dd7 |
soup_uri_free (_v2_upload_uri);
|
|
Packit |
4b6dd7 |
g_free (v2_upload_uri);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (upload_uri);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Chain up to the parent class */
|
|
Packit |
4b6dd7 |
GDATA_SERVICE_CLASS (gdata_documents_service_parent_class)->append_query_headers (self, domain, message);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static GList *
|
|
Packit |
4b6dd7 |
get_authorization_domains (void)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GList *authorization_domains = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
authorization_domains = g_list_prepend (authorization_domains, get_documents_authorization_domain ());
|
|
Packit |
4b6dd7 |
authorization_domains = g_list_prepend (authorization_domains, get_spreadsheets_authorization_domain ());
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return authorization_domains;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_new:
|
|
Packit |
4b6dd7 |
* @authorizer: (allow-none): a #GDataAuthorizer to authorize the service's requests, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Creates a new #GDataDocumentsService using the given #GDataAuthorizer. If @authorizer is %NULL, all requests are made as an unauthenticated user.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: a new #GDataDocumentsService, or %NULL; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.9.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataDocumentsService *
|
|
Packit |
4b6dd7 |
gdata_documents_service_new (GDataAuthorizer *authorizer)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (authorizer == NULL || GDATA_IS_AUTHORIZER (authorizer), NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return g_object_new (GDATA_TYPE_DOCUMENTS_SERVICE,
|
|
Packit |
4b6dd7 |
"authorizer", authorizer,
|
|
Packit |
4b6dd7 |
NULL);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_get_primary_authorization_domain:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The primary #GDataAuthorizationDomain for interacting with Google Documents. This will not normally need to be used, as it's used internally
|
|
Packit |
4b6dd7 |
* by the #GDataDocumentsService methods. However, if using the plain #GDataService methods to implement custom queries or requests which libgdata
|
|
Packit |
4b6dd7 |
* does not support natively, then this domain may be needed to authorize the requests.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The domain never changes, and is interned so that pointer comparison can be used to differentiate it from other authorization domains.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer none): the service's authorization domain
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.9.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataAuthorizationDomain *
|
|
Packit |
4b6dd7 |
gdata_documents_service_get_primary_authorization_domain (void)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
return get_documents_authorization_domain ();
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_get_spreadsheet_authorization_domain:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The #GDataAuthorizationDomain for interacting with spreadsheet data. This will not normally need to be used, as it's automatically used internally
|
|
Packit |
4b6dd7 |
* by the #GDataDocumentsService methods. However, if using the plain #GDataService methods to implement custom queries or requests which libgdata
|
|
Packit |
4b6dd7 |
* does not support natively, then this domain may be needed to authorize the requests which pertain to the Google Spreadsheets Data API, such as
|
|
Packit |
4b6dd7 |
* requests to download or upload spreadsheet documents.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The domain never changes, and is interned so that pointer comparison can be used to differentiate it from other authorization domains.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer none): the service's authorization domain
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.9.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataAuthorizationDomain *
|
|
Packit |
4b6dd7 |
gdata_documents_service_get_spreadsheet_authorization_domain (void)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
return get_spreadsheets_authorization_domain ();
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_get_metadata:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @cancellable: (allow-none): optional #GCancellable object, or %NULL
|
|
Packit |
4b6dd7 |
* @error: a #GError, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets a #GDataDocumentsMetadata object containing metadata about the documents
|
|
Packit |
4b6dd7 |
* service itself, like how large the user quota is.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): the service's metadata object; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.17.9
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataDocumentsMetadata *
|
|
Packit |
4b6dd7 |
gdata_documents_service_get_metadata (GDataDocumentsService *self, GCancellable *cancellable, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataDocumentsMetadata *metadata;
|
|
Packit |
4b6dd7 |
const gchar *uri = "https://www.googleapis.com/drive/v2/about";
|
|
Packit |
4b6dd7 |
SoupMessage *message;
|
|
Packit |
4b6dd7 |
guint status;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self), 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 |
message = _gdata_service_build_message (GDATA_SERVICE (self), get_documents_authorization_domain (), SOUP_METHOD_GET, uri, NULL, FALSE);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Send the message */
|
|
Packit |
4b6dd7 |
status = _gdata_service_send_message (GDATA_SERVICE (self), message, cancellable, error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (status == SOUP_STATUS_NONE || status == SOUP_STATUS_CANCELLED) {
|
|
Packit |
4b6dd7 |
/* Redirect error or cancelled */
|
|
Packit |
4b6dd7 |
g_object_unref (message);
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
} else if (status != SOUP_STATUS_OK) {
|
|
Packit |
4b6dd7 |
/* Error */
|
|
Packit |
4b6dd7 |
GDataServiceClass *klass = GDATA_SERVICE_GET_CLASS (self);
|
|
Packit |
4b6dd7 |
g_assert (klass->parse_error_response != NULL);
|
|
Packit |
4b6dd7 |
klass->parse_error_response (GDATA_SERVICE (self), GDATA_OPERATION_QUERY, status, message->reason_phrase, message->response_body->data,
|
|
Packit |
4b6dd7 |
message->response_body->length, error);
|
|
Packit |
4b6dd7 |
g_object_unref (message);
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Parse the JSON; and update the entry */
|
|
Packit |
4b6dd7 |
g_assert (message->response_body->data != NULL);
|
|
Packit |
4b6dd7 |
metadata = GDATA_DOCUMENTS_METADATA (gdata_parsable_new_from_json (GDATA_TYPE_DOCUMENTS_METADATA, message->response_body->data, message->response_body->length,
|
|
Packit |
4b6dd7 |
error));
|
|
Packit |
4b6dd7 |
g_object_unref (message);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return metadata;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
get_metadata_thread (GTask *task, gpointer source_object, gpointer task_data, GCancellable *cancellable)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataDocumentsService *service = GDATA_DOCUMENTS_SERVICE (source_object);
|
|
Packit |
4b6dd7 |
g_autoptr(GDataDocumentsMetadata) metadata = NULL;
|
|
Packit |
4b6dd7 |
g_autoptr(GError) error = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Copy the metadata and return */
|
|
Packit |
4b6dd7 |
metadata = gdata_documents_service_get_metadata (service, cancellable, &error);
|
|
Packit |
4b6dd7 |
if (error != NULL)
|
|
Packit |
4b6dd7 |
g_task_return_error (task, g_steal_pointer (&error));
|
|
Packit |
4b6dd7 |
else
|
|
Packit |
4b6dd7 |
g_task_return_pointer (task, g_steal_pointer (&metadata), g_object_unref);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_get_metadata_async:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @cancellable: (allow-none): optional #GCancellable object, or %NULL
|
|
Packit |
4b6dd7 |
* @callback: a #GAsyncReadyCallback to call when the operation is finished, or %NULL
|
|
Packit |
4b6dd7 |
* @user_data: (closure): data to pass to the @callback function
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets a #GDataDocumentsMetadata object containing metadata about the documents
|
|
Packit |
4b6dd7 |
* service itself, like how large the user quota is.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more details, see gdata_documents_service_get_metadata(), which is the synchronous version of this function.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* When the operation is finished, @callback will be called. You can then call gdata_documents_service_get_metadata_finish() to get the results
|
|
Packit |
4b6dd7 |
* of the operation.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.17.9
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_documents_service_get_metadata_async (GDataDocumentsService *self, GCancellable *cancellable,
|
|
Packit |
4b6dd7 |
GAsyncReadyCallback callback, gpointer user_data)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_autoptr(GTask) task = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self));
|
|
Packit |
4b6dd7 |
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
task = g_task_new (self, cancellable, callback, user_data);
|
|
Packit |
4b6dd7 |
g_task_set_source_tag (task, gdata_documents_service_get_metadata_async);
|
|
Packit |
4b6dd7 |
g_task_run_in_thread (task, get_metadata_thread);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_get_metadata_finish:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @async_result: a #GAsyncResult
|
|
Packit |
4b6dd7 |
* @error: a #GError, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Finish an asynchronous operation to get a #GDataDocumentsMetadata started with gdata_documents_service_get_metadata_async().
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): the service's metadata object; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.17.9
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataDocumentsMetadata *
|
|
Packit |
4b6dd7 |
gdata_documents_service_get_metadata_finish (GDataDocumentsService *self, GAsyncResult *async_result, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (G_IS_ASYNC_RESULT (async_result), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (g_task_is_valid (async_result, self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (g_async_result_is_tagged (async_result, gdata_documents_service_get_metadata_async), NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return g_task_propagate_pointer (G_TASK (async_result), error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static gchar *
|
|
Packit |
4b6dd7 |
_query_documents_build_request_uri (GDataDocumentsQuery *query)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
/* If we want to query for documents contained in a folder, the URI is different.
|
|
Packit |
4b6dd7 |
* The "/[folder:id]" suffix is added by the GDataQuery later. */
|
|
Packit |
4b6dd7 |
return g_strdup ("https://www.googleapis.com/drive/v2/files");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_query_documents:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @query: (allow-none): a #GDataDocumentsQuery with the query parameters, or %NULL
|
|
Packit |
4b6dd7 |
* @cancellable: (allow-none): optional #GCancellable object, or %NULL
|
|
Packit |
4b6dd7 |
* @progress_callback: (allow-none) (scope call) (closure progress_user_data): a #GDataQueryProgressCallback to call when an entry is loaded, or %NULL
|
|
Packit |
4b6dd7 |
* @progress_user_data: (closure): data to pass to the @progress_callback function
|
|
Packit |
4b6dd7 |
* @error: a #GError, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Queries the service to return a list of documents matching the given @query. Note that @query has to be a #GDataDocumentsQuery, rather than just
|
|
Packit |
4b6dd7 |
* a #GDataQuery, as it uses the folder ID specified in #GDataDocumentsQuery:folder-id.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more details, see gdata_service_query().
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): a #GDataDocumentsFeed of query results; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.4.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataDocumentsFeed *
|
|
Packit |
4b6dd7 |
gdata_documents_service_query_documents (GDataDocumentsService *self, GDataDocumentsQuery *query, GCancellable *cancellable,
|
|
Packit |
4b6dd7 |
GDataQueryProgressCallback progress_callback, gpointer progress_user_data,
|
|
Packit |
4b6dd7 |
GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataFeed *feed;
|
|
Packit |
4b6dd7 |
gchar *request_uri;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (query == NULL || GDATA_IS_DOCUMENTS_QUERY (query), 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 |
/* Ensure we're authenticated first */
|
|
Packit |
4b6dd7 |
if (gdata_authorizer_is_authorized_for_domain (gdata_service_get_authorizer (GDATA_SERVICE (self)),
|
|
Packit |
4b6dd7 |
get_documents_authorization_domain ()) == FALSE) {
|
|
Packit |
4b6dd7 |
g_set_error_literal (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_AUTHENTICATION_REQUIRED,
|
|
Packit |
4b6dd7 |
_("You must be authenticated to query documents."));
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
request_uri = _query_documents_build_request_uri (query);
|
|
Packit |
4b6dd7 |
feed = gdata_service_query (GDATA_SERVICE (self), get_documents_authorization_domain (), request_uri, GDATA_QUERY (query),
|
|
Packit |
4b6dd7 |
GDATA_TYPE_DOCUMENTS_ENTRY, cancellable, progress_callback, progress_user_data, error);
|
|
Packit |
4b6dd7 |
g_free (request_uri);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return GDATA_DOCUMENTS_FEED (feed);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_query_documents_async:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @query: (allow-none): a #GDataDocumentsQuery with the query parameters, or %NULL
|
|
Packit |
4b6dd7 |
* @cancellable: (allow-none): optional #GCancellable object, or %NULL
|
|
Packit |
4b6dd7 |
* @progress_callback: (allow-none) (closure progress_user_data): a #GDataQueryProgressCallback to call when an entry is loaded, or %NULL
|
|
Packit |
4b6dd7 |
* @progress_user_data: (closure): data to pass to the @progress_callback function
|
|
Packit |
4b6dd7 |
* @destroy_progress_user_data: (allow-none): the function to call when @progress_callback will not be called any more, or %NULL. This function will be
|
|
Packit |
4b6dd7 |
* called with @progress_user_data as a parameter and can be used to free any memory allocated for it.
|
|
Packit |
4b6dd7 |
* @callback: a #GAsyncReadyCallback to call when authentication is finished
|
|
Packit |
4b6dd7 |
* @user_data: (closure): data to pass to the @callback function
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Queries the service to return a list of documents matching the given @query. @self and
|
|
Packit |
4b6dd7 |
* @query are both reffed when this function is called, so can safely be unreffed after this function returns.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more details, see gdata_documents_service_query_documents(), which is the synchronous version of this function,
|
|
Packit |
4b6dd7 |
* and gdata_service_query_async(), which is the base asynchronous query function.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.9.1
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_documents_service_query_documents_async (GDataDocumentsService *self, GDataDocumentsQuery *query, GCancellable *cancellable,
|
|
Packit |
4b6dd7 |
GDataQueryProgressCallback progress_callback, gpointer progress_user_data,
|
|
Packit |
4b6dd7 |
GDestroyNotify destroy_progress_user_data,
|
|
Packit |
4b6dd7 |
GAsyncReadyCallback callback, gpointer user_data)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
gchar *request_uri;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self));
|
|
Packit |
4b6dd7 |
g_return_if_fail (query == NULL || GDATA_IS_DOCUMENTS_QUERY (query));
|
|
Packit |
4b6dd7 |
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
|
Packit |
4b6dd7 |
g_return_if_fail (callback != NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Ensure we're authenticated first */
|
|
Packit |
4b6dd7 |
if (gdata_authorizer_is_authorized_for_domain (gdata_service_get_authorizer (GDATA_SERVICE (self)),
|
|
Packit |
4b6dd7 |
get_documents_authorization_domain ()) == FALSE) {
|
|
Packit |
4b6dd7 |
g_autoptr(GTask) task = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
task = g_task_new (self, cancellable, callback, user_data);
|
|
Packit |
4b6dd7 |
g_task_set_source_tag (task, gdata_service_query_async);
|
|
Packit |
4b6dd7 |
g_task_return_new_error (task, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_AUTHENTICATION_REQUIRED, "%s",
|
|
Packit |
4b6dd7 |
_("You must be authenticated to query documents."));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
request_uri = _query_documents_build_request_uri (query);
|
|
Packit |
4b6dd7 |
gdata_service_query_async (GDATA_SERVICE (self), get_documents_authorization_domain (), request_uri, GDATA_QUERY (query),
|
|
Packit |
4b6dd7 |
GDATA_TYPE_DOCUMENTS_ENTRY, cancellable, progress_callback, progress_user_data,
|
|
Packit |
4b6dd7 |
destroy_progress_user_data, callback, user_data);
|
|
Packit |
4b6dd7 |
g_free (request_uri);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
add_folder_link_to_entry (GDataDocumentsEntry *entry, GDataDocumentsFolder *folder)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataLink *_link;
|
|
Packit |
4b6dd7 |
const gchar *id;
|
|
Packit |
4b6dd7 |
gchar *uri;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* HACK: Build the GDataLink:uri from the ID by adding the prefix. */
|
|
Packit |
4b6dd7 |
id = gdata_entry_get_id (GDATA_ENTRY (folder));
|
|
Packit |
4b6dd7 |
uri = g_strconcat (GDATA_DOCUMENTS_URI_PREFIX, id, NULL);
|
|
Packit |
4b6dd7 |
_link = gdata_link_new (uri, GDATA_LINK_PARENT);
|
|
Packit |
4b6dd7 |
gdata_entry_add_link (GDATA_ENTRY (entry), _link);
|
|
Packit |
4b6dd7 |
g_object_unref (_link);
|
|
Packit |
4b6dd7 |
g_free (uri);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static GDataUploadStream *
|
|
Packit |
4b6dd7 |
upload_update_document (GDataDocumentsService *self, GDataDocumentsDocument *document, const gchar *slug, const gchar *content_type,
|
|
Packit |
4b6dd7 |
GDataDocumentsFolder *folder, goffset content_length, const gchar *method, const gchar *upload_uri,
|
|
Packit |
4b6dd7 |
GCancellable *cancellable)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
/* HACK: Corrects a bug on spreadsheet content types handling
|
|
Packit |
4b6dd7 |
* The content type for ODF spreadsheets is "application/vnd.oasis.opendocument.spreadsheet" for my ODF spreadsheet;
|
|
Packit |
4b6dd7 |
* but Google Documents' spreadsheet service is waiting for "application/x-vnd.oasis.opendocument.spreadsheet"
|
|
Packit |
4b6dd7 |
* and nothing else.
|
|
Packit |
4b6dd7 |
* Bug filed with Google: http://code.google.com/p/gdata-issues/issues/detail?id=1127 */
|
|
Packit |
4b6dd7 |
if (strcmp (content_type, "application/vnd.oasis.opendocument.spreadsheet") == 0)
|
|
Packit |
4b6dd7 |
content_type = "application/x-vnd.oasis.opendocument.spreadsheet";
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (folder != NULL)
|
|
Packit |
4b6dd7 |
add_folder_link_to_entry (GDATA_DOCUMENTS_ENTRY (document), folder);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* We need streaming file I/O: GDataUploadStream */
|
|
Packit |
4b6dd7 |
if (content_length == -1) {
|
|
Packit |
4b6dd7 |
/* Non-resumable upload. */
|
|
Packit |
4b6dd7 |
return GDATA_UPLOAD_STREAM (gdata_upload_stream_new (GDATA_SERVICE (self), get_documents_authorization_domain (), method, upload_uri,
|
|
Packit |
4b6dd7 |
GDATA_ENTRY (document), slug, content_type, cancellable));
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
/* Resumable upload. */
|
|
Packit |
4b6dd7 |
return GDATA_UPLOAD_STREAM (gdata_upload_stream_new_resumable (GDATA_SERVICE (self), get_documents_authorization_domain (), method,
|
|
Packit |
4b6dd7 |
upload_uri, GDATA_ENTRY (document), slug, content_type, content_length,
|
|
Packit |
4b6dd7 |
cancellable));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static gboolean
|
|
Packit |
4b6dd7 |
_upload_checks (GDataDocumentsService *self, GDataDocumentsDocument *document, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
if (gdata_authorizer_is_authorized_for_domain (gdata_service_get_authorizer (GDATA_SERVICE (self)),
|
|
Packit |
4b6dd7 |
get_documents_authorization_domain ()) == FALSE) {
|
|
Packit |
4b6dd7 |
g_set_error_literal (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_AUTHENTICATION_REQUIRED,
|
|
Packit |
4b6dd7 |
_("You must be authenticated to upload documents."));
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (document != NULL && gdata_entry_is_inserted (GDATA_ENTRY (document)) == TRUE) {
|
|
Packit |
4b6dd7 |
g_set_error_literal (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_ENTRY_ALREADY_INSERTED,
|
|
Packit |
4b6dd7 |
_("The document has already been uploaded."));
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_upload_document:
|
|
Packit |
4b6dd7 |
* @self: an authenticated #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @document: (allow-none): the #GDataDocumentsDocument to insert, or %NULL
|
|
Packit |
4b6dd7 |
* @slug: the filename to give to the uploaded document
|
|
Packit |
4b6dd7 |
* @content_type: the content type of the uploaded data
|
|
Packit |
4b6dd7 |
* @folder: (allow-none): the folder to which the document should be uploaded, or %NULL
|
|
Packit |
4b6dd7 |
* @cancellable: (allow-none): a #GCancellable for the entire upload stream, or %NULL
|
|
Packit |
4b6dd7 |
* @error: a #GError, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Uploads a document to Google Documents, using the properties from @document and the document data written to the resulting #GDataUploadStream. If
|
|
Packit |
4b6dd7 |
* the document data does not need to be provided at the moment, just the metadata, use gdata_service_insert_entry() instead (e.g. in the case of
|
|
Packit |
4b6dd7 |
* creating a new, empty file to be edited at a later date).
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* This performs a non-resumable upload, unlike gdata_documents_service_upload_document(). This means that errors during transmission will cause the
|
|
Packit |
4b6dd7 |
* upload to fail, and the entire document will have to be re-uploaded. It is recommended that gdata_documents_service_upload_document_resumable()
|
|
Packit |
4b6dd7 |
* be used instead.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* If @document is %NULL, only the document data will be uploaded. The new document entry will be named using @slug, and will have default metadata.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The stream returned by this function should be written to using the standard #GOutputStream methods, asychronously or synchronously. Once the stream
|
|
Packit |
4b6dd7 |
* is closed (using g_output_stream_close()), gdata_documents_service_finish_upload() should be called on it to parse and return the updated
|
|
Packit |
4b6dd7 |
* #GDataDocumentsDocument for the document. This must be done, as @document isn't updated in-place.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* In order to cancel the upload, a #GCancellable passed in to @cancellable must be cancelled using g_cancellable_cancel(). Cancelling the individual
|
|
Packit |
4b6dd7 |
* #GOutputStream operations on the #GDataUploadStream will not cancel the entire upload; merely the write or close operation in question. See the
|
|
Packit |
4b6dd7 |
* #GDataUploadStream:cancellable for more details.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Any upload errors will be thrown by the stream methods, and may come from the #GDataServiceError domain.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): a #GDataUploadStream to write the document data to, or %NULL; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.8.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataUploadStream *
|
|
Packit |
4b6dd7 |
gdata_documents_service_upload_document (GDataDocumentsService *self, GDataDocumentsDocument *document, const gchar *slug, const gchar *content_type,
|
|
Packit |
4b6dd7 |
GDataDocumentsFolder *folder, GCancellable *cancellable, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataUploadStream *upload_stream;
|
|
Packit |
4b6dd7 |
gchar *upload_uri;
|
|
Packit |
4b6dd7 |
gchar *upload_uri_prefix;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (document == NULL || GDATA_IS_DOCUMENTS_DOCUMENT (document), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (slug != NULL && *slug != '\0', NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (content_type != NULL && *content_type != '\0', NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (folder == NULL || GDATA_IS_DOCUMENTS_FOLDER (folder), 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 (_upload_checks (self, document, error) == FALSE) {
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
upload_uri_prefix = gdata_documents_service_get_upload_uri (folder);
|
|
Packit |
4b6dd7 |
upload_uri = g_strconcat (upload_uri_prefix, "?uploadType=multipart", NULL);
|
|
Packit |
4b6dd7 |
upload_stream = upload_update_document (self, document, slug, content_type, folder, -1, SOUP_METHOD_POST, upload_uri, cancellable);
|
|
Packit |
4b6dd7 |
g_free (upload_uri);
|
|
Packit |
4b6dd7 |
g_free (upload_uri_prefix);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return upload_stream;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_upload_document_resumable:
|
|
Packit |
4b6dd7 |
* @self: an authenticated #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @document: (allow-none): the #GDataDocumentsDocument to insert, or %NULL
|
|
Packit |
4b6dd7 |
* @slug: the filename to give to the uploaded document
|
|
Packit |
4b6dd7 |
* @content_type: the content type of the uploaded data
|
|
Packit |
4b6dd7 |
* @content_length: the size (in bytes) of the file being uploaded
|
|
Packit |
4b6dd7 |
* @query: (allow-none): a query specifying parameters for the upload, or %NULL
|
|
Packit |
4b6dd7 |
* @cancellable: (allow-none): a #GCancellable for the entire upload stream, or %NULL
|
|
Packit |
4b6dd7 |
* @error: a #GError, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Uploads a document to Google Documents, using the properties from @document and the document data written to the resulting #GDataUploadStream. If
|
|
Packit |
4b6dd7 |
* the document data does not need to be provided at the moment, just the metadata, use gdata_service_insert_entry() instead (e.g. in the case of
|
|
Packit |
4b6dd7 |
* creating a new, empty file to be edited at a later date).
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Unlike gdata_documents_service_upload_document(), this method performs a
|
|
Packit |
4b6dd7 |
* <ulink type="http" url="http://code.google.com/apis/gdata/docs/resumable_upload.html">resumable upload</ulink> which allows for correction of
|
|
Packit |
4b6dd7 |
* transmission errors without re-uploading the entire file. Use of this method is preferred over gdata_documents_service_upload_document().
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* If @document is %NULL, only the document data will be uploaded. The new document entry will be named using @slug, and will have default metadata.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* If non-%NULL, the @query specifies parameters for the upload, such as a #GDataDocumentsFolder to upload the document into; and whether to treat
|
|
Packit |
4b6dd7 |
* the document as an opaque file, or convert it to a standard format. If @query is %NULL, the document will be uploaded into the root folder, and
|
|
Packit |
4b6dd7 |
* automatically converted to a standard format. No OCR or automatic language translation will be performed by default.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* If @query is non-%NULL and #GDataDocumentsUploadQuery:convert is %FALSE, @document must be an instance of #GDataDocumentsDocument. Otherwise,
|
|
Packit |
4b6dd7 |
* @document must be a subclass of it, such as #GDataDocumentsPresentation.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The stream returned by this function should be written to using the standard #GOutputStream methods, asychronously or synchronously. Once the stream
|
|
Packit |
4b6dd7 |
* is closed (using g_output_stream_close()), gdata_documents_service_finish_upload() should be called on it to parse and return the updated
|
|
Packit |
4b6dd7 |
* #GDataDocumentsDocument for the document. This must be done, as @document isn't updated in-place.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* In order to cancel the upload, a #GCancellable passed in to @cancellable must be cancelled using g_cancellable_cancel(). Cancelling the individual
|
|
Packit |
4b6dd7 |
* #GOutputStream operations on the #GDataUploadStream will not cancel the entire upload; merely the write or close operation in question. See the
|
|
Packit |
4b6dd7 |
* #GDataUploadStream:cancellable for more details.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Any upload errors will be thrown by the stream methods, and may come from the #GDataServiceError domain.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): a #GDataUploadStream to write the document data to, or %NULL; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.13.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataUploadStream *
|
|
Packit |
4b6dd7 |
gdata_documents_service_upload_document_resumable (GDataDocumentsService *self, GDataDocumentsDocument *document, const gchar *slug,
|
|
Packit |
4b6dd7 |
const gchar *content_type, goffset content_length, GDataDocumentsUploadQuery *query,
|
|
Packit |
4b6dd7 |
GCancellable *cancellable, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataUploadStream *upload_stream;
|
|
Packit |
4b6dd7 |
gchar *upload_uri;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (document == NULL || GDATA_IS_DOCUMENTS_DOCUMENT (document), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (slug != NULL && *slug != '\0', NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (content_type != NULL && *content_type != '\0', NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (query == NULL || GDATA_IS_DOCUMENTS_UPLOAD_QUERY (query), 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 (_upload_checks (self, document, error) == FALSE) {
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
upload_uri = _get_upload_uri_for_query_and_folder (query, NULL);
|
|
Packit |
4b6dd7 |
upload_stream = upload_update_document (self, document, slug, content_type, NULL, content_length, SOUP_METHOD_POST, upload_uri, cancellable);
|
|
Packit |
4b6dd7 |
g_free (upload_uri);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return upload_stream;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static gboolean
|
|
Packit |
4b6dd7 |
_update_checks (GDataDocumentsService *self, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
if (gdata_authorizer_is_authorized_for_domain (gdata_service_get_authorizer (GDATA_SERVICE (self)),
|
|
Packit |
4b6dd7 |
get_documents_authorization_domain ()) == FALSE) {
|
|
Packit |
4b6dd7 |
g_set_error_literal (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_AUTHENTICATION_REQUIRED,
|
|
Packit |
4b6dd7 |
_("You must be authenticated to update documents."));
|
|
Packit |
4b6dd7 |
return FALSE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_update_document:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @document: the #GDataDocumentsDocument to update
|
|
Packit |
4b6dd7 |
* @slug: the filename to give to the uploaded document
|
|
Packit |
4b6dd7 |
* @content_type: the content type of the uploaded data
|
|
Packit |
4b6dd7 |
* @cancellable: (allow-none): a #GCancellable for the entire upload stream, or %NULL
|
|
Packit |
4b6dd7 |
* @error: a #GError, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Update the document using the properties from @document and the document data written to the resulting #GDataUploadStream. If the document data does
|
|
Packit |
4b6dd7 |
* not need to be changed, just the metadata, use gdata_service_update_entry() instead.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* This performs a non-resumable upload, unlike gdata_documents_service_update_document(). This means that errors during transmission will cause the
|
|
Packit |
4b6dd7 |
* upload to fail, and the entire document will have to be re-uploaded. It is recommended that gdata_documents_service_update_document_resumable()
|
|
Packit |
4b6dd7 |
* be used instead.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The stream returned by this function should be written to using the standard #GOutputStream methods, asychronously or synchronously. Once the stream
|
|
Packit |
4b6dd7 |
* is closed (using g_output_stream_close()), gdata_documents_service_finish_upload() should be called on it to parse and return the updated
|
|
Packit |
4b6dd7 |
* #GDataDocumentsDocument for the document. This must be done, as @document isn't updated in-place.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* In order to cancel the update, a #GCancellable passed in to @cancellable must be cancelled using g_cancellable_cancel(). Cancelling the individual
|
|
Packit |
4b6dd7 |
* #GOutputStream operations on the #GDataUploadStream will not cancel the entire update; merely the write or close operation in question. See the
|
|
Packit |
4b6dd7 |
* #GDataUploadStream:cancellable for more details.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Any upload errors will be thrown by the stream methods, and may come from the #GDataServiceError domain.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see gdata_service_update_entry().
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): a #GDataUploadStream to write the document data to; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.8.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataUploadStream *
|
|
Packit |
4b6dd7 |
gdata_documents_service_update_document (GDataDocumentsService *self, GDataDocumentsDocument *document, const gchar *slug, const gchar *content_type,
|
|
Packit |
4b6dd7 |
GCancellable *cancellable, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataUploadStream *update_stream;
|
|
Packit |
4b6dd7 |
const gchar *id;
|
|
Packit |
4b6dd7 |
gchar *update_uri;
|
|
Packit |
4b6dd7 |
gchar *update_uri_prefix;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_DOCUMENT (document), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (slug != NULL && *slug != '\0', NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (content_type != NULL && *content_type != '\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 (_update_checks (self, error) == FALSE) {
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
update_uri_prefix = gdata_documents_service_get_upload_uri (NULL);
|
|
Packit |
4b6dd7 |
id = gdata_entry_get_id (GDATA_ENTRY (document));
|
|
Packit |
4b6dd7 |
update_uri = g_strconcat (update_uri_prefix, "/", id, "?uploadType=multipart", NULL);
|
|
Packit |
4b6dd7 |
update_stream = upload_update_document (self, document, slug, content_type, NULL, -1, SOUP_METHOD_PUT, update_uri, cancellable);
|
|
Packit |
4b6dd7 |
g_free (update_uri);
|
|
Packit |
4b6dd7 |
g_free (update_uri_prefix);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return update_stream;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_update_document_resumable:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @document: the #GDataDocumentsDocument to update
|
|
Packit |
4b6dd7 |
* @slug: the filename to give to the uploaded document
|
|
Packit |
4b6dd7 |
* @content_type: the content type of the uploaded data
|
|
Packit |
4b6dd7 |
* @content_length: the size (in bytes) of the file being uploaded
|
|
Packit |
4b6dd7 |
* @cancellable: (allow-none): a #GCancellable for the entire upload stream, or %NULL
|
|
Packit |
4b6dd7 |
* @error: a #GError, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Update the document using the properties from @document and the document data written to the resulting #GDataUploadStream. If the document data does
|
|
Packit |
4b6dd7 |
* not need to be changed, just the metadata, use gdata_service_update_entry() instead.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Unlike gdata_documents_service_update_document(), this method performs a
|
|
Packit |
4b6dd7 |
* <ulink type="http" url="http://code.google.com/apis/gdata/docs/resumable_upload.html">resumable upload</ulink> which allows for correction of
|
|
Packit |
4b6dd7 |
* transmission errors without re-uploading the entire file. Use of this method is preferred over gdata_documents_service_update_document().
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The stream returned by this function should be written to using the standard #GOutputStream methods, asychronously or synchronously. Once the stream
|
|
Packit |
4b6dd7 |
* is closed (using g_output_stream_close()), gdata_documents_service_finish_upload() should be called on it to parse and return the updated
|
|
Packit |
4b6dd7 |
* #GDataDocumentsDocument for the document. This must be done, as @document isn't updated in-place.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* In order to cancel the update, a #GCancellable passed in to @cancellable must be cancelled using g_cancellable_cancel(). Cancelling the individual
|
|
Packit |
4b6dd7 |
* #GOutputStream operations on the #GDataUploadStream will not cancel the entire update; merely the write or close operation in question. See the
|
|
Packit |
4b6dd7 |
* #GDataUploadStream:cancellable for more details.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Any upload errors will be thrown by the stream methods, and may come from the #GDataServiceError domain.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see gdata_service_update_entry().
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): a #GDataUploadStream to write the document data to; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.13.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataUploadStream *
|
|
Packit |
4b6dd7 |
gdata_documents_service_update_document_resumable (GDataDocumentsService *self, GDataDocumentsDocument *document, const gchar *slug,
|
|
Packit |
4b6dd7 |
const gchar *content_type, goffset content_length, GCancellable *cancellable, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataLink *update_link;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_DOCUMENT (document), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (slug != NULL && *slug != '\0', NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (content_type != NULL && *content_type != '\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 (_update_checks (self, error) == FALSE) {
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
update_link = gdata_entry_look_up_link (GDATA_ENTRY (document), GDATA_LINK_RESUMABLE_EDIT_MEDIA);
|
|
Packit |
4b6dd7 |
g_assert (update_link != NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return upload_update_document (self, document, slug, content_type, NULL, content_length, SOUP_METHOD_PUT, gdata_link_get_uri (update_link),
|
|
Packit |
4b6dd7 |
cancellable);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_finish_upload:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @upload_stream: the #GDataUploadStream from the operation
|
|
Packit |
4b6dd7 |
* @error: a #GError, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Finish off a document upload or update operation started by gdata_documents_service_upload_document() or gdata_documents_service_update_document(),
|
|
Packit |
4b6dd7 |
* parsing the result and returning the new or updated #GDataDocumentsDocument.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* If an error occurred during the upload or update operation, it will have been returned during the operation (e.g. by g_output_stream_splice() or one
|
|
Packit |
4b6dd7 |
* of the other stream methods). In such a case, %NULL will be returned but @error will remain unset. @error is only set in the case that the server
|
|
Packit |
4b6dd7 |
* indicates that the operation was successful, but an error is encountered in parsing the result sent by the server.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* In the case that no #GDataDocumentsDocument was passed (to gdata_documents_service_upload_document() or gdata_documents_service_update_document())
|
|
Packit |
4b6dd7 |
* when starting the operation, %GDATA_DOCUMENTS_SERVICE_ERROR_INVALID_CONTENT_TYPE will be thrown in @error if the content type of the uploaded data
|
|
Packit |
4b6dd7 |
* could not be mapped to a document type with which to interpret the response from the server.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): the new or updated #GDataDocumentsDocument, or %NULL; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.8.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataDocumentsDocument *
|
|
Packit |
4b6dd7 |
gdata_documents_service_finish_upload (GDataDocumentsService *self, GDataUploadStream *upload_stream, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
const gchar *content_type;
|
|
Packit |
4b6dd7 |
const gchar *response_body;
|
|
Packit |
4b6dd7 |
gssize response_length;
|
|
Packit |
4b6dd7 |
GType new_document_type = G_TYPE_INVALID;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Get and parse the response from the server */
|
|
Packit |
4b6dd7 |
response_body = gdata_upload_stream_get_response (upload_stream, &response_length);
|
|
Packit |
4b6dd7 |
if (response_body == NULL || response_length == 0) {
|
|
Packit |
4b6dd7 |
/* Error will have been set by the upload stream. */
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
content_type = gdata_upload_stream_get_content_type (upload_stream);
|
|
Packit |
4b6dd7 |
new_document_type = gdata_documents_utils_get_type_from_content_type (content_type);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (g_type_is_a (new_document_type, GDATA_TYPE_DOCUMENTS_DOCUMENT) == FALSE) {
|
|
Packit |
4b6dd7 |
g_set_error (error, GDATA_DOCUMENTS_SERVICE_ERROR, GDATA_DOCUMENTS_SERVICE_ERROR_INVALID_CONTENT_TYPE,
|
|
Packit |
4b6dd7 |
_("The content type of the supplied document (‘%s’) could not be recognized."),
|
|
Packit |
4b6dd7 |
content_type);
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return GDATA_DOCUMENTS_DOCUMENT (gdata_parsable_new_from_json (new_document_type, response_body, (gint) response_length, error));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_copy_document:
|
|
Packit |
4b6dd7 |
* @self: an authenticated #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @document: the #GDataDocumentsDocument to copy
|
|
Packit |
4b6dd7 |
* @cancellable: (allow-none): optional #GCancellable object, or %NULL
|
|
Packit |
4b6dd7 |
* @error: a #GError, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Copy the given @document, producing a duplicate document in the same folder and returning its #GDataDocumentsDocument.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Errors from #GDataServiceError can be returned for exceptional conditions, as determined by the server.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): the duplicate #GDataDocumentsDocument, or %NULL; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.13.1
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataDocumentsDocument *
|
|
Packit |
4b6dd7 |
gdata_documents_service_copy_document (GDataDocumentsService *self, GDataDocumentsDocument *document, GCancellable *cancellable, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataDocumentsDocument *new_document;
|
|
Packit |
4b6dd7 |
GDataEntry *parent = NULL;
|
|
Packit |
4b6dd7 |
GList *i;
|
|
Packit |
4b6dd7 |
GList *parent_folders_list;
|
|
Packit |
4b6dd7 |
const gchar *parent_id = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_DOCUMENT (document), 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 (gdata_authorizer_is_authorized_for_domain (gdata_service_get_authorizer (GDATA_SERVICE (self)),
|
|
Packit |
4b6dd7 |
get_documents_authorization_domain ()) == FALSE) {
|
|
Packit |
4b6dd7 |
g_set_error_literal (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_AUTHENTICATION_REQUIRED,
|
|
Packit |
4b6dd7 |
_("You must be authenticated to copy documents."));
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
parent_folders_list = gdata_entry_look_up_links (GDATA_ENTRY (document), GDATA_LINK_PARENT);
|
|
Packit |
4b6dd7 |
for (i = parent_folders_list; i != NULL; i = i->next) {
|
|
Packit |
4b6dd7 |
GDataLink *_link = GDATA_LINK (i->data);
|
|
Packit |
4b6dd7 |
const gchar *id;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
id = gdata_documents_utils_get_id_from_link (_link);
|
|
Packit |
4b6dd7 |
if (id != NULL) {
|
|
Packit |
4b6dd7 |
parent_id = id;
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_list_free (parent_folders_list);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (parent_id == NULL) {
|
|
Packit |
4b6dd7 |
g_set_error_literal (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_NOT_FOUND, _("Parent folder not found"));
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
parent = gdata_service_query_single_entry (GDATA_SERVICE (self), get_documents_authorization_domain (), parent_id, NULL, GDATA_TYPE_DOCUMENTS_FOLDER, cancellable, error);
|
|
Packit |
4b6dd7 |
if (parent == NULL)
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
new_document = GDATA_DOCUMENTS_DOCUMENT (gdata_documents_service_add_entry_to_folder (self, GDATA_DOCUMENTS_ENTRY (document), GDATA_DOCUMENTS_FOLDER (parent), cancellable, error));
|
|
Packit |
4b6dd7 |
g_object_unref (parent);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return new_document;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
copy_document_thread (GTask *task, gpointer source_object, gpointer task_data, GCancellable *cancellable)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataDocumentsService *service = GDATA_DOCUMENTS_SERVICE (source_object);
|
|
Packit |
4b6dd7 |
GDataDocumentsDocument *document = task_data;
|
|
Packit |
4b6dd7 |
g_autoptr(GDataDocumentsDocument) new_document = NULL;
|
|
Packit |
4b6dd7 |
g_autoptr(GError) error = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Copy the document and return */
|
|
Packit |
4b6dd7 |
new_document = gdata_documents_service_copy_document (service, document, cancellable, &error);
|
|
Packit |
4b6dd7 |
if (error != NULL)
|
|
Packit |
4b6dd7 |
g_task_return_error (task, g_steal_pointer (&error));
|
|
Packit |
4b6dd7 |
else
|
|
Packit |
4b6dd7 |
g_task_return_pointer (task, g_steal_pointer (&new_document), g_object_unref);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_copy_document_async:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @document: the #GDataDocumentsDocument to copy
|
|
Packit |
4b6dd7 |
* @cancellable: (allow-none): optional #GCancellable object, or %NULL
|
|
Packit |
4b6dd7 |
* @callback: a #GAsyncReadyCallback to call when the operation is finished, or %NULL
|
|
Packit |
4b6dd7 |
* @user_data: (closure): data to pass to the @callback function
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Copy the given @document, producing a duplicate document in the same folder and returning its #GDataDocumentsDocument. @self and @document are
|
|
Packit |
4b6dd7 |
* both reffed when this function is called, so can safely be unreffed after this function returns.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more details, see gdata_documents_service_copy_document(), which is the synchronous version of this function.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* When the operation is finished, @callback will be called. You can then call gdata_documents_service_copy_document_finish() to get the results
|
|
Packit |
4b6dd7 |
* of the operation.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.13.1
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_documents_service_copy_document_async (GDataDocumentsService *self, GDataDocumentsDocument *document, GCancellable *cancellable,
|
|
Packit |
4b6dd7 |
GAsyncReadyCallback callback, gpointer user_data)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_autoptr(GTask) task = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self));
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_DOCUMENTS_DOCUMENT (document));
|
|
Packit |
4b6dd7 |
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
task = g_task_new (self, cancellable, callback, user_data);
|
|
Packit |
4b6dd7 |
g_task_set_source_tag (task, gdata_documents_service_copy_document_async);
|
|
Packit |
4b6dd7 |
g_task_set_task_data (task, g_object_ref (document), (GDestroyNotify) g_object_unref);
|
|
Packit |
4b6dd7 |
g_task_run_in_thread (task, copy_document_thread);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_copy_document_finish:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @async_result: a #GAsyncResult
|
|
Packit |
4b6dd7 |
* @error: a #GError, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Finish an asynchronous operation to copy a #GDataDocumentsDocument started with gdata_documents_service_copy_document_async().
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): the duplicate #GDataDocumentsDocument, or %NULL; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.13.1
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataDocumentsDocument *
|
|
Packit |
4b6dd7 |
gdata_documents_service_copy_document_finish (GDataDocumentsService *self, GAsyncResult *async_result, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (G_IS_ASYNC_RESULT (async_result), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (g_task_is_valid (async_result, self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (g_async_result_is_tagged (async_result, gdata_documents_service_copy_document_async), NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return g_task_propagate_pointer (G_TASK (async_result), error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_add_entry_to_folder:
|
|
Packit |
4b6dd7 |
* @self: an authenticated #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @entry: the #GDataDocumentsEntry to copy
|
|
Packit |
4b6dd7 |
* @folder: the #GDataDocumentsFolder to copy @entry into
|
|
Packit |
4b6dd7 |
* @cancellable: (allow-none): optional #GCancellable object, or %NULL
|
|
Packit |
4b6dd7 |
* @error: a #GError, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Add the given @entry to the specified @folder, and return an updated #GDataDocumentsEntry for @entry. If the @entry is already in another folder,
|
|
Packit |
4b6dd7 |
* a copy will be added to the new folder. The copy and original will have different IDs. Note that @entry can't be a #GDataDocumentsFolder that
|
|
Packit |
4b6dd7 |
* already exists on the server. It can be a new #GDataDocumentsFolder, or a #GDataDocumentsDocument that is either new or already present on the
|
|
Packit |
4b6dd7 |
* server.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Errors from #GDataServiceError can be returned for exceptional conditions, as determined by the server.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): an updated #GDataDocumentsEntry, or %NULL; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.8.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataDocumentsEntry *
|
|
Packit |
4b6dd7 |
gdata_documents_service_add_entry_to_folder (GDataDocumentsService *self, GDataDocumentsEntry *entry, GDataDocumentsFolder *folder,
|
|
Packit |
4b6dd7 |
GCancellable *cancellable, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataDocumentsEntry *new_entry;
|
|
Packit |
4b6dd7 |
GDataDocumentsEntry *local_entry;
|
|
Packit |
4b6dd7 |
GDataOperationType operation_type;
|
|
Packit |
4b6dd7 |
GType entry_type;
|
|
Packit |
4b6dd7 |
const gchar *content_type;
|
|
Packit |
4b6dd7 |
const gchar *etag;
|
|
Packit |
4b6dd7 |
const gchar *title;
|
|
Packit |
4b6dd7 |
const gchar *uri_prefix = "https://www.googleapis.com/drive/v2/files";
|
|
Packit |
4b6dd7 |
gchar *upload_data;
|
|
Packit |
4b6dd7 |
gchar *uri;
|
|
Packit |
4b6dd7 |
SoupMessage *message;
|
|
Packit |
4b6dd7 |
guint status;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_ENTRY (entry), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_FOLDER (folder), 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 (gdata_authorizer_is_authorized_for_domain (gdata_service_get_authorizer (GDATA_SERVICE (self)),
|
|
Packit |
4b6dd7 |
get_documents_authorization_domain ()) == FALSE) {
|
|
Packit |
4b6dd7 |
g_set_error_literal (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_AUTHENTICATION_REQUIRED,
|
|
Packit |
4b6dd7 |
_("You must be authenticated to insert or move documents and folders."));
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (gdata_entry_is_inserted (GDATA_ENTRY (entry)) == TRUE) {
|
|
Packit |
4b6dd7 |
const gchar *id;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
id = gdata_entry_get_id (GDATA_ENTRY (entry));
|
|
Packit |
4b6dd7 |
uri = g_strconcat (uri_prefix, "/", id, "/copy", NULL);
|
|
Packit |
4b6dd7 |
operation_type = GDATA_OPERATION_UPDATE;
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
uri = g_strdup (uri_prefix);
|
|
Packit |
4b6dd7 |
operation_type = GDATA_OPERATION_INSERTION;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
entry_type = G_OBJECT_TYPE (entry);
|
|
Packit |
4b6dd7 |
content_type = gdata_documents_utils_get_content_type (entry);
|
|
Packit |
4b6dd7 |
etag = gdata_entry_get_etag (GDATA_ENTRY (entry));
|
|
Packit |
4b6dd7 |
title = gdata_entry_get_title (GDATA_ENTRY (entry));
|
|
Packit |
4b6dd7 |
local_entry = g_object_new (entry_type, "etag", etag, "title", title, NULL);
|
|
Packit |
4b6dd7 |
gdata_documents_utils_add_content_type (local_entry, content_type);
|
|
Packit |
4b6dd7 |
add_folder_link_to_entry (local_entry, folder);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
message = _gdata_service_build_message (GDATA_SERVICE (self), get_documents_authorization_domain (), SOUP_METHOD_POST, uri, NULL, FALSE);
|
|
Packit |
4b6dd7 |
g_free (uri);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Append the data */
|
|
Packit |
4b6dd7 |
upload_data = gdata_parsable_get_json (GDATA_PARSABLE (local_entry));
|
|
Packit |
4b6dd7 |
soup_message_set_request (message, "application/json", SOUP_MEMORY_TAKE, upload_data, strlen (upload_data));
|
|
Packit |
4b6dd7 |
g_object_unref (local_entry);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Send the message */
|
|
Packit |
4b6dd7 |
status = _gdata_service_send_message (GDATA_SERVICE (self), message, cancellable, error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (status == SOUP_STATUS_NONE || status == SOUP_STATUS_CANCELLED) {
|
|
Packit |
4b6dd7 |
/* Redirect error or cancelled */
|
|
Packit |
4b6dd7 |
g_object_unref (message);
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
} else if (status != SOUP_STATUS_OK) {
|
|
Packit |
4b6dd7 |
/* Error */
|
|
Packit |
4b6dd7 |
GDataServiceClass *klass = GDATA_SERVICE_GET_CLASS (self);
|
|
Packit |
4b6dd7 |
g_assert (klass->parse_error_response != NULL);
|
|
Packit |
4b6dd7 |
klass->parse_error_response (GDATA_SERVICE (self), operation_type, status, message->reason_phrase, message->response_body->data,
|
|
Packit |
4b6dd7 |
message->response_body->length, error);
|
|
Packit |
4b6dd7 |
g_object_unref (message);
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Parse the JSON; and update the entry */
|
|
Packit |
4b6dd7 |
g_assert (message->response_body->data != NULL);
|
|
Packit |
4b6dd7 |
new_entry = GDATA_DOCUMENTS_ENTRY (gdata_parsable_new_from_json (entry_type, message->response_body->data, message->response_body->length,
|
|
Packit |
4b6dd7 |
error));
|
|
Packit |
4b6dd7 |
g_object_unref (message);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return new_entry;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
typedef struct {
|
|
Packit |
4b6dd7 |
GDataDocumentsEntry *entry;
|
|
Packit |
4b6dd7 |
GDataDocumentsFolder *folder;
|
|
Packit |
4b6dd7 |
} AddEntryToFolderData;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
add_entry_to_folder_data_free (AddEntryToFolderData *data)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_object_unref (data->entry);
|
|
Packit |
4b6dd7 |
g_object_unref (data->folder);
|
|
Packit |
4b6dd7 |
g_slice_free (AddEntryToFolderData, data);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
add_entry_to_folder_thread (GTask *task, gpointer source_object, gpointer task_data, GCancellable *cancellable)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataDocumentsService *service = GDATA_DOCUMENTS_SERVICE (source_object);
|
|
Packit |
4b6dd7 |
g_autoptr(GDataDocumentsEntry) updated_entry = NULL;
|
|
Packit |
4b6dd7 |
AddEntryToFolderData *data = task_data;
|
|
Packit |
4b6dd7 |
g_autoptr(GError) error = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Add the entry to the folder and return */
|
|
Packit |
4b6dd7 |
updated_entry = gdata_documents_service_add_entry_to_folder (service, data->entry, data->folder, cancellable, &error);
|
|
Packit |
4b6dd7 |
if (error != NULL)
|
|
Packit |
4b6dd7 |
g_task_return_error (task, g_steal_pointer (&error));
|
|
Packit |
4b6dd7 |
else
|
|
Packit |
4b6dd7 |
g_task_return_pointer (task, g_steal_pointer (&updated_entry), (GDestroyNotify) g_object_unref);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_add_entry_to_folder_async:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @entry: the #GDataDocumentsEntry to add to @folder
|
|
Packit |
4b6dd7 |
* @folder: the #GDataDocumentsFolder to add @entry to
|
|
Packit |
4b6dd7 |
* @cancellable: (allow-none): optional #GCancellable object, or %NULL
|
|
Packit |
4b6dd7 |
* @callback: a #GAsyncReadyCallback to call when the operation is finished, or %NULL
|
|
Packit |
4b6dd7 |
* @user_data: (closure): data to pass to the @callback function
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Add the given @entry to the specified @folder. @self, @entry and @folder are all reffed when this function is called, so can safely be unreffed
|
|
Packit |
4b6dd7 |
* after this function returns.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more details, see gdata_documents_service_add_entry_to_folder(), which is the synchronous version of this function.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* When the operation is finished, @callback will be called. You can then call gdata_documents_service_add_entry_to_folder_finish() to get the results
|
|
Packit |
4b6dd7 |
* of the operation.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.8.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_documents_service_add_entry_to_folder_async (GDataDocumentsService *self, GDataDocumentsEntry *entry, GDataDocumentsFolder *folder,
|
|
Packit |
4b6dd7 |
GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_autoptr(GTask) task = NULL;
|
|
Packit |
4b6dd7 |
AddEntryToFolderData *data;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self));
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_DOCUMENTS_ENTRY (entry));
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_DOCUMENTS_FOLDER (folder));
|
|
Packit |
4b6dd7 |
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
data = g_slice_new (AddEntryToFolderData);
|
|
Packit |
4b6dd7 |
data->entry = g_object_ref (entry);
|
|
Packit |
4b6dd7 |
data->folder = g_object_ref (folder);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
task = g_task_new (self, cancellable, callback, user_data);
|
|
Packit |
4b6dd7 |
g_task_set_source_tag (task, gdata_documents_service_add_entry_to_folder_async);
|
|
Packit |
4b6dd7 |
g_task_set_task_data (task, g_steal_pointer (&data), (GDestroyNotify) add_entry_to_folder_data_free);
|
|
Packit |
4b6dd7 |
g_task_run_in_thread (task, add_entry_to_folder_thread);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_add_entry_to_folder_finish:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @async_result: a #GAsyncResult
|
|
Packit |
4b6dd7 |
* @error: a #GError, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Finish an asynchronous operation to add a #GDataDocumentsEntry to a folder started with gdata_documents_service_add_entry_to_folder_async().
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): an updated #GDataDocumentsEntry, or %NULL; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.8.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataDocumentsEntry *
|
|
Packit |
4b6dd7 |
gdata_documents_service_add_entry_to_folder_finish (GDataDocumentsService *self, GAsyncResult *async_result, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (G_IS_ASYNC_RESULT (async_result), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (g_task_is_valid (async_result, self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (g_async_result_is_tagged (async_result, gdata_documents_service_add_entry_to_folder_async), NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return g_task_propagate_pointer (G_TASK (async_result), error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_remove_entry_from_folder:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @entry: the #GDataDocumentsEntry to remove
|
|
Packit |
4b6dd7 |
* @folder: the #GDataDocumentsFolder from which we should remove @entry
|
|
Packit |
4b6dd7 |
* @cancellable: (allow-none): optional #GCancellable object, or %NULL
|
|
Packit |
4b6dd7 |
* @error: a #GError, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Remove the given @entry from @folder, and return an updated #GDataDocumentsEntry for @entry. @entry will remain a member of any other folders it's
|
|
Packit |
4b6dd7 |
* currently in. Note that @entry can be either a #GDataDocumentsDocument or a #GDataDocumentsFolder.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Errors from #GDataServiceError can be returned for exceptional conditions, as determined by the server.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): an updated #GDataDocumentsEntry, or %NULL; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.8.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataDocumentsEntry *
|
|
Packit |
4b6dd7 |
gdata_documents_service_remove_entry_from_folder (GDataDocumentsService *self, GDataDocumentsEntry *entry, GDataDocumentsFolder *folder,
|
|
Packit |
4b6dd7 |
GCancellable *cancellable, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
const gchar *folder_id;
|
|
Packit |
4b6dd7 |
GList *i;
|
|
Packit |
4b6dd7 |
GList *parent_folders_list;
|
|
Packit |
4b6dd7 |
GDataLink *folder_link = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_ENTRY (entry), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_FOLDER (folder), 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 (gdata_authorizer_is_authorized_for_domain (gdata_service_get_authorizer (GDATA_SERVICE (self)),
|
|
Packit |
4b6dd7 |
get_documents_authorization_domain ()) == FALSE) {
|
|
Packit |
4b6dd7 |
g_set_error_literal (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_AUTHENTICATION_REQUIRED,
|
|
Packit |
4b6dd7 |
_("You must be authenticated to move documents and folders."));
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
folder_id = gdata_entry_get_id (GDATA_ENTRY (folder));
|
|
Packit |
4b6dd7 |
g_assert (folder_id != NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
parent_folders_list = gdata_entry_look_up_links (GDATA_ENTRY (entry), GDATA_LINK_PARENT);
|
|
Packit |
4b6dd7 |
for (i = parent_folders_list; i != NULL; i = i->next) {
|
|
Packit |
4b6dd7 |
GDataLink *_link = GDATA_LINK (i->data);
|
|
Packit |
4b6dd7 |
const gchar *id;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
id = gdata_documents_utils_get_id_from_link (_link);
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (folder_id, id) == 0) {
|
|
Packit |
4b6dd7 |
folder_link = _link;
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_list_free (parent_folders_list);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (folder_link == NULL) {
|
|
Packit |
4b6dd7 |
g_set_error_literal (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_NOT_FOUND, _("Parent folder not found"));
|
|
Packit |
4b6dd7 |
return NULL;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
gdata_entry_remove_link (GDATA_ENTRY (entry), folder_link);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return GDATA_DOCUMENTS_ENTRY (gdata_service_update_entry (GDATA_SERVICE (self), get_documents_authorization_domain (), GDATA_ENTRY (entry),
|
|
Packit |
4b6dd7 |
cancellable, error));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
typedef struct {
|
|
Packit |
4b6dd7 |
GDataDocumentsEntry *entry;
|
|
Packit |
4b6dd7 |
GDataDocumentsFolder *folder;
|
|
Packit |
4b6dd7 |
} RemoveEntryFromFolderData;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
remove_entry_from_folder_data_free (RemoveEntryFromFolderData *data)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_object_unref (data->entry);
|
|
Packit |
4b6dd7 |
g_object_unref (data->folder);
|
|
Packit |
4b6dd7 |
g_slice_free (RemoveEntryFromFolderData, data);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
remove_entry_from_folder_thread (GTask *task, gpointer source_object, gpointer task_data, GCancellable *cancellable)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataDocumentsService *service = GDATA_DOCUMENTS_SERVICE (source_object);
|
|
Packit |
4b6dd7 |
g_autoptr(GDataDocumentsEntry) updated_entry = NULL;
|
|
Packit |
4b6dd7 |
RemoveEntryFromFolderData *data = task_data;
|
|
Packit |
4b6dd7 |
g_autoptr(GError) error = NULL;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Remove the entry from the folder and return */
|
|
Packit |
4b6dd7 |
updated_entry = gdata_documents_service_remove_entry_from_folder (service, data->entry, data->folder, cancellable, &error);
|
|
Packit |
4b6dd7 |
if (error != NULL)
|
|
Packit |
4b6dd7 |
g_task_return_error (task, g_steal_pointer (&error));
|
|
Packit |
4b6dd7 |
else
|
|
Packit |
4b6dd7 |
g_task_return_pointer (task, g_steal_pointer (&updated_entry), g_object_unref);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_remove_entry_from_folder_async:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @entry: the #GDataDocumentsEntry to remove from @folder
|
|
Packit |
4b6dd7 |
* @folder: the #GDataDocumentsFolder to remove @entry from
|
|
Packit |
4b6dd7 |
* @cancellable: (allow-none): optional #GCancellable object, or %NULL
|
|
Packit |
4b6dd7 |
* @callback: a #GAsyncReadyCallback to call when the operation is finished, or %NULL
|
|
Packit |
4b6dd7 |
* @user_data: (closure): data to pass to the @callback function
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Remove the given @entry from the specified @folder. @self, @entry and @folder are all reffed when this function is called, so can safely be unreffed
|
|
Packit |
4b6dd7 |
* after this function returns.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more details, see gdata_documents_service_remove_entry_from_folder(), which is the synchronous version of this function.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* When the operation is finished, @callback will be called. You can then call gdata_documents_service_remove_entry_from_folder_finish() to get the
|
|
Packit |
4b6dd7 |
* results of the operation.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.8.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_documents_service_remove_entry_from_folder_async (GDataDocumentsService *self, GDataDocumentsEntry *entry, GDataDocumentsFolder *folder,
|
|
Packit |
4b6dd7 |
GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_autoptr(GTask) task = NULL;
|
|
Packit |
4b6dd7 |
RemoveEntryFromFolderData *data;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self));
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_DOCUMENTS_ENTRY (entry));
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_DOCUMENTS_FOLDER (folder));
|
|
Packit |
4b6dd7 |
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
data = g_slice_new (RemoveEntryFromFolderData);
|
|
Packit |
4b6dd7 |
data->entry = g_object_ref (entry);
|
|
Packit |
4b6dd7 |
data->folder = g_object_ref (folder);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
task = g_task_new (self, cancellable, callback, user_data);
|
|
Packit |
4b6dd7 |
g_task_set_source_tag (task, gdata_documents_service_remove_entry_from_folder_async);
|
|
Packit |
4b6dd7 |
g_task_set_task_data (task, g_steal_pointer (&data), (GDestroyNotify) remove_entry_from_folder_data_free);
|
|
Packit |
4b6dd7 |
g_task_run_in_thread (task, remove_entry_from_folder_thread);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_remove_entry_from_folder_finish:
|
|
Packit |
4b6dd7 |
* @self: a #GDataDocumentsService
|
|
Packit |
4b6dd7 |
* @async_result: a #GAsyncResult
|
|
Packit |
4b6dd7 |
* @error: a #GError, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Finish an asynchronous operation to remove a #GDataDocumentsEntry from a folder started with
|
|
Packit |
4b6dd7 |
* gdata_documents_service_remove_entry_from_folder_async().
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: (transfer full): an updated #GDataDocumentsEntry, or %NULL; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.8.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataDocumentsEntry *
|
|
Packit |
4b6dd7 |
gdata_documents_service_remove_entry_from_folder_finish (GDataDocumentsService *self, GAsyncResult *async_result, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (G_IS_ASYNC_RESULT (async_result), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (g_task_is_valid (async_result, self), NULL);
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (g_async_result_is_tagged (async_result, gdata_documents_service_remove_entry_from_folder_async), NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return g_task_propagate_pointer (G_TASK (async_result), error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* NOTE: query may be NULL. */
|
|
Packit |
4b6dd7 |
static gchar *
|
|
Packit |
4b6dd7 |
_get_upload_uri_for_query_and_folder (GDataDocumentsUploadQuery *query, GDataDocumentsFolder *folder)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
if (query == NULL) {
|
|
Packit |
4b6dd7 |
query = gdata_documents_upload_query_new ();
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (folder != NULL) {
|
|
Packit |
4b6dd7 |
gdata_documents_upload_query_set_folder (query, folder);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return gdata_documents_upload_query_build_uri (query);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_documents_service_get_upload_uri:
|
|
Packit |
4b6dd7 |
* @folder: (allow-none): the #GDataDocumentsFolder into which to upload the document, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the upload URI for documents for the service.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* If @folder is %NULL, the URI will be the one to upload documents to the "root" folder.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the URI permitting the upload of documents to @folder, or %NULL; free with g_free()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.5.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
gchar *
|
|
Packit |
4b6dd7 |
gdata_documents_service_get_upload_uri (GDataDocumentsFolder *folder)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (folder == NULL || GDATA_IS_DOCUMENTS_FOLDER (folder), NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Upload URI: https://developers.google.com/drive/web/manage-uploads */
|
|
Packit |
4b6dd7 |
return g_strdup ("https://www.googleapis.com/upload/drive/v2/files");
|
|
Packit |
4b6dd7 |
}
|