[gthumb] use the GAsyncResult interface to implement _g_write_metadata_async
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] use the GAsyncResult interface to implement _g_write_metadata_async
- Date: Sat, 29 Jan 2011 14:22:38 +0000 (UTC)
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]