summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/reference/gdata-sections.txt2
-rw-r--r--gdata/gdata.symbols2
-rw-r--r--gdata/services/documents/gdata-documents-service.c110
-rw-r--r--gdata/services/documents/gdata-documents-service.h4
-rw-r--r--gdata/tests/documents.c84
5 files changed, 202 insertions, 0 deletions
diff --git a/docs/reference/gdata-sections.txt b/docs/reference/gdata-sections.txt
index 86ef49bd..c80da98b 100644
--- a/docs/reference/gdata-sections.txt
+++ b/docs/reference/gdata-sections.txt
@@ -1721,6 +1721,8 @@ gdata_documents_service_add_entry_to_folder
gdata_documents_service_add_entry_to_folder_async
gdata_documents_service_add_entry_to_folder_finish
gdata_documents_service_remove_entry_from_folder
+gdata_documents_service_remove_entry_from_folder_async
+gdata_documents_service_remove_entry_from_folder_finish
gdata_documents_service_get_upload_uri
<SUBSECTION Standard>
gdata_documents_service_get_type
diff --git a/gdata/gdata.symbols b/gdata/gdata.symbols
index 62e748a5..a4409ec3 100644
--- a/gdata/gdata.symbols
+++ b/gdata/gdata.symbols
@@ -854,3 +854,5 @@ gdata_documents_service_add_entry_to_folder
gdata_documents_service_remove_entry_from_folder
gdata_documents_service_add_entry_to_folder_async
gdata_documents_service_add_entry_to_folder_finish
+gdata_documents_service_remove_entry_from_folder_async
+gdata_documents_service_remove_entry_from_folder_finish
diff --git a/gdata/services/documents/gdata-documents-service.c b/gdata/services/documents/gdata-documents-service.c
index 5d151994..4ec5b01d 100644
--- a/gdata/services/documents/gdata-documents-service.c
+++ b/gdata/services/documents/gdata-documents-service.c
@@ -749,6 +749,116 @@ gdata_documents_service_remove_entry_from_folder (GDataDocumentsService *self, G
G_OBJECT_TYPE (entry), cancellable, error));
}
+typedef struct {
+ GDataDocumentsEntry *entry;
+ GDataDocumentsFolder *folder;
+} RemoveEntryFromFolderData;
+
+static void
+remove_entry_from_folder_data_free (RemoveEntryFromFolderData *data)
+{
+ g_object_unref (data->entry);
+ g_object_unref (data->folder);
+ g_slice_free (RemoveEntryFromFolderData, data);
+}
+
+static void
+remove_entry_from_folder_thread (GSimpleAsyncResult *result, GDataDocumentsService *service, GCancellable *cancellable)
+{
+ GDataDocumentsEntry *updated_entry;
+ RemoveEntryFromFolderData *data;
+ GError *error = NULL;
+
+ data = g_simple_async_result_get_op_res_gpointer (result);
+
+ /* Remove the entry from the folder and return */
+ updated_entry = gdata_documents_service_remove_entry_from_folder (service, data->entry, data->folder, cancellable, &error);
+ if (error != NULL) {
+ g_simple_async_result_set_from_error (result, error);
+ g_error_free (error);
+ return;
+ }
+
+ /* Return the updated entry */
+ g_simple_async_result_set_op_res_gpointer (result, updated_entry, (GDestroyNotify) g_object_unref);
+}
+
+/**
+ * gdata_documents_service_remove_entry_from_folder_async:
+ * @self: a #GDataDocumentsService
+ * @entry: the #GDataDocumentsEntry to remove from @folder
+ * @folder: the #GDataDocumentsFolder to remove @entry from
+ * @cancellable: optional #GCancellable object, or %NULL
+ * @callback: a #GAsyncReadyCallback to call when the operation is finished, or %NULL
+ * @user_data: (closure): data to pass to the @callback function
+ *
+ * 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
+ * after this function returns.
+ *
+ * For more details, see gdata_documents_service_remove_entry_from_folder(), which is the synchronous version of this function.
+ *
+ * When the operation is finished, @callback will be called. You can then call gdata_documents_service_remove_entry_from_folder_finish() to get the
+ * results of the operation.
+ *
+ * Since: 0.8.0
+ **/
+void
+gdata_documents_service_remove_entry_from_folder_async (GDataDocumentsService *self, GDataDocumentsEntry *entry, GDataDocumentsFolder *folder,
+ GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
+{
+ GSimpleAsyncResult *result;
+ RemoveEntryFromFolderData *data;
+
+ g_return_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self));
+ g_return_if_fail (GDATA_IS_DOCUMENTS_ENTRY (entry));
+ g_return_if_fail (GDATA_IS_DOCUMENTS_FOLDER (folder));
+ g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+
+ data = g_slice_new (RemoveEntryFromFolderData);
+ data->entry = g_object_ref (entry);
+ data->folder = g_object_ref (folder);
+
+ result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, gdata_documents_service_remove_entry_from_folder_async);
+ g_simple_async_result_set_op_res_gpointer (result, data, (GDestroyNotify) remove_entry_from_folder_data_free);
+ g_simple_async_result_run_in_thread (result, (GSimpleAsyncThreadFunc) remove_entry_from_folder_thread, G_PRIORITY_DEFAULT, cancellable);
+ g_object_unref (result);
+}
+
+/**
+ * gdata_documents_service_remove_entry_from_folder_finish:
+ * @self: a #GDataDocumentsService
+ * @async_result: a #GAsyncResult
+ * @error: a #GError, or %NULL
+ *
+ * Finish an asynchronous operation to remove a #GDataDocumentsEntry from a folder started with
+ * gdata_documents_service_remove_entry_from_folder_async().
+ *
+ * Return value: (transfer full): an updated #GDataDocumentsEntry, or %NULL; unref with g_object_unref()
+ *
+ * Since: 0.8.0
+ **/
+GDataDocumentsEntry *
+gdata_documents_service_remove_entry_from_folder_finish (GDataDocumentsService *self, GAsyncResult *async_result, GError **error)
+{
+ GSimpleAsyncResult *result = G_SIMPLE_ASYNC_RESULT (async_result);
+ GDataDocumentsEntry *entry;
+
+ g_return_val_if_fail (GDATA_IS_DOCUMENTS_SERVICE (self), NULL);
+ g_return_val_if_fail (G_IS_ASYNC_RESULT (async_result), NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+ g_warn_if_fail (g_simple_async_result_get_source_tag (result) == gdata_documents_service_remove_entry_from_folder_async);
+
+ if (g_simple_async_result_propagate_error (result, error) == TRUE)
+ return NULL;
+
+ entry = g_simple_async_result_get_op_res_gpointer (result);
+ if (entry != NULL)
+ return g_object_ref (entry);
+
+ g_assert_not_reached ();
+}
+
/**
* gdata_documents_service_get_upload_uri:
* @folder: (allow-none): the #GDataDocumentsFolder into which to upload the document, or %NULL
diff --git a/gdata/services/documents/gdata-documents-service.h b/gdata/services/documents/gdata-documents-service.h
index 44ddfa95..d9b2eee6 100644
--- a/gdata/services/documents/gdata-documents-service.h
+++ b/gdata/services/documents/gdata-documents-service.h
@@ -110,6 +110,10 @@ GDataDocumentsEntry *gdata_documents_service_add_entry_to_folder_finish (GDataDo
GDataDocumentsEntry *gdata_documents_service_remove_entry_from_folder (GDataDocumentsService *self, GDataDocumentsEntry *entry,
GDataDocumentsFolder *folder, GCancellable *cancellable,
GError **error) G_GNUC_WARN_UNUSED_RESULT G_GNUC_MALLOC;
+void gdata_documents_service_remove_entry_from_folder_async (GDataDocumentsService *self, GDataDocumentsEntry *entry, GDataDocumentsFolder *folder,
+ GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data);
+GDataDocumentsEntry *gdata_documents_service_remove_entry_from_folder_finish (GDataDocumentsService *self, GAsyncResult *async_result,
+ GError **error) G_GNUC_WARN_UNUSED_RESULT G_GNUC_MALLOC;
gchar *gdata_documents_service_get_upload_uri (GDataDocumentsFolder *folder) G_GNUC_WARN_UNUSED_RESULT G_GNUC_MALLOC;
diff --git a/gdata/tests/documents.c b/gdata/tests/documents.c
index f5f34e2c..e1023fd9 100644
--- a/gdata/tests/documents.c
+++ b/gdata/tests/documents.c
@@ -558,6 +558,86 @@ test_folders_remove_from_folder (FoldersData *data, gconstpointer service)
}
static void
+setup_folders_remove_from_folder_async (FoldersAsyncData *data, gconstpointer service)
+{
+ setup_folders_remove_from_folder ((FoldersData*) data, service);
+ data->main_loop = g_main_loop_new (NULL, TRUE);
+}
+
+static void
+teardown_folders_remove_from_folder_async (FoldersAsyncData *data, gconstpointer service)
+{
+ g_main_loop_unref (data->main_loop);
+ teardown_folders_remove_from_folder ((FoldersData*) data, service);
+}
+
+static void
+test_folders_remove_from_folder_async_cb (GDataDocumentsService *service, GAsyncResult *async_result, FoldersAsyncData *data)
+{
+ GDataDocumentsEntry *entry;
+ GError *error = NULL;
+
+ entry = gdata_documents_service_remove_entry_from_folder_finish (service, async_result, &error);
+ g_assert_no_error (error);
+ g_assert (GDATA_IS_DOCUMENTS_ENTRY (entry));
+ g_clear_error (&error);
+
+ /* Check it's still the same document */
+ g_assert_cmpstr (gdata_entry_get_title (GDATA_ENTRY (entry)), ==, gdata_entry_get_title (GDATA_ENTRY (data->data.document)));
+ g_assert (check_document_is_in_folder (GDATA_DOCUMENTS_DOCUMENT (entry), data->data.folder) == FALSE);
+
+ g_object_unref (entry);
+
+ g_main_loop_quit (data->main_loop);
+}
+
+static void
+test_folders_remove_from_folder_async (FoldersAsyncData *data, gconstpointer service)
+{
+ /* Remove the document from the folder asynchronously */
+ gdata_documents_service_remove_entry_from_folder_async (GDATA_DOCUMENTS_SERVICE (service), GDATA_DOCUMENTS_ENTRY (data->data.document),
+ data->data.folder, NULL,
+ (GAsyncReadyCallback) test_folders_remove_from_folder_async_cb, data);
+ g_main_loop_run (data->main_loop);
+}
+
+static void
+test_folders_remove_from_folder_cancellation_cb (GDataDocumentsService *service, GAsyncResult *async_result, FoldersAsyncData *data)
+{
+ GDataDocumentsEntry *entry;
+ GError *error = NULL;
+
+ entry = gdata_documents_service_remove_entry_from_folder_finish (service, async_result, &error);
+ g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
+ g_assert (entry == NULL);
+ g_clear_error (&error);
+
+ g_main_loop_quit (data->main_loop);
+}
+
+static gboolean
+test_folders_remove_from_folder_cancellation_cancel_cb (GCancellable *cancellable)
+{
+ g_cancellable_cancel (cancellable);
+ return FALSE;
+}
+
+static void
+test_folders_remove_from_folder_cancellation (FoldersAsyncData *data, gconstpointer service)
+{
+ GCancellable *cancellable = g_cancellable_new ();
+ g_timeout_add (1, (GSourceFunc) test_folders_remove_from_folder_cancellation_cancel_cb, cancellable);
+
+ /* Remove the document from the folder asynchronously and cancel the operation after a few milliseconds */
+ gdata_documents_service_remove_entry_from_folder_async (GDATA_DOCUMENTS_SERVICE (service), GDATA_DOCUMENTS_ENTRY (data->data.document),
+ data->data.folder, cancellable,
+ (GAsyncReadyCallback) test_folders_remove_from_folder_cancellation_cb, data);
+ g_main_loop_run (data->main_loop);
+
+ g_object_unref (cancellable);
+}
+
+static void
test_upload_file_metadata_in_new_folder (gconstpointer service)
{
GDataDocumentsDocument *document, *new_document;
@@ -1294,6 +1374,10 @@ main (int argc, char *argv[])
test_folders_add_to_folder_cancellation, teardown_folders_add_to_folder_async);
g_test_add ("/documents/folders/remove_from_folder", FoldersData, service, setup_folders_remove_from_folder,
test_folders_remove_from_folder, teardown_folders_remove_from_folder);
+ g_test_add ("/documents/folders/remove_from_folder/async", FoldersAsyncData, service, setup_folders_remove_from_folder_async,
+ test_folders_remove_from_folder_async, teardown_folders_remove_from_folder_async);
+ g_test_add ("/documents/folders/remove_from_folder/cancellation", FoldersAsyncData, service, setup_folders_remove_from_folder_async,
+ test_folders_remove_from_folder_cancellation, teardown_folders_remove_from_folder_async);
g_test_add_data_func ("/documents/batch", service, test_batch);
g_test_add ("/documents/batch/async", BatchAsyncData, service, setup_batch_async, test_batch_async, teardown_batch_async);