libgimp: add gimp_pdb_get_last_error() and _get_last_status()

and move the old API to gimplegacy.[ch].
This commit is contained in:
Michael Natterer 2019-08-11 16:41:58 +02:00
parent 78c7d46ad9
commit 1c9b3c7055
10 changed files with 243 additions and 119 deletions

View file

@ -29,7 +29,6 @@ gint _gimp_main_internal (GType plug_in_type,
gint argc,
gchar *argv[]);
void _gimp_config (GPConfig *config);
void _gimp_set_pdb_error (GimpValueArray *return_vals);
G_END_DECLS

View file

@ -161,10 +161,6 @@ static const gchar *progname = NULL;
static GimpStackTraceMode stack_trace_mode = GIMP_STACK_TRACE_NEVER;
static GimpPDBStatusType pdb_error_status = GIMP_PDB_SUCCESS;
static gchar *pdb_error_message = NULL;
/**
* gimp_main:
* @plug_in_type: the type of the #GimpPlugIn subclass of the plug-in
@ -684,68 +680,6 @@ gimp_quit (void)
exit (EXIT_SUCCESS);
}
/**
* gimp_get_pdb_error:
*
* Retrieves the error message from the last procedure call.
*
* If a procedure call fails, then it might pass an error message with
* the return values. Plug-ins that are using the libgimp C wrappers
* don't access the procedure return values directly. Thus libgimp
* stores the error message and makes it available with this
* function. The next procedure call unsets the error message again.
*
* The returned string is owned by libgimp and must not be freed or
* modified.
*
* Returns: the error message
*
* Since: 2.6
**/
const gchar *
gimp_get_pdb_error (void)
{
if (pdb_error_message && strlen (pdb_error_message))
return pdb_error_message;
switch (pdb_error_status)
{
case GIMP_PDB_SUCCESS:
/* procedure executed successfully */
return _("success");
case GIMP_PDB_EXECUTION_ERROR:
/* procedure execution failed */
return _("execution error");
case GIMP_PDB_CALLING_ERROR:
/* procedure called incorrectly */
return _("calling error");
case GIMP_PDB_CANCEL:
/* procedure execution cancelled */
return _("cancelled");
default:
return "invalid return status";
}
}
/**
* gimp_get_pdb_status:
*
* Retrieves the status from the last procedure call.
*
* Returns: the #GimpPDBStatusType.
*
* Since: 2.10
**/
GimpPDBStatusType
gimp_get_pdb_status (void)
{
return pdb_error_status;
}
/**
* gimp_tile_width:
*
@ -1233,35 +1167,3 @@ _gimp_config (GPConfig *config)
_gimp_shm_open (config->shm_ID);
}
void
_gimp_set_pdb_error (GimpValueArray *return_values)
{
g_clear_pointer (&pdb_error_message, g_free);
pdb_error_status = GIMP_PDB_SUCCESS;
if (gimp_value_array_length (return_values) > 0)
{
pdb_error_status =
g_value_get_enum (gimp_value_array_index (return_values, 0));
switch (pdb_error_status)
{
case GIMP_PDB_SUCCESS:
case GIMP_PDB_PASS_THROUGH:
break;
case GIMP_PDB_EXECUTION_ERROR:
case GIMP_PDB_CALLING_ERROR:
case GIMP_PDB_CANCEL:
if (gimp_value_array_length (return_values) > 1)
{
GValue *value = gimp_value_array_index (return_values, 1);
if (G_VALUE_HOLDS_STRING (value))
pdb_error_message = g_value_dup_string (value);
}
break;
}
}
}

View file

@ -635,6 +635,8 @@ EXPORTS
gimp_pdb_dump_to_file
gimp_pdb_get_data
gimp_pdb_get_data_size
gimp_pdb_get_last_error
gimp_pdb_get_last_status
gimp_pdb_get_type
gimp_pdb_lookup_procedure
gimp_pdb_proc_arg

View file

@ -157,12 +157,6 @@ GimpPDB * gimp_get_pdb (void);
*/
void gimp_quit (void) G_GNUC_NORETURN;
/* Retrieve the error message and return status for the last procedure
* call.
*/
const gchar * gimp_get_pdb_error (void);
GimpPDBStatusType gimp_get_pdb_status (void);
/* Return various constants given by the GIMP core at plug-in config time.
*/
guint gimp_tile_width (void) G_GNUC_CONST;

View file

@ -35,6 +35,8 @@
#include "gimpplugin_pdb.h"
#include "gimplegacy-private.h"
#include "libgimp-intl.h"
/**
* SECTION: gimplegacy
@ -81,17 +83,21 @@ static gboolean gimp_write (GIOChannel *channel,
gpointer user_data);
static gboolean gimp_flush (GIOChannel *channel,
gpointer user_data);
static void gimp_set_pdb_error (GimpValueArray *return_vals);
GIOChannel *_gimp_readchannel = NULL;
GIOChannel *_gimp_writechannel = NULL;
GIOChannel *_gimp_readchannel = NULL;
GIOChannel *_gimp_writechannel = NULL;
static gchar write_buffer[WRITE_BUFFER_SIZE];
static gulong write_buffer_index = 0;
static gchar write_buffer[WRITE_BUFFER_SIZE];
static gulong write_buffer_index = 0;
static GimpPlugInInfo PLUG_IN_INFO = { 0, };
static GimpPlugInInfo PLUG_IN_INFO = { 0, };
static GHashTable *gimp_temp_proc_ht = NULL;
static GHashTable *gimp_temp_proc_ht = NULL;
static GimpPDBStatusType pdb_error_status = GIMP_PDB_SUCCESS;
static gchar *pdb_error_message = NULL;
/**
@ -822,7 +828,7 @@ gimp_run_procedure_array (const gchar *name,
gimp_wire_destroy (&msg);
_gimp_set_pdb_error (return_values);
gimp_set_pdb_error (return_values);
return return_values;
}
@ -938,6 +944,72 @@ gimp_destroy_paramdefs (GimpParamDef *paramdefs,
g_free (paramdefs);
}
/**
* gimp_get_pdb_error:
*
* Retrieves the error message from the last procedure call.
*
* If a procedure call fails, then it might pass an error message with
* the return values. Plug-ins that are using the libgimp C wrappers
* don't access the procedure return values directly. Thus libgimp
* stores the error message and makes it available with this
* function. The next procedure call unsets the error message again.
*
* The returned string is owned by libgimp and must not be freed or
* modified.
*
* Returns: the error message
*
* Since: 2.6
**/
const gchar *
gimp_get_pdb_error (void)
{
ASSERT_NO_PLUG_IN_EXISTS (G_STRFUNC);
if (pdb_error_message && strlen (pdb_error_message))
return pdb_error_message;
switch (pdb_error_status)
{
case GIMP_PDB_SUCCESS:
/* procedure executed successfully */
return _("success");
case GIMP_PDB_EXECUTION_ERROR:
/* procedure execution failed */
return _("execution error");
case GIMP_PDB_CALLING_ERROR:
/* procedure called incorrectly */
return _("calling error");
case GIMP_PDB_CANCEL:
/* procedure execution cancelled */
return _("cancelled");
default:
return "invalid return status";
}
}
/**
* gimp_get_pdb_status:
*
* Retrieves the status from the last procedure call.
*
* Returns: the #GimpPDBStatusType.
*
* Since: 2.10
**/
GimpPDBStatusType
gimp_get_pdb_status (void)
{
ASSERT_NO_PLUG_IN_EXISTS (G_STRFUNC);
return pdb_error_status;
}
void
_gimp_legacy_initialize (const GimpPlugInInfo *info,
GIOChannel *read_channel,
@ -1966,3 +2038,35 @@ gimp_flush (GIOChannel *channel,
return TRUE;
}
static void
gimp_set_pdb_error (GimpValueArray *return_values)
{
g_clear_pointer (&pdb_error_message, g_free);
pdb_error_status = GIMP_PDB_SUCCESS;
if (gimp_value_array_length (return_values) > 0)
{
pdb_error_status =
g_value_get_enum (gimp_value_array_index (return_values, 0));
switch (pdb_error_status)
{
case GIMP_PDB_SUCCESS:
case GIMP_PDB_PASS_THROUGH:
break;
case GIMP_PDB_EXECUTION_ERROR:
case GIMP_PDB_CALLING_ERROR:
case GIMP_PDB_CANCEL:
if (gimp_value_array_length (return_values) > 1)
{
GValue *value = gimp_value_array_index (return_values, 1);
if (G_VALUE_HOLDS_STRING (value))
pdb_error_message = g_value_dup_string (value);
}
break;
}
}
}

View file

@ -323,6 +323,11 @@ void gimp_destroy_params (GimpParam *params,
void gimp_destroy_paramdefs (GimpParamDef *paramdefs,
gint n_params);
/* Retrieve the error message and return status for the last procedure
* call.
*/
const gchar * gimp_get_pdb_error (void);
GimpPDBStatusType gimp_get_pdb_status (void);
/* gimp_plugin API that should now be done by using GimpPlugIn
*/

View file

@ -34,6 +34,8 @@
#include "gimppdbprocedure.h"
#include "gimpplugin-private.h"
#include "libgimp-intl.h"
/**
* SECTION: gimppdb
@ -51,10 +53,16 @@ struct _GimpPDBPrivate
GimpPlugIn *plug_in;
GHashTable *procedures;
GimpPDBStatusType error_status;
gchar *error_message;
};
static void gimp_pdb_finalize (GObject *object);
static void gimp_pdb_finalize (GObject *object);
static void gimp_pdb_set_error (GimpPDB *pdb,
GimpValueArray *return_values);
G_DEFINE_TYPE_WITH_PRIVATE (GimpPDB, gimp_pdb, G_TYPE_OBJECT)
@ -77,6 +85,8 @@ gimp_pdb_init (GimpPDB *pdb)
pdb->priv->procedures = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, g_object_unref);
pdb->priv->error_status = GIMP_PDB_SUCCESS;
}
static void
@ -85,7 +95,8 @@ gimp_pdb_finalize (GObject *object)
GimpPDB *pdb = GIMP_PDB (object);
g_clear_object (&pdb->priv->plug_in);
g_clear_pointer (&pdb->priv->procedures, g_hash_table_unref);
g_clear_pointer (&pdb->priv->procedures, g_hash_table_unref);
g_clear_pointer (&pdb->priv->error_message, g_free);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@ -305,7 +316,7 @@ gimp_pdb_run_procedure_array (GimpPDB *pdb,
gimp_wire_destroy (&msg);
_gimp_set_pdb_error (return_values);
gimp_pdb_set_error (pdb, return_values);
return return_values;
}
@ -481,6 +492,74 @@ gimp_pdb_proc_return_value (const gchar *procedure_name,
return _gimp_pdb_proc_return_value (procedure_name, val_num);
}
/**
* gimp_pdb_get_last_error:
* @pdb: a #GimpPDB.
*
* Retrieves the error message from the last procedure call.
*
* If a procedure call fails, then it might pass an error message with
* the return values. Plug-ins that are using the libgimp C wrappers
* don't access the procedure return values directly. Thus #GimpPDB
* stores the error message and makes it available with this
* function. The next procedure call unsets the error message again.
*
* The returned string is owned by @pdb and must not be freed or
* modified.
*
* Returns: the error message
*
* Since: 3.0
**/
const gchar *
gimp_pdb_get_last_error (GimpPDB *pdb)
{
g_return_val_if_fail (GIMP_IS_PDB (pdb), NULL);
if (pdb->priv->error_message && strlen (pdb->priv->error_message))
return pdb->priv->error_message;
switch (pdb->priv->error_status)
{
case GIMP_PDB_SUCCESS:
/* procedure executed successfully */
return _("success");
case GIMP_PDB_EXECUTION_ERROR:
/* procedure execution failed */
return _("execution error");
case GIMP_PDB_CALLING_ERROR:
/* procedure called incorrectly */
return _("calling error");
case GIMP_PDB_CANCEL:
/* procedure execution cancelled */
return _("cancelled");
default:
return "invalid return status";
}
}
/**
* gimp_pdb_get_last_status:
* @pdb: a #GimpPDB.
*
* Retrieves the status from the last procedure call.
*
* Returns: the #GimpPDBStatusType.
*
* Since: 3.0
**/
GimpPDBStatusType
gimp_pdb_get_last_status (GimpPDB *pdb)
{
g_return_val_if_fail (GIMP_IS_PDB (pdb), GIMP_PDB_SUCCESS);
return pdb->priv->error_status;
}
/* Cruft API */
/**
@ -555,3 +634,39 @@ gimp_pdb_set_data (const gchar *identifier,
{
return _gimp_pdb_set_data (identifier, bytes, data);
}
/* private functions */
static void
gimp_pdb_set_error (GimpPDB *pdb,
GimpValueArray *return_values)
{
g_clear_pointer (&pdb->priv->error_message, g_free);
pdb->priv->error_status = GIMP_PDB_SUCCESS;
if (gimp_value_array_length (return_values) > 0)
{
pdb->priv->error_status =
g_value_get_enum (gimp_value_array_index (return_values, 0));
switch (pdb->priv->error_status)
{
case GIMP_PDB_SUCCESS:
case GIMP_PDB_PASS_THROUGH:
break;
case GIMP_PDB_EXECUTION_ERROR:
case GIMP_PDB_CALLING_ERROR:
case GIMP_PDB_CANCEL:
if (gimp_value_array_length (return_values) > 1)
{
GValue *value = gimp_value_array_index (return_values, 1);
if (G_VALUE_HOLDS_STRING (value))
pdb->priv->error_message = g_value_dup_string (value);
}
break;
}
}
}

View file

@ -100,6 +100,9 @@ gchar ** gimp_pdb_query_procedures (GimpPDB *pdb,
const gchar *proc_type,
gint *num_matches);
const gchar * gimp_pdb_get_last_error (GimpPDB *pdb);
GimpPDBStatusType gimp_pdb_get_last_status (GimpPDB *pdb);
/* Temporary API, to go away before 3.0 */
GParamSpec * gimp_pdb_proc_argument (const gchar *procedure_name,

View file

@ -618,9 +618,9 @@ gimp_plug_in_extension_process (GimpPlugIn *plug_in,
* call made by a plug-in fails. Using this procedure the plug-in can
* change this behavior. If the error handler is set to
* %GIMP_PDB_ERROR_HANDLER_PLUGIN, then the plug-in is responsible for
* calling gimp_get_pdb_error() and handling the error whenever one if
* its procedure calls fails. It can do this by displaying the error
* message or by forwarding it in its own return values.
* calling gimp_pdb_get_last_error() and handling the error whenever
* one if its procedure calls fails. It can do this by displaying the
* error message or by forwarding it in its own return values.
*
* Since: 3.0
**/

View file

@ -262,7 +262,7 @@ pat_save (GimpProcedure *procedure,
g_set_error (&error, 0, 0,
"Running procedure 'file-pat-save-internal' "
"failed: %s",
gimp_get_pdb_error ());
gimp_pdb_get_last_error (gimp_get_pdb ()));
status = GIMP_PDB_EXECUTION_ERROR;
}