[gimp] Bug 758685 - file-gbr-load/save, file-pat-load/save etc fail with...
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Bug 758685 - file-gbr-load/save, file-pat-load/save etc fail with...
- Date: Wed, 6 Jan 2016 01:42:31 +0000 (UTC)
commit 2cd6345c19e24398a5cd76244f813a55c8f1d4fc
Author: Michael Natterer <mitch gimp org>
Date: Wed Jan 6 02:35:54 2016 +0100
Bug 758685 - file-gbr-load/save, file-pat-load/save etc fail with...
..."Operation not supported"
Add argument validation in the GimpPlugInProcedure impls of
GimpProcedure::execute() and ::execute_async().
When a file procedure is executed and it handles URIs not filenames,
run the resp. arguments through file_utils_filename_to_file() which
turns both URIs and filenames into a valid GFile which we can ask for
its URI.
app/plug-in/gimppluginprocedure.c | 110 +++++++++++++++++++++++++++++++++----
1 files changed, 98 insertions(+), 12 deletions(-)
---
diff --git a/app/plug-in/gimppluginprocedure.c b/app/plug-in/gimppluginprocedure.c
index 8cfc08a..96d40ae 100644
--- a/app/plug-in/gimppluginprocedure.c
+++ b/app/plug-in/gimppluginprocedure.c
@@ -36,6 +36,8 @@
#include "core/gimpmarshal.h"
#include "core/gimpparamspecs.h"
+#include "file/file-utils.h"
+
#define __YES_I_NEED_GIMP_PLUG_IN_MANAGER_CALL__
#include "gimppluginmanager-call.h"
@@ -82,6 +84,11 @@ static void gimp_plug_in_procedure_execute_async (GimpProcedure *procedur
static GFile * gimp_plug_in_procedure_real_get_file (const GimpPlugInProcedure *procedure);
+static gboolean gimp_plug_in_procedure_validate_args (GimpPlugInProcedure *proc,
+ Gimp *gimp,
+ GimpValueArray *args,
+ GError **error);
+
G_DEFINE_TYPE (GimpPlugInProcedure, gimp_plug_in_procedure,
GIMP_TYPE_PROCEDURE)
@@ -360,6 +367,21 @@ gimp_plug_in_procedure_execute (GimpProcedure *procedure,
GimpValueArray *args,
GError **error)
{
+ GimpPlugInProcedure *plug_in_procedure = GIMP_PLUG_IN_PROCEDURE (procedure);
+ GError *pdb_error = NULL;
+
+ if (! gimp_plug_in_procedure_validate_args (plug_in_procedure, gimp,
+ args, &pdb_error))
+ {
+ GimpValueArray *return_vals;
+
+ return_vals = gimp_procedure_get_return_values (procedure, FALSE,
+ pdb_error);
+ g_propagate_error (error, pdb_error);
+
+ return return_vals;
+ }
+
if (procedure->proc_type == GIMP_INTERNAL)
return GIMP_PROCEDURE_CLASS (parent_class)->execute (procedure, gimp,
context, progress,
@@ -380,28 +402,92 @@ gimp_plug_in_procedure_execute_async (GimpProcedure *procedure,
GimpObject *display)
{
GimpPlugInProcedure *plug_in_procedure = GIMP_PLUG_IN_PROCEDURE (procedure);
- GimpValueArray *return_vals;
+ GError *error = NULL;
- return_vals = gimp_plug_in_manager_call_run (gimp->plug_in_manager,
- context, progress,
- plug_in_procedure,
- args, FALSE, display);
+ if (gimp_plug_in_procedure_validate_args (plug_in_procedure, gimp,
+ args, &error))
+ {
+ GimpValueArray *return_vals;
+
+ return_vals = gimp_plug_in_manager_call_run (gimp->plug_in_manager,
+ context, progress,
+ plug_in_procedure,
+ args, FALSE, display);
- if (return_vals)
+ if (return_vals)
+ {
+ gimp_plug_in_procedure_handle_return_values (plug_in_procedure,
+ gimp, progress,
+ return_vals);
+ gimp_value_array_unref (return_vals);
+ }
+ }
+ else
{
- gimp_plug_in_procedure_handle_return_values (plug_in_procedure,
- gimp, progress,
- return_vals);
- gimp_value_array_unref (return_vals);
+ gimp_message_literal (gimp, G_OBJECT (progress), GIMP_MESSAGE_ERROR,
+ error->message);
+ g_error_free (error);
}
}
-GFile *
+static GFile *
gimp_plug_in_procedure_real_get_file (const GimpPlugInProcedure *procedure)
{
return procedure->file;
}
+static gboolean
+gimp_plug_in_procedure_validate_args (GimpPlugInProcedure *proc,
+ Gimp *gimp,
+ GimpValueArray *args,
+ GError **error)
+{
+ if (proc->file_proc && proc->handles_uri)
+ {
+ /* for file procedures that handle URIs, make sure that the
+ * passed string actually is an URI, not just a file path
+ */
+ GimpProcedure *procedure = GIMP_PROCEDURE (proc);
+ GValue *uri_value = NULL;
+
+ if ((procedure->num_args >= 3) &&
+ (procedure->num_values >= 1) &&
+ GIMP_IS_PARAM_SPEC_INT32 (procedure->args[0]) &&
+ G_IS_PARAM_SPEC_STRING (procedure->args[1]) &&
+ G_IS_PARAM_SPEC_STRING (procedure->args[2]) &&
+ GIMP_IS_PARAM_SPEC_IMAGE_ID (procedure->values[0]))
+ {
+ uri_value = gimp_value_array_index (args, 1);
+ }
+ else if ((procedure->num_args >= 5) &&
+ GIMP_IS_PARAM_SPEC_INT32 (procedure->args[0]) &&
+ GIMP_IS_PARAM_SPEC_IMAGE_ID (procedure->args[1]) &&
+ GIMP_IS_PARAM_SPEC_DRAWABLE_ID (procedure->args[2]) &&
+ G_IS_PARAM_SPEC_STRING (procedure->args[3]) &&
+ G_IS_PARAM_SPEC_STRING (procedure->args[4]))
+ {
+ uri_value = gimp_value_array_index (args, 3);
+ }
+
+ if (uri_value)
+ {
+ GFile *file;
+
+ file = file_utils_filename_to_file (gimp,
+ g_value_get_string (uri_value),
+ error);
+
+ if (! file)
+ return FALSE;
+
+ g_value_take_string (uri_value, g_file_get_uri (file));
+ g_object_unref (file);
+ }
+ }
+
+ return TRUE;
+}
+
/* public functions */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]