[libgdata: 1/2] documents: Support deleting shared Google Drive files
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgdata: 1/2] documents: Support deleting shared Google Drive files
- Date: Thu, 9 May 2019 17:01:15 +0000 (UTC)
commit b0dc714f162bcbb82606415870b7018ff8787cbb
Author: Mayank Sharma <mayank8019 gmail com>
Date: Mon Apr 29 09:46:06 2019 +0530
documents: Support deleting shared Google Drive files
`gdata_documents_service_remove_entry_from_folder` was earlier
performing a PUT request for removing parent folders of a file,
but Drive API disallows (it keeps atleast 1 parents) setting the
"parents" field in PUT request to an empty array. Instead, a
DELETE request to the "parents/delete" needs to be used.
Closes: https://gitlab.gnome.org/GNOME/libgdata/issues/26
gdata/services/documents/gdata-documents-service.c | 71 ++++++++++++++++++++--
1 file changed, 66 insertions(+), 5 deletions(-)
---
diff --git a/gdata/services/documents/gdata-documents-service.c
b/gdata/services/documents/gdata-documents-service.c
index 5d667e93..524f93f6 100644
--- a/gdata/services/documents/gdata-documents-service.c
+++ b/gdata/services/documents/gdata-documents-service.c
@@ -1378,7 +1378,13 @@ gdata_documents_service_remove_entry_from_folder (GDataDocumentsService *self, G
const gchar *folder_id;
GList *i;
GList *parent_folders_list;
- GDataLink *folder_link = NULL;
+ GDataLink *folder_link = NULL, *file_link = NULL;
+ GDataParsableClass *klass;
+ GDataAuthorizationDomain *domain;
+ gchar *fixed_uri, *modified_uri;
+ guint status;
+ gboolean req_status = TRUE;
+ SoupMessage *message;
g_return_val_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self), NULL);
g_return_val_if_fail (GDATA_IS_DOCUMENTS_ENTRY (entry), NULL);
@@ -1393,6 +1399,8 @@ gdata_documents_service_remove_entry_from_folder (GDataDocumentsService *self, G
return NULL;
}
+ domain = gdata_documents_service_get_primary_authorization_domain();
+
folder_id = gdata_entry_get_id (GDATA_ENTRY (folder));
g_assert (folder_id != NULL);
@@ -1411,14 +1419,67 @@ gdata_documents_service_remove_entry_from_folder (GDataDocumentsService *self, G
g_list_free (parent_folders_list);
if (folder_link == NULL) {
- g_set_error_literal (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_NOT_FOUND, _("Parent
folder not found"));
+ g_set_error_literal (error,
+ GDATA_SERVICE_ERROR,
+ GDATA_SERVICE_ERROR_NOT_FOUND,
+ _("Parent folder not found"));
+ return NULL;
+ }
+
+ klass = GDATA_PARSABLE_GET_CLASS (entry);
+
+ g_assert (klass->get_content_type != NULL);
+ if (g_strcmp0 (klass->get_content_type (), "application/json") == 0) {
+ file_link = gdata_entry_look_up_link (GDATA_ENTRY (entry), GDATA_LINK_SELF);
+ } else {
+ file_link = gdata_entry_look_up_link (GDATA_ENTRY (entry), GDATA_LINK_EDIT);
+ }
+ g_debug ("Link = %s", gdata_link_get_uri(file_link));
+ g_assert (file_link != NULL);
+
+ fixed_uri = _gdata_service_fix_uri_scheme (gdata_link_get_uri (file_link));
+ modified_uri = g_strconcat (fixed_uri, "/parents/", folder_id, NULL);
+
+ message = _gdata_service_build_message (GDATA_SERVICE (self),
+ domain,
+ SOUP_METHOD_DELETE,
+ modified_uri,
+ gdata_entry_get_etag (GDATA_ENTRY (entry)),
+ TRUE);
+ g_free (fixed_uri);
+ g_free (modified_uri);
+
+ /* Send the message */
+ status = _gdata_service_send_message (GDATA_SERVICE (self), message, cancellable, error);
+
+ if (status == SOUP_STATUS_NONE || status == SOUP_STATUS_CANCELLED) {
+ /* Redirect error or cancelled */
+ g_object_unref (message);
return NULL;
+ } else if (status != SOUP_STATUS_OK && status != SOUP_STATUS_NO_CONTENT) {
+ /* Error */
+ GDataServiceClass *service_klass = GDATA_SERVICE_GET_CLASS (self);
+ g_assert (service_klass->parse_error_response != NULL);
+ service_klass->parse_error_response (GDATA_SERVICE (self),
+ GDATA_OPERATION_DELETION,
+ status,
+ message->reason_phrase,
+ message->response_body->data,
+ message->response_body->length,
+ error);
+ req_status = FALSE;
}
- gdata_entry_remove_link (GDATA_ENTRY (entry), folder_link);
+ g_object_unref (message);
- return GDATA_DOCUMENTS_ENTRY (gdata_service_update_entry (GDATA_SERVICE (self),
get_documents_authorization_domain (), GDATA_ENTRY (entry),
- cancellable, error));
+ if (req_status) {
+ /* Remove parent link from File's Data Entry */
+ gdata_entry_remove_link (GDATA_ENTRY (entry), folder_link);
+ g_object_ref (entry);
+ return entry;
+ } else {
+ return NULL;
+ }
}
typedef struct {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]