diff options
author | Gaël Bonithon <gael@xfce.org> | 2021-12-26 00:06:34 +0100 |
---|---|---|
committer | Gaël Bonithon <gael@xfce.org> | 2021-12-26 18:30:04 +0100 |
commit | 49ffba98d7cf9626a1470bc49a53596300fe3550 (patch) | |
tree | 617a9acf683f60bcda0faa8446cacbefc8d423dc /tumblerd | |
parent | ef518751bd744a48a165dc7c285f98b960c64a75 (diff) | |
download | tumbler-49ffba98d7cf9626a1470bc49a53596300fe3550.tar.gz |
Error handling: Fit to the spec and complete message if needed
A parameter is added to Tumbler's internal error signals to account for
the error domain, and the error code `TUMBLER_ERROR_OTHER_ERROR_DOMAIN`
is added to indicate that the error originated from a third-party API.
When sending the error signal via D-Bus, cancelling errors are filtered
out, and when the error originates from a third-party API, the error
message is prefixed with the domain and code of that error, in a
possibly parsable format.
Fixes #49.
Diffstat (limited to 'tumblerd')
-rw-r--r-- | tumblerd/tumbler-group-scheduler.c | 17 | ||||
-rw-r--r-- | tumblerd/tumbler-lifo-scheduler.c | 4 | ||||
-rw-r--r-- | tumblerd/tumbler-scheduler.c | 5 | ||||
-rw-r--r-- | tumblerd/tumbler-scheduler.h | 1 | ||||
-rw-r--r-- | tumblerd/tumbler-service.c | 30 | ||||
-rw-r--r-- | tumblerd/tumbler-specialized-thumbnailer.c | 9 |
6 files changed, 49 insertions, 17 deletions
diff --git a/tumblerd/tumbler-group-scheduler.c b/tumblerd/tumbler-group-scheduler.c index ad6bda5..f756f7a 100644 --- a/tumblerd/tumbler-group-scheduler.c +++ b/tumblerd/tumbler-group-scheduler.c @@ -75,6 +75,7 @@ static void tumbler_group_scheduler_thread (gpointer gpointer user_data); static void tumbler_group_scheduler_thumbnailer_error (TumblerThumbnailer *thumbnailer, const gchar *failed_uri, + GQuark error_domain, gint error_code, const gchar *message, GList **uri_errors); @@ -105,6 +106,7 @@ struct _TumblerGroupScheduler struct _UriError { guint error_code; + GQuark error_domain; gchar *message; gchar *failed_uri; }; @@ -373,12 +375,14 @@ tumbler_group_scheduler_dequeue_request (TumblerSchedulerRequest *request, static UriError * uri_error_new (gint code, + GQuark domain, const gchar *uri, const gchar *message) { UriError *error; error = g_slice_new0 (UriError); + error->error_domain = domain; error->error_code = code; error->failed_uri = g_strdup (uri); error->message = g_strdup (message); @@ -422,6 +426,7 @@ tumbler_group_scheduler_thread (gpointer data, GList *lp; guint n; gint error_code = 0; + GQuark error_domain = 0; g_return_if_fail (TUMBLER_IS_GROUP_SCHEDULER (scheduler)); g_return_if_fail (request != NULL); @@ -585,8 +590,11 @@ tumbler_group_scheduler_thread (gpointer data, uri_error = iter->data; /* we use the error code of the first failed URI */ - if (iter == uri_errors) - error_code = uri_error->error_code; + if (iter == uri_errors) + { + error_domain = uri_error->error_domain; + error_code = uri_error->error_code; + } if (uri_error->message != NULL) { @@ -607,7 +615,7 @@ tumbler_group_scheduler_thread (gpointer data, /* forward the error signal */ g_signal_emit_by_name (request->scheduler, "error", request->handle, - failed_uris, error_code, message->str, + failed_uris, error_domain, error_code, message->str, request->origin); /* free the failed URIs array. Its contents are owned by the URI errors */ @@ -655,6 +663,7 @@ tumbler_group_scheduler_thread (gpointer data, static void tumbler_group_scheduler_thumbnailer_error (TumblerThumbnailer *thumbnailer, const gchar *failed_uri, + GQuark error_domain, gint error_code, const gchar *message, GList **uri_errors) @@ -667,7 +676,7 @@ tumbler_group_scheduler_thumbnailer_error (TumblerThumbnailer *thumbnailer, g_return_if_fail (uri_errors != NULL); /* allocate a new URI error */ - error = uri_error_new (error_code, failed_uri, message); + error = uri_error_new (error_code, error_domain, failed_uri, message); /* add the error to the list */ *uri_errors = g_list_prepend (*uri_errors, error); diff --git a/tumblerd/tumbler-lifo-scheduler.c b/tumblerd/tumbler-lifo-scheduler.c index ce09930..e19d811 100644 --- a/tumblerd/tumbler-lifo-scheduler.c +++ b/tumblerd/tumbler-lifo-scheduler.c @@ -71,6 +71,7 @@ static void tumbler_lifo_scheduler_thread (gpointer gpointer user_data); static void tumbler_lifo_scheduler_thumbnailer_error (TumblerThumbnailer *thumbnailer, const gchar *failed_uri, + GQuark error_domain, gint error_code, const gchar *message, TumblerSchedulerRequest *request); @@ -515,6 +516,7 @@ tumbler_lifo_scheduler_thread (gpointer data, static void tumbler_lifo_scheduler_thumbnailer_error (TumblerThumbnailer *thumbnailer, const gchar *failed_uri, + GQuark error_domain, gint error_code, const gchar *message, TumblerSchedulerRequest *request) @@ -528,7 +530,7 @@ tumbler_lifo_scheduler_thumbnailer_error (TumblerThumbnailer *thumbnailer, /* forward the error signal */ g_signal_emit_by_name (request->scheduler, "error", request->handle, failed_uris, - error_code, message, request->origin); + error_domain, error_code, message, request->origin); } diff --git a/tumblerd/tumbler-scheduler.c b/tumblerd/tumbler-scheduler.c index d15dfa1..2110bc2 100644 --- a/tumblerd/tumbler-scheduler.c +++ b/tumblerd/tumbler-scheduler.c @@ -99,11 +99,12 @@ tumbler_scheduler_default_init (TumblerSchedulerIface *klass) G_STRUCT_OFFSET (TumblerSchedulerIface, error), NULL, NULL, - tumbler_marshal_VOID__UINT_BOXED_INT_STRING_STRING, + tumbler_marshal_VOID__UINT_BOXED_UINT_INT_STRING_STRING, G_TYPE_NONE, - 5, + 6, G_TYPE_UINT, G_TYPE_STRV, + G_TYPE_UINT, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING); diff --git a/tumblerd/tumbler-scheduler.h b/tumblerd/tumbler-scheduler.h index 6f50a00..6423166 100644 --- a/tumblerd/tumbler-scheduler.h +++ b/tumblerd/tumbler-scheduler.h @@ -46,6 +46,7 @@ struct _TumblerSchedulerIface void (*error) (TumblerScheduler *scheduler, guint32 handle, const gchar *const *failed_uris, + GQuark error_domain, gint error_code, const gchar *message); void (*finished) (TumblerScheduler *scheduler, diff --git a/tumblerd/tumbler-service.c b/tumblerd/tumbler-service.c index 94f06b5..8e6fbf1 100644 --- a/tumblerd/tumbler-service.c +++ b/tumblerd/tumbler-service.c @@ -95,6 +95,7 @@ static gboolean tumbler_service_get_flavors_cb (TumblerExportedService *skelet static void tumbler_service_scheduler_error (TumblerScheduler *scheduler, guint32 handle, const gchar *const *failed_uris, + GQuark error_domain, gint error_code, const gchar *message, const gchar *origin, @@ -425,6 +426,7 @@ static void tumbler_service_scheduler_error (TumblerScheduler *scheduler, guint32 handle, const gchar *const *failed_uris, + GQuark error_domain, gint error_code, const gchar *message, const gchar *origin, @@ -437,20 +439,34 @@ tumbler_service_scheduler_error (TumblerScheduler *scheduler, g_return_if_fail (message != NULL && *message != '\0'); g_return_if_fail (origin != NULL && *origin != '\0'); g_return_if_fail (TUMBLER_IS_SERVICE (service)); - - g_debug ("Error signal for job %d: Code %d, message: %s", - handle, error_code, message); - tumbler_util_dump_strv (G_LOG_DOMAIN, "URIs", failed_uris); + + /* request cancelled at some level after being handled by the thumbnailer: no signal, + * just as if it had been cancelled before */ + if (error_domain == G_IO_ERROR && error_code == G_IO_ERROR_CANCELLED) + return; info = g_slice_new0 (SchedulerIdleInfo); info->scheduler = g_object_ref (scheduler); info->handle = handle; info->uris = g_strdupv ((gchar **)failed_uris); - info->error_code = error_code; - info->message = g_strdup (message); info->origin = g_strdup (origin); info->service = g_object_ref (service); + if (error_domain == TUMBLER_ERROR) + { + info->error_code = error_code; + info->message = g_strdup (message); + } + else + { + info->error_code = TUMBLER_ERROR_OTHER_ERROR_DOMAIN; + info->message = g_strdup_printf ("(%s error, code %d) %s", + g_quark_to_string (error_domain), error_code, message); + } + + g_debug ("Error signal for job %d: Code %d, message: %s", + handle, info->error_code, info->message); + tumbler_util_dump_strv (G_LOG_DOMAIN, "URIs", failed_uris); g_idle_add (tumbler_service_error_idle, info); } @@ -783,7 +799,7 @@ tumbler_service_queue_cb (TumblerExportedService *skeleton, service); /* emit an error signal */ - tumbler_service_scheduler_error (scheduler, handle, uris, + tumbler_service_scheduler_error (scheduler, handle, uris, TUMBLER_ERROR, TUMBLER_ERROR_UNSUPPORTED_FLAVOR, TUMBLER_ERROR_MESSAGE_UNSUPPORTED_FLAVOR, scheduler_request->origin, diff --git a/tumblerd/tumbler-specialized-thumbnailer.c b/tumblerd/tumbler-specialized-thumbnailer.c index 01d9cee..85d18dd 100644 --- a/tumblerd/tumbler-specialized-thumbnailer.c +++ b/tumblerd/tumbler-specialized-thumbnailer.c @@ -361,7 +361,8 @@ thumbnailer_proxy_g_signal_cb (GDBusProxy *proxy, g_variant_get (parameters, "(u&si&s)", &handle, &uri, &error_code, &error_msg); if (info->handle == handle) { - g_signal_emit_by_name (info->thumbnailer, "error", uri, error_code, error_msg); + g_signal_emit_by_name (info->thumbnailer, "error", uri, + TUMBLER_ERROR, error_code, error_msg); } } } @@ -436,7 +437,8 @@ tumbler_specialized_thumbnailer_create (TumblerThumbnailer *thumbnailer, if (!g_cond_wait_until (&sinfo.condition, &sinfo.mutex, end_time)) { message = g_strdup (_("Failed to call the specialized thumbnailer: timeout")); - g_signal_emit_by_name (thumbnailer, "error", uri, 1, message); + g_signal_emit_by_name (thumbnailer, "error", uri, + TUMBLER_ERROR, TUMBLER_ERROR_CONNECTION_ERROR, message); g_free (message); } } @@ -446,7 +448,8 @@ tumbler_specialized_thumbnailer_create (TumblerThumbnailer *thumbnailer, { message = g_strdup_printf (_("Failed to call the specialized thumbnailer: %s"), error->message); - g_signal_emit_by_name (thumbnailer, "error", uri, 1, message); + g_signal_emit_by_name (thumbnailer, "error", uri, + TUMBLER_ERROR, TUMBLER_ERROR_CONNECTION_ERROR, message); g_free (message); g_clear_error (&error); } |