[libgdata: 1/2] documents: Support deleting shared Google Drive files



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]