[libgdata] documents: Add an async method to add entries to folders



commit 54c6db565cc1d4bb263d58aac2cb8e8743f44bbd
Author: Philip Withnall <philip tecnocode co uk>
Date:   Thu Dec 9 17:09:11 2010 +0000

    documents: Add an async method to add entries to folders
    
    This adds an asynchronous version of
    gdata_documents_service_add_entry_to_folder(), and the associated normal and
    cancellation tests.
    
    The following API has been added:
     â?¢ gdata_documents_service_add_entry_to_folder_async()
     â?¢ gdata_documents_service_add_entry_to_folder_finish()
    
    Helps: bgo#633363

 docs/reference/gdata-sections.txt                  |    2 +
 gdata/gdata.symbols                                |    2 +
 gdata/services/documents/gdata-documents-service.c |  109 ++++++++++++++++++++
 gdata/services/documents/gdata-documents-service.h |    5 +
 gdata/tests/documents.c                            |   88 ++++++++++++++++
 5 files changed, 206 insertions(+), 0 deletions(-)
---
diff --git a/docs/reference/gdata-sections.txt b/docs/reference/gdata-sections.txt
index 515ffdb..86ef49b 100644
--- a/docs/reference/gdata-sections.txt
+++ b/docs/reference/gdata-sections.txt
@@ -1718,6 +1718,8 @@ gdata_documents_service_upload_document
 gdata_documents_service_update_document
 gdata_documents_service_finish_upload
 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_get_upload_uri
 <SUBSECTION Standard>
diff --git a/gdata/gdata.symbols b/gdata/gdata.symbols
index 30367aa..62e748a 100644
--- a/gdata/gdata.symbols
+++ b/gdata/gdata.symbols
@@ -852,3 +852,5 @@ gdata_picasaweb_service_query_files_async
 gdata_documents_service_finish_upload
 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
diff --git a/gdata/services/documents/gdata-documents-service.c b/gdata/services/documents/gdata-documents-service.c
index a513b66..5d15199 100644
--- a/gdata/services/documents/gdata-documents-service.c
+++ b/gdata/services/documents/gdata-documents-service.c
@@ -552,6 +552,115 @@ gdata_documents_service_add_entry_to_folder (GDataDocumentsService *self, GDataD
 	return new_entry;
 }
 
+typedef struct {
+	GDataDocumentsEntry *entry;
+	GDataDocumentsFolder *folder;
+} AddEntryToFolderData;
+
+static void
+add_entry_to_folder_data_free (AddEntryToFolderData *data)
+{
+	g_object_unref (data->entry);
+	g_object_unref (data->folder);
+	g_slice_free (AddEntryToFolderData, data);
+}
+
+static void
+add_entry_to_folder_thread (GSimpleAsyncResult *result, GDataDocumentsService *service, GCancellable *cancellable)
+{
+	GDataDocumentsEntry *updated_entry;
+	AddEntryToFolderData *data;
+	GError *error = NULL;
+
+	data = g_simple_async_result_get_op_res_gpointer (result);
+
+	/* Add the entry to the folder and return */
+	updated_entry = gdata_documents_service_add_entry_to_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_add_entry_to_folder_async:
+ * @self: a #GDataDocumentsService
+ * @entry: the #GDataDocumentsEntry to add to @folder
+ * @folder: the #GDataDocumentsFolder to add @entry to
+ * @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
+ *
+ * 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
+ * after this function returns.
+ *
+ * For more details, see gdata_documents_service_add_entry_to_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_add_entry_to_folder_finish() to get the results
+ * of the operation.
+ *
+ * Since: 0.8.0
+ **/
+void
+gdata_documents_service_add_entry_to_folder_async (GDataDocumentsService *self, GDataDocumentsEntry *entry, GDataDocumentsFolder *folder,
+                                                   GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
+{
+	GSimpleAsyncResult *result;
+	AddEntryToFolderData *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 (AddEntryToFolderData);
+	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_add_entry_to_folder_async);
+	g_simple_async_result_set_op_res_gpointer (result, data, (GDestroyNotify) add_entry_to_folder_data_free);
+	g_simple_async_result_run_in_thread (result, (GSimpleAsyncThreadFunc) add_entry_to_folder_thread, G_PRIORITY_DEFAULT, cancellable);
+	g_object_unref (result);
+}
+
+/**
+ * gdata_documents_service_add_entry_to_folder_finish:
+ * @self: a #GDataDocumentsService
+ * @async_result: a #GAsyncResult
+ * @error: a #GError, or %NULL
+ *
+ * Finish an asynchronous operation to add a #GDataDocumentsEntry to a folder started with gdata_documents_service_add_entry_to_folder_async().
+ *
+ * Return value: (transfer full): an updated #GDataDocumentsEntry, or %NULL; unref with g_object_unref()
+ *
+ * Since: 0.8.0
+ **/
+GDataDocumentsEntry *
+gdata_documents_service_add_entry_to_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_add_entry_to_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_remove_entry_from_folder:
  * @self: a #GDataDocumentsService
diff --git a/gdata/services/documents/gdata-documents-service.h b/gdata/services/documents/gdata-documents-service.h
index ba25c6f..44ddfa9 100644
--- a/gdata/services/documents/gdata-documents-service.h
+++ b/gdata/services/documents/gdata-documents-service.h
@@ -102,6 +102,11 @@ GDataDocumentsDocument *gdata_documents_service_finish_upload (GDataDocumentsSer
 GDataDocumentsEntry *gdata_documents_service_add_entry_to_folder (GDataDocumentsService *self, GDataDocumentsEntry *entry,
                                                                   GDataDocumentsFolder *folder, GCancellable *cancellable,
                                                                   GError **error) G_GNUC_WARN_UNUSED_RESULT G_GNUC_MALLOC;
+void gdata_documents_service_add_entry_to_folder_async (GDataDocumentsService *self, GDataDocumentsEntry *entry, GDataDocumentsFolder *folder,
+                                                        GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data);
+GDataDocumentsEntry *gdata_documents_service_add_entry_to_folder_finish (GDataDocumentsService *self, GAsyncResult *async_result,
+                                                                         GError **error) G_GNUC_WARN_UNUSED_RESULT G_GNUC_MALLOC;
+
 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;
diff --git a/gdata/tests/documents.c b/gdata/tests/documents.c
index 56aa89c..e94835a 100644
--- a/gdata/tests/documents.c
+++ b/gdata/tests/documents.c
@@ -520,6 +520,90 @@ test_folders_add_to_folder (FoldersAddToFolderData *data, gconstpointer service)
 	g_object_unref (new_document);
 }
 
+typedef struct {
+	FoldersAddToFolderData data;
+	GMainLoop *main_loop;
+} FoldersAddToFolderAsyncData;
+
+static void
+setup_folders_add_to_folder_async (FoldersAddToFolderAsyncData *data, gconstpointer service)
+{
+	setup_folders_add_to_folder ((FoldersAddToFolderData*) data, service);
+	data->main_loop = g_main_loop_new (NULL, TRUE);
+}
+
+static void
+teardown_folders_add_to_folder_async (FoldersAddToFolderAsyncData *data, gconstpointer service)
+{
+	g_main_loop_unref (data->main_loop);
+	teardown_folders_add_to_folder ((FoldersAddToFolderData*) data, service);
+}
+
+static void
+test_folders_add_to_folder_async_cb (GDataDocumentsService *service, GAsyncResult *async_result, FoldersAddToFolderAsyncData *data)
+{
+	GDataDocumentsEntry *entry;
+	GError *error = NULL;
+
+	entry = gdata_documents_service_add_entry_to_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) == TRUE);
+
+	g_object_unref (entry);
+
+	g_main_loop_quit (data->main_loop);
+}
+
+static void
+test_folders_add_to_folder_async (FoldersAddToFolderAsyncData *data, gconstpointer service)
+{
+	/* Add the document to the folder asynchronously */
+	gdata_documents_service_add_entry_to_folder_async (GDATA_DOCUMENTS_SERVICE (service), GDATA_DOCUMENTS_ENTRY (data->data.document),
+	                                                   data->data.folder, NULL, (GAsyncReadyCallback) test_folders_add_to_folder_async_cb, data);
+	g_main_loop_run (data->main_loop);
+}
+
+static void
+test_folders_add_to_folder_cancellation_cb (GDataDocumentsService *service, GAsyncResult *async_result, FoldersAddToFolderAsyncData *data)
+{
+	GDataDocumentsEntry *entry;
+	GError *error = NULL;
+
+	entry = gdata_documents_service_add_entry_to_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_add_to_folder_cancellation_cancel_cb (GCancellable *cancellable)
+{
+	g_cancellable_cancel (cancellable);
+	return FALSE;
+}
+
+static void
+test_folders_add_to_folder_cancellation (FoldersAddToFolderAsyncData *data, gconstpointer service)
+{
+	GCancellable *cancellable = g_cancellable_new ();
+	g_timeout_add (1, (GSourceFunc) test_folders_add_to_folder_cancellation_cancel_cb, cancellable);
+
+	/* Add the document to the folder asynchronously and cancel the operation after a few milliseconds */
+	gdata_documents_service_add_entry_to_folder_async (GDATA_DOCUMENTS_SERVICE (service), GDATA_DOCUMENTS_ENTRY (data->data.document),
+	                                                   data->data.folder, cancellable,
+	                                                   (GAsyncReadyCallback) test_folders_add_to_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)
 {
@@ -1251,6 +1335,10 @@ main (int argc, char *argv[])
 
 		g_test_add ("/documents/folders/add_to_folder", FoldersAddToFolderData, service, setup_folders_add_to_folder,
 		            test_folders_add_to_folder, teardown_folders_add_to_folder);
+		g_test_add ("/documents/folders/add_to_folder/async", FoldersAddToFolderAsyncData, service, setup_folders_add_to_folder_async,
+		            test_folders_add_to_folder_async, teardown_folders_add_to_folder_async);
+		g_test_add ("/documents/folders/add_to_folder/cancellation", FoldersAddToFolderAsyncData, service, setup_folders_add_to_folder_async,
+		            test_folders_add_to_folder_cancellation, teardown_folders_add_to_folder_async);
 		g_test_add_data_func ("/documents/move/remove_from_folder", service, test_add_remove_file_from_folder);
 		/*g_test_add_data_func ("/documents/remove/all", service, test_remove_all_documents_and_folders);*/
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]