[gthumb] use the GAsyncResult interface to implement _g_write_metadata_async



commit 82c549f19d98ba183bc04d5114e502bf71d2a8d7
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Sat Jan 29 15:22:02 2011 +0100

    use the GAsyncResult interface to implement _g_write_metadata_async

 extensions/change_date/gth-change-date-task.c      |    8 +-
 extensions/edit_metadata/dlg-edit-metadata.c       |    8 +-
 extensions/edit_metadata/gth-tag-task.c            |    8 +-
 .../image_rotation/gth-reset-orientation-task.c    |   12 +-
 extensions/importer/gth-import-task.c              |   10 +-
 gthumb/gth-metadata-provider.c                     |  170 +++++++++-----------
 gthumb/gth-metadata-provider.h                     |    4 +-
 7 files changed, 110 insertions(+), 110 deletions(-)
---
diff --git a/extensions/change_date/gth-change-date-task.c b/extensions/change_date/gth-change-date-task.c
index 58dc3c6..8b4f24c 100644
--- a/extensions/change_date/gth-change-date-task.c
+++ b/extensions/change_date/gth-change-date-task.c
@@ -148,12 +148,14 @@ update_modification_time (GthChangeDateTask *self)
 
 
 static void
-write_metadata_ready_cb (GError   *error,
-			 gpointer  user_data)
+write_metadata_ready_cb (GObject      *source_object,
+                	 GAsyncResult *result,
+                	 gpointer      user_data)
 {
 	GthChangeDateTask *self = user_data;
+	GError            *error = NULL;
 
-	if (error != NULL) {
+	if (! _g_write_metadata_finish (result, &error)) {
 		gth_task_completed (GTH_TASK (self), error);
 		return;
 	}
diff --git a/extensions/edit_metadata/dlg-edit-metadata.c b/extensions/edit_metadata/dlg-edit-metadata.c
index 1910ee8..362e5f7 100644
--- a/extensions/edit_metadata/dlg-edit-metadata.c
+++ b/extensions/edit_metadata/dlg-edit-metadata.c
@@ -45,14 +45,16 @@ destroy_cb (GtkWidget  *widget,
 
 
 static void
-write_metadata_ready_cb (GError   *error,
-			 gpointer  user_data)
+write_metadata_ready_cb (GObject      *source_object,
+			 GAsyncResult *result,
+			 gpointer      user_data)
 {
 	DialogData *data = user_data;
 	GthMonitor *monitor;
 	GList      *scan;
+	GError     *error = NULL;
 
-	if (error != NULL) {
+	if (! _g_write_metadata_finish (result, &error)) {
 		_gtk_error_dialog_from_gerror_show (GTK_WINDOW (data->browser), _("Could not save the file metadata"), &error);
 		return;
 	}
diff --git a/extensions/edit_metadata/gth-tag-task.c b/extensions/edit_metadata/gth-tag-task.c
index 9e69bf7..4db9fce 100644
--- a/extensions/edit_metadata/gth-tag-task.c
+++ b/extensions/edit_metadata/gth-tag-task.c
@@ -49,14 +49,16 @@ gth_tag_task_finalize (GObject *object)
 
 
 static void
-write_metadata_ready_cb (GError   *error,
-			 gpointer  user_data)
+write_metadata_ready_cb (GObject      *source_object,
+		 	 GAsyncResult *result,
+		 	 gpointer      user_data)
 {
 	GthTagTask *self = user_data;
 	GthMonitor *monitor;
 	GList      *scan;
+	GError     *error = NULL;
 
-	if (error != NULL) {
+	if (! _g_write_metadata_finish (result, &error)) {
 		gth_task_completed (GTH_TASK (self), error);
 		return;
 	}
diff --git a/extensions/image_rotation/gth-reset-orientation-task.c b/extensions/image_rotation/gth-reset-orientation-task.c
index 61679bd..720e07f 100644
--- a/extensions/image_rotation/gth-reset-orientation-task.c
+++ b/extensions/image_rotation/gth-reset-orientation-task.c
@@ -60,14 +60,16 @@ transform_next_file (GthResetOrientationTask *self)
 
 
 static void
-write_metadata_ready_cb (GError   *error,
-			 gpointer  user_data)
+write_metadata_ready_cb (GObject      *source_object,
+	 	 	 GAsyncResult *result,
+	 	 	 gpointer      user_data)
 {
 	GthResetOrientationTask *self = user_data;
-	GFile               *parent;
-	GList               *file_list;
+	GFile                   *parent;
+	GList                   *file_list;
+	GError                  *error = NULL;
 
-	if (error != NULL) {
+	if (! _g_write_metadata_finish (result, &error)) {
 		gth_task_completed (GTH_TASK (self), error);
 		return;
 	}
diff --git a/extensions/importer/gth-import-task.c b/extensions/importer/gth-import-task.c
index fdb9e3a..bcacf3c 100644
--- a/extensions/importer/gth-import-task.c
+++ b/extensions/importer/gth-import-task.c
@@ -182,12 +182,16 @@ catalog_imported_file (GthImportTask *self)
 
 
 static void
-write_metadata_ready_func (GError   *error,
-			   gpointer  user_data)
+write_metadata_ready_func (GObject      *source_object,
+	 	 	   GAsyncResult *result,
+	 	 	   gpointer      user_data)
 {
 	GthImportTask *self = user_data;
+	GError        *error = NULL;
 
-	if ((error != NULL) && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+	if (! _g_write_metadata_finish (result, &error)
+	    && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+	{
 		gth_task_completed (GTH_TASK (self), error);
 		return;
 	}
diff --git a/gthumb/gth-metadata-provider.c b/gthumb/gth-metadata-provider.c
index c431e67..6d24c75 100644
--- a/gthumb/gth-metadata-provider.c
+++ b/gthumb/gth-metadata-provider.c
@@ -184,7 +184,7 @@ _g_query_metadata_async_thread (GSimpleAsyncResult *result,
 		GthFileData *file_data = scan->data;
 		GList       *scan_providers;
 
-		if (g_cancellable_is_cancelled (cancellable)) {
+		if ((cancellable != NULL) && g_cancellable_is_cancelled (cancellable)) {
 			error = g_error_new_literal (G_IO_ERROR, G_IO_ERROR_CANCELLED, "");
 			break;
 		}
@@ -216,7 +216,10 @@ _g_query_metadata_async (GList               *files,       /* GthFileData * list
 	GSimpleAsyncResult *result;
 	QueryMetadataData  *qmd;
 
-	result = g_simple_async_result_new (NULL, callback, user_data, _g_query_metadata_async);
+	result = g_simple_async_result_new (NULL,
+					    callback,
+					    user_data,
+					    _g_query_metadata_async);
 
 	qmd = g_new0 (QueryMetadataData, 1);
 	qmd->files = _g_object_list_ref (files);
@@ -236,19 +239,22 @@ GList *
 _g_query_metadata_finish (GAsyncResult  *result,
 			  GError       **error)
 {
-	  GSimpleAsyncResult *simple;
-	  QueryMetadataData  *qmd;
+	GSimpleAsyncResult *simple;
+	QueryMetadataData  *qmd;
 
-	  g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, _g_query_metadata_async), NULL);
+	/* GLib 2.24 gives a wrong warning here */
+#if GLIB_CHECK_VERSION(2, 26, 0)
+	g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, _g_query_metadata_async), NULL);
+#endif
 
-	  simple = G_SIMPLE_ASYNC_RESULT (result);
+	simple = G_SIMPLE_ASYNC_RESULT (result);
 
-	  if (g_simple_async_result_propagate_error (simple, error))
-		  return NULL;
+	if (g_simple_async_result_propagate_error (simple, error))
+		return NULL;
 
-	  qmd = g_simple_async_result_get_op_res_gpointer (simple);
+	qmd = g_simple_async_result_get_op_res_gpointer (simple);
 
-	  return qmd->files;
+	return qmd->files;
 }
 
 
@@ -260,131 +266,111 @@ typedef struct {
 	GthMetadataWriteFlags   flags;
 	char                   *attributes;
 	char                  **attributes_v;
-	GMutex                 *mutex;
-	gboolean                thread_done;
-	GError                 *error;
-} WriteMetadataThreadData;
-
-
-typedef struct {
-	GCancellable            *cancellable;
-	ReadyFunc                ready_func;
-	gpointer                 user_data;
-	guint                    check_id;
-	GThread                 *thread;
-	WriteMetadataThreadData *wmtd;
 } WriteMetadataData;
 
 
 static void
-write_metadata_done (WriteMetadataData *wmd)
+write_metadata_data_free (gpointer user_data)
 {
-	WriteMetadataThreadData *wmtd = wmd->wmtd;
-
-	g_thread_join (wmd->thread);
-
-	if (wmd->ready_func != NULL)
-		(*wmd->ready_func) (wmtd->error, wmd->user_data);
+	WriteMetadataData *wmd = user_data;
 
-	g_mutex_free (wmtd->mutex);
-	g_strfreev (wmtd->attributes_v);
-	g_free (wmtd->attributes);
-	_g_object_list_unref (wmtd->files);
-	g_free (wmtd);
+	g_strfreev (wmd->attributes_v);
+	g_free (wmd->attributes);
+	_g_object_list_unref (wmd->files);
 	g_free (wmd);
 }
 
 
-static gpointer
-write_metadata_thread (gpointer data)
+static void
+_g_write_metadata_async_thread (GSimpleAsyncResult *result,
+				GObject            *object,
+				GCancellable       *cancellable)
 {
-	WriteMetadataThreadData *wmtd = data;
-	GList                   *providers;
-	GList                   *scan;
-	gboolean                 cancelled = FALSE;
+	WriteMetadataData  *wmd;
+	GList              *providers;
+	GList              *scan;
+	GError             *error = NULL;
+
+	wmd = g_simple_async_result_get_op_res_gpointer (result);
 
 	providers = NULL;
 	for (scan = gth_main_get_all_metadata_providers (); scan; scan = scan->next)
 		providers = g_list_prepend (providers, g_object_new (G_OBJECT_TYPE (scan->data), NULL));
 	providers = g_list_reverse (providers);
 
-	for (scan = wmtd->files; scan; scan = scan->next) {
+	for (scan = wmd->files; scan; scan = scan->next) {
 		GthFileData *file_data = scan->data;
 		GList       *scan_providers;
 
-		g_mutex_lock (wmtd->mutex);
-		cancelled = wmtd->thread_done;
-		g_mutex_unlock (wmtd->mutex);
-
-		if (cancelled)
+		if ((cancellable != NULL) && g_cancellable_is_cancelled (cancellable)) {
+			error = g_error_new_literal (G_IO_ERROR, G_IO_ERROR_CANCELLED, "");
 			break;
+		}
 
 		for (scan_providers = providers; scan_providers; scan_providers = scan_providers->next) {
 			GthMetadataProvider *metadata_provider = scan_providers->data;
 
-			if (gth_metadata_provider_can_write (metadata_provider, gth_file_data_get_mime_type (file_data), wmtd->attributes_v))
-				gth_metadata_provider_write (metadata_provider, wmtd->flags, file_data, wmtd->attributes);
+			if (gth_metadata_provider_can_write (metadata_provider, gth_file_data_get_mime_type (file_data), wmd->attributes_v))
+				gth_metadata_provider_write (metadata_provider, wmd->flags, file_data, wmd->attributes);
 		}
 	}
 
 	_g_object_list_unref (providers);
 
-	g_mutex_lock (wmtd->mutex);
-	wmtd->thread_done = TRUE;
-	g_mutex_unlock (wmtd->mutex);
-
-	return wmtd;
+	if (error != NULL) {
+		g_simple_async_result_set_from_error (result, error);
+		g_error_free (error);
+	}
 }
 
 
-static gboolean
-check_write_metadata_thread (gpointer data)
+void
+_g_write_metadata_async (GList                  *files, /* GthFileData * list */
+			 GthMetadataWriteFlags   flags,
+			 const char             *attributes,
+			 GCancellable           *cancellable,
+			 GAsyncReadyCallback     callback,
+			 gpointer                user_data)
 {
-	WriteMetadataData       *wmd = data;
-	WriteMetadataThreadData *wmtd = wmd->wmtd;
-	gboolean                 thread_done;
-
-	g_source_remove (wmd->check_id);
-	wmd->check_id = 0;
+	GSimpleAsyncResult *result;
+	WriteMetadataData  *wmd;
 
-	g_mutex_lock (wmtd->mutex);
-	thread_done = wmtd->thread_done;
-	g_mutex_unlock (wmtd->mutex);
+	result = g_simple_async_result_new (NULL,
+					    callback,
+					    user_data,
+					    _g_write_metadata_async);
 
-	if (thread_done)
-		write_metadata_done (wmd);
-	else
-		wmd->check_id = g_timeout_add (CHECK_THREAD_RATE, check_write_metadata_thread, wmd);
+	wmd = g_new0 (WriteMetadataData, 1);
+	wmd->files = _g_object_list_ref (files);
+	wmd->attributes = g_strdup (attributes);
+	wmd->attributes_v = gth_main_get_metadata_attributes (attributes);
+	g_simple_async_result_set_op_res_gpointer (result, wmd, write_metadata_data_free);
+	g_simple_async_result_run_in_thread (result,
+					     _g_write_metadata_async_thread,
+					     G_PRIORITY_DEFAULT,
+					     cancellable);
 
-	return FALSE;
+	g_object_unref (result);
 }
 
 
-void
-_g_write_metadata_async (GList                 *files, /* GthFileData * list */
-			 GthMetadataWriteFlags  flags,
-			 const char            *attributes,
-			 GCancellable          *cancellable,
-			 ReadyFunc              ready_func,
-			 gpointer               user_data)
+gboolean
+_g_write_metadata_finish (GAsyncResult  *result,
+			  GError       **error)
 {
-	WriteMetadataData       *wmd;
-	WriteMetadataThreadData *wmtd;
+	  GSimpleAsyncResult *simple;
 
-	wmtd = g_new0 (WriteMetadataThreadData, 1);
-	wmtd->files = _g_object_list_ref (files);
-	wmtd->flags = flags;
-	wmtd->attributes = g_strdup (attributes);
-	wmtd->attributes_v = gth_main_get_metadata_attributes (attributes);
-	wmtd->mutex = g_mutex_new ();
+	  /* GLib 2.24 gives a wrong warning here */
+#if GLIB_CHECK_VERSION(2, 26, 0)
+	  g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, _g_write_metadata_async), FALSE);
+#endif
 
-	wmd = g_new0 (WriteMetadataData, 1);
-	wmd->cancellable = cancellable;
-	wmd->ready_func = ready_func;
-	wmd->user_data = user_data;
-	wmd->wmtd = wmtd;
-	wmd->thread = g_thread_create (write_metadata_thread, wmtd, TRUE, NULL);
-	wmd->check_id = g_timeout_add (CHECK_THREAD_RATE, check_write_metadata_thread, wmd);
+	  simple = G_SIMPLE_ASYNC_RESULT (result);
+
+	  if (g_simple_async_result_propagate_error (simple, error))
+		  return FALSE;
+
+	  return TRUE;
 }
 
 
diff --git a/gthumb/gth-metadata-provider.h b/gthumb/gth-metadata-provider.h
index 51ef646..fbcf32b 100644
--- a/gthumb/gth-metadata-provider.h
+++ b/gthumb/gth-metadata-provider.h
@@ -90,8 +90,10 @@ void       _g_write_metadata_async          (GList                  *files, /* G
 					     GthMetadataWriteFlags   flags,
 					     const char             *attributes,
 					     GCancellable           *cancellable,
-					     ReadyFunc               ready_func,
+					     GAsyncReadyCallback     callback,
 					     gpointer                user_data);
+gboolean   _g_write_metadata_finish         (GAsyncResult           *result,
+					     GError                **error);
 void       _g_query_all_metadata_async      (GList                  *files, /* GFile * list */
 					     GthListFlags            flags,
 					     const char             *attributes,



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